Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

20.37.15. 为客户机虚拟机设置静态 IP 地址

如果客户机虚拟机被配置为从 DHCP 获取其 IP 地址,但您仍需要它具有可预测的静态 IP 地址,则可使用以下步骤修改 libvirt 使用的 DHCP 服务器配置。这个步骤需要您知道客户机接口的 MAC 地址,以便进行这个更改。因此,您需要在客户机创建之后执行操作,或在创建客户机之前决定 guest 的 MAC 地址,然后在创建客户机虚拟机时手动设置相同的地址。
另外,您应该注意,这个过程只适用于连接到 libvirt 虚拟网络的客户机接口,其转发模式为 "nat""route",或者根本没有转发模式。如果网络配置了 forward mode="bridge""hostdev",则此过程将无法正常工作。在这样的情形中,DCHP 服务器位于网络中的其他位置,因此不受 libvirt 的控制。在这种情况下,需要在远程 DHCP 服务器上进行静态 IP 条目。要做到这一点,查看服务器提供的文档。

过程 20.5. 设置静态 IP 地址

此过程在主机物理机器上执行。
  1. 检查客户机 XML 配置文件

    通过运行 virsh domiflist guest1 命令显示客户机的网络配置设置。替换您的虚拟机的名称,用 guest1 代替。此时会显示一个表。查看 Source 列。这是您的网络的名称。在本例中,网络名为 default。这个名称将用于剩余的步骤和 MAC 地址。
    # virsh domiflist guest1
    Interface  Type       Source     Model       MAC
    -------------------------------------------------------
    vnet4      network    default    virtio      52:54:00:48:27:1D
    
    
  2. 验证 DHCP 范围

    您所设置的 IP 地址必须在为网络指定的 dhcp 范围内。另外,它还不得与网络上的任何其他现有静态 IP 地址冲突。要检查可用地址以及已使用的地址范围,请在主机中使用以下命令:
    # virsh net-dumpxml default | egrep 'range|host\ mac'
    
    <range start='198.51.100.2' end='198.51.100.254'/>
    <host mac='52:54:00:48:27:1C:1D' ip='198.51.100.2'/>
    
    您看到的输出将与示例不同,您可能会看到更多行和多个主机 mac 行。每个 guest 静态 IP 地址都将有一行。
  3. 设置静态 IP 地址

    在主机计算机上运行以下命令,将 default 替换为网络的名称。
    # virsh net-update default add ip-dhcp-host '<host mac="52:54:00:48:27:1D" ip="198.51.100.3"/>' --live --config
    live 选项允许此更改立即发生,-- config 选项则可永久保留更改。在您使用有效的 IP 和 MAC 地址时,此命令还将适用于尚未创建的客户机虚拟机。MAC 地址应该是有效的单播 MAC 地址(由 分隔的6 位十六进制对,第一个数字对为偶数);当 libvirt 创建新的随机 MAC 地址时,它会将 52:54:00 用于前三个数字对,建议遵照此惯例。
  4. 重启接口(可选)

    如果 guest 虚拟机当前正在运行,则需要强制客户端虚拟机重新请求 DHCP 地址。如果 guest 未运行,您下次启动时新的 IP 地址将实施。要重启接口,在主机机器中输入以下命令:
    # virsh domif-setlink guest1 52:54:00:48:27:1D down
    # sleep 10
    # virsh domif-setlink guest1 52:54:00:48:27:1D up
    该命令使客户机虚拟机的操作系统认为以太网电缆没有被插入,然后在十秒后重新插入。sleep 命令非常重要,因为许多 DHCP 客户端允许简短断开电缆,而无需重新请求 IP 地址。十秒足够长,以便 DHCP 客户端忘记旧的 IP 地址,并在执行命令后请求一个新地址。如果因某种原因命令失败,则必须从客户机操作系统的管理界面重置 guest 的接口。