3672 字
18 分钟

高效的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
/
qemu-server
Waiting for api.github.com...
00K
0K
0K
Waiting...
前提

需要一台已经安装好的 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 列表:100 debian13-gpu、101 debian-test、102 winserver-2022、103 debian-vm

命令行体系总览#

PVE 的命令按功能划分,先建立整体印象:

Terminal window
//file: /usr/bin 下的主要命令
qm # QEMU 虚拟机管理(最常用)
pct # LXC 容器管理
pvesm # 存储管理(查看/分配/释放磁盘)
pvecm # 集群管理
pvenode # 节点管理(CPU/内存/网络)
pveceph # Ceph 分布式存储
vzdump # 备份/恢复工具
pveversion# 版本信息
命令作用使用频率
qm虚拟机全生命周期管理⭐⭐⭐⭐⭐
pvesm存储与磁盘管理⭐⭐⭐⭐
vzdump备份/恢复⭐⭐⭐
pct容器管理(结构与 qm 类似)⭐⭐⭐
pvenode节点状态⭐⭐
pvecm集群(单机用不到)
NOTE

PVE 的所有配置都保存在 /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% 场景)#

查看信息#

Terminal window
pveversion -v # 版本及所有组件版本(贴论坛问题时必备)
qm list # 列出所有 VM:VMID / 名称 / 状态 / 内存 / 引导盘 / 磁盘使用
qm status 100 # 单个 VM 状态(running / stopped)
qm config 100 # 查看 VM 完整配置(CPU/内存/磁盘/网络/引导顺序)

生命周期控制#

Terminal window
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 Agentqemu-guest-agent 包)。没装的话 --timeout 到期会直接 qm stop 强停,可能丢数据。验证 agent 是否在线:

Terminal window
qm guest ping 100 # 返回 "OK" 说明 agent 正常

在虚拟机内执行命令(Guest Agent)#

这是 Web 界面给不了的能力,排障非常有用:

Terminal window
qm guest cmd 100 get-fsinfo # 查看分区/文件系统信息(含使用率!)
qm guest exec 100 -- df -h # 在 VM 内执行任意命令
qm guest exec 100 -- bash -c 'systemctl restart nginx'
IMPORTANT

PVE 9.x 的 VM 摘要页不显示磁盘使用率(后端 QemuServer.pmvmstatus 硬编码 disk=0,前端 GuestStatusView 也不显示 swap)——这是设计行为而非故障。想看磁盘占用就用上面的 qm guest cmd <vmid> get-fsinfoqm guest exec <vmid> -- df -h

修改配置#

Web 界面上能改的参数,命令行全都能改:

Terminal window
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=1
qm 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 正常

虚拟机生命周期管理#

创建虚拟机#

Terminal window
# 最小化创建
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 # 宿主机开机时自动启动

克隆与模板#

Terminal window
qm clone 103 104 --name debian-clone --full # 完整克隆(独立磁盘,推荐)
qm clone 103 104 --name debian-clone # 链接克隆(依赖母盘,仅支持 qcow2)
qm template 104 # 把 VM 转为模板(用 --full 克隆模板更佳)

删除#

Terminal window
qm destroy 105 # 删除 VM 配置
qm destroy 105 --purge # 同时删除备份和配置项
qm destroy 105 --destroy-unreferenced-disks # 连未引用的磁盘一起删

迁移#

Terminal window
qm migrate 100 node2 --online # 在线迁移(同集群,虚拟机不关机)
qm migrate 100 node2 # 离线迁移
qm move-disk 100 scsi0 --storage node2-vmdata --delete # 只迁移磁盘

磁盘与存储管理#

存储概览#

Terminal window
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 # 释放磁盘

磁盘扩容#

Terminal window
qm resize 100 scsi0 +10G # 在线扩容 +10G(无需关机)
qm resize 100 scsi0 100G # 扩到固定 100G
CAUTION

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:

Terminal window
# ① 创建空 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=scsi0
qm start 105

如果磁盘文件还在远程机器上,先传过来:

Terminal window
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 支持快照、压缩、稀疏

备份与恢复#

手动备份#

Terminal window
# 单个 VM
qm backup 100 --storage pve-config --mode snapshot --compress zstd
# 所有 VM + 容器
vzdump --all --storage pve-config --mode snapshot --compress zstd
# 排除某些 VM
vzdump --all --exclude 101,102 --storage pve-config

备份模式对比#

模式虚拟机是否停机一致性适用场景
snapshot不停机一般(应用层数据可能不一致)日常推荐
suspend短暂挂起较好对一致性敏感
stop完全停机最好数据库等关键业务
NOTE

snapshot 模式底层原理是 LVM 快照或 qcow2 快照:瞬间生成一个只读快照,然后备份快照,期间 VM 继续运行。所以即使 100G 的磁盘,备份几乎不阻塞业务,代价是少量 I/O 开销。

恢复#

Terminal window
# 恢复到原 VMID
qm 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-data
IMPORTANT

备份的价值在于能恢复。建议每月用 qmrestore 恢复到临时 VMID(比如 199),启动验证后删除——只备份不演练,等真出事了才发现备份坏了才是最大的坑。

定时备份(计划任务)#

PVE 的定时备份有两种方式:

方式一:Web 界面(推荐)

数据中心(Datacenter)→ 备份(Backup)→ 添加,配置项与命令行一一对应,写入 /etc/pve/jobs.cfg

方式二:命令行 + Cron(灵活)

Terminal window
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。

定时关机/开机#

Terminal window
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 102
NOTE

Linux cron 的星期字段:0 = 周日1-6 = 周一到周六。1-5 是周一到周五,0,6 是周末。

批量启停所有 VM#

Terminal window
# 关掉所有运行中的 VM(先优雅,后强停)
for id in $(qm list | awk '$3=="running"{print $1}'); do
qm shutdown "$id" --timeout 300 || qm stop "$id"
done
# 启动所有已存在的 VM
for id in $(qm list | awk 'NR>1{print $1}'); do qm start "$id"; done

systemd timer(比 cron 更现代的替代)#

/etc/systemd/system/vm-shutdown.service
[Unit]
Description=Shutdown VM 102 gracefully
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/qm shutdown 102 --timeout 300
/etc/systemd/system/vm-shutdown.timer
[Unit]
Description=Daily VM 102 shutdown at 23:00
[Timer]
OnCalendar=*-*-* 23:00:00
Persistent=true
[Install]
WantedBy=timers.target
Terminal window
systemctl daemon-reload && systemctl enable --now vm-shutdown.timer
systemctl list-timers # 查看所有计划

组合实战:每晚”备份 + 关机 + 次日开机”#

Terminal window
//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 102
0 8 * * * qm start 102

LVM 底层命令#

PVE 的 vm-data(dir 类型)和 vm-storage(lvm 类型)存储背后都有 LVM 的身影。LVM 三层结构:物理卷 PV → 卷组 VG → 逻辑卷 LV

查看#

Terminal window
pvs / pvscan / pvdisplay # 物理卷:哪块盘、多大、属于哪个 VG
vgs / vgscan / vgdisplay # 卷组:总容量 / 剩余空间
lvs / lvscan / lvdisplay # 逻辑卷:名字、大小、状态
lvs -a # 连快照、thin 子卷一起显示
NOTE

记忆技巧:pvs/vgs/lvs精简版(一行一条),*display详细版*scan扫描

创建 / 扩容 / 缩容#

Terminal window
# 创建:物理盘 -> PV -> VG -> LV
pvcreate /dev/sdb
vgcreate vm-storage /dev/sdb
lvcreate -L 100G -n vm-105-disk-0 vm-storage
lvcreate -l 100%FREE -n vm-105-disk-0 vm-storage # 用掉全部剩余空间
# 扩容(顺序:PV -> VG -> LV -> 文件系统)
pvresize /dev/sdb # 物理盘扩容后刷新 PV
vgextend vm-storage /dev/sdc # 加一块盘进 VG
lvextend -L +10G vm-storage/vm-105-disk-0 # LV +10G
lvextend -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-1
lvcreate -s -L 10G -n snap1 vm-storage/vm-105-disk-0 # 快照(PVE 备份底层)
CAUTION

扩容顺序永远是:PV → VG → LV → 文件系统;缩容顺序相反,且缩容前必须先备份。LVM 的坑大多出在顺序搞反。

与 PVE 结合#

Terminal window
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 磁盘镜像工具#

Terminal window
# 查看镜像信息(关键:格式、实际占用、backing file)
qemu-img info debian.qcow2
# 创建
qemu-img create -f qcow2 debian.qcow2 50G
qemu-img create -f raw disk.img 50G
# 格式转换
qemu-img convert -f qcow2 -O raw debian.qcow2 disk.raw
qemu-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.qcow2
qemu-img create -f qcow2 -b base.qcow2 overlay.qcow2 # 差量镜像(overlay)
qemu-img rebase -b base.qcow2 overlay.qcow2 # 重设 backing file

QEMU Monitor 控制台#

Terminal window
qm monitor 100 # 进入 VM 的 QEMU monitor

常用交互命令:

Terminal window
info status # 运行状态
info block # 磁盘设备及状态
info cpus # vCPU 情况
info balloon # 内存气球
savevm snap1 # 系统级快照
loadvm snap1 # 恢复快照
system_reset # 复位
system_powerdown # 发关机信号
quit # 退出 monitor

排错技巧#

看日志#

Terminal window
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 实际占用的宿主机资源#

Terminal window
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 保留策略

速查表#

场景命令
看所有 VMqm list
看 VM 配置qm config 100
优雅关机qm shutdown 100 --timeout 300
在 VM 内跑命令qm guest exec 100 -- df -h
看存储pvesm status
看 LVM 三层pvsvgslvs
看 qcow2 镜像qemu-img info xxx.qcow2
导入 qcow2qm 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 qmqm help 和官方 Wiki 是最好的老师。

高效的PVE运维指南:Proxmox VE命令行从入门到实战
https://www.mintlab.top/posts/learn/pve-command-line-guide/
作者
Mint
发布于
2026-08-08
许可协议
CC BY-NC-SA 4.0
发表评论

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

未登录
昵称
邮箱
填写头像链接与主页链接

头像链接为空默认使用gravatar头像

头像
主页
人机验证
评论列表

以下是可爱的评论们:

暂无评论, 呜呜, 快来评论喵!