先安装必要软件包:
apt-get install qemu qemu-system mdevctl qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager git vim
检查virsh是否工作:
root@zx-dev:~# sudo virsh list --all
Id Name State
--------------------
默认kvm的虚拟机配置文件都保存在 /etc/libvirt/qemu 目录中。
先进入 /etc/libvirt/qemu 目录中,创建硬盘qemu-img create -f qcow2 /kvm/images/c1.qcow2 200G
,没有这个目录就自行创建一个。
通过virsh,来操作虚拟机:
- virsh define vm0.xml # 导入虚拟机配置
- virsh create vm0.xml # 导入虚拟机配置并启动
- virsh start vm0 # 开启vm0
- virsh list --all # 显示所有虚拟机状态
- virsh destroy vm0 # 销毁虚拟机
- virsh undefine vm0 # 删除虚拟机配置
- vish dumpxml vm0 # 显示虚拟机xml配置
查询支持操作系统:
sudo apt install libosinfo-bin
osinfo-query os
virsh创建网络:
sudo virsh net-list # 查看网络
cd /etc/libvirt/qemu/networks
sudo virsh net-create default.xml # 通过default.xml创建网络
sudo virsh net-autostart default # 设置网卡自动启动
先创建磁盘大小:
qemu-img create -f qcow2 win10.qcow2 200G
创建虚拟机:
sudo virt-install \
--connect=qemu:///system \
--virt-type kvm \
--name=win10 \
--ram=4096 \
--vcpus=2 \
--os-type=win10 \
--accelerate \
--cdrom=/home/jet/iso/win10_21h2.iso \
--disk path=/home/jet/iso/virtio-win-0.1.225.iso,device=cdrom \
--disk path=/home/jet/iso/win10.qcow2,bus=virtio \
--network network=default \
--graphics vnc,listen=0.0.0.0,password=123456,port=5901 --noautoconsole \
--force
正常vnc界面进入安装系统,点击重启后vnc连不上,执行以下命令:
virsh --connect qemu:///system start win10
正常完成后进入关机流程后,可以通过如下命令看到虚拟机(需要以root权限执行,普通权限看不到):
❯ sudo virsh list --all
Id Name State
------------------------
- win10 shut off
再次启动虚拟机:
virsh --connect qemu:///system start win10
# 或者下面这个
sudo virsh start win10
关闭虚拟机:
sudo virsh destroy win10
快照
创建快照:
sudo virsh snapshot-create-as win10 --name "first" --description "init system"
查看快照:
❯ sudo virsh snapshot-list win10
Name Creation Time State
---------------------------------------------------
first init 2022-11-29 12:47:52 +0800 shutoff
删除快照:
sudo virsh snapshot-delete --domain win10 --snapshotname 1669697039
覆盖快照:
sudo virsh snapshot-revert --domain win10 --snapshotname "first init"
删除虚拟机(需要先删除那个虚拟机的所有快照):
sudo virsh undefine win10
优化系统占用
使用DISM++进行,和关闭一些服务,可以在网上找到一些资料进行确定。
创建template
在创建好了base虚拟机的情况下,接下来就可以创建模板了。
安装:
sudo apt install libguestfs-tools
copy 一份虚拟机作为模板:
cp /home/jet/iso/win10.qcow2 /home/jet/iso/win10_21h2_tpl.qcow2
处理镜像:
virt-sysprep -a /home/jet/iso/win10_21h2_tpl.qcow2
获取配置文件:
sudo virsh dumpxml --domain win10 > /home/jet/iso/win10_21h2_tpl.xml
修改新模板配置文件:(第一部分修改source文件地址)
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/home/jet/iso/win10_21h2_tpl.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
删除新模板文件中的部分配置:
<name>win10</name>
<uuid>47cdbba1-3551-407d-a03c-90d2a60bfa72</uuid>
<mac address='52:54:00:83:80:89'/>
<source mode='bind' path='/var/lib/libvirt/qemu/channel/target/domain-win10/org.qemu.guest_agent.0'/>
删除新模板文件中的不要的配置,比如disk等选项。
通过模板创建虚拟机:
sudo virt-clone \
--original-xml /home/jet/iso/win10_21h2_tpl.xml \
--name vm1 \
--file /home/jet/iso/vm1.qcow2
如果要使用thin模式(base template,copy on write),添加 --preserve-data
,同时vm2.qcow2也需要处理下。
qemu-img create -f qcow2 -b /home/jet/iso/win10_21h2_tpl.qcow2 -F qcow2 /home/jet/iso/vm2.qcow2
还可以进一步修改磁盘大小:
qemu-img resize /home/jet/iso/vm2.qcow2 +50G
创建新的虚拟机:
sudo virt-clone \
--original-xml /home/jet/iso/win10_21h2_tpl.xml \
--name vm2 \
--file /home/jet/iso/vm2.qcow2 \
--preserve-data
修改某些配置文件: 修改vnc port:
sudo virsh edit vm1
配置文件:
<graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0'>
也可以改为如下配置:
<graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0' passwd='123456'>
<listen type='address' address='0.0.0.0'/>
</graphics>
哈哈哈哈,没想到,vnc是可以设置密码的,里面的autoport不太好用,我都不知道映射到哪个口了,还是自己指定会合适点。
添加mdev设备(修改其中的UUID即可):
<hostdev mode='subsystem' type='mdev' managed='yes' model='vfio-pci' display='off'>
<source>
<address uuid='889d09aa-b35b-4aba-bec6-ad581bc77401'/>
</source>
<alias name='hostdev0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</hostdev>
2.总的操作(thin method)
2.1 创建template虚拟机
先准备一个win10安装文件iso,存放在如下目录:/home/jet/iso/win10_21h2.iso
再准备一个virtio驱动iso,存放在如下目录:/home/jet/iso/virtio-win-0.1.225.iso`
创建默认网络:
sudo virsh net-list # 查看网络
cd /etc/libvirt/qemu/networks
sudo virsh net-create default.xml # 通过default.xml创建网络
sudo virsh net-autostart default # 设置网卡自动启动
qemu-img create -f qcow2 /home/jet/kvm/win10.qcow2 200G
创建虚拟机(vnc端口密码需要自己修改)(有 --connect=qemu:///system 就不需要sudo了,这里全部加上了):
sudo virt-install \
--connect=qemu:///system \
--virt-type kvm \
--name=win10 \
--ram=4096 \
--vcpus=2 \
--os-type=win10 \
--accelerate \
--cdrom=/home/jet/kvm/win10.qcow2 \
--disk path=/home/jet/iso/virtio-win-0.1.225.iso,device=cdrom \
--disk path=/home/jet/iso/win10.qcow2,bus=virtio \
--network network=default \
--graphics vnc,listen=0.0.0.0,password=123456,port=5901 --noautoconsole \
--force
······ 进入windows安装环节 ······
创建快照:
sudo virsh snapshot-create-as win10 --name "first" --description "init system"
2.2 基于template虚拟机
设置虚拟机自动启动:
# 开启虚拟机自动启动
virsh autostart vm1
# 关闭虚拟机自动启动
virsh autostart --disable vm1
参考文献
- KVM VirSH Command
- 虚拟化技术之kvm管理工具virsh常用基础命令(一)
- 利用virsh和xml文件创建虚拟
- Michael Abrahamsen – How to create a KVM template on Arch Linux
- [Linux KVM] Template & Snapshot 的運用
- kvm系列2:通过模板快速创建虚拟机
- 使用virt-install手动创建qcow2镜像并安装ISO
- kvm系列2:通过模板快速创建虚拟机
问题排查
- 机器上出现
virsh capcabilities
中guest为空或者项目很少,且通过systemctl status libvirtd
命令发现有相关permission denied错误输出:
该问题极有可能是selinux带来的错误问题,参考如何在Ubuntu 20.04 Linux上禁用/启用SELinux-之路教程 (onitroad.com),将selinux安装,并设置为disable。
更新:安装selinux后搞挂了,得接上显示器又没发现问题,是正常启动的。
不过发现了libvirtd启动的时候会去找 /mnt/2t/vm /mnt/2t/iso 两个目录,这两个目录挂载的优先级比较靠后,所以将system restart libvirtd
命令放在这个之后。
编译qemu的时候需要带一些选项:
./configure --enable-kvm --target-list=x86_64-softmmu --enable-spice
从源码编译安装QEMU以及如何创建QEMU虚拟机_Jeremy_ku的博客-CSDN博客_编译安装qemu
但是安装spice的时候会说找不到库,可以先试试下面两句:
sudo apt install libspice-protocol-dev
sudo apt install libspice-server-dev
如果还说缺libspice-protocol的库,可以安装下面的库:
wget http://spice-space.org/download/releases/spice-protocol-0.14.0.tar.bz2
tar -xjf spice-protocol-0.14.0.tar.bz2
cd spice-protocol*
./configure
make
sudo make install
- qemu命令行启动程序是可以正常开启调试模式,windbg连接也正常,但是使用libvirt却无法成功,KDNet始终无法开启。
Using WinDbg Over KDNet on QEMU-KVM – OSR
libvirt: QEMU/KVM/HVF hypervisor driver
需要在xml描述文件中的hyperv下添加
<vendor_id state='on' value='KVMKVMKVM'/>
。具体原因就在于上面引用链接1中描述的那样子,libvirt默认的xml下启动的虚拟机将会报告hypervisor ID为'Microsoft Hv',guest此时启用内核调试器指定KDNet会使用未记录的协议打开调试器链接,所以就导致了问题,qemu的开发者建议使用KVMKVMKVM
,实际测试下来可以使用。
评论区