如何在 virsh/kvm 中指定 NIC 编号?

如何在 virsh/kvm 中指定 NIC 编号?

希望我能在这里得到一些帮助。我正在使用 virt-clone 命令获取 VyOS(开源 Linux 路由器)的映像。克隆工作正常,但当我将映像复制到另一台 KVM 主机并安装它时,NIC 卡号会发生变化。端口 eth0 和 eth1 在新实例上变为 eth2 和 eth3。有没有办法防止这种情况发生?

在原始服务器上我运行:

vyos@vyos:~$ show int
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             -                                 u/u
eth1             -                                 u/u
lo               127.0.0.1/8                       u/u
                 ::1/128
vyos@vyos:~$

然后我关机并克隆:

virt-clone --original vyos --name vyos_clone --file vyos_clone

我将新的克隆文件复制到不同的 kvm 主机并运行:

virt-install -n vyos --description "Vyos Server" --ram 1024 --vcpus 1 --os-type=linux --disk /VMs/vyos_clone,device=disk,bus=virtio,size=15,sparse=true,format=raw --graphics none --network=default,model=virtio --network=network:HUB1,model=virtio --import --noautoconsole --autostart

我使用 virsh start vyos 启动服务

但是当我查看接口时,编号已经改变了:

vyos@vyos:~$ show int
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth2             -                                 u/u
eth3             -                                 u/u
lo               127.0.0.1/8                       u/u
                 ::1/128
vyos@vyos:~$

有什么方法可以强制新的 VM/域使用 eth0 和 eth1 而不是 eth2 和 eth3?

我需要这些保持不变,以便我可以编写一些脚本。

****** 更新

我尝试运行 sysprep,但它似乎无法识别 vyos 的操作系统:

> # virt-sysprep -a /VMs/vyos_clone [   0.0] Examining the guest ... virt-sysprep: error: no operating systems were found in the guest
> image
> 
> If reporting bugs, run virt-sysprep with debugging enabled and include
> the complete output:
> 
>   virt-sysprep -v -x [...]

我还尝试使用 virsh edit 编辑 xml 并取出 mac 地址并重新启动域,但这并不能解决问题。

谢谢你的帮助

答案1

遇到此问题的原因是您没有清除该 VM 映像中需要在克隆后使用前清除的各种填充值,​​例如配置文件中的接口 MAC 地址 - 这解释了您的 NIC 命名问题。

克隆只会复制磁盘,并会生成新的 VM 定义。定义采用 XML 格式,/etc/libvirt/qemu/$VM_NAME.xml默认情况下可以找到。映像可能采用多种格式(包括原始块设备而不是文件),但使用映像文件时,默认情况下会将其存储在其中/var/lib/libvirt/images/

您需要首先对该映像进行系统准备,以纠正您所看到的行为,这将删除持久网络规则和 NIC 配置等内容的填充值(以及其他一些内容,但这些在这个问题的背景下是最重要的)。

对于 libvirt VM,这是使用virt-sysprep针对其根磁盘映像的命令来完成的,通常是在克隆单个映像之后,或者可能在克隆之前(在创建“模板”VM 映像的情况下)。

警告:仅在非活动(已销毁或关闭)的 VM 映像上使用 virt-sysprep。此工具将挂载客户文件系统并进行更改,这在正在运行的 VM 上执行时很危险,并且容易出现严重故障)

在本例中,我将详细介绍您将使用的 sysprep 过程克隆映像而不是制作模板或其他东西。如果您需要帮助以不同的方式使用它,请告诉我。以下将执行您需要执行的默认“典型”操作,以便成功使用根映像,就好像它从未被启动过一样:

克隆你的图像

[...]

对克隆的根映像执行此命令(复制之前或之后,无所谓):

virt-sysprep -a /var/lib/libvirt/images/$ROOT_VM_DISK.qcow2

然后,您可以在实例上使用该映像,就像它从未启动过一样。您的重要更改仍将保留。

转储到标准输出的输出将详细说明所执行的操作以及是否成功。我不能完全相信 VyOS 映像能够使用默认设置成功。如果您遇到问题并且陷入困境,请发布您的结果,我可以帮助您分析那里发生的事情。

答案2

通过将 Vyos 安装到没有网络适配器的 VM 中,我能够实现我想要的效果。然后我克隆了该 VM 并使用 qcow2 文件进行安装。当我使用此 qcow2 文件进行安装时,我会添加 2 个新的 NIC 卡。现在,每次我启动 Vyos 时,它总是 Eth0 和 Eth1,并且我的脚本运行良好。

更多的是变通而不是修复。

相关内容