在 Solaris 下使用 Zoning 时,hostid 不会因区域而改变,但您也可以(通过函数调用 getzoneid())为您的区域获取一个唯一的 zoneid。
在 Linux 下使用 KVM,hostid 按区域更改(增量)- 这很好,但并不完美-您可能会与其他人的 hostid 发生冲突。
是否有 KVM 提供的 API 使我能够获得 zoneid?
最佳答案
关于您对重复 hostid 的担忧:
与 Solaris 不同,Linux 内核不提供“gethostid”调用。相反,“gethostid”(由 /usr/bin/hostid
程序使用)是 implemented by glibc ,它试图:
- 确定是否存在固定文件(
/etc/hostid
在我的系统上);如果是,则使用其中的 4 字节值; - 如果失败,尝试根据系统的 IP 地址创建一个 hostid;
- 否则,使用
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/