ubuntu server 22.04系统上KVM安装虚拟机实践
1、检查服务器上的CPU虚拟化支持
首先,你需要确认服务器的CPU支持虚拟化技术。可以通过执行以下命令来检查CPU是否支持虚拟化:
egrep -c '(svm|vmx)' /proc/cpuinfo
命令 egrep -c '(svm|vmx)' /proc/cpuinfo
用于检查你的CPU是否支持虚拟化技术。下面是这个命令的详细解释:
egrep
:这是一个文本搜索工具,用于在文件中搜索符合特定模式的行。e
在egrep
中代表“扩展”,意味着它支持正则表达式扩展集。-c
:这个选项告诉egrep
计算符合模式的行数,而不是打印出匹配的行。'(svm|vmx)'
:这是egrep
搜索的模式。它使用正则表达式来搜索包含svm
或者vmx
的行。这里的svm
代表 AMD-V(Secure Virtual Machine),而vmx
代表 Intel VT-x(Virtualization Technology),它们都是硬件虚拟化技术。/proc/cpuinfo
:这是一个虚拟的文件系统,包含了CPU的详细信息。当你运行cat /proc/cpuinfo
命令时,它会显示CPU的型号、速度、缓存大小等信息。
当你执行这个命令时,它会检查 /proc/cpuinfo
文件中是否有行包含 svm
或 vmx
。如果有,这表明你的CPU支持某种形式的硬件虚拟化技术。命令的输出是一个数字,表示包含这些关键字的行数。如果输出是0,那么CPU可能不支持硬件虚拟化,或者虚拟化技术在BIOS/UEFI中被禁用了。如果输出大于0,那么CPU支持硬件虚拟化技术。在我的实验电脑上,相关输出为128,说明相关服务器支持虚拟化。
2、安装KVM相关工具
使用以下命令安装KVM及相关工具,包括qemu-kvm
、libvirt-daemon-system
、libvirt-clients
、bridge-utils
、virtinst
和virt-manager
等,这些工具是KVM虚拟化的核心组件和管理工具。
sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager
安装以上那个工具以后,检查libvirtd服务有没有启动,没有启动采用后续命令:
sudo systemctl status libvirtd.service
## if not started
sudo systemctl start libvirtd.service
sudo systemctl enable libvirtd.service
为了能够管理虚拟机,需要将当前用户添加到libvirt
组:
sudo usermod -aG libvirt $USER
最后,再验证KVM命令是否成功加载和安装:
# 方法1
lsmod | grep kvm
# 方法2 kvm-ok命令验证
kvm-ok
3、设置桥接网卡
3.1、kvm支持的网络模式
- NAT 模式
- Bridge模式
- 路由模式
- 直接分配设备模式
- …
第4种太奢侈, 而其他3种只有桥接模式能令虚拟机和局域网其他主机相互通信(ip 在同1个网段),因而只能选择bridge模式。
而既然我的机器是没有GUI的, 那就是netplan了;检查 /etc/netplan 文件夹, 是否存在yaml文件, 如果不存在, 而你台机器还能上网的话, 则肯定不是用netplan 方式。
3.2 检查netplan配置
-- 查看netplan文件夹配置文件
ls /etc/netplan
-- 进入相关目录
cd /etc/netplan
-- 使用vim查看配置文件
sudo sudo vi 00-installer-config.yaml
先备份和查看原来的配置文件。
3.3 检查虚拟桥接设备(安装KVM后会有)
输入 ifconfig 回车,会见到输出除了上面两个有线网卡外, 多了1个设备virbr0,这是安装完kvm后系统自动创建的。这个virbr0 并不是一块虚拟网卡, 而是1个块虚拟桥接设备(bridge), 我们还必须基于它再创建1个虚拟桥接网卡。
3.4 编辑/etc/netplan/00-xxx.yaml 添加一个桥接网卡
首先,简单说明一下桥接方式的原理,在图中的br0相当于虚拟交换机,物理网卡eth0和虚拟机网卡vnet0都通过虚拟的网线连接到br0上,这样eth0和vnet0之间可以互相交换数据,br0叫做桥,其实在宿主机上也是一张虚拟的网卡,作为虚拟交换机角色。
配置虚拟机采用桥接模式并指定br0后,数据从虚拟机的网卡vnet0发出到br0,br0会将数据转发给另一端的eth0,源mac是虚拟机的随机MAC地址,源IP是虚拟机的IP地址,桥并没有做中间修改,数据仅仅通过eth0网卡直接发到链路上,eth0只是充当一个发送的物理介质。
当应答回来的时候,物理网卡eth0会在混杂模式捕获包并交给br0处理,如果目标mac地址等于eth0或者vnet0,则进一步处理。如果是eth0的包那么直接宿主机处理,如果是vnet0的包则转发给虚拟机处理,整个过程无需对包做出修改,因为br0仅仅是一个交换机,而eth0和vnet0是连在上面的2个网卡而已。
编辑 /etc/netplan/00-xxxx.yaml
--备份文件,并且创建一个带有时间戳的备份文件
cp -p 00-xxxx.yaml 00-xxxx.yaml.$(date +%Y%m%d_%H%M%S).bak
-- 编辑相关文件
sudo sudo vi 00-installer-config.yaml
-- 修改好配置以后运行,注意相关网络会发生变化,这里也可以配置静态ip
sudo netplan apply
00-xxxx.yaml文件具体内容如下:
# This is the network config written by 'subiquity'(博主的)
network:
ethernets:
eno1:
dhcp4: false
eno2:
dhcp4: false # 真正的物理显卡要关闭dhcp
bridges:
br0:
interfaces: [eno1]
dhcp4: no
addresses: [10.0.1.107/24] # ip地址
routes:
- to: default
via: 10.0.1.1 # 路由其地址
nameservers:
addresses: [119.29.29.29, 8.8.8.8] # DNS 119.29.29.29 是腾讯的DNS
version: 2
#自己的
network:
version: 2
renderer: networkd
ethernets:
eno1:
dhcp4: no
dhcp6: no
bridges:
br0:
interfaces: [eno1]
addresses: [192.168.1.150/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
parameters:
stp: false
forward-delay: 4
dhcp4: no
dhcp6: no
注意这里我们不在从路由器动态申请ip, 而是设置静态ip, 如国修改前后的ip不同,我们的ssh connection会断
- 物理网卡没有地址, 这是正常的, 如上图, 连物理网卡也会通过这个虚拟网桥连接外部。
4、创建虚拟机
4.1、安装开源工具 MobaXterm(可以提供相关界面,来帮助)
在下面的链接中,下载相关工具,然后默认安装好;
https://mobaxterm.mobatek.net/download.html
然后登录到宿主机
4.2、进行图形化界面安装虚拟机(也可以用命令行安装,后续有相关研究)
输入以下命令virt-manager(前面kvm安装好的前提下),进入到图形化安装界面
选择之前定义好的存储池images_lvm,然后设置相关的disk大小,最后点击确定。
点击完成,需要进入下面的黑框,完成剩下的设置
4.3、虚拟机自身内部设置(主要是设置语言,镜像还有一些网络,安装一些程序之类)
这里分屏之后选择会有一些小问题,可以切换屏幕,点一下其他地方,再去点这里的上下,就不会跳来跳去!!!
在设置代理的时候,如果不需要进行代理,那这里可以不填
设置修改为清华镜像,虽然后面也能改,但是一劳永逸;
https://mirrors.tuna.tsinghua.edu.cn/ubuntu/
这是最后的安装过程,然后等相关安装成功即可
这里显示全部安装好,然后这边在更新,会比较慢,估计要放比较久才行;如果等不及,可以直接先shutdown,然后再开机。开机以后需要安装的内容,见文档【配置单个虚拟机,实现xshell远程连接】