管理 VPS 的时候用 VirtualBox 来运行各种测试是非常方便的。有的时候我们希望在一个纯净的系统中进行测试以避免各种可能的干扰。使用 VirtualBox 的虚拟机复制功能可以很方便的随时克隆出一个全新的虚拟机。但有时候可能需要重新设置其网络配置。
最好是新建了虚拟机,安装完操作系统之后就作为母版备用,然后直接复制一份母版开始原定的测试。测试过程中如果需要一个干净的、同样的系统,就再从母版复制一个出来。
1. 在 VM 中复制虚拟机¶
在 VirtualBox 中创建一个虚拟机的复制是非常简单的。在 VM 的管理界面,选中一个虚拟机,然后 Ctrl + O(或者右键单击该条目选择“复制”)即可。
此时,VM 会提示正式开始复制前的几个设置,
- 新虚拟电脑名称。这个当然很有必要,起名字可以方便区分嘛。当然也可以复制完成后再给它改名。
- 在这个命名框的下面有个不起眼的勾选框“重新初始化所有网卡的 MAC 地址(R)”。这个重不重要就看我们怎么用这些虚拟电脑了。如果要同时开启2个及以上的副本,它们在同一个网络中。在同一个网络中的多个电脑拥有相同的 MAC 地址就会引起混乱。下面第二部分要说的就是这个问题。
- 确认后选择“副本类型”(完全复制、链接复制)。既然是为了不同的测试目的,自然是“完全复制”了。测试完了就可以随意删除了。
- 单击“复制”后开始自动拷贝原虚拟机的虚拟磁盘,完成后就可以用了。
2. 修改新副本的网络设置¶
如果在上面勾选了“重新初始化所有网卡的 MAC 地址(R)”,VirtualBox 会给新复制这个虚拟电脑的网卡重新生成 MAC 地址。然后,如果直接启动该虚拟电脑的话,系统会在启动过程中检测并在原来的网卡设备配置的基础上增加新的网卡(新的 MAC 地址)。如果不自己重新配置网络,新的网卡没有用上,是无法联网的。此时如果重起网络服务,
service network restart
会收到错误提示,
Device eth0 does not seem to be present, delaying initialization. [FAILED]
看看网络配置,
ifconfig
会发现只有 lo 这个网络(属于 eth0,因为是系统
这是因为 CentOS 使用 udev 动态管理设备文件(实际上很多 Linux 发行版都是这样),并根据设备的信息对其进行命名。在 CentOS 中,udev 会在系统引导的过程中识别网卡,将 MAC 地址和网络名称对应起来记录在 udev 的脚本中。
由于母版虚拟电脑已经记录过网卡和网络设置,复制的新虚拟机修改了网卡 MAC 地址就相当于给电脑换个新网卡,新虚拟机在启动时系统自动检测并将新网卡记录下来。如下,原来的网卡是 eth0 和 eth1,新网卡是 eth2 和 eth3。至于我这里为什么要给虚拟机弄两块网卡,请参考这里。
cat /etc/udev/rules.d/70-persistent-net.rules # This file was automatically generated by the /lib/udev/write_net_rules # program, run by the persistent-net-generator.rules rules file. # # You can modify it, as long as you keep each rule on a single # line, and change only the value of the NAME= key. # PCI device 0x8086:0x100e (e1000) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:bf:34:02", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1" # PCI device 0x8086:0x100e (e1000) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:be:6e:29", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" # PCI device 0x8086:0x100e (e1000) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:49:1c:91", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2" # PCI device 0x8086:0x100e (e1000) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:09:65:9e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth3"
但是系统仅仅是检测到了新网卡,并不会自动更新网络配置(ifcfg)。
解决方法就是,在 VirtualBox 管理界面选中该虚拟电脑,单击“设置”菜单项,可以从“网络”那一块找到对应网卡的新 MAC 地址。
1. 编辑 /etc/udev/rules.d/70-persistent-net.rules,将原来的网卡的 MAC 地址改成对应的新网卡的,并将新网卡的配置文件删除。
# PCI device 0x8086:0x100e (e1000) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:49:1c:91", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" # PCI device 0x8086:0x100e (e1000) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:09:65:9e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
ATTR 对应的位置就是 MAC 地址,NAME 后面是网络配置名称。将前面两块网卡的配置删除,然后将后面两个网卡的名称改成 eth1 和 eth0,分别对应于 VirtualBox 管理器中查看到的“网卡1”和“网卡2”.
2. 然后修改原来的网络配置 /etc/sysconfig/network-scripts/ifcfg-eth0 和/etc/sysconfig/network-scripts/ifcfg-eth1 中的 HWADDR 行,使用新网卡的 MAC 地址对应替换到原来的。
3. 重起虚拟电脑 reboot 即可生效。
via。https://cnzhx.net/blog/copy-centos-and-reset-network-in-vm/