重复出现的Vagrant错误:在NFS资源上执行`create`操作时无权限

8

我有一个带有Chef配置的Vagrant虚拟机。除了在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

我已经搜索并尝试了各种建议的解决方案,但至今没有任何一个可行。

当所有权和模式失败时,会出现什么情况? - coderanger
1
这是你要的吗:drwxr-xr-x 7 501 dialout 238 Jan 26 19:41 www / - awm
1
жүҖд»Ҙи®©nfsе·ҘдҪңзҡ„е”ҜдёҖж–№жі•жҳҜж·»еҠ nfs: true, :linux__nfs_options => ["no_root_squash", "rw","no_subtree_check"],:map_uid => 0, :map_gid => 0пјҢдҪҶиҝҷж ·дјҡеҜјиҮҙжқғйҷҗе’ҢжүҖжңүжқғдёҚжӯЈзЎ®гҖӮ - awm
我也遇到了这种错误(没有使用chef),在bash provision脚本中创建文件夹。所有者看起来都一样,我无法更改它! - nha
这个链接帮助我解决了这个问题:https://dev59.com/41MI5IYBdhLWcg3wIn5m - lukassteiner
3个回答

6
“Operation not permitted”问题在StackOverflow上被问到了很多次,我看过的每一个案例中,都是因为虚拟机(Vagrant box)试图在链接到主机操作系统(你的电脑)的文件系统(通过NFS或其他方式)中执行文件权限操作(chmod、chown、chgrp等)的目录中出现的。我不想详细说明,但这会对某些人在某些时候产生错误;而对于其他人,在其他时候则没有问题。你在评论中提供的解决方法证明了这一点!
如果您是受此问题影响的人之一,则必须确保您的文件共享仅作为客户端操作系统中的“只读”文件结构,并且需要更改或写入这些文件的任何内容,例如php composer.phar install(或其他更改/设置/编写内容的工具),应直接在主机计算机上执行。
最后,Vagrant boxes(虚拟机)旨在随时可处置和销毁;从虚拟机运行代码以导致文件可能永久需要作为项目的一部分的事实,从根本上违反了这种策略。
备选方案: 或者,如果您需要在虚拟化环境(即Vagrant box)中运行需要访问该客户端操作系统的权限功能的代码,请在未被本地到客户端的“文件夹源”到“文件夹目标”映射所触及的目录树位置中执行。如果它是基于Linux的,则可以使用Vagrant box中的mount命令来查看哪些文件夹在此范围内。

长时间之后回来,是否可以使用Chef在主机上执行指令?我知道它们应该是可销毁的,但在共享资源(如文件系统)上执行操作是使用Vagrant的价值之一。顺便说一句,我通过在提供程序完成后进行挂载来解决了这个问题。 - awm
在大多数情况下,主机是“圣地”。这是开发人员的环境,源文件存放在其中,并与许多工具和资源一起运行(并共存),这些工具和资源不应与给定项目上的其他团队成员共享,因为它们不是这些各种项目的组成部分。因此,Chef(和其他类似的东西)应该将其操作限制在短暂的客户环境中,并且不允许其侵入主机操作系统(及其源文件)的“圣地”。 - unrivaledcreations

1

这是一条更重要的评论,而不是答案。在我的vagrant配置中,我“误解地”运行了$ sudo vagrant up,而没有正确地运行$ vagrant destroy dev - 这导致一些本地(主机)文件共享更改为# root,当我重新运行$ vagrant up时,新的无法使用# root创建的文件夹(即使我没有更多的虚拟机)。

^
|
hard to explain easy to actually understand

如果您在vagrant中使用sudo,则需要手动删除/更改主机上的残留更改,而不是使用sudo。

1
我通过在vagrantfile中传递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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接