virtio-boot /boot 9p trans=virtio,version=9p2000.L,x-systemd.automount 00
有了这一步,这只是将 /boot 中的文件混到新的文件系统里面,并且客户机完事了(确保 vmlinuz/initrd.img 保持符号链接)。内核可以如常升级,并对主机可见。
这时对于主机端,有另外一个问题需要跨过,由于客户机使用 9p 映射安全模式,客户机的符号链接对主机而言将是普通的包含链接目标的文件。为了解决这个问题,我们在客户机启动前使用 libvirt qemu 的 hook 支持来设置合适的符号链接。作为一个例子,下面是我们最终使用的脚本(/etc/libvirt/hooks/qemu):
vm=$1
action=$2
bootdir=/srv/${vm}-boot
if[ ${action}!="prepare"];then
exit0
fi
if[!-d ${bootdir}];then
exit0
fi
ln-sf $(basename $(cat ${bootdir}/vmlinuz)) ${bootdir}/virtio-vmlinuz
ln-sf $(basename $(cat ${bootdir}/initrd.img)) ${bootdir}/virtio-initrd.img
有了这个,我们可以简单地定义 libvirt 使用 /srv/${vm}-boot/virtio-{vmlinuz,initrd.img} 作为机器的内核 / initramfs,并且当 VM 启动时,它会自动获取客户机安装的最新内核 / initramfs。
只有最后一个边缘情况了,当从 VM libvirt 重启会让 qemu 处理它而不是重启 qemu。如果这不幸发生的话,意味着重启不会加载新内核。所以现在我们通过配置 libvirt 来解决这个问题,从而在重启时停止虚拟机。由于我们通常只在升级内核(安装)时重启 VM,虽然这有点乏味,但这避免了重启加载的是旧内核 / initramfs 而不是预期的。
via: https://www.collabora.com/news-and-blog/blog/2017/06/20/debian-armhf-vm-on-arm64-server/