重复的Vagrant错误:NFS资源上的“create”操作不允许操作

时间:2015-01-26 20:00:49

标签: vagrant chef provisioning

我有一个带有厨师配置器的流浪盒。一切正常,除非在NFS资源上有操作。例如,我有以下同步文件夹:

"host_path": "/Users/User/devbox/vdd/data",
        "guest_path": "/var/www",
        "type": "nfs"

在流浪文件中:

 # Synced Folders.
    config_json["vm"]["synced_folders"].each do |folder|
      case folder["type"]
      when "nfs"
        config.vm.synced_folder folder["host_path"], folder["guest_path"], type: "nfs"
        # This uses uid and gid of the user that started vagrant.
        config.nfs.map_uid = Process.uid
        config.nfs.map_gid = Process.gid

我还有一个厨师食谱,可以对nfs资源执行create操作:

directory "/var/www" do
  owner "vagrant"
  group "vagrant"
end

但是,我一直收到以下错误:

 default: Error executing action `create` on resource 'directory[/var/www]'
==> default: ================================================================================
==> default: 
==> default: 
==> default: Errno::EPERM
==> default: ------------
==> default: Operation not permitted - /var/www
==> default: 
==> default: 
==> default: Resource Declaration:
==> default: ---------------------
==> default: # In /tmp/vagrant-chef-3/chef-solo-2/cookbooks/vdd/recipes/apache.rb
==> default: 
==> default:   1: directory "/var/www" do
==> default:   2:   owner "vagrant"
==> default:   3:   group "vagrant"
==> default:   4: end
==> default:   5: 
==> default: 
==> default: 
==> default: 
==> default: 
==> default: Compiled Resource:

摆脱问题(并保留nfs)的唯一方法是:

  1. nfs更改为default

  2. 运行vagrant reload --provision

  3. default更改回nfs

  4. 运行vagrant reload

  5. 我已经搜索并尝试了各种建议的解决方案,但到目前为止我没有任何工作。

3 个答案:

答案 0 :(得分:4)

对于StackOverflow上提出的很多问题,操作不允许问题很常见,而且在我查看的每一个案例中都是如此,因为虚拟机(Vagrant box)正在尝试在(通过NFS或其他)链接到主机操作系统(主计算机)上的文件系统的目录中执行文件权限操作(chmod,chown,chgrp等)。我不想让你了解细节,但这会给一些人带来错误,有些时候;对其他人来说没有问题,其他时候。您在评论中的解决方法说明了这一点!

如果您是受此问题影响的人之一,则必须确保不需要将文件共享作为来宾操作系统中除只读文件结构之外的任何内容;任何需要更改或写入这些文件的内容,例如php composer.phar install(或其他更改/设置/写入内容的内容)都应该在主机上直接执行。

作为最后一点,Vagrant盒子(虚拟机器)应该是一次性的,并且可以在一瞬间被破坏;以及您从虚拟机运行代码以导致作为项目一部分可能永久需要的文件的情况违反了该策略的面值。

替代解决方案:

或者,如果您需要在虚拟化环境中运行代码(Vagrant框,如果您愿意),需要不受限制地访问该客户操作系统的权限功能,只需在其目录树的未触及的位置执行此操作即可。由本地到访客"文件夹来源"到"文件夹目标"映射。如果它是基于Linux的,您可以使用Vagrant框中的mount命令判断此范围内的文件夹。

答案 1 :(得分:0)

这是一个重要的评论,而不是一个答案。在我的流浪汉配置中,我'意外地(误解了)'之前运行$ sudo vagrant up(正确运行$ vagrant destroy dev - 这使得一些本地(主机)文件共享更改为{{1当我重新运行# root时,新版本无法使用文件夹$ vagrant up使“流浪汉”(即使我没有更多虚拟机)

# root

TL; DR 如果你使用sudo与vagrant你需要手动删除/ chown主机上的残留变化为NOT sudo

答案 2 :(得分:0)

我能够通过传递after: :provision,选项告诉vagrant在配置后安装nfs资源来解决这个问题。这是我的vagrantfile中的代码行:

config.bindfs.bind_folder "/var/nfs-#{i}", folder["guest_path"], after: :provision, perms: "u=rwX:g=rwX:o=rD", o: 'nonempty'