Featured image of post pve安装Linux云镜像

pve安装Linux云镜像

之前安装虚拟机用的都是物理机镜像,体积大,占用内存高,逛debian官网发现了这个专为虚拟平台创建的 cloud image,果断搭配kvm pve一起食用

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,常见的还有 win10win11
  • --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 设置的有备份任务,想要跳过数据盘,可以设置为 0

    • format=qcow2 声明导入的磁盘格式为 qcow2

    • import-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.comexample.net,并且在浏览器中输入了 www,计算机会依次尝试解析 www.example.comwww.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"
}