爱意满满的作品展示区。
normalcoder

做了个 prlctl 风格的 VMware CLI

  •  
  •   normalcoder ·
    normal-coder · 7h 49m ago · 265 views

    先贴地址和安装...目前暂时只支持了 Homebrew 。手动安装可以自行编译或走 GitHub Release 。

    为什么写这个

    核心还是解决自己的使用问题(笑。

    出于对环境纯粹的洁癖,一般各种新工具的尝试还是选择在干净的 OS 内去解决。

    考虑到各种安全、隔离问题,有些环境不想/不适用用容器。于是常年在重装各种系统和各种初始化中来来去去,每次操作都相当耗费心神。

    初始化系统的活儿交给 Agent 干,心里又不踏实😩。。

    于是反复在各种老牌虚拟化方案和新晋虚拟机中来回捯饬。最终。。对个人免费的 VMware 还是真香 😂😂😂

    VMware 漫长的历史和博通的产品调性。让 VMware 比起 PD/OrbStack/Lima 一众产品,开发者友好程度不太够。

    • vmrun 的参数太反人类了——快照、克隆、往 guest 里拷个文件,每样都要记一长串路径参数,用完就忘;敲起來还费手
    • 用惯了 Parallels 的 prlctl,换到 VMware 之后发现没有对应手感的 CLI
    • 想脚本化批量操作,GUI 点不动;管 vSphere 又不想开浏览器
    • ...

    为了手感。照着 prlctl 的命令风格写了一个,底层用统一的 Driver 接口把两种后端收进同一套命令里。

    快速感受

    $ vmctl list
    ┌────────────┬───────┬─────┬─────────┬─────────────┬──────────────────────────────────────┐
    │ 名称        │ 状态  │ CPU  │ 内存    │ 客户机系统    │ UUID                                 │
    ├────────────┼───────┼─────┼─────────┼─────────────┼──────────────────────────────────────┤
    │ ubuntu-dev │ on    │ 4   │ 8192 MB │ Ubuntu 24.04│ 564d1156-abcd-ef01-2345-678901234567 │
    │ win11      │ off   │ 8   │ 16384 MB│ Windows 11  │ 564d9876-2345-6789-abcd-ef0123456789 │
    └────────────┴───────┴─────┴─────────┴─────────────┴──────────────────────────────────────┘
    

    📊 基础信息

    功能 / 命令语法 备注
    列出所有虚拟机
    vmctl list
    支持 --json 输出格式。
    查看虚拟机详情
    vmctl info <vm>
    显示名称、UUID 、Tools 状态、Guest IP 等。
    查看版本信息
    vmctl version
    支持 --json 输出格式。

    🔌 电源管理

    功能 / 命令语法 备注
    启动虚拟机
    vmctl start <vm> [--nogui]
    返回即代表已加电,不等待 Guest OS 就绪。
    关闭虚拟机
    vmctl stop <vm> [--hard]
    --hard 表示强制断电。
    挂起虚拟机
    vmctl suspend <vm>
    暂停并保存当前状态到磁盘。
    恢复虚拟机
    vmctl resume <vm>
    恢复被挂起的虚拟机。
    暂停虚拟机
    vmctl pause <vm>
    暂停虚拟机运行(保持在内存中)。
    重启虚拟机
    vmctl reset <vm> [--hard]
    --hard 表示强制重启。

    🔄 生命周期

    功能 / 命令语法 备注
    克隆虚拟机
    vmctl clone <vm> --name <new-name> [--full] [--snapshot <name>] [--path <dest>]
    默认链接克隆;--full 为完整拷贝。vmrun 后端要求源 VM 已关机,vSphere 支持开机克隆。
    派生新虚拟机
    vmctl create <name> --from <vm> [--memory 4096] [--cpus 4] [--full]
    从现有 VM 派生( vmrun 后端不支持从零创建裸 VM )。
    修改虚拟机配置
    vmctl set <vm> --memory 4096 --cpus 4 [--name <new-name>]
    必须在虚拟机已关机状态下执行。
    删除虚拟机
    vmctl delete <vm>
    删除虚拟机及其全部文件,不可恢复。

    📸 快照管理

    功能 / 命令语法 备注
    列出快照
    vmctl snapshot list <vm> [--tree]
    --tree 可按树状结构展示快照关系。
    创建快照
    vmctl snapshot create <vm> <name>
    为当前状态创建快照。
    删除快照
    vmctl snapshot delete <vm> <name> [--children]
    --children 表示连同子快照一并删除。
    恢复快照
    vmctl snapshot revert <vm> <name>
    必须在虚拟机已关机状态下执行。会一并恢复快照时的电源状态。

    🖥️ Guest OS 交互

    功能 / 命令语法 备注
    执行 Guest 命令
    vmctl exec <vm> [-u root] -- '<command>'
    经 /bin/sh 执行,捕获输出并透传退出码。要求 VM 已开机且安装 VMware Tools 。
    查看 Guest IP
    vmctl ip <vm> [--wait]
    脚本友好,直接输出裸 IP 。要求安装 VMware Tools 。
    SSH 进入 Guest
    vmctl shell <vm> [--user u] [--port 22] [-i key] [--wait] [--dry-run]
    要求 Guest 开启 sshd 。-- 之后的参数会透传给 ssh 命令(如 vmctl shell <vm> -- -v)。

    特性

    • 双后端一套命令:默认 vmrun(本机 Fusion / Workstation ),--backend vsphere 直连 vCenter / ESXi ( govmomi ),本地和实验室环境切换只是换一个参数;
    • VM 引用很随意:显示名、名称的唯一子串、UUID 前缀、.vmx 路径、vSphere 的 MoRef (vm-42)都能用,不必先查 UUID ;
    • 同名快照消歧:vmrun 按名字操作快照,撞名时给出 名字#uid 候选引用(走 Fusion 13.5+ 的 vmcli ):
    • guest 内执行:vmctl exec <vm> -- 'df -h' 捕获输出并透传退出码,vmctl shell <vm> 直接 SSH 进去(-- 之后透传给 ssh );
    • 为脚本设计: --json 全命令覆盖;退出码分级( 0 成功 / 1 运行错误 / 2 用法错误 / 3 对象不存在 / 4 后端不支持,exec 再透传 guest 程序退出码);
    • 中文界面:帮助和报错默认中文,--lang en 切英文; shell 补全内置,VM 名是动态读当前后端列表补的;
    • 多 profile 配置:~/.config/vmctl/config.yaml 里配好本地 + 远程两套环境,--profile lab 一条命令切换。

    技术栈与现状

    Go + cobra + govmomi + go-pretty ,单二进制无运行时依赖,MIT 协议。

    当前 0.x 阶段,还有一些问题尚未解决。但做好一个基础镜像后,后续的工作就好弄了。。。

    • vmrun 后端不支持从零创建裸虚拟机(create 需要 --from 一个现有 VM );
    • vSphere 后端部分电源操作(如 pause)按设计返回「不支持」退出码 4 ,还在真机验证中;
    • exec / shell / ip 依赖 guest 内装有 VMware Tools (或开了 sshd )。

    最后

    写这个主要自用,但如果你也在 macOS 上折腾 VMware 、或者受够了 vmrun 的参数,欢迎来提 issue / PR ,特别是 vSphere 场景的真机反馈:

    https://github.com/normal-coder/vmctl

    Happy Hacking 🙌

    No Comments Yet
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2491 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 58ms · UTC 01:47 · PVG 09:47 · LAX 18:47 · JFK 21:47
    ♥ Do have faith in what you're doing.