外观
命令行工具全景:qm、pct、pvesm、pvecm、pvesh、ha-manager
Web UI 点几下就能做的事,PVE 几乎都留了一条对应的命令。这篇不背命令参数(速查见命令速查),讲清楚这些工具分别管什么、为什么长这样、遇到具体任务该挑哪一个。
为什么要懂这个
单机点点鼠标够用的时候,命令行只是锦上添花。但只要你开始:
就绕不开这套命令行体系。而且它们和 Web UI、配置文件、REST API 其实是同一件事的四种入口,understand 一处,另外三处跟着就懂了。
开始之前
- 一台能 SSH 上去的 PVE 节点,或者用 Web UI 的 Shell 按钮,两者等价。
- 多数子命令要在具有相应权限的账号下执行;本文和大多数 PVE 文档一样默认你以
root登录宿主机 shell,所以命令前不写sudo。非 root 账号能做什么由 用户与权限 的角色决定。 - 装个
bash-completion(多数发行版默认已装),Tab 补全能省很多翻文档的时间:qm <Tab><Tab>会列出所有子命令。
工具家族:谁管什么
| 工具 | 管什么 | 常见用法 |
|---|---|---|
qm | 虚拟机(QEMU/KVM) | 建、改、启停、快照、克隆 |
pct | LXC 容器 | 同上,对象换成容器 |
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。
参考资料
- pveversion 到 pvesh:常用命令组合——按任务分类的完整命令速查
- 命令速查首页
- REST API 与 pvesh
- 用户与权限
- 官方文档:Proxmox VE Administration Guide(各工具的 man page 章节)