Linux cloud image相比一般的image,去掉了物理硬件的驱动,缩减了体积,同时对虚拟机环境进行了一定程度的优化,更适合虚拟平台安装,本文将会以 debian 为教程在pve 中一步步进行安装。
一步步来
下载云镜像
wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2
链接会自动选择附近的镜像站下载,直接使用即可
导入并创建虚拟机
qm create 1113 \
--name d12-gen \
--ostype l26 \
--scsihw virtio-scsi-single \
--autostart 1 \
--onboot 1
qm create 112
创建一个 id 为 112 的虚拟机name debian12
将虚拟机命名为debian12
--ostype l26
根据不同系统选择,如 linux 较新的系统,内核版本高于 2.6 的选择l26
,常见的还有win10
,win11
--scsihw virtio-scsi-single
设置 scsi 控制器,选择virtio-scsi-single
设置同时启用 IO thread,可以获得更好的性能--autostart 1
崩溃后自动重启,0 关闭,1 开启--onboot 1
宿主机开机自动启动虚拟机,0 关闭,1 开启
设置主板
qm set 1113 \
--machine q35 \
--cpu x86-64-v2-AES \
--sockets 1 --cores 4 \
--machine q35
设置虚拟主板,有i440fx
和比较新的q35
,因为q35
提供虚拟PCIe
总线,所以如果想要直通PCIe
硬件,可以选择后者
设置 CPU
qm set 1113 \
--cpu x86-64-v2-AES \
--sockets 1 --cores 4 \
--cpu x86-64-v4
设置虚拟机的 cpu 为x86-64-v4
,这是pve8
新更新的一个功能,在保证兼容性的同时提供了更高的性能释放。同时还有其他选项:kvm64
更好的兼容性比较差的性能,如果集群或者未来会换其他设备,可以选择kvm64
x86-64-v2-aes
这是 pve 8 版本 web 端默认的一个选项,兼容Intel Westmere
架构以及AMD Opteron_G4
架构以后的处理器x86-64-v3
兼容Intel Broadwell
架构以及AMD EPYC
架构以后的处理器,cpu 指令相比较x86-64-v2-aes
添加了+avx
、+avx2
、+bmi1
、+bmi2
、+f16c
、+fma
、+movbe
、+xsave
x86-64-v4
兼容Intel Skylake
架构以及AMD EPYC v4 Genoa
架构以后的处理器,相比较x86-64-v3
添加了+avx512f
、+avx 512 bw、+avx512cd
、+avx512dq
、+avx512vl
指令host
提供了最强的性能最差的兼容性,如果集群的机器为同一 cpu 型号,或者后续不考虑迁移虚拟机,可以宣传该选项 在选择类型时,应当尽量让虚拟机 cpu 和宿主机 cpu 互相匹配,这样虚拟机和宿主机的 cpu 会有相同的 cpu 指令,如我目前宿主机 cpu 架构为Skylake lake
,高于x86-64-v4
兼容的skylake
架构,所以选择x86-64-v4
如果在Westmere
架构上的机器上启动x86-64-v4
的虚拟机,会因为缺少指令无法启动
--sockets 1 --cores 4
指定虚拟机 1 个 cpu 插槽,4 个核心。这里可以超过宿主机的总核心数,在多线程应用上会有一些性能增强
设置内存
qm set 1113 \
--balloon 2048 \
--memory 8192 \
--memory 8192
单位是 MiB,这里设置内存为 8 GiB--balloon 2048
设置动态内存,单位为 MiB,前面设置总内存 8 G 为最大内存,这里设置的是最小内存,会随着虚拟机的使用而不断调整。2010 年后的 Linux 都默认装了该驱动,但 Win 系统需要手动安装 balloon 驱动,且可能会导致性能降低,所以不建议 Win 开启 balloon
设置网络
qm set 1113 \
--net0 virtio,firewall=1,bridge=vmbr0
--net0 virtio,firewall=1,bridge=vmbr0
设置网卡为 virtio,virtio 具备较高的性能。Firewall=1 开启防火墙,bridge=vmbr 0 表明网络桥接自宿主机默认的 vmbr 0
设置磁盘
qm set 1113 \
--scsi0 local:0,discard=on,ssd=1,iothread=1,backup=1,format=qcow2,import-from=./debian-12-generic-amd64.qcow2
qm disk resize 1113 scsi0 8G
--scsi0
指定 scsi 控制器上的第一个磁盘local:0
使用本地存储设备文件作为磁盘驱动器,也可以新建一个磁盘local:vm-112-disk-1,size=32G
,这里创建了一个名为vm-112-disk-1
,大小 32 GiB 的磁盘discard=on
开启磁盘丢弃功能,需要 Linux 内核版本大于 5.0,有些系统还需要开启 ssd 仿真ssd=1
将磁盘驱动器设置为固态而不是机械硬盘,即使使用的是机械硬盘也能使用,据说在 ssd 上开启性能会增强(未实践iothread=1
和 VirtIO 搭配可以减少 I/O 密集型虚拟机的延迟backup=1
是否跳过备份,0 为跳过,如果 pve 设置的有备份任务,想要跳过数据盘,可以设置为 0format=qcow2
声明导入的磁盘格式为 qcow2import-from=./debian-12-generic-amd64.qcow2
从当前目录下导入,文件名可以看出来这是 debian 的通用云镜像- 通用云镜像删除了物理机上使用的软件缩减了体积,同时对虚拟机环境进行了优化
将
scsi0
磁盘由默认的 2 GiB 修改为 8 GiB,默认单位为 byte- 注意磁盘只能扩大,而不能缩小,需要适当调整磁盘大小
- 也可以使用
+8G
在原有基础上增加 8G 存储
设置 UEFI 或 BIOS
qm set 1113 \
--bios ovmf \
--efidisk0 local:1,format=qcow2,efitype=4m,pre-enrolled-keys=1 \
--boot order=scsi0
--bios ovmf
虚拟 bios 设置,有 seabios 和 ovmf 选项,分别为虚拟 BIOS 和虚拟 UEFI,如果想要实现 PCIe 直通或者是强制使用 UEFI 的系统,如 WIN 11,需要使用 ovmf- 如果使用 UEFI,因为需要保持启动顺序信息,所以需要一个 EFI 磁盘
- 这里
efidisk0
是指定了一个 EFI 磁盘,local:1
表示使用本地存储器,format=qcow2
表示使用 qcow 2 格式,efitype=4m
表示 EFI 磁盘大小为 4 MB,pre-enrolled-keys=1
表示预先安装了密钥 --boot order=scsi0
指定虚拟机的启动顺序从scsi0
开始
使用 cloudinit 并修改虚拟机
qm set 1113 \
--scsi1 local:cloudinit,media=cdrom \
--ipconfig0 ip=dhcp,ip6=dhcp \
--ciupgrade 1 \
--ciuser user \
--cipassword passwd \
--sshkeys ./user.sshkey
--scsi1 local:cloudinit,media=cdrom
创建 cloudinit 用于初始化虚拟机,需要系统支持才能使用--ipconfig0 ip=dhcp,ip6=dhcp
设置 ip 和网关,这里 ipv 4 和 ipv 6 都为 dhcp 自动分配--ciupgrade
是否在系统启动时自动进行包的更新--ciuser
创建默认用户--cipassword
创建密码--sshkeys
public SSH keys 填写,后跟文件名,每行一个 key,格式为 OpenSSH Cloudinit 的其他选项--nameserver
是指 DNS 服务器的 IP 地址,用于将域名解析为 IP 地址。当你在浏览器中输入一个网址时,计算机会向 DNS 服务器发送请求,以获取该网址对应的 IP 地址。如果 DNS 服务器无法解析该域名,它会向其他 DNS 服务器发送请求,直到找到该域名对应的 IP 地址为止。默认使用宿主机设置--searchdomain
是指在域名解析失败时,计算机会自动在search domain
列表中的域名后面添加后缀,然后再次进行域名解析。例如,如果你在search domain
列表中添加了example.com
和example.net
,并且在浏览器中输入了www
,计算机会依次尝试解析www.example.com
和www.example.net
。默认使用的是宿主机设置
支持 QEMU Guest Agent
qm set 1113 --agent enabled=1
QEMU Guest Agent
可以更好的让宿主机和虚拟机进行通信,需要虚拟机安装对应的软件
制作成模板
qm template 1113
制作为模板可以实现快速部署相同配置的多个虚拟机
一步到位
在上面的步骤中,首先使用 qm create
创建了一个基础的虚拟机,然后使用 qm set
修改并完善其中的设置
当然也可以在一步到位,如下是对以上代码的集合:
wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2
qm create 1113 \
--name debian12 \
--ostype l26 \
--scsihw virtio-scsi-single \
--autostart 1 \
--onboot 1 \
--machine q35 \
--cpu x86-64-v2-AES \
--sockets 1 --cores 4 \
--balloon 1048 \
--memory 8192 \
--net0 virtio,firewall=1,bridge=vmbr0 \
--scsi0 local:0,discard=on,ssd=1,iothread=1,backup=1,format=qcow2,import-from=/root/debian-12-genericcloud-amd64.qcow2 \
--bios ovmf \
--efidisk0 local:1,format=qcow2,efitype=4m,pre-enrolled-keys=1 \
--boot order=scsi0 \
--scsi1 local:cloudinit,media=cdrom \
--ipconfig0 ip=dhcp,ip6=dhcp \
--ciupgrade 1 \
--ciuser user \
--cipassword passwd \
--sshkeys ./user.sshkey \
--agent enabled=1
qm disk resize 1113 scsi0 8G
qm template 1113
需要根据自己的实际用户环境进行调整
上述完成了 debian cloud 包的下载、创建、设置用户名和密码、开启 qemu guest agent 功能、调整磁盘大小、转换为模板功能
注意:如果不使用 qemu guest agent 增强通信,需要把此选项注释掉,否则在 web 端进行虚拟机的关闭重启功能时 pve 会无法正常工作
一步之遥
从模板克隆虚拟机
前面提到 QEMU Guest Agent
的运行需要虚拟机内安装对于的软件,本次安装使用的是 Debian,所以我们使用模板创建一个虚拟机,可以在 WEB 端进行操作,也可以使用如下命令:
qm clone 1113 1114 --name debian12-vm --full 1
qm set 1114 --ipconfig0 ip=192.168.0.214/24,gw=192.168.0.212,ip6=dhcp
qm start 1114
- 首先从模板 1113 克隆出 1114 名为
debian12-01
的虚拟机 --full 1
表示此次克隆虚拟机操作为完整克隆,否则为链接克隆,前者会复制模板内的所以数据到新的磁盘,不会依赖模板,会占用更大的磁盘空间。后者会在新克隆的虚拟机共用模板磁盘的数据,新建虚拟机产生的数据会存在新的位置,好处是减少了体积,坏处是和模板产生了依赖关系,在未来迁移中可能会造成困扰qm set
将 1114 虚拟机ipv4
地址改为静态方便远程连接qm start
启动新创建的虚拟机
连接虚拟机
可以在 web 端操作,这里使用前面设置的 ssh 连接:
虚拟机安装 QEMU Guest Agent
sudo apt update
sudo apt install qemu-guest-agent
sudo reboot
宿主机检查虚拟机的 QEMU Guest Agent 信息
qm agent 1114 get-osinfo
可以看到如下输出:
{
"id" : "debian",
"kernel-release" : "6.1.0-18-cloud-amd64",
"kernel-version" : "#1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01)",
"machine" : "x86_64",
"name" : "Debian GNU/Linux",
"pretty-name" : "Debian GNU/Linux 12 (bookworm)",
"version" : "12 (bookworm)",
"version-id" : "12"
}