ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ESXi虚拟机一键打开VMRC控制台:moid与会话ID获取全流程

ESXi虚拟机一键打开VMRC控制台:moid与会话ID获取全流程 做虚拟化运维的人翻得最多的就是vSphere客户端里那个“小显示器”图标。右击虚拟机、打开控制台、等浏览器插件转圈……这套操作单看没什么问题可当你手里管着几十台ESXi主机、几百台虚拟机要远程排障、要看启动画面、要挂载本地镜像重装系统时每次都在网页里点来点去就很折磨人。我自己后来习惯了绕开网页控制台直接用VMRC协议加moid把本地客户端一次性拉起来比网页流畅USB透传和快捷键也好用得多。这篇就完整记录一下这个思路怎么在ESXi里找到虚拟机唯一的moid拿到之后如何拼出vmrc://链接再用VMRC客户端把远程虚拟机控制台直接给拉起来。全程不需要额外的商业工具PowerCLI或几句Python脚本就能搞定适合自己搭了ESXi小环境、或者日常要管一批虚拟机的运维同学参考。1. 先把moid和VMRC这两个关键概念理清楚1.1 moid就是虚拟机在管理面里的“身份ID”moid是Managed Object ID的缩写翻译过来就是“托管对象标识符”。ESXi和vCenter底层走的都是vSphere Web Services API这个体系里所有可管理的对象比如数据中心、集群、宿主机、虚拟机、网络、存储统统被抽象成Managed Entity每个Entity在各自的管理平台进程里都有一个唯一的编号。虚拟机的moid长这样vm-1234、vm-42、vm-1001一眼就能看出是VirtualMachine类型的对象。moid和虚拟机的显示名称没有绑定关系。你给虚拟机改个名比如把ubuntu2204-docker重命名成web-docker显示名变了但moid还是原来那个vm-42。反过来如果一台虚拟机从一台ESXi导出OVF再导入到另一台ESXi那它就拿到了一个新的moid因为它在新的管理端进程里重新注册了。理解这一点很重要moid是“运行时标识”不是“资产永久ID”在同一套管理平台下基本不变跨环境迁移或灾备切换后会变化。为什么要专门去拿这个ID因为在很多自动化场景里我们必须用一个稳定、唯一的字符串去指代某台虚拟机。显示名可能会重名ESXi直连时不同主机上可以出现同名VMUUID又是另一套体系API调用时不太直观而moid恰好保持在“能够人工阅读、又能被API直接消费”的区间所以在PowerCLI脚本、pyvmomi脚本、VMRC链接和各种运维平台集成都用它做定位依据。1.2 VMRC是独立控制台客户端不是远程桌面VMRC的全称是VMware Remote Console它是VMware官方提供的独立桌面控制台程序。你可以把它理解成专门为vSphere环境设计的“KVM窗口”但它比Web界面里那个控制台插件要完整得多。VMRC通过自定义协议跟vSphere环境交互。协议前缀是vmrc://浏览器或者其它程序遇到这类链接时会把请求交给本机安装的VMRC客户端处理。VMRC客户端拿到链接以后里面携带的参数就会告诉它要去连接哪个服务器、用哪个会话身份、打开哪一台虚拟机。VMRC相比Web控制台的优势主要在三块键鼠体验更接近物理机比如CtrlAltDel、特殊功能键的发送更可靠全屏和自动缩放也更顺滑对USB设备重定向支持好得多在远程修系统、跑加密狗、刷设备固件时非常关键声音和多个显示器配置支持更完整不会出现网页插件那种兼容性参差不齐的状况。1.3 为什么非要自己拼vmrc链接不直接用网页控制台有人会问Web Client里点一下“启动远程控制台”不就行了嘛何必自己拼接话是没错但“点一下”的背后客户端生成的其实就是一个vmrc://链接浏览器收到后交给VMRC去打开。当我们手里的虚拟机数量很多或者需要把控制台入口嵌入到自己的运维导航页、报警系统、工单系统里时手动去Web界面里点就很低效了。我自己遇到的实际场景是这样的机房里有三台ESXi总共跑了快一百台虚拟机大部分是Linux开发环境和自动化测试节点。每次接到同事报障第一件事就是开控制台看启动画面。网页控制台加载慢而且开多了标签页内存顶不住。后来我把所有虚拟机的moid抓出来做了一个内网小导航页每个名字后面跟一个“打开控制台”按钮点击就是vmrc://链接VMRC客户端直接被拉起来。排障效率直接翻倍。拼链接最关键的两个参数就是sId和moid前者是当前登录用户的会话ID用来证明“我是谁”后者是目标虚拟机的ID用来告诉VMRC“我要连哪台”。搞懂这两个参数后面所有操作都是水到渠成的事。2. 开工前准备版本、工具和连接凭证2.1 环境版本怎么选老版本ESXi能不能用这套方案的核心依赖是VMRC协议和vSphere的托管对象标识机制所以它对ESXi版本并不挑食。我自己在ESXi 6.5、6.7、7.0 U3、8.0 U1这几代上都验证过都能正常工作。vCenter环境也同理从vCenter侧生成的vmrc://链接一样能拉起VMRC。但版本匹配上有个点需要注意VMRC客户端版本不能太老。比如VMRC 9.x去连ESXi 8.0控制台打开时大概率报协议不匹配或者白屏。建议装VMRC 11或12系列对7.0/8.0兼容性最好。如果是老机房ESXi 6.5VMRC 12连上去也没有问题向后兼容做得不错。浏览器这边没有太严格的限制Chrome和Firefox都可以第一次点击vmrc://链接时会弹个“要打开此应用程序吗”的确认框勾选记住并允许就行。Edge的体验跟Chrome基本一致。个别版本Edge可能拦得比较严在浏览器设置里把vmrc加入允许协议列表就好。2.2 安装VMRC并确认协议已经注册到系统里VMRC的安装包直接在VMware官网搜“VMware Remote Console”Windows版是一个MSI安装包下载完一路Next就能装好。安装完之后有一步容易被忽略确认vmrc协议确实写进了系统关联。Windows下可以用这个方式检查打开注册表编辑器定位到HKEY_CLASSES_ROOT\vmrc如果看到默认值里写着类似“VMware Remote Console”的说明而且shell\open\command下面的命令指向VMRC安装目录里的可执行文件就说明协议注册成功。很多VMRC点击没反应的问题最后排查下来都是协议关联没有生效。装好后先手动验证一次点击开始菜单里的“VMware Remote Console”能正常打开主界面就行。不过单纯打开主界面没法直接连接因为连接目标要通过vmrc://链接带进去所以后面我们需要先生成链接再测试。2.3 PowerCLI连接ESXi推荐的准备方式虽然只用网页也能抓moid和会话ID但PowerCLI是效率最高、最容易脚本化的方式。安装PowerCLI模块很简单Windows PowerShell或者PowerShell 7里执行Install-Module -Name VMware.PowerCLI -Scope CurrentUser装完之后因为大多数ESXi用的是自签名证书PowerCLI默认会拦证书校验需要先放行Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false然后就可以连接ESXi主机了。这里要注意PowerCLI连接ESXi时用户名通常是root或者你在ESXi本地用户里创建的账号不能直接用vCenter的SSO账号去连ESXi主机$server Connect-VIServer -Server 192.168.50.10 -User root -Password 你的密码连接成功以后PowerCLI会把这个连接对象存到$server里。接下来获取moid和会话ID都靠这个对象。3. 获取虚拟机moid的三种实测方法3.1 网页法在URL和MOB浏览器里直接找如果你只是偶尔查一台虚拟机的moid上网页面里翻是最快的。直连ESXi主机时登录ESXi的Host Client管理界面在左侧清单里选中某台虚拟机然后打开浏览器的开发者工具切到Network网络标签页随便点击页面上的刷新操作过滤关键词moid或者vm-就能看到API请求的URL里带vm-数字的字段那个数字加前缀就是这台虚拟机的moid。还有一种更正经的方式利用ESXi自带的MOBManaged Object Browser浏览器。在浏览器地址栏直接访问https://你的ESXi地址/mob/?moidha-folder-vm这个页面会列出根虚拟机文件夹下的所有虚拟机条目。点击任意一条VirtualMachine: vm-42URL参数里的moid就是目标虚拟机的ID。MOB页面上还能直接看到这个对象的各种属性和方法对理解vSphere对象模型很有帮助。不过需要注意新版vCenter组件已经逐步移除了MOB入口这套方法主要适用于直连ESXi主机时使用。3.2 PowerCLI一条命令导出全部虚拟机的moidPowerCLI是更稳妥的路径尤其是要批量处理的时候。连上ESXi之后$vm Get-VM -Name ubuntu2204-docker $vm.MoRef.Value输出的就是类似vm-42的moid清爽直接。如果你要把所有虚拟机都导出来Get-VM | Select-Object Name, {NMoid;E{$_.MoRef.Value}} | Format-Table -AutoSize输出结果大概长这样Name Moid ---- ---- ubuntu2204-docker vm-42 centos7-build vm-43 win10-test vm-58 opensuse-db vm-67这里要解释一下为什么用MoRef.Value而不是直接输出MoRef。MoRef是vSphere API里的托管对象引用类型打印出来是一个复杂对象而MoRef.Value才返回那份字符串ID。很多新手在这里卡住输出的全是VMware.Vim.ManagedObjectReference之类的类名就是因为少了.Value。3.3 pyvmomi脚本自动扫描适合Python玩家如果团队里Python生态更成熟或者你要把这个能力集成到自己的运维平台里用pyvmomi也能拿到同样的moid。pyvmomi是VMware官方维护的Python SDK。先安装pip install pyvmomi然后写一段最简单的扫描脚本from pyVim.connect import SmartConnect, Disconnect from pyVmomi import vim import ssl # 自签名证书环境下忽略校验 ctx ssl.create_default_context() ctx.check_hostname False ctx.verify_mode ssl.CERT_NONE si SmartConnect( host192.168.50.10, userroot, pwdyour-password, port443, sslContextctx ) content si.RetrieveContent() view content.viewManager.CreateContainerView( containercontent.rootFolder, type[vim.VirtualMachine], recursiveTrue ) for vm in view.view: print(f{vm.name}: {vm._moId}) view.Destroy() Disconnect(si)这个脚本会遍历ESXi根对象下所有虚拟机的视图逐个打印显示名和moid。注意对象属性用的是vm._moId这是pyvmomi暴露托管对象ID的入口比通过vm.MoRef.Value更直接一点但在pyvmomi里vm.MoRef不存在这个细节要记住。4. 拿到会话ID拼接并打开VMRC链接4.1 会话IDsId从哪来两种来源都可靠VMRC链接里的sId全称是Session ID它就是你在ESXi或vCenter上登录会话的凭证。VMRC客户端拿着这个ID去服务器端做鉴权服务器确认会话有效后才会把对应虚拟机的控制台通道交给它。获取方式主要有两种。如果你刚用PowerCLI连上ESXi当前连接对象里就带着会话ID$server.SessionId输出是一长串UUID格式的字符串类似5239a52e-1d80-4b3d-bc8e-2f9f9f9f9f9f如果你不愿意用命令行网页登录也一样能拿到。用vCenter或ESXi Host Client登录后打开浏览器开发者工具切到“Application”或“存储”标签查看Cookie列表找到VMWARE_USER_SESSION_ID这样的键它的值就是当前会话ID。直连ESXi时部分版本里Cookie键名可能叫vmware_session_id之类的变体但逻辑完全相同从浏览器会话里提取那个会话ID而不是把浏览器地址栏里其它无关参数拿来用。4.2 拼接vmrc://链接并让浏览器把控制台拉起来拿到了sId和moid之后拼接链接就是一句话的事vmrc://clone.vmware.com?sId你的会话IDmoid目标虚拟机的moid这里clone.vmware.com其实只是一个固定的协议占位符不用改成你公司的域名。VMRC客户端处理链接时会从sId参数反向推断要连接的服务端地址吗实际流程不是这样真正起作用的机制是sId会话本身就绑定了它来自哪台服务器VMRC客户端拿这个会话ID去跟对应的vCenter或ESXi通信所以占位域名写什么都不影响连接。如果你是从某台ESXi主机上拿到的会话ID那VMRC自然去找那台ESXi如果是vCenter的会话ID就去找vCenter。在浏览器地址栏里粘贴完整链接或者直接放在一个HTML页面的a标签里点击a hrefvmrc://clone.vmware.com?sId5239a52e-1d80-4b3d-bc8e-2f9f9f9f9f9fmoidvm-42 打开 ubuntu2204-docker 控制台 /a第一次点击时浏览器会弹一个“是否打开VMware Remote Console”的提示勾选“始终允许”后续点击就直接拉起VMRC客户端了。客户端窗口出现后会自动完成连接显示虚拟机的真实屏幕画面到这里整套链路就走通了。4.3 批量生成所有虚拟机的VMRC链接和桌面快捷方式单台验证成功之后批量就是纯体力活。下面这段PowerCLI脚本可以把当前ESXi里所有虚拟机的VMRC链接全部导出来并顺手在桌面生成.url快捷方式点哪个就能开哪个$server Connect-VIServer -Server 192.168.50.10 -User root -Password 你的密码 $sid $server.SessionId $vms Get-VM foreach ($vm in $vms) { $moid $vm.MoRef.Value $url vmrc://clone.vmware.com?sId$sidmoid$moid Write-Output $($vm.Name)t$url } # 可选在桌面生成 url 快捷方式 $desktop [Environment]::GetFolderPath(Desktop) $linkDir Join-Path $desktop vmrc-links New-Item -ItemType Directory -Path $linkDir -Force | Out-Null foreach ($vm in $vms) { $moid $vm.MoRef.Value $url vmrc://clone.vmware.com?sId$sidmoid$moid $shortcut Join-Path $linkDir $($vm.Name).url $content [InternetShortcut]rnURL$urlrnIconIndex0 Set-Content -Path $shortcut -Value $content -Encoding ASCII } Disconnect-VIServer -Server $server -Confirm:$false注意一个坑会话ID是有有效期的几小时到一天不等具体看ESXi或vCenter的会话超时策略。所以这些快捷方式最好当成“临时导航页”来用过期后重新跑一遍脚本刷新即可。我自己通常是写一个PowerShell脚本文件每次需要批量进虚拟机时先跑一下几十秒刷出一批新链接再根据当天需求点开。5. 完整实操回放ESXi直连场景下的全流程记录5.1 演练环境说明为了讲清楚整个流程我按一套实际跑通过的环境来走一遍。环境很简单一台独立ESXi主机上面跑了几台测试虚拟机我在本机用PowerCLI和VMRC操作。项目实际值ESXi版本VMware ESXi 8.0 U1ESXi管理地址192.168.50.10连接账号root目标虚拟机ubuntu2204-dockerVMRC版本VMware Remote Console 12.5.0PowerCLI版本13.x5.2 操作步骤与过程记录第一步放行证书校验并连接ESXiSet-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false $server Connect-VIServer -Server 192.168.50.10 -User root -Password Pssw0rd命令执行完PowerCLI会打印连接的服务器信息没有报错就代表连接成功。第二步拿会话ID和moid$server.SessionId $vm Get-VM -Name ubuntu2204-docker $vm.MoRef.Value这里两个值分别是7d30f0a4-3e5c-4d82-8f8f-2d5d5d5d5d5d vm-42第三步拼接链接vmrc://clone.vmware.com?sId7d30f0a4-3e5c-4d82-8f8f-2d5d5d5d5d5dmoidvm-42第四步我把这个链接写到一个临时HTML文件里用浏览器打开点击链接。Chrome弹出“要打开VMware Remote Console吗”的提示确认之后VMRC窗口自动弹出进度条一闪而过屏幕里直接出现了Ubuntu 22.04的登录界面。整个过程从点击到出现画面大概三秒左右比加载网页控制台快不少。第五步我顺手验证了键盘和鼠标事件。在VMRC窗口里按了一下回车输入框正常响应然后测试了CtrlAltDel发送Ubuntu图形界面弹出了系统会话菜单说明特殊键的发送能力也正常。VMRC窗口右上角的“全屏”按钮也能正常工作全屏后如果接多个显示器还可以在菜单里选Span模式铺满多屏。5.3 如果控制台只黑屏或转圈怎么判断卡在哪一环最常见的问题场景是点击链接后VMRC窗口一直在转圈最后弹个错。这时候分成三段排查第一段看会话ID是否有效。把链接里的sId拿下来回到ESXi Web界面看一眼会话是否还在或者干脆用PowerCLI重新连一次、重新取一次sid再试。会话过期是最常见的原因没有之一。第二段看moid是否对得上。如果你是从另一个环境拷来的链接moid很可能已经对不上当前管理平台里的虚拟机了。用PowerCLI再跑一遍Get-VM | Select Name, {NMoid;E{$_.MoRef.Value}}核对确定链接里的moid真实存在。第三段看证书是否被系统信任。ESXi默认自签名证书VMRC在Windows的证书存储里找不到该证书时就会拒绝建立受信通道。解决办法是用浏览器先访问一次https://ESXi地址点击“继续前往”并把证书错误页面里的证书信息手工导入到“受信任的根证书颁发机构”或者通过组策略统一分发。我自己遇到的黑屏案例绝大多数是会话过期或者证书没导入重新取sId后立刻就好了。6. 常见问题与排查技巧实录6.1 点击vmrc链接没反应浏览器不识别协议怎么办这种情况通常先检查VMRC是否真的装好了。在Windows的“设置 - 应用”里看有没有“VMware Remote Console”如果能看到再看协议关联。按WinR输入regedit回车定位到HKEY_CLASSES_ROOT\vmrc如果这个键不存在说明安装过程中协议注册失败了重装VMRC即可。还有一个容易被忽略的点某些浏览器的“自定义协议”弹窗被设置成静默拦截。Chrome地址栏输入chrome://settings/content/handlers把VMware Remote Console的站点权限改回“允许”。Edge的设置路径类似在“Cookie和网站权限”里找到“协议处理程序”确认vmrc没有被禁用。如果这些都正常再考虑是不是VMRC版本太老升级到12.x版本基本能解决大部分兼容性问题。6.2 VMRC报SSL证书或鉴权错误处理的通用思路自签名证书引起的报错是最多见的。处理起来不复杂先把ESXi主机的证书下载下来Windows下可以通过浏览器访问https://192.168.50.10在证书错误页里查看证书然后导出DER或Base64格式再双击导入到本机“受信任的根证书颁发机构”存储区。完成后重启VMRC再次点击链接就正常了。鉴权类报错就重点盯会话ID。记住一条铁的规律sid必须是“能打开目标虚拟机控制台的那个账号”的会话而且会话必须有效。如果你在PowerCLI里用root连的ESXi那就拿root的sessionId去拼链接如果你在网页里用普通域账号登录的vCenter那就拿那个账号的会话ID。混用不同会话VMRC大概率给你一个“没有权限连接”的错误。我在实际排障时还会顺手看个东西ESXi或vCenter上的会话会话超时设置。有些安全基线会要求15分钟断开会话那意味着任何长时间挂着的VMRC链接都会很快失效。遇到这种情况要么调高会话空闲超时要么干脆把所有链接生成操作做成脚本用时现取。6.3 常见问题速查表问题现象可能原因解决办法浏览器不识别vmrc协议VMRC未安装或协议关联丢失重装VMRC检查注册表HKEY_CLASSES_ROOT\vmrc点击链接后VMRC转圈会话ID过期重新登录获取新sid再拼链接报“未受信任的证书”ESXi自签名证书未被信任手工导入主机证书到受信任根证书存储提示“虚拟机不存在”moid来源不对或已变化重新用PowerCLI比对当前虚拟机moidVMRC空白/黑屏VMRC版本太老或主机负载过高升级VMRC版本检查ESXi主机CPU/内存压力VMRC能连但键盘错乱本地输入法和远程会话冲突关闭本地输入法特殊模式在VMRC菜单里重新捕获键盘6.4 我把这套能力扩展成运维导航页的体会最后分享一个我实际用得最爽的扩展。PID拿到手之后我写了一个极简的Python脚本定时通过pyvmomi读取当前ESXi上所有虚拟机的名字、IP、moid然后生成一个内网HTML页面。页面上每个虚拟机一行旁边放三个按钮一个走VMRC开控制台一个是SSH直连入口浏览器调用本地终端但公司不方便用的话也可以直接展示IP和账号信息另一个是复制moid。因为有sid会过期的问题我的脚本每次生成页面时都会顺带用PowerCLI刷一遍最新的会话ID保持页面上的VMRC链接永远是有效的。这个页面在值班场景里特别好使。同事打电话说“某台机器开不了机”我不需要先登录vCenter再层层点菜单直接打开导航页点目标机器后面的按钮VMRC几秒内就出现在眼前比任何网管系统都来得直接。如果你也想试建议从第3.2节的PowerCLI批量导出开始把moid列表先跑出来。然后手动拼一次链接确认VMRC能打开再做批量生成页面或者快捷方式。整套流程踩过一遍坑之后后面就是纯效率提升了值得花一个下午把它落地到自己的环境里。
返回列表