1 KVM安装
1.1 配置确认
首先需要确认服务器的硬件是否支持虚拟化,执行如下命令:
egrep -c '(vmx|svm)' /proc/cpuinfo
如果输出结果大于0,意味着服务器硬件是支持虚拟化的。否则,重启进入BIOS设置中启用VT技术。
1.2 安装KVM
安装KVM及依赖项:
sudo apt update
sudo apt install qemu qemu-kvm libvirt-bin bridge-utils virt-manager
启动libvirtd服务,并设置开机自动启动:
sudo systemctl start libvirtd.service
sudo systemctl enable libvirtd.service
执行service libvirtd status
查看libvirtd服务状态,如图:
1.3 网络配置
KVM安装完成后,首先需要进行网络配置,KVM支持四种网络模式:
- 桥接模式
- NAT模式
- 用户网络模式
- 直接分配设备模式
主要讲一下前两种:
- 桥接(Bridge)模式
Bridge模式下,虚拟机需要配置自己的IP,然后虚拟出一个网卡,与宿主机的网卡一起挂到一个虚拟网桥上(类似于交换机)来访问外部网络。这种模式下,虚拟机拥有独立的IP,局域网其它主机能直接通过IP与其通信。简单理解,就是桥接模式下,虚机跟宿主机一样平等地存在,虚拟机和宿主机有平级的IP。
原本宿主机是通过网卡eth0连接外部网络的,网桥模式会新创建一个网桥br0,接管eth0来连接外部网络,然后将宿主机和虚拟机的网卡eth0都绑定到网桥上。 - NAT(Network Address Translation)模式
NAT模式是KVM默认的网络模式,KVM会创建一个名为virbr0的虚拟网桥,但是宿主机和虚拟机对于网桥来说不是平等的了,网桥会把虚拟机藏在背后,虚拟机会被分配一个内网IP,而从外网访问不到虚拟机。
一般我们创建虚机是用来部署服务供使用的,所以都是用Bridge模式。
Ubuntu 18.04中,网络配置通过netplan来实现了,需要修改配置文件/etc/netplan/50-cloud-init.yaml
:
network:
ethernets:
enp6s0:
dhcp4: true
enp7s0:
dhcp4: no
dhcp6: no
version: 2
bridges:
br0:
interfaces: [enp7s0]
dhcp4: no
addresses: [192.168.40.241/24]
gateway4: 192.168.40.1
nameservers:
addresses: [114.114.114.114,8.8.8.8]
或者(另一种格式)
network:
ethernets:
eno1:
addresses:
- 10.10.6.50/24
dhcp4: false
gateway4: 10.10.6.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
search: []
enp3s2:
dhcp4: false
bridges:
br0:
dhcp4: false
interfaces:
- enp3s2
addresses:
- 10.10.7.50/24
version: 2
将宿主机原有网卡enp7s0挂到网桥br0上,并指定网桥br0的IP地址为192.168.40.241,nameservers指定DNS服务器。修改完后,通过sudo netplan apply
重启网络服务生效,然后通过ifconfig查看。
原来挂在enp7s0网卡下的IP现在挂到了br0上,宿主机及所有其它虚拟机都通过该网桥来与外部通讯。我们也可以通过brctl show
来直观地查看。
devuser@server_01:~$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.2a5be3ec2698 no enp7s0
docker0 8000.02424524dcce no veth580af8e
veth74119f3
vethe7a2b0f
vethfe89039
目前因为还没虚拟机,所以只有宿主机的网卡enp7s0挂在网桥br0上。
2 虚拟机安装
2.1 安装虚拟机
安装命令(安装前检查宿主机是否开启了嵌套虚拟化功能,参见2.5.1)
sudo virt-install --name=dev-server1 --description="dev-server1" \ # 指定虚拟机名称,后面可通过virsh管理
--memory=8192,maxmemory=8192 \ # 配置了8G内存
--vcpus=4,maxvcpus=4 --hvm --cpu=host \ # 配置了4个CPU内核,虚拟机全虚拟化,CPU model为host(可提供嵌套虚拟化)
--os-type=linux --os-variant=ubuntu18.04 \
--disk path=/var/lib/libvirt/images/devserver1.img,bus=virtio,size=60 \ # 磁盘位置、大小60G、类型为virtio(默认是IDE),提高性能
--network bridge:br0 \ # 网络选择了桥接模式
--graphics=vnc,listen=0.0.0.0,keymap=en-us --noautoconsole \ # VNC监听端口,注意要选择en-us作为key-map,否则键位布局可能会乱
--cdrom=/home/ubuntu-18.04.4-live-server-amd64.iso # 安装ISO路径
此时安装过程已经在后台执行,我们需要使用VNC连接上去进行配置。
首先,需要获取虚拟机的VNC管理端口号:
virsh dumpxml <domain> | grep vnc
知道了VNC端口号,我们就可以在自己电脑上通过VNC客户端(比如:Tiger VNC)连接上去,继续虚拟机中Linux的安装流程了。
安装完成后,我们再通过brctl show
来查看网桥挂载情况,br0下面已经多了一个vnet0虚拟网卡了。
devuser@server_01:~$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.2a5be3ec2698 no enp7s0
vnet0
docker0 8000.02424524dcce no veth580af8e
veth74119f3
vethe7a2b0f
vethfe89039
2.2 开启虚拟机的virsh console登录
systemctl disable systemd-networkd-wait-online
systemctl enable serial-getty@ttyS0.service
systemctl start serial-getty@ttyS0.service
开启后,可通过宿主机的console的方式直接登录虚拟机。
2.3 虚拟机添加网卡
- 查看网卡
virsh domiflist cdh-test
- 添加网卡(需要虚拟机在开机状态下操作)
virsh attach-interface cdh-test --type bridge --source br0 --model virtio # 指定网络类型为virtio,提高虚拟机性能
- 加载到配置文件
命令行增加的网卡只保存在内存中,重启就失效,所以需要保存到配置文件中。virsh attach-interface cdh-test --type bridge --source br0 --model virtio --config
virsh dumpxml cdh-test >/etc/libvirt/qemu/snale.xml virsh define /etc/libvirt/qemu/snale.xml
- 删除网卡(这步不用操作,网卡不想用了再删除)
virsh detach-interface cdh-test --type bridge --mac 52:54:00:f6:d1:cd --config
- 其他网卡命令
关闭或打开某个网口
获取某个网口状态virsh domif-setlink domain vnet0 down virsh domif-setlink domain vnet0 up
virsh domif-getlink domain vnet1
2.4 克隆虚拟机
虚拟机必须在关闭的状态下克隆,如果不关闭虚拟机直接克隆会报错,例如:ERROR Domain with devices to clone must be paused or shutoff.
克隆虚拟机,新虚拟机名称为dev-server2。
virt-clone --original dev-server1 --name dev-server2 --file /var/lib/libvirt/images/dev-server2.img
# --original 后面跟要克隆的虚拟机名字
# --name 克隆后虚拟机的名字
# --file 指定存放的路径
克隆完成后,dev-server2中的网卡MAC地址是重新生成的,但是IP地址和dev-server1是一样的。可以使用console方式登录dev-server2来修改IP地址。
2.5 让虚拟机支持虚拟化(创建虚机时未指定CPU model)
2.5.1 检查宿主机是否开启了嵌套虚拟化功能
基于 Intel 的处理器运行以下命令:
[root@kvm-hypervisor ~]# cat /sys/module/kvm_intel/parameters/nested
Y
基于 AMD 的处理器运行以下命令:
[root@kvm-hypervisor ~]# cat /sys/module/kvm_amd/parameters/nested
Y
2.5.2 让虚拟机支持虚拟化
如果你使用libvirt管理虚拟机,需要修改虚拟机xml文件中CPU的定义,下面三种定义都可以。
#可以使用这种
<cpu mode='custom' match='exact'>
<model fallback='allow'>core2duo</model>
<feature policy='require' name='vmx'/>
</cpu>
#这种方式为虚拟机定义需要模拟的CPU类型"core2duo",并且为虚拟机添加"vmx"特性
#也可以使用这种
<cpu mode='host-model'>
<model fallback='allow'/>
</cpu>
#或者这样
<cpu mode='host-passthrough'>
<topology sockets='2' cores='2' threads='2'/>
</cpu>
#CPU穿透,在虚拟机中看到的vcpu将会与物理机的CPU同样配置,这种方式缺点在于如果要对虚拟机迁移,迁移的目的服务器硬件配置必须与当前物理机一样
如果你使用qemu-kvm命令行启动虚拟机,那么可以简单的添加
-enable-kvm -cpu qemu64,+vmx
#设置虚拟机CPU为qemu64型号,添加vmx支持
虚拟机xml文件后,需要重启宿主机,或者更新虚拟机配置后再启动虚拟机:
virsh define /etc/libvirt/qemu/dev-server1.xml
启动并进入虚拟机,查看CPU特性,可以看到此时虚拟机的CPU已经支持vmx特性:
3. 虚拟机管理
- 列出当前运行的虚拟机
virsh list
如果列出所有的,则使用devuser@server_01:~$ virsh list Id Name State ---------------------------------------------------- 5 dev-server1 running
virsh list --all
- 从宿主机进入虚拟机
virsh console
,后面接虚拟机ID或名称
输入用户名,密码即可登录虚拟机,按devuser@server_01:~$ virsh console 5 Connected to domain dev-server1 Escape character is ^] CentOS Linux 7 (Core) Kernel 3.10.0-957.el7.x86_64 on an x86_64 dev-server1 login:
Ctrl+]
可退出。 - 启动与关闭虚拟机
virsh start|shutdown
devuser@cserver_01:~$ virsh start dev-server1 Domain dev-server1 started devuser@server_01:~$ virsh shutdown 5 Domain 5 is being shutdown
- libvirtd启动时,自动启动虚拟机
devuser@server_01:~$ virsh autostart dev-server1 Domain dev-server1 marked as autostarted
- 挂起/恢复虚拟机
devuser@server_01:~$ virsh suspend dev-server1 # 挂起虚拟机 devuser@server_01:~$ virsh resume dev-server1 # 恢复挂起的虚拟机
- 销毁虚拟机
devuser@server_01:~$ virsh undefine dev-server1 # 彻底销毁虚拟机,会删除虚拟机配置文件,但不会删除虚拟磁盘