我能否在vagrant中修改共享文件夹的所有权?

41

我使用 vagrantchef 在虚拟机上开发我的博客。为了方便访问 wordpress 文件夹,我创建了一个共享文件夹。

基本上,wordpress 文件夹位于我的主机上,并作为“共享文件夹”挂载到虚拟机中的 /var/www/wordpress 中。配置类似于:

config.vm.share_folder "foo", "/guest/path", "/host/path"

我的问题是,在虚拟机中,即使我在主机上更改了权限,所有权始终为vagrant:vagrant。虚拟机中的所有权更改被忽略。

我无法使用chown将上传目录的所有权设置为www-data:www-data

可以使用chmod更改访问限制为777,但这是一个非常丑陋的解决方法。

这是我真正想要的内容。是否可行?:

  • 开发:可以从我的主机访问共享文件夹。
  • 访问限制:在虚拟机上,所有文件和文件夹都应具有适当的安全所有权和访问限制。
5个回答

43

正如@StephenKing所建议的那样,您可以更改整个目录的选项。

相关的函数没有记录,但源代码告诉我们:

# File 'lib/vagrant/config/vm.rb', line 53

def share_folder(name, guestpath, hostpath, opts=nil)
  @shared_folders[name] = {
    :guestpath => guestpath.to_s,
    :hostpath => hostpath.to_s,
    :create => false,
    :owner => nil,
    :group => nil,
    :nfs   => false,
    :transient => false,
    :extra => nil
  }.merge(opts || {})
end 

基本上,您可以为整个文件夹设置组、所有者和acl,这比在主机上将所有内容设置为全局可写要好得多。我还没有找到更改嵌套目录所有权的方法。

这是一个快速解决方法:

config.vm.share_folder "v-wordpress", "/var/www/wordpress", "/host/path", :owner => "www-data", :group => "www-data"

有没有想法如何在vagrant 1.2+中实现这个?我相信(对于Virtualbox)相关的文件现在是plugins/providers/virtualbox/action/share_folders.rb。 - Johntron
多个共享文件夹在相交的公共目录上似乎只考虑最后一个定义。因此,对于嵌套目录,您只需在指令(带有 owner:group:)之后添加即可。 - Pierre de LESPINAY
对于NFS挂载的驱动器,请使用config.vm.synced_folder - Kirkland

17

值得注意的一件事是,如果您想更改默认同步文件夹的权限,则需要使用此答案中的语法:https://dev59.com/HmYs5IYBdhLWcg3wE_ze#18390884,即:config.vm.synced_folder "./", "/vagrant", owner: 'root', group: 'root'。 - MatthewLee

9
你可以允许在虚拟机内更改所有权:
config.vm.share_folder "foo", "/guest/path", "/host/path", {:extra => 'dmode=777,fmode=777'}

使用Vagrant 1.5.4,这种方法对我不起作用。我将上述内容添加到我的.kitchen.yml中,修改了我的custom_app cookbook以调用sudo chown -R kevin /my/path/share。然后我销毁并重新提供了我的box。然而,vagrant仍然拥有/my/path/share。此外,我在VM中手动尝试了上述命令,但所有者仍然是vagrant - Kevin Meredith
1
使用1.7.4版本,我需要将其更改为config.vm.synced_folder ...,{:mount_options => [dmode=777, fmode=777] - Alwin Kesler
为了让你的vagrant box更像一个生产服务器,可以运行dmode=775,fmode=664而不是777。现在当你部署时,应该会遇到少一些问题,因为你不再依赖全局写入权限。 - Kirkland

4

正如其他答案所指出的那样,你应该使用ownergroup配置选项来设置正确的所有者和组。

然而,在某些情况下,这种方法可能行不通(例如当目标用户在 provisioning 过程中后期才创建时)。在这种情况下,你可以重新挂载共享:

sudo mount -t vboxsf -o uid=`id -u www-data`,gid=`id -g www-data` /path/to/share /path/to/share

3
跟着 @StephenKing 和 @aycokoster 给出的绝妙提示,我有一个挂载另一个只读目录的用例。
我添加了

config.vm.share_folder "foo", "/guest/path", "/host/path", :extra => 'ro'

并且
# discard exit status because chown `id -u vagrant`:`id -g vagrant` /host/path is okay

vagrant up || true 

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