c - KVM下有获取ZoneID的API吗?

标签 c linux virtualization kvm

在 Solaris 下使用 Zoning 时,hostid 不会因区域而改变,但您也可以(通过函数调用 getzoneid())为您的区域获取一个唯一的 zoneid。

在 Linux 下使用 KVM,hostid 按区域更改(增量)- 这很好,但并不完美-您可能会与其他人的 hostid 发生冲突。

是否有 KVM 提供的 API 使我能够获得 zoneid?

最佳答案

关于您对重复 hostid 的担忧:

与 Solaris 不同,Linux 内核不提供“gethostid”调用。相反,“gethostid”(由 /usr/bin/hostid 程序使用)是 implemented by glibc ,它试图:

  1. 确定是否存在固定文件(/etc/hostid 在我的系统上);如果是,则使用其中的 4 字节值;
  2. 如果失败,尝试根据系统的 IP 地址创建一个 hostid;
  3. 否则,使用 0 的 hostid。

这意味着如果每个系统都有一个唯一的 IP 地址,它们也将有一个唯一的 hostid。

如果您的系统没有唯一的 IP 地址,您仍然可以通过使用 sethostid glibc 库调用(写入 glibc 的 的步骤 (1) 读取的文件)来覆盖 hostid gethostid 上面的算法)。

关于获取 KVM 实例的 zoneid:

与 Solaris 区域(所有实例共享同一个内核)不同,KVM 的每个实例都运行自己的 Linux 内核副本,所有这些副本都不会影响其他正在运行的实例。据我所知,没有 Solaris zoneid 的直接等价物,因为每个 Linux 实例都无法与其他 Linux 实例协作。

如果您需要为每个正在运行的 KVM 实例提供唯一标识符,一些选项是:

  • 只需设置 IP 地址/hostid,如上所述;

  • 设置/启动您的实例时,生成一个 UUID对于使用 uuidgen 的系统,并将其保存在文件系统上的安全位置。这样生成的 UUID 永远不会匹配任何其他 UUID,而且概率非常高;

  • 当启动系统的每个实例时,在内核命令行上为实例传递一个手动构建的唯一标识符(使用 -append KVM 命令行参数)。这可以稍后从 /proc/cmdline 中获取。

关于c - KVM下有获取ZoneID的API吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4715080/

相关文章:

c - STM32L052 寄存器上的模数转换器

linux - 通过项目中的多个文件快速搜索某些代码行的方法

无法更改 SIGINT 的默认操作

linux - lvm:在卷组之间创建快照

c - 如何将 C 声明链接到非标准部分中的符号?

c - 哪个变量存储了 gcc 中 C GENERIC AST 的根节点?

c - 在 C 中具有前向声明的 typedef 结构

linux - 在构建 linux 内核之前只清理选定的模块

docker - docker for Windows 是否可以实现 GPU 直通?

wpf - 在 WPF 中的虚拟化列表框上正确设置宽度