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

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

我是 Vagrant 和 Puppet 新手,我使用 Debian Squeeze 和独立 Puppet 创建了一个 Base Box,使用点击此处了解如何使用 Puppetlabs 软件包安装 Puppet

该盒子本身似乎已成功导入,但是一旦我开始配置它,我就会收到似乎与主机上的 nfs 共享有关的错误。1000 是虚拟机上 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

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

编辑了更多信息。经过一番摸索,错误最初发生在我使用 puppetlabs apache 模块创建 vhost 时。然而,无论我尝试在哪个用户下强制创建,都会失败并出现相同的错误。

我的 VagrantFile 如下。

Vagrant::Config.run do |config|

  config.vm.box = "squeeze64"


  config.vm.network :hostonly, "10.1.0.52"

  config.nfs.map_uid = :auto
  config.nfs.map_gid = :auto

  config.vm.forward_port 80, 8080

  config.vm.share_folder("v-web", "/vagrant/www", "./www", :nfs => true)


  config.vm.provision :shell, :inline => "echo \"Europe/London\" | sudo tee /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata"


  config.vm.provision :shell, :inline => "apt-get update --fix-missing"
  config.vm.provision :shell, :inline => "apt-get upgrade"


  config.vm.provision :puppet do |puppet|
     puppet.facter = { "fqdn" => "perchtutorial.eoms"}
     puppet.manifests_path = "puppet/manifests"
     puppet.manifest_file  = "perchtutorial.pp"
     puppet.module_path = "puppet/modules"
  end

end

答案1

为了解决此权限问题,我添加了以下内容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

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

答案2

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

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

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

/etc/exports 行示例:

/srv   192.168.0.0/24 (rw,no_root_squash)

答案3

mbarthelemy 的回答帮助我完成了一半,但最后,我不得不再做一些调整:

在我的 VagrantFile 中,我将其添加到映射中以使其正常工作:

:linux__nfs_options => ["no_root_squash"], :map_uid => 0, :map_gid => 0

相关内容