各大 linux 发行版都会发行适用于虚拟化的镜像,这种镜像直接导入为虚拟机硬盘即可开机使用。对比传统的 ISO 镜像,Cloud Image 镜像无需安装,同时精简掉了虚拟化环境中不需要的驱动和组件,体积和启动速度极小。且默认使用串口控制台,方便在虚拟化平台中使用字符控制台,相较 vnc 控制台有着更高的传输效率和操作便捷性,同时无需为虚拟机配置虚拟显示设备,更加节省虚拟机资源。
一些发行版的 CloudImage 版镜像:
Debian:https://cloud.debian.org/images/cloud/
Ubuntu:https://cloud-images.ubuntu.com/
Rocky:https://wiki.rockylinux.org/rocky/image/#about-cloud-images
以下以 Proxmox VE 虚拟化平台为例,演示 debian 发行版虚拟机的开机过程。
# 下载通用虚拟化版 debian 12 cloudimage 镜像
wget https://cdimage.debian.org/images/cloud/bookworm/daily/latest/debian-12-genericcloud-amd64-daily.qcow2
# 定制镜像的工具
apt install libguestfs-tools
# 安装虚拟化客户机工具
virt-customize -a debian-12-genericcloud-amd64-daily.qcow2 --run-command "echo https://mirrors.ustc.edu.cn/debian > /etc/apt/mirrors/debian.list && echo https://mirrors.ustc.edu.cn/debian-security > /etc/apt/mirrors/debian-security.list"
virt-customize -a debian-12-genericcloud-amd64-daily.qcow2 --install qemu-guest-agent
# 替换开机镜像源
virt-customize -a debian-12-genericcloud-amd64-daily.qcow2 --run-command "sed -i 's@deb.debian.org@mirrors.ustc.edu.cn@g' /etc/cloud/cloud.cfg"
# 创建虚拟机,使用串口做为字符控制台
qm create 8000 --name "debian-12-cloudinit-template" --memory 16384 --cores 6 --cpu cputype=host,flags=+aes --net0 virtio,bridge=vmbr0 --ostype l26 --ide2 local-lvm:cloudinit --serial0 socket --vga serial0 --agent enabled=1
# 导入镜像为虚拟机的磁盘
qm importdisk 8000 debian-12-genericcloud-amd64-daily.qcow2 local-lvm
# 设置虚拟机磁盘控
qm set 8000 --scsihw virtio-scsi-pci --virtio0 local-lvm:vm-8000-disk-0 --boot order=virtio0
# 调整磁盘大小
qm resize 8000 virtio0 32G
# cloudinit 配置用户和 ssh 公钥
qm set 8000 --ciupgrade 0 --ipconfig0 ip=dhcp --ciuser debian --sshkeys ssh_keys.pub
# 模板化虚拟机
qm template 8000
至此虚拟机模板就创建完成。如果你不需要模板,你可以省去最后一部,就可以直接启动运行虚拟机了。
而如果你需要使用模板创建多台虚拟机,可如下操作:
qm clone 8000 301 --name dev1
qm clone 8000 302 --name dev2
qm clone 8000 303 --name dev3
qm clone 8000 304 --name dev4
启动虚拟机并进入串口字符控制台
qm start 101 && qm terminal 101
如果需要提前退出控制台,按下 Ctrl
+ O
即可。
下面是 ubuntu server 的例子:
# ubuntu
wget https://mirrors.ustc.edu.cn/ubuntu-cloud-images/jammy/current/jammy-server-cloudimg-amd64.img
# 替换镜像源
virt-customize -a jammy-server-cloudimg-amd64.img --run-command "sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/cloud/cloud.cfg"
virt-customize -a jammy-server-cloudimg-amd64.img --run-command "sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/cloud/cloud.cfg"
# 安装虚拟化客户机工具
virt-customize -a jammy-server-cloudimg-amd64.img --install qemu-guest-agent
# Proxmox VE 创建虚拟机,使用串口做为字符控制台
qm create 9000 --name "ubuntu-2004-cloudinit-template" --memory 16384 --cores 6 --cpu cputype=host,flags=+aes --net0 virtio,bridge=vmbr0 --ostype l26 --ide2 local-lvm:cloudinit --serial0 socket --vga serial0 --agent enabled=1
# 导入镜像为虚拟机的磁盘
qm importdisk 9000 jammy-server-cloudimg-amd64.img local-lvm
# 设置虚拟机磁盘控制器
qm set 9000 --scsihw virtio-scsi-pci
# 设置虚拟机磁盘
qm set 9000 --scsi0 local-lvm:vm-9000-disk-0
# 设置磁盘可启动
qm set 9000 --boot c --bootdisk scsi0
# 调整磁盘大小
qm resize 9000 scsi0 32G
# cloudinit 配置
qm set 9000 --ciupgrade 0 --ipconfig0 ip=dhcp --ciuser ubuntu --sshkeys ssh_keys.pub
# 模板化虚拟机
qm template 9000
甚至一些特殊功能的发行版和 bsd ,虽然没有专门的 cloudimage,也是可以用类似的方法安装的。
# OpenWrt
qm create 400 \
--name "openwrt" \
--cores 2 \
--memory 1024 \
--scsihw virtio-scsi-pci \
--cpu cputype=host,flags=+aes \
--net0 virtio,bridge=vmbr0,link_down=1 \
--net1 virtio,bridge=vmbr1,link_down=1 \
--ostype l26 \
--serial0 socket \
--vga serial0 \
--agent enabled=1
# 导入虚拟化存储池
wget https://archive.openwrt.org/releases/23.05.2/targets/x86/64/openwrt-23.05.2-x86-64-generic-ext4-combined.img.gz
gzip -d openwrt-23.05.2-x86-64-generic-ext4-combined.img.gz
qm importdisk 400 openwrt-23.05.2-x86-64-generic-ext4-combined.img local-lvm
# 设置虚拟机磁盘
qm set 400 --virtio0 local-lvm:vm-400-disk-0 --boot order=virtio0
# 启动虚拟机并进入串口控制台
qm start 400 && qm terminal 400
# 设置虚拟机从 0 号硬盘启动、随主机开启启动。
qm set 400 --boot order=virtio0 --onboot 1 --startup order=1,up=60
# iKuai
# 创建虚拟机
qm create 300 \
--name "ikuai" \
--cores 2 \
--memory 2048 \
--virtio0 local-lvm:1 \
--ide2 local:iso/iKuai8_x64_3.6.5_Build202206011520.iso,media=cdrom \
--boot order=virtio0,ide2 \
--scsihw virtio-scsi-pci \
--cpu cputype=host,flags=+aes \
--net0 virtio,bridge=vmbr0,link_down=1 \
--net1 virtio,bridge=vmbr0,link_down=1 \
--ostype l26 \
--serial0 socket \
--agent enabled=1
# 爱快安装器不支持控制台,去网页 noVNC 安装后关机
# 设置虚拟机从 0 号硬盘启动、随主机开启启动。
qm set 300 --boot order=virtio0 --onboot 1 --startup order=1,up=30 --vga serial0
# 启动虚拟机并进入串口控制台
qm start 300 && qm terminal 300
# OPNSense
# 创建虚拟机
qm create 300 \
--name "opnsense" \
--cores 2 \
--memory 1024 \
--scsihw virtio-scsi-pci \
--cpu cputype=host,flags=+aes \
--net0 virtio,bridge=vmbr0,link_down=1 \
--net1 virtio,bridge=vmbr1,link_down=1 \
--ostype other \
--serial0 socket \
--vga serial0 \
--agent enabled=1
# 导入虚拟化存储池
qm importdisk 300 OPNsense-22.1.2-OpenSSL-nano-amd64.img local-lvm
# 设置安装镜像为虚拟机第二块硬盘
qm set 300 --virtio0 local-lvm:vm-300-disk-0 --boot order=virtio0
# 启动虚拟机并进入串口控制台
qm start 300 && qm terminal 300
# 设置虚拟机从 0 号硬盘启动、随主机开启启动。
qm set 300 --boot order=virtio0 --onboot 1 --startup order=1,up=60
#pfSense
# 创建虚拟机
qm create 200 \
--name "pfsense" \
--cores 2 \
--memory 1024 \
--virtio0 local-lvm:8 \
--scsihw virtio-scsi-pci \
--cpu cputype=host,flags=+aes \
--net0 virtio,bridge=vmbr0,link_down=1 \
--net1 virtio,bridge=vmbr1,link_down=1 \
--ostype other \
--serial0 socket \
--vga serial0 \
--agent enabled=1
# 下载解压安装镜像
wget https://atxfiles.netgate.com/mirror/downloads/pfSense-CE-memstick-serial-2.7.2-RELEASE-amd64.img.gz
gzip -d pfSense-CE-memstick-serial-2.7.2-RELEASE-amd64.img.gz
# 导入虚拟化存储池
qm importdisk 200 pfSense-CE-memstick-serial-2.7.2-RELEASE-amd64.img local-lvm
# 设置安装镜像为虚拟机第二块硬盘
qm set 200 --virtio1 local-lvm:vm-200-disk-1 --boot order=virtio1
# 启动虚拟机并进入串口控制台
qm start 200 && qm terminal 200
# 选择 xterm 终端,把 8G 的 0 号硬盘格为 mbr ufs 安装。
# 安装完成后选择留在终端,然后手动关机。
# 设置虚拟机从 0 号硬盘启动、随主机开启启动。
qm set 200 --boot order=virtio0 --onboot 1 --startup order=1,up=60
如果你使用的不是 Proxmox VE,例如 Esxi、Vmware Workstation、Hyper-V、VirtualBox 等,你只需手动创建无硬盘的虚拟机,再将这些镜像转换为对应虚拟化平台的硬盘镜像格式即可,例如 vmdk、vhd、vdi 等。将这些硬盘镜像导入虚拟机,即可使用。