打包Vagrant盒后NFS失败

8
我在重新打包Vagrant box时遇到了一些奇怪的问题,希望有人能告诉我应该从哪个方向去解决。以下是我的经历:
  • 我安装了Vagrant并成功创建了一些puppet manifests,一切都很好,vagrant up ... provisioning, ...
  • 然后我需要切换到NFS,但失败了,因为我Guest OS(Ubuntu 11.04-amd64)没有安装nfs。
  • 我在Guest OS上安装了nfs-common(sudo apt-get install nfs-common
  • vagrant halt
  • vagrant up
  • 然后NFS mount可以完美地工作,甚至在多次halt/up命令之后,都能正常使用,我很高兴!

下一个逻辑步骤应该是打包这个vagrant box,这样每次销毁VM时就不需要重新安装nfs-common了。

  • 在上面的同一个目录中:vagrant package
  • vagrant box add ubuntuvm2 package.box
  • rm package.box
  • 在Vagrantfile中更改config.vm.box行为ubuntuvm2
  • vagrant destroy
  • vagrant up
  • 突然之间,NFS挂载失败了,当我ssh到VM时,我可以确认nfs-common已经安装好了,但是NFS mount仍然失败:https://img.skitch.com/20120302-kwix296t44y31rxkd52pwm72f4.jpg

有人有解决方案吗?

我在OS-X Lion上使用Virtualbox 4.1.8和Vagrant 1.0.0。


我遇到了完全相同的问题。目前还没有解决方案。正在努力解决中。 - thomasmalt
很高兴我不是唯一一个有这个问题的人,如果我能提供任何帮助,请在 Twitter 上联系我 @chrisramakers :) - ChrisR
4个回答

13

我曾经也遇到了同样的问题,但现在已经解决了。至少对我来说现在可以正常工作了。:)

简要版:

  • 检查 /etc/exports 是否存在语法错误,并使用确保有效的条目重新创建 /etc/exports。
  • 验证计算机上的网络接口是否正确初始化(检查 /etc/network/interfaces 并运行 ifconfig -a)。
  • 至少 Debian 和 Ubuntu 在 /etc/udev/rules.d/70-persistent-net.rules 中存储有关持久网络设备的信息。如果您看到 eth1 初始化为 eth2,则是因为新建实例时网络卡的 MAC 地址被重新生成。请删除 /etc/udev/rules.d/70-persistent-net.rules 并重新打包您的盒子。
  • 如果无法重新打包您的盒子,请更新 /etc/network/interfaces 以使用 eth2 而不是 eth1。

详细版:

  • Vagrant 版本为 1.0.1
  • 操作系统为 OS X 10.7.3
  • 盒子为自定义的 Debian Wheezy 64。

当重新加载或重新创建该盒子时,它将在 NFS 挂载时出错并显示典型的错误消息。

[default] Mounting NFS shared folders...
Mounting NFS shared folders failed. This is most often caused by the NFS
client software not being installed on the guest machine. Please verify
that the NFS client software is properly installed, and consult any resources
specific to the linux distro you're using for more information on how to
do this.

使用 NFS Manager 检查 /etc/exports 文件时,它告诉我该文件包含语法错误。

我清空了 /etc/exports 并测试了带有以下条目的 nfs 客户端和服务器:

/Users/tm/git -alldirs localhost 33.33.33.10

当运行 vagrant up 命令时,NFS 挂载又可以正常工作了。

在执行 apt-get dist-upgrade 命令并重新打包 box 后,我发现 NFS 文件夹无法再次挂载。

这一次,在 /etc/exports 文件中没有出现任何错误。我发现 Vagrant 没有初始化主机本地接口。

/etc/network/interfaces 中包含了如下内容:

#VAGRANT-BEGIN
# The contents below are automatically generated by Vagrant. Do not modify.
auto eth1
iface eth1 inet static
    address 33.33.33.10
    netmask 255.255.255.0
#VAGRANT-END

ifconfig -a 返回了以下内容:

eth0      Link encap:Ethernet  HWaddr 08:00:27:3a:47:72  
      inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
      inet6 addr: fe80::a00:27ff:fe3a:4772/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:971 errors:0 dropped:0 overruns:0 frame:0
      TX packets:614 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:83951 (81.9 KiB)  TX bytes:74872 (73.1 KiB)

eth2      Link encap:Ethernet  HWaddr 08:00:27:89:f5:e3  
      BROADCAST MULTICAST  MTU:1500  Metric:1
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
界面定义不正确。 在将/etc/network/interfaces段更新为使用eth2挂载NFS之后,NFS再次正常工作。

在/etc/exports中的语法对我来说似乎没问题,但是在检查了盒子之后,发现以太网设备混淆了(vagrant使用eth1,而只有eth0和eth2存在)。修复后一切都正常工作了! - ChrisR
这应该在 Github 上的 Vagrant 中报告为一个 bug。有点烦人 :) - thomasmalt
修复对我来说非常有效,但是当我想要之后进行配置(vagrant provision)时,它会给我带来麻烦。另外在Ubuntu11.04上也是如此。 - Dieter
1
对于CentOS来说,这些文件位于/etc/sysconfig/network-scripts/目录下。 - Steve Tauber
1
NFS管理器找出了问题,OSX显然不喜欢导出已经导出目录的子目录。 - Amir T
真是个超级有用的答案,我在找到这个答案之前已经纠结了几个小时,而它为我解决了问题。谢谢! - user788472

4

这里有一个关于此问题的公开错误和解决方案:

https://github.com/mitchellh/vagrant/issues/997

  1. 编辑/etc/udev/rules.d/70-persistent-net.rules并删除除了eth0以外的其他接口行
  2. vagrant package
  3. vagrant box add mypack package.box
  4. vagrant destroy
  5. Vagrantfile中将config.vm.box设置为mypack
  6. vagrant up

我在MAC OS X 10.7.5和CentOS 6.2 64位上进行了测试。

更新:该错误现已关闭并移动,但似乎人们仍然遇到问题。


0
除了这里已有的答案之外,还要记得可能存在防火墙。如果您在主机上运行防火墙,则错误非常普遍,即使错误消息似乎并未指示出来。
如果您使用NoobProof和/或IceFloor,请禁用防火墙或进行适当的例外处理。

0

在 Ubuntu 12 主机/Ubuntu 12 客户机上,以下内容对我在 Discourse 上起作用

nfs_setting = RUBY_PLATFORM =~ /darwin/ || RUBY_PLATFORM =~ /linux/
config.vm.synced_folder ".", "/vagrant", id: "vagrant-root", type: "nfs", nfs_udp: "true", nfs_version: "4", :nfs => nfs_setting

注意:我还必须将由Vagrant确定的主机IP和由Vagrant确定的客户机IP添加到防火墙例外中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接