高效的PVE运维指南:Proxmox VE命令行从入门到实战
本文系统整理了 Proxmox VE(PVE)的常用命令行操作:从
qm/pct/pvesm最基础的虚拟机管理开始,逐步深入到 qcow2 磁盘导入、定时备份、计划开关机,最后拆解 LVM 与 QEMU 底层命令,覆盖日常运维的完整场景。
背景Proxmox VE 是一个基于 Debian + KVM/QEMU + LXC 的开源虚拟化平台,所有 Web 界面的操作最终都会落到底层的命令行工具。Web 界面只暴露了部分功能(比如不能直接编辑任意配置文件、不方便批量操作),而命令行可以做到:
- 批量启停/备份所有虚拟机
- 精细控制磁盘、网络、启动顺序等参数
- 通过 Cron / systemd timer 实现自动化运维
- 排查 Web 界面看不到的问题(如磁盘占用率)
学习命令行,本质上是学习 PVE 的三层架构:PVE 管理工具(qm/pct/pvesm)→ QEMU 虚拟化层 → LVM/存储层。掌握之后,Web 界面反而会成为辅助。
参考文章
- Proxmox 官方 Wiki: Proxmox VE Documentation
- qm 手册: man qm
- qemu-img 手册: QEMU Disk Image Utility
前提需要一台已经安装好的 Proxmox VE 服务器,且能通过 SSH 登录(或 PVE Web 界面的
Shell终端)。本文所有命令均在 PVE 宿主机的 root shell 下执行,不是在虚拟机内部。
环境讲解都以我的环境为例:
- PVE 版本:9.2.2(hostname:
poweredge)- 存储:
vm-data(dir,/mnt/vm-storage)为活动主存储;pve-config(/mnt/pve-config,content 为backup,snippets)用于备份- 网络:桥接
vmbr0;VM 均使用virtio-scsi-single+q35机型- VM 列表:
100debian13-gpu、101debian-test、102winserver-2022、103debian-vm
命令行体系总览
PVE 的命令按功能划分,先建立整体印象:
//file: /usr/bin 下的主要命令
qm # QEMU 虚拟机管理(最常用)pct # LXC 容器管理pvesm # 存储管理(查看/分配/释放磁盘)pvecm # 集群管理pvenode # 节点管理(CPU/内存/网络)pveceph # Ceph 分布式存储vzdump # 备份/恢复工具pveversion# 版本信息| 命令 | 作用 | 使用频率 |
|---|---|---|
qm | 虚拟机全生命周期管理 | ⭐⭐⭐⭐⭐ |
pvesm | 存储与磁盘管理 | ⭐⭐⭐⭐ |
vzdump | 备份/恢复 | ⭐⭐⭐ |
pct | 容器管理(结构与 qm 类似) | ⭐⭐⭐ |
pvenode | 节点状态 | ⭐⭐ |
pvecm | 集群(单机用不到) | ⭐ |
NOTEPVE 的所有配置都保存在
/etc/pve/下——这是一个 FUSE 挂载的集群文件系统,任何修改即时生效:Terminal window /etc/pve/qemu-server/100.conf # VM 配置(可直接编辑)/etc/pve/lxc/200.conf # 容器配置/etc/pve/storage.cfg # 存储定义/etc/pve/jobs.cfg # 定时备份计划/etc/pve/firewall/ # 防火墙规则虽然可以直接编辑,但日常更推荐
qm set等命令——它们会做参数校验,避免写错。
最常用命令(覆盖日常 80% 场景)
查看信息
pveversion -v # 版本及所有组件版本(贴论坛问题时必备)qm list # 列出所有 VM:VMID / 名称 / 状态 / 内存 / 引导盘 / 磁盘使用qm status 100 # 单个 VM 状态(running / stopped)qm config 100 # 查看 VM 完整配置(CPU/内存/磁盘/网络/引导顺序)生命周期控制
qm start 100 # 开机qm stop 100 # 强制停止(等同拔电源,不建议日常用)qm shutdown 100 # 优雅关机(发 ACPI 电源键,推荐)qm shutdown 100 --timeout 300 # 300 秒内没关掉就强停qm reboot 100 # 重启qm suspend 100 # 挂起(暂停,占用内存)qm resume 100 # 恢复qm wait 100 # 阻塞等待 VM 状态变化(脚本里用)CAUTION
qm shutdown依赖虚拟机内安装 QEMU Guest Agent(qemu-guest-agent包)。没装的话--timeout到期会直接qm stop强停,可能丢数据。验证 agent 是否在线:Terminal window qm guest ping 100 # 返回 "OK" 说明 agent 正常
在虚拟机内执行命令(Guest Agent)
这是 Web 界面给不了的能力,排障非常有用:
qm guest cmd 100 get-fsinfo # 查看分区/文件系统信息(含使用率!)qm guest exec 100 -- df -h # 在 VM 内执行任意命令qm guest exec 100 -- bash -c 'systemctl restart nginx'IMPORTANTPVE 9.x 的 VM 摘要页不显示磁盘使用率(后端
QemuServer.pm的vmstatus硬编码disk=0,前端 GuestStatusView 也不显示 swap)——这是设计行为而非故障。想看磁盘占用就用上面的qm guest cmd <vmid> get-fsinfo或qm guest exec <vmid> -- df -h。
修改配置
Web 界面上能改的参数,命令行全都能改:
qm set 100 --cores 4 --memory 4096 # 改 CPU 核数、内存(可在线,需 balloon)qm set 100 --sockets 1 --cpu host # CPU 类型qm set 100 --net0 virtio,bridge=vmbr0 # 网络(网卡类型必须一致才能热插拔)qm set 100 --boot order=scsi0 # 引导顺序qm set 100 --scsi0 vm-data:100/vm-100-disk-0.qcow2,discard=on,ssd=1qm set 100 --ide2 vm-iso:iso/debian.iso,media=cdrom # 挂载安装镜像qm unset 100 --ide2 # 移除某个参数qm set 100 --description '我的测试机' # 备注qm set 100 --ostype l26 # 系统类型(l26=Linux 6.x, win11=Windows 11)NOTE在线修改的注意点:
- 内存在线调整需要开启 balloon(
--balloon 0关闭,默认开启)- 网卡
virtio支持热插拔;e1000/rtl8139不支持- CPU 核数可以热加,不能热减;
--cpu host才能保证热加后 NUMA 正常
虚拟机生命周期管理
创建虚拟机
# 最小化创建qm create 105 --name myvm --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0
# 完整参数创建qm create 105 \ --name web-server \ --memory 4096 \ --cores 4 \ --cpu host \ --machine q35 \ --scsi0 vm-data:105/vm-105-disk-0.qcow2,size=50G,discard=on \ --ide2 vm-iso:iso/debian-12.iso,media=cdrom \ --net0 virtio,bridge=vmbr0 \ --ostype l26 \ --boot order=scsi0 \ --onboot 1 # 宿主机开机时自动启动克隆与模板
qm clone 103 104 --name debian-clone --full # 完整克隆(独立磁盘,推荐)qm clone 103 104 --name debian-clone # 链接克隆(依赖母盘,仅支持 qcow2)qm template 104 # 把 VM 转为模板(用 --full 克隆模板更佳)删除
qm destroy 105 # 删除 VM 配置qm destroy 105 --purge # 同时删除备份和配置项qm destroy 105 --destroy-unreferenced-disks # 连未引用的磁盘一起删迁移
qm migrate 100 node2 --online # 在线迁移(同集群,虚拟机不关机)qm migrate 100 node2 # 离线迁移qm move-disk 100 scsi0 --storage node2-vmdata --delete # 只迁移磁盘磁盘与存储管理
存储概览
pvesm status # 所有存储:类型/容量/已用/可用pvesm list vm-data # 该存储上的所有镜像(VMID/卷名/大小/格式)pvesm alloc vm-data 105 vm-105-disk-1 10G # 手动分配一块 10G 磁盘pvesm free vm-data 105/vm-105-disk-1 # 释放磁盘磁盘扩容
qm resize 100 scsi0 +10G # 在线扩容 +10G(无需关机)qm resize 100 scsi0 100G # 扩到固定 100GCAUTION
qm resize只扩大磁盘本身,虚拟机内的文件系统不会自动扩大,需要进 VM 里操作:Terminal window # 虚拟机内(Debian/Ubuntu)resize2fs /dev/sda1 # ext4# 或growpart /dev/sda 1 && resize2fs /dev/sda1# 虚拟机内(CentOS/RHEL,xfs)xfs_growfs /
导入 qcow2 磁盘(从其他来源迁移)
这是最常见的迁移场景——把别的虚拟化平台/别处导出的 qcow2 镜像导入 PVE:
# ① 创建空 VM(记住 VMID)qm create 105 --name imported-vm --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0
# ② 导入磁盘(--format 可指定 qcow2 或 raw)qm importdisk 105 /mnt/vm-storage/images/incoming/debian.qcow2 vm-data --format qcow2
# ③ 挂载到 SCSI 控制器qm set 105 --scsi0 vm-data:105/vm-105-disk-0.qcow2,discard=on,ssd=1
# ④ 设置引导顺序并启动qm set 105 --boot order=scsi0qm start 105如果磁盘文件还在远程机器上,先传过来:
scp user@192.168.1.50:/backup/debian.qcow2 /mnt/vm-storage/images/incoming/rsync -avP user@192.168.1.50:/backup/debian.qcow2 /mnt/vm-storage/images/incoming/NOTE导入后常见问题:
- 启动黑屏:检查
--ostype是否正确、引导顺序里是否把 CD-ROM 排到了磁盘前面- Windows 镜像导入后蓝屏:需要先为磁盘设置
--scsi0 ... ,discard=on并确保控制器是virtio-scsi-single- 磁盘格式:
raw性能略好但无法用 qcow2 内部快照;qcow2支持快照、压缩、稀疏
备份与恢复
手动备份
# 单个 VMqm backup 100 --storage pve-config --mode snapshot --compress zstd
# 所有 VM + 容器vzdump --all --storage pve-config --mode snapshot --compress zstd
# 排除某些 VMvzdump --all --exclude 101,102 --storage pve-config备份模式对比
| 模式 | 虚拟机是否停机 | 一致性 | 适用场景 |
|---|---|---|---|
snapshot | 不停机 | 一般(应用层数据可能不一致) | 日常推荐 |
suspend | 短暂挂起 | 较好 | 对一致性敏感 |
stop | 完全停机 | 最好 | 数据库等关键业务 |
NOTE
snapshot模式底层原理是 LVM 快照或 qcow2 快照:瞬间生成一个只读快照,然后备份快照,期间 VM 继续运行。所以即使 100G 的磁盘,备份几乎不阻塞业务,代价是少量 I/O 开销。
恢复
# 恢复到原 VMIDqm restore 100 /mnt/pve-config/dump/vzdump-qemu-100-2026_08_08-*.vma.zst
# 恢复到新 VMID(测试恢复用,强烈建议定期演练)qmrestore /mnt/pve-config/dump/vzdump-qemu-100-2026_08_08-*.vma.zst 199 --storage vm-dataIMPORTANT备份的价值在于能恢复。建议每月用
qmrestore恢复到临时 VMID(比如 199),启动验证后删除——只备份不演练,等真出事了才发现备份坏了才是最大的坑。
定时备份(计划任务)
PVE 的定时备份有两种方式:
方式一:Web 界面(推荐)
数据中心(Datacenter)→ 备份(Backup)→ 添加,配置项与命令行一一对应,写入 /etc/pve/jobs.cfg。
方式二:命令行 + Cron(灵活)
crontab -e# 每天凌晨 2:00 备份所有 VM 到 pve-config,保留最近 3 份0 2 * * * vzdump --all --storage pve-config --mode snapshot --compress zstd \ --prune-backups 'keep-last=3' >> /var/log/vzdump.log 2>&1常用参数:
| 参数 | 作用 |
|---|---|
--all | 备份所有 VM + CT |
--vmid 100,101 | 只备份指定 VM |
--exclude 102 | 排除指定 VM |
--mode snapshot | 快照模式(默认 suspend) |
--compress zstd | 压缩(zstd 快且压缩率高) |
--prune-backups keep-last=3 | 只保留最近 3 份 |
--notes-template '{{guestname}}' | 备份备注带 VM 名 |
--notification-mode always | 邮件通知(需要配置 mail) |
计划任务:定时备份 + 定时开关机
PVE 没有内置”到点自动关机/重启”按钮,标准做法是系统 Cron。
定时关机/开机
crontab -e# 每天 23:00 优雅关机(300 秒超时后强停)0 23 * * * qm shutdown 102 --timeout 300 || qm stop 102# 每天 08:00 开机0 8 * * * qm start 102# 每周日 03:00 重启0 3 * * 0 qm reboot 102NOTELinux cron 的星期字段:0 = 周日,
1-6= 周一到周六。1-5是周一到周五,0,6是周末。
批量启停所有 VM
# 关掉所有运行中的 VM(先优雅,后强停)for id in $(qm list | awk '$3=="running"{print $1}'); do qm shutdown "$id" --timeout 300 || qm stop "$id"done
# 启动所有已存在的 VMfor id in $(qm list | awk 'NR>1{print $1}'); do qm start "$id"; donesystemd timer(比 cron 更现代的替代)
[Unit]Description=Shutdown VM 102 gracefullyAfter=multi-user.target
[Service]Type=oneshotExecStart=/usr/sbin/qm shutdown 102 --timeout 300[Unit]Description=Daily VM 102 shutdown at 23:00
[Timer]OnCalendar=*-*-* 23:00:00Persistent=true
[Install]WantedBy=timers.targetsystemctl daemon-reload && systemctl enable --now vm-shutdown.timersystemctl list-timers # 查看所有计划组合实战:每晚”备份 + 关机 + 次日开机”
//file: /etc/crontab(root)
30 22 * * * vzdump --vmid 102 --storage pve-config --mode snapshot --compress zstd --prune-backups 'keep-last=7'0 23 * * * qm shutdown 102 --timeout 300 || qm stop 1020 8 * * * qm start 102LVM 底层命令
PVE 的 vm-data(dir 类型)和 vm-storage(lvm 类型)存储背后都有 LVM 的身影。LVM 三层结构:物理卷 PV → 卷组 VG → 逻辑卷 LV。
查看
pvs / pvscan / pvdisplay # 物理卷:哪块盘、多大、属于哪个 VGvgs / vgscan / vgdisplay # 卷组:总容量 / 剩余空间lvs / lvscan / lvdisplay # 逻辑卷:名字、大小、状态lvs -a # 连快照、thin 子卷一起显示NOTE记忆技巧:
pvs/vgs/lvs是精简版(一行一条),*display是详细版,*scan是扫描。
创建 / 扩容 / 缩容
# 创建:物理盘 -> PV -> VG -> LVpvcreate /dev/sdbvgcreate vm-storage /dev/sdblvcreate -L 100G -n vm-105-disk-0 vm-storagelvcreate -l 100%FREE -n vm-105-disk-0 vm-storage # 用掉全部剩余空间
# 扩容(顺序:PV -> VG -> LV -> 文件系统)pvresize /dev/sdb # 物理盘扩容后刷新 PVvgextend vm-storage /dev/sdc # 加一块盘进 VGlvextend -L +10G vm-storage/vm-105-disk-0 # LV +10Glvextend -r -L +10G vm-storage/vm-105-disk-0 # -r 自动扩文件系统resize2fs /dev/vm-storage/vm-105-disk-0 # ext4 手动扩
# 缩容(⚠️ 先缩文件系统,再缩 LV,顺序反了会损坏数据)lvreduce -L -10G vm-storage/vm-105-disk-0
# 删除 / 快照lvremove vm-storage/vm-105-disk-1lvcreate -s -L 10G -n snap1 vm-storage/vm-105-disk-0 # 快照(PVE 备份底层)CAUTION扩容顺序永远是:PV → VG → LV → 文件系统;缩容顺序相反,且缩容前必须先备份。LVM 的坑大多出在顺序搞反。
与 PVE 结合
pvesm add lvm vm-storage --vgname vm-storage # 把卷组注册为 PVE 存储pvesm status# VM 磁盘会以 /dev/vm-storage/vm-<vmid>-disk-N 形式出现QEMU 底层命令
PVE 把 QEMU 封装进了 qm,但 qemu-img 在处理镜像时仍是刚需。
qemu-img 磁盘镜像工具
# 查看镜像信息(关键:格式、实际占用、backing file)qemu-img info debian.qcow2
# 创建qemu-img create -f qcow2 debian.qcow2 50Gqemu-img create -f raw disk.img 50G
# 格式转换qemu-img convert -f qcow2 -O raw debian.qcow2 disk.rawqemu-img convert -f qcow2 -O qcow2 -c src.qcow2 dst.qcow2 # -c 压缩
# 扩容qemu-img resize debian.qcow2 +10G
# qcow2 内置快照qemu-img snapshot -l debian.qcow2 # 列出qemu-img snapshot -c snap1 debian.qcow2# 创建qemu-img snapshot -a snap1 debian.qcow2# 回滚qemu-img snapshot -d snap1 debian.qcow2# 删除
# 检查 / 差量镜像qemu-img check debian.qcow2qemu-img create -f qcow2 -b base.qcow2 overlay.qcow2 # 差量镜像(overlay)qemu-img rebase -b base.qcow2 overlay.qcow2 # 重设 backing fileQEMU Monitor 控制台
qm monitor 100 # 进入 VM 的 QEMU monitor常用交互命令:
info status # 运行状态info block # 磁盘设备及状态info cpus # vCPU 情况info balloon # 内存气球savevm snap1 # 系统级快照loadvm snap1 # 恢复快照system_reset # 复位system_powerdown # 发关机信号quit # 退出 monitor排错技巧
看日志
tail -f /var/log/pve/tasks/active # 当前运行的任务tail -f /var/log/syslog | grep qm # QEMU 相关日志journalctl -u pveproxy -f # Web 界面相关cat /var/log/pve/tasks/index # 历史任务列表看 VM 实际占用的宿主机资源
qm status 100 --verbose # 含 CPU/内存实时数据top -p $(qm status 100 --verbose | grep pid | awk '{print $2}') # 看 QEMU 进程ps aux | grep qemu # 所有 qemu 进程及完整命令行常见坑
| 现象 | 原因与解法 |
|---|---|
qm shutdown 没反应 | VM 内没装 qemu-guest-agent,改用 qm stop 或装 agent |
| 摘要页磁盘使用率不显示 | PVE 9.x 设计行为,用 qm guest cmd <vmid> get-fsinfo |
| 创建 VM 报”no space left” | pvesm status 看存储剩余;vgs 看卷组剩余 |
| 迁移后 VM 起不来 | 检查 /etc/pve/storage.cfg 与磁盘归属,qm rescan |
| 备份文件巨大 | 用 --compress zstd + --prune-backups 保留策略 |
速查表
| 场景 | 命令 |
|---|---|
| 看所有 VM | qm list |
| 看 VM 配置 | qm config 100 |
| 优雅关机 | qm shutdown 100 --timeout 300 |
| 在 VM 内跑命令 | qm guest exec 100 -- df -h |
| 看存储 | pvesm status |
| 看 LVM 三层 | pvs → vgs → lvs |
| 看 qcow2 镜像 | qemu-img info xxx.qcow2 |
| 导入 qcow2 | qm importdisk + qm set --scsi0 |
| 磁盘扩容 | qm resize 100 scsi0 +10G(文件系统要单独扩) |
| 手动备份 | qm backup 100 --storage pve-config --mode snapshot |
| 定时备份 | 数据中心→备份→添加 或 crontab 里 vzdump |
| 定时开关机 | crontab 里 qm shutdown/start/reboot |
| 查看版本 | pveversion -v |
结语命令行是 PVE 运维的”第二层皮肤”——Web 界面能做的命令行都能做,命令行能做的 Web 界面未必能做。本文从最常用的
qm list讲到qemu-img、LVM,覆盖了日常运维的完整闭环:创建 → 配置 → 磁盘 → 备份 → 计划任务 → 排错。建议从”最常用命令”一节开始,配合自己的 PVE 环境逐个敲一遍。遇到问题时,
man qm、qm help和官方 Wiki 是最好的老师。
以下是可爱的评论们:

输入用户名和邮箱后自动检查登录状态。登录后用户名和邮箱将被绑定, 只可以修改头像和主页链接。