反复出现的 Vagrant 错误:不允许对 NFS 资源上的“创建”操作进行操作

awm*_*awm 8 provisioning chef-infra vagrant

我有一个带有厨师供应商的流浪盒子。除非对 NFS 资源进行操作,否则一切正常。例如,我有以下同步文件夹:

"host_path": "/Users/User/devbox/vdd/data",
        "guest_path": "/var/www",
        "type": "nfs"
Run Code Online (Sandbox Code Playgroud)

在流浪文件中:

 # 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
Run Code Online (Sandbox Code Playgroud)

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

directory "/var/www" do
  owner "vagrant"
  group "vagrant"
end
Run Code Online (Sandbox Code Playgroud)

但是,我不断收到以下错误:

 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:
Run Code Online (Sandbox Code Playgroud)

摆脱问题(并保留 nfs)的唯一方法是通过以下方式:

  1. 更改nfsdefault

  2. vagrant reload --provision

  3. defaultnfs

  4. vagrant reload

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

unr*_*ons 7

操作不允许的问题是常见的有很多问题要问在计算器上,并在约我看着每一个案件,这是因为虚拟机(流浪箱)正在试图做文件权限操作(输入chmod,CHOWN,chgrp命令等。 ) 位于(通过 NFS 或其他方式)链接到主机操作系统(您的主计算机)上的文件系统的目录中。我不想让你厌烦细节,但这会在某些时候给某些人带来错误;在其他时候对其他人没有问题。您在评论中的解决方法说明了这一点!

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

最后要注意的是,Vagrant 盒子(虚拟机)是一次性和可销毁的;事实上,您正在从虚拟机运行代码以生成可能作为项目一部分永久需要的文件,这从表面上看与此策略相悖。

替代解决方案:

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


awm*_*awm 1

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

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