Vagrant 经常性错误:不允许对NFS资源上的“创建”操作执行操作
我有一个带厨师长的流浪汉包厢。除了在NFS资源上进行操作外,其他一切都正常工作。例如,我有以下同步文件夹:Vagrant 经常性错误:不允许对NFS资源上的“创建”操作执行操作,vagrant,chef-infra,provisioning,Vagrant,Chef Infra,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
"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)的唯一方法是:
nfs
更改为default
default
更改回nfs
我已经搜索并尝试了各种建议的解决方案,但到目前为止没有任何效果 不允许操作的问题在StackOverflow上的许多问题中都很常见,在我看到的每一个案例中,这是因为虚拟机(Vagrant box)试图在链接的目录(通过NFS或其他方式)中执行文件权限操作(chmod、chown、chgrp等)到主机操作系统(主计算机)上的文件系统。我不想让你对细节感到厌烦,但这会在某些时候给一些人带来错误;在其他时间,对其他人来说也没问题。您在评论中的变通方法说明了这一点 如果您是受此问题影响的人之一,您必须确保您的文件共享在来宾操作系统中除了只读文件结构之外不需要其他任何东西;任何需要更改或写入这些文件的内容,例如
php composer.phar install
(或其他更改/设置/写入内容的内容),都应该直接在主机上执行
最后,流浪者盒子(虚拟机)应该是一次性的,一经通知就可以销毁;事实上,您正在从虚拟机运行代码,以生成项目中可能永久需要的文件,这从表面上看与此策略背道而驰
替代解决方案:
或者,如果您需要在虚拟化环境中运行代码(如果愿意,可以在“漫游框”中),而虚拟化环境需要对来宾操作系统的权限功能进行不受限制的访问,那么只需在其目录树的某个位置执行此操作,该位置不受本地到来宾“文件夹源”到“文件夹目标”映射的影响。如果是基于Linux的,您可以通过Vagrant框中的
mount
命令来判断哪些文件夹在这个范围内。这是一个重要的注释,而不是答案。在我的vagrant配置中,我“意外地(误会地)”运行了$sudo vagrant up
(正确地运行$vagrant destroy dev
)-然后,当我重新运行$vagrant up
时,这会使一些本地(主机)文件共享更改为\root
,新的文件无法使用\root
所创建的文件夹“流浪者行动”(尽管我没有更多的虚拟机)
TL;DR如果将sudo与vagrant一起使用,则需要手动删除主机上的剩余更改,而不是sudo我可以通过告诉vagrant在设置后通过传递
after::provision,
选项来装载nfs资源来解决此问题。下面是我的vagrant文件中的代码行:
config.bindfs.bind_folder "/var/nfs-#{i}", folder["guest_path"], after: :provision, perms: "u=rwX:g=rwX:o=rD", o: 'nonempty'
当它失败时,所有权和模式是什么样子的?这就是你想要的:
drwxr-xr-x7 501拨出238 Jan 26 19:41 www
/所以让nfs工作的唯一方法是添加nfs:true,:linux\unfs\u选项=>[“no\u root\u squash”,“rw”,“no\u subtree\u check”],:map\u uid=>0,:map\u gid=>0
但是权限和所有权不正确。我也有这种错误(没有厨师),通过在bash provision脚本中创建文件夹。所有者看起来是一样的,我无法更改它!过了很长一段时间后再回到这个问题,是否可以使用chef在主机上执行指令?我知道它们应该是可销毁的,但对共享资源(如文件系统)执行操作是使用vagran的价值之一t、 另外,我能够通过在完成provisioner之后进行装载来解决问题。在大多数情况下,主机是“圣地”。它是开发人员的环境,保存源文件,并运行(和共存)在一个给定的项目中,有许多工具和资源是不能与其他团队成员共享的,因为它们不是这些不同项目的一部分。因此,chef(以及其他类似的东西)应该将其操作限制在短暂的来宾环境中,并且不允许侵入主机操作系统的“圣地”(及其源文件)。
config.bindfs.bind_folder "/var/nfs-#{i}", folder["guest_path"], after: :provision, perms: "u=rwX:g=rwX:o=rD", o: 'nonempty'