Recurring Vagrant error: operation not permitted on action `create` on an NFS resource

Recurring Vagrant error: operation not permitted on action `create` on an NFS resource

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

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

在 vagrant 文件中:

 # 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

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

Operation not permitted 问题很常见,在 Whosebug 上被问到很多问题,在我查看的几乎所有情况下,这是因为虚拟机(Vagrant box)是尝试在链接(通过 NFS 或其他方式)到主机 OS(您的主计算机)上的文件系统的目录中执行文件权限操作(chmod、chown、chgrp 等)。我不想让你厌烦细节,但这有时会给某些人带来错误;其他时候对其他人来说没问题。您在评论中的解决方法说明了这一点!

如果您是受此问题影响的人之一,则必须确保除了 只读 文件结构之外不需要您的文件共享客人 OS;以及任何需要更改或写入这些文件的东西,例如 php composer.phar install(或其他 change/set up/write 东西)应该直接在主机上发生并执行。

最后一点,Vagrant boxes(虚拟机)是一次性的,可以在接到通知后立即销毁;并且您 运行宁代码 来自虚拟机 导致可能永久需要的文件作为项目的一部分这一事实从表面上违背了这一策略。

替代解决方案:

或者,如果您需要 运行 在需要不受限制地访问该来宾 OS 权限功能的虚拟化环境(Vagrant 框,如果您愿意)中编写代码,只需这样做在其目录树的某个位置,本地到访客 "folder source" 到 "folder target" 映射未触及。您可以使用来自 Vagrant 框的 mount 命令判断哪些文件夹在此范围内,如果它是基于 Linux 的话。

这是一个比答案更重要的评论。在我的 vag运行t 配置中,我 'accidentally (misunderstanding-ly)' 运行 $ sudo vagrant up 之前(正确地 运行 $ vagrant destroy dev- 这使 一些 本地(主机)文件共享更改为 # root,当我重新 运行 $ vagrant up 新的无法使用 # root 制作的文件夹时 "vagrant up"(即使我没有更多的虚拟机)

^
|
hard to explain easy to actually understand

TL;DR 如果将 sudo 与 vag运行t 一起使用,则需要手动 remove/chown 主机上的剩余更改,因为不是 sudo

我能够通过传递 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'