跳转到内容

命令行工具全景:qm、pct、pvesm、pvecm、pvesh、ha-manager ​

Web UI 点几下就能做的事,PVE 几乎都留了一条对应的命令。这篇不背命令参数(速查见命令速查),讲清楚这些工具分别管什么、为什么长这样、遇到具体任务该挑哪一个。

为什么要懂这个 ​

单机点点鼠标够用的时候,命令行只是锦上添花。但只要你开始:

  • 写脚本做健康检查或批量操作,
  • 在 SSH 会话里比切换浏览器标签页更快,
  • 或者准备学 Terraform / Ansible 这类自动化工具,

就绕不开这套命令行体系。而且它们和 Web UI、配置文件、REST API 其实是同一件事的四种入口,understand 一处,另外三处跟着就懂了。

开始之前 ​

  • 一台能 SSH 上去的 PVE 节点,或者用 Web UI 的 Shell 按钮,两者等价。
  • 多数子命令要在具有相应权限的账号下执行;本文和大多数 PVE 文档一样默认你以 root 登录宿主机 shell,所以命令前不写 sudo。非 root 账号能做什么由 用户与权限 的角色决定。
  • 装个 bash-completion(多数发行版默认已装),Tab 补全能省很多翻文档的时间:qm <Tab><Tab> 会列出所有子命令。

工具家族:谁管什么 ​

工具管什么常见用法
qm虚拟机(QEMU/KVM)建、改、启停、快照、克隆
pctLXC 容器同上,对象换成容器
pvesm存储查状态、列内容、增删存储定义
pvecm集群建群、加入/移除节点、看 quorum
pveum用户与权限建用户/角色/Token、改权限路径
pvenode单个节点本身改主机名、证书、任务与 syslog 设置等节点级配置
ha-manager高可用资源管理 HA 资源组、状态、维护模式
vzdump备份手动触发一次备份(计划任务走 Web UI 更方便)
pveam容器模板刷新索引、下载 LXC 模板
pveversion版本信息求助或核对版本时先贴这个
pvesh直接调用 REST API界面上能做的一切,这里都能做

记不住参数就问工具自己

每个工具都支持 <工具> help(列出全部子命令)和 <工具> help <子命令>(该子命令的参数说明),例如 qm help clone。man page 也在:man qm、man pct、man pvesm。不用死记,现查更可靠。

这些命令是怎么"长"出来的 ​

PVE 用一份 JSON Schema 定义整个 REST API:每个端点接受什么参数、类型是什么、需要什么权限。Web UI、这些命令行工具的参数解析、官方的 API 文档查看器 都是从这同一份 schema 生成的。

这解释了两个现象:

  • 命令行参数和 API 参数几乎一一对应——qm set <vmid> -memory 4096 背后就是对 /nodes/{node}/qemu/{vmid}/config 发一个 PUT,memory 是同一个参数名。
  • Web UI 能做的操作,命令行和 API 理论上都能做,因为它们本质上是同一个后端的三张脸。反过来也一样:想知道某个命令行选项在界面上叫什么,去 Web UI 对应页面找同名或近似的字段。

三种入口,什么时候用哪个 ​

场景推荐入口
偶尔手动操作一两台客户机Web UI,选项和反馈最直观
SSH 里快速查状态、改一两个参数qm / pct / pvesm 等专用命令,语法比裸调 API 短
要 JSON 输出、Web UI 没暴露的字段、写在 PVE 节点本地的脚本pvesh,直接调 API,见REST API 与 pvesh
脚本跑在另一台机器上(CI、NAS、另一个数据中心)REST API + API Token,pvesh 只能在 PVE 节点本地当 root 用
批量创建/销毁一批客户机、需要声明式描述Terraform / OpenTofu
配置客户机内部、跑在一堆已存在的机器上Ansible

pvesh 是特例:它绕开了 HTTP

pvesh 在 PVE 节点本地以 root 运行时,是直接调用 API 函数本身,不经过 REST/HTTPS 那一层,所以不需要账号密码或 Token——你已经是 root 了。这也是它不能用来从别的机器远程调用的原因:它压根没走网络。远程场景请看下一篇的 curl/Token 方式。

命令是否会自动"找对节点" ​

集群环境下一个常见疑问:某台虚拟机在节点 B 上,能不能在节点 A 的 shell 里操作它?

  • qm / pct 这类面向客户机的命令,PVE 会自动代理到客户机实际所在的节点,通常不用关心当前登录的是哪个节点。
  • pvecm(corosync 相关)、pvenode 这类面向节点本身的命令,只对当前节点生效,必须登录到目标节点执行。
  • pvesh 支持 --noproxy 选项主动关掉自动代理,调试"这个请求到底该由哪个节点处理"时有用。

检查结果 ​

在你的机器上确认环境可用:

sh
# 版本信息,求助时也会用到
pveversion -v

# 随便一个工具的帮助,能出来说明装得没问题
qm help

# pvesh 能不能正常调用本地 API
pvesh get /version

三条都有正常输出,说明命令行这条路径通了。

常见问题 ​

知道要做什么操作,但不知道该用哪个命令。 先在 Web UI 上做一遍这个操作,观察它在哪个菜单下,再去对应工具的 help 里找同名字段——十有八九名字是对得上的。

命令跑完了,Web UI 上却没有立刻变化。 多数情况是页面没刷新;/etc/pve 的改动在集群里靠 pmxcfs 同步,正常是秒级,刷新一下页面即可。持续不一致再去看任务日志。

脚本要不要用 root。 在 PVE 节点本地跑的运维脚本沿用 root 没问题(毕竟你本来就是登录 root shell)。但凡脚本要从别的机器触发,或者要长期驻留、定时执行,改用权限受限的 API Token,见REST API 与 pvesh。

参考资料 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。