Повторяющаяся ошибка Vagrant: операция не разрешена для действия `create` на ресурсе NFS
У меня есть бродячая коробка с шеф-поваром. Все работает нормально, кроме случаев, когда есть работа с ресурсами 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
и у меня также есть рецепт шеф-повара, который выполняет create
действие на ресурсе nfs:
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
,бежать
vagrant reload --provision
менять
default
вернуться кnfs
бежать
vagrant reload
Я искал и пробовал различные предлагаемые решения, но пока у меня ничего не получалось.
3 ответа
Я смог решить эту проблему, сказав 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'
Проблема " Операция не разрешена" характерна для множества вопросов, задаваемых в Stackru, и почти во всех случаях, которые я рассматривал, это связано с тем, что виртуальная машина (блок Vagrant) пытается выполнять операции с правами доступа к файлам (chmod, chown, chgrp и т. Д.).) в каталоге, который связан (через NFS или что-то еще) с файловой системой на хост-ОС (ваш главный компьютер). Я не хочу утомлять вас деталями, но это иногда приводит к ошибке для некоторых людей; и не быть проблемой для других людей, в другое время. Ваш обходной путь в комментариях иллюстрирует этот момент!
Если вы один из тех, кого эта проблема затрагивает, вы должны убедиться, что ваши общие файловые ресурсы не нужны, как ничто иное, как файловая структура только для чтения в гостевой ОС; и все, что нужно изменить или записать в эти файлы, такие как php composer.phar install
(или другие вещи, которые меняют / настраивают / пишут) должны происходить и выполняться непосредственно на главном компьютере.
В заключение, ящики Vagrant (виртуальные машины) должны быть одноразовыми и уничтожаться в любой момент; и тот факт, что вы запускаете код с виртуальной машины, чтобы заставить файлы, которые, вероятно, постоянно нужны как часть вашего проекта, не поддаются этой стратегии за чистую монету.
Альтернативное решение:
В качестве альтернативы, если вам нужно запустить код в виртуализированной среде (если хотите, в окне Vagrant), которому требуется беспрепятственный доступ к возможностям разрешений этой гостевой ОС, просто сделайте это в месте своего дерева каталогов, которое не затронуто локальным -то-гостевой "источник папки" в сопоставление "целевой папки". Вы можете сказать, какие папки находятся в этом диапазоне с помощью mount
команда из поля Vagrant, если она основана на Linux.
Это скорее важный комментарий, чем ответ. в моей бродячей конфигурации я "случайно (недопонимание)" побежал $ sudo vagrant up
до (правильно работает $ vagrant destroy dev
- это сделало некоторые локальные (хост) изменения файлового ресурса как # root
когда я перезапустил $ vagrant up
новый не может использовать папки # root
сделал "бродячий" (хотя у меня не было больше VM)
^
|
hard to explain easy to actually understand
TL; DR, если вы используете sudo с vagrant, вам нужно вручную удалить / выбрать остаточные изменения на хосте как НЕ sudo