Vagrant: Можно ли делиться файлами и изменять разрешения внутри гостевого?

Я ползаю головой о стену в течение полутора недель, пытаясь разобраться, как правильно обмениваться файлами между хостом и гостем, используя Vagrant и VirtualBox.

Чего мне нужно добиться - это блок автоматической настройки, который загружает нашу базу кода из github. Права на кодовую базу должны варьироваться от файла к файлу (файлы PHP, сценарии оболочки, папки tmp, папки журналов и т.д.). Файлы кода также должны быть доступны из окна хоста для редактирования.

До сих пор я пробовал обычный обмен виртуальными камерами, совместное использование NFS, совместное использование NFS с bindFS. Ни один из них, похоже, не позволяет изменять индивидуальные права доступа к файлам.

Это, кажется, абсолютный showstopper для Vagrant. Я честно не понимаю, как бродяга полезен для совместного использования среды разработки.

Кто-нибудь знает, как правильно настроить это? Возможно ли это?

Для справки:

  • хост ОС: Ubuntu 12.04
  • гостевая ОС: Debian 6 (сжатие)
  • бродяга: 1.2.2
  • VirtualBox: 4.2.12

Ответы

Ответ 1

Я не уверен, что это полностью отвечает на ваш вопрос, но у меня была проблема с тем, что мои приложения не могли записывать на диск в систему общих папок, поэтому я использовал следующее в своем Vagrantfile, чтобы разрешить доступ к r/w любые общие файлы изнутри клиента.

config.vm.synced_folder "./vhosts/", "/var/www/vhosts/", id: "vagrant-root", extra: "dmode=777,fmode=777" 

Ответ 2

Здесь есть несколько частичных ответов, но я бы хотел облегчить людям поиск этого вопроса, чтобы им не приходилось экспериментировать с различными способами объединения этих частичных ответов в один.

Это то, что я использую, и он работает хорошо для меня. Так как трудно или невозможно использовать курсив внутри блока <code>, я поместил биты, которые вы захотите изменить внутри <angled brackets>.

config.vm.synced_folder ".", "/var/www/vhosts/<project_name>", 
    id: "project",
    owner: <username>,
    group: <group_name>,
    mount_options: ["dmode=775,fmode=664"]

Или, возможно (в зависимости от версии CIFS/SMB, которую вы используете):

    mount_options: ["dir_mode=775,file_mode=664"]

Без владельца и группы Vagrant будет использовать значение config.ssh.username (при загрузке ящика) в качестве владельца и группы. Используя конфигурацию, подобную приведенной выше, вы можете контролировать, какой владелец и группа назначены для общей папки, поскольку вход в виртуальную машину и попытка использования chgrp и chown не работают.

Без mount_options у вас не будет возможности контролировать, какие права предоставляются владельцу и группе (и другим). Несмотря на то, что это виртуальная машина, и вы можете утверждать, что это нормально использовать права 777 для них, я не рекомендую ее, так как это плохая привычка, и если вы не будете осторожны, вы несете ее переносить в производство, ослабив вашу безопасность производства. Но, очевидно, вы можете изменить 775 и 664, которые я использовал для того, что вы хотите. Если вы не знаете, что это значит, Google "Разрешения на файлы Linux".

Вы можете (по привычке) вставить пробел после запятой, которая разделяет массив mount_options. Не. Он не будет работать с запятой.

id может быть любым, что вы хотите.

Ответ 3

Вы пытались настроить сервер Samba или что-то подобное, чтобы вы делили гостевую файловую систему с хостом, а не наоборот?

Я столкнулся с проблемами со встроенным совместным использованием в Vagrant, поэтому я просто настроил все, как хотел, на гостя, а затем установил простой общий ресурс Samba, чтобы создать маску для создания пользователя, группы и файла по умолчанию и т.д. Это было для работы с Windows-машиной, хотя это может быть лучшим выбором, чем Samba...

У меня был гостевой ubuntu, поэтому настройка была такой же простой, как запуск

$ apt-get install samba

Добавьте общий блок для каждой папки, которую вы хотите поделиться в файле /etc/samba/smb.conf, например:

[data]
    comment = Local Dev Server - /data
    path = /data
    browsable = yes
    guest ok = yes
    read only = no
    create mask = 0777
    force user = root
    force group = root
#[data] End

Ответ 5

Вы попробовали synced folder?

Я использую Vagrant + VirtualBox некоторое время, и мы используем synced folder для совместного использования кода между хостом и Vagrant VM.

Здесь ссылка:

http://docs.vagrantup.com/v2/synced-folders/basic_usage.html

Вот пример кода:

Vagrant.configure("2") do |config|
  config.vm.synced_folder "src/", "/srv/website"
end

Немного фона

Мы настраиваем VirtualBox как нашу среду разработки, и мы запускаем наше приложение и сервер базы данных хостов, сервер Tomcat внутри VM. У нас есть наш код, разделяемый между хостом и виртуальной машиной через Synced-папку, чтобы мы могли разрабатывать с использованием Eclipse, который работает на хосте.

Окружающая среда: Mac

Ответ 6

Вы можете попробовать скопировать кодовую базу из общей папки в папку с гостевой машиной, скажем от /vagrant/codebase до /codebase. Как только вы доберете все файлы до гостевой машины, вы можете chown их как обычно. Это не идеально, но вы можете написать простой script для запуска всякий раз, когда вы изменяете код со стороны хоста. Вы также можете попробовать запустить script, который копируется в любых файлах при загрузке виртуальной машины, в зависимости от того, как часто вам нужно обновлять файлы.