现象

最近使用Vagrant打包虚拟环境(Ubuntu Server 12.4.3 Host-only adapter)时遇到了问题,使用打包好的box时候,无法启动网络,会在启动过程中停顿长达一分钟,然后获取网络失败后会进入系统 - -b

原因

在Ubuntu中,/etc/udev/rules.d/70-persistent-net.rules记录网络的绑定规则,例如:

1
2
3
4
5
# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:57:fd:7b", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:53:22:32", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

这里可以看到,系统本身存在一个eth0,而Host-only 网络适配器并没有绑定eth0,而选择使用新的eth1。产生这种现象的原因是因为网卡的MAC值不匹配。 每次Vagrant使用Box创建虚拟机时都会重新生成随机的MAC值。所以解决这个问题,我们需要使系统不再生成绑定文件。

解决方法

  • 登录虚拟机,删除udev设置文件

  • 建立空的udev设置文件,使系统不再生成70-persistent-net.rules

1
2
sudo rm /etc/udev/rules.d/70-persistent-net.rules
sudo touch /etc/udev/rules.d/75-persistent-net-generator.rules

网上的资料许多都没有这一步,基本都是删除原有设置文件后就重新打包了,实际上并没有解决掉这个问题。It’s a dirty hack ^_^.

当你导入了这个box后,上边的设置文件会再次生成。这样如果你需要进行二次的打包分发时候,就会再次遇到无法启动的情况。仍然需要每次手动删除第一步中的文件。

所以这里我们需要建立空的75-persistent-net-generator.rules文件替换掉系统默认的/lib/udev/rules.d/75-persistent-net-generator.rules。而/lib/udev/rules.d/75-persistent-net-generator.rules正是负责生成上边那个坑了我们无数次的文件的。

udev/etc/udev目录权限最高,会默认覆盖掉/lib/run目录下的同样文件,而同一目录的文件,数字越大的执行越早。 具体参考这里

通过这种方式我们就可以让操作系统不再进行MAC绑定。这样之后可以随便进行打包分发,不会再出现网络问题。

  • 关掉虚拟机,重新打包
1
vagrant halt && vagrant package

参考链接

http://ablecoder.com/b/2012/04/09/vagrant-broken-networking-when-packaging-ubuntu-boxes/

https://github.com/clc3123/package-vagrant-box-precise64