前两天在opensuse上配置了一遍和这个基本相同的环境,整体来说配置起来差不多吧,区别不大。debian要略麻烦一点,主要是目前的stable还没有swtpm的包,要自己编译。
另外就是libvirt和swtpm还有一个小问题要处理一下,我不知道suse上面是不是已经修复过这个问题了,但suse确实是做到了开箱即用,而现在在debian上面还要手动操作一下,不然报错小鸡创建不起来。。
另外suse上面的libguestfs-tools也有bug,virt-customize死活找不到dns服务器地址,没办法我才换debian了。。反正不是这有点问题就是那有点问题,mlgb就不能直接一步到位。。
安装需要用到的软件包:
apt -y install qemu-kvm libvirt-daemon-system virtinst libguestfs-tools bridge-utils
启动libvirtd:
systemctl enable --now libvirtd
启动默认的nat网络:
virsh net-list --all virsh net-start default virsh net-autostart default
接下来需要编译swtpm,编译需要装一大坨乱七八糟的包,为了保证宿主机不被污染,我这里先开一台小鸡,然后在小鸡里面编译。这里介绍一个快速部署debian小鸡的方法,类似于用模板部署。
下载debian的cloud镜像:
wget https://cloud.debian.org/images/cloud/bullseye/latest/debian-11-generic-amd64.qcow2
然后使用virt-customize配置镜像,设置root密码,安装ssh服务等:
virt-customize -a debian-11-generic-amd64.qcow2 --update --hostname imlala --timezone 'Asia/Shanghai' --root-password password:imlala --install openssh-server,build-essential,wget,curl,git,net-tools,nginx,python3-certbot-nginx --run-command 'ssh-keygen -A'
把配置好的镜像复制到/var/lib/libvirt/images:
cp debian-11-generic-amd64.qcow2 /var/lib/libvirt/images
然后就可以直接把这个镜像导入到虚拟机了:
virt-install --name debian11 --memory 4096 --vcpus 4 --cpu host-passthrough --os-variant debian10 --boot uefi --machine q35 --import --disk /var/lib/libvirt/images/debian-11-generic-amd64.qcow2,bus=virtio,cache=writeback --network bridge=virbr0,model=virtio --graphics vnc,port=5901,listen=0.0.0.0,password=imlala --noautoconsole
根据需要调整小鸡的硬盘大小,这里我增加了10gb:
virsh blockresize debian11 /var/lib/libvirt/images/debian-11-generic-amd64.qcow2 10G
查看小鸡的ip地址:
virsh domifaddr debian11 --source arp
在宿主机就可以直接通过ssh登录到小鸡了:
ssh [email protected]
扩容小鸡的硬盘:
lsblk growpart /dev/vda 1 resize2fs /dev/vda1
先来编译libtpms,在小鸡内安装编译需要用到的依赖:
apt -y install automake libtool build-essential libssl-dev dh-exec pkg-config gawk git
拉取项目文件:
mkdir /usr/local/src/libtpms cd /usr/local/src/libtpms git clone https://github.com/stefanberger/libtpms.git cd libtpms
这里选择编译0.9.1版本:
git checkout v0.9.1
编译并打包:
./autogen.sh --with-openssl make dist mv debian/source debian/source.old dpkg-buildpackage -us -uc -j$(nproc)
回到上级目录安装libtpms:
cd .. apt -y install ./libtpms0_0.9.1_amd64.deb ./libtpms-dev_0.9.1_amd64.deb
现在来编译swtpm,安装编译所需依赖包:
apt -y install net-tools libfuse-dev libglib2.0-dev libgmp-dev expect libtasn1-dev python3-twisted gnutls-dev gnutls-bin libjson-glib-dev softhsm2 libseccomp-dev
拉取swtpm项目文件:
mkdir /usr/local/src/swtpm cd /usr/local/src/swtpm git clone https://github.com/stefanberger/swtpm.git cd swtpm
这里选择编译0.7.0版本:
git checkout v0.7.0
编译并打包:
dpkg-buildpackage -us -uc -j$(nproc)
打包完成之后就不用在小鸡内安装swtpm了,之前在小鸡内安装libtpms只是为了能够编译swtpm,因为libtpms是swtpm的一个依赖。swtpm我们是编译给母鸡用的,这里只需要把编译好的包从小鸡内复制出来即可。
退出小鸡的ssh:
exit
在母鸡执行下面的命令把打包好的软件包复制出来:
virt-copy-out -d debian11 /usr/local/src/libtpms/libtpms0_0.9.1_amd64.deb /root virt-copy-out -d debian11 /usr/local/src/libtpms/libtpms-dev_0.9.1_amd64.deb /root virt-copy-out -d debian11 /usr/local/src/swtpm/swtpm_0.7.0_amd64.deb /root virt-copy-out -d debian11 /usr/local/src/swtpm/swtpm-tools_0.7.0_amd64.deb /root virt-copy-out -d debian11 /usr/local/src/swtpm/swtpm-libs_0.7.0_amd64.deb /root virt-copy-out -d debian11 /usr/local/src/swtpm/swtpm-dev_0.7.0_amd64.deb /root
使用apt安装即可:
apt install ./libtpms0_0.9.1_amd64.deb ./libtpms-dev_0.9.1_amd64.deb ./swtpm_0.7.0_amd64.deb ./swtpm-libs_0.7.0_amd64.deb ./swtpm-tools_0.7.0_amd64.deb ./swtpm-dev_0.7.0_amd64.deb
注:不要用dpkg这种东西来安装本地包,直接用apt就行了,并且apt能自动处理包的依赖关系。
现在尝试开设win11小鸡:
virt-install --name windows11 --memory 4096 --vcpus 4 --cpu host-passthrough --boot uefi --machine q35 --cdrom /var/lib/libvirt/boot/win11.iso --disk /var/lib/libvirt/boot/virtio-win.iso,device=cdrom,bus=sata --disk size=100,bus=virtio,cache=writeback,format=qcow2 --network bridge=virbr0,model=virtio --tpm backend.type=emulator,backend.version=2.0,model=tpm-tis --graphics vnc,port=5902,listen=0.0.0.0,password=imlala --noautoconsole
不出意外的话,目前在debian上面的libvirt会报错,查看日志有如下信息:
Need read/write rights on statedir /var/lib/swtpm-localca for user root. swtpm_localca exit with status 1: An error occurred. Authoring the TPM state failed. Error getting next filename: No child processes Ending vTPM manufacturing @ Wed 22 Dec 2021 12:00:53 AM EST
与这里提到的问题一致:https://github.com/stefanberger/swtpm/issues/572
手动执行如下命令可解决:
/usr/share/swtpm/swtpm-create-user-config-files --root
系统装好后,验证一下tpm是否正常:
其他的配置例如端口转发,添加ipv6这些可参考我先前的这篇文章:
吐槽一下配置过程中遇到的坑。。
首先是debian的这个cloud镜像,真的太精简了,我觉得默认给装个ssh服务会更好。。比如说opensuse的jeos就内置好了ssh服务。。
现在的问题是如果你用virt-customize手动去装ssh服务的话,virt-customize是chroot进去装的,这样会导致包安装完之后不能生成sshhostkey,紧接着就会导致ssh服务无法启动。后来我搜了半天才找到一个解决办法,用ssh-keygen -A去手动生成一个。。本来这应该是apt安装的时候就能自动完成的事情。。
然后就是virt-install这货。。对于导入的虚拟机一定要加这个参数:noautoconsole,否则virt-install认为你这是在安装新的虚拟机而不是导入,它会一直提示虚拟机正在安装,一旦你手动关闭虚拟机就创建失败了。还有现在的新版本导入是用这个参数:import,以前那种配置方法已经不适用了。还有virt-install里面的这个os-variant配置,有一些新的系统还没有加入进来,比如debian11,所以在上面的配置还是只能暂时用debian10来替代。
最后就是创建小鸡的时候最好都用uefi和q35机型,像这个debian11cloud镜像如果用默认的配置,vnc上面会报一些vmmouse at isa0060的错误。
最新评论
5211314
能不能教我 一点不会