【问题标题】:Is there an API under KVM to obtain a ZoneID?KVM下是否有API获取ZoneID?
【发布时间】:2011-01-17 15:52:55
【问题描述】:

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

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

是否有 KVM 提供的 API 可以让我获得 zoneid?

【问题讨论】:

    标签: c linux virtualization kvm


    【解决方案1】:

    关于您对重复 hostid 的担忧:

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

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

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

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

    关于获取 KVM 实例的 zoneid:

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

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

    • 如上所述,只需设置 IP 地址/主机 ID;

    • 设置/启动实例时,使用uuidgen 为系统生成UUID 并将其保存在文件系统上的安全位置。此类生成的 UUID 绝不会以非常高的概率匹配任何其他 UUID;

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

    【讨论】:

      猜你喜欢
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多