现象
最近使用Vagrant打包虚拟环境(Ubuntu Server 12.4.3 Host-only adapter
)时遇到了问题,使用打包好的box时候,无法启动网络,会在启动过程中停顿长达一分钟,然后获取网络失败后会进入系统 - -b
原因
在Ubuntu中,/etc/udev/rules.d/70-persistent-net.rules
记录网络的绑定规则,例如:
# 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
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绑定。这样之后可以随便进行打包分发,不会再出现网络问题。
- 关掉虚拟机,重新打包
vagrant halt && vagrant package
参考链接
http://ablecoder.com/b/2012/04/09/vagrant-broken-networking-when-packaging-ubuntu-boxes/
本页的评论功能已关闭