【问题标题】:Vagrant: Is it possible to share files and alter permissions inside the guest?Vagrant:是否可以在来宾内部共享文件和更改权限?
【发布时间】:2013-07-01 22:36:00
【问题描述】:

一个半星期以来,我一直在努力研究如何使用 Vagrant 和 VirtualBox 在主机和来宾之间正确共享文件。

我需要实现的是一个自动配置框,它可以从 github 下载我们的代码库。代码库权限需要因文件而异(PHP 文件、shell 脚本、tmp 文件夹、日志文件夹等)。代码库文件也需要可从主机框中访问以进行编辑。

到目前为止,我已经尝试过普通的virtualbox共享,NFS共享,NFS共享与bindFS。这些似乎都不允许更改单个文件权限。

这似乎是 Vagrant 的绝对亮点。老实说,我不明白 Vagrant 对共享开发环境有何用处。

有人知道如何正确设置吗?有没有可能?

供参考:

  • 主机操作系统:Ubuntu 12.04
  • 客户操作系统:Debian 6(挤压)
  • 流浪汉:1.2.2
  • 虚拟框:4.2.12

【问题讨论】:

    标签: virtualbox vagrant nfs


    【解决方案1】:

    你试过synced folder吗?

    我一直在使用 Vagrant + VirtualBox,我们使用synced folder 在主机和 Vagrant VM 之间共享代码。

    这是一个链接:

    http://docs.vagrantup.com/v2/synced-folders/basic_usage.html

    这是一个代码示例:

    Vagrant.configure("2") do |config|
      config.vm.synced_folder "src/", "/srv/website"
    end
    

    一点背景

    我们将 VirtualBox 设置为我们的开发环境,并运行我们的应用程序,并在 VM 中托管数据库服务器、Tomcat 服务器。我们通过 Synced 文件夹在主机和 VM 之间共享代码,以便我们可以使用在主机上运行的 Eclipse 进行开发。

    环境:Mac

    【讨论】:

    • 我正在使用同步文件夹,但它们不允许从来宾端更改所有者或权限。
    • 而且由于文件是“存储”在主机上,而不是客户机上,所以当主机是 Windows 时,符号链接等在共享文件系统中不起作用。 (这就是导致我找到这个问题的问题 - 打算尝试 samba)
    • 是的,我也遇到了这个问题,所以只需在主机端将权限设置为 777 或 666。
    • 您使用的是 Windows 还是 Mac?在与您相同的设置上使用 Windows 7 时,我遇到了这个问题 - stackoverflow.com/questions/23089023/…。但是,在我之前使用 Mac 的项目中,我不记得遇到过这样的问题。
    • 我使用的是 Mac...我已更新响应以包含这条信息
    【解决方案2】:

    您是否尝试过设置 Samba 服务器或类似的东西,以便与主机共享访客文件系统,而不是相反?

    我在 Vagrant 中的内置共享也遇到了问题,所以我只是按照我想要的方式在来宾上设置了所有内容,然后设置了一个简单的 Samba 共享来强制用户、组和默认文件创建掩码等。这是不过要使用 Windows 机器,所以可能有比 Samba 更好的选择...

    我有一个 ubuntu 客户机,所以设置就像运行一样简单

    $ apt-get install samba

    /etc/samba/smb.conf 文件中为您要共享的每个文件夹添加一个共享块,例如:

    [data]
        comment = Local Dev Server - /data
        path = /data
        browsable = yes
        guest ok = yes
        read only = no
        create mask = 0777
        force user = root
        force group = root
    #[data] End
    

    【讨论】:

    • 这就是我们当前运行虚拟机的方式(文件本地存储在虚拟机内部并向外共享到主机)。不过,我希望 Vagrant 能提供更好的东西,尤其是因为它提供了一种方便的方式来销毁和重建虚拟机。
    • 听起来你已经在做正确的事情了......老实说,我认为没有更好的方法......它也不是 Vagrant 的真正限制...... . 更可能是虚拟机,这使得它变得更加困难......也许 VMware vm 会更好,但我之前没有使用过,所以无法真正发表评论。
    • +1 是否有使用 Vagrant/puppet/chef 自动编辑文件的标准方法,以便脚本可以检测并在必要时将共享块添加到 smb.conf 文件中,这样就不需要手动完成?
    • 是的,puppet 和 chef 都有模板文件的概念,所以你可以从 smb.conf 文件中创建一个模板,并将其放置在配置的正确位置...检查在此处“使用模板”标题下的厨师示例:docs.opscode.com/resource_template.html
    • +1 感谢@MattCooper 提供此链接,我需要研究它,因为它对于 puppet 的新手来说相当难以访问并且没有示例,但这是一个开始 - 所以谢谢。还有 puppet-samba 理论上可以合并到 Vagrant 设置中,但是由于没有提供 full 示例,因此文档再次对用户不友好 - 所以我提出了 issue about improving the documentation .我希望继续研究 - 如果我能自己改进这些,我会的。
    【解决方案3】:

    您可以尝试将代码库从共享文件夹复制到客户机特定文件夹中,例如从 /vagrant/codebase/codebase。一旦您将文件全部放入来宾计算机,您就可以像往常一样chown 他们。这并不理想,但您可以编写一个简单的脚本,以便在您从主机端修改代码时运行。您还可以尝试在 VM 启动时复制任何文件的启动脚本,具体取决于您需要更新文件的频率。

    【讨论】:

    • 我们正在使用这些虚拟机进行开发,这意味着文件在一天中不断变化。我们使用主机进行开发(运行 IDE)。拥有需要同步的文件副本将导致问题的主要来源。
    【解决方案4】:

    更新:再次查看底部的http://docs.vagrantup.com/v2/synced-folders/basic_usage.html。示例(从文档中复制粘贴):

    config.vm.synced_folder "src/", "/srv/website", owner: "root", group: "root"
    

    【讨论】:

      【解决方案5】:

      我不确定这是否完全回答了您的问题,但我的应用程序无法写入共享文件夹系统上的磁盘时遇到问题,因此我在 Vagrantfile 中使用了以下内容以允许 r/w 访问客户端中的任何共享文件。

      config.vm.synced_folder "./vhosts/", "/var/www/vhosts/", id: "vagrant-root", extra: "dmode=777,fmode=777" 
      

      【讨论】:

      • id 部分对我不起作用,但设置权限可以,这就是我所需要的
      • 此响应已过时,请参阅 iconoclast 的回答
      【解决方案6】:

      这里有几个部分答案,但我想让人们更容易找到这个问题,这样他们就不必尝试各种方法将这些部分答案组合成一个。

      这是我使用的,对我来说效果很好。由于在 <code> 块中使用斜体很难或不可能,我已将您想要更改的位放在 <angled brackets> 中。

      config.vm.synced_folder ".", "/var/www/vhosts/<project_name>", 
          id: "project",
          owner: <username>,
          group: <group_name>,
          mount_options: ["dmode=775,fmode=664"]
      

      或者可能(取决于您使用的 CIFS/SMB 版本):

          mount_options: ["dir_mode=775,file_mode=664"]
      

      没有所有者和组,Vagrant 将使用config.ssh.username 的值(当盒子启动时)作为所有者和组。通过使用上述配置,您可以控制分配给共享文件夹的所有者和组,因为登录到 VM 并尝试使用 chgrpchown 不起作用。

      没有mount_options,您将无法控制授予所有者和组(以及其他人)的权限。尽管这是一个虚拟机,你可能会争辩说可以为这些使用777 权限,但我不推荐它,因为这是一个坏习惯,如果你不小心,你可能会继续使用它投入生产,削弱您的生产安全性。但显然你可以将我使用的775664 更改为任何你想要的。如果您不知道这些是什么意思,请谷歌“Linux 文件权限”。

      您可以(出于习惯)在分隔 mount_options 数组的逗号后插入一个空格。别。它不能与逗号一起使用。

      id 可以是你想要的任何东西。

      【讨论】:

      • 为了将来参考,您在这里参考的是哪个版本的 vagrant?我遇到的问题之一是不同版本的 Vagrant 支持不同的选项。
      • Vagrant 更改了配置语法。这是关于语法的版本 1 的旧文档:docs-v1.vagrantup.com/v1/docs/config/vm/share_folder.html
      • 在较新版本的 CIFS 上,il 应为 mount_options: ["dir_mode=0775,file_mode=0664"]。 (注意 dir_mode 和值的八进制形式)
      • @magnetik:你能告诉我(我们)哪个版本标志着 dmode/fmode 和 dir_mode/file_mode 之间的变化?
      • 不知道,在 ubuntu 14.04 上是 dir_mode。
      猜你喜欢
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      相关资源
      最近更新 更多