Debian11安装KVM开设Windows11小鸡

前两天在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 root@192.168.122.141

扩容小鸡的硬盘:

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这些可参考我先前的这篇文章:

openSUSE Leap15.3安装KVM开设Windows11小鸡

吐槽一下配置过程中遇到的坑。。

首先是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的错误。

全部为采集文章,文中的 联系方式 均不是 本人 的!

发表评论