在VirtualBox重启后,重新连接Vagrant同步文件夹

5
我在Windows主机上创建了一个运行Ubuntu的虚拟机,并使用puppet/vagrant/VirtualBox进行生成。详情请参见https://bitbucket.org/dmenne/rstudio-shiny-server-on-ubuntu,这使用户可以在Windows上运行RStudio和Shiny server。在Vagrantfile中,我使用如下命令来创建共享文件夹:config.vm.synced_folder "shiny-server", "/srv/shiny-server", create:true。当我使用vagrant upvagrant reload启动虚拟机时,一切正常。
但是,有一个客户不想安装vagrant等软件,并要求使用VirtualBox Manager在Windows上启动/停止一个独立的虚拟机。然而,当我关闭一个使用vagrant启动的VM Box后,即使在VirtualBox Manager的共享文件夹对话框中正确显示,我的共享文件夹也无法在虚拟机重新启动时重新连接/安装。
如何将由Vagrant生成的虚拟机打包成可以在没有Vagrant的情况下启动/停止的形式?
编辑于2015年3月:
我仍然无法解决这个问题。如果我强制自动挂载,在还原后,media/sf_<folder>会同步,而不是所需的文件夹。如何强制VirtualBox在重新启动后使用Vagrantfile中的同步模板?
另外,如何在vagrant中强制自动挂载而不必手动操作?

问题仍未解决。 - Dieter Menne
对于所有后来的读者:这是我使用的VMBox版本中的一个错误。 - Dieter Menne
2个回答

7
经过一些进一步的调试和在google/vagrant论坛上类似问题的缺乏响应后,需要注意以下几点:
  • 当您在puppet中使用同步文件夹时,必须使用vagrant upvagrant reload重新启动VirtualBox。
  • 如果您使用VirtualBox GUI停止/重新启动,automount会不正确地还原同步的文件夹,即还原到/media/sf_;这无法通过其他方式纠正,只能使用vagrant reload
  • 没有vagrant的唯一替代方法是在VirtualBox中保存状态(CTRL-V)。重启后,同步的文件夹将被正确还原。然而,强制最终用户始终手动保存状态可能是不可能的。

要使用持久同步的文件夹,必须使用upstart或类似的方法;仅使用Vagrantfile是不行的。

另请参见Alvaro的回复:https://groups.google.com/forum/#!topic/vagrant-up/oBU0kqPLzYk


有人知道目前这个问题的解决方案吗?如果没有,那么为什么会发生这种情况呢?这是不合逻辑的行为。 - Stanislav Belichenko

4
使这个工作正常需要两步。首先,我们需要从主机自动挂载同步的文件夹,对于Linux客户机,这有点误导,因为它更像是"自动提供用于挂载"或"自动共享"。对于每个共享文件夹(gemainsame ordner),您必须打开自动挂载(automatisch einbinden)。
要做到这一点,请单击每个共享的编辑共享文件夹图标 The edit shared folder icon 并勾选自动挂载(automatisch einbinden)。 Check the auto mount option 最后,您应该在所有要自动同步的共享下看到"Ja"(自动绑定)。 enter image description here 如果客户机系统是Ubuntu(或任何Linux系统),那么完成此操作后,所有同步的文件夹现在应该在客户机中可见,但是客户机不会自动安装它们。您需要为要在客户机中自动挂载的每个文件夹放置一个条目进入您的/etc/fstab。
由于您正在使用VirtualBox,Vagrant可能会选择使用VirutalBox的共享文件夹配置方法来实现同步的文件夹。对于Linux中的客户机系统,根据您的Guest Additions版本,这看起来像是一个名为//vboxsrv/的smb/cifs共享或类型为"vboxsf"的文件系统。
vboxsf是较新版本的Guest Additions(至少从4.1.18开始),并且自动挂载选项“只能工作”。在使用名称为'bob'的自动安装设置的Linux客户机VM启动时,系统应该会自动挂载Bob(无需fstab条目)到/media/sf_Bob。相关行完整输出来自于mount命令。
none on media/sf_Bob type vboxsf (rw,nodev,relatime)

如果这个方法不起作用,请检查您的客户机系统中是否可以通过smbclient或smbtree看到Samba网络共享。它应该类似于//vboxsrv/Bob。然后在您的fstab文件中添加以下行:
#share name         #mount point in guest   #fstype   #options   #dump/pass
//vboxsrv/Bob       /mnt/Bob                cifs      auto,rw    0 0

您可能希望阅读 mount.cifs 的手册页面,以针对每个挂载调整选项,特别是关于文件所有权和权限的选项(需要研究的相关选项包括 forceuiduidforcegidgidfile_modedir_mode)。


1
谢谢,@sirlark;我忘了提到我之前尝试过这个方法,但它并没有重新连接。顺便说一下:我不知道如何从puppet/vagrant设置自动挂载,但那是另一个问题。已标记为+1,但不是答案。 - Dieter Menne
好的,我已经相应地编辑了我的答案。这里还需要进行客户端配置。 - sirlark
1
此外,将来这种类型的问题(系统管理)可能会在Serverfault或Superuser上获得更快的响应;我已经标记它以进行迁移。 - sirlark
或者,您是否已经阅读了与您的问题非常相似的其他问题,它们可能是更好的解决方案... vagrant-error-failed-to-mount-folders-in-linux-guest 和 https://www.virtualbox.org/ticket/12879。 - sirlark
感谢您提供的自动挂载想法,这是个好主意,但乍一看并没有解决问题;我明天会更仔细地检查。您提到的链接与VMBox 4.3.10有关,在此之前它曾经帮助过我;在我的bitbucket页面上,我已经提到了要避免使用这个版本。 - Dieter Menne
我稍微修改了我的答案。我注意到在新版本的Guest Additions中,共享文件夹的工作方式有所不同。之前我是凭记忆做的,所以现在我去快速检查一下。在客户机启动后,mount的输出是什么? - sirlark

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