NAME

qm - QEMU/KVM 虚拟机管理器

SYNOPSIS

qm <COMMAND> [ARGS] [OPTIONS]

qm agent

qm guest cmd 的别名。

qm cleanup <vmid> <clean-shutdown> <guest-requested>

清理 tap 设备、vgpu 等资源。在虚拟机关机、崩溃等情况后调用。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<clean-shutdown>: <boolean>

表示 qemu 是否正常关机。

<guest-requested>: <boolean>

表示关机是由客户机请求,还是通过 qmp 请求。

qm clone <vmid> <newid> [OPTIONS]

创建虚拟机/模板的副本。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<newid>: <integer> (100 - 999999999)

克隆的 VMID。

--bwlimit <integer> (0 - N) (default = clone limit from datacenter or storage config)

覆盖 I/O 带宽限制(单位 KiB/s)。

--description <string>

新虚拟机的描述。

--format <qcow2 | raw | vmdk>

文件存储的目标格式。仅对完整克隆有效。

--full <boolean>

创建所有磁盘的完整副本。克隆普通虚拟机时总是执行此操作。对于虚拟机模板,默认会尝试创建链接克隆。

--name <string>

设置新虚拟机的名称。

--pool <string>

将新虚拟机添加到指定资源池。

--snapname <string>

快照名称。

--storage <storage ID>

完整克隆的目标存储。

--target <string>

目标节点。仅当原虚拟机位于共享存储上时允许。

qm cloudinit dump <vmid> <type>

获取自动生成的 cloudinit 配置。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<type>: <meta | network | user>

配置类型。

qm cloudinit pending <vmid>

获取包含当前值和待应用值的 cloudinit 配置。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

qm cloudinit update <vmid>

重新生成并更改 cloudinit 配置驱动器。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

qm config <vmid> [OPTIONS]

获取已应用待处理配置更改后的虚拟机配置。设置 current 参数可改为获取当前配置。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--current <boolean> (default = 0)

获取当前值(而不是待应用值)。

--snapshot <string>

从给定快照获取配置值。

qm create <vmid> [OPTIONS]

创建或还原虚拟机。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--gicversion: <2 | 3 | 4 | max | host > (default = host)

设置 ARM 虚拟机的 gicversion。

--virtualization: <boolean> (default = 0)

为 arm64 虚拟机启用嵌套虚拟化。

--snapshot=<boolean>

控制 qemu 的快照模式功能。启用后,对磁盘所做的更改是临时的,并会在虚拟机关机时丢弃。

--pxvditemplate <boolean> (default = 0)

启用/禁用 PXVDI Template。

--acpi <boolean> (default = 1)

启用/禁用 ACPI。

--affinity <string>

用于执行客户机进程的主机核心列表,例如:0,5,8-11

--agent [enabled=]<1|0> [,freeze-fs-on-backup=<1|0>] [,fstrim_cloned_disks=<1|0>] [,type=<virtio|isa>]

启用/禁用与 QEMU Guest Agent 及其属性的通信。

--amd-sev [type=]<sev-type> [,allow-smt=<1|0>] [,kernel-hashes=<1|0>] [,no-debug=<1|0>] [,no-key-sharing=<1|0>]

AMD CPU 提供的 Secure Encrypted Virtualization(SEV)功能。

--arch <aarch64 | x86_64 | riscv64 | loongarch64>

虚拟处理器架构。默认为主机架构。

--archive <string>

备份归档。可以是 .tar 或 .vma 文件的文件系统路径(使用 - 从 stdin 管道传入数据),也可以是 proxmox 存储备份卷标识符。

--args <string>

传递给 kvm 的任意参数。

--audio0 device=<ich9-intel-hda|intel-hda|AC97> [,driver=<spice|none>]

配置音频设备,与 QXL/Spice 结合使用时很有用。

--autostart <boolean> (default = 0)

崩溃后自动重启(当前会被忽略)。

--balloon <integer> (0 - N)

虚拟机目标 RAM 容量,单位 MiB。使用 0 会禁用 balloon 驱动。

--bios <ovmf | seabios> (default = seabios)

选择 BIOS 实现。

--boot [[legacy=]<[acdn]{1,4}>] [,order=<device[;device...]>]

指定客户机启动顺序。请使用 order= 子属性;不带键或使用 legacy= 的用法已弃用。

--bootdisk (ide|sata|scsi|virtio)\d+

启用从指定磁盘启动。已弃用:请改用 boot: order=foo;bar

--bwlimit <integer> (0 - N) (default = restore limit from datacenter or storage config)

覆盖 I/O 带宽限制(单位 KiB/s)。

--cdrom <volume>

这是选项 -ide2 的别名。

--cicustom [meta=<volume>] [,network=<volume>] [,user=<volume>] [,vendor=<volume>]

cloud-init:指定自定义文件,以替换启动时自动生成的文件。

--cipassword <password>

cloud-init:要分配给用户的密码。通常不建议使用此项,请改用 ssh 密钥。另请注意,较旧版本的 cloud-init 不支持哈希密码。

--citype <configdrive2 | nocloud | opennebula>

指定 cloud-init 配置格式。默认值取决于配置的操作系统类型(ostype)。Linux 使用 nocloud 格式,windows 使用 configdrive2

--ciupgrade <boolean> (default = 1)

cloud-init:首次启动后自动执行软件包升级。

--ciuser <string>

cloud-init:要更改 ssh 密钥和密码的用户名,用于替代镜像中配置的默认用户。

--cores <integer> (1 - N) (default = 1)

每个 socket 的核心数。

--cpu [[cputype=]<string>] [,flags=<+FLAG[;-FLAG...]>] [,hidden=<1|0>] [,hv-vendor-id=<vendor-id>] [,phys-bits=<8-64|host>] [,reported-model=<enum>]

模拟的 CPU 类型。

--cpulimit <number> (0 - 128) (default = 0)

CPU 使用限制。

--cpuunits <integer> (1 - 262144) (default = cgroup v1: 1024, cgroup v2: 100)

虚拟机的 CPU 权重,在 cgroup v2 中会限制到 [1, 10000] 范围内。

--description <string>

虚拟机描述。显示在 Web 界面的虚拟机摘要中,并作为注释保存到配置文件内。

--efidisk0 [file=]<volume> [,efitype=<2m|4m>] [,format=<enum>] [,import-from=<source volume>] [,pre-enrolled-keys=<1|0>] [,size=<DiskSize>]

配置用于存储 EFI 变量的磁盘。使用特殊语法 STORAGE_ID:SIZE_IN_GiB 分配新卷。注意,此处会忽略 SIZE_IN_GiB,并会将默认 EFI 变量复制到该卷中。使用 STORAGE_ID:0 和 import-from 参数可从现有卷导入。

--force <boolean>

允许覆盖现有虚拟机。

Note 需要选项:archive
--freeze <boolean>

启动时冻结 CPU(使用 c monitor 命令开始执行)。

--hookscript <string>

将在虚拟机生命周期的各个步骤中执行的脚本。

--hostpci[n] [[host=]<HOSTPCIID[;HOSTPCIID2...]>] [,device-id=<hex id>] [,legacy-igd=<1|0>] [,mapping=<mapping-id>] [,mdev=<string>] [,pcie=<1|0>] [,rombar=<1|0>] [,romfile=<string>] [,sub-device-id=<hex id>] [,sub-vendor-id=<hex id>] [,vendor-id=<hex id>] [,x-vga=<1|0>] [,ramfb=<1|0>]

将主机 PCI 设备映射到客户机。

--hotplug <string> (default = network,disk,usb)

选择性启用热插拔功能。这是一个逗号分隔的热插拔功能列表:networkdiskcpumemoryusbcloudinit。使用 0 可完全禁用热插拔。使用 1 作为值是默认值 network,disk,usb 的别名。对于 machine version >= 7.1 且 ostype 为 l26 或 windows > 7 的客户机,可以使用 USB 热插拔。

--hugepages <1024 | 2 | any>

启用/禁用 hugepages 内存。

--ide[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,cyls=<integer>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,heads=<integer>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,model=<model>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,secs=<integer>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,trans=<none|lba|auto>] [,werror=<enum>] [,wwn=<wwn>]

将卷用作 IDE 硬盘或 CD-ROM(n 为 0 到 3)。使用特殊语法 STORAGE_ID:SIZE_IN_GiB 分配新卷。使用 STORAGE_ID:0 和 import-from 参数可从现有卷导入。

--import-working-storage <storage ID>

启用了 images 内容类型的基于文件的存储,在导入期间用作中间解压存储。默认为源存储。

--ipconfig[n] [gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,ip=<IPv4Format/CIDR>] [,ip6=<IPv6Format/CIDR>]

cloud-init:指定对应接口的 IP 地址和网关。

IP 地址使用 CIDR 表示法;网关是可选项,但需要指定同类型 IP。

IP 地址可以使用特殊字符串 dhcp 以使用 DHCP,此时不应显式提供网关。 对于 IPv6,可以使用特殊字符串 auto 以使用无状态自动配置。这需要 cloud-init 19.4 或更新版本。

如果启用了 cloud-init 且既未指定 IPv4 地址也未指定 IPv6 地址,则默认在 IPv4 上使用 dhcp。

--ivshmem size=<integer> [,name=<string>]

虚拟机间共享内存。适用于虚拟机之间或虚拟机与主机之间的直接通信。

--keephugepages <boolean> (default = 0)

与 hugepages 一起使用。启用后,虚拟机关机后 hugepages 不会被删除,可用于后续启动。

--keyboard <da | de | de-ch | en-gb | en-us | es | fi | fr | fr-be | fr-ca | fr-ch | hu | is | it | ja | lt | mk | nl | no | pl | pt | pt-br | sl | sv | tr>

VNC 服务器的键盘布局。通常不需要此选项,且往往更适合在客户机 OS 内处理。

--kvm <boolean> (default = 1)

启用/禁用 KVM 硬件虚拟化。

--live-restore <boolean>

在后台导入或还原期间立即启动虚拟机。

--localtime <boolean>

将实时时钟(RTC)设置为本地时间。如果 ostype 表示 Microsoft Windows OS,则默认启用。

--lock <backup | clone | create | migrate | rollback | snapshot | snapshot-delete | suspended | suspending>

锁定/解锁虚拟机。

--machine [[type=]<machine type>] [,enable-s3=<1|0>] [,enable-s4=<1|0>] [,viommu=<intel|virtio>]

指定 QEMU machine。

--memory [current=]<integer>

内存属性。

--migrate_downtime <number> (0 - N) (default = 0.1)

设置迁移可容忍的最大停机时间(秒)。如果迁移在最后阶段因需要传输太多新脏 RAM 而无法收敛,该限制会自动逐步增加,直到迁移可以收敛。

--migrate_speed <integer> (0 - N) (default = 0)

设置迁移最大速度(MB/s)。值为 0 表示无限制。

--name <string>

设置虚拟机名称。仅用于配置 Web 界面。

--nameserver <string>

cloud-init:设置容器的 DNS 服务器 IP 地址。如果既未设置 searchdomain 也未设置 nameserver,创建时会自动使用主机上的设置。

--net[n] [model=]<enum> [,bridge=<bridge>] [,firewall=<1|0>] [,link_down=<1|0>] [,macaddr=<XX:XX:XX:XX:XX:XX>] [,mtu=<integer>] [,queues=<integer>] [,rate=<number>] [,tag=<integer>] [,trunks=<vlanid[;vlanid...]>] [,<model>=<macaddr>]

指定网络设备。

--numa <boolean> (default = 0)

启用/禁用 NUMA。

--numa[n] cpus=<id[-id];...> [,hostnodes=<id[-id];...>] [,memory=<number>] [,policy=<preferred|bind|interleave>]

NUMA 拓扑。

--onboot <boolean> (default = 0)

指定虚拟机是否在系统启动期间启动。

--ostype <l24 | l26 | other | solaris | w2k | w2k3 | w2k8 | win10 | win11 | win7 | win8 | wvista | wxp>

指定客户机操作系统。

--parallel[n] /dev/parport\d+|/dev/usb/lp\d+

映射主机并口设备(n 为 0 到 2)。

--pool <string>

将虚拟机添加到指定资源池。

--protection <boolean> (default = 0)

设置虚拟机的保护标志。这会禁用删除虚拟机和删除磁盘操作。

--reboot <boolean> (default = 1)

允许重启。如果设置为 0,虚拟机会在重启时退出。

--rng0 [source=]</dev/urandom|/dev/random|/dev/hwrng> [,max_bytes=<integer>] [,period=<integer>]

配置基于 VirtIO 的随机数生成器。

--sata[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,cyls=<integer>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,heads=<integer>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,secs=<integer>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,trans=<none|lba|auto>] [,werror=<enum>] [,wwn=<wwn>]

将卷用作 SATA 硬盘或 CD-ROM(n 为 0 到 5)。使用特殊语法 STORAGE_ID:SIZE_IN_GiB 分配新卷。使用 STORAGE_ID:0 和 import-from 参数可从现有卷导入。

--nvme[n] [file=]<volume> [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,format=<enum>] [,heads=<integer>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,secs=<integer>] [,serial=<serial>] [,size=<DiskSize>] [,snapshot=<1|0>]

将卷用作 NVME 硬盘或 CD-ROM(n 为 0 到 5)。使用特殊语法 STORAGE_ID:SIZE_IN_GiB 分配新卷。使用 STORAGE_ID:0 和 import-from 参数可从现有卷导入。

--scsi[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,cyls=<integer>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,heads=<integer>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,iothread=<1|0>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,product=<product>] [,queues=<integer>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,ro=<1|0>] [,scsiblock=<1|0>] [,secs=<integer>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,trans=<none|lba|auto>] [,vendor=<vendor>] [,werror=<enum>] [,wwn=<wwn>]

将卷用作 SCSI 硬盘或 CD-ROM(n 为 0 到 30)。使用特殊语法 STORAGE_ID:SIZE_IN_GiB 分配新卷。使用 STORAGE_ID:0 和 import-from 参数可从现有卷导入。

--scsihw <lsi | lsi53c810 | megasas | pvscsi | virtio-scsi-pci | virtio-scsi-single> (default = lsi)

SCSI 控制器型号。

--searchdomain <string>

cloud-init:设置容器的 DNS 搜索域。如果既未设置 searchdomain 也未设置 nameserver,创建时会自动使用主机上的设置。

--serial[n] (/dev/.+|socket)

在虚拟机内部创建串口设备(n 为 0 到 3)。

--shares <integer> (0 - 50000) (default = 1000)

自动 ballooning 的内存 share 数量。数值越大,该虚拟机获得的内存越多。该数值相对于所有其他运行中虚拟机的权重。使用 0 会禁用自动 ballooning。自动 ballooning 由 pvestatd 执行。

--smbios1 [base64=<1|0>] [,family=<Base64 encoded string>] [,manufacturer=<Base64 encoded string>] [,product=<Base64 encoded string>] [,serial=<Base64 encoded string>] [,sku=<Base64 encoded string>] [,uuid=<UUID>] [,version=<Base64 encoded string>]

指定 SMBIOS type 1 字段。

--smp <integer> (1 - N) (default = 1)

CPU 数量。请改用选项 -sockets。

--sockets <integer> (1 - N) (default = 1)

CPU socket 数量。

--spice_enhancements [foldersharing=<1|0>] [,videostreaming=<off|all|filter>]

配置 SPICE 的其他增强功能。

--sshkeys <filepath>

cloud-init:设置公共 SSH 密钥(每行一个密钥,OpenSSH 格式)。

--start <boolean> (default = 0)

虚拟机成功创建后启动。

--startdate (now | YYYY-MM-DD | YYYY-MM-DDTHH:MM:SS) (default = now)

设置实时时钟的初始日期。有效日期格式为:now2006-06-17T16:01:212006-06-17

--startup `[[order=]\d+] [,up=\d+] [,down=\d+] `

启动和关机行为。Order 是定义通用启动顺序的非负数。关机按相反顺序完成。此外,可以设置 updown 延迟(秒),用于指定启动或停止下一台虚拟机之前等待的延迟。

--storage <storage ID>

默认存储。

--tablet <boolean> (default = 1)

启用/禁用 USB tablet 设备。

--tags <string>

虚拟机标签。该信息仅为元信息。

--tdf <boolean> (default = 0)

启用/禁用时间漂移修复。

--template <boolean> (default = 0)

启用/禁用 Template。

--tpmstate0 [file=]<volume> [,import-from=<source volume>] [,size=<DiskSize>] [,version=<v1.2|v2.0>]

配置用于存储 TPM 状态的磁盘。格式固定为 raw。使用特殊语法 STORAGE_ID:SIZE_IN_GiB 分配新卷。注意,此处会忽略 SIZE_IN_GiB,并改用 4 MiB。使用 STORAGE_ID:0 和 import-from 参数可从现有卷导入。

--unique <boolean>

分配唯一的随机以太网地址。

Note 需要选项:archive
--unused[n] [file=]<volume>

对未使用卷的引用。该项供内部使用,不应手动修改。

--usb[n] [[host=]<HOSTUSBDEVICE|spice>] [,mapping=<mapping-id>] [,usb3=<1|0>]

配置 USB 设备(n 为 0 到 4;对于 machine version >= 7.1 且 ostype 为 l26 或 windows > 7 的客户机,n 可达 14)。

--vcpus <integer> (1 - N) (default = 0)

热插拔 vcpu 数量。

--vga [[type=]<enum>] [,clipboard=<vnc>] [,memory=<integer>]

配置 VGA 硬件。

--virtio[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,cyls=<integer>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,heads=<integer>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,iothread=<1|0>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,ro=<1|0>] [,secs=<integer>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,trans=<none|lba|auto>] [,werror=<enum>]

将卷用作 VIRTIO 硬盘(n 为 0 到 15)。使用特殊语法 STORAGE_ID:SIZE_IN_GiB 分配新卷。使用 STORAGE_ID:0 和 import-from 参数可从现有卷导入。

--virtiofs[n] [dirid=]<mapping-id> [,cache=<enum>] [,direct-io=<1|0>] [,expose-acl=<1|0>] [,expose-xattr=<1|0>]

使用 Virtio-fs 在主机和客户机之间共享目录的配置。

--vmgenid <UUID> (default = 1 (autogenerated))

设置 VM Generation ID。使用 1 可在创建或更新时自动生成,传入 0 可显式禁用。

--vmstatestorage <storage ID>

VM 状态卷/文件的默认存储。

--watchdog [[model=]<i6300esb|ib700>] [,action=<enum>]

创建虚拟硬件 watchdog 设备。

qm delsnapshot <vmid> <snapname> [OPTIONS]

删除虚拟机快照。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<snapname>: <string>

快照名称。

--force <boolean>

即使删除磁盘快照失败,也从配置文件中移除。

qm destroy <vmid> [OPTIONS]

销毁虚拟机以及所有已使用/归属的卷。移除所有虚拟机专用权限和防火墙规则。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--destroy-unreferenced-disks <boolean> (default = 0)

如果设置,还会从所有已启用存储中销毁未被配置引用但 VMID 匹配的所有磁盘。

--purge <boolean>

从备份、复制作业和 HA 等配置中移除 VMID。

--skiplock <boolean>

忽略锁,只有 root 允许使用此选项。

qm disk import <vmid> <source> <storage> [OPTIONS]

将外部磁盘镜像作为虚拟机中的未使用磁盘导入。镜像格式必须受 qemu-img(1) 支持。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<source>: <string>

要导入的磁盘镜像路径。

<storage>: <storage ID>

目标存储 ID。

--format <qcow2 | raw | vmdk>

目标格式。

--target-disk <efidisk0 | ide0 | ide1 | ide2 | ide3 | nvme0 |nvme1 |nvme2 |nvme3 |nvme4 |nvme5 |sata0 | sata1 | sata2 | sata3 | sata4 | sata5 | scsi0 | scsi1 | scsi10 | scsi11 | scsi12 | scsi13 | scsi14 | scsi15 | scsi16 | scsi17 | scsi18 | scsi19 | scsi2 | scsi20 | scsi21 | scsi22 | scsi23 | scsi24 | scsi25 | scsi26 | scsi27 | scsi28 | scsi29 | scsi3 | scsi30 | scsi4 | scsi5 | scsi6 | scsi7 | scsi8 | scsi9 | tpmstate0 | unused0 | unused1 | unused10 | unused100 | unused101 | unused102 | unused103 | unused104 | unused105 | unused106 | unused107 | unused108 | unused109 | unused11 | unused110 | unused111 | unused112 | unused113 | unused114 | unused115 | unused116 | unused117 | unused118 | unused119 | unused12 | unused120 | unused121 | unused122 | unused123 | unused124 | unused125 | unused126 | unused127 | unused128 | unused129 | unused13 | unused130 | unused131 | unused132 | unused133 | unused134 | unused135 | unused136 | unused137 | unused138 | unused139 | unused14 | unused140 | unused141 | unused142 | unused143 | unused144 | unused145 | unused146 | unused147 | unused148 | unused149 | unused15 | unused150 | unused151 | unused152 | unused153 | unused154 | unused155 | unused156 | unused157 | unused158 | unused159 | unused16 | unused160 | unused161 | unused162 | unused163 | unused164 | unused165 | unused166 | unused167 | unused168 | unused169 | unused17 | unused170 | unused171 | unused172 | unused173 | unused174 | unused175 | unused176 | unused177 | unused178 | unused179 | unused18 | unused180 | unused181 | unused182 | unused183 | unused184 | unused185 | unused186 | unused187 | unused188 | unused189 | unused19 | unused190 | unused191 | unused192 | unused193 | unused194 | unused195 | unused196 | unused197 | unused198 | unused199 | unused2 | unused20 | unused200 | unused201 | unused202 | unused203 | unused204 | unused205 | unused206 | unused207 | unused208 | unused209 | unused21 | unused210 | unused211 | unused212 | unused213 | unused214 | unused215 | unused216 | unused217 | unused218 | unused219 | unused22 | unused220 | unused221 | unused222 | unused223 | unused224 | unused225 | unused226 | unused227 | unused228 | unused229 | unused23 | unused230 | unused231 | unused232 | unused233 | unused234 | unused235 | unused236 | unused237 | unused238 | unused239 | unused24 | unused240 | unused241 | unused242 | unused243 | unused244 | unused245 | unused246 | unused247 | unused248 | unused249 | unused25 | unused250 | unused251 | unused252 | unused253 | unused254 | unused255 | unused26 | unused27 | unused28 | unused29 | unused3 | unused30 | unused31 | unused32 | unused33 | unused34 | unused35 | unused36 | unused37 | unused38 | unused39 | unused4 | unused40 | unused41 | unused42 | unused43 | unused44 | unused45 | unused46 | unused47 | unused48 | unused49 | unused5 | unused50 | unused51 | unused52 | unused53 | unused54 | unused55 | unused56 | unused57 | unused58 | unused59 | unused6 | unused60 | unused61 | unused62 | unused63 | unused64 | unused65 | unused66 | unused67 | unused68 | unused69 | unused7 | unused70 | unused71 | unused72 | unused73 | unused74 | unused75 | unused76 | unused77 | unused78 | unused79 | unused8 | unused80 | unused81 | unused82 | unused83 | unused84 | unused85 | unused86 | unused87 | unused88 | unused89 | unused9 | unused90 | unused91 | unused92 | unused93 | unused94 | unused95 | unused96 | unused97 | unused98 | unused99 | virtio0 | virtio1 | virtio10 | virtio11 | virtio12 | virtio13 | virtio14 | virtio15 | virtio2 | virtio3 | virtio4 | virtio5 | virtio6 | virtio7 | virtio8 | virtio9>

卷将导入到的磁盘名称(例如 scsi1)。

qm disk move <vmid> <disk> [<storage>] [OPTIONS]

将卷移动到其他存储或其他虚拟机。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<disk>: <efidisk0 | ide0 | ide1 | ide2 | ide3 | nvme0 |nvme1 |nvme2 |nvme3 |nvme4 |nvme5 |sata0 | sata1 | sata2 | sata3 | sata4 | sata5 | scsi0 | scsi1 | scsi10 | scsi11 | scsi12 | scsi13 | scsi14 | scsi15 | scsi16 | scsi17 | scsi18 | scsi19 | scsi2 | scsi20 | scsi21 | scsi22 | scsi23 | scsi24 | scsi25 | scsi26 | scsi27 | scsi28 | scsi29 | scsi3 | scsi30 | scsi4 | scsi5 | scsi6 | scsi7 | scsi8 | scsi9 | tpmstate0 | unused0 | unused1 | unused10 | unused100 | unused101 | unused102 | unused103 | unused104 | unused105 | unused106 | unused107 | unused108 | unused109 | unused11 | unused110 | unused111 | unused112 | unused113 | unused114 | unused115 | unused116 | unused117 | unused118 | unused119 | unused12 | unused120 | unused121 | unused122 | unused123 | unused124 | unused125 | unused126 | unused127 | unused128 | unused129 | unused13 | unused130 | unused131 | unused132 | unused133 | unused134 | unused135 | unused136 | unused137 | unused138 | unused139 | unused14 | unused140 | unused141 | unused142 | unused143 | unused144 | unused145 | unused146 | unused147 | unused148 | unused149 | unused15 | unused150 | unused151 | unused152 | unused153 | unused154 | unused155 | unused156 | unused157 | unused158 | unused159 | unused16 | unused160 | unused161 | unused162 | unused163 | unused164 | unused165 | unused166 | unused167 | unused168 | unused169 | unused17 | unused170 | unused171 | unused172 | unused173 | unused174 | unused175 | unused176 | unused177 | unused178 | unused179 | unused18 | unused180 | unused181 | unused182 | unused183 | unused184 | unused185 | unused186 | unused187 | unused188 | unused189 | unused19 | unused190 | unused191 | unused192 | unused193 | unused194 | unused195 | unused196 | unused197 | unused198 | unused199 | unused2 | unused20 | unused200 | unused201 | unused202 | unused203 | unused204 | unused205 | unused206 | unused207 | unused208 | unused209 | unused21 | unused210 | unused211 | unused212 | unused213 | unused214 | unused215 | unused216 | unused217 | unused218 | unused219 | unused22 | unused220 | unused221 | unused222 | unused223 | unused224 | unused225 | unused226 | unused227 | unused228 | unused229 | unused23 | unused230 | unused231 | unused232 | unused233 | unused234 | unused235 | unused236 | unused237 | unused238 | unused239 | unused24 | unused240 | unused241 | unused242 | unused243 | unused244 | unused245 | unused246 | unused247 | unused248 | unused249 | unused25 | unused250 | unused251 | unused252 | unused253 | unused254 | unused255 | unused26 | unused27 | unused28 | unused29 | unused3 | unused30 | unused31 | unused32 | unused33 | unused34 | unused35 | unused36 | unused37 | unused38 | unused39 | unused4 | unused40 | unused41 | unused42 | unused43 | unused44 | unused45 | unused46 | unused47 | unused48 | unused49 | unused5 | unused50 | unused51 | unused52 | unused53 | unused54 | unused55 | unused56 | unused57 | unused58 | unused59 | unused6 | unused60 | unused61 | unused62 | unused63 | unused64 | unused65 | unused66 | unused67 | unused68 | unused69 | unused7 | unused70 | unused71 | unused72 | unused73 | unused74 | unused75 | unused76 | unused77 | unused78 | unused79 | unused8 | unused80 | unused81 | unused82 | unused83 | unused84 | unused85 | unused86 | unused87 | unused88 | unused89 | unused9 | unused90 | unused91 | unused92 | unused93 | unused94 | unused95 | unused96 | unused97 | unused98 | unused99 | virtio0 | virtio1 | virtio10 | virtio11 | virtio12 | virtio13 | virtio14 | virtio15 | virtio2 | virtio3 | virtio4 | virtio5 | virtio6 | virtio7 | virtio8 | virtio9>

要移动的磁盘。

<storage>: <storage ID>

目标存储。

--bwlimit <integer> (0 - N) (default = move limit from datacenter or storage config)

覆盖 I/O 带宽限制(单位 KiB/s)。

--delete <boolean> (default = 0)

复制成功后删除原始磁盘。默认情况下,原始磁盘会保留为未使用磁盘。

--digest <string>

如果当前配置文件具有不同的 SHA1 digest,则阻止更改。这可用于防止并发修改。

--format <qcow2 | raw | vmdk>

目标格式。

--target-digest <string>

如果目标虚拟机的当前配置文件具有不同的 SHA1 digest,则阻止更改。这可用于检测并发修改。

--target-disk <efidisk0 | ide0 | ide1 | ide2 | ide3 | nvme0 |nvme1 |nvme2 |nvme3 |nvme4 |nvme5 |sata0 | sata1 | sata2 | sata3 | sata4 | sata5 | scsi0 | scsi1 | scsi10 | scsi11 | scsi12 | scsi13 | scsi14 | scsi15 | scsi16 | scsi17 | scsi18 | scsi19 | scsi2 | scsi20 | scsi21 | scsi22 | scsi23 | scsi24 | scsi25 | scsi26 | scsi27 | scsi28 | scsi29 | scsi3 | scsi30 | scsi4 | scsi5 | scsi6 | scsi7 | scsi8 | scsi9 | tpmstate0 | unused0 | unused1 | unused10 | unused100 | unused101 | unused102 | unused103 | unused104 | unused105 | unused106 | unused107 | unused108 | unused109 | unused11 | unused110 | unused111 | unused112 | unused113 | unused114 | unused115 | unused116 | unused117 | unused118 | unused119 | unused12 | unused120 | unused121 | unused122 | unused123 | unused124 | unused125 | unused126 | unused127 | unused128 | unused129 | unused13 | unused130 | unused131 | unused132 | unused133 | unused134 | unused135 | unused136 | unused137 | unused138 | unused139 | unused14 | unused140 | unused141 | unused142 | unused143 | unused144 | unused145 | unused146 | unused147 | unused148 | unused149 | unused15 | unused150 | unused151 | unused152 | unused153 | unused154 | unused155 | unused156 | unused157 | unused158 | unused159 | unused16 | unused160 | unused161 | unused162 | unused163 | unused164 | unused165 | unused166 | unused167 | unused168 | unused169 | unused17 | unused170 | unused171 | unused172 | unused173 | unused174 | unused175 | unused176 | unused177 | unused178 | unused179 | unused18 | unused180 | unused181 | unused182 | unused183 | unused184 | unused185 | unused186 | unused187 | unused188 | unused189 | unused19 | unused190 | unused191 | unused192 | unused193 | unused194 | unused195 | unused196 | unused197 | unused198 | unused199 | unused2 | unused20 | unused200 | unused201 | unused202 | unused203 | unused204 | unused205 | unused206 | unused207 | unused208 | unused209 | unused21 | unused210 | unused211 | unused212 | unused213 | unused214 | unused215 | unused216 | unused217 | unused218 | unused219 | unused22 | unused220 | unused221 | unused222 | unused223 | unused224 | unused225 | unused226 | unused227 | unused228 | unused229 | unused23 | unused230 | unused231 | unused232 | unused233 | unused234 | unused235 | unused236 | unused237 | unused238 | unused239 | unused24 | unused240 | unused241 | unused242 | unused243 | unused244 | unused245 | unused246 | unused247 | unused248 | unused249 | unused25 | unused250 | unused251 | unused252 | unused253 | unused254 | unused255 | unused26 | unused27 | unused28 | unused29 | unused3 | unused30 | unused31 | unused32 | unused33 | unused34 | unused35 | unused36 | unused37 | unused38 | unused39 | unused4 | unused40 | unused41 | unused42 | unused43 | unused44 | unused45 | unused46 | unused47 | unused48 | unused49 | unused5 | unused50 | unused51 | unused52 | unused53 | unused54 | unused55 | unused56 | unused57 | unused58 | unused59 | unused6 | unused60 | unused61 | unused62 | unused63 | unused64 | unused65 | unused66 | unused67 | unused68 | unused69 | unused7 | unused70 | unused71 | unused72 | unused73 | unused74 | unused75 | unused76 | unused77 | unused78 | unused79 | unused8 | unused80 | unused81 | unused82 | unused83 | unused84 | unused85 | unused86 | unused87 | unused88 | unused89 | unused9 | unused90 | unused91 | unused92 | unused93 | unused94 | unused95 | unused96 | unused97 | unused98 | unused99 | virtio0 | virtio1 | virtio10 | virtio11 | virtio12 | virtio13 | virtio14 | virtio15 | virtio2 | virtio3 | virtio4 | virtio5 | virtio6 | virtio7 | virtio8 | virtio9>

磁盘将移动到目标虚拟机上的配置键(例如 ide0 或 scsi1)。默认为源磁盘键。

--target-vmid <integer> (100 - 999999999)

虚拟机的(唯一)ID。

qm disk clone <vmid> [OPTIONS]

将链接克隆卷移动到其他存储或其他虚拟机。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<disk>: <efidisk0 | ide0 | ide1 | ide2 | ide3 | nvme0 |nvme1 |nvme2 |nvme3 |nvme4 |nvme5 |sata0 | sata1 | sata2 | sata3 | sata4 | sata5 | scsi0 | scsi1 | scsi10 | scsi11 | scsi12 | scsi13 | scsi14 | scsi15 | scsi16 | scsi17 | scsi18 | scsi19 | scsi2 | scsi20 | scsi21 | scsi22 | scsi23 | scsi24 | scsi25 | scsi26 | scsi27 | scsi28 | scsi29 | scsi3 | scsi30 | scsi4 | scsi5 | scsi6 | scsi7 | scsi8 | scsi9 | tpmstate0 | unused0 | unused1 | unused10 | unused100 | unused101 | unused102 | unused103 | unused104 | unused105 | unused106 | unused107 | unused108 | unused109 | unused11 | unused110 | unused111 | unused112 | unused113 | unused114 | unused115 | unused116 | unused117 | unused118 | unused119 | unused12 | unused120 | unused121 | unused122 | unused123 | unused124 | unused125 | unused126 | unused127 | unused128 | unused129 | unused13 | unused130 | unused131 | unused132 | unused133 | unused134 | unused135 | unused136 | unused137 | unused138 | unused139 | unused14 | unused140 | unused141 | unused142 | unused143 | unused144 | unused145 | unused146 | unused147 | unused148 | unused149 | unused15 | unused150 | unused151 | unused152 | unused153 | unused154 | unused155 | unused156 | unused157 | unused158 | unused159 | unused16 | unused160 | unused161 | unused162 | unused163 | unused164 | unused165 | unused166 | unused167 | unused168 | unused169 | unused17 | unused170 | unused171 | unused172 | unused173 | unused174 | unused175 | unused176 | unused177 | unused178 | unused179 | unused18 | unused180 | unused181 | unused182 | unused183 | unused184 | unused185 | unused186 | unused187 | unused188 | unused189 | unused19 | unused190 | unused191 | unused192 | unused193 | unused194 | unused195 | unused196 | unused197 | unused198 | unused199 | unused2 | unused20 | unused200 | unused201 | unused202 | unused203 | unused204 | unused205 | unused206 | unused207 | unused208 | unused209 | unused21 | unused210 | unused211 | unused212 | unused213 | unused214 | unused215 | unused216 | unused217 | unused218 | unused219 | unused22 | unused220 | unused221 | unused222 | unused223 | unused224 | unused225 | unused226 | unused227 | unused228 | unused229 | unused23 | unused230 | unused231 | unused232 | unused233 | unused234 | unused235 | unused236 | unused237 | unused238 | unused239 | unused24 | unused240 | unused241 | unused242 | unused243 | unused244 | unused245 | unused246 | unused247 | unused248 | unused249 | unused25 | unused250 | unused251 | unused252 | unused253 | unused254 | unused255 | unused26 | unused27 | unused28 | unused29 | unused3 | unused30 | unused31 | unused32 | unused33 | unused34 | unused35 | unused36 | unused37 | unused38 | unused39 | unused4 | unused40 | unused41 | unused42 | unused43 | unused44 | unused45 | unused46 | unused47 | unused48 | unused49 | unused5 | unused50 | unused51 | unused52 | unused53 | unused54 | unused55 | unused56 | unused57 | unused58 | unused59 | unused6 | unused60 | unused61 | unused62 | unused63 | unused64 | unused65 | unused66 | unused67 | unused68 | unused69 | unused7 | unused70 | unused71 | unused72 | unused73 | unused74 | unused75 | unused76 | unused77 | unused78 | unused79 | unused8 | unused80 | unused81 | unused82 | unused83 | unused84 | unused85 | unused86 | unused87 | unused88 | unused89 | unused9 | unused90 | unused91 | unused92 | unused93 | unused94 | unused95 | unused96 | unused97 | unused98 | unused99 | virtio0 | virtio1 | virtio10 | virtio11 | virtio12 | virtio13 | virtio14 | virtio15 | virtio2 | virtio3 | virtio4 | virtio5 | virtio6 | virtio7 | virtio8 | virtio9>

要移动的磁盘。

--delete <boolean> (default = 1)

复制成功后删除原始磁盘。默认会删除原始磁盘。

--target-disk <efidisk0 | ide0 | ide1 | ide2 | ide3 | nvme0 |nvme1 |nvme2 |nvme3 |nvme4 |nvme5 |sata0 | sata1 | sata2 | sata3 | sata4 | sata5 | scsi0 | scsi1 | scsi10 | scsi11 | scsi12 | scsi13 | scsi14 | scsi15 | scsi16 | scsi17 | scsi18 | scsi19 | scsi2 | scsi20 | scsi21 | scsi22 | scsi23 | scsi24 | scsi25 | scsi26 | scsi27 | scsi28 | scsi29 | scsi3 | scsi30 | scsi4 | scsi5 | scsi6 | scsi7 | scsi8 | scsi9 | tpmstate0 | unused0 | unused1 | unused10 | unused100 | unused101 | unused102 | unused103 | unused104 | unused105 | unused106 | unused107 | unused108 | unused109 | unused11 | unused110 | unused111 | unused112 | unused113 | unused114 | unused115 | unused116 | unused117 | unused118 | unused119 | unused12 | unused120 | unused121 | unused122 | unused123 | unused124 | unused125 | unused126 | unused127 | unused128 | unused129 | unused13 | unused130 | unused131 | unused132 | unused133 | unused134 | unused135 | unused136 | unused137 | unused138 | unused139 | unused14 | unused140 | unused141 | unused142 | unused143 | unused144 | unused145 | unused146 | unused147 | unused148 | unused149 | unused15 | unused150 | unused151 | unused152 | unused153 | unused154 | unused155 | unused156 | unused157 | unused158 | unused159 | unused16 | unused160 | unused161 | unused162 | unused163 | unused164 | unused165 | unused166 | unused167 | unused168 | unused169 | unused17 | unused170 | unused171 | unused172 | unused173 | unused174 | unused175 | unused176 | unused177 | unused178 | unused179 | unused18 | unused180 | unused181 | unused182 | unused183 | unused184 | unused185 | unused186 | unused187 | unused188 | unused189 | unused19 | unused190 | unused191 | unused192 | unused193 | unused194 | unused195 | unused196 | unused197 | unused198 | unused199 | unused2 | unused20 | unused200 | unused201 | unused202 | unused203 | unused204 | unused205 | unused206 | unused207 | unused208 | unused209 | unused21 | unused210 | unused211 | unused212 | unused213 | unused214 | unused215 | unused216 | unused217 | unused218 | unused219 | unused22 | unused220 | unused221 | unused222 | unused223 | unused224 | unused225 | unused226 | unused227 | unused228 | unused229 | unused23 | unused230 | unused231 | unused232 | unused233 | unused234 | unused235 | unused236 | unused237 | unused238 | unused239 | unused24 | unused240 | unused241 | unused242 | unused243 | unused244 | unused245 | unused246 | unused247 | unused248 | unused249 | unused25 | unused250 | unused251 | unused252 | unused253 | unused254 | unused255 | unused26 | unused27 | unused28 | unused29 | unused3 | unused30 | unused31 | unused32 | unused33 | unused34 | unused35 | unused36 | unused37 | unused38 | unused39 | unused4 | unused40 | unused41 | unused42 | unused43 | unused44 | unused45 | unused46 | unused47 | unused48 | unused49 | unused5 | unused50 | unused51 | unused52 | unused53 | unused54 | unused55 | unused56 | unused57 | unused58 | unused59 | unused6 | unused60 | unused61 | unused62 | unused63 | unused64 | unused65 | unused66 | unused67 | unused68 | unused69 | unused7 | unused70 | unused71 | unused72 | unused73 | unused74 | unused75 | unused76 | unused77 | unused78 | unused79 | unused8 | unused80 | unused81 | unused82 | unused83 | unused84 | unused85 | unused86 | unused87 | unused88 | unused89 | unused9 | unused90 | unused91 | unused92 | unused93 | unused94 | unused95 | unused96 | unused97 | unused98 | unused99 | virtio0 | virtio1 | virtio10 | virtio11 | virtio12 | virtio13 | virtio14 | virtio15 | virtio2 | virtio3 | virtio4 | virtio5 | virtio6 | virtio7 | virtio8 | virtio9>

磁盘将移动到目标虚拟机上的配置键(例如 ide0 或 scsi1)。默认为源磁盘键。

--target-vmid <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--snapname <string>

虚拟机快照名称。

qm disk rescan [OPTIONS]

重新扫描所有存储,并更新磁盘大小和未使用磁盘镜像。

--dryrun <boolean> (default = 0)

不实际将更改写入虚拟机配置。

--vmid <integer> (100 - 999999999)

虚拟机的(唯一)ID。

qm disk resize <vmid> <disk> <size> [OPTIONS]

扩展卷大小。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<disk>: <efidisk0 | ide0 | ide1 | ide2 | ide3 | nvme0 |nvme1 |nvme2 |nvme3 |nvme4 |nvme5 |sata0 | sata1 | sata2 | sata3 | sata4 | sata5 | scsi0 | scsi1 | scsi10 | scsi11 | scsi12 | scsi13 | scsi14 | scsi15 | scsi16 | scsi17 | scsi18 | scsi19 | scsi2 | scsi20 | scsi21 | scsi22 | scsi23 | scsi24 | scsi25 | scsi26 | scsi27 | scsi28 | scsi29 | scsi3 | scsi30 | scsi4 | scsi5 | scsi6 | scsi7 | scsi8 | scsi9 | tpmstate0 | virtio0 | virtio1 | virtio10 | virtio11 | virtio12 | virtio13 | virtio14 | virtio15 | virtio2 | virtio3 | virtio4 | virtio5 | virtio6 | virtio7 | virtio8 | virtio9>

要调整大小的磁盘。

<size>: \+?\d+(\.\d+)?[KMGT]?

新的大小。带 + 号时,该值会加到卷的实际大小上;不带 + 号时,该值会作为绝对大小使用。不支持缩小磁盘大小。

--digest <string>

如果当前配置文件具有不同的 SHA1 digest,则阻止更改。这可用于防止并发修改。

--skiplock <boolean>

忽略锁,只有 root 允许使用此选项。

qm disk unlink <vmid> --idlist <string> [OPTIONS]

取消链接/删除磁盘镜像。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--force <boolean>

强制物理移除。未设置时,仅从配置文件中移除磁盘,并创建名为 unused[n] 的附加配置条目,其中包含卷 ID。取消链接 unused[n] 始终会导致物理移除。

--idlist <string>

要删除的磁盘 ID 列表。

qm guest cmd <vmid> <command>

执行 QEMU Guest Agent 命令。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<command>: <fsfreeze-freeze | fsfreeze-status | fsfreeze-thaw | fstrim | get-fsinfo | get-host-name | get-memory-block-info | get-memory-blocks | get-osinfo | get-time | get-timezone | get-users | get-vcpus | info | network-get-interfaces | ping | shutdown | suspend-disk | suspend-hybrid | suspend-ram>

QGA 命令。

qm guest exec <vmid> [<extra-args>] [OPTIONS]

通过 guest agent 执行给定命令。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<extra-args>: <array>

作为数组传入的额外参数。

--pass-stdin <boolean> (default = 0)

设置后,会读取 STDIN 直到 EOF,并通过 input-data 转发给 guest agent(通常被 guest agent 启动的进程视为 STDIN)。最大允许 1 MiB。

--synchronous <boolean> (default = 1)

如果设置为 off,则立即返回 pid,而不是等待命令完成或超时。

--timeout <integer> (0 - N) (default = 30)

同步等待命令完成的最长时间。如果达到该时间,则返回 pid。设置为 0 可停用。

qm guest exec-status <vmid> <pid>

获取由 guest-agent 启动的给定 pid 的状态。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<pid>: <integer>

要查询的 PID。

qm guest passwd <vmid> <username> [OPTIONS]

将给定用户的密码设置为给定密码。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<username>: <string>

要设置密码的用户。

--crypted <boolean> (default = 0)

如果密码已经通过 crypt() 处理,则设置为 1。

qm help [OPTIONS]

获取指定命令的帮助。

--extra-args <array>

显示特定命令的帮助。

--verbose <boolean>

详细输出格式。

qm import <vmid> <source> --storage <string> [OPTIONS]

从受支持的导入源(例如 ESXi 存储)导入外部虚拟客户机。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

gicversion: <2 | 3 | 4 | max | host > (default = host)

设置 ARM 虚拟机的 gicversion。

virtualization: <boolean> (default = 0)

为 arm64 虚拟机启用嵌套虚拟化。

snapshot=<boolean>

控制 qemu 的快照模式功能。启用后,对磁盘所做的更改是临时的,并会在虚拟机关机时丢弃。

pxvditemplate <boolean> (default = 0)

启用/禁用 PXVDI Template。

<source>: <string>

导入源卷 ID。

--acpi <boolean> (default = 1)

启用/禁用 ACPI。

--affinity <string>

用于执行客户机进程的主机核心列表,例如:0,5,8-11

--agent [enabled=]<1|0> [,freeze-fs-on-backup=<1|0>] [,fstrim_cloned_disks=<1|0>] [,type=<virtio|isa>]

启用/禁用与 QEMU Guest Agent 及其属性的通信。

--amd-sev [type=]<sev-type> [,allow-smt=<1|0>] [,kernel-hashes=<1|0>] [,no-debug=<1|0>] [,no-key-sharing=<1|0>]

AMD CPU 提供的 Secure Encrypted Virtualization(SEV)功能。

--arch <aarch64 | x86_64 | loongarch64 | riscv64>

虚拟处理器架构。默认为主机架构。

--args <string>

传递给 kvm 的任意参数。

--audio0 device=<ich9-intel-hda|intel-hda|AC97> [,driver=<spice|none>]

配置音频设备,与 QXL/Spice 结合使用时很有用。

--autostart <boolean> (default = 0)

崩溃后自动重启(当前会被忽略)。

--balloon <integer> (0 - N)

虚拟机目标 RAM 容量,单位 MiB。使用 0 会禁用 balloon 驱动。

--bios <ovmf | seabios> (default = seabios)

选择 BIOS 实现。

--boot [[legacy=]<[acdn]{1,4}>] [,order=<device[;device...]>]

指定客户机启动顺序。请使用 order= 子属性;不带键或使用 legacy= 的用法已弃用。

--bootdisk (ide|sata|scsi|virtio)\d+

启用从指定磁盘启动。已弃用:请改用 boot: order=foo;bar

--cdrom <volume>

这是选项 -ide2 的别名。

--cicustom [meta=<volume>] [,network=<volume>] [,user=<volume>] [,vendor=<volume>]

cloud-init:指定自定义文件,以替换启动时自动生成的文件。

--cipassword <string>

cloud-init:要分配给用户的密码。通常不建议使用此项,请改用 ssh 密钥。另请注意,较旧版本的 cloud-init 不支持哈希密码。

--citype <configdrive2 | nocloud | opennebula>

指定 cloud-init 配置格式。默认值取决于配置的操作系统类型(ostype)。Linux 使用 nocloud 格式,windows 使用 configdrive2

--ciupgrade <boolean> (default = 1)

cloud-init:首次启动后自动执行软件包升级。

--ciuser <string>

cloud-init:要更改 ssh 密钥和密码的用户名,用于替代镜像中配置的默认用户。

--cores <integer> (1 - N) (default = 1)

每个 socket 的核心数。

--cpu [[cputype=]<string>] [,flags=<+FLAG[;-FLAG...]>] [,hidden=<1|0>] [,hv-vendor-id=<vendor-id>] [,phys-bits=<8-64|host>] [,reported-model=<enum>]

模拟的 CPU 类型。

--cpulimit <number> (0 - 128) (default = 0)

CPU 使用限制。

--cpuunits <integer> (1 - 262144) (default = cgroup v1: 1024, cgroup v2: 100)

虚拟机的 CPU 权重,在 cgroup v2 中会限制到 [1, 10000] 范围内。

--delete <string>

要删除的设置列表。

--description <string>

虚拟机描述。显示在 Web 界面的虚拟机摘要中,并作为注释保存到配置文件内。

--dryrun <boolean> (default = 0)

显示创建命令并退出,不执行任何操作。

--efidisk0 [file=]<volume> [,efitype=<2m|4m>] [,format=<enum>] [,pre-enrolled-keys=<1|0>] [,size=<DiskSize>]

配置用于存储 EFI 变量的磁盘。

--format <qcow2 | raw | vmdk>

目标格式。

--freeze <boolean>

启动时冻结 CPU(使用 c monitor 命令开始执行)。

--hookscript <string>

将在虚拟机生命周期的各个步骤中执行的脚本。

--hostpci[n] [[host=]<HOSTPCIID[;HOSTPCIID2...]>] [,device-id=<hex id>] [,legacy-igd=<1|0>] [,mapping=<mapping-id>] [,mdev=<string>] [,pcie=<1|0>] [,rombar=<1|0>] [,romfile=<string>] [,sub-device-id=<hex id>] [,sub-vendor-id=<hex id>] [,vendor-id=<hex id>] [,x-vga=<1|0>] [,ramfb=<1|0>]

将主机 PCI 设备映射到客户机。

--hotplug <string> (default = network,disk,usb)

选择性启用热插拔功能。这是一个逗号分隔的热插拔功能列表:networkdiskcpumemoryusbcloudinit。使用 0 可完全禁用热插拔。使用 1 作为值是默认值 network,disk,usb 的别名。对于 machine version >= 7.1 且 ostype 为 l26 或 windows > 7 的客户机,可以使用 USB 热插拔。

--hugepages <1024 | 2 | any>

启用/禁用 hugepages 内存。

--ide[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,cyls=<integer>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,heads=<integer>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,model=<model>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,secs=<integer>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,trans=<none|lba|auto>] [,werror=<enum>] [,wwn=<wwn>]

将卷用作 IDE 硬盘或 CD-ROM(n 为 0 到 3)。

--ipconfig[n] [gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,ip=<IPv4Format/CIDR>] [,ip6=<IPv6Format/CIDR>]

cloud-init:指定对应接口的 IP 地址和网关。

IP 地址使用 CIDR 表示法;网关是可选项,但需要指定同类型 IP。

IP 地址可以使用特殊字符串 dhcp 以使用 DHCP,此时不应显式提供网关。 对于 IPv6,可以使用特殊字符串 auto 以使用无状态自动配置。这需要 cloud-init 19.4 或更新版本。

如果启用了 cloud-init 且既未指定 IPv4 地址也未指定 IPv6 地址,则默认在 IPv4 上使用 dhcp。

--ivshmem size=<integer> [,name=<string>]

虚拟机间共享内存。适用于虚拟机之间或虚拟机与主机之间的直接通信。

--keephugepages <boolean> (default = 0)

与 hugepages 一起使用。启用后,虚拟机关机后 hugepages 不会被删除,可用于后续启动。

--keyboard <da | de | de-ch | en-gb | en-us | es | fi | fr | fr-be | fr-ca | fr-ch | hu | is | it | ja | lt | mk | nl | no | pl | pt | pt-br | sl | sv | tr>

VNC 服务器的键盘布局。通常不需要此选项,且往往更适合在客户机 OS 内处理。

--kvm <boolean> (default = 1)

启用/禁用 KVM 硬件虚拟化。

--live-import <boolean> (default = 0)

立即启动虚拟机,并在后台复制数据。

--localtime <boolean>

将实时时钟(RTC)设置为本地时间。如果 ostype 表示 Microsoft Windows OS,则默认启用。

--lock <backup | clone | create | migrate | rollback | snapshot | snapshot-delete | suspended | suspending>

锁定/解锁虚拟机。

--machine [[type=]<machine type>] [,enable-s3=<1|0>] [,enable-s4=<1|0>] [,viommu=<intel|virtio>]

指定 QEMU machine。

--memory [current=]<integer>

内存属性。

--migrate_downtime <number> (0 - N) (default = 0.1)

设置迁移可容忍的最大停机时间(秒)。如果迁移在最后阶段因需要传输太多新脏 RAM 而无法收敛,该限制会自动逐步增加,直到迁移可以收敛。

--migrate_speed <integer> (0 - N) (default = 0)

设置迁移最大速度(MB/s)。值为 0 表示无限制。

--name <string>

设置虚拟机名称。仅用于配置 Web 界面。

--nameserver <string>

cloud-init:设置容器的 DNS 服务器 IP 地址。如果既未设置 searchdomain 也未设置 nameserver,创建时会自动使用主机上的设置。

--net[n] [model=]<enum> [,bridge=<bridge>] [,firewall=<1|0>] [,link_down=<1|0>] [,macaddr=<XX:XX:XX:XX:XX:XX>] [,mtu=<integer>] [,queues=<integer>] [,rate=<number>] [,tag=<integer>] [,trunks=<vlanid[;vlanid...]>] [,<model>=<macaddr>]

指定网络设备。

--numa <boolean> (default = 0)

启用/禁用 NUMA。

--numa[n] cpus=<id[-id];...> [,hostnodes=<id[-id];...>] [,memory=<number>] [,policy=<preferred|bind|interleave>]

NUMA 拓扑。

--onboot <boolean> (default = 0)

指定虚拟机是否在系统启动期间启动。

--ostype <l24 | l26 | other | solaris | w2k | w2k3 | w2k8 | win10 | win11 | win7 | win8 | wvista | wxp>

指定客户机操作系统。

--parallel[n] /dev/parport\d+|/dev/usb/lp\d+

映射主机并口设备(n 为 0 到 2)。

--protection <boolean> (default = 0)

设置虚拟机的保护标志。这会禁用删除虚拟机和删除磁盘操作。

--reboot <boolean> (default = 1)

允许重启。如果设置为 0,虚拟机会在重启时退出。

--rng0 [source=]</dev/urandom|/dev/random|/dev/hwrng> [,max_bytes=<integer>] [,period=<integer>]

配置基于 VirtIO 的随机数生成器。

--sata[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,cyls=<integer>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,heads=<integer>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,secs=<integer>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,trans=<none|lba|auto>] [,werror=<enum>] [,wwn=<wwn>]

将卷用作 SATA 硬盘或 CD-ROM(n 为 0 到 5)。

--scsi[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,cyls=<integer>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,heads=<integer>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,iothread=<1|0>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,product=<product>] [,queues=<integer>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,ro=<1|0>] [,scsiblock=<1|0>] [,secs=<integer>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,trans=<none|lba|auto>] [,vendor=<vendor>] [,werror=<enum>] [,wwn=<wwn>]

将卷用作 SCSI 硬盘或 CD-ROM(n 为 0 到 30)。

--scsihw <lsi | lsi53c810 | megasas | pvscsi | virtio-scsi-pci | virtio-scsi-single> (default = lsi)

SCSI 控制器型号。

--searchdomain <string>

cloud-init:设置容器的 DNS 搜索域。如果既未设置 searchdomain 也未设置 nameserver,创建时会自动使用主机上的设置。

--serial[n] (/dev/.+|socket)

在虚拟机内部创建串口设备(n 为 0 到 3)。

--shares <integer> (0 - 50000) (default = 1000)

自动 ballooning 的内存 share 数量。数值越大,该虚拟机获得的内存越多。该数值相对于所有其他运行中虚拟机的权重。使用 0 会禁用自动 ballooning。自动 ballooning 由 pvestatd 执行。

--smbios1 [base64=<1|0>] [,family=<Base64 encoded string>] [,manufacturer=<Base64 encoded string>] [,product=<Base64 encoded string>] [,serial=<Base64 encoded string>] [,sku=<Base64 encoded string>] [,uuid=<UUID>] [,version=<Base64 encoded string>]

指定 SMBIOS type 1 字段。

--smp <integer> (1 - N) (default = 1)

CPU 数量。请改用选项 -sockets。

--UUID <UUID> (default = 1 (autogenerated))

VM uuid。

--sockets <integer> (1 - N) (default = 1)

CPU socket 数量。

--spice_enhancements [foldersharing=<1|0>] [,videostreaming=<off|all|filter>]

配置 SPICE 的其他增强功能。

--sshkeys <string>

cloud-init:设置公共 SSH 密钥(每行一个密钥,OpenSSH 格式)。

--startdate (now | YYYY-MM-DD | YYYY-MM-DDTHH:MM:SS) (default = now)

设置实时时钟的初始日期。有效日期格式为:now2006-06-17T16:01:212006-06-17

--startup `[[order=]\d+] [,up=\d+] [,down=\d+] `

启动和关机行为。Order 是定义通用启动顺序的非负数。关机按相反顺序完成。此外,可以设置 updown 延迟(秒),用于指定启动或停止下一台虚拟机之前等待的延迟。

--storage <storage ID>

默认存储。

--tablet <boolean> (default = 1)

启用/禁用 USB tablet 设备。

--tags <string>

虚拟机标签。该信息仅为元信息。

--tdf <boolean> (default = 0)

启用/禁用时间漂移修复。

--template <boolean> (default = 0)

启用/禁用 Template。

--tpmstate0 [file=]<volume> [,size=<DiskSize>] [,version=<v1.2|v2.0>]

配置用于存储 TPM 状态的磁盘。格式固定为 raw

--unused[n] [file=]<volume>

对未使用卷的引用。该项供内部使用,不应手动修改。

--usb[n] [[host=]<HOSTUSBDEVICE|spice>] [,mapping=<mapping-id>] [,usb3=<1|0>]

配置 USB 设备(n 为 0 到 4;对于 machine version >= 7.1 且 ostype 为 l26 或 windows > 7 的客户机,n 可达 14)。

--vcpus <integer> (1 - N) (default = 0)

热插拔 vcpu 数量。

--vga [[type=]<enum>] [,clipboard=<vnc>] [,memory=<integer>]

配置 VGA 硬件。

--virtio[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,cyls=<integer>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,heads=<integer>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,iothread=<1|0>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,ro=<1|0>] [,secs=<integer>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,trans=<none|lba|auto>] [,werror=<enum>]

将卷用作 VIRTIO 硬盘(n 为 0 到 15)。

--virtiofs[n] [dirid=]<mapping-id> [,cache=<enum>] [,direct-io=<1|0>] [,expose-acl=<1|0>] [,expose-xattr=<1|0>]

使用 Virtio-fs 在主机和客户机之间共享目录的配置。

--vmgenid <UUID> (default = 1 (autogenerated))

设置 VM Generation ID。使用 1 可在创建或更新时自动生成,传入 0 可显式禁用。

--vmstatestorage <storage ID>

VM 状态卷/文件的默认存储。

--watchdog [[model=]<i6300esb|ib700>] [,action=<enum>]

创建虚拟硬件 watchdog 设备。

qm importdisk

qm disk import 的别名。

qm importovf <vmid> <manifest> <storage> [OPTIONS]

使用从 OVF manifest 读取的参数创建新虚拟机。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<manifest>: <string>

ovf 文件路径。

<storage>: <storage ID>

目标存储 ID。

--dryrun <boolean>

打印提取出的 OVF 参数的解析表示,但不创建虚拟机。

--format <qcow2 | raw | vmdk>

目标格式。

qm list [OPTIONS]

虚拟机索引(按节点)。

--full <boolean>

确定活动虚拟机的完整状态。

qm listsnapshot <vmid>

列出所有快照。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

qm migrate <vmid> <target> [OPTIONS]

迁移虚拟机。创建新的迁移任务。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<target>: <string>

目标节点。

--bwlimit <integer> (0 - N) (default = migrate limit from datacenter or storage config)

覆盖 I/O 带宽限制(单位 KiB/s)。

--force <boolean>

允许迁移使用本地设备的虚拟机。只有 root 可使用此选项。

--migration_network <string>

用于迁移的(子)网络 CIDR。

--migration_type <insecure | secure>

迁移流量默认使用 SSH tunnel 加密。在安全且完全私有的网络上,可以禁用此项以提升性能。

--online <boolean>

如果虚拟机正在运行,则使用在线/实时迁移。如果虚拟机已停止,则忽略。

--targetstorage <string>

从源存储到目标存储的映射。仅提供单个存储 ID 会将所有源存储映射到该存储。提供特殊值 1 会将每个源存储映射到自身。

--with-local-disks <boolean>

为本地磁盘启用实时存储迁移。

qm monitor <vmid>

进入 QEMU Monitor 界面。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

qm move-disk

qm disk move 的别名。

qm move_disk

qm disk move 的别名。

qm mtunnel

由 qmigrate 使用,请勿手动使用。

qm nbdstop <vmid>

停止嵌入式 nbd 服务器。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

qm pending <vmid>

获取包含当前值和待应用值的虚拟机配置。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

qm reboot <vmid> [OPTIONS]

通过关闭虚拟机再重新启动来重启虚拟机。应用待处理更改。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--timeout <integer> (0 - N)

等待关机的最大超时时间(秒)。

qm remote-migrate <vmid> [<target-vmid>] <target-endpoint> --target-bridge <string> --target-storage <string> [OPTIONS]

将虚拟机迁移到远程集群。创建新的迁移任务。实验性功能!

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<target-vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<target-endpoint>: apitoken=<PVEAPIToken=user@realm!token=SECRET> ,host=<ADDRESS> [,fingerprint=<FINGERPRINT>] [,port=<PORT>]

远程目标端点。

--bwlimit <integer> (0 - N) (default = migrate limit from datacenter or storage config)

覆盖 I/O 带宽限制(单位 KiB/s)。

--delete <boolean> (default = 0)

迁移成功后删除原始虚拟机及相关数据。默认情况下,原始虚拟机会以停止状态保留在源集群上。

--online <boolean>

如果虚拟机正在运行,则使用在线/实时迁移。如果虚拟机已停止,则忽略。

--target-bridge <string>

从源 bridge 到目标 bridge 的映射。仅提供单个 bridge ID 会将所有源 bridge 映射到该 bridge。提供特殊值 1 会将每个源 bridge 映射到自身。

--target-storage <string>

从源存储到目标存储的映射。仅提供单个存储 ID 会将所有源存储映射到该存储。提供特殊值 1 会将每个源存储映射到自身。

qm rescan

qm disk rescan 的别名。

qm reset <vmid> [OPTIONS]

重置虚拟机。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--skiplock <boolean>

忽略锁,只有 root 允许使用此选项。

qm resize

qm disk resize 的别名。

qm resume <vmid> [OPTIONS]

恢复虚拟机。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--nocheck <boolean>

无可用描述。

--skiplock <boolean>

忽略锁,只有 root 允许使用此选项。

qm rollback <vmid> <snapname> [OPTIONS]

将虚拟机状态回滚到指定快照。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<snapname>: <string>

快照名称。

--start <boolean> (default = 0)

回滚成功后是否应启动虚拟机。(注意:如果快照包含 RAM,虚拟机会自动启动。)

qm sendkey <vmid> <key> [OPTIONS]

向虚拟机发送按键事件。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<key>: <string>

按键(qemu monitor 编码)。

--skiplock <boolean>

忽略锁,只有 root 允许使用此选项。

qm set <vmid> [OPTIONS]

设置虚拟机选项(同步 API)。对于涉及热插拔或存储分配的任何操作,应考虑改用 POST 方法。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

gicversion: <2 | 3 | 4 | max | host > (default = host)

设置 ARM 虚拟机的 gicversion。

virtualization: <boolean> (default = 0)

为 arm64 虚拟机启用嵌套虚拟化。

snapshot=<boolean>

控制 qemu 的快照模式功能。启用后,对磁盘所做的更改是临时的,并会在虚拟机关机时丢弃。

pxvditemplate <boolean> (default = 0)

启用/禁用 PXVDI Template。

--acpi <boolean> (default = 1)

启用/禁用 ACPI。

--affinity <string>

用于执行客户机进程的主机核心列表,例如:0,5,8-11

--agent [enabled=]<1|0> [,freeze-fs-on-backup=<1|0>] [,fstrim_cloned_disks=<1|0>] [,type=<virtio|isa>]

启用/禁用与 QEMU Guest Agent 及其属性的通信。

--amd-sev [type=]<sev-type> [,allow-smt=<1|0>] [,kernel-hashes=<1|0>] [,no-debug=<1|0>] [,no-key-sharing=<1|0>]

AMD CPU 提供的 Secure Encrypted Virtualization(SEV)功能。

--arch <aarch64 | x86_64 | riscv64 |loongarch64>

虚拟处理器架构。默认为主机架构。

--args <string>

传递给 kvm 的任意参数。

--audio0 device=<ich9-intel-hda|intel-hda|AC97> [,driver=<spice|none>]

配置音频设备,与 QXL/Spice 结合使用时很有用。

--autostart <boolean> (default = 0)

崩溃后自动重启(当前会被忽略)。

--balloon <integer> (0 - N)

虚拟机目标 RAM 容量,单位 MiB。使用 0 会禁用 balloon 驱动。

--bios <ovmf | seabios> (default = seabios)

选择 BIOS 实现。

--boot [[legacy=]<[acdn]{1,4}>] [,order=<device[;device...]>]

指定客户机启动顺序。请使用 order= 子属性;不带键或使用 legacy= 的用法已弃用。

--bootdisk (ide|sata|scsi|virtio)\d+

启用从指定磁盘启动。已弃用:请改用 boot: order=foo;bar

--cdrom <volume>

这是选项 -ide2 的别名。

--cicustom [meta=<volume>] [,network=<volume>] [,user=<volume>] [,vendor=<volume>]

cloud-init:指定自定义文件,以替换启动时自动生成的文件。

--cipassword <password>

cloud-init:要分配给用户的密码。通常不建议使用此项,请改用 ssh 密钥。另请注意,较旧版本的 cloud-init 不支持哈希密码。

--citype <configdrive2 | nocloud | opennebula>

指定 cloud-init 配置格式。默认值取决于配置的操作系统类型(ostype)。Linux 使用 nocloud 格式,windows 使用 configdrive2

--ciupgrade <boolean> (default = 1)

cloud-init:首次启动后自动执行软件包升级。

--ciuser <string>

cloud-init:要更改 ssh 密钥和密码的用户名,用于替代镜像中配置的默认用户。

--cores <integer> (1 - N) (default = 1)

每个 socket 的核心数。

--cpu [[cputype=]<string>] [,flags=<+FLAG[;-FLAG...]>] [,hidden=<1|0>] [,hv-vendor-id=<vendor-id>] [,phys-bits=<8-64|host>] [,reported-model=<enum>]

模拟的 CPU 类型。

--cpulimit <number> (0 - 128) (default = 0)

CPU 使用限制。

--cpuunits <integer> (1 - 262144) (default = cgroup v1: 1024, cgroup v2: 100)

虚拟机的 CPU 权重,在 cgroup v2 中会限制到 [1, 10000] 范围内。

--delete <string>

要删除的设置列表。

--description <string>

虚拟机描述。显示在 Web 界面的虚拟机摘要中,并作为注释保存到配置文件内。

--digest <string>

如果当前配置文件具有不同的 SHA1 digest,则阻止更改。这可用于防止并发修改。

--efidisk0 [file=]<volume> [,efitype=<2m|4m>] [,format=<enum>] [,import-from=<source volume>] [,pre-enrolled-keys=<1|0>] [,size=<DiskSize>]

配置用于存储 EFI 变量的磁盘。使用特殊语法 STORAGE_ID:SIZE_IN_GiB 分配新卷。注意,此处会忽略 SIZE_IN_GiB,并会将默认 EFI 变量复制到该卷中。使用 STORAGE_ID:0 和 import-from 参数可从现有卷导入。

--force <boolean>

强制物理移除。未设置时,仅从配置文件中移除磁盘,并创建名为 unused[n] 的附加配置条目,其中包含卷 ID。取消链接 unused[n] 始终会导致物理移除。

Note 需要选项:delete
--freeze <boolean>

启动时冻结 CPU(使用 c monitor 命令开始执行)。

--hookscript <string>

将在虚拟机生命周期的各个步骤中执行的脚本。

--hostpci[n] [[host=]<HOSTPCIID[;HOSTPCIID2...]>] [,device-id=<hex id>] [,legacy-igd=<1|0>] [,mapping=<mapping-id>] [,mdev=<string>] [,pcie=<1|0>] [,rombar=<1|0>] [,romfile=<string>] [,sub-device-id=<hex id>] [,sub-vendor-id=<hex id>] [,vendor-id=<hex id>] [,x-vga=<1|0>] [,ramfb=<1|0>]

将主机 PCI 设备映射到客户机。

--hotplug <string> (default = network,disk,usb)

选择性启用热插拔功能。这是一个逗号分隔的热插拔功能列表:networkdiskcpumemoryusbcloudinit。使用 0 可完全禁用热插拔。使用 1 作为值是默认值 network,disk,usb 的别名。对于 machine version >= 7.1 且 ostype 为 l26 或 windows > 7 的客户机,可以使用 USB 热插拔。

--hugepages <1024 | 2 | any>

启用/禁用 hugepages 内存。

--ide[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,cyls=<integer>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,heads=<integer>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,model=<model>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,secs=<integer>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,trans=<none|lba|auto>] [,werror=<enum>] [,wwn=<wwn>]

将卷用作 IDE 硬盘或 CD-ROM(n 为 0 到 3)。使用特殊语法 STORAGE_ID:SIZE_IN_GiB 分配新卷。使用 STORAGE_ID:0 和 import-from 参数可从现有卷导入。

--ipconfig[n] [gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,ip=<IPv4Format/CIDR>] [,ip6=<IPv6Format/CIDR>]

cloud-init:指定对应接口的 IP 地址和网关。

IP 地址使用 CIDR 表示法;网关是可选项,但需要指定同类型 IP。

IP 地址可以使用特殊字符串 dhcp 以使用 DHCP,此时不应显式提供网关。 对于 IPv6,可以使用特殊字符串 auto 以使用无状态自动配置。这需要 cloud-init 19.4 或更新版本。

如果启用了 cloud-init 且既未指定 IPv4 地址也未指定 IPv6 地址,则默认在 IPv4 上使用 dhcp。

--ivshmem size=<integer> [,name=<string>]

虚拟机间共享内存。适用于虚拟机之间或虚拟机与主机之间的直接通信。

--keephugepages <boolean> (default = 0)

与 hugepages 一起使用。启用后,虚拟机关机后 hugepages 不会被删除,可用于后续启动。

--keyboard <da | de | de-ch | en-gb | en-us | es | fi | fr | fr-be | fr-ca | fr-ch | hu | is | it | ja | lt | mk | nl | no | pl | pt | pt-br | sl | sv | tr>

VNC 服务器的键盘布局。通常不需要此选项,且往往更适合在客户机 OS 内处理。

--kvm <boolean> (default = 1)

启用/禁用 KVM 硬件虚拟化。

--localtime <boolean>

将实时时钟(RTC)设置为本地时间。如果 ostype 表示 Microsoft Windows OS,则默认启用。

--lock <backup | clone | create | migrate | rollback | snapshot | snapshot-delete | suspended | suspending>

锁定/解锁虚拟机。

--machine [[type=]<machine type>] [,enable-s3=<1|0>] [,enable-s4=<1|0>] [,viommu=<intel|virtio>]

指定 QEMU machine。

--memory [current=]<integer>

内存属性。

--migrate_downtime <number> (0 - N) (default = 0.1)

设置迁移可容忍的最大停机时间(秒)。如果迁移在最后阶段因需要传输太多新脏 RAM 而无法收敛,该限制会自动逐步增加,直到迁移可以收敛。

--migrate_speed <integer> (0 - N) (default = 0)

设置迁移最大速度(MB/s)。值为 0 表示无限制。

--name <string>

设置虚拟机名称。仅用于配置 Web 界面。

--nameserver <string>

cloud-init:设置容器的 DNS 服务器 IP 地址。如果既未设置 searchdomain 也未设置 nameserver,创建时会自动使用主机上的设置。

--net[n] [model=]<enum> [,bridge=<bridge>] [,firewall=<1|0>] [,link_down=<1|0>] [,macaddr=<XX:XX:XX:XX:XX:XX>] [,mtu=<integer>] [,queues=<integer>] [,rate=<number>] [,tag=<integer>] [,trunks=<vlanid[;vlanid...]>] [,<model>=<macaddr>]

指定网络设备。

--numa <boolean> (default = 0)

启用/禁用 NUMA。

--numa[n] cpus=<id[-id];...> [,hostnodes=<id[-id];...>] [,memory=<number>] [,policy=<preferred|bind|interleave>]

NUMA 拓扑。

--onboot <boolean> (default = 0)

指定虚拟机是否在系统启动期间启动。

--ostype <l24 | l26 | other | solaris | w2k | w2k3 | w2k8 | win10 | win11 | win7 | win8 | wvista | wxp>

指定客户机操作系统。

--parallel[n] /dev/parport\d+|/dev/usb/lp\d+

映射主机并口设备(n 为 0 到 2)。

--protection <boolean> (default = 0)

设置虚拟机的保护标志。这会禁用删除虚拟机和删除磁盘操作。

--reboot <boolean> (default = 1)

允许重启。如果设置为 0,虚拟机会在重启时退出。

--revert <string>

还原待处理更改。

--rng0 [source=]</dev/urandom|/dev/random|/dev/hwrng> [,max_bytes=<integer>] [,period=<integer>]

配置基于 VirtIO 的随机数生成器。

--sata[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,cyls=<integer>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,heads=<integer>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,secs=<integer>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,trans=<none|lba|auto>] [,werror=<enum>] [,wwn=<wwn>]

将卷用作 SATA 硬盘或 CD-ROM(n 为 0 到 5)。使用特殊语法 STORAGE_ID:SIZE_IN_GiB 分配新卷。使用 STORAGE_ID:0 和 import-from 参数可从现有卷导入。

--scsi[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,cyls=<integer>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,heads=<integer>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,iothread=<1|0>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,product=<product>] [,queues=<integer>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,ro=<1|0>] [,scsiblock=<1|0>] [,secs=<integer>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,trans=<none|lba|auto>] [,vendor=<vendor>] [,werror=<enum>] [,wwn=<wwn>]

将卷用作 SCSI 硬盘或 CD-ROM(n 为 0 到 30)。使用特殊语法 STORAGE_ID:SIZE_IN_GiB 分配新卷。使用 STORAGE_ID:0 和 import-from 参数可从现有卷导入。

--scsihw <lsi | lsi53c810 | megasas | pvscsi | virtio-scsi-pci | virtio-scsi-single> (default = lsi)

SCSI 控制器型号。

--searchdomain <string>

cloud-init:设置容器的 DNS 搜索域。如果既未设置 searchdomain 也未设置 nameserver,创建时会自动使用主机上的设置。

--serial[n] (/dev/.+|socket)

在虚拟机内部创建串口设备(n 为 0 到 3)。

--shares <integer> (0 - 50000) (default = 1000)

自动 ballooning 的内存 share 数量。数值越大,该虚拟机获得的内存越多。该数值相对于所有其他运行中虚拟机的权重。使用 0 会禁用自动 ballooning。自动 ballooning 由 pvestatd 执行。

--skiplock <boolean>

忽略锁,只有 root 允许使用此选项。

--snapshot <boolean>

Qemu snapshot mode。虚拟机关机时 Qemu 会删除临时数据,虚拟机磁盘可始终保持干净。https://qemu-project.gitlab.io/qemu/system/images.html#disk-005fimages-005fsnapshot-005fmode

--smbios1 [base64=<1|0>] [,family=<Base64 encoded string>] [,manufacturer=<Base64 encoded string>] [,product=<Base64 encoded string>] [,serial=<Base64 encoded string>] [,sku=<Base64 encoded string>] [,uuid=<UUID>] [,version=<Base64 encoded string>]

指定 SMBIOS type 1 字段。

--smp <integer> (1 - N) (default = 1)

CPU 数量。请改用选项 -sockets。

--sockets <integer> (1 - N) (default = 1)

CPU socket 数量。

--spice_enhancements [foldersharing=<1|0>] [,videostreaming=<off|all|filter>]

配置 SPICE 的其他增强功能。

--sshkeys <filepath>

cloud-init:设置公共 SSH 密钥(每行一个密钥,OpenSSH 格式)。

--startdate (now | YYYY-MM-DD | YYYY-MM-DDTHH:MM:SS) (default = now)

设置实时时钟的初始日期。有效日期格式为:now2006-06-17T16:01:212006-06-17

--startup `[[order=]\d+] [,up=\d+] [,down=\d+] `

启动和关机行为。Order 是定义通用启动顺序的非负数。关机按相反顺序完成。此外,可以设置 updown 延迟(秒),用于指定启动或停止下一台虚拟机之前等待的延迟。

--tablet <boolean> (default = 1)

启用/禁用 USB tablet 设备。

--tags <string>

虚拟机标签。该信息仅为元信息。

--tdf <boolean> (default = 0)

启用/禁用时间漂移修复。

--template <boolean> (default = 0)

启用/禁用 Template。

--tpmstate0 [file=]<volume> [,import-from=<source volume>] [,size=<DiskSize>] [,version=<v1.2|v2.0>]

配置用于存储 TPM 状态的磁盘。格式固定为 raw。使用特殊语法 STORAGE_ID:SIZE_IN_GiB 分配新卷。注意,此处会忽略 SIZE_IN_GiB,并改用 4 MiB。使用 STORAGE_ID:0 和 import-from 参数可从现有卷导入。

--unused[n] [file=]<volume>

对未使用卷的引用。该项供内部使用,不应手动修改。

--usb[n] [[host=]<HOSTUSBDEVICE|spice>] [,mapping=<mapping-id>] [,usb3=<1|0>]

配置 USB 设备(n 为 0 到 4;对于 machine version >= 7.1 且 ostype 为 l26 或 windows > 7 的客户机,n 可达 14)。

--vcpus <integer> (1 - N) (default = 0)

热插拔 vcpu 数量。

--vga [[type=]<enum>] [,clipboard=<vnc>] [,memory=<integer>]

配置 VGA 硬件。

--virtio[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,cyls=<integer>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,heads=<integer>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,iothread=<1|0>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,ro=<1|0>] [,secs=<integer>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,trans=<none|lba|auto>] [,werror=<enum>]

将卷用作 VIRTIO 硬盘(n 为 0 到 15)。使用特殊语法 STORAGE_ID:SIZE_IN_GiB 分配新卷。使用 STORAGE_ID:0 和 import-from 参数可从现有卷导入。

--virtiofs[n] [dirid=]<mapping-id> [,cache=<enum>] [,direct-io=<1|0>] [,expose-acl=<1|0>] [,expose-xattr=<1|0>]

使用 Virtio-fs 在主机和客户机之间共享目录的配置。

--vmgenid <UUID> (default = 1 (autogenerated))

设置 VM Generation ID。使用 1 可在创建或更新时自动生成,传入 0 可显式禁用。

--vmstatestorage <storage ID>

VM 状态卷/文件的默认存储。

--watchdog [[model=]<i6300esb|ib700>] [,action=<enum>]

创建虚拟硬件 watchdog 设备。

qm showcmd <vmid> [OPTIONS]

显示用于启动虚拟机的命令行(调试信息)。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--pretty <boolean> (default = 0)

将每个选项放在新行上,以提升人工可读性。

--snapshot <string>

从给定快照获取配置值。

qm shutdown <vmid> [OPTIONS]

关闭虚拟机。这类似于按下物理机器上的电源按钮。它会向客户机 OS 发送 ACPI 事件,随后客户机 OS 应执行正常关机。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--forceStop <boolean> (default = 0)

确保虚拟机停止。

--keepActive <boolean> (default = 0)

不要停用存储卷。

--skiplock <boolean>

忽略锁,只有 root 允许使用此选项。

--timeout <integer> (0 - N)

等待最大超时时间(秒)。

qm snapshot <vmid> <snapname> [OPTIONS]

创建虚拟机快照。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

<snapname>: <string>

快照名称。

--description <string>

文本描述或注释。

--vmstate <boolean>

保存 vmstate。

qm start <vmid> [OPTIONS]

启动虚拟机。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--force-cpu <string>

使用给定字符串覆盖 QEMU 的 -cpu 参数。

--machine [[type=]<machine type>] [,enable-s3=<1|0>] [,enable-s4=<1|0>] [,viommu=<intel|virtio>]

指定 QEMU machine。

--migratedfrom <string>

集群节点名称。

--migration_network <string>

用于迁移的(子)网络 CIDR。

--migration_type <insecure | secure>

迁移流量默认使用 SSH tunnel 加密。在安全且完全私有的网络上,可以禁用此项以提升性能。

--skiplock <boolean>

忽略锁,只有 root 允许使用此选项。

--stateuri <string>

某些命令会从此位置保存/还原状态。

--targetstorage <string>

从源存储到目标存储的映射。仅提供单个存储 ID 会将所有源存储映射到该存储。提供特殊值 1 会将每个源存储映射到自身。

--timeout <integer> (0 - N) (default = max(30, vm memory in GiB))

等待最大超时时间(秒)。

qm status <vmid> [OPTIONS]

显示虚拟机状态。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--verbose <boolean>

详细输出格式。

qm stop <vmid> [OPTIONS]

停止虚拟机。qemu 进程会立即退出。这类似于拔掉运行中计算机的电源,可能损坏虚拟机数据。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--keepActive <boolean> (default = 0)

不要停用存储卷。

--migratedfrom <string>

集群节点名称。

--overrule-shutdown <boolean> (default = 0)

停止前尝试中止活动的 qmshutdown 任务。

--skiplock <boolean>

忽略锁,只有 root 允许使用此选项。

--timeout <integer> (0 - N)

等待最大超时时间(秒)。

qm suspend <vmid> [OPTIONS]

挂起虚拟机。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--skiplock <boolean>

忽略锁,只有 root 允许使用此选项。

--statestorage <storage ID>

虚拟机状态的存储。

Note 需要选项:todisk
--todisk <boolean> (default = 0)

如果设置,则将虚拟机挂起到磁盘。下次虚拟机启动时会恢复。

qm template <vmid> [OPTIONS]

创建 Template。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--disk <efidisk0 | ide0 | ide1 | ide2 | ide3 | nvme0 |nvme1 |nvme2 |nvme3 |nvme4 |nvme5 |sata0 | sata1 | sata2 | sata3 | sata4 | sata5 | scsi0 | scsi1 | scsi10 | scsi11 | scsi12 | scsi13 | scsi14 | scsi15 | scsi16 | scsi17 | scsi18 | scsi19 | scsi2 | scsi20 | scsi21 | scsi22 | scsi23 | scsi24 | scsi25 | scsi26 | scsi27 | scsi28 | scsi29 | scsi3 | scsi30 | scsi4 | scsi5 | scsi6 | scsi7 | scsi8 | scsi9 | tpmstate0 | virtio0 | virtio1 | virtio10 | virtio11 | virtio12 | virtio13 | virtio14 | virtio15 | virtio2 | virtio3 | virtio4 | virtio5 | virtio6 | virtio7 | virtio8 | virtio9>

如果只想将 1 块磁盘转换为基础镜像。

qm terminal <vmid> [OPTIONS]

使用串口设备打开终端(虚拟机需要已配置串口设备,例如 serial0: socket)。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--escape <string> (default = ^O)

转义字符。

--iface <serial0 | serial1 | serial2 | serial3>

选择串口设备。默认会直接使用第一个合适的设备。

qm unlink

qm disk unlink 的别名。

qm unlock <vmid>

解锁虚拟机。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

qm vncproxy <vmid>

将虚拟机 VNC 流量代理到 stdin/stdout。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

qm wait <vmid> [OPTIONS]

等待直到虚拟机停止。

<vmid>: <integer> (100 - 999999999)

虚拟机的(唯一)ID。

--timeout <integer> (1 - N)

超时时间(秒)。默认永久等待。

常用命令示例:

# qm list
# qm status 100
# qm config 100

DESCRIPTION

QEMU(Quick Emulator 的简称)是一个开源虚拟化管理程序,用于模拟一台物理计算机。 从运行 QEMU 的主机系统角度看,QEMU 是一个用户程序,可以访问分区、文件、网卡等本地资源, 并将这些资源传递给模拟出来的计算机;该计算机会像看到真实设备一样看到这些资源。

运行在模拟计算机中的客户操作系统会访问这些设备,并像运行在真实硬件上一样工作。 例如,可以将 ISO 镜像作为参数传递给 QEMU,模拟计算机中的操作系统就会看到一张真实的 CD-ROM 已插入 CD 驱动器。

QEMU 可以模拟从 ARM 到 Sparc 的多种硬件,但 Proxmox VE 只关注 32 位和 64 位 PC 兼容机模拟, 因为它代表了绝大多数服务器硬件。PC 兼容机模拟也是速度最快的模拟类型之一, 这是因为当模拟架构与主机架构相同时,可用的处理器扩展可以显著加速 QEMU。

Note 有时会遇到术语 KVM(Kernel-based Virtual Machine)。它表示 QEMU 通过 Linux KVM 模块,在虚拟化处理器扩展的支持下运行。在 Proxmox VE 语境中,QEMUKVM 可以互换使用,因为 Proxmox VE 中的 QEMU 总是会尝试加载 KVM 模块。

Proxmox VE 中的 QEMU 以 root 进程运行,因为访问块设备和 PCI 设备需要这样的权限。

模拟设备和半虚拟化设备

QEMU 模拟的 PC 硬件包括主板、网络控制器、SCSI、IDE 和 SATA 控制器、串口等 (完整列表可见 kvm(1) 手册页),它们全部由软件模拟。这些设备都是现有硬件设备的精确软件等价物; 如果客户机中运行的操作系统具备相应驱动,它就会像运行在真实硬件上一样使用这些设备。 这使 QEMU 能够运行_未修改_的操作系统。

不过这会带来性能成本,因为用软件运行原本应由硬件完成的工作,会让主机 CPU 承担大量额外任务。 为缓解这一问题,QEMU 可以向客户操作系统呈现_半虚拟化设备_,使客户操作系统知道自己运行在 QEMU 内部,并与虚拟化管理程序协作。

QEMU 依赖 virtio 虚拟化标准,因此能够呈现半虚拟化的 virtio 设备,包括半虚拟化通用磁盘控制器、 半虚拟化网卡、半虚拟化串口、半虚拟化 SCSI 控制器等。

Tip 只要条件允许,*强烈建议*使用 virtio 设备,因为它们能显著提升性能,并且通常维护得更好。 根据 bonnie++(8) 测量,与模拟 IDE 控制器相比,使用 virtio 通用磁盘控制器可使顺序写入吞吐量翻倍。 根据 iperf(1) 测量,使用 virtio 网络接口最多可达到模拟 Intel E1000 网卡三倍的吞吐量。
[参见 KVM wiki 上的此基准测试 https://www.linux-kvm.org/page/Using_VirtIO_NIC]

虚拟机设置

一般而言,Proxmox VE 会尝试为虚拟机(VM)选择合理默认值。请确保理解所修改设置的含义, 因为错误设置可能导致性能下降,或使数据面临风险。

常规设置

screenshot/gui-create-vm-general.png

虚拟机的常规设置包括:

  • Node:运行该 VM 的物理服务器

  • VM ID:此 Proxmox VE 安装中用于标识该 VM 的唯一编号

  • Name:可用于描述该 VM 的自由格式文本字符串

  • Resource Pool:VM 的逻辑分组

操作系统设置

screenshot/gui-create-vm-os.png

创建虚拟机(VM)时,设置正确的操作系统(OS)可让 Proxmox VE 优化一些低层参数。 例如,Windows 操作系统期望 BIOS 时钟使用本地时间,而基于 Unix 的操作系统期望 BIOS 时钟使用 UTC 时间。

系统设置

创建 VM 时,可以更改新 VM 的一些基础系统组件。可以指定要使用的 显示类型

screenshot/gui-create-vm-system.png

此外,也可以更改 SCSI 控制器。 如果计划安装 QEMU Guest Agent,或者所选 ISO 镜像已经附带并会自动安装它, 可以勾选 QEMU Agent 选项,让 Proxmox VE 知道可以使用其功能显示更多信息, 并更智能地完成某些操作(例如关机或快照)。

Proxmox VE 允许使用不同的固件和机器类型启动 VM,即 SeaBIOS 和 OVMF。 在大多数情况下,只有计划使用 PCIe 直通时,才需要从默认 SeaBIOS 切换到 OVMF。

机器类型

VM 的 Machine Type 定义了 VM 虚拟主板的硬件布局。可以在默认的 Intel 440FXQ35 芯片组之间选择;Q35 还提供虚拟 PCIe 总线,因此在需要直通 PCIe 硬件时可能更适合。 此外,还可以选择一种 vIOMMU 实现。

机器版本

每种机器类型在 QEMU 中都有版本,一个给定的 QEMU 二进制文件支持多个机器版本。 新版本可能带来新功能支持、修复或一般改进。不过,它们也会改变虚拟硬件属性。 为了避免从客户机角度发生突然变化,并确保 VM 状态、在线迁移以及带 RAM 快照的兼容性, 新的 QEMU 实例会继续使用相同机器版本。

对于 Windows 客户机,机器版本会在创建期间固定,因为 Windows 对虚拟硬件变化很敏感, 即使是在冷启动之间也是如此。例如,不同机器版本下网络设备枚举可能不同。 Linux 等其他操作系统通常可以很好地处理这类变化。对于这些系统,默认使用 Latest 机器版本。 这意味着在全新启动后,会使用 QEMU 二进制文件支持的最新机器版本 (例如 QEMU 8.1 支持的最新机器版本是每种机器类型的 8.1 版本)。

在实现会改变硬件布局的新功能或修复时,机器版本也作为一种保护机制,用于确保向后兼容性。 对于正在运行的 VM 上的操作(例如在线迁移),会保存运行中的机器版本,以确保 VM 能够精确恢复到原状态; 这不仅从 QEMU 虚拟化角度如此,也包括 Proxmox VE 如何创建 QEMU 虚拟机实例。

PVE 机器修订版

有时 Proxmox VE 需要在不等待新 QEMU 发布的情况下更改硬件布局或修改选项。 为此,Proxmox VE 添加了一个额外的下游修订版,形式为 +pveX。 在这些修订版中,每个新的 QEMU 机器版本的 X 为 0,并在这种情况下省略; 例如机器版本 pc-q35-9.2 与机器版本 pc-q35-9.2+pve0 相同。

如果 Proxmox VE 要更改硬件布局或默认选项,则会递增修订版,并用于新创建的客户机, 或用于始终使用最新机器版本的 VM 在重启后生效。

QEMU 机器版本弃用

从 QEMU 10.1 开始,机器版本会在 6 年后从上游 QEMU 中移除。在 Proxmox VE 中,主版本大约每 2 年发布一次, 因此一个 Proxmox VE 主版本将支持大约前两个 Proxmox VE 主版本中的机器版本。

在升级到新的 Proxmox VE 主版本之前,应更新 VM 配置,避免使用将在下一个 Proxmox VE 主版本中被移除的所有机器版本。 这可确保客户机在整个该版本周期内仍然可用。参见 更新到较新的机器版本一节。

该移除策略尚未对 Proxmox VE 8 生效,因此受支持机器版本的基线为 2.4。 预计 Proxmox VE 9 发布的最后一个 QEMU 二进制版本为 QEMU 11.2。 该 QEMU 二进制文件将移除对早于 6.0 的机器版本支持,因此 6.0 是 Proxmox VE 9 发布生命周期的基线。 预计每个 Proxmox VE 主版本的基线都会提高 2 个主版本,例如 Proxmox VE 10 的基线为 8.0。

更新到较新的机器版本

如果看到弃用警告,应将机器版本更改为较新的版本。请先确保有可用备份,并准备好处理客户机看到的硬件变化。 在某些场景中,可能需要重新安装特定驱动。还应检查是否存在使用这些机器版本创建的带 RAM 快照 (即 runningmachine 配置项)。遗憾的是,无法更改快照的机器版本,因此需要加载该快照来挽救其中的数据。

硬盘

总线/控制器

QEMU 可以模拟多种存储控制器:

Tip 出于性能原因,也因为维护状况更好,强烈建议使用 VirtIO SCSIVirtIO Block 控制器。
  • IDE 控制器的设计可追溯到 1984 年的 PC/AT 磁盘控制器。即使该控制器已被较新的设计取代, 你能想到的几乎所有操作系统都支持它,因此如果要运行 2003 年之前发布的操作系统,它是一个很好的选择。 该控制器最多可连接 4 个设备。

  • SATA(Serial ATA)控制器出现于 2003 年,设计更现代,允许更高吞吐量并可连接更多设备。 该控制器最多可连接 6 个设备。

  • NVME 控制器。该控制器最多可连接 6 个设备。

  • SCSI 控制器设计于 1985 年,常见于服务器级硬件,最多可连接 14 个存储设备。 Proxmox VE 默认模拟 LSI 53C895A 控制器。

    如果追求性能,建议使用 VirtIO SCSI single 类型的 SCSI 控制器,并为附加磁盘启用 IO Thread 设置。从 Proxmox VE 7.3 起,这是新建 Linux VM 的默认设置。 每个磁盘都会拥有自己的 VirtIO SCSI 控制器,QEMU 会在专用线程中处理磁盘 IO。 Linux 发行版自 2012 年起支持该控制器,FreeBSD 自 2014 年起支持。 对于 Windows 操作系统,在安装期间需要额外提供包含驱动程序的 ISO。

  • VirtIO Block 控制器通常简称为 VirtIO 或 virtio-blk,是一种较旧的半虚拟化控制器。 从功能角度看,它已被 VirtIO SCSI 控制器取代。

镜像格式

在每个控制器上,可以附加若干模拟硬盘;这些硬盘由位于已配置存储中的文件或块设备提供后端。 存储类型的选择将决定硬盘镜像格式。呈现块设备的存储(LVM、ZFS、Ceph)需要使用 raw disk image format,而基于文件的存储(Ext4、NFS、CIFS、GlusterFS)可在 raw disk image formatQEMU image format 之间选择。

  • QEMU image format 是一种写时复制格式,支持快照和磁盘镜像精简配置。

  • raw disk image 是硬盘的逐位镜像,类似于在 Linux 中对块设备执行 dd 命令得到的结果。 该格式本身不支持精简配置或快照,需要存储层配合完成这些任务。不过,它可能比 QEMU image format 快最多 10%。
    [详见此基准测试 https://events.static.linuxfound.org/sites/events/files/slides/CloudOpen2013_Khoa_Huynh_v3.pdf]

  • 只有在打算将磁盘镜像导入/导出到其他虚拟化管理程序时,VMware image format 才有意义。

缓存模式

设置硬盘的 Cache 模式会影响主机系统如何向客户系统通知块写入完成。 默认的 No cache 表示当每个块到达物理存储写入队列时,客户系统会被通知写入完成, 同时忽略主机页缓存。这在安全性和速度之间提供了良好平衡。

如果希望 Proxmox VE 备份管理器在备份 VM 时跳过某个磁盘,可以在该磁盘上设置 No backup 选项。

如果希望 Proxmox VE 存储复制机制在启动复制作业时跳过某个磁盘,可以在该磁盘上设置 Skip replication 选项。从 Proxmox VE 5.0 起,复制要求磁盘镜像位于 zfspool 类型的存储上; 因此,在 VM 已配置复制的情况下,如果向其他存储添加磁盘镜像,就需要为该磁盘镜像跳过复制。

Trim/Discard

如果存储支持_精简配置_(参见 Proxmox VE 指南中的存储章节),可以在驱动器上启用 Discard 选项。 设置 Discard 并使用支持 TRIM 的客户操作系统
[TRIM, UNMAP, and discard https://en.wikipedia.org/wiki/Trim_%28computing%29]
时,当 VM 文件系统在删除文件后将块标记为未使用, 控制器会将此信息转发给存储,随后存储会相应缩小磁盘镜像。 为了让客户机能够发出 TRIM 命令,必须在驱动器上启用 Discard 选项。 某些客户操作系统可能还要求设置 SSD Emulation 标志。 请注意,VirtIO Block 驱动器上的 Discard 仅支持使用 Linux Kernel 5.0 或更高版本的客户机。

如果希望某个驱动器在客户机中呈现为固态硬盘而不是旋转硬盘,可以在该驱动器上设置 SSD emulation 选项。底层存储不要求实际由 SSD 支撑;此功能可用于任何类型的物理介质。 请注意,VirtIO Block 驱动器不支持 SSD emulation

IO Thread

选项 IO Thread 只能在使用 VirtIO 控制器的磁盘时使用;或者在使用 SCSI 控制器且模拟控制器类型为 VirtIO SCSI single 时使用。启用 IO Thread 后,QEMU 会为每个存储控制器创建一个 I/O 线程, 而不是在主事件循环或 vCPU 线程中处理所有 I/O。其好处之一是更好地分配工作并利用底层存储。 另一个好处是在主机工作负载 I/O 非常密集时,减少客户机中的延迟(卡顿),因为主线程和 vCPU 线程都不会被磁盘 I/O 阻塞。

CPU

screenshot/gui-create-vm-cpu.png

CPU socket 是 PC 主板上可插入 CPU 的物理插槽。该 CPU 可以包含一个或多个 core, 这些核心是独立处理单元。从性能角度看,一个包含 4 个核心的 CPU 插槽,和两个各包含 2 个核心的 CPU 插槽通常差别不大。不过,某些软件许可证依赖机器拥有的插槽数量;在这种情况下, 将插槽数量设置为许可证允许的数量是有意义的。

增加虚拟 CPU(核心和插槽)数量通常会提升性能,但这高度依赖 VM 的用途。 多线程应用当然会受益于大量虚拟 CPU,因为每增加一个虚拟 CPU,QEMU 都会在主机系统上创建一个新的执行线程。 如果不确定 VM 的工作负载,通常将 Total cores 设置为 2 是比较稳妥的选择。

Note 如果所有 VM 的_总_核心数大于服务器核心数,这是完全安全的 (例如,在只有 8 个核心的机器上运行 4 个 VM,每个 VM 4 个核心,总计 16 个核心)。 在这种情况下,主机系统会在服务器核心之间平衡 QEMU 执行线程,就像运行标准多线程应用一样。 不过,Proxmox VE 会阻止启动虚拟 CPU 核心数超过物理可用核心数的 VM, 因为这只会由于上下文切换成本而降低性能。

资源限制

cpulimit

除了虚拟核心数量之外,还可以通过 cpulimit 选项设置 VM 可用的总 “Host CPU Time”。 这是一个表示 CPU 时间百分比的浮点值,因此 1.0 等于 100%2.5 等于 250%,依此类推。 如果单个进程完全使用一个核心,它的 CPU Time 使用率为 100%。 如果一个具有四个核心的 VM 完全使用所有核心,理论上会使用 400%。 实际使用率可能还会略高,因为除 vCPU 核心线程外,QEMU 还可能为 VM 外设创建额外线程。

当 VM 因并行运行某些进程而需要多个 vCPU,但整体上不应同时让所有 vCPU 以 100% 运行时,此设置很有用。

例如,假设某个虚拟机拥有 8 个虚拟 CPU 会受益,但你不希望它能够在满负载下占满全部 8 个核心, 因为这会使服务器过载,并让其他虚拟机和容器获得过少 CPU 时间。 为解决此问题,可以将 cpulimit 设置为 4.0(=400%)。 这意味着如果 VM 通过同时运行 8 个进程完全利用全部 8 个虚拟 CPU,每个 vCPU 最多会从物理核心获得 50% CPU 时间。 但是,如果 VM 工作负载只完全利用 4 个虚拟 CPU,它仍可从物理核心获得最多 100% CPU 时间,总计 400%。

Note 根据配置不同,VM 可能会使用额外线程,例如用于网络或 IO 操作,也可能用于在线迁移。 因此,VM 显示的 CPU 时间可能超过其虚拟 CPU 本身可使用的时间。要确保 VM 使用的 CPU 时间永不超过分配的 vCPU, 请将 cpulimit 设置为与总核心数相同的值。

cpuunits

通过 cpuunits 选项(现在通常称为 CPU shares 或 CPU weight),可以控制某个 VM 相对于其他正在运行的 VM 获得多少 CPU 时间。它是一个相对权重,默认值为 100(如果主机使用旧版 cgroup v1,则为 1024)。 如果为某个 VM 增大该值,调度器会相对于权重较低的其他 VM 优先调度它。

例如,如果 VM 100 设置为默认值 100,而 VM 200 改为 200,后者 VM 200 将获得前者 VM 100 两倍的 CPU 带宽。

更多信息请参见 man systemd.resource-control,其中 CPUQuota 对应 cpulimitCPUWeight 对应这里的 cpuunits 设置。参见其 Notes 章节以了解参考资料和实现细节。

affinity

通过 affinity 选项,可以指定用于运行 VM vCPU 的物理 CPU 核心。 VM 外围进程(例如用于 I/O 的进程)不受此设置影响。请注意,CPU affinity 不是安全功能

在某些情况下强制 CPU affinity 是有意义的,但会增加复杂性和维护工作量。 例如,稍后想要添加更多 VM,或将 VM 迁移到 CPU 核心更少的节点时。 如果某些 CPU 被完全占用而其他 CPU 几乎空闲,也很容易导致异步且受限的系统性能。

affinity 通过 taskset CLI 工具设置。它接受主机 CPU 编号(见 lscpu),格式为 man cpuset 中的 List Format。这个 ASCII 十进制列表可以包含数字,也可以包含数字范围。 例如,affinity 0-1,8-11(展开为 0, 1, 8, 9, 10, 11)将只允许 VM 在这六个特定主机核心上运行。

CPU 类型

QEMU 可以模拟从 486 到最新 Xeon 处理器的多种 CPU types。 每一代新处理器都会增加新功能,例如硬件辅助 3D 渲染、随机数生成、内存保护等。 当前代处理器也可以通过 微码更新获得缺陷修复或安全修复。

通常应为 VM 选择与主机系统 CPU 非常接近的处理器类型,因为这意味着主机 CPU 功能 (也称为 CPU flags)将在 VM 中可用。如果想要精确匹配,可以将 CPU 类型设置为 host,此时 VM 将拥有与主机系统完全相同的 CPU flags。

不过这也有缺点。如果要在不同主机之间对 VM 执行在线迁移,VM 可能最终运行在具有不同 CPU 类型或不同微码版本的新系统上。 如果传递给客户机的 CPU flags 缺失,QEMU 进程将停止。为解决此问题,QEMU 也提供自己的虚拟 CPU 类型, Proxmox VE 默认使用这些类型。

后端默认值为 kvm64,它基本适用于所有 x86_64 主机 CPU;在 UI 中创建新 VM 时的默认值为 x86-64-v2-AES,该值要求主机 CPU 对 Intel 至少为 Westmere,对 AMD 至少为第四代 Opteron。

简而言之:

如果不关心在线迁移,或者拥有同构集群,其中所有节点具有相同 CPU 和相同微码版本,则将 CPU 类型设置为 host; 理论上这会为客户机提供最高性能。

如果关心在线迁移和安全性,并且只有 Intel CPU 或只有 AMD CPU,则选择集群中最低代的 CPU 型号。

如果关心在线迁移但不关心安全性,或者拥有混合 Intel/AMD 集群,则选择最低兼容的虚拟 QEMU CPU 类型。

Note Intel 和 AMD 主机 CPU 之间的在线迁移不保证可以工作。

另请参见 QEMU 中定义的 AMD 和 Intel CPU 类型列表。

QEMU CPU 类型

QEMU 还提供虚拟 CPU 类型,同时兼容 Intel 和 AMD 主机 CPU。

Note 要为虚拟 CPU 类型缓解 Spectre 漏洞,需要添加相关 CPU flags,参见 Meltdown / Spectre 相关 CPU flags

历史上,Proxmox VE 使用 kvm64 CPU 型号,启用的 CPU flags 处于 Pentium 4 水平, 因此对某些工作负载而言性能并不理想。

2020 年夏季,AMD、Intel、Red Hat 和 SUSE 协作,在 x86-64 基线之上定义了三个 x86-64 微架构级别,并启用现代 flags。详情参见 x86-64-ABI specification

Note 一些较新的发行版(如 CentOS 9)现在以 x86-64-v2 flags 作为最低构建要求。
  • kvm64 (x86-64-v1):兼容 Intel CPU >= Pentium 4、AMD CPU >= Phenom。

  • x86-64-v2:兼容 Intel CPU >= Nehalem、AMD CPU >= Opteron_G3。 与 x86-64-v1 相比新增 CPU flags:+cx16+lahf-lm+popcnt+pni+sse4.1+sse4.2+ssse3

  • x86-64-v2-AES:兼容 Intel CPU >= Westmere、AMD CPU >= Opteron_G4。 与 x86-64-v2 相比新增 CPU flags:+aes

  • x86-64-v3:兼容 Intel CPU >= Broadwell、AMD CPU >= EPYC。 与 x86-64-v2-AES 相比新增 CPU flags:+avx+avx2+bmi1+bmi2+f16c+fma+movbe+xsave

  • x86-64-v4:兼容 Intel CPU >= Skylake、AMD CPU >= EPYC v4 Genoa。 与 x86-64-v3 相比新增 CPU flags:+avx512f+avx512bw+avx512cd+avx512dq+avx512vl

自定义 CPU 类型

可以指定包含可配置功能集的自定义 CPU 类型。这些类型由管理员在配置文件 /etc/pve/virtual-guest/cpu-models.conf 中维护。格式详情参见 man cpu-models.conf

任何在 /nodes 上具有 Sys.Audit 权限的用户都可以选择已指定的自定义类型。 通过 CLI 或 API 为 VM 配置自定义 CPU 类型时,名称需要带有 custom- 前缀。

Meltdown / Spectre 相关 CPU flags

有几个 CPU flags 与 Meltdown 和 Spectre 漏洞
[Meltdown Attack https://meltdownattack.com/]
相关;除非 VM 所选 CPU 类型已经默认启用这些 flags,否则需要手动设置。

要使用这些 CPU flags,需要满足两个要求:

  • 主机 CPU 必须支持该功能,并将其传播给客户机的虚拟 CPU

  • 客户操作系统必须更新到能够缓解这些攻击并使用该 CPU 功能的版本

否则,需要设置虚拟 CPU 所需的 CPU flag,可以通过在 Web UI 中编辑 CPU 选项, 或在 VM 配置文件中设置 cpu 选项的 flags 属性。

对于 Spectre v1、v2、v4 修复,CPU 或系统厂商还需要为你的 CPU 提供所谓的 “microcode update”,参见 固件更新章节。 请注意,并非所有受影响 CPU 都可以更新到支持 spec-ctrl。

要检查 Proxmox VE 主机是否存在漏洞,请以 root 身份执行以下命令:

for f in /sys/devices/system/cpu/vulnerabilities/*; do echo "${f##*/} -" $(cat "$f"); done

也可以使用社区脚本检测主机是否仍然存在漏洞。
[spectre-meltdown-checker https://meltdown.ovh/]

Intel 处理器

  • pcid

    这会降低名为 Kernel Page-Table Isolation (KPTI) 的 Meltdown (CVE-2017-5754) 缓解措施带来的性能影响;KPTI 会有效地向用户空间隐藏内核内存。 没有 PCID 时,KPTI 是一种成本相当高的机制
    [PCID is now a critical performance/security feature on x86 https://groups.google.com/forum/m/#!topic/mechanical-sympathy/L9mHTbeQLNU]

    要检查 Proxmox VE 主机是否支持 PCID,请以 root 身份执行以下命令:

    # grep ' pcid ' /proc/cpuinfo

    如果返回结果不为空,则主机 CPU 支持 pcid

  • spec-ctrl

    在 retpolines 不足的情况下,需要该标志以启用 Spectre v1 (CVE-2017-5753) 和 Spectre v2 (CVE-2017-5715) 修复。 带 -IBRS 后缀的 Intel CPU 型号默认包含该标志。 对于不带 -IBRS 后缀的 Intel CPU 型号,必须显式启用。 需要更新后的主机 CPU 微码(intel-microcode >= 20180425)。

  • ssbd

    需要该标志以启用 Spectre V4 (CVE-2018-3639) 修复。任何 Intel CPU 型号默认都不包含它。 所有 Intel CPU 型号都必须显式启用。 需要更新后的主机 CPU 微码(intel-microcode >= 20180703)。

AMD 处理器

  • ibpb

    在 retpolines 不足的情况下,需要该标志以启用 Spectre v1 (CVE-2017-5753) 和 Spectre v2 (CVE-2017-5715) 修复。 带 -IBPB 后缀的 AMD CPU 型号默认包含该标志。 对于不带 -IBPB 后缀的 AMD CPU 型号,必须显式启用。 在可供客户 CPU 使用前,需要主机 CPU 微码支持此功能。

  • virt-ssbd

    需要该标志以启用 Spectre v4 (CVE-2018-3639) 修复。 任何 AMD CPU 型号默认都不包含它。 所有 AMD CPU 型号都必须显式启用。 为了最大化客户机兼容性,即使也提供了 amd-ssbd,也应向客户机提供此标志。 请注意,使用 "host" CPU 型号时必须显式启用它,因为这是一个不存在于物理 CPU 中的虚拟功能。

  • amd-ssbd

    需要该标志以启用 Spectre v4 (CVE-2018-3639) 修复。 任何 AMD CPU 型号默认都不包含它。所有 AMD CPU 型号都必须显式启用。 它提供的性能高于 virt-ssbd,因此支持该功能的主机应尽可能始终将其暴露给客户机。 尽管如此,为了最大化客户机兼容性,也应暴露 virt-ssbd,因为某些内核只识别 virt-ssbd。

  • amd-no-ssb

    建议使用该标志来表明主机不受 Spectre V4 (CVE-2018-3639) 影响。 任何 AMD CPU 型号默认都不包含它。 未来硬件代际的 CPU 将不受 CVE-2018-3639 影响,因此应通过暴露 amd-no-ssb 告知客户机不要启用其缓解措施。 它与 virt-ssbd 和 amd-ssbd 互斥。

NUMA

也可以选择在 VM 中模拟 NUMA
[https://en.wikipedia.org/wiki/Non-uniform_memory_access]
架构。 NUMA 架构的基本含义是,内存不是作为所有核心都可访问的全局内存池存在, 而是分布在靠近每个插槽的本地内存区中。 由于内存总线不再是瓶颈,这可以带来速度提升。如果系统具有 NUMA 架构
[如果命令 numactl --hardware | grep available 返回多个节点,则主机系统具有 NUMA 架构]
, 建议启用该选项,因为这允许在主机系统上合理分配 VM 资源。 在 VM 中热插拔核心或 RAM 时也需要该选项。

如果使用 NUMA 选项,建议将插槽数量设置为主机系统的节点数量。

vCPU 热插拔

现代操作系统引入了在运行中系统内热插拔 CPU,并在一定程度上热移除 CPU 的能力。 虚拟化让我们能够避免真实硬件在这些场景中可能导致的许多(物理)问题。 不过,这仍是一个相当新且复杂的功能,因此应仅限于确实需要的场景。 大部分功能都可以用其他经过充分测试且复杂度更低的功能复现,参见 资源限制

在 Proxmox VE 中,可插入 CPU 的最大数量始终为 cores * sockets。 要以少于该总核心数的 CPU 启动 VM,可以使用 vcpus 设置; 它表示 VM 启动时应插入多少个 vCPU。

目前此功能仅在 Linux 上受支持,需要高于 3.10 的内核,建议使用高于 4.7 的内核。

可以使用如下 udev 规则,在客户机中自动将新 CPU 设置为 online:

SUBSYSTEM=="cpu", ACTION=="add", TEST=="online", ATTR{online}=="0", ATTR{online}="1"

将其保存在 /etc/udev/rules.d/ 下,并使用以 .rules 结尾的文件名。

注意:CPU 热移除依赖机器类型,并需要客户机配合。删除命令并不保证 CPU 移除实际发生; 通常它只是通过依赖目标的机制(例如 x86/amd64 上的 ACPI)转发给客户操作系统的请求。

内存

对于每个 VM,可以选择设置固定大小的内存,或让 Proxmox VE 根据主机当前 RAM 使用情况动态分配内存。

screenshot/gui-create-vm-memory.png
固定内存分配

当将 memory 和 minimum memory 设置为相同数值时,Proxmox VE 会直接为 VM 分配指定内存。

即使使用固定内存大小,ballooning 设备也会被添加到 VM 中,因为它会提供有用信息, 例如客户机实际使用了多少内存。 一般来说,应保持 ballooning 启用;但如果想要禁用它(例如用于调试),只需取消勾选 Ballooning Device 或设置

balloon: 0

到配置中。

自动内存分配

当 minimum memory 设置为低于 memory 时,Proxmox VE 会确保指定的最低内存始终可供 VM 使用; 如果主机 RAM 使用率低于某个目标百分比,则会动态向客户机添加内存,直到达到指定的最大内存。 目标百分比默认为 80%,可以 在节点选项中配置。

当主机 RAM 不足时,VM 会将部分内存释放回主机;必要时会交换正在运行的进程,并在最后手段下启动 oom killer。 主机和客户机之间的内存传递通过运行在客户机内部的特殊 balloon 内核驱动完成, 该驱动会从主机获取或释放内存页。
[这里有一篇对 balloon 驱动内部工作原理的良好说明 https://rwmj.wordpress.com/2010/07/17/virtio-balloon/]

当多个 VM 使用自动分配功能时,可以设置 Shares 系数,用于表示每个 VM 应获取的空闲主机内存相对份额。 例如,假设有四个 VM,其中三个运行 HTTP 服务器,最后一个运行数据库服务器。 主机配置为目标 RAM 使用率 80%。为了在有空闲 RAM 时让数据库服务器 RAM 缓存更多数据库块, 希望优先考虑数据库 VM。为此,可以为数据库 VM 分配 3000 的 Shares 属性, 其他 VM 保持默认 Shares 设置 1000。主机服务器有 32GB RAM,当前使用 16GB, 因此在已配置最低内存之外,还有 32 * 80/100 - 16 = 9GB RAM 可分配给 VM。 数据库 VM 将获得 9 * 3000 / (3000 + 1000 + 1000 + 1000) = 4.5 GB 额外 RAM, 每个 HTTP 服务器获得 1.5 GB。

2010 年之后发布的所有 Linux 发行版都包含 balloon 内核驱动。 对于 Windows 操作系统,需要手动添加 balloon 驱动,并且可能导致客户机变慢, 因此不建议在关键系统上使用它。

为 VM 分配 RAM 时,一个良好的经验规则是始终为主机保留 1GB 可用 RAM。

内存加密

AMD SEV

SEV(Secure Encrypted Virtualization)使用 AES-128 加密和 AMD Secure Processor 为每个 VM 启用内存加密。

SEV-ES(Secure Encrypted Virtualization - Encrypted State)还会加密所有 CPU 寄存器内容, 以防止信息泄露给虚拟化管理程序。

SEV-SNP(Secure Encrypted Virtualization - Secure Nested Paging)还尝试防止基于软件的完整性攻击。 更多信息参见 AMD SEV SNP white paper

主机要求:

  • AMD EPYC CPU

  • SEV-ES 仅支持 AMD EPYC 7002 系列及更新的 EPYC CPU

  • SEV-SNP 仅支持 AMD EPYC 7003 系列及更新的 EPYC CPU

  • SEV-SNP 要求主机内核版本为 6.11 或更高。

  • 在主机 BIOS 设置中配置 AMD memory encryption

  • 如果默认未启用,请向内核参数添加 "kvm_amd.sev=1"

  • 如果希望在主机上加密内存(SME),请向内核参数添加 "mem_encrypt=on", 参见 https://www.kernel.org/doc/Documentation/x86/amd-memory-encryption.txt

  • 可能需要增大 SWIOTLB,参见 https://github.com/AMDESE/AMDSEV#faq-4

要检查主机上是否启用了 SEV,请在 dmesg 中搜索 sev,并打印 kvm_amd 的 SEV 内核参数:

# dmesg | grep -i sev
[...] ccp 0000:45:00.1: sev enabled
[...] ccp 0000:45:00.1: SEV API: <buildversion>
[...] SEV supported: <number> ASIDs
[...] SEV-ES supported: <number> ASIDs
# cat /sys/module/kvm_amd/parameters/sev
Y

客户机要求:

  • edk2-OVMF

  • 建议使用 Q35

  • 客户操作系统必须包含 SEV 支持。

限制:

  • 由于内存已加密,主机上的内存使用量始终不准确。

  • 涉及保存或还原内存的操作(如快照和在线迁移)尚不能工作,或是 可被攻击的。

  • 不支持 PCI 直通。

  • SEV-ES 和 SEV-SNP 都非常实验性。

  • SEV-SNP 不支持 EFI 磁盘。

  • 使用 SEV-SNP 时,VM 内部的 reboot 命令只会关闭 VM。

示例配置 (SEV):

# qm set <vmid> -amd-sev type=std,no-debug=1,no-key-sharing=1,kernel-hashes=1

type 定义加密技术("type=" 不是必需的)。可用选项为 std、es 和 snp。

QEMU policy 参数通过 no-debugno-key-sharing 参数计算。 这些参数对应 policy-bit 0 和 1。如果 typees,则 policy-bit 2 设置为 1,从而启用 SEV-ES。 Policy-bit 3(nosend)始终设置为 1,以防止迁移攻击。 有关如何计算 policy 的更多信息,请参见: AMD SEV API Specification Chapter 3

为了与较旧 OVMF 镜像以及不测量 kernel/initrd 的客户机保持向后兼容,kernel-hashes 选项默认关闭。 参见 https://lists.gnu.org/archive/html/qemu-devel/2021-11/msg02598.html

检查 VM 中 SEV 是否工作

方法 1 - dmesg:

输出应类似如下:

# dmesg | grep -i sev
AMD Memory Encryption Features active: SEV

方法 2 - MSR 0xc0010131 (MSR_AMD64_SEV):

输出应为 1。

# apt install msr-tools
# modprobe msr
# rdmsr -a 0xc0010131
1

示例配置 (SEV-SNP):

# qm set <vmid> -amd-sev type=snp,allow-smt=1,no-debug=1,kernel-hashes=1

allow-smt policy-bit 默认已设置。如果通过将 allow-smt 设置为 0 来禁用它, 则必须在主机上禁用 SMT,VM 才能运行。

检查 VM 中 SEV-SNP 是否工作

# dmesg | grep -i snp
Memory Encryption Features active: AMD SEV SEV-ES SEV-SNP
SEV: Using SNP CPUID table, 29 entries present.
SEV: SNP guest platform device initialized.

链接:

网络设备

screenshot/gui-create-vm-network.png

每个 VM 可以有多个_网络接口控制器_(NIC),共有四种不同类型:

  • Intel E1000 是默认值,模拟 Intel 千兆网卡。

  • 如果追求最高性能,应使用 VirtIO 半虚拟化 NIC。与所有 VirtIO 设备一样, 客户操作系统应安装相应驱动。

  • Realtek 8139 模拟较旧的 100 MB/s 网卡,仅应在模拟较旧操作系统(2002 年之前发布)时使用。

  • vmxnet3 是另一种半虚拟化设备,只应在从其他虚拟化管理程序导入 VM 时使用。

Proxmox VE 会为每个 NIC 生成随机 MAC address,使 VM 可以在以太网网络中被寻址。

添加到 VM 的 NIC 可以采用以下两种模式之一:

  • 在默认 Bridged mode 下,每个虚拟 NIC 在主机上由一个 tap device (模拟以太网 NIC 的软件回环设备)提供后端。该 tap 设备会加入一个网桥,在 Proxmox VE 中默认为 vmbr0。 在此模式下,VM 可直接访问主机所在的以太网 LAN。

  • 在替代的 NAT mode 下,每个虚拟 NIC 只会与 QEMU 用户态网络栈通信; 其中内置路由器和 DHCP 服务器可以提供网络访问。该内置 DHCP 会在私有 10.0.2.0/24 范围内提供地址。 NAT 模式比桥接模式慢得多,应仅用于测试。此模式只能通过 CLI 或 API 使用,不能通过 Web UI 使用。

创建 VM 时,也可以选择 No network device 来跳过添加网络设备。

可以覆盖每个 VM 网络设备的 MTU 设置。选项 mtu=1 表示一种特殊情况, 其中 MTU 值会从底层网桥继承。此选项仅适用于 VirtIO 网络设备。

多队列

如果使用 VirtIO 驱动,可以选择启用 Multiqueue 选项。 该选项允许客户操作系统使用多个虚拟 CPU 处理网络数据包,从而增加传输的数据包总量。

在 Proxmox VE 中使用 VirtIO 驱动时,每个 NIC 网络队列都会传递给主机内核, 该队列会由 vhost 驱动生成的内核线程处理。启用此选项后,可以为每个 NIC 向主机内核传递_多个_网络队列。

使用 Multiqueue 时,建议将其设置为等于客户机 vCPU 数量的值。 请记住,vCPU 数量等于为 VM 配置的插槽数乘以核心数。 还需要使用以下 ethtool 命令,在 VM 中为每个 VirtIO NIC 设置多用途通道数量:

ethtool -L ens1 combined X

其中 X 是 VM 的 vCPU 数量。

要为 Windows 客户机配置 Multiqueue,请安装 Redhat VirtIO Ethernet Adapter drivers,然后按如下方式调整 NIC 配置。打开设备管理器,右键点击 "Network adapters" 下的 NIC,并选择 "Properties"。然后打开 "Advanced" 选项卡, 在左侧列表中选择 "Receive Side Scaling"。确保它设置为 "Enabled"。 接着在列表中找到 "Maximum number of RSS Queues",并将其设置为 VM 的 vCPU 数量。 确认设置正确后,点击 "OK" 进行确认。

请注意,将 Multiqueue 参数设置为大于 1 的值时,随着流量增加,主机和客户系统的 CPU 负载也会增加。 建议仅在 VM 必须处理大量传入连接时设置此选项,例如 VM 用作路由器、反向代理, 或作为繁忙的 HTTP 服务器执行长轮询时。

显示

QEMU 可以虚拟化几种 VGA 硬件。示例如下:

  • std,默认值,模拟带有 Bochs VBE 扩展的显卡。

  • cirrus,曾经是默认值,它模拟一个非常旧且带有各种问题的硬件模块。 此显示类型仅应在确有必要时使用
    [https://www.kraxel.org/blog/2014/10/qemu-using-cirrus-considered-harmful/ qemu: using cirrus considered harmful]
    ,例如使用 Windows XP 或更早版本时。

  • vmware,兼容 VMWare SVGA-II 的适配器。

  • ramfb,qemu ramfb 适配器。

  • mdev,由 vfio-pci 提供的 VGA 显示功能。选择它会启用 vGPU 设备显示其 framebuffer。 支持 NVIDIA 和 mthreads vGPU。

  • qxl,QXL 半虚拟化显卡。选择它还会为 VM 启用 SPICE(一种远程查看器协议)。

  • virtio-gl,通常称为 VirGL,是供 VM 内部使用的虚拟 3D GPU; 它可以将工作负载卸载到主机 GPU,而不需要特殊(昂贵)的型号和驱动, 也不会完全绑定主机 GPU,从而允许在多个客户机和/或主机之间复用。

    Note VirGL 支持需要一些额外库;由于这些库相对较大,并且并非所有 GPU 型号/厂商都提供开源版本, 因此默认不会安装。对于大多数设置,只需执行: apt install libgl1 libegl1

可以通过设置 memory 选项来编辑分配给虚拟 GPU 的内存量。 这可以在 VM 内启用更高分辨率,尤其是在使用 SPICE/QXL 时。

由于内存由显示设备预留,为 SPICE 选择 Multi-Monitor 模式(例如用于双显示器的 qxl2)会带来一些影响:

  • Windows 需要为每个显示器提供一个设备,因此如果 ostype 是某个 Windows 版本, Proxmox VE 会为 VM 的每个显示器额外提供一个设备。每个设备都会获得指定内存量。

  • Linux VM 始终可以启用更多虚拟显示器,但选择 Multi-Monitor 模式会将分配给设备的内存乘以显示器数量。

选择 serialX 作为显示 type 会禁用 VGA 输出,并将 Web Console 重定向到所选串口。 在这种情况下,已配置的显示 memory 设置会被忽略。

VNC 剪贴板

可以通过将 clipboard 设置为 vnc 来启用 VNC 剪贴板。

# qm set <vmid> -vga <displaytype>,clipboard=vnc

要使用剪贴板功能,必须先安装 SPICE guest tools。在基于 Debian 的发行版上, 可以通过安装 spice-vdagent 实现。对于其他操作系统,请在官方仓库中搜索它, 或参见:https://www.spice-space.org/download.html

安装 spice guest tools 后,就可以使用 VNC 剪贴板功能(例如在 noVNC 控制台面板中)。 不过,如果使用 SPICE、virtio 或 virgl,需要选择要使用的剪贴板。 这是因为当 clipboard 设置为 vnc 时,默认 SPICE 剪贴板会被 VNC 剪贴板替换。

USB 直通

USB 直通设备有两种不同类型:

  • 主机 USB 直通

  • SPICE USB 直通

主机 USB 直通通过将主机的 USB 设备提供给 VM 来工作。 这既可以通过 vendor-id 和 product-id 完成,也可以通过主机总线和端口完成。

vendor/product-id 形如 0123:abcd,其中 0123 是厂商 ID,abcd 是产品 ID; 这意味着同一款 USB 设备的两个实体具有相同 ID。

bus/port 形如 1-2.3.4,其中 1 是总线,2.3.4 是端口路径。 它表示主机的物理端口(取决于 USB 控制器的内部顺序)。

如果 VM 启动时某个设备存在于 VM 配置中,但该设备不存在于主机上,VM 仍可正常启动。 一旦该设备/端口在主机上可用,它就会被直通给 VM。

Warning 使用这种 USB 直通意味着无法将 VM 在线迁移到另一台主机, 因为该硬件只在 VM 当前所在主机上可用。

第二种直通类型是 SPICE USB 直通。如果向 VM 添加一个或多个 SPICE USB 端口, 就可以从 SPICE 客户端动态地将本地 USB 设备直通给 VM。 这对于临时重定向输入设备或硬件加密狗很有用。

也可以在集群级别映射设备,使其能够与 HA 正确配合使用,检测硬件变化,并允许非 root 用户配置。 详情参见 资源映射

BIOS 和 UEFI

为了正确模拟计算机,QEMU 需要使用固件。在常见 PC 上,这通常称为 BIOS 或 (U)EFI, 并在 VM 启动初期执行。它负责执行基本硬件初始化,并为操作系统提供访问固件和硬件的接口。 默认情况下,QEMU 使用 SeaBIOS 完成此任务;SeaBIOS 是一种开源 x86 BIOS 实现。 对于大多数标准设置,SeaBIOS 是不错的选择。

某些操作系统(例如 Windows 11)可能要求使用兼容 UEFI 的实现。 在这种情况下,必须改用 OVMF,它是开源 UEFI 实现。
[参见 OVMF 项目 https://github.com/tianocore/tianocore.github.io/wiki/OVMF]

对于 arm64/riscv64/loongarch64 设备,必须使用 OVMF 启动操作系统。

还有其他场景中 SeaBIOS 可能不是理想的启动固件,例如想要进行 VGA 直通时。
[Alex Williamson 有一篇关于此主题的优秀博客文章 https://vfio.blogspot.co.at/2014/08/primary-graphics-assignment-without-vga.html]

如果想要使用 OVMF,需要考虑几件事:

为了保存 boot order 等内容,需要有一个 EFI Disk。 该磁盘会包含在备份和快照中,并且只能有一个。

可以使用以下命令创建这样的磁盘:

# qm set <vmid> -efidisk0 <storage>:1,format=<format>,efitype=4m,pre-enrolled-keys=1

其中 <storage> 是要放置磁盘的存储,<format> 是该存储支持的格式。 也可以通过 Web 界面,在 VM 硬件部分使用 AddEFI Disk 创建此类磁盘。

efitype 选项指定应使用哪个版本的 OVMF 固件。对于新 VM,应始终使用 4m, 因为它支持 Secure Boot,并分配了更多空间以支持未来发展(这也是 GUI 中的默认值)。

pre-enroll-keys 指定 efidisk 是否应预加载发行版专用和 Microsoft Standard Secure Boot 密钥。 它还会默认启用 Secure Boot(不过仍可在 VM 内的 OVMF 菜单中禁用)。

Note 如果想在现有 VM 中开始使用 Secure Boot(该 VM 仍使用 2m efidisk),需要重新创建 efidisk。 为此,请删除旧磁盘(qm set <vmid> -delete efidisk0),并按上文所述添加新磁盘。 这会重置你在 OVMF 菜单中进行的所有自定义配置!

使用 OVMF 和虚拟显示(不使用 VGA 直通)时,需要在 OVMF 菜单中设置客户端分辨率 (启动期间按 ESC 键可进入该菜单),或者必须选择 SPICE 作为显示类型。

可信平台模块 (TPM)

Trusted Platform Module 是一种安全存储密钥等秘密数据的设备,并提供用于验证系统启动的防篡改功能。

某些操作系统(例如 Windows 11)要求机器(无论物理机还是虚拟机)附加此类设备。

通过指定 tpmstate 卷来添加 TPM。其工作方式类似 efidisk,一旦创建就不能更改(只能移除)。 可以通过以下命令添加:

# qm set <vmid> -tpmstate0 <storage>:1,version=<version>

其中 <storage> 是要存放状态的存储,<version>v1.2v2.0。 也可以通过 Web 界面,在 VM 硬件部分选择 AddTPM State 添加。

v2.0 TPM 规范更新且支持更好,因此除非有特定实现要求 v1.2 TPM,否则应优先使用它。

Note 与物理 TPM 相比,模拟 TPM *不会*提供任何真正的安全收益。 TPM 的意义在于其上的数据不能被轻易修改,除非通过 TPM 规范指定的命令。 而对于模拟设备,数据存储在普通卷上,因此任何有访问权限的人都可能编辑它。

VM 间共享内存

可以添加 VM 间共享内存设备(ivshmem),它允许在主机和客户机之间共享内存, 也允许在多个客户机之间共享内存。

可以使用 qm 添加此类设备:

# qm set <vmid> -ivshmem size=32,name=foo

其中大小单位为 MiB。文件将位于 /dev/shm/pve-shm-$name 下(默认名称为 vmid)。

Note 目前,一旦任何使用该设备的 VM 关闭或停止,该设备就会被删除。 已打开的连接仍会保留,但无法再建立到同一设备的新连接。

此类设备的一个用例是 Looking Glass
[Looking Glass: https://looking-glass.io/]
项目, 它支持主机与客户机之间的高性能、低延迟显示镜像。

音频设备

要添加音频设备,请运行以下命令:

qm set <vmid> -audio0 device=<device>

支持的音频设备包括:

  • ich9-intel-hda:Intel HD Audio Controller,模拟 ICH9

  • intel-hda:Intel HD Audio Controller,模拟 ICH6

  • AC97:Audio Codec '97,适用于 Windows XP 等较旧操作系统

有两个可用后端:

  • spice

  • none

spice 后端可以与 SPICE 结合使用;如果某些软件需要 VM 中存在音频设备才能工作, none 后端也可能有用。要使用主机的物理音频设备,请使用设备直通 (参见 PCI 直通USB 直通)。 Microsoft RDP 等远程协议也提供播放声音的选项。

VirtIO RNG

RNG(Random Number Generator)是一种向系统提供熵(randomness)的设备。 虚拟硬件 RNG 可用于从主机系统向客户 VM 提供这种熵。 这有助于避免客户机中的熵耗尽问题(即可用熵不足,系统可能变慢或出现问题),尤其是在客户机启动过程中。

要添加基于 VirtIO 的模拟 RNG,请运行以下命令:

qm set <vmid> -rng0 source=<source>[,max_bytes=X,period=Y]

source 指定在主机上从何处读取熵,必须是以下之一:

  • /dev/urandom:非阻塞内核熵池(首选)

  • /dev/random:阻塞内核池(不推荐,可能导致主机系统熵耗尽)

  • /dev/hwrng:直通附加到主机的硬件 RNG(如果有多个可用,将使用 /sys/devices/virtual/misc/hw_random/rng_current 中选择的一个)

可以通过 max_bytesperiod 参数指定限制,它们表示每 period 毫秒读取 max_bytes。 不过,这并不代表线性关系:1024B/1000ms 表示最多 1 KiB 数据会按 1 秒定时器变为可用, 而不是在一秒内向客户机流式传输 1 KiB。因此,减少 period 可用于以更快速度向客户机注入熵。

默认情况下,限制设置为每 1000 ms 1024 字节(1 KiB/s)。 建议始终使用限制器,以避免客户机使用过多主机资源。如果需要,可以将 max_bytes 设置为 0 以禁用所有限制。

Virtiofs

Virtiofs 是为虚拟环境设计的共享文件系统。它允许通过在 VM 内挂载主机上可用的目录树来共享该目录树。 它不使用网络栈,目标是提供与源文件系统相近的性能和语义。

要使用 virtiofs,需要在后台运行 virtiofsd 守护进程。 在 Proxmox VE 中,启动使用 virtiofs 挂载的 VM 时会自动完成此操作。

使用 kernel >=5.4 的 Linux VM 默认支持 virtiofs (virtiofs kernel module),但某些功能需要更新的内核。

要使用 virtiofs,请确保 Proxmox VE 主机上已安装 virtiofsd:

apt install virtiofsd

有一份 guide 说明如何在 Windows VM 中使用 virtiofs。

已知限制

  • 如果 virtiofsd 崩溃,其挂载点会在 VM 中挂起,直到 VM 完全停止。

  • virtiofsd 无响应可能导致 VM 中的挂载挂起,类似不可达的 NFS。

  • 内存热插拔不能与 virtiofs 组合使用(也会导致访问挂起)。

  • 与内存相关的功能,例如在线迁移、快照和休眠,不适用于 virtiofs 设备。

  • Windows 无法理解 virtiofs 上下文中的 ACL。因此,不要为 Windows VM 暴露 ACL, 否则 virtiofs 设备在 VM 内不可见。

为共享目录添加映射

要为共享目录添加映射,可以按 资源映射一节所述,直接使用 pvesh 调用 API:

pvesh create /cluster/mapping/dir --id dir1 \
    --map node=node1,path=/path/to/share1 \
    --map node=node2,path=/path/to/share2 \

向 VM 添加 virtiofs

要使用 virtiofs 共享目录,请向 VM 配置添加参数 virtiofs<N>(N 可以是 0 到 9 之间的任意值), 并使用已在资源映射中配置的目录 ID(dirid)。此外,可以根据需求将 cache 选项设置为 alwaysnevermetadataauto(默认值:auto)。不同缓存模式的行为可在 这里的 "Caching Modes" 章节阅读。

virtiofsd 支持 ACL 和 xattr 直通(可通过 expose-aclexpose-xattr 选项启用), 如果底层主机文件系统支持它们,则允许客户机访问 ACL 和 xattr;但它们也必须与客户文件系统兼容 (例如,大多数 Linux 文件系统支持 ACL,而 Windows 文件系统不支持)。

expose-acl 选项会自动隐含 expose-xattr,也就是说,如果 expose-acl 设置为 1, 再将 expose-xattr 设置为 0 不会产生差异。

如果希望 virtiofs 遵守 O_DIRECT 标志,可以将 direct-io 参数设置为 1(默认值:0)。 这会降低性能,但如果应用程序自行缓存,则很有用。

qm set <vmid> -virtiofs0 dirid=<dirid>,cache=always,direct-io=1
qm set <vmid> -virtiofs1 <dirid>,cache=never,expose-xattr=1
qm set <vmid> -virtiofs2 <dirid>,expose-acl=1

要在带有 Linux 内核 virtiofs 驱动的客户 VM 中临时挂载 virtiofs,请在客户机内运行以下命令:

mount -t virtiofs <dirid> <mount point>

要持久挂载 virtiofs,可以创建 fstab 条目:

<dirid> <mount point> virtiofs rw,relatime 0 0

与当前节点路径关联的 dirid 也会用作挂载标签(客户机上用于挂载设备的名称)。

有关可用 virtiofsd 参数的更多信息,请参见 GitLab virtiofsd 项目页面

设备启动顺序

QEMU 可以告知客户机应从哪些设备启动以及启动顺序。 这可以通过配置中的 boot 属性指定,例如:

boot: order=scsi0;net0;hostpci0
screenshot/gui-qemu-edit-bootorder.png

这样,客户机会首先尝试从磁盘 scsi0 启动;如果失败,则继续尝试从 net0 网络启动; 如果也失败,最后尝试从直通 PCIe 设备启动(如果是 NVMe,则视为磁盘;否则尝试进入 option ROM)。

在 GUI 中,可以使用拖放编辑器指定启动顺序,并使用复选框整体启用或禁用某些设备的启动能力。

Note 如果客户机使用多个磁盘启动操作系统或加载引导加载器,则所有这些磁盘都必须标记为 bootable (即必须启用复选框,或出现在配置列表中),客户机才能启动。 这是因为较新的 SeaBIOS 和 OVMF 版本只会初始化标记为 bootable 的磁盘。

无论如何,即使设备未出现在列表中或复选框被禁用,一旦客户机操作系统启动并初始化它们, 这些设备仍会对客户机可用。bootable 标志只影响客户机 BIOS 和引导加载器。

虚拟机自动启动和关闭

创建 VM 后,可能希望它们在主机系统启动时自动启动。 为此,需要在 Web 界面中 VM 的 Options 选项卡选择 Start at boot,或使用以下命令设置:

# qm set <vmid> -onboot 1
screenshot/gui-qemu-edit-start-order.png
启动和关闭顺序

在某些情况下,需要精细调整 VM 的启动顺序,例如某个 VM 为其他客户系统提供防火墙或 DHCP。 为此,可以使用以下参数:

  • Start/Shutdown order:定义启动顺序优先级。例如,如果希望 VM 第一个启动,请将其设置为 1。 (关闭时使用相反的启动顺序,因此启动顺序为 1 的机器会最后关闭。) 如果一台主机上的多个 VM 定义了相同顺序,它们还会按 VMID 升序排序。

  • Startup delay:定义此 VM 启动与后续 VM 启动之间的间隔。例如,如果希望在启动其他 VM 前等待 240 秒,请将其设置为 240。

  • Shutdown timeout:定义 Proxmox VE 在发出关闭命令后等待 VM 离线的秒数。 默认值为 180,这意味着 Proxmox VE 会发出关闭请求,并等待机器离线 180 秒。 如果超时后机器仍在线,将被强制停止。

Note 目前,由 HA 栈管理的 VM 不遵循 start on bootboot order 选项。 这些 VM 会被启动和关闭算法跳过,因为 HA 管理器本身会确保 VM 启动和停止。

请注意,未设置 Start/Shutdown order 参数的机器始终会在已设置该参数的机器之后启动。 此外,该参数只能在运行于同一主机上的虚拟机之间强制执行,不能在整个集群范围内强制执行。

如果需要在主机启动和第一个 VM 启动之间设置延迟,请参见 Proxmox VE 节点管理章节。

QEMU Guest Agent

QEMU Guest Agent 是运行在 VM 内部的服务,在主机和客户机之间提供通信通道。 它用于交换信息,并允许主机向客户机发出命令。

例如,VM 摘要面板中的 IP 地址就是通过 guest agent 获取的。

又如,在启动备份时,会通过 guest agent 告知客户机使用 fs-freezefs-thaw 命令同步未完成写入。

要让 guest agent 正常工作,必须执行以下步骤:

  • 在客户机中安装 agent,并确保它正在运行

  • 在 Proxmox VE 中启用通过 agent 的通信

安装 Guest Agent

对于大多数 Linux 发行版,都可以使用 guest agent。软件包通常名为 qemu-guest-agent

对于 Windows,可以从 Fedora VirtIO 驱动 ISO 安装。

启用 Guest Agent 通信

可以在 VM 的 Options 面板中启用 Proxmox VE 与 guest agent 的通信。 需要重新启动 VM,变更才会生效。

使用 QGA 自动 TRIM

可以启用 Run guest-trim 选项。启用后,在以下可能向存储写出零的操作之后, Proxmox VE 会向客户机发出 trim 命令:

  • 将磁盘移动到另一个存储

  • 将带本地存储的 VM 在线迁移到另一个节点

在精简配置存储上,这有助于释放未使用空间。

Note Linux 上的 ext4 有一个注意事项,因为它使用内存中优化来避免发出重复的 TRIM 请求。 由于客户机不知道底层存储变化,只有第一次 guest-trim 会按预期运行。 在下次重启之前,后续操作只会考虑此后发生变化的文件系统部分。

备份时文件系统 Freeze 和 Thaw

默认情况下,执行备份时会通过 fs-freeze QEMU Guest Agent 命令同步客户文件系统,以提供一致性。

在 Windows 客户机上,某些应用程序可能通过接入 Windows VSS(Volume Shadow Copy Service)层自行处理一致性备份; 此时 fs-freeze 可能会干扰它们。例如,已观察到在某些 SQL Server 上调用 fs-freeze 会触发 VSS 以破坏 SQL Server 差异备份链的模式调用 SQL Writer VSS 模块。

处理这种情况有两个选项。

  1. 配置 QEMU Guest Agent 使用不会干扰其他 VSS 用户的不同 VSS 变体。 Proxmox VE wiki 中有更多详情。

  2. 或者,可以通过将 freeze-fs-on-backup QGA 选项设置为 0, 配置 Proxmox VE 在备份时不发出 freeze-and-thaw 周期。 也可以通过 GUI 中的 Freeze/thaw guest filesystems on backup for consistency 选项完成。

    Important 禁用此选项可能导致备份中的文件系统不一致。因此,首选方式是在客户机中调整 QEMU Guest Agent 配置。

故障排查

VM 无法关闭

确保 guest agent 已安装并正在运行。

一旦启用 guest agent,Proxmox VE 会通过 guest agent 发送 shutdown 等电源命令。 如果 guest agent 未运行,命令无法正确执行,关闭命令会超时。

SPICE 增强

SPICE 增强是可选功能,可改善远程查看器体验。

要通过 GUI 启用它们,请进入虚拟机的 Options 面板。 要通过 CLI 启用它们,请运行以下命令:

qm set <vmid> -spice_enhancements foldersharing=1,videostreaming=all
Note 要使用这些功能,虚拟机的 Display 必须设置为 SPICE (qxl)。

文件夹共享

与客户机共享本地文件夹。客户机中需要安装 spice-webdavd 守护进程。 它会通过位于 http://localhost:9843 的本地 WebDAV 服务器提供共享文件夹。

对于 Windows 客户机,可以从 官方 SPICE 网站 下载 Spice WebDAV daemon 安装程序。

大多数 Linux 发行版都有名为 spice-webdavd 的可安装软件包。

要在 Virt-Viewer(Remote Viewer)中共享文件夹,请转到 File → Preferences。 选择要共享的文件夹,然后启用复选框。

Note 文件夹共享目前仅适用于 Linux 版本的 Virt-Viewer。
Caution 实验性功能!目前此功能工作并不可靠。

视频流

快速刷新的区域会被编码为视频流。有两个选项:

  • all:任何快速刷新的区域都会被编码为视频流。

  • filter:使用额外过滤器决定是否应使用视频流(目前只跳过小窗口表面)。

无法给出是否应启用视频流以及应选择哪个选项的一般性建议。实际效果会因具体情况而异。

故障排查

共享文件夹未显示

确保客户机中的 WebDAV 服务已启用并正在运行。在 Windows 上,它名为 Spice webdav proxy。 在 Linux 中,名称为 spice-webdavd,但可能因发行版而异。

如果服务正在运行,请在客户机浏览器中打开 http://localhost:9843 来检查 WebDAV 服务器。

重启 SPICE 会话可能会有所帮助。

迁移

screenshot/gui-qemu-migrate.png

如果有集群,可以使用以下命令将 VM 迁移到另一台主机:

# qm migrate <vmid> <target>

通常有两种机制:

  • 在线迁移(也称 Live Migration)

  • 离线迁移

在线迁移

如果 VM 正在运行且未配置本地绑定资源(例如直通设备),可以在 qm migration 命令调用中使用 --online 标志发起在线迁移。VM 运行时,Web 界面默认使用在线迁移。

工作原理

在线迁移首先在目标主机上以 incoming 标志启动新的 QEMU 进程。 该进程只执行基本初始化,客户 vCPU 仍保持暂停,然后等待源虚拟机的客户内存和设备状态数据流。 所有其他资源(例如磁盘)要么是共享的,要么已在 VM 运行时状态迁移开始前发送完成; 因此剩下需要传输的只有内存内容和设备状态。

建立此连接后,源端开始异步向目标端发送内存内容。如果源端的客户内存发生变化, 这些区域会被标记为 dirty,并再次发送客户内存数据。 该循环会重复执行,直到正在运行的源 VM 与 incoming 目标 VM 之间的数据差异足够小, 可以在几毫秒内发送完成;此时源 VM 可以完全暂停,且用户或程序不会察觉暂停, 随后将剩余数据发送到目标端,并恢复目标 VM 的 CPU,使其在远低于一秒的时间内成为新的运行 VM。

要求

要使 Live Migration 正常工作,需要满足以下条件:

  • VM 没有无法迁移的本地资源。例如,当前直通的 PCI 或 USB 设备会阻止在线迁移。 另一方面,本地磁盘可以通过发送到目标端来正常迁移。

  • 主机位于同一个 Proxmox VE 集群中。

  • 主机之间具有可用且可靠的网络连接。

  • 目标主机必须具有相同或更高版本的 Proxmox VE 软件包。 虽然有时反向也能工作,但无法保证。

  • 主机 CPU 来自同一厂商,并具有相似能力。不同厂商的 CPU 根据实际型号和配置的 VM CPU 类型 可能 可以工作,但无法保证,因此在将此类设置部署到生产环境之前请先测试。

离线迁移

如果有本地资源,只要所有磁盘都位于两台主机都定义的存储上,仍可离线迁移 VM。 迁移随后会像在线迁移一样,通过网络将磁盘复制到目标主机。 请注意,任何硬件直通配置都可能需要适配目标主机上的设备位置。

复制和克隆

screenshot/gui-qemu-full-clone.png

VM 安装通常使用操作系统厂商提供的安装介质(CD-ROM)完成。 根据操作系统不同,这可能是一个耗时任务,用户可能希望避免重复执行。

部署大量同类型 VM 的一种简单方法是复制现有 VM。 我们使用术语 clone 表示这类副本,并区分 linked 克隆和 full 克隆。

完整克隆

这种复制的结果是一个独立 VM。新 VM 不与原始 VM 共享任何存储资源。

可以选择 Target Storage,因此可利用它将 VM 迁移到完全不同的存储。 如果存储驱动支持多种格式,也可以更改磁盘镜像 Format

Note 完整克隆需要读取并复制所有 VM 镜像数据。这通常比创建链接克隆慢得多。

某些存储类型允许复制特定 Snapshot,默认是 current VM 数据。 这也意味着最终副本不会包含原始 VM 的任何额外快照。

链接克隆

现代存储驱动支持生成快速链接克隆的方式。这种克隆是一个可写副本,其初始内容与原始数据相同。 创建链接克隆几乎是瞬时完成的,并且最初不消耗额外空间。

它们称为 linked,是因为新镜像仍引用原始镜像。未修改的数据块从原始镜像读取, 而修改会写入(之后也从中读取)新的位置。该技术称为 Copy-on-write

这要求原始卷为只读。在 Proxmox VE 中,可以将任何 VM 转换为只读 模板。 之后可使用此类模板高效创建链接克隆。

Note 当链接克隆存在时,不能删除原始模板。

无法更改链接克隆的 Target storage,因为这是存储内部功能。

Target node 选项允许在不同节点上创建新 VM。唯一限制是 VM 位于共享存储上, 并且该存储在目标节点上也可用。

为避免资源冲突,所有网络接口 MAC 地址都会随机化,并且会为 VM BIOS(smbios1)设置生成新的 UUID

虚拟机模板

可以将 VM 转换为模板。此类模板是只读的,可用于创建链接克隆。

PXVIRT 有两种模板:pxvditemplate 和 template。Pxvditemplate 类型可以启动,常用于 VDI 场景。

Note 不能启动模板,因为这会修改磁盘镜像。如果想更改模板,请创建链接克隆并修改该克隆。

VM Generation ID

Proxmox VE 支持虚拟机 Generation ID(vmgenid
[官方 vmgenid 规范 https://docs.microsoft.com/en-us/windows/desktop/hyperv_v2/virtual-machine-generation-identifier]
。客户操作系统可以使用它检测导致时间偏移事件的任何事件,例如还原备份或回滚快照。

创建新 VM 时,会自动生成 vmgenid 并保存到其配置文件中。

要为已存在 VM 创建并添加 vmgenid,可以传递特殊值 ‘1’ 让 Proxmox VE 自动生成, 也可以手动设置 UUID
[在线 GUID 生成器 http://guid.one/]
作为其值,例如:

# qm set VMID -vmgenid 1
# qm set VMID -vmgenid 00000000-0000-0000-0000-000000000000
Note 首次向现有 VM 添加 vmgenid 设备,可能产生与快照回滚、备份还原等变更相同的效果, 因为 VM 可能将其解释为代际变化。

在少数不需要 vmgenid 机制的情况下,可以在创建 VM 时为其值传递 ‘0’, 或事后使用以下命令从配置中删除该属性:

# qm set VMID -delete vmgenid

vmgenid 最突出的用例是较新的 Microsoft Windows 操作系统;它们使用该机制避免在快照回滚、 备份还原或整个 VM 克隆操作中,对时间敏感或复制服务(例如数据库或域控制器
[https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/get-started/virtual-dc/virtualized-domain-controller-architecture]
) 产生问题。

导入虚拟机

可以通过多种方法从外部虚拟化管理程序或其他 Proxmox VE 集群导入现有虚拟机,最常见的方法包括:

  • 使用原生导入向导,它利用 import 内容类型,例如由 ESXi 特殊存储提供的内容类型。

  • 在源端执行备份,然后在目标端还原。该方法在从另一个 Proxmox VE 实例迁移时效果最好。

  • 使用 qm 命令行工具中专用于 OVF 的导入命令。

如果要从其他虚拟化管理程序将 VM 导入 Proxmox VE,建议先熟悉 Proxmox VE 的概念

导入向导

screenshot/gui-import-wizard-general.png

Proxmox VE 提供了一个集成式 VM 导入器,使用存储插件系统原生集成到 API 和基于 Web 的用户界面中。 可以使用它整体导入 VM,并将大部分配置映射到 Proxmox VE 配置模型,同时减少停机时间。

Note 导入向导是在 Proxmox VE 8.2 开发周期中添加的,目前处于技术预览状态。 虽然它已经很有前景且工作稳定,但仍在积极开发中。

要使用导入向导,必须先为导入源设置一个新存储;可以在 Web 界面中通过 Datacenter → Storage → Add 完成。

然后,可以在资源树中选择新存储,并使用 Virtual Guests 内容选项卡查看所有可导入的客户机。

screenshot/gui-import-wizard-advanced.png

选择其中一个,并使用 Import 按钮(或双击)打开导入向导。 可以在此修改可用选项的子集,然后启动导入。 请注意,导入完成后还可以进行更高级的修改。

Tip ESXi 导入向导已经使用 ESXi 6.5 到 8.0 版本测试。 请注意,使用 vSAN 存储的客户机不能直接导入;必须先将其磁盘移动到其他存储。 虽然可以使用 vCenter 作为导入源,但性能会显著下降(慢 5 到 10 倍)。

关于如何让虚拟客户机适配新的虚拟化管理程序的分步指南和提示,请参见我们的 迁移到 Proxmox VE wiki 文章

OVA/OVF 导入

要导入 OVA/OVF 文件,首先需要一个具有 import 内容类型的基于文件的存储。 在该存储上,会有一个 import 文件夹,可将 OVA 文件或带有相应镜像且采用扁平结构的 OVF 文件放入其中。 也可以使用 Web UI 直接上传或下载 OVA 文件。随后可以使用 Web UI 选择这些文件, 并使用导入向导导入客户机。

对于 OVA 文件,需要额外空间临时提取镜像。这需要一个配置了 images 内容类型的基于文件的存储。 默认选择源存储用于此目的,但也可以指定一个 Import Working Storage, 在导入到实际目标存储之前先在该存储上提取镜像。

Note 由于 OVA/OVF 文件结构和内容并不总是维护良好或定义清晰,可能需要手动调整某些客户机设置。 例如,SCSI 控制器类型几乎从不会在 OVA/OVF 文件中定义,但默认值无法使用 OVMF (UEFI) 启动, 因此在这些情况下应选择 Virtio SCSIVMware PVSCSI

通过 CLI 导入 OVF/OVA

来自外部虚拟化管理程序的 VM 导出通常采用一个或多个磁盘镜像的形式,并附带描述 VM 设置 (RAM、核心数量)的配置文件。+ 如果磁盘来自 VMware 或 VirtualBox,磁盘镜像可以是 vmdk 格式;如果磁盘来自 KVM 虚拟化管理程序, 则可以是 qcow2 格式。VM 导出最流行的配置格式是 OVF 标准,但实际互操作性有限, 因为许多设置未在标准本身中实现,虚拟化管理程序会在非标准扩展中导出补充信息。

除格式问题外,从其他虚拟化管理程序导入磁盘镜像时,如果不同虚拟化管理程序之间模拟硬件变化过大, 也可能失败。Windows VM 尤其受此影响,因为该操作系统对任何硬件变化都非常敏感。 可以在导出前安装互联网上可用的 MergeIDE.zip 实用工具,并在启动导入的 Windows VM 前选择 IDE 硬盘类型,以解决此问题。

最后还有半虚拟化驱动问题;这些驱动可提升模拟系统速度,并且特定于虚拟化管理程序。 GNU/Linux 和其他自由 Unix 操作系统默认已安装所有必要驱动,因此可以在导入 VM 后立即切换到半虚拟化驱动。 对于 Windows VM,需要自行安装 Windows 半虚拟化驱动。

GNU/Linux 和其他自由 Unix 通常可以顺利导入。请注意,由于上述问题,我们无法保证所有情况下都能成功导入/导出 Windows VM。

Windows OVF 导入分步示例

Microsoft 提供 Virtual Machines downloads 以便开始 Windows 开发。我们将使用其中一个来演示 OVF 导入功能。

下载虚拟机 zip

了解用户协议后,为 VMware 平台选择 Windows 10 Enterprise (Evaluation - Build),并下载 zip。

从 zip 中提取磁盘镜像

使用 unzip 工具或任意归档工具解压 zip,并通过 ssh/scp 将 ovf 和 vmdk 文件复制到 Proxmox VE 主机。

导入虚拟机

这会创建一个新虚拟机,使用从 OVF manifest 中读取的核心数、内存和 VM 名称, 并将磁盘导入到 local-lvm 存储。必须手动配置网络。

# qm importovf 999 WinDev1709Eval.ovf local-lvm

VM 已准备好启动。

向虚拟机添加外部磁盘镜像

也可以向 VM 添加现有磁盘镜像,该镜像可以来自外部虚拟化管理程序,也可以是自行创建的镜像。

假设使用 vmdebootstrap 工具创建了 Debian/Ubuntu 磁盘镜像:

vmdebootstrap --verbose \
 --size 10GiB --serial-console \
 --grub --no-extlinux \
 --package openssh-server \
 --package avahi-daemon \
 --package qemu-guest-agent \
 --hostname vm600 --enable-dhcp \
 --customize=./copy_pub_ssh.sh \
 --sparse --image vm600.raw

现在可以创建新的目标 VM,将镜像导入到存储 pvedir,并将其附加到 VM 的 SCSI 控制器:

# qm create 600 --net0 virtio,bridge=vmbr0 --name vm600 --serial0 socket \
   --boot order=scsi0 --scsihw virtio-scsi-pci --ostype l26 \
   --scsi0 pvedir:0,import-from=/path/to/dir/vm600.raw

VM 已准备好启动。

Cloud-Init 支持

Cloud-Init 是事实上的跨发行版软件包,用于处理 虚拟机实例的早期初始化。借助 Cloud-Init,可以在虚拟化管理程序侧配置网络设备和 ssh 密钥。当 VM 首次启动时,VM 内部的 Cloud-Init 软件会应用这些设置。

许多 Linux 发行版都提供可直接使用的 Cloud-Init 镜像,大多面向 OpenStack 设计。 这些镜像同样可以在 Proxmox VE 中使用。虽然获取这类即用镜像看起来很方便,但通常建议自行 准备镜像。这样做的优势是你能确切知道安装了哪些内容,也便于之后按需自定义镜像。

创建好 Cloud-Init 镜像后,建议将其转换为 VM 模板。通过 VM 模板可以快速创建链接克隆, 因此这是快速部署新 VM 实例的方法。启动新 VM 前,只需配置网络(以及可能需要的 ssh 密钥)。

建议使用基于 SSH 密钥的认证登录由 Cloud-Init 置备的 VM。也可以设置密码,但这不如 基于 SSH 密钥的认证安全,因为 Proxmox VE 需要在 Cloud-Init 数据中保存该密码的加密版本。

Proxmox VE 会生成一个 ISO 镜像,用于将 Cloud-Init 数据传递给 VM。因此,所有 Cloud-Init VM 都需要分配一个 CD-ROM 驱动器。通常还应添加串口控制台并将其用作显示设备。许多 Cloud-Init 镜像依赖这一点,这也是 OpenStack 的要求。不过,其他镜像可能不适用于这种 配置。如果串口控制台无法工作,请切回默认显示配置。

准备 Cloud-Init 模板

第一步是准备 VM。基本上可以使用任意 VM。只需在要准备的 VM *内部*安装 Cloud-Init 软件包即可。在基于 Debian/Ubuntu 的系统中,操作如下:

apt-get install cloud-init
Warning 该命令*不应*在 Proxmox VE 主机上执行,只应在 VM 内部执行。

许多发行版已经提供可直接使用的 Cloud-Init 镜像(以 .qcow2 文件形式提供),因此也可以 直接下载并导入这类镜像。下面的示例使用 Ubuntu 在 https://cloud-images.ubuntu.com 提供的 cloud image。

# download the image
wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img

# create a new VM with VirtIO SCSI controller
qm create 9000 --memory 2048 --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-pci

# import the downloaded disk to the local-lvm storage, attaching it as a SCSI drive
qm set 9000 --scsi0 local-lvm:0,import-from=/path/to/bionic-server-cloudimg-amd64.img
Note Ubuntu Cloud-Init 镜像要求 SCSI 驱动器使用 virtio-scsi-pci 控制器类型。
screenshot/gui-cloudinit-hardware.png
添加 Cloud-Init CD-ROM 驱动器

下一步是配置 CD-ROM 驱动器,它将用于向 VM 传递 Cloud-Init 数据。

qm set 9000 --ide2 local-lvm:cloudinit

为能够直接从 Cloud-Init 镜像启动,将 boot 参数设置为 order=scsi0,限制 BIOS 仅从此磁盘启动。这样可以加快启动速度,因为 VM BIOS 会跳过对可引导 CD-ROM 的检测。

qm set 9000 --boot order=scsi0

许多 Cloud-Init 镜像要求配置串口控制台并将其用作显示设备。但如果某个镜像无法使用该配置, 请改回默认显示配置。

qm set 9000 --serial0 socket --vga serial0

最后一步,将 VM 转换为模板会很有帮助。之后可以从该模板快速创建链接克隆。从 VM 模板部署 比创建完整克隆(副本)快得多。

qm template 9000

部署 Cloud-Init 模板

screenshot/gui-cloudinit-config.png

可以通过克隆轻松部署此类模板:

qm clone 9000 123 --name ubuntu2

然后配置用于认证的 SSH 公钥,并配置 IP 设置:

qm set 123 --sshkey ~/.ssh/id_rsa.pub
qm set 123 --ipconfig0 ip=10.0.10.123/24,gw=10.0.10.1

也可以只用一条命令配置所有 Cloud-Init 选项。上面的示例只是为了缩短行长度而拆分为多条 命令。还请确保根据你的具体环境调整 IP 设置。

自定义 Cloud-Init 配置

Cloud-Init 集成也允许使用自定义配置文件替代自动生成的配置。这可通过命令行中的 cicustom 选项完成:

qm set 9000 --cicustom "user=<volume>,network=<volume>,meta=<volume>"

自定义配置文件必须位于支持 snippets 的存储上,并且必须在 VM 可能迁移到的所有节点上可用。 否则 VM 将无法启动。例如:

qm set 9000 --cicustom "user=local:snippets/userconfig.yaml"

Cloud-Init 有三类配置。第一类是上例中的 user 配置,第二类是 network 配置,第三类是 meta 配置。它们可以一起指定,也可以按需组合。未指定自定义配置文件的部分,将使用自动 生成的配置。

可以导出生成的配置,作为自定义配置的基础:

qm cloudinit dump 9000 user

networkmeta 也支持同样的命令。

常用命令示例

在修改自定义配置前,可以先查看 Proxmox VE 当前生成的 Cloud-Init 内容:

qm cloudinit dump 9000 user
qm cloudinit dump 9000 network
qm cloudinit dump 9000 meta

Windows 上的 Cloud-Init

Windows 有一个 Cloud-Init 的重新实现,名为 cloudbase-init。 Cloudbase-Init 并不具备 Cloud-Init 的所有功能,部分功能也与 Cloud-Init 有所不同。

Cloudbase-Init 要求将 ostype 设置为任意 Windows 版本,并将 citype 设置为 configdrive2;对于任何 Windows ostype,后者都是默认值。

目前没有免费的 Windows 现成 cloud image。使用 Cloudbase-Init 需要手动安装并配置 Windows 客户机。

准备 Cloudbase-Init 模板

第一步是在 VM 中安装 Windows。然后在客户机中下载并安装 Cloudbase-Init。可能需要安装 Beta 版本。安装结束时不要运行 Sysprep,而应先配置 Cloudbase-Init。

常见需要设置的选项包括:

  • username: 设置管理员用户名

  • groups: 允许将用户添加到 Administrators

  • inject_user_password: 将其设置为 true,以允许在 VM 配置中设置密码

  • first_logon_behaviour: 将其设置为 no,登录时就不会要求设置新密码

  • rename_admin_user: 将其设置为 true,以允许将默认 Administrator 用户重命名为 username 指定的用户名

  • metadata_services: 将其设置为 cloudbaseinit.metadata.services.configdrive.ConfigDriveService,使 Cloudbase-Init 优先检查此服务。否则,Cloudbase-Init 在启动后可能需要几分钟才能完成 系统配置。

某些插件(例如 SetHostnamePlugin)需要重启,并会自动执行重启。要禁用 Cloudbase-Init 自动重启,可以将 allow_reboot 设置为 false

完整配置选项可在 官方 cloudbase-init 文档 中查看。

配置完成后创建一个快照通常很有意义,以便在部分配置仍需调整时回退。配置 Cloudbase-Init 之后,就可以开始创建模板。关闭 Windows 客户机,添加 Cloud-Init 磁盘,并将其转换为模板。

qm set 9000 --ide2 local-lvm:cloudinit
qm template 9000

将模板克隆为新的 VM:

qm clone 9000 123 --name windows123

然后设置密码、网络配置和 SSH 密钥:

qm set 123 --cipassword <password>
qm set 123 --ipconfig0 ip=10.0.10.123/24,gw=10.0.10.1
qm set 123 --sshkey ~/.ssh/id_rsa.pub

设置密码前,请确保 ostype 已设置为任意 Windows 版本。否则密码会被加密,而 Cloudbase-Init 会把加密后的密码当作明文密码使用。

全部设置完成后,启动克隆出的客户机。首次启动时登录不会成功,系统会因主机名变更而自动 重启。重启后,新密码应已设置完成,并且可以正常登录。

Cloudbase-Init 与 Sysprep

Sysprep 是用于重置 Windows 配置并提供一个 new 系统的功能。它可以与 Cloudbase-Init 配合使用,用于创建干净模板。

使用 Sysprep 时,需要调整 2 个配置文件。第一个是常规配置文件,第二个是以 -unattend.conf 结尾的文件。

Cloudbase-Init 分 2 步运行:首先是使用 -unattend.conf 的 Sysprep 阶段,然后是使用 主配置文件的常规阶段。

对于 Windows Server,使用随附的 Unattend.xml 文件运行 Sysprep 应该可以直接工作。 普通 Windows 版本则需要额外步骤:

  1. 打开一个 PowerShell 实例

  2. 启用 Administrator 用户:

    net user Administrator /active:yes`
  3. 使用 Administrator 用户安装 Cloudbase-Init

  4. 修改 Unattend.xml,加入在 sysprep 后首次启动时启用 Administrator 用户的命令:

    <RunSynchronousCommand wcm:action="add">
      <Path>net user administrator /active:yes</Path>
      <Order>1</Order>
      <Description>Enable Administrator User</Description>
    </RunSynchronousCommand>

    确保 <Order> 不与其他同步命令冲突。将 Cloudbase-Init 命令的 <Order> 修改为更大的值, 使其在该命令之后运行:<Order>2</Order>

  5. (仅 Windows 11)移除冲突的 Microsoft.OneDriveSync 软件包:

    Get-AppxPackage -AllUsers Microsoft.OneDriveSync | Remove-AppxPackage -AllUsers
  6. cd 进入 Cloudbase-Init 配置目录:

    cd 'C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf'
  7. (可选)在 Sysprep 前创建 VM 快照,以防配置错误

  8. 运行 Sysprep:

    C:\Windows\System32\Sysprep\sysprep.exe /generalize /oobe /unattend:Unattend.xml

完成上述步骤后,VM 应因 Sysprep 而处于关机状态。现在可以将其转换为模板,克隆后再按需 配置。

Cloud-Init 专用选项

cicustom: [meta=<volume>] [,network=<volume>] [,user=<volume>] [,vendor=<volume>]

指定自定义文件,用于在启动时替换自动生成的文件。

meta=<volume>

指定一个自定义文件,其中包含通过 cloud-init 传递给虚拟机的所有元数据。此内容与 provider 相关,意味着 configdrive2 和 nocloud 的格式不同。

network=<volume>

通过 cloud-init 向虚拟机传递包含所有网络数据的自定义文件。

user=<volume>

通过 cloud-init 向虚拟机传递包含所有用户数据的自定义文件。

vendor=<volume>

通过 cloud-init 向虚拟机传递包含所有 vendor 数据的自定义文件。

cipassword: <string>

要分配给用户的密码。通常不建议使用此项,应改用 SSH 密钥。另请注意,较旧版本的 cloud-init 不支持哈希密码。

citype: <configdrive2 | nocloud | opennebula>

指定 cloud-init 配置格式。默认值取决于配置的操作系统类型(ostype)。Linux 使用 nocloud 格式,Windows 使用 configdrive2

ciupgrade: <boolean> (default = 1)

首次启动后自动执行软件包升级。

ciuser: <string>

要修改 SSH 密钥和密码的用户名,用于替代镜像中配置的默认用户。

ipconfig[n]: [gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,ip=<IPv4Format/CIDR>] [,ip6=<IPv6Format/CIDR>]

为对应接口指定 IP 地址和网关。

IP 地址使用 CIDR 表示法;网关为可选项,但必须已指定同类型的 IP 地址。

IP 地址可以使用特殊字符串 dhcp 来启用 DHCP;在这种情况下不应提供显式网关。 对于 IPv6,可以使用特殊字符串 auto 来启用无状态自动配置。这需要 cloud-init 19.4 或更新版本。

如果启用了 cloud-init,且既未指定 IPv4 地址也未指定 IPv6 地址,则默认对 IPv4 使用 dhcp。

gw=<GatewayIPv4>

IPv4 流量的默认网关。

Note 需要选项:ip
gw6=<GatewayIPv6>

IPv6 流量的默认网关。

Note 需要选项:ip6
ip=<IPv4Format/CIDR> (default = dhcp)

CIDR 格式的 IPv4 地址。

ip6=<IPv6Format/CIDR> (default = dhcp)

CIDR 格式的 IPv6 地址。

nameserver: <string>

设置容器的 DNS 服务器 IP 地址。创建时如果既未设置 searchdomain 也未设置 nameserver,则会自动使用主机上的设置。

searchdomain: <string>

设置容器的 DNS 搜索域。创建时如果既未设置 searchdomain 也未设置 nameserver,则会自动使用主机上的设置。

sshkeys: <string>

设置 SSH 公钥(每行一个密钥,OpenSSH 格式)。

PCI(e) 直通

PCI(e) 直通是一种机制,可将主机上的 PCI 设备控制权交给虚拟机。相比使用虚拟化 硬件,它可能具备一些优势,例如更低延迟、更高性能,或更多功能(例如 offloading)。

但是,如果将某个设备直通给虚拟机,就无法再在主机或任何其他虚拟机中使用该设备。

请注意,PCI 直通可用于 i440fx 和 q35 机型,而 PCIe 直通仅可用于 q35 机型。这并 不意味着支持 PCIe 的设备在以 PCI 设备方式直通时只能以 PCI 速度运行。以 PCIe 方式直通设备只是为客户机设置一个标志,告诉它该设备是 PCIe 设备,而不是“非常快 的传统 PCI 设备”。某些客户机应用会因此受益。

通用要求

由于直通是在真实硬件上执行的,因此需要满足一些要求。下面简要概述这些要求;有关 特定设备的更多信息,请参见 PCI Passthrough Examples

硬件

你的硬件需要支持具备 interrupt remapping 能力的 IOMMUI/O Memory Management Unit),这包括 CPU 和主板。

通常,带 VT-d 的 Intel 系统以及带 AMD-Vi 的 AMD 系统支持此功能。但由于硬件实现 不佳、驱动缺失或驱动质量较低,并不能保证所有配置都能开箱即用。

此外,服务器级硬件通常比消费级硬件提供更好的支持,但即便如此,许多现代系统也 可以支持此功能。

请咨询硬件供应商,确认其是否在你的特定配置下支持 Linux 上的此功能。

确定 PCI 卡地址

最简单的方法是在虚拟机的硬件选项卡中,通过 GUI 添加类型为 "Host PCI" 的设备。 也可以使用命令行。

可以使用以下命令定位你的设备:

 lspci

配置

确认硬件支持直通后,需要进行一些配置以启用 PCI(e) 直通。

IOMMU

需要在 BIOS/UEFI 中启用 IOMMU 支持。通常对应设置称为 IOMMUVT-d,但具体 选项名称应以主板手册为准。

在 AMD CPU 上,IOMMU 默认启用。对于较新的内核(6.8 或更新版本),Intel CPU 也 是如此。在较旧内核上,需要通过在 内核命令行中添加以下内容,为 Intel CPU 启用该功能:

 intel_iommu=on
IOMMU 直通模式

如果硬件支持 IOMMU 直通模式,启用该模式可能会提升性能。这是因为虚拟机会绕过 hypervisor 通常执行的(默认)DMA 转换,而是将 DMA 请求直接传递给硬件 IOMMU。 要启用这些选项,请添加:

 iommu=pt

到 内核命令行。

在 arm64/loongarch64 平台上,IOMMU 直通默认已启用。如果未使用 pve-port-kernel, 要启用这些选项,请添加:

 iommu.passthrough=1
内核模块

必须确保加载以下模块。可以通过将它们添加到 '/etc/modules'' 来实现。

Note
中介设备直通

如果直通 mediated devices(例如 vGPU),则不需要以下内容。在这些情况下,设备会 直接由相应主机驱动拥有。

 vfio
 vfio_iommu_type1
 vfio_pci

更改任何与模块相关的内容后,需要刷新 initramfs。在 Proxmox VE 上可以执行:

# update-initramfs -u -k all

要检查模块是否已加载,以下命令的输出:

# lsmod | grep vfio

应包含上面列出的四个模块。

完成配置

最后重启以使变更生效,并检查它确实已启用。

# dmesg |grep iommu

应显示 Adding to iommu group X。根据硬件和内核不同,确切消息可能有所差异。

有关如何排查或验证 IOMMU 是否按预期工作的说明,请参见我们 Wiki 中的 Verifying IOMMU Parameters 章节。

还需要确保要直通的设备位于*单独*的 IOMMU 组中。可以通过调用 Proxmox VE API 检查:

# pvesh get /nodes/{nodename}/hardware/pci --pci-class-blacklist ""

如果设备与其功能(例如 GPU 及其 HDMI Audio 设备)、root port 或 PCI(e) bridge 位于同一个 IOMMU 组中,这是可以接受的。

常用命令示例

以下命令常用于确认 PCI 设备、驱动绑定和 IOMMU 分组状态:

# lspci -nn
# lspci -nnk
# pvesh get /nodes/{nodename}/hardware/pci --pci-class-blacklist ""
Note
PCI(e) slots

某些平台对物理 PCI(e) 插槽的处理方式不同。因此,如果没有得到期望的 IOMMU 组 隔离效果,有时将卡插入另一个 PCI(e) 插槽会有所帮助。

Note
不安全中断

对于某些平台(arm64/loongarch64),可能需要允许不安全中断。为此,请在 /etc/modprobe.d/ 中以 ‘.conf’ 结尾的文件里添加以下行:

 options vfio_iommu_type1 allow_unsafe_interrupts=1

请注意,此选项可能使系统不稳定。

GPU 直通说明

无法通过 Proxmox VE Web 界面中的 NoVNC 或 SPICE 显示 GPU 的 framebuffer。

直通整块 GPU 或 vGPU 且需要图形输出时,必须将显示器物理连接到该显卡,或者在 客户机内部配置远程桌面软件(例如 VNC 或 RDP)。

如果只是希望将 GPU 用作硬件加速器,例如用于使用 OpenCL 或 CUDA 的程序,则不 需要这样做。

主机设备直通

PCI(e) 直通最常见的形式是直通整块 PCI(e) 卡,例如 GPU 或网卡。

主机配置

Proxmox VE 会尝试自动使 PCI(e) 设备对主机不可用。不过,如果该机制不起作用,可以采取 两种方式:

  • 通过添加以下内容,将设备 ID 传递给 vfio-pci 模块选项

     options vfio-pci ids=1234:5678,4321:8765

    /etc/modprobe.d/ 中的 .conf 文件,其中 1234:56784321:8765 是通过 以下命令获得的厂商和设备 ID:

    # lspci -nn
  • 在主机上完全 blacklist 该驱动,确保它可以自由绑定用于直通,使用

     blacklist DRIVERNAME

    写入 /etc/modprobe.d/ 中的 .conf 文件。

    要查找驱动名称,请执行

    # lspci -k

    例如:

    # lspci -k | grep -A 3 "VGA"

    会输出类似如下内容:

    01:00.0 VGA compatible controller: NVIDIA Corporation GP108 [GeForce GT 1030] (rev a1)
            Subsystem: Micro-Star International Co., Ltd. [MSI] GP108 [GeForce GT 1030]
            Kernel driver in use: <some-module>
            Kernel modules: <some-module>

    现在可以将驱动写入 .conf 文件来 blacklist 它们:

    echo "blacklist <some-module>" >> /etc/modprobe.d/blacklist.conf

对于这两种方法,都需要再次 更新 initramfs,然后重启。

如果仍然不起作用,可能需要设置软依赖,使 GPU 模块在加载 vfio-pci 之前加载。 可以使用 softdep 标志实现;更多信息也可参见 modprobe.d 的 manpage。

例如,如果使用名为 <some-module> 的驱动:

# echo "softdep <some-module> pre: vfio-pci" >> /etc/modprobe.d/<some-module>.conf
验证配置

要检查变更是否成功,可以使用

# lspci -nnk

并检查设备条目。如果其中显示:

Kernel driver in use: vfio-pci

或者完全没有 in use 行,则该设备已准备好用于直通。

Note
中介设备

对于 mediated devices,该行会有所不同,因为设备会直接由主机驱动拥有,而不是 vfio-pci

虚拟机配置

直通 GPU 时,使用 q35 作为机型、使用 OVMF(虚拟机中的 UEFI)而不是 SeaBIOS、使用 PCIe 而不是 PCI,可获得最佳兼容性。请注意,如果要使用 OVMF 进行 GPU 直通,GPU 需要具备支持 UEFI 的 ROM;否则请改用 SeaBIOS。要检查 ROM 是否支持 UEFI,请参见 PCI Passthrough Examples Wiki。

此外,在使用 OVMF 时,可能可以禁用 vga arbitration,从而减少启动期间需要运行的 legacy code 数量。要禁用 vga arbitration:

 echo "options vfio-pci ids=<vendor-id>,<device-id> disable_vga=1" > /etc/modprobe.d/vfio.conf

将 <vendor-id> 和 <device-id> 替换为从以下命令获取的值:

# lspci -nn

可以在 Web 界面的虚拟机硬件部分添加 PCI 设备。也可以使用命令行;在虚拟机配置 中设置 hostpciX 选项,例如执行:

# qm set VMID -hostpci0 00:02.0

或者向虚拟机配置文件添加一行:

 hostpci0: 00:02.0

如果设备有多个功能(例如 ‘00:02.0’ 和 ‘00:02.1),可以使用缩写语法 ``00:02` 将它们一起直通。这等同于在 Web 界面中勾选 ``All Functions`’ 复选框。

根据设备和客户机操作系统不同,可能需要使用一些选项:

  • x-vga=on|off 将 PCI(e) 设备标记为虚拟机的主 GPU。启用后,vga 配置选项会被 忽略。

  • pcie=on|off 告诉 Proxmox VE 使用 PCIe 还是 PCI 端口。某些客户机/设备组合需要 PCIe 而不是 PCI。PCIe 仅适用于 q35 机型。

  • rombar=on|off 使 firmware ROM 对客户机可见。默认为 on。某些 PCI(e) 设备需要 禁用此项。

  • ramfb=on|off 为 vgpu 设备显示 ramfb 设备。默认为 on。

  • romfile=<path> 是设备使用的 ROM 文件的可选路径。这是 /usr/share/kvm/ 下的 相对路径。

示例

以下示例展示将 GPU 设置为主设备的 PCIe 直通:

# qm set VMID -hostpci0 02:00,pcie=on,x-vga=on
PCI ID 覆盖

可以覆盖客户机看到的 PCI vendor ID、device ID 和 subsystem ID。如果设备是某个 变体,其 ID 无法被客户机驱动识别,但你仍希望强制加载这些驱动,这会很有用 (例如你知道该设备与受支持变体使用相同芯片组)。

可用选项包括 vendor-iddevice-idsub-vendor-idsub-device-id。可以 设置其中任意一个或全部选项,以覆盖设备的默认 ID。

例如:

# qm set VMID -hostpci0 02:00,device-id=0x10f6,sub-vendor-id=0x0000

SR-IOV

PCI(e) 设备直通的另一种形式,是在设备可用时使用其硬件虚拟化功能。

Note
启用 SR-IOV

要使用 SR-IOV,平台支持尤其重要。可能需要先在 BIOS/UEFI 中启用此功能,或者使用 特定 PCI(e) 端口才能工作。如有疑问,请查阅平台手册或联系供应商。

SR-IOVSingle-Root Input/Output Virtualization)允许单个 设备向系统提供多个 VFVirtual Functions)。每个 VF 都可以在不同虚拟机 中使用,具备完整硬件功能,并且相比软件虚拟化设备具有更好的性能和更低延迟。

目前最常见的使用场景是支持 SR-IOV 的 NIC(Network Interface Card), 它们可以为每个物理端口提供多个 VF。这允许在虚拟机内部使用 checksum offloading 等功能,从而降低(主机)CPU 开销。

主机配置

通常,有两种方法可在设备上启用 virtual functions。

  • 有时驱动模块会提供相应选项,例如某些 Intel 驱动

     max_vfs=4

    可将其放入 /etc/modprobe.d/ 下以 .conf 结尾的文件中。 (之后不要忘记更新 initramfs)

    请参阅驱动模块文档以了解确切参数和选项。

  • 第二种更通用的方法是使用 sysfs。如果设备和驱动支持此方式,可以动态更改 VF 数量。例如,要在设备 0000:01:00.0 上设置 4 个 VF,请执行:

    # echo 4 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs

    要使此变更持久化,可以使用 Debian 软件包 ‘sysfsutils`。安装后,通过 /etc/sysfs.conf/etc/sysfs.d/ 中的 `FILE.conf’ 进行配置。

虚拟机配置

创建 VF 后,使用 lspci 输出时应能看到它们作为独立 PCI(e) 设备出现。获取它们的 ID,并像 普通 PCI(e) 设备一样进行直通。

中介设备(vGPU、GVT-g)

中介设备是另一种让虚拟化硬件复用物理硬件功能和性能的方法。它们最常见 于虚拟化 GPU 部署,例如 Intel 的 GVT-g,以及 NVIDIA 在其 GRID 技术中使用的 vGPU。

通过这种方式,物理卡可以创建虚拟卡,类似于 SR-IOV。区别在于中介设备 不会在主机中显示为 PCI(e) 设备,因此只适合在虚拟机中使用。

主机配置

通常,你的显卡驱动必须支持该功能,否则无法工作。因此,请向供应商了解兼容驱动 以及配置方法。

Intel 的 GVT-g 驱动已集成在内核中,应可与第 5、第 6、第 7 代 Intel Core 处理器, 以及 E3 v4、E3 v5 和 E3 v6 Xeon 处理器配合使用。

要为 Intel Graphics 启用它,必须确保加载 kvmgt 模块(例如通过 /etc/modules), 并在 内核命令行中启用它,添加以下参数:

 i915.enable_gvt=1

之后记得 更新 initramfs,并重启 主机。

虚拟机配置

要使用 mediated device,只需在 hostpciX 虚拟机配置选项上指定 mdev 属性。

可以通过 sysfs 获取支持的设备。例如,要列出设备 0000:00:02.0 支持的类型,只需 执行:

# ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types

每个条目都是一个目录,其中包含以下重要文件:

  • available_instances 包含该类型仍可用的实例数量;虚拟机中每使用一个 mdev 都会 减少该数量。

  • description 包含该类型能力的简短描述。

  • create 是创建此类设备的端点;如果配置了带 mdevhostpciX 选项,Proxmox VE 会自动为你执行此操作。

使用 Intel GVT-g vGPUIntel Skylake 6700k)的配置示例:

# qm set VMID -hostpci0 00:02.0,mdev=i915-GVTg_V5_4

设置后,Proxmox VE 会在虚拟机启动时自动创建此类设备,并在虚拟机停止时再次清理它。

在集群中使用

也可以在集群层级映射设备,以便它们可与 HA 正确配合使用、可检测硬件变更,并且 非 root 用户也可以配置它们。有关详情,请参见 Resource Mapping

vIOMMU(模拟 IOMMU)

vIOMMU 是在虚拟机内部对硬件 IOMMU 的模拟,可为虚拟化 I/O 设备提供更好的内存 访问控制和安全性。使用 vIOMMU 选项还允许通过 Nested Virtualization,在 level-1 虚拟机中将 PCI(e) 设备直通给 level-2 虚拟机。要将物理 PCI(e) 设备从 主机直通到嵌套虚拟机,请遵循 PCI(e) 直通说明。

目前有两种可用的 vIOMMU 实现:Intel 和 VirtIO。

Intel vIOMMU

Intel vIOMMU 特定的虚拟机要求:

  • 无论主机使用 Intel 还是 AMD CPU,都必须在虚拟机内核参数中设置 intel_iommu=on

  • 要使用 Intel vIOMMU,需要将 q35 设置为机型。

如果满足所有要求,可以在应能够直通 PCI 设备的虚拟机配置中,将 viommu=intel 添加到 machine 参数。

# qm set VMID -machine q35,viommu=intel

VirtIO vIOMMU

该 vIOMMU 实现较新,没有 Intel vIOMMU 那么多限制,但目前在生产环境中使用较少, 文档也较少。

使用 VirtIO vIOMMU 时,*不需要*设置任何内核参数。也*不必*使用 q35 作为机型; 但如果要使用 PCIe,建议这样做。

# qm set VMID -machine q35,viommu=virtio

Hook 脚本

可以通过配置属性 hookscript 向 VM 添加 hook 脚本。

# qm set 100 --hookscript local:snippets/hookscript.pl

它会在客户机生命周期的不同阶段被调用。 示例和文档见 /usr/share/pve-docs/examples/guest-example-hookscript.pl 下的示例脚本。

休眠

可以通过 GUI 选项 Hibernate 将 VM 挂起到磁盘,或使用:

# qm suspend ID --todisk

这意味着当前内存内容会保存到磁盘,并停止 VM。下次启动时会加载内存内容,VM 可以从离开的位置继续运行。

状态存储选择

如果没有为内存指定目标存储,将按以下顺序自动选择第一个可用项:

  1. VM 配置中的存储 vmstatestorage

  2. 任意 VM 磁盘中的第一个共享存储。

  3. 任意 VM 磁盘中的第一个非共享存储。

  4. 作为回退的存储 local

资源映射

screenshot/gui-datacenter-resource-mappings.png

使用或引用本地资源(例如 PCI 设备地址)时,直接使用原始地址或 ID 有时会产生问题,例如:

  • 使用 HA 时,目标节点上可能存在具有相同 ID 或路径的不同设备; 如果将此类客户机分配到 HA 组时不够谨慎,可能会使用错误设备,从而破坏配置。

  • 更改硬件可能改变 ID 和路径,因此必须检查所有已分配设备,确认路径或 ID 是否仍然正确。

为了更好地处理此问题,可以定义集群范围资源映射,使资源具有集群唯一且由用户选择的标识符, 该标识符可以对应不同主机上的不同设备。这样,HA 不会使用错误设备启动客户机,并且可以检测硬件变化。

可以在 Proxmox VE Web GUI 的 Datacenter 下,通过 Resource Mappings 类别中的相关选项卡创建此类映射, 也可以在 CLI 中使用:

# pvesh create /cluster/mapping/<type> <options>
screenshot/gui-datacenter-mapping-pci-edit.png

其中 <type> 是硬件类型(目前为 pciusbdir), <options> 是设备映射和其他配置参数。

请注意,选项必须包含带有该硬件所有识别属性的 map 属性, 以便验证硬件未发生变化,并且直通的是正确设备。

例如,要添加一个 PCI 设备作为 device1,它在节点 node1 上的路径为 0000:01:00.0, 设备 ID 为 0001,厂商 ID 为 0002,并且在 node2 上为 0000:02:00.0,可以使用:

# pvesh create /cluster/mapping/pci --id device1 \
 --map node=node1,path=0000:01:00.0,id=0002:0001 \
 --map node=node2,path=0000:02:00.0,id=0002:0001

必须为该设备应具有映射的每个节点重复 map 参数(请注意,目前每个映射中每个节点只能映射一个 USB 设备)。

使用 GUI 会更简单,因为正确属性会被自动选取并发送到 API。

screenshot/gui-datacenter-mapping-usb-edit.png

对于 PCI 设备,也可以通过节点的多个 map 属性为每个节点提供多个设备。 如果将此类设备分配给客户机,客户机启动时会使用第一个空闲设备。 给定路径的顺序也是尝试顺序,因此可以实现任意分配策略。

这对具有 SR-IOV 的设备很有用,因为有时具体直通哪个虚拟功能并不重要。

可以通过 GUI 或以下命令将此类设备分配给客户机:

# qm set ID -hostpci0 <name>

对于 PCI 设备,或:

# qm set <vmid> -usb0 <name>

对于 USB 设备。

其中 <vmid> 是客户机 ID,<name> 是为已创建映射选择的名称。 允许使用设备直通的所有常规选项,例如 mdev

要创建映射,需要在 /mapping/<type>/<name> 上具有 Mapping.Modify (其中 <type> 是设备类型,<name> 是映射名称)。

要使用这些映射,需要在 /mapping/<type>/<name> 上具有 Mapping.Use (此外还需要用于编辑配置的常规客户机权限)。

附加选项

定义集群范围资源映射时还有一些附加选项。目前包括以下选项:

  • mdev (PCI):这会将 PCI 设备标记为能够提供 mediated devices。 启用后,在客户机上配置时可以选择类型。如果为映射选择了多个 PCI 设备, mediated device 会在第一个具有所选类型可用实例的设备上创建。

  • live-migration-capable (PCI):这会将 PCI 设备标记为能够在节点之间在线迁移。 这需要驱动和硬件支持。目前已知只有使用较新内核的 NVIDIA GPU 支持此功能。 请注意,在线迁移直通设备是实验性功能,可能无法工作或导致问题。

使用 qm 管理虚拟机

qm 是在 Proxmox VE 上管理 QEMU/KVM 虚拟机的工具。可以创建和销毁虚拟机,并控制其执行 (start/stop/suspend/resume)。此外,还可以使用 qm 在关联配置文件中设置参数。 也可以创建和删除虚拟磁盘。

CLI 使用示例

使用上传到 local 存储的 iso 文件,创建一个在 local-lvm 存储上具有 4 GB IDE 磁盘的 VM:

# qm create 300 -ide0 local-lvm:4 -net0 e1000 -cdrom local:iso/proxmox-mailgateway_2.1.iso

启动新 VM:

# qm start 300

发送关闭请求,然后等待 VM 停止。

# qm shutdown 300 && qm wait 300

与上面相同,但只等待 40 秒。

# qm shutdown 300 && qm wait 300 -timeout 40

如果 VM 未关闭,请强制停止它并覆盖任何正在运行的关闭任务。停止 VM 可能导致数据丢失,请谨慎使用。

# qm stop 300 -overrule-shutdown 1

销毁 VM 始终会将其从访问控制列表中移除,并始终移除该 VM 的防火墙配置。 如果还想将 VM 从复制作业、备份作业和 HA 资源配置中移除,必须启用 --purge

# qm destroy 300 --purge

将磁盘镜像移动到其他存储。

# qm move-disk 300 scsi0 other-storage

将磁盘镜像重新分配给其他 VM。这会从源 VM 移除磁盘 scsi1,并将其作为 scsi3 附加到目标 VM。 后台会重命名磁盘镜像,使其名称与新的所有者匹配。

# qm move-disk 300 scsi1 --target-vmid 400 --target-disk scsi3

配置

VM 配置文件存储在 Proxmox 集群文件系统中,可通过 /etc/pve/qemu-server/<VMID>.conf 访问。 与存储在 /etc/pve/ 中的其他文件一样,它们会自动复制到所有其他集群节点。

Note VMID < 100 保留用于内部用途,VMID 需要在整个集群范围内唯一。
VM 配置示例
boot: order=virtio0;net0
cores: 1
sockets: 1
memory: 512
name: webmail
ostype: l26
net0: e1000=EE:D2:28:5F:B6:3E,bridge=vmbr0
virtio0: local:vm-100-disk-1,size=32G

这些配置文件是简单文本文件,可以使用普通文本编辑器(vinano 等)编辑。 这有时对进行小幅修正很有用,但请记住,需要重启 VM 才能应用此类更改。

因此,通常最好使用 qm 命令生成和修改这些文件,或直接使用 GUI 完成全部操作。 我们的工具集足够智能,可以将大多数更改即时应用到正在运行的 VM。 此功能称为 "hot plug",在这种情况下不需要重启 VM。

文件格式

VM 配置文件使用简单的冒号分隔键/值格式。每行采用以下格式:

# this is a comment
OPTION: value

这些文件中的空行会被忽略,以 # 字符开头的行会被视为注释并同样被忽略。

快照

创建快照时,qm 会将快照时的配置存储到同一配置文件中的单独快照区段。 例如,创建名为 “testsnapshot” 的快照后,配置文件会类似如下:

带快照的 VM 配置
memory: 512
swap: 512
parent: testsnaphot
...

[testsnaphot]
memory: 512
swap: 512
snaptime: 1457170803
...

有几个与快照相关的属性,例如 parentsnaptimeparent 属性用于存储快照之间的父/子关系。snaptime 是快照创建时间戳(Unix epoch)。

也可以使用选项 vmstate 保存正在运行的 VM 的内存。 有关如何为 VM 状态选择目标存储的详情,请参见 休眠章节中的 状态存储选择

选项

gicversion: <2 | 3 | 4 | max | host > (default = host)

设置 ARM 虚拟机的 gicversion。

virtualization: <boolean> (default = 0)

为 arm64 虚拟机启用嵌套虚拟化。

pxvditemplate <boolean> (default = 0)

启用/禁用 PXVDI 模板。

acpi: <boolean> (default = 1)

启用/禁用 ACPI。

affinity: <string>

用于执行客户机进程的主机核心列表,例如:0,5,8-11

agent: [enabled=]<1|0> [,freeze-fs-on-backup=<1|0>] [,fstrim_cloned_disks=<1|0>] [,type=<virtio|isa>]

启用/禁用与 QEMU Guest Agent 的通信及其属性。

enabled=<boolean> (default = 0)

启用/禁用与虚拟机中运行的 QEMU Guest Agent(QGA)的通信。

freeze-fs-on-backup=<boolean> (default = 1)

备份时冻结/解冻客户机文件系统,以保证一致性。

fstrim_cloned_disks=<boolean> (default = 0)

移动磁盘或迁移虚拟机后运行 fstrim。

type=<isa | virtio> (default = virtio)

选择 agent 类型。

amd-sev: [type=]<sev-type> [,allow-smt=<1|0>] [,kernel-hashes=<1|0>] [,no-debug=<1|0>] [,no-key-sharing=<1|0>]

AMD CPU 提供的 Secure Encrypted Virtualization(SEV)功能。

allow-smt=<boolean> (default = 1)

设置策略位以允许 Simultaneous Multi Threading(SMT)(除 SEV-SNP 外会被忽略)。

kernel-hashes=<boolean> (default = 0)

向客户机固件添加 kernel hashes,用于 measured Linux kernel launch。

no-debug=<boolean> (default = 0)

设置策略位以禁止调试客户机。

no-key-sharing=<boolean> (default = 0)

设置策略位以禁止与其他客户机共享密钥(对 SEV-SNP 会被忽略)。

type=<sev-type>

使用 type=std 启用标准 SEV;使用 es 选项启用实验性 SEV-ES;使用 snp 选项启用实验性 SEV-SNP。

arch: <aarch64 | x86_64>

虚拟处理器架构。默认为主机架构。

args: <string>

传递给 kvm 的任意参数,例如:

args: -no-reboot -smbios type=0,vendor=FOO

Note 此选项仅供专家使用。
audio0: device=<ich9-intel-hda|intel-hda|AC97> [,driver=<spice|none>]

配置音频设备,与 QXL/Spice 结合使用时很有用。

device=<AC97 | ich9-intel-hda | intel-hda>

配置音频设备。

driver=<none | spice> (default = spice)

音频设备的驱动后端。

autostart: <boolean> (default = 0)

崩溃后自动重启(当前会被忽略)。

balloon: <integer> (0 - N)

虚拟机目标 RAM 大小,单位为 MiB。设置为零会禁用 balloon 驱动。

bios: <ovmf | seabios> (default = seabios)

选择 BIOS 实现。

boot: [[legacy=]<[acdn]{1,4}>] [,order=<device[;device...]>]

指定客户机启动顺序。应使用 order= 子属性;无键用法或 legacy= 已弃用。

legacy=<[acdn]{1,4}> (default = cdn)

从软盘 (a)、硬盘 (c)、CD-ROM (d) 或网络 (n) 启动。已弃用,请改用 order=

order=<device[;device...]>

客户机会按照此处设备出现的顺序尝试启动。

磁盘、光驱和直通的存储 USB 设备会被直接用于启动; NIC 会加载 PXE,PCIe 设备则会像磁盘一样工作, 例如 NVMe,或加载 option ROM,例如 RAID 控制器、硬件 NIC。

请注意,只有此列表中的设备会被标记为可启动,并因此由 客户机固件(BIOS/UEFI)加载。如果启动需要多个磁盘, 例如 software-raid,需要在此处指定全部磁盘。

指定后会覆盖已弃用的 legacy=[acdn]* 值。

bootdisk: (ide|sata|scsi|virtio)\d+

允许从指定磁盘启动。已弃用:请改用 boot: order=foo;bar

cdrom: <volume>

这是选项 -ide2 的别名。

cicustom: [meta=<volume>] [,network=<volume>] [,user=<volume>] [,vendor=<volume>]

cloud-init:指定自定义文件,用于在启动时替换自动生成的文件。

meta=<volume>

指定一个自定义文件,其中包含通过 cloud-init 传递给虚拟机的所有元数据。 此内容与 provider 相关,意味着 configdrive2 和 nocloud 的格式不同。

network=<volume>

通过 cloud-init 向虚拟机传递包含所有网络数据的自定义文件。

user=<volume>

通过 cloud-init 向虚拟机传递包含所有用户数据的自定义文件。

vendor=<volume>

通过 cloud-init 向虚拟机传递包含所有 vendor 数据的自定义文件。

cipassword: <string>

cloud-init:要分配给用户的密码。通常不建议使用此项,应改用 SSH 密钥。另请注意,较旧版本的 cloud-init 不支持哈希密码。

citype: <configdrive2 | nocloud | opennebula>

指定 cloud-init 配置格式。默认值取决于配置的操作系统类型(ostype)。Linux 使用 nocloud 格式,Windows 使用 configdrive2

ciupgrade: <boolean> (default = 1)

cloud-init:首次启动后自动执行软件包升级。

ciuser: <string>

cloud-init:要修改 SSH 密钥和密码的用户名,用于替代镜像中配置的默认用户。

cores: <integer> (1 - N) (default = 1)

每个 socket 的核心数。

cpu: [[cputype=]<string>] [,flags=<+FLAG[;-FLAG...]>] [,hidden=<1|0>] [,hv-vendor-id=<vendor-id>] [,phys-bits=<8-64|host>] [,reported-model=<enum>]

模拟的 CPU 类型。

cputype=<string> (default = kvm64)

模拟的 CPU 类型。可以是默认名称或自定义名称(自定义模型名称必须以 custom- 为前缀)。

flags=<+FLAG[;-FLAG...]>

额外 CPU flags 列表,以 ; 分隔。使用 +FLAG 启用 flag,使用 -FLAG 禁用 flag。自定义 CPU 模型可以指定 QEMU/KVM 支持的任意 flag;出于安全原因,虚拟机专用 flag 必须来自以下集合:pcid, spec-ctrl, ibpb, ssbd, virt-ssbd, amd-ssbd, amd-no-ssb, pdpe1gb, md-clear, hv-tlbflush, hv-evmcs, aes

hidden=<boolean> (default = 0)

不要将其标识为 KVM 虚拟机。

hv-vendor-id=<vendor-id>

Hyper-V vendor ID。Windows 客户机内的某些驱动或程序需要特定 ID。

phys-bits=<8-64|host>

报告给客户机操作系统的物理内存地址位数。应小于或等于主机值。设置为 host 可使用主机 CPU 的值,但请注意,这会破坏到具有其他值的 CPU 的在线迁移。

reported-model=<486 | Broadwell | Broadwell-IBRS | Broadwell-noTSX | Broadwell-noTSX-IBRS | Cascadelake-Server | Cascadelake-Server-noTSX | Cascadelake-Server-v2 | Cascadelake-Server-v4 | Cascadelake-Server-v5 | Conroe | Cooperlake | Cooperlake-v2 | EPYC | EPYC-Genoa | EPYC-IBPB | EPYC-Milan | EPYC-Milan-v2 | EPYC-Rome | EPYC-Rome-v2 | EPYC-Rome-v3 | EPYC-Rome-v4 | EPYC-v3 | EPYC-v4 | GraniteRapids | Haswell | Haswell-IBRS | Haswell-noTSX | Haswell-noTSX-IBRS | Icelake-Client | Icelake-Client-noTSX | Icelake-Server | Icelake-Server-noTSX | Icelake-Server-v3 | Icelake-Server-v4 | Icelake-Server-v5 | Icelake-Server-v6 | IvyBridge | IvyBridge-IBRS | KnightsMill | Nehalem | Nehalem-IBRS | Opteron_G1 | Opteron_G2 | Opteron_G3 | Opteron_G4 | Opteron_G5 | Penryn | SandyBridge | SandyBridge-IBRS | SapphireRapids | SapphireRapids-v2 | Skylake-Client | Skylake-Client-IBRS | Skylake-Client-noTSX-IBRS | Skylake-Client-v4 | Skylake-Server | Skylake-Server-IBRS | Skylake-Server-noTSX-IBRS | Skylake-Server-v4 | Skylake-Server-v5 | Westmere | Westmere-IBRS | athlon | core2duo | coreduo | host | kvm32 | kvm64 | max | pentium | pentium2 | pentium3 | phenom | qemu32 | qemu64> (default = kvm64)

报告给客户机的 CPU 模型和厂商。必须是 QEMU/KVM 支持的模型。仅对自定义 CPU 模型定义有效,默认模型始终会向客户机操作系统报告其自身。

cpulimit: <number> (0 - 128) (default = 0)

CPU 使用限制。

Note 如果计算机有 2 个 CPU,则总共有 2 份 CPU 时间。值 0 表示不限制 CPU。
cpuunits: <integer> (1 - 262144) (default = cgroup v1: 1024, cgroup v2: 100)

虚拟机的 CPU 权重。该参数用于内核公平调度器。数值越大,该虚拟机获得的 CPU 时间越多。该数值相对于所有其他正在运行虚拟机的权重。

description: <string>

虚拟机说明。显示在 Web 界面的虚拟机摘要中,并作为注释保存在配置文件内。

efidisk0: [file=]<volume> [,efitype=<2m|4m>] [,format=<enum>] [,pre-enrolled-keys=<1|0>] [,size=<DiskSize>]

配置用于存储 EFI vars 的磁盘。

efitype=<2m | 4m> (default = 2m)

OVMF EFI vars 的大小和类型。4m 较新且推荐使用,并且 Secure Boot 需要它。为保持向后兼容,如果未另行指定,则使用 2m。对于 arch=aarch64(ARM)的虚拟机会被忽略。

file=<volume>

驱动器的后端卷。

format=<cloop | qcow | qcow2 | qed | raw | vmdk>

驱动器后端文件的数据格式。

pre-enrolled-keys=<boolean> (default = 0)

在使用 efitype=4m 时,使用已注册发行版特定密钥和 Microsoft Standard keys 的 EFI vars 模板。请注意,这会默认启用 Secure Boot,但仍可在虚拟机内部关闭。

size=<DiskSize>

磁盘大小。此项仅供信息展示,没有实际影响。

freeze: <boolean>

启动时冻结 CPU(使用 c monitor 命令开始执行)。

hookscript: <string>

在虚拟机生命周期的各个阶段执行的脚本。

hostpci[n]: [[host=]<HOSTPCIID[;HOSTPCIID2...]>] [,device-id=<hex id>] [,legacy-igd=<1|0>] [,mapping=<mapping-id>] [,mdev=<string>] [,pcie=<1|0>] [,rombar=<1|0>] [,romfile=<string>] [,sub-device-id=<hex id>] [,sub-vendor-id=<hex id>] [,vendor-id=<hex id>] [,x-vga=<1|0>] [,ramfb=<1|0>]

将主机 PCI 设备映射到客户机。

Note 此选项允许直接访问主机硬件。因此此类机器将 无法再迁移,请特别谨慎使用。
Caution 实验性功能!已有用户报告此选项存在问题。
device-id=<hex id>

覆盖客户机可见的 PCI device ID。

host=<HOSTPCIID[;HOSTPCIID2...]>

主机 PCI 设备直通。主机 PCI 设备的 PCI ID,或主机 PCI virtual functions 列表。HOSTPCIID 语法为:

bus:dev.func (hexadecimal numbers)

可以使用 lspci 命令列出现有 PCI 设备。

此项和 mapping 键必须至少设置一个。

legacy-igd=<boolean> (default = 0)

以 legacy IGD 模式传递此设备,使其成为虚拟机中的主图形设备且为独占图形设备。需要 pc-i440fx 机器类型,并将 VGA 设置为 none

mapping=<mapping-id>

集群范围 mapping 的 ID。此项和默认键 host 必须至少设置一个。

mdev=<string>

要使用的 mediated device 类型。 虚拟机启动时会创建此类型的一个实例, 虚拟机停止时会清理该实例。

pcie=<boolean> (default = 0)

选择 PCI-express 总线(需要 q35 机器模型)。

rombar=<boolean> (default = 1)

指定设备 ROM 是否在客户机内存映射中可见。

romfile=<string>

自定义 PCI 设备 ROM 文件名(必须位于 /usr/share/kvm/)。

sub-device-id=<hex id>

覆盖客户机可见的 PCI subsystem device ID。

sub-vendor-id=<hex id>

覆盖客户机可见的 PCI subsystem vendor ID。

vendor-id=<hex id>

覆盖客户机可见的 PCI vendor ID。

x-vga=<boolean> (default = 0)

启用 vfio-vga 设备支持。

ramfb=<boolean> (default = 1)

启用 vfio-pci 设备 ramfb 显示支持。

hotplug: <string> (default = network,disk,usb)

选择性启用热插拔功能。这是以逗号分隔的热插拔功能列表:networkdiskcpumemoryusbcloudinit。使用 0 可完全禁用热插拔。值 1 是默认值 network,disk,usb 的别名。对于 machine version >= 7.1 且 ostype 为 l26 或 windows > 7 的客户机,可以使用 USB 热插拔。

hugepages: <1024 | 2 | any>

启用/禁用 hugepages 内存。

ide[n]: [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,cyls=<integer>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,heads=<integer>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,model=<model>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,secs=<integer>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,trans=<none|lba|auto>] [,werror=<enum>] [,wwn=<wwn>]

将卷用作 IDE 硬盘或 CD-ROM(n 为 0 到 3)。

aio=<io_uring | native | threads>

要使用的 AIO 类型。

backup=<boolean>

进行备份时是否应包含该驱动器。

bps=<bps>

最大读/写速度,单位为字节每秒。

bps_max_length=<seconds>

I/O burst 的最大长度,单位为秒。

bps_rd=<bps>

最大读取速度,单位为字节每秒。

bps_rd_max_length=<seconds>

读取 I/O burst 的最大长度,单位为秒。

bps_wr=<bps>

最大写入速度,单位为字节每秒。

bps_wr_max_length=<seconds>

写入 I/O burst 的最大长度,单位为秒。

cache=<directsync | none | unsafe | writeback | writethrough>

驱动器的缓存模式。

cyls=<integer>

强制驱动器物理几何参数使用指定柱面数。

detect_zeroes=<boolean>

控制是否检测并尝试优化零写入。

discard=<ignore | on>

控制是否将 discard/trim 请求传递到底层存储。

file=<volume>

驱动器的后端卷。

format=<cloop | qcow | qcow2 | qed | raw | vmdk>

驱动器后端文件的数据格式。

heads=<integer>

强制驱动器物理几何参数使用指定磁头数。

iops=<iops>

最大读/写 I/O,单位为操作每秒。

iops_max=<iops>

最大未限速读/写 I/O 池,单位为操作每秒。

iops_max_length=<seconds>

I/O burst 的最大长度,单位为秒。

iops_rd=<iops>

最大读取 I/O,单位为操作每秒。

iops_rd_max=<iops>

最大未限速读取 I/O 池,单位为操作每秒。

iops_rd_max_length=<seconds>

读取 I/O burst 的最大长度,单位为秒。

iops_wr=<iops>

最大写入 I/O,单位为操作每秒。

iops_wr_max=<iops>

最大未限速写入 I/O 池,单位为操作每秒。

iops_wr_max_length=<seconds>

写入 I/O burst 的最大长度,单位为秒。

mbps=<mbps>

最大读/写速度,单位为兆字节每秒。

mbps_max=<mbps>

最大未限速读/写池,单位为兆字节每秒。

mbps_rd=<mbps>

最大读取速度,单位为兆字节每秒。

mbps_rd_max=<mbps>

最大未限速读取池,单位为兆字节每秒。

mbps_wr=<mbps>

最大写入速度,单位为兆字节每秒。

mbps_wr_max=<mbps>

最大未限速写入池,单位为兆字节每秒。

media=<cdrom | disk> (default = disk)

驱动器的介质类型。

model=<model>

驱动器报告的型号名称,经过 URL 编码,最长 40 字节。

replicate=<boolean> (default = 1)

该驱动器是否应纳入复制任务。

rerror=<ignore | report | stop>

读取错误时的操作。

secs=<integer>

强制驱动器物理几何参数使用指定扇区数。

serial=<serial>

驱动器报告的序列号,经过 URL 编码,最长 20 字节。

shared=<boolean> (default = 0)

将此本地管理的卷标记为在所有节点上可用。

Warning 此选项不会自动共享该卷,而是假定它已经被共享。
size=<DiskSize>

磁盘大小。此项仅供信息展示,没有实际影响。

snapshot=<boolean>

控制 qemu 的 snapshot mode 功能。如果启用,对磁盘所做的更改是临时的,并会在虚拟机关机时被丢弃。

ssd=<boolean>

是否将此驱动器暴露为 SSD,而不是旋转式硬盘。

trans=<auto | lba | none>

强制磁盘几何参数 BIOS translation 模式。

werror=<enospc | ignore | report | stop>

写入错误时的操作。

wwn=<wwn>

驱动器的 worldwide name,编码为 16 字节十六进制字符串,并以 0x 为前缀。

ipconfig[n]: [gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,ip=<IPv4Format/CIDR>] [,ip6=<IPv6Format/CIDR>]

cloud-init:为对应接口指定 IP 地址和网关。

IP 地址使用 CIDR 表示法;网关为可选项,但必须已指定同类型的 IP 地址。

IP 地址可以使用特殊字符串 dhcp 来启用 DHCP;在这种情况下 不应提供显式网关。 对于 IPv6,可以使用特殊字符串 auto 来启用无状态自动配置。这需要 cloud-init 19.4 或更新版本。

如果启用了 cloud-init,且既未指定 IPv4 地址也未指定 IPv6 地址,则默认使用 IPv4 dhcp。

gw=<GatewayIPv4>

IPv4 流量的默认网关。

Note 需要选项:ip
gw6=<GatewayIPv6>

IPv6 流量的默认网关。

Note 需要选项:ip6
ip=<IPv4Format/CIDR> (default = dhcp)

CIDR 格式的 IPv4 地址。

ip6=<IPv6Format/CIDR> (default = dhcp)

CIDR 格式的 IPv6 地址。

ivshmem: size=<integer> [,name=<string>]

虚拟机间共享内存。适用于虚拟机之间或虚拟机与主机之间的直接通信。

name=<string>

文件名称。会添加 pve-shm- 前缀。默认为 VMID。虚拟机停止时会删除该文件。

size=<integer> (1 - N)

文件大小,单位为 MB。

keephugepages: <boolean> (default = 0)

与 hugepages 配合使用。启用后,虚拟机关机后 hugepages 不会被删除,可用于后续启动。

keyboard: <da | de | de-ch | en-gb | en-us | es | fi | fr | fr-be | fr-ca | fr-ch | hu | is | it | ja | lt | mk | nl | no | pl | pt | pt-br | sl | sv | tr>

VNC 服务器的键盘布局。通常不需要此选项,更适合在客户机操作系统内部处理。

kvm: <boolean> (default = 1)

启用/禁用 KVM 硬件虚拟化。

localtime: <boolean>

将 real time clock(RTC)设置为本地时间。如果 ostype 表示 Microsoft Windows OS,则默认启用此项。

lock: <backup | clone | create | migrate | rollback | snapshot | snapshot-delete | suspended | suspending>

锁定/解锁虚拟机。

machine: [[type=]<machine type>] [,enable-s3=<1|0>] [,enable-s4=<1|0>] [,viommu=<intel|virtio>]

指定 QEMU machine。

enable-s3=<boolean>

启用 S3 电源状态。从 machine types 9.2+pve1 开始默认为 false,之前默认为 true。

enable-s4=<boolean>

启用 S4 电源状态。从 machine types 9.2+pve1 开始默认为 false,之前默认为 true。

type=<machine type>

指定 QEMU machine type。

viommu=<intel | virtio>

启用并设置客户机 vIOMMU 变体(Intel vIOMMU 需要将 machine type 设置为 q35)。

memory: [current=]<integer>

内存属性。

current=<integer> (16 - N) (default = 512)

虚拟机当前在线 RAM 容量,单位为 MiB。使用 balloon 设备时,这是最大可用内存。

migrate_downtime: <number> (0 - N) (default = 0.1)

设置迁移可容忍的最大停机时间(秒)。如果迁移最后阶段由于需要传输过多新写脏内存而无法收敛,该限制会逐步自动提高,直到迁移可以收敛。

migrate_speed: <integer> (0 - N) (default = 0)

设置迁移最大速度(MB/s)。值 0 表示不限制。

name: <string>

设置虚拟机名称。仅用于配置 Web 界面。

nameserver: <string>

cloud-init:设置容器的 DNS 服务器 IP 地址。创建时如果既未设置 searchdomain 也未设置 nameserver,则会自动使用主机上的设置。

net[n]: [model=]<enum> [,bridge=<bridge>] [,firewall=<1|0>] [,link_down=<1|0>] [,macaddr=<XX:XX:XX:XX:XX:XX>] [,mtu=<integer>] [,queues=<integer>] [,rate=<number>] [,tag=<integer>] [,trunks=<vlanid[;vlanid...]>] [,<model>=<macaddr>]

指定网络设备。

bridge=<bridge>

网络设备要连接到的 bridge。Proxmox VE 标准 bridge 名为 vmbr0

如果未指定 bridge,系统会创建一个 kvm user(NATed)网络设备, 并提供 DHCP 和 DNS 服务。使用以下地址:

10.0.2.2   Gateway
10.0.2.3   DNS Server
10.0.2.4   SMB Server

DHCP 服务器会从 10.0.2.15 开始为客户机分配地址。

firewall=<boolean>

此接口是否应受防火墙保护。

link_down=<boolean>

此接口是否应断开连接(类似拔掉网线)。

macaddr=<XX:XX:XX:XX:XX:XX>

未设置 I/G(Individual/Group)位的普通 MAC 地址。

model=<e1000 | e1000-82540em | e1000-82544gc | e1000-82545em | e1000e | i82551 | i82557b | i82559er | ne2k_isa | ne2k_pci | pcnet | rtl8139 | virtio | vmxnet3>

网卡模型。virtio 模型以很低的 CPU 开销提供最佳性能。如果客户机不支持此驱动,通常最好使用 e1000

mtu=<integer> (1 - 65520)

强制 MTU,仅适用于 VirtIO。设置为 1 表示使用 bridge MTU。

queues=<integer> (0 - 64)

设备上使用的数据包队列数量。

rate=<number> (0 - N)

速率限制,单位为 mbps(兆字节每秒),使用浮点数表示。

tag=<integer> (1 - 4094)

应用到此接口数据包的 VLAN tag。

trunks=<vlanid[;vlanid...]>

允许通过此接口的 VLAN trunks。

numa: <boolean> (default = 0)

启用/禁用 NUMA。

numa[n]: cpus=<id[-id];...> [,hostnodes=<id[-id];...>] [,memory=<number>] [,policy=<preferred|bind|interleave>]

NUMA 拓扑。

cpus=<id[-id];...>

访问此 NUMA 节点的 CPU。

hostnodes=<id[-id];...>

要使用的主机 NUMA 节点。

memory=<number>

此 NUMA 节点提供的内存量。

policy=<bind | interleave | preferred>

NUMA 分配策略。

onboot: <boolean> (default = 0)

指定虚拟机是否在系统启动期间启动。

ostype: <l24 | l26 | other | solaris | w2k | w2k3 | w2k8 | win10 | win11 | win7 | win8 | wvista | wxp>

指定客户机操作系统。用于为特定操作系统启用特殊 优化/功能:

other

未指定 OS

wxp

Microsoft Windows XP

w2k

Microsoft Windows 2000

w2k3

Microsoft Windows 2003

w2k8

Microsoft Windows 2008

wvista

Microsoft Windows Vista

win7

Microsoft Windows 7

win8

Microsoft Windows 8/2012/2012r2

win10

Microsoft Windows 10/2016/2019

win11

Microsoft Windows 11/2022/2025

l24

Linux 2.4 Kernel

l26

Linux 2.6 - 6.X Kernel

solaris

Solaris/OpenSolaris/OpenIndiania kernel

parallel[n]: /dev/parport\d+|/dev/usb/lp\d+

映射主机并口设备(n 为 0 到 2)。

Note 此选项允许直接访问主机硬件。因此此类机器将无法再迁移, 请特别谨慎使用。
Caution 实验性功能!已有用户报告此选项存在问题。
protection: <boolean> (default = 0)

设置虚拟机的保护标志。这会禁用删除虚拟机和删除磁盘操作。

reboot: <boolean> (default = 1)

允许重启。如果设置为 0,虚拟机会在重启时退出。

rng0: [source=]</dev/urandom|/dev/random|/dev/hwrng> [,max_bytes=<integer>] [,period=<integer>]

配置基于 VirtIO 的随机数生成器。

max_bytes=<integer> (default = 1024)

每个 period 毫秒允许注入客户机的最大熵字节数。使用 0 禁用限制(可能有风险)。

period=<integer> (default = 1000)

每隔 period 毫秒会重置熵注入配额,允许客户机再获取 max_bytes 的熵。

source=</dev/hwrng | /dev/random | /dev/urandom>

主机上用于收集熵的文件。使用 urandom 在实际意义上*不会*降低安全性,因为它仍由真实熵播种,并且提供的字节很可能也会在客户机上与真实熵混合。/dev/hwrng 可用于从主机直通硬件 RNG。

sata[n]: [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,cyls=<integer>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,heads=<integer>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,secs=<integer>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,trans=<none|lba|auto>] [,werror=<enum>] [,wwn=<wwn>]

将卷用作 SATA 硬盘或 CD-ROM(n 为 0 到 5)。

--nvme[n] [file=]<volume> [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,format=<enum>] [,heads=<integer>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,secs=<integer>] [,serial=<serial>] [,size=<DiskSize>] [,snapshot=<1|0>]

将卷用作 NVME 硬盘或 CD-ROM(n 为 0 到 5)。使用特殊语法 STORAGE_ID:SIZE_IN_GiB 分配新卷。使用 STORAGE_ID:0 和 import-from 参数从现有卷导入。

aio=<io_uring | native | threads>

要使用的 AIO 类型。

backup=<boolean>

进行备份时是否应包含该驱动器。

bps=<bps>

最大读/写速度,单位为字节每秒。

bps_max_length=<seconds>

I/O burst 的最大长度,单位为秒。

bps_rd=<bps>

最大读取速度,单位为字节每秒。

bps_rd_max_length=<seconds>

读取 I/O burst 的最大长度,单位为秒。

bps_wr=<bps>

最大写入速度,单位为字节每秒。

bps_wr_max_length=<seconds>

写入 I/O burst 的最大长度,单位为秒。

cache=<directsync | none | unsafe | writeback | writethrough>

驱动器的缓存模式。

cyls=<integer>

强制驱动器物理几何参数使用指定柱面数。

detect_zeroes=<boolean>

控制是否检测并尝试优化零写入。

discard=<ignore | on>

控制是否将 discard/trim 请求传递到底层存储。

file=<volume>

驱动器的后端卷。

format=<cloop | qcow | qcow2 | qed | raw | vmdk>

驱动器后端文件的数据格式。

heads=<integer>

强制驱动器物理几何参数使用指定磁头数。

iops=<iops>

最大读/写 I/O,单位为操作每秒。

iops_max=<iops>

最大未限速读/写 I/O 池,单位为操作每秒。

iops_max_length=<seconds>

I/O burst 的最大长度,单位为秒。

iops_rd=<iops>

最大读取 I/O,单位为操作每秒。

iops_rd_max=<iops>

最大未限速读取 I/O 池,单位为操作每秒。

iops_rd_max_length=<seconds>

读取 I/O burst 的最大长度,单位为秒。

iops_wr=<iops>

最大写入 I/O,单位为操作每秒。

iops_wr_max=<iops>

最大未限速写入 I/O 池,单位为操作每秒。

iops_wr_max_length=<seconds>

写入 I/O burst 的最大长度,单位为秒。

mbps=<mbps>

最大读/写速度,单位为兆字节每秒。

mbps_max=<mbps>

最大未限速读/写池,单位为兆字节每秒。

mbps_rd=<mbps>

最大读取速度,单位为兆字节每秒。

mbps_rd_max=<mbps>

最大未限速读取池,单位为兆字节每秒。

mbps_wr=<mbps>

最大写入速度,单位为兆字节每秒。

mbps_wr_max=<mbps>

最大未限速写入池,单位为兆字节每秒。

media=<cdrom | disk> (default = disk)

驱动器的介质类型。

replicate=<boolean> (default = 1)

该驱动器是否应纳入复制任务。

rerror=<ignore | report | stop>

读取错误时的操作。

secs=<integer>

强制驱动器物理几何参数使用指定扇区数。

serial=<serial>

驱动器报告的序列号,经过 URL 编码,最长 20 字节。

shared=<boolean> (default = 0)

将此本地管理的卷标记为在所有节点上可用。

Warning 此选项不会自动共享该卷,而是假定它已经被共享。
size=<DiskSize>

磁盘大小。此项仅供信息展示,没有实际影响。

snapshot=<boolean>

控制 qemu 的 snapshot mode 功能。如果启用,对磁盘所做的更改是临时的,并会在虚拟机关机时被丢弃。

ssd=<boolean>

是否将此驱动器暴露为 SSD,而不是旋转式硬盘。

trans=<auto | lba | none>

强制磁盘几何参数 BIOS translation 模式。

werror=<enospc | ignore | report | stop>

写入错误时的操作。

wwn=<wwn>

驱动器的 worldwide name,编码为 16 字节十六进制字符串,并以 0x 为前缀。

scsi[n]: [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,cyls=<integer>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,heads=<integer>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,iothread=<1|0>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,product=<product>] [,queues=<integer>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,ro=<1|0>] [,scsiblock=<1|0>] [,secs=<integer>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,trans=<none|lba|auto>] [,vendor=<vendor>] [,werror=<enum>] [,wwn=<wwn>]

将卷用作 SCSI 硬盘或 CD-ROM(n 为 0 到 30)。

aio=<io_uring | native | threads>

要使用的 AIO 类型。

backup=<boolean>

进行备份时是否应包含该驱动器。

bps=<bps>

最大读/写速度,单位为字节每秒。

bps_max_length=<seconds>

I/O burst 的最大长度,单位为秒。

bps_rd=<bps>

最大读取速度,单位为字节每秒。

bps_rd_max_length=<seconds>

读取 I/O burst 的最大长度,单位为秒。

bps_wr=<bps>

最大写入速度,单位为字节每秒。

bps_wr_max_length=<seconds>

写入 I/O burst 的最大长度,单位为秒。

cache=<directsync | none | unsafe | writeback | writethrough>

驱动器的缓存模式。

cyls=<integer>

强制驱动器物理几何参数使用指定柱面数。

detect_zeroes=<boolean>

控制是否检测并尝试优化零写入。

discard=<ignore | on>

控制是否将 discard/trim 请求传递到底层存储。

file=<volume>

驱动器的后端卷。

format=<cloop | qcow | qcow2 | qed | raw | vmdk>

驱动器后端文件的数据格式。

heads=<integer>

强制驱动器物理几何参数使用指定磁头数。

iops=<iops>

最大读/写 I/O,单位为操作每秒。

iops_max=<iops>

最大未限速读/写 I/O 池,单位为操作每秒。

iops_max_length=<seconds>

I/O burst 的最大长度,单位为秒。

iops_rd=<iops>

最大读取 I/O,单位为操作每秒。

iops_rd_max=<iops>

最大未限速读取 I/O 池,单位为操作每秒。

iops_rd_max_length=<seconds>

读取 I/O burst 的最大长度,单位为秒。

iops_wr=<iops>

最大写入 I/O,单位为操作每秒。

iops_wr_max=<iops>

最大未限速写入 I/O 池,单位为操作每秒。

iops_wr_max_length=<seconds>

写入 I/O burst 的最大长度,单位为秒。

iothread=<boolean>

是否为此驱动器使用 iothreads。

mbps=<mbps>

最大读/写速度,单位为兆字节每秒。

mbps_max=<mbps>

最大未限速读/写池,单位为兆字节每秒。

mbps_rd=<mbps>

最大读取速度,单位为兆字节每秒。

mbps_rd_max=<mbps>

最大未限速读取池,单位为兆字节每秒。

mbps_wr=<mbps>

最大写入速度,单位为兆字节每秒。

mbps_wr_max=<mbps>

最大未限速写入池,单位为兆字节每秒。

media=<cdrom | disk> (default = disk)

驱动器的介质类型。

product=<product>

驱动器的 product 名称,最长 16 字节。

queues=<integer> (2 - N)

队列数量。

replicate=<boolean> (default = 1)

该驱动器是否应纳入复制任务。

rerror=<ignore | report | stop>

读取错误时的操作。

ro=<boolean>

驱动器是否为只读。

scsiblock=<boolean> (default = 0)

是否使用 scsi-block 对主机块设备进行完整直通。

Warning 与主机低内存或高内存碎片同时出现时,可能导致 I/O 错误。
secs=<integer>

强制驱动器物理几何参数使用指定扇区数。

serial=<serial>

驱动器报告的序列号,经过 URL 编码,最长 20 字节。

shared=<boolean> (default = 0)

将此本地管理的卷标记为在所有节点上可用。

Warning 此选项不会自动共享该卷,而是假定它已经被共享。
size=<DiskSize>

磁盘大小。此项仅供信息展示,没有实际影响。

snapshot=<boolean>

控制 qemu 的 snapshot mode 功能。如果启用,对磁盘所做的更改是临时的,并会在虚拟机关机时被丢弃。

ssd=<boolean>

是否将此驱动器暴露为 SSD,而不是旋转式硬盘。

trans=<auto | lba | none>

强制磁盘几何参数 BIOS translation 模式。

vendor=<vendor>

驱动器的 vendor 名称,最长 8 字节。

werror=<enospc | ignore | report | stop>

写入错误时的操作。

wwn=<wwn>

驱动器的 worldwide name,编码为 16 字节十六进制字符串,并以 0x 为前缀。

scsihw: <lsi | lsi53c810 | megasas | pvscsi | virtio-scsi-pci | virtio-scsi-single> (default = lsi)

SCSI 控制器模型。

searchdomain: <string>

cloud-init:设置容器的 DNS 搜索域。创建时如果既未设置 searchdomain 也未设置 nameserver,则会自动使用主机上的设置。

serial[n]: (/dev/.+|socket)

在虚拟机内部创建串口设备(n 为 0 到 3),并直通 主机串口设备(例如 /dev/ttyS0),或在 主机端创建 unix socket(使用 qm terminal 打开终端连接)。

Note 如果直通主机串口设备,此类机器将无法再迁移, 请特别谨慎使用。
Caution 实验性功能!已有用户报告此选项存在问题。
shares: <integer> (0 - 50000) (default = 1000)

auto-ballooning 的内存 shares 数量。数值越大,该虚拟机获得的内存越多。该数值相对于所有其他正在运行虚拟机的权重。使用零会禁用 auto-ballooning。auto-ballooning 由 pvestatd 执行。

smbios1: [base64=<1|0>] [,family=<Base64 encoded string>] [,manufacturer=<Base64 encoded string>] [,product=<Base64 encoded string>] [,serial=<Base64 encoded string>] [,sku=<Base64 encoded string>] [,uuid=<UUID>] [,version=<Base64 encoded string>]

指定 SMBIOS type 1 字段。

base64=<boolean>

用于指示 SMBIOS 值已进行 base64 编码的标志。

family=<Base64 encoded string>

设置 SMBIOS1 family 字符串。

manufacturer=<Base64 encoded string>

设置 SMBIOS1 manufacturer。

product=<Base64 encoded string>

设置 SMBIOS1 product ID。

serial=<Base64 encoded string>

设置 SMBIOS1 serial number。

sku=<Base64 encoded string>

设置 SMBIOS1 SKU 字符串。

uuid=<UUID>

设置 SMBIOS1 UUID。

version=<Base64 encoded string>

设置 SMBIOS1 version。

smp: <integer> (1 - N) (default = 1)

CPU 数量。请改用 -sockets 选项。

sockets: <integer> (1 - N) (default = 1)

CPU sockets 数量。

spice_enhancements: [foldersharing=<1|0>] [,videostreaming=<off|all|filter>]

配置 SPICE 的其他增强功能。

foldersharing=<boolean> (default = 0)

通过 SPICE 启用文件夹共享。需要在虚拟机中安装 Spice-WebDAV 守护进程。

videostreaming=<all | filter | off> (default = off)

启用视频流。对检测到的视频流使用压缩。

sshkeys: <string>

cloud-init:设置 SSH 公钥(每行一个密钥,OpenSSH 格式)。

startdate: (now | YYYY-MM-DD | YYYY-MM-DDTHH:MM:SS) (default = now)

设置 real time clock 的初始日期。有效日期格式为:now2006-06-17T16:01:212006-06-17

startup: `[[order=]\d+] [,up=\d+] [,down=\d+] `

启动和关机行为。Order 是定义总体启动顺序的非负数。关机会按相反顺序执行。此外,可以设置 updown 延迟(秒),用于指定启动或停止下一台虚拟机前等待的延迟。

tablet: <boolean> (default = 1)

启用/禁用 USB tablet 设备。通常需要此设备来允许 VNC 使用绝对鼠标定位。否则鼠标会与普通 VNC 客户端不同步。如果在一台主机上运行大量仅控制台客户机,可以考虑禁用此项以节省部分上下文切换。使用 spice(qm set <vmid> --vga qxl)时默认关闭。

tags: <string>

虚拟机标签。此项仅为元信息。

tdf: <boolean> (default = 0)

启用/禁用时间漂移修正。

template: <boolean> (default = 0)

启用/禁用模板。

tpmstate0: [file=]<volume> [,size=<DiskSize>] [,version=<v1.2|v2.0>]

配置用于存储 TPM state 的磁盘。格式固定为 raw

file=<volume>

驱动器的后端卷。

size=<DiskSize>

磁盘大小。此项仅供信息展示,没有实际影响。

version=<v1.2 | v2.0> (default = v1.2)

TPM 接口版本。v2.0 较新,应优先使用。请注意,此项之后无法更改。

unused[n]: [file=]<volume>

未使用卷的引用。此项供内部使用,不应手动修改。

file=<volume>

驱动器的后端卷。

usb[n]: [[host=]<HOSTUSBDEVICE|spice>] [,mapping=<mapping-id>] [,usb3=<1|0>]

配置 USB 设备(n 为 0 到 4;对于 machine version >= 7.1 且 ostype 为 l26 或 windows > 7 的客户机,n 最大可为 14)。

host=<HOSTUSBDEVICE|spice>

主机 USB 设备、端口,或值 spice。HOSTUSBDEVICE 语法为:

'bus-port(.port)*' (decimal numbers) or
'vendor_id:product_id' (hexadecimal numbers) or
'spice'

可以使用 lsusb -t 命令列出现有 USB 设备。

Note 此选项允许直接访问主机硬件。因此此类机器将无法再迁移, 请特别谨慎使用。

spice 可用于为 spice 添加 USB 重定向设备。

此项和 mapping 键必须至少设置一个。

mapping=<mapping-id>

集群范围 mapping 的 ID。此项和默认键 host 必须至少设置一个。

usb3=<boolean> (default = 0)

指定给定的 host 选项是否为 USB3 设备或端口。对于现代客户机(machine version >= 7.1 且 ostype 为 l26 和 windows > 7),此标志无关紧要(所有设备都会插入 xhci 控制器)。

vcpus: <integer> (1 - N) (default = 0)

热插拔 vCPU 数量。

vga: [[type=]<enum>] [,clipboard=<vnc>] [,memory=<integer>]

配置 VGA 硬件。如果要使用高分辨率模式(>= 1280x1024x16),可能需要增加 vga memory 选项。自 QEMU 2.9 起,除某些使用 cirrus 的 Windows 版本(XP 及更早版本)外,所有 OS 类型的默认 VGA 显示类型均为 stdqxl 选项会启用 SPICE 显示服务器。对于 win* OS,可以选择所需的独立显示器数量;Linux 客户机可以自行添加显示器。 也可以不使用任何显卡,而使用串口设备作为终端运行。

clipboard=<vnc>

启用特定剪贴板。如果未设置,会根据显示类型添加 SPICE 剪贴板。尚不支持带 VNC 剪贴板的迁移。

memory=<integer> (4 - 512)

设置 VGA 内存(MiB)。对串口显示无效。

type=<cirrus | none | qxl | qxl2 | qxl3 | qxl4 | serial0 | serial1 | serial2 | serial3 | std | virtio | virtio-gl | vmware> (default = std)

选择 VGA 类型。不建议使用类型 cirrus

virtio[n]: [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,cyls=<integer>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,heads=<integer>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,iothread=<1|0>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,ro=<1|0>] [,secs=<integer>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,trans=<none|lba|auto>] [,werror=<enum>]

将卷用作 VIRTIO 硬盘(n 为 0 到 15)。

aio=<io_uring | native | threads>

要使用的 AIO 类型。

backup=<boolean>

进行备份时是否应包含该驱动器。

bps=<bps>

最大读/写速度,单位为字节每秒。

bps_max_length=<seconds>

I/O burst 的最大长度,单位为秒。

bps_rd=<bps>

最大读取速度,单位为字节每秒。

bps_rd_max_length=<seconds>

读取 I/O burst 的最大长度,单位为秒。

bps_wr=<bps>

最大写入速度,单位为字节每秒。

bps_wr_max_length=<seconds>

写入 I/O burst 的最大长度,单位为秒。

cache=<directsync | none | unsafe | writeback | writethrough>

驱动器的缓存模式。

cyls=<integer>

强制驱动器物理几何参数使用指定柱面数。

detect_zeroes=<boolean>

控制是否检测并尝试优化零写入。

discard=<ignore | on>

控制是否将 discard/trim 请求传递到底层存储。

file=<volume>

驱动器的后端卷。

format=<cloop | qcow | qcow2 | qed | raw | vmdk>

驱动器后端文件的数据格式。

heads=<integer>

强制驱动器物理几何参数使用指定磁头数。

iops=<iops>

最大读/写 I/O,单位为操作每秒。

iops_max=<iops>

最大未限速读/写 I/O 池,单位为操作每秒。

iops_max_length=<seconds>

I/O burst 的最大长度,单位为秒。

iops_rd=<iops>

最大读取 I/O,单位为操作每秒。

iops_rd_max=<iops>

最大未限速读取 I/O 池,单位为操作每秒。

iops_rd_max_length=<seconds>

读取 I/O burst 的最大长度,单位为秒。

iops_wr=<iops>

最大写入 I/O,单位为操作每秒。

iops_wr_max=<iops>

最大未限速写入 I/O 池,单位为操作每秒。

iops_wr_max_length=<seconds>

写入 I/O burst 的最大长度,单位为秒。

iothread=<boolean>

是否为此驱动器使用 iothreads。

mbps=<mbps>

最大读/写速度,单位为兆字节每秒。

mbps_max=<mbps>

最大未限速读/写池,单位为兆字节每秒。

mbps_rd=<mbps>

最大读取速度,单位为兆字节每秒。

mbps_rd_max=<mbps>

最大未限速读取池,单位为兆字节每秒。

mbps_wr=<mbps>

最大写入速度,单位为兆字节每秒。

mbps_wr_max=<mbps>

最大未限速写入池,单位为兆字节每秒。

media=<cdrom | disk> (default = disk)

驱动器的介质类型。

replicate=<boolean> (default = 1)

该驱动器是否应纳入复制任务。

rerror=<ignore | report | stop>

读取错误时的操作。

ro=<boolean>

驱动器是否为只读。

secs=<integer>

强制驱动器物理几何参数使用指定扇区数。

serial=<serial>

驱动器报告的序列号,经过 URL 编码,最长 20 字节。

shared=<boolean> (default = 0)

将此本地管理的卷标记为在所有节点上可用。

Warning 此选项不会自动共享该卷,而是假定它已经被共享。
size=<DiskSize>

磁盘大小。此项仅供信息展示,没有实际影响。

snapshot=<boolean>

控制 qemu 的 snapshot mode 功能。如果启用,对磁盘所做的更改是临时的,并会在虚拟机关机时被丢弃。

trans=<auto | lba | none>

强制磁盘几何参数 BIOS translation 模式。

werror=<enospc | ignore | report | stop>

写入错误时的操作。

virtiofs[n]: [dirid=]<mapping-id> [,cache=<enum>] [,direct-io=<1|0>] [,expose-acl=<1|0>] [,expose-xattr=<1|0>]

使用 Virtio-fs 在主机与客户机之间共享目录的配置。

cache=<always | auto | metadata | never> (default = auto)

文件系统应使用的缓存策略(auto、always、metadata、never)。

direct-io=<boolean> (default = 0)

遵循客户机应用程序传递下来的 O_DIRECT 标志。

dirid=<mapping-id>

要与客户机共享的目录 mapping 的标识符。也会用作虚拟机内部的 mount tag。

expose-acl=<boolean> (default = 0)

为此挂载启用 POSIX ACL 支持(启用 ACL 意味着启用 xattr)。

expose-xattr=<boolean> (default = 0)

为此挂载启用扩展属性支持。

vmgenid: <UUID> (default = 1 (autogenerated))

VM generation ID(vmgenid)设备会向客户机操作系统暴露一个 128 位整数值标识符。当虚拟机以不同配置执行时(例如执行快照或从模板创建),这可通知客户机操作系统。客户机操作系统感知到变化后,可以采取适当响应,例如将其分布式数据库副本标记为 dirty、重新初始化随机数生成器等。 请注意,自动创建仅在通过 API/CLI 创建或更新方法执行时生效,手动编辑配置文件时不会生效。

vmstatestorage: <storage ID>

VM state 卷/文件的默认存储。

watchdog: [[model=]<i6300esb|ib700>] [,action=<enum>]

创建虚拟硬件 watchdog 设备。一旦由客户机操作启用,客户机内的 agent 必须定期轮询 watchdog,否则 watchdog 会重置客户机(或执行指定的相应操作)。

action=<debug | none | pause | poweroff | reset | shutdown>

激活后如果客户机未能及时轮询 watchdog,要执行的操作。

model=<i6300esb | ib700> (default = i6300esb)

要模拟的 watchdog 类型。

锁定

在线迁移、快照和备份(vzdump)会设置锁,以防止对受影响 VM 执行不兼容的并发操作。 有时需要手动移除此类锁(例如断电后)。

# qm unlock <vmid>
Caution 只有在确定设置该锁的操作已不再运行时,才执行此操作。

文件

/etc/pve/qemu-server/<VMID>.conf

VM <VMID> 的配置文件。

版权和免责声明

Copyright © 2022-2025 成都市梨儿方信息技术有限责任公司.

本程序是自由软件:你可以依据自由软件基金会发布的 GNU Affero General Public License 条款重新分发和/或修改本程序;可使用该许可证第 3 版,或(由你选择)任何后续版本。

发布本程序是希望它能够有用,但不提供任何担保;甚至不包含对适销性或特定用途适用性的默示担保。更多详情请参见 GNU Affero General Public License。

你应当已经随本程序收到一份 GNU Affero General Public License 的副本。如果没有,请访问: https://www.gnu.org/licenses/

Copyright © 2007-2022 Proxmox Server Solutions GmbH

本程序是自由软件:你可以依据自由软件基金会发布的 GNU Affero General Public License 条款重新分发和/或修改本程序;可使用该许可证第 3 版,或(由你选择)任何后续版本。

发布本程序是希望它能够有用,但不提供任何担保;甚至不包含对适销性或特定用途适用性的默示担保。更多详情请参见 GNU Affero General Public License。

你应当已经随本程序收到一份 GNU Affero General Public License 的副本。如果没有,请访问: https://www.gnu.org/licenses/