我们拥有一小批 KVM/libvirt 主机,上面有几百台虚拟机,由一组位于不同位置的系统管理员管理。我遇到了一个问题,我通过 SSH 连接到虚拟机,但无法找出拥有它的裸机主机的名称。有人知道如何从虚拟机内部找到裸机主机的名称吗?
如果这不是 KVM 开箱即用的功能,是否有我们可以在所有虚拟机管理程序上应用的配置示例来公开此信息?
我们确实使用库存管理软件来跟踪我们的虚拟机及其裸机主机 - 但是它有错误,有时我们会忘记哪个主机拥有虚拟机。我会解决这个问题 - 但无论如何,从虚拟机内部查找 KVM 主机的概念都会很有用。
我知道这违背了共享环境中采用的许多安全原则,在共享环境中,每个虚拟机都是出售给不同客户的产品 - 但在我们拥有主机的环境中,安全性不是问题。
答案1
你的想法是错误的。而不是试图派生从客户机获取 KVM 主机名(设计上不可能),尝试弄清楚 KVM 主机如何通知其名之宾。
通过使用文件系统直通功能,可以轻松地与 KVM 主机上的客户机共享数据。虚拟机管理器中甚至有一个 GUI 选项(参见添加硬件 -> 文件系统)。
只需在 KVM 主机上的某个位置创建一个目录,其中包含您想要与客户机共享的任何内容。这可以是包含主机名、一些设置或维护脚本或您真正想要的任何内容的文本文件。将其标记为只读,以简化和确保安全。然后使用此路径配置文件系统直通,并将其挂载到每个客户机的某个方便的位置。
显然,这种方法需要对每个 KVM 主机和客户机进行稍许修改,但由于有几百台主机,我假设您已经采取了某种配置管理措施(如 Puppet、Ansible 等),从而大大简化了问题。
抱歉,这个回答太晚了,但考虑到这个问题有 5,000+ 次浏览量,我想我还是应该发布它。
答案2
我很确定这是不可能的,出于安全原因。不要通过询问客人直接做你想做的事情。
但是,您可以在主机上安装一个可编写脚本的代理,然后使用类似virsh list
转储虚拟机名称列表的方法,并制定策略(实际上是实体空间策略,而不是技术策略)来确保客户的主机名与虚拟机名称完全匹配。
或者.. 执行与上述相同的操作,但要使用类似virsh
转储虚拟机名称和客户机 IP 地址的方法,然后以递归方式遍历列表,ssh
按顺序进入它们,运行某种数据收集脚本,然后将其推送到您的库存中。
这样,您就知道它在哪个主机上运行(因为您virsh
从该主机运行并获得了列表),并且知道那里正在运行什么。
不一定非要这样,您可以直接使用其或 Python 绑定来virsh
完成大部分/全部操作。libvirtd
答案3
如果不解决这个问题,这是不可能的,基本上就是虚拟机中的某种代理会将主机数据保留在其中。如果这些客户机迁移,那么必须通过网络以某种方式进行更新。
如果你使用 KVM 管理系统(拥有数百台虚拟机,你绝对应该使用),比如 oVirt,你可以在管理控制面板中看到虚拟机在哪个主机上运行
答案4
从 Linux 4.4.x 开始,对于 amd64 和 aarch64,你可以将一些键值对传递给虚拟器/库姆,然后最终出现在客户机可读的SMBIOS
/表中。DMI
从客户机端访问就像在客户机 Linux 中读取文件一样简单/sys/class/dmi/id/*
。所有现代操作系统都应该有类似的舒适方法来访问这些字符串。
您可以使用例如chassis_asset_tag
来传达有关HV主机的信息。
将例如添加-smbios type=3,asset=PatrickUltra1
到您的虚拟机管理程序命令行。
在 Linux 上:
ls /sys/class/dmi/id/
bios_date board_vendor ec_firmware_release product_uuid
bios_release board_version modalias product_version
bios_vendor chassis_asset_tag power subsystem
bios_version chassis_serial product_family sys_vendor
board_asset_tag chassis_type product_name uevent
board_name chassis_vendor product_serial
board_serial chassis_version product_sku