Повторяющаяся ошибка 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) заключается в следующем:

  1. + Изменить nfs в default,

  2. бежать vagrant reload --provision

  3. менять default вернуться к nfs

  4. бежать 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

Другие вопросы по тегам