ARTICLE DETAIL

资讯详情

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

Glances vms 插件深度指南:用 Multipass 与 Virsh 引擎实时监控宿主机虚拟机

Glances vms 插件深度指南:用 Multipass 与 Virsh 引擎实时监控宿主机虚拟机 Glances vms 插件深度指南用 Multipass 与 Virsh 引擎实时监控宿主机虚拟机【免费下载链接】glancesGlances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, macOS and Windows operating systems.项目地址: https://gitcode.com/gh_mirrors/gl/glancesGlances 的vms插件用于在 TUI文本界面中展示宿主机上运行的全部虚拟机VM状态、CPU、内存与负载信息其核心设计是不依赖任何 Python 客户端库而是直接调用宿主机的multipass与virsh二进制命令获取数据。本文基于 docs/aoa/vms.rst 官方文档并结合仓库中的插件实现、默认配置与测试用例完整讲解该插件的引擎原理、字段模型、配置项、阈值着色、正则过滤与安全加固帮助你在一台同时运行 Multipass 和 QEMU/KVM 虚拟机的宿主机上用 Glances 一站式掌握所有虚拟机的运行状况。插件定位宿主机的虚拟机一览表Glances 以插件化方式采集系统各维度数据vms插件属于应用解剖Anatomy of the Application文档族中的一员见 docs/aoa/index.rst 的vms条目。它的职责非常聚焦读取宿主机上由 Multipass 或 Virshlibvirt/QEMU管理的虚拟机列表与实时指标并在 curses 界面中以表格形式呈现。它与同族的containers插件监控 Docker/Podman/LXD 容器形成互补——一个面向容器一个面向虚拟机。插件入口位于 glances/plugins/vms/init.py 的VmsPlugin类。其统计数据结构为stats字典列表每个虚拟机一条记录插件通过update_local()依次轮询所有已注册的引擎watcher并合并结果# glances/plugins/vms/__init__.py 中 update_local 的核心逻辑 for engine, watcher in self.watchers.items(): version, vms watcher.update(all_tagself._all_tag()) for vm in vms: vm[engine] engine vm[engine_version] version stats.extend(vms)每个 VM 记录会打上engine引擎名与engine_version引擎版本两个标签因此即使一台宿主机同时跑着 Multipass 与 VirshTUI 也能正确区分每台虚拟机来自哪个引擎。前置条件无需 Python 依赖但要保证二进制可用原文档明确指出使用该插件不需要安装额外的 Python 依赖包对比containers插件需要pip install glances[containers]安装 docker-py 等客户端库前提是 Multipass 与 Virsh 二进制必须存在于固定路径且可执行multipass必须可从/snap/bin/multipass执行virsh必须可从/usr/bin/virsh执行。这两条路径在源码中是硬编码的常量且插件在导入模块时就会做存在性检查源码注释标注了 TODO未来可能允许在配置文件中自定义路径glances/plugins/vms/engines/multipass.pyMULTIPASS_PATH /snap/bin/multipassimport_multipass_error_tag not os.path.exists(...) or not os.access(..., os.X_OK)glances/plugins/vms/engines/virsh.pyVIRSH_PATH /usr/bin/virshimport_virsh_error_tag同理。如果二进制缺失或不可执行对应引擎的update()会直接返回(, [])插件静默跳过该引擎而不报错其余引擎仍正常工作。两种引擎的实现原理vms插件通过 glances/plugins/vms/engines/init.py 中的VmsExtension协议类定义引擎接口update(all_tag)返回(版本, VM列表)另有stop()方法Multipass 与 Virsh 各自实现该协议。Multipass 引擎JSON 输出驱动的轻量采集multipass.py 通过secure_popen执行两条命令并解析 JSONmultipass version --format json获取 Multipass 服务端版本取multipass字段结果被cache缓存避免每次刷新重复调用multipass info --format json获取全部实例的详细状态镜像哈希、实例状态、系统版本、CPU 数、内存、负载、IPv4 等。状态过滤逻辑默认只展示状态为Running、Starting、Restarting的实例all_tagTrue时展示全部。生成统计时逐字段映射插件字段Multipass 数据来源idimage_hashstatusstate小写化releaserelease或image_releasecpu_countcpu_count缺省 1cpu_time恒为NoneMultipass CLI 不提供memory_usage/memory_totalmemory.used/memory.totalload_1min/5min/15minload[0] / load[1] / load[2]ipv4ipv4[0]Virsh 引擎libvirt 域数据的深度解析virsh.py 依次调用三条命令virsh version解析输出第 4 行Running hypervisor: QEMU x.y.z获取 hypervisor 版本cache缓存virsh list --all用正则\s{2,}切分每行得到{域名: {id: ..., state: ...}}字典对每个符合条件的域分别执行virsh domstats --nowait domain与virsh desc --title domain。domstats输出被逐行解析为keyvalue字典关键指标换算如下cpu_timecpu.time纳秒/ 1e9 * 100作为每秒 CPU 时间百分比参与速率计算memory_usageballoon.rssKiB× 1024 转为字节memory_totalballoon.maximumKiB× 1024 转为字节cpu_countvcpu.current缺省 1release取virsh desc --title返回的域标题例如 Kali Linux 2024。状态过滤默认只展示running与paused状态的域——源码注释解释了原因paused 的虚拟机仍然占用内存因此值得纳入监控。这与文档中默认展示状态为 Running、Paused、Starting、Restarting 的 VM的说明一致。引擎能力差异文档关键提示原文档特别提醒了两点引擎差异在源码中均有对应证据Multipass VM 不提供 CPU 信息cpu_time恒为NoneCLI 无此数据因此 TUI 中 CPU% 一列显示-Virsh VM 不提供负载信息load_1min/5min/15min恒为Nonemsg_curse检测到首台 VM 的load_1min为None时整列隐藏if self.stats[0].get(load_1min) is not None:。同样地Virsh 引擎也不提供ipv4恒为None而 Multipass 可以拿到。如果你需要同时监控两类 VM需要接受这种字段上的拼接互补。配置文件详解vms插件的配置位于 conf/glances.conf 的[vms]段L628-L650官方文档给出了最小配置骨架默认配置在此基础上还补充了阈值着色相关选项。完整对照如下[vms] disableTrue # Thresholds, same shape as [containers]. Leave commented to keep the VM table # uncoloured, which is what it was before these existed. # CPU is the per-second rate of the VM cpu_time; MEM is against that VM own # memory_total; LOAD is the 1 min load the engine reports, if it reports one. #cpu_careful50 #cpu_warning70 #cpu_critical90 #mem_careful20 #mem_warning50 #mem_critical70 #load_careful70 #load_warning100 #load_critical500 # Per-VM override, like containername_cpu_careful: #vmname_mem_careful10 # Define the maximum VMs size name (default is 20 chars) max_name_size20 # By default, Glances only display running VMs with states: # Running, Paused, Starting or Restarting # Set the following key to True to display all VMs regarding their states allFalse各配置项说明配置项默认值作用disableTrue仓库默认配置官方文档示例为True是否禁用插件改为False启用max_name_size20VM 名称在 TUI 中显示的最大字符宽度。源码中msg_curse使用min(配置值, 最长VM名长度)取实际宽度即名称列不会无故留白对应 feature request #1723allFalse为False时仅显示状态为Running、Paused、Starting、Restarting的 VM为True时显示全部状态如shut off等cpu_careful/warning/critical50/70/90CPU 阈值。这里的 CPU 指标是 VMcpu_time的每秒速率cpu_time_rate_per_sec首个采样点或引擎未上报 CPU 时间时不参与着色mem_careful/warning/critical20/50/70内存阈值按该 VM 自己的memory_total计算百分比与 containers 插件口径一致load_careful/warning/critical70/100/500负载阈值针对引擎上报的 1 分钟负载Multipass 上报Virsh 不上报vmname_mem_careful等无按 VM 名称覆盖共享阈值格式为vmname_header_level如vm1_cpu_critical80阈值机制的实现位于 glances/plugins/vms/init.py 的_decorate()与update_views()对每台 VM 分别计算cpu_time_rate_per_secheadercpu、memory_usageheadermem最大值取自身memory_total和load_1minheaderload的告警级别并写入视图。测试 tests/test_vms_decorations.py 固化了这些行为值得关注的边界内存指标按该 VM 自身的 total 计算百分比同样的 500MB 用量在 10GB 的大 VM 中是OK在 600MB 的小 VM 中则是CRITICALtest_memory_is_measured_against_that_vm_own_total缺失值如 Virsh 无负载保持不着色绝不当作 0 或空闲处理test_a_missing_value_is_left_alone_rather_than_read_as_zeromemory_total0时不触发除零错误test_a_vm_with_no_memory_total_does_not_divide_by_zeroCPU 核数是计数而非阈值永远不着色test_cpu_count_stays_uncoloured未配置任何阈值时VM 表格保持无色test_no_configured_thresholds_leaves_the_table_as_it_was这正对应默认配置注释中的说明——保持历史行为。提示与容器插件一样这里的状态/阈值着色遵循 Glances 统一约定见 docs/aoa/index.rst 的图例GREENOK、BLUECAREFUL、MAGENTAWARNING、REDCRITICAL。模板变量复用 containers 插件的 {{foo}}原文档指出You can use all the variables ({{foo}}) available in the containers plugin.——即vms插件的动作命令同样支持容器插件定义的那套模板变量替换机制。例如在容器插件文档 docs/aoa/containers.rst 中动作行可以写成containername_cpu_critical_action/etc/glances/actions.d/container-alert.sh {{Image}} {{Id}} {{cpu}} {{name}}对vms插件而言{{name}}、{{id}}等变量同样可用用于在 VM 触发告警时向外部脚本传递上下文参数例如把 VM 名称、内存用量传给自定义告警脚本。需要特别注意的是动作命令行中不允许直接出现 shell 操作符、|、、需要管道或重定向时应封装成 shell 脚本再调用详见docs/aoa/containers.rst中的示例脚本写法。动作机制的完整说明可参考 docs/aoa/actions.rst。过滤基于正则表达式的 hide / show原文档提醒过滤隐藏或显示基于正则表达式请务必确认表达式符合预期并建议先用 regex101 之类的在线工具验证。虽然文档没有给[vms]段单独列出show/hide示例但机制由插件基类统一提供见 glances/plugins/plugin/model.py 的is_show()/is_hide()/is_display()show与hide都是逗号分隔的正则列表is_show使用re.fullmatch做全匹配忽略大小写show有值时优先以show白名单为准否则按hide黑名单过滤。容器插件的示例配置docs/aoa/containers.rst可作为写法参考# Only show specific VMs (comma-separated list of VM name or regular expression) # showthisvm,andthisone,andthoseones.* # Hide some VMs # hidedonotshowthisone,andthose.*注意 VM 名称可能包含-、.等正则元字符.*结尾的宽松匹配往往比精确匹配更实用。TUI 界面表格布局与排序启用插件后glancesTUI 中按v或通过配置启用VMs 段落的渲染逻辑在msg_curse()中实现其列结构为Engine(可选) Name Status Core CPU% MEM/MAX LOAD 1/5/15min(可选) Release标题行会显示 VM 数量以及当前排序依据sorted by ...文案来自sort_for_human映射CPU count / CPU time / memory consumption / load / VM nameEngine 列仅当统计结果中存在多个引擎时才显示update_views()检查len({ct[engine] for ct in stats}) 1只有一个引擎时标题行显示(served by multipass)或(served by virsh)名称列宽度由max_name_size与最长名称动态取小值Status 列通过vm_alert()映射颜色running→ OKstarting/restarting/delayed shutdown→ WARNING其余 → INFO。排序逻辑由模块级函数sort_vm_stats()实现并与进程列表的排序键联动glances/plugins/vms/init.py进程按内存排序时VM 按memory_usage排序次级cpu_time进程按名称排序时VM 按name排序次级cpu_time其他情况统一按cpu_time排序次级memory_usage且除按名称外均为降序。这意味着你在 TUI 中切换进程排序方式时VM 表格的排序也会同步变化监控口径保持一致。数据模型与导出插件为每台 VM 输出如下字段见 glances/plugins/vms/init.py 的fields_description同时是 RESTful API / JSON 导出的字段字典字段含义单位/说明nameVM 名称列表主键get_key()返回nameidVM IDMultipass 为镜像哈希Virsh 为域 Idrelease系统版本Multipass 取 releaseVirsh 取域标题status状态小写化cpu_countvCPU 数量cpu_timeCPU 时间rate: True单位 percent展示为每秒速率memory_usage/memory_total内存用量/上限单位 byteload_1min/5min/15min负载引擎不支持时为Noneipv4IPv4 地址Virsh 引擎恒为Noneengine/engine_version引擎名与版本由插件统一打标此外items_history_list声明了memory_usage进入历史/趋势记录配合--enable-history等导出能力使用供 Graph 导出docs/gw/graph.rst等场景绘制内存趋势。get_export()重写了默认导出逻辑只导出 VM 列表本身不含version包装便于 JSON / CSV / InfluxDB 等导出器直接消费。安全加固CVE-2026-46606 命令注入修复vms插件直接调用外部命令安全性至关重要。仓库为此专门提供了回归测试 tests/test_plugin_virsh_injection.py覆盖 GHSA-v5r2-qh84-fjx5 /CVE-2026-46606的修复验证漏洞成因VM 域名来自virsh list --all输出是不可信输入。旧实现通过 f-string 拼进secure_popen()而secure_popen会把、|、解释为 shell 操作符导致拥有 libvirt 权限的用户可以创建名称内嵌命令的 VM进而在 Glances 进程在 hypervisor 主机上通常是 root下执行任意命令修复方案两条受影响的调用update_stats、update_title改为通过subprocess.run([...], shellFalse)辅助函数_run_virsh()执行域名作为单个不透明参数传入绝不经过 shell 解释同时设置了VIRSH_TIMEOUT_SECONDS 10的超时保护避免恶意/无响应域拖垮采集循环测试固化用/usr/bin/echo替换VIRSH_PATH做金丝雀测试验证fakevm /usr/bin/touch file、fakevm | /usr/bin/tee file、fakevm file三种载荷均无法创建金丝雀文件另有TestArgumentShape断言参数必须以列表形式、shellFalse、域名原样作为 argv 末位元素传递。这一修复揭示了插件的整体安全设计思路Multipass 与 Virsh 的版本/列表查询走secure_popen输出为可信结构、命令为常量而任何拼接了外部域名的调用都必须走shellFalse的显式参数列表。如果你要在生产 hypervisor 上部署 Glances请确保升级到包含此修复的版本。验证与测试仓库为vms插件提供了两类自动化测试着色/阈值测试tests/test_vms_decorations.py验证 CPU/MEM/LOAD 三列在各阈值下的 OK/CRITICAL 着色、按 VM 自身内存上限计算、缺失值不着色、除零保护、单 VM 覆盖阈值优先等行为命令注入回归测试tests/test_plugin_virsh_injection.py如前节所述验证/|/注入被阻断、参数以shellFalse列表形式传递。在本地快速验证插件是否生效可先确认二进制路径后运行# 检查依赖二进制 ls -l /snap/bin/multipass /usr/bin/virsh # 以启用 vms 插件的方式启动或修改 glances.conf 中 [vms] disableFalse glances --disable-plugin containers # 仅保留 vms 等其他插件观察输出更细粒度的查看可通过glances --stdout json vms系列命令输出 JSON 检查字段对应 glances/outputs/glances_stdout_json.py 的按插件过滤能力确认每台 VM 的engine、status、memory_usage等字段是否符合预期再回到 TUI 中观察着色与排序行为。小结vms插件用极轻量的方式零 Python 依赖、直接调用系统二进制把 Multipass 与 Virsh 两大虚拟机生态统一纳入 Glances 的监控视野。理解它的关键在于三点一是两个引擎的数据来源与字段差异Multipass 无 CPU、Virsh 无负载/IPv4二是[vms]配置段中disable、max_name_size、all与三级阈值的组合效果三是插件对 VM 名称这类不可信输入所做的命令注入防护。配合仓库内 conf/glances.conf、glances/plugins/vms/init.py 与两个引擎实现以及 tests/test_vms_decorations.py、tests/test_plugin_virsh_injection.py 测试你可以精确掌握该插件每个行为背后的实现依据并据此调优自己的虚拟化监控方案。【免费下载链接】glancesGlances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, macOS and Windows operating systems.项目地址: https://gitcode.com/gh_mirrors/gl/glances创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表