Vagrant OS X 主机 nfs 共享权限错误 - 无法将所有者设置为“1000”

rac*_*rew 7 nfs puppet vagrant

我是 Vagrant 和 Puppet 的新手,我创建了一个带有 Debian Squeeze 和独立 Puppet 的 Base Box,使用这里说明安装 Puppet 和 Puppetlabs 包

盒子本身似乎成功导入,但是一旦我开始配置它,我就会收到似乎与主机上的 nfs 共享有关的错误。1000 是 vm 上的 Vagrant 用户的 uid。

错误:

Error: Failed to set owner to '1000': Operation not permitted - /vagrant/www/index.php
Error: /Stage[main]/Perchdemo::Sites::Create/File[/vagrant/www/index.php]/owner: change from 501 to vagrant failed: Failed to set owner to '1000': Operation not permitted - /vagrant/www/index.php
Run Code Online (Sandbox Code Playgroud)

当我使用 Puppet 将 index.php 文件复制到主机文件系统上的共享 /vagrant/www 时,就会发生这种情况。我在 vm 上的 Puppet 独立安装中使用了这个 Puppet 模块,其中文件托管在 vm 的文件系统上,虽然我希望它们位于 nfs 共享上,但理想情况下。

编辑了更多信息。当我使用 puppetlabs apache 模块创建 vhost 时,最初发生了错误。但是,无论我尝试强制在哪个用户下创建它,它都会因相同的错误而失败。

我的 VagrantFile 如下。

Error: Failed to set owner to '1000': Operation not permitted - /vagrant/www/index.php
Error: /Stage[main]/Perchdemo::Sites::Create/File[/vagrant/www/index.php]/owner: change from 501 to vagrant failed: Failed to set owner to '1000': Operation not permitted - /vagrant/www/index.php
Run Code Online (Sandbox Code Playgroud)

小智 5

为了摆脱这个权限问题,这是我添加到我的Vagrantfile

if (/darwin/ =~ RUBY_PLATFORM) != nil
    config.vm.synced_folder ".", "/host/path/to/shared/folder", nfs: true, :bsd__nfs_options => ["-maproot=0:0"]
  else
    config.vm.synced_folder ".", "/host/path/to/shared/folder", nfs: true, :linux__nfs_options => ["no_root_squash"]
  end
Run Code Online (Sandbox Code Playgroud)

它将根据您的主机操作系统(OSX 或 Linux)调整 NFS 选项。


小智 2

这可能是由 NFS 服务器上的“根挤压”引起的。

当 NFS 客户端计算机上的 root 用户尝试操作导出的 NFS 文件系统上的文件时,它会使用非特权用户(通常为 nobody 或 nfsnobody)的权限来执行此操作。在这种情况下,如果我没看错的话,Puppet(以 root 身份运行)可能无法操作 NFS 服务器上的文件,因为它的权限已映射到该非特权用户。

要删除 root 压缩,请编辑 NFS 服务器上的 /etc/exports,并添加no_root_squash到导出文件系统的选项,然后运行exportfs -av以重新导出文件系统。

/etc/exports 行示例:

/srv   192.168.0.0/24 (rw,no_root_squash)
Run Code Online (Sandbox Code Playgroud)