用 PVE 作为虚拟机管理平台已经好几年了,之前一直都是使用 Debian 的 ISO 安装镜像来安装虚拟机。首先安装的过程就比较漫长,而且每次安装完成之后都还要再进行一堆的配置和安装软件才能使用。直到看到了为 Proxmox VE 定制 Debian Cloud 系统镜像与创建虚拟机模板这篇文章,才知道原来自己之前的做法一直是有问题的,所以自己安装文章里的方法试了一次,发现确实方便了很多。感谢原作者。
选择基底系统
由于我们一直使用 Debian 作为虚拟机系统,所以跟作者一样选择 Debian 12 作为基底系统,而且也同作者一样,直接选择使用 genericcloud 镜像即可。 镜像下载地址:debian-12-genericcloud-amd64.qcow2
定制系统镜像
安装 libguestfs-tools
apt install libguestfs-tools
然后使用 libguestfs-tools 提供的工具 virt-customize 来定制镜像。这是我在定制我的 Debian Cloud Image 时使用的命令:
virt-customize -a debian-12-genericcloud-amd64.qcow2 \
--smp 2 --verbose \
--timezone "Asia/Shanghai" \
--append-line "/etc/default/grub:# disables OS prober to avoid loopback detection which breaks booting" \
--append-line "/etc/default/grub:GRUB_DISABLE_OS_PROBER=true" \
--run-command "update-grub" \
--run-command "sed -i 's|Types: deb deb-src|Types: deb|g' /etc/apt/sources.list.d/debian.sources" \
--run-command "sed -i 's|generate_mirrorlists: true|generate_mirrorlists: false|g' /etc/cloud/cloud.cfg.d/01_debian_cloud.cfg" \
--update --install "sudo,qemu-guest-agent,spice-vdagent,wget,curl" \
--run-command "apt-get -y autoremove --purge && apt-get -y clean" \
--run-command "echo 'vm.swappiness=10' >> /etc/sysctl.conf" \
--run-command "sed -i 's/#Storage=auto/Storage=none/' /etc/systemd/journald.conf" \
--run-command "systemctl disable --now cups.service && systemctl disable --now avahi-daemon.service" \
--delete "/var/log/*.log" \
--delete "/var/lib/apt/lists/*" \
--delete "/var/cache/apt/*" \
--run-command "sed -i '/^#/!s/^/#/' /etc/locale.gen && sed -i 's/#\(en_US.UTF-8\)/\1/' /etc/locale.gen && sed -i 's/#\(zh_CN.UTF-8\)/\1/' /etc/locale.gen && locale-gen" \
--run-command "rm -rf /var/cache/man /var/lib/systemd/catalog /var/lib/cloud/instances/*" \
--truncate "/etc/machine-id"
相较于原作者,我去掉了时间同步服务器的修改(会影响我设置默认的 DNS 服务器,很神奇),另外也增加了一些其他的精简。
减少镜像体积
同样,使用 virt-sparsify 来减少镜像体积。
virt-sparsify --compress debian-12-genericcloud-amd64.qcow2 debian-12-genericcloud-amd64-alan.qcow2
在 Proxmox VE 中导入镜像并创建虚拟机模板
首先创建一个空的虚拟机
qm create 9000 \
--machine q35 \
--cpu cputype=host \
--name "debian-12-cloud-template" \
--scsi2 "local-nvme1:cloudinit" \
--serial0 socket \
--scsihw virtio-scsi-single \
--net0 virtio,bridge=vmbr0 \
--agent 1 \
--ostype l26 \
--memory 1024
将定制好的镜像上传到 PVE 的存储中,然后使用 qm importdisk
命令导入镜像。
qm importdisk 9000 debian-12-genericcloud-amd64-alan.qcow2 local-nvme1 -format qcow2
使用磁盘(命令行有问题,在图形化界面上操作吧)
qm set 9000 --scsi0 "local-nvme1:9000/vm-9000-cloudinit.qcow2,discard=on,ssd=1"
调整引导顺序
qm set 9000 --boot order=scsi0
然后配置一下 Cloud-init 的信息,最后把虚拟机转换成模板旧可以了。 后面使用的话,直接通过模板创建虚拟机,然后调整一下磁盘大小,就可以了。