KVM环境构建硬件系统配置上CPU要支持Intel VT-x/EPT或AMD-V/VRI宿主机操作系统CentOS7.9KVM模块modprobe kvmmodprobe kvm-amd安装qemu-kvmyum install qemu-kvm管理工具栈使用包括了qemu-kvm和libvirtqemu-kvm创建一个链接到/usr/bin下这样可以直接使用命令ln -sv /usr/libexec/qemu-kvm /usr/bin/qemu-kvm语法qemu-kvm [options] [disk_image]命令选项标准选项-Standard options显示选项-Display options块设备选项-Block device options网络选项-Network optionsi386平台专用选项-i386 target only字符设备选项-Character device optionsUSB设备选项Linux启动专用选项-Linux/Multiboot boot specific调试/专家模式选项-Debug/Expert optionsqemu-img虚拟磁盘映像管理工具一般产生的磁盘文件是稀疏类型即创建100G的磁盘映像文件最开始可能只是几兆或几十兆。qemu-kvm的具体使用启动第一个虚拟机先使用已经做好的磁盘映像这里下载cirros镜像文件。Cirros是一个超轻量级的Linux测试镜像专门用来验证云平台如OpenStack、KVM是否正常工作。下载cirros-0.3.6-x86_64-disk.img。cirros最新版本是0.6.x。使用qemu-img工具可以查看下载的磁盘镜像文件的信息qemu-img info /images/kvm/cirros-0.3.6-x86_64-disk.img对CentOS6和7因为qemu-img的版本不同支持的格式也不同CentOS6中CentOS7中qcow2本身也有不同版本不同的qemu-img对应着不同的qcow2。qemu-kvm -m 128 -smp 2 -name testcirros -hda /images/kvm/cirros-0.3.6-x86_64-disk.img参数说明-m指定虚拟机的内存大小-smp指定虚拟机的CPU数量-name虚拟机的名称-hda指定虚拟机使用的磁盘为IDE接口类型的硬盘这是一个比较传统的用法现在一般使用-drive指定能够设置更丰富的特性虚拟机已经启动但是是基于VNC的方式想要查看虚拟机需要使用vnc连接到vnc控制台上。查看监控端口VNC只是监控在本地接口上即localhost上也就是只能从本地连接到VNC控制台上。对于CentOS6默认的qemu版本是QEMU PC emulator version 0.12.1在CentOS7上是QEMU emulator version 1.5.3 。在CentOS7.9上运行上述命令启动虚拟机时提示CentOS7.9中软件包qemu-kvm安装后有两个bios文件/usr/share/qemu-kvm/bios-256k.bin和/usr/share/qemu-kvm/bios.bin试着加载bios.bin成功。qemu-kvm命令中使用-bios指定加载特定的bios。bios-256k.bin是 QEMU/SeaBIOS 中特指256KB 容量截断版的 PC BIOS 镜像仅含核心引导代码而bios.bin通常是 SeaBIOS 编译生成的完整默认镜像含完整硬件初始化与扩展支持两者内容主体一致但文件大小、包含模块及适用场景不同 。那么在本地安装一个VNC客户端tigervncyum install tigervncCentOS6下安装的是1.1.0版CentOS7下安装的是1.8.0安装后会安装一个/usr/bin/vncviewer使用这个程序连接vncviewer 5900不幸的是出现错误vncviewer: unable to open display CentOS6安装yum groupinstall X Window Systemyum groupinstall Desktop重新启动后运行虚拟机然后vncviewer连接然后安装了XmanagerPowerSuite-7使用这个版本的xshell弹出窗口显示登录信息使用cirros用户密码为cubswin:)使用CTRLALT1或2可以在虚拟机界面和管理控制台界面切换如CTRLALT2可以使用Info命令查看虚拟机的各种信息CentOS7.9中安装yum groupinstall X Window System那么启动vncviewer是就能弹出显示窗口。在HostOS中可以通过kill命令关系虚拟机。启动虚拟机时使用-drive指定磁盘映像文件qemu-kvm -m 128 -smp 2 -name test -drive file/images/kvm/cirros-0.3.6-x86_64-disk.img,ifvirtio,mediadisk,cachewriteback,formatqcow2这里使用了-drive指定磁盘其有多个设置项file指定磁盘对应的磁盘镜像文件if网络接口类型virtio是使用半虚拟化技术能大大提升IO的性能kvm一般使用virtiomedia当前磁盘的类型disk就是硬盘cdrom是光盘等等cache缓存的设置writeback是回写机制format磁盘映像文件的格式通过cdrom启动windows的安装qemu-kvm -name win7 -m 512 -smp 2,,sockets1,cores2,threads2 -drive file/images/kvm/win7.img,ifide,mediadisk,cachewriteback,formatqcow2 -drive file/root/win7_ghost.iso,mediacdrom使用qemu-kvm管理kvm虚拟机。标准选项参数说明-cpu model设定cpu模型如core2duoqemu64可以使用qemu-kvm -cpu 获取所支持的所有cpu模型host指定cpu使用宿主机即物理机的cpu模型-smp n[,corescores][,threadsthreads][,socketssockets][,maxcpusmaxcpus]设定模拟的SMP架构中CPU的个数、每个CPU的核心数及CPU的socket插槽数目等PC机最多模拟255颗CPUmaxcpus用于指定热插入的CPU个数上限-numa opts指定模拟多节点的numa设备-fda file-fdb file使用指定文件file作为软盘镜像file为/dev/fd0表示使用物理软驱-hda file 、-hdb file、-hdc file、-hdd file使用指定file作为硬盘镜像-cdrom file使用指定file作为CD-ROM镜像需要注意-cdrom和-hdc不能同时使用将file指定为/dev/cdrom可以直接使用物理光驱-drive option[,option[,option]]定义一个硬盘设备可用的子选项很多file/path/to/somefile硬盘映像文件路径ifinterface指定硬盘设备所连接的接口类型即控制器类型如ide、scsi、sd、mtd、floppy、pflash及virtio等indexindex设定同一种控制器类型中不同设备的索引号即标识号mediamedia定义介质类型为硬盘disk还是光盘cdromsnapshotsnapshot指定当前硬盘设备是否支持快照功能on或offcachecache定义如何使用物理机缓存来访问块数据其可用值有none、writeback、unsafe和writethroughformatformat定义映像文件的格式-boot [orderdrives][,oncedrives][,menuon|off]定义启动设备的引导次序每种设备使用一个字符表示不同的架构所支持的设备及其表示字符不尽相同在x86PC架构上a、b表示软驱c表示第一块硬盘d表示第一个光驱设备n-p表示网络适配器默认为硬盘设备once表示只有首次启动时才有效。如下面配置就是说首次启动时才使用光驱引导此后将使用硬盘。-boot orderdconced安装windows操作下载安装光盘镜像win7_pro.iso创建磁盘映像文件qemu-img create -o size80G,preallocationmetadata -f qcow2 /images/kvm/win7.img启动虚拟机并引导安装qemu-kvm -name win7 -m 1024 -cpu host -smp 2 -drive file/images/kvm/win7.img,mediadisk -drive file/root/WIN7_PRO.iso,mediacdrom -boot orderdc,onced -bios /usr/share/qemu-kvm/bios.binvncviewer :5900显示选项参数说明显示选项用于定义虚拟机启动后的显示接口相关类型及属性等-nographic默认情况下qemu使用SDL来显示VGA输出而此选项用于禁止图形接口此时qemu类似一个简单的命令行程序其仿真串口设备将被重定向到控制台-sdl启用SDL —— Simple DirectMedia Layer跨平台且开源的多媒体程序库文件-vga type指定要仿真的VGA接口类型常见类型有cirrusCirrus Logic GD5446显示卡std带有Bochs VBI扩展的标准VGA显示卡vmwareVMWare SVGA-II兼容的显示适配器qxlQXL半虚拟化显卡与VGA兼容。none禁用VGA显卡-vnc display[,option[,option[,...]]]]默认情况下qemu使用SDL显示VGA输出红帽给成了默认VNC使用-vnc选项可以让qemu监听在VNC上并将VGA输出重定向至VNC会话使用此选项时必须使用-k选项指定键盘布局类型display1hostN 如192.168.147.1:1监听于192.168.147.1主机的5900N的端口上2unix/path/to/socket_file3noneoptionpassword连接时需要验证密码设定密码通过monitor接口使用change命令修改获得reverse“反向”连接至某处于监听状态的vncview上-monitor stdio表示在标准输入输出上显示monitor界面-nographic默认情况下qemu使用SDL来显示Ctrl - ac在console和monitor之间切换Ctrl -ah显示帮助信息测试使用-vncqemu-kvm -name cirros -m 128 -drive file/images/kvm/cirros-0.3.6-x86_64-disk.img,ifvirtio,mediadisk,cachewriteback -bios /usr/share/qemu-kvm/bios.bin -vnc 192.168.147.140:0此时在本机查看网络监听使用vncviewer 192.168.147.140:5900可以连接到虚拟机还可以在远程机器上连接如在宿主机上使用RealVNC链接点击Continue使用vnc是需要密码使用qemu-kvm -name cirros -m 128 -drive file/images/kvm/cirros-0.3.6-x86_64-disk.img,ifvirtio,mediadisk,cachewriteback -bios /usr/share/qemu-kvm/bios.bin -vnc 192.168.147.140:0,password本机上使用vncviewer 192.168.147.140:5900时提示为了设置密码启动虚拟机时使用-monitor stdio选项此时界面直接进入qemu的monitor修改一个设备的密码再次使用vncviewer 192.168.147.140:5900弹出密码窗口输入密码后进入虚拟机。RealVNC链接时-nographic选项直接在控制台界面上显示虚拟机在使用-nographic的同时又设置了vnc则可同时以各自方式连接虚拟机即此时也可通过vncviewer 192.168.147.140:5900连接到虚拟机。网络属性参数相关说明网络属性相关选项用于定义网络设备接口类型及其相关的各属性等信息。kvm是Type I型虚拟化也就是半虚拟化技术对于网络也就是虚拟机的网卡其是有前半段和后半段之分的前半段在虚拟机中以网卡形式如eth0呈现后半段在Hypervisor中也表现为一个网卡。这些一般需要自己手动创建还需要自己创建网桥设备需要自己手动将后半段桥接到这个网桥设备。也就是网络基本是手动自己控制组建的。Linux内核有bridge模块实现虚拟网桥设备功能。而管理虚拟网桥需要用户空间需要使用brctl程序与bridge模块交互完成桥设备的管理。这个程序要通过安装bridge-utils包获得前面学习xen时有接触。brctl的语法-net nic[,vlann] [,macaddrmac] [,modeltype] [,namename] [,addraddr] [,vectorsv]站在虚拟机的角度配置网络即网络的前半段的配置。创建一个新的网卡设备并连接至vlan n中PC结构上默认的NIC为e1000macaddr用于为其指定MAC地址name用于指定一个在监控时显示的网络设备名称。qemu可以模拟多个类型的网卡设备如virtio、ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet等不同平台可能有所不同可以使用“qemu-kvm -net nic,model? -bios /usr/shared/qemu-kvm/bios.bin”命令获取当前平台支持的类型默认MAC地址都是52:54:00:12:34:56所以对于启动第二个及以上虚拟机需要设定MAC。-net tap[,vlann] [,namename] [,fdh] [,ifnamename] [,scriptfile][,downscriptdfile]通过物理机的TAP网络接口连接至vlan n中使用scriptfile指定的脚本默认/etc/qemu-ifup来配置当前网络接口并使用downscriptdfile指定的脚本默认/etc/qemu-ifdown来撤销接口配置使用scriptno和downscriptno可分别来禁止执行脚本。ifnamename指定在宿主机上的接口名称namename应该是tap设备的名称。这是站在物理机的角度也就是宿主机或Hypervisor角度配置网络即网络的后半段的配置。搭建各种网络模型1、隔离模型虚拟机之间在同一个网络中且可以相互通信与宿主机以及外部网络是隔离的即不能访问宿主机及外部网络。其原理如下图guest1和guest2中的eth0相当于半虚拟化的网络前半段在虚拟机中对应的后半段vif0.0和vif1.0在宿主机中将宿主机中的这两个接口同时关联到br0网桥中相当于同时接入同一个交换机中此时虚拟机之间是相通的但不能与宿主机及外部互通。Peth0和Peth1是宿主机的物理网卡。宿主机上增加网桥设备添加前添加网桥br0brctl addbr br0删除网桥br0brctl delbr br0添加后的网桥不是启用状态可以使用如下命令启动ifconfig br0 upip link set br0 up通过nmtui也可以添加网桥。启动第一个虚拟机同时设置网络qemu-kvm -name cirros0.3.6 -m 128 -smp 2 -cpu host -drive file/images/kvm/cirros-0.3.6-x86_64-disk.img,ifvirtio,mediadisk,cachewriteback -bios /usr/share/qemu-kvm/bios.bin -vnc 192.168.147.140:0-net nic -net tap,ifnamevif1.0,scriptno此时查看宿主机上的网络设备情况后半段的vif1.0网卡出现在宿主机上。但是状态是没有启动不是UP状态。在虚拟机的monitor中查看其网络情况这里可以清楚的看到前半段\e1000.0和后半段tap.0测试一下nic和tap的name参数qemu-kvm -name cirros0.3.6 -m 128 -smp 2 -cpu host -drive file/images/kvm/cirros-0.3.6-x86_64-disk.img,ifvirtio,mediadisk,cachewriteback -bios /usr/share/qemu-kvm/bios.bin -vnc 192.168.147.140:0 -net nic,namevirteth0-net tap,namevif1,ifnamevif1.0,scriptnotap的name参数起作用了nic的没起作用。启动第二个虚拟机qemu-kvm-name cirros0.3.6-2-m 128 -smp 2 -cpu host -drive file/images/kvm/cirros-0.3.6-x86_64-disk.img,ifvirtio,mediadisk,cachewriteback -bios /usr/share/qemu-kvm/bios.bin -vnc192.168.147.140:1-net nic,macaddr52:54:00:12:34:57-net tap,namevif2,ifnamevif2.0,scriptno此时宿主机上已经有了两个后半段的网卡设备只不过都是DOWN状态虚拟机中配置网络地址相互之间进行ping是不通的需要后半段同时加入相同的网桥中此时在虚拟机中进行连通性测试两个虚拟机之间可以互通。但是与宿主机之间是隔离的。这就实现了网络的隔离模型。对于将后半段的网络接口加入到网桥可以通过脚本来达到启动虚拟机创建网络设备时自动加入指定网桥的功能即 -net tap,script来实现script默认使用/etc/qemu-ifup脚本downscript指定的脚本默认/etc/qemu-ifdown实现关闭虚拟机时自动从网桥中删除后半段接口。/etc/qemu-ifup检查是有有语法错误bash -n /etc/qemu-ifup添加执行权限chmod x /etc/qemu-ifup再次启动两台虚拟机此时scriptno可以去掉自动使用/etc/qemu-ifup脚本查看网桥情况qemu-kvm -name cirros0.3.6 -m 128 -smp 2 -cpu host -drive file/images/kvm/cirros-0.3.6-x86_64-disk.img,ifvirtio,mediadisk,cachewriteback -bios /usr/share/qemu-kvm/bios.bin -vnc 192.168.147.140:0 -net nic -net tap,namevif1,ifnamevif1.0,script/etc/qemu-ifupqemu-kvm -name cirros0.3.6-2 -m 128 -smp 2 -cpu host -drive file/images/kvm/cirros-0.3.6-x86_64-disk.img,ifvirtio,mediadisk,cachewriteback -bios /usr/share/qemu-kvm/bios.bin -vnc 192.168.147.140:1 -net nic,macaddr52:54:00:12:34:57 -net tap,namevif2,ifnamevif2.0,script/etc/qemu-ifup2、路由模型需要在宿主机上创建一对虚拟以太网设备veth这个设备在前面xen中学习过创建的一对veth一端相互连接另一端都各自连接到网络栈现在要把其中的一个的一端从网络栈移到网桥上。ip命令也可以实现虚拟网络设备添加的功能如添加网桥添加接口使用ip link add name br0 type bridgeip link set vif1.0 master br0添加veth设备ip link add veth0 type veth peernameveth1测试使用ip link add pveth0.0 type veth peernamepveth0.1p代表物理机中的虚拟以太网卡。将pveth0.1添加到网桥br0中同时给pveth0.0配置IP与虚拟机在同一网段虚拟机就可以与宿主机通信。ip link set pveth0.1 master br0配置pveth0.0的IPifconfig pveth0.0 192.168.6.12/24 up测试连通性虚拟机要想与宿主机的物理地址通信即与192.168.147.140通信需要添加路由将其网关设置为pveth0.0的地址192.168.6.12ping另一台主机192.168.147.130不通。此时在pveth0.0接口上抓包icmp包到达了pveth0.0接口但是因为宿主机的内核没有打开路由转发功能此包不能被转发到ens33接口在ens33接口抓包查看核心路由转发的设置cat /proc/sys/net/ipv4/ip_forward设置为1打开转发功能此时在ens33物理接口抓包在pveth0.0上抓包实际上打开核心转发功能后ping包能够到达130主机响应包也回到了140接口即物理接口但是没有转发到pveth0.0上。当前的问题好像是响应包到了物理接口后物理接口没有转发到pveth0.0。路由模型不是很适用因为数据包的返回需要对端有相应的路由项而我们一般无法控制对端的设备也就无法控制对端路由。所以一般使用下面的模型3、NAT模型使用iptables添加NAT规则iptables -t nat -A POSTROUTING -s 192.168.6.0/24 -o ens33 -j SNAT --to-source 192.168.147.140此时在虚拟机上ping外部主机使用nat也需要打开宿主机的核心转发功能如果关闭虚拟机上也是ping不同外部主机。简化网络上面的操作在测试各模型的同时也是对veth设备的熟悉过程但从网络图中可以看到增加了veth后网络的链条明显增加了实际中可以不使用veth在网桥上配置地址即可bridge在宿主机上也是一个网络设备也是一个网卡。删除veth在bridge上配置IP地址。先将pveth0.1从br0上删除然后删除veth设备ip link set pveth0.1 nomasterip link delete pveth0.0配置br0地址ifconfig br0 192.168.6.12/24这样配置后依然能够实现上面的效果。4、桥接模式将物理网卡的IP地址删除将物理接口桥接到br0桥设备上然后配置网桥地址为原来的物理网卡的地址。ip addr del 192.168.6.12/24 dev br0ip addr del 192.168.147.140/24 dev ens33ip link set ens33 master br0ip addr add 192.168.147.140/24 dev br0可以看到关键的一点物理网卡接口桥接到网桥后网桥的MAC和物理网卡的MAC是一样的了。启动两台虚拟机配置其地址与宿主机在同一个网段ifconfig eth0 192.168.147.10/24 up然后添加路由route add default gw 192.168.147.2此时虚拟机就可以访问外部网络了其与宿主机处于平等的网络位置。宿主机上虚拟机上应该是dns的问题但是IP地址是通的。指定以网络接口启动虚拟机安装qemu-kvm的-boot选项-boot ordernconcen在局域网中部署好pxe服务所需的dhcptftp等或者使用cobbler环境等。设置在后台运行虚拟机 -daemonize图形界面时鼠标轨迹不一致问题设置-usb选项KVM的virtio半虚拟化HVM虚拟化CPUI/O半虚拟化分成两段前端驱动(virtio前半段)virtio-blk, virtio-net, virtio-pci, virtio-balloon, virtio-consoleLinuxCentOS 4.8, 5.3, 6.0, 7.0Windowsvirtio: 虚拟队列virt-ringtransport后端处理程序(virt backend drivers)在QEMU中实现virtio-balloon:ballooning: 让VM中运行的GuestOS中运行调整其内存大小# qemu-kvm -balloon virtio手动查看GuestOS的内存用量info balloonballoon Nvirtio-net其依赖于GuestOS中的驱动及Qemu中的后端驱动GuestOS: virtio_net.koqemu-kvm -net nic,modelvirtiovhost-net用于取代工作于用户空间的qemu中为virtio-net实现的后端驱动以实现性能提升的驱动-net tap[,vnet_hdron|off][,vhoston|off]qemu-kvm -net tap,vnet_hdron,vhostonvirtio-blk其依赖于GuestOS中的驱动及Qemu中的后端驱动-drive file/path/to/some_image_file,ifvirtiokvm_clock: 半虚拟化的时钟# grep -i paravirt /boot/config-2.6.32-504.el6.x86_64CONFIG_PARAVIRT_GUESTyCONFIG_PARAVIRTyCONFIG_PARAVIRT_CLOCKyVM Migration虚拟机迁移static migration停机迁移磁盘映像文件启动live migration 运行中迁移整体迁移时间服务器停机时间对服务的性能的影响在待迁入主机使用# qemu-kvm -vnc :N -incoming tcp:0:7777# vncviewer :590N在源主机使用monitor接口migrate tcp:DEST_IP:DEST:PORT