KVM — 使用 libvirt 工具栈创建管理虚拟机实例

应用准备

启用硬件虚拟化支持功能,对于不同宿主机,启用方式略有不同

如果虚拟机的宿主机为Windows,假如使用VMware中的虚拟机作为宿主机,需要在VMware选项中的”处理器”选项中启用”虚拟化 Intel VT-x/EPT 或 AMD-V/RVI(V) ” 选项。

如果虚拟机的宿主机为Linux,需要在BIOS处启动 Intel VT-x/EPT 或 AMD-V/RVI(V) 虚拟化技术

验证系统已经支持KVM并加载该模块,使宿主机成为hyperViso

  • 搜索cpu信息中是否有以下字段
grep -E -i "(svm|vmx|lm)" /proc/cpuinfo
  • 查看kvm模块信息
modinfo kvm
  • 加载kvm模块并查看结果
modprobe kvm

lsmod | grep kvm
kvm_intel             170181  0 
kvm                   554609  1 kvm_intel
irqbypass              13503  1 kvm
  • 查看kvm字符设备是否存在
ls -l /dev/kvm
crw-------. 1 root root 10, 232 Jul 27 03:58 /dev/kvm

KVM 的三个组件

  1. kvm.ko :模块
  2. qemu-kvm :用于实现虚拟化的辅助管理用户空间的工具程序,能够模拟 I/O 设备
  3. libvirt :虚拟化工具包

使用 libvirt 工具栈

  • 安装程序包,启动服务并查看UDP端口
yum install -y libvirt libvirt-daemon-kvm virt-manager

rpm -ql libvirt-daemon

systemctl start libvirtd.service

ss -unlp
UNCONN     0      0      *%virbr0:67    *:*     users:(("dnsmasq",pid=1808,fd=3))
  • 查看自动创建的网桥设备
ifconfig -a
virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:8f:27:65  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0-nic: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether 52:54:00:8f:27:65  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • 查看自动生成的 nat 表的POSTROUTING 链上的 MASQUERADE 规则
iptables -t nat -vnL
Chain POSTROUTING (policy ACCEPT 6 packets, 426 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  *      *       192.168.122.0/24     224.0.0.0/24        
    0     0 RETURN     all  --  *      *       192.168.122.0/24     255.255.255.255     
    0     0 MASQUERADE  tcp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
    0     0 MASQUERADE  udp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
    0     0 MASQUERADE  all  --  *      *       192.168.122.0/24    !192.168.122.0/24
  • 查看虚拟机管理命令 virsh
[root@localhost ~]# which virsh
/usr/bin/virsh
[root@localhost ~]# rpm -qf /usr/bin/virsh
libvirt-client-2.0.0-10.el7_3.9.x86_64

创建网桥

  • 使用 virsh 的 iface-bridge 子命令创建一个名为 “br0” 的网卡接口,物理网卡 ens33 从此会成为虚拟交换机
virsh iface-bridge ens33 br0
Created bridge br0 with attached device ens33

注意:ens33 物理接口会成为虚拟交换机,br0 虚拟接口会代替 ens33 成为新的宿主机的网卡接口

上面一条命令执行完成后,两个接口发生角色转换,需要重启network服务,重启服务会报错,再一次重启network服务即可

ifconfig 
#结果
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.50.18  netmask 255.255.0.0  broadcast 172.16.255.255
        inet6 fe80::20c:29ff:fe99:ea72  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:99:ea:72  txqueuelen 1000  (Ethernet)
        RX packets 6866  bytes 936170 (914.2 KiB)
        RX errors 0  dropped 2  overruns 0  frame 0
        TX packets 68  bytes 9383 (9.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:0c:29:99:ea:72  txqueuelen 1000  (Ethernet)
        RX packets 173822  bytes 158449094 (151.1 MiB)
        RX errors 0  dropped 169  overruns 0  frame 0
        TX packets 57053  bytes 4357222 (4.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

启动virt-manager图形界面并安装配置虚拟机

  • 启动virt-manager图形界面,在图形界面中操作安装配置虚拟机
virt-manager &
  • 如果使用CentOS的minimal(最小化)系统,需要安装以下程序包,也可以安装图形界面的几个包组
yum install -y xorg-x11-font-utils.x86_64 xorg-x11-server-utils.x86_64 xorg-x11-utils.x86_64 xorg-x11-xauth.x86_64 xorg-x11-xinit.x86_64 xorg-x11-font-utils.x86_64 xorg-x11-drv-ati.x86_64 dejavu-lgc-sans-fonts

在虚拟机硬件配置选项中,将 “Display VNC” 一项中的 “VNC Server” 中的 “Type” 修改为 “VNC Server” 。