直接使用官方云镜像
现在常用的发行版基本都会提供 cloud image 下载,获取到的镜像可用于基于 KVM 架构的虚拟化平台。
wget https://old.kali.org/cloud-images/kali-2025.2/kali-linux-2025.2-cloud-genericcloud-amd64.tar.xz && tar -xf kali-linux-2025.2-cloud-genericcloud-amd64.tar.xz
可以看到解压出来的 RAW 格式体积有 12GB 非常大,这种大小适合那些直接安装系统使用的,不需要再手动扩容了。但是对于我们这种使用云架构的系统来说,有点浪费存储空间了,实际上里面真实有效的数据其实是很小的,清除无效数据后作为系统模板放置起来,安装系统的时候再调整到实际需要的大小即可。
精简镜像
virt-sparsify 压缩(推荐)
安装 virt-sparsify
apt install libguestfs-tools -y
virt-sparsify 会自动清理 RAW 镜像里的无用空间,然后再转换为 qcow2 可伸缩的格式。
root@ubuntu:/var/virtualizor/kvm# virt-sparsify --compress --convert qcow2 disk.raw disk.qcow2
[ 0.1] Create overlay file in /tmp to protect source disk
[ 0.1] Examine source disk
100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00
[ 45.4] Fill free space in /dev/sda1 with zero
100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00
[ 636.1] Fill free space in /dev/sda15 with zero
100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ --:--
[ 645.7] Copy to destination and make sparse
[ 858.4] Sparsify operation completed with no errors.
virt-sparsify: Before deleting the old disk, carefully check that the
target disk boots and works correctly.
qemu-img 压缩
不使用工具的话,可以先手动填充零,再用 qemu-img 直接压缩。
挂载镜像
guestmount -a disk.raw -i /mnt
将镜像空闲空间置零
dd if=/dev/zero of=/mnt/zero.fill bs=1M || true
sync
rm -f /mnt/zero.fill
sync
guestunmount /mnt
最后再转换成 qcow2 格式(转换过程会忽略置零块,从而使转换后的镜像体积变小)
qemu-img convert -c -O qcow2 disk.raw disk.qcow2
制作镜像模版
如果实在找不到官网提供的镜像,其实也可以自己制作,只需要像往常一样先使用官方提供的 ISO 镜像安装好系统。
这里以 ubuntu 20.04 举例:
- 安装前建议分配最小的存储空间即可,例如:我这里分配 5G 作为系统盘。
- 安装过程需要注意,网络选择DHCP,创建一个所有镜像通用的普通用户(具有 sudo 权限)作为保底。
- 安装好之后可以登录进去清除下日志缓存临时文件什么的,虽然作用不大。还有最重要的一点,需要删除掉安装时自动生成的唯一标识,避免引起一些不必要的冲突。最后将空闲空间全部置零。
清理日志和缓存
apt clean && apt autoremove -y # Ubuntu/Debian
yum clean all # CentOS
rm -rf /var/log/* # 清空日志
rm -rf /tmp/* # 清空临时文件
> /etc/machine-id # 清空系统唯一标识符
> /var/lib/dbus/machine-id # 清空系统唯一标识符
history -c # 清空 shell 历史
如果不清理 machine-id 会有什么影响?
所有用这个模板开的 VPS 拥有相同 machine-id,这会导致系统认为它们是同一台机器。可能引发的问题:
日志/监控混乱:journald、syslog、Prometheus 之类工具,可能会认为多个 VPS 是同一个来源。
DBus 冲突:某些依赖 machine-id 的应用(比如桌面环境、systemd 组件)可能出问题。
网络管理异常:NetworkManager、systemd-networkd 可能用 machine-id 生成接口 UUID 标识。
集群/认证冲突:Kubernetes、Ceph 等分布式系统里,节点 ID 可能重复。
换句话说:单机环境可能没感觉,但一旦涉及到集群、监控、认证,问题就会显现。
置零空闲空间
- Linux 系统
dd if=/dev/zero of=/EMPTY bs=1M
sync
rm -f /EMPTY
- Windows 系统
sdelete -z C:
做完以上操作后关机,然后在从节点(Slave)找到对应的虚拟系统文件。我这里的虚拟系统文件都存储在/home/vms
目录下,以 raw 的格式。
使用 virt-sparsify 压缩
root@hk-slave-a:/home/vms# virt-sparsify --compress --convert qcow2 v1001-dV2a0i3aODAhHKMJ-K3m6QlF6o9HxDQte.raw ubuntu-20.04_x86_64.qcow2
最终得到了 1.1G 的系统模版。
添加模版
有时候制作的模版找不到对应的系统,就需要自己“添加发行版”,自己定义名字、说明、还有 64x64 的 LOGO 图标。
获取到的镜像(img/qcow2)文件放置到指定位置(/var/virtualizor/kvm)后,在 Virtualizor Master 控制面板点击“媒体>添加模版”。
这里需要注意文件名,它会自动添加系统模版名字作为开头,所以此前放置的自定义镜像也需要按这个要求命名,它才能在 kvm 目录里面找到对应的文件。例如:这里是 ubuntu-20.04_x86_64.qcow2 。
评论区