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

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

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

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

Это кажется абсолютным шоу для Vagrant. Честно говоря, я не понимаю, как Vagrant полезен для совместного использования сред разработки.

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

Для справки:

  • основная ОС: Ubuntu 12.04
  • гостевая ОС: Debian 6 (выжать)
  • бродяга: 1.2.2
  • Виртуальная коробка: 4.2.12

person Andrew    schedule 04.07.2013    source источник


Ответы (6)


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

config.vm.synced_folder "./vhosts/", "/var/www/vhosts/", id: "vagrant-root", extra: "dmode=777,fmode=777" 
person carbontwelve    schedule 02.10.2013
comment
Часть id у меня не сработала, но сработала настройка разрешений, и это все, для чего мне это было нужно. - person Tyndyll; 29.10.2013
comment
Этот ответ устарел, см. ответ иконоборца - person magnetik; 09.12.2014

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

Это то, что я использую, и это работает хорошо для меня. Так как трудно или невозможно использовать курсив внутри блока <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, которые я использовал, на все, что захотите. Если вы не знаете, что это значит, погуглите «Разрешения для файлов Linux».

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

id может быть чем угодно.

person iconoclast    schedule 25.02.2014
comment
Для справки в будущем, на какую версию бродяги вы ссылаетесь здесь? Одна из проблем, с которой я столкнулся, заключалась в том, что разные версии Vagrant поддерживают разные параметры. - person Andrew; 26.02.2014
comment
Vagrant изменил синтаксис конфигурации. Вот старая документация для версии 1 по синтаксису: docs- v1.vagrantup.com/v1/docs/config/vm/share_folder.html - person Chloe; 18.03.2014
comment
В более новой версии CIFS il должен быть mount_options: ["dir_mode=0775,file_mode=0664"]. (обратите внимание на dir_mode и восьмеричную форму значения) - person magnetik; 09.12.2014
comment
@magnetik: можете ли вы сказать мне (нам), какая версия отмечает изменение между dmode/fmode и dir_mode/file_mode? - person iconoclast; 09.12.2014
comment
Не знаю, в Ubuntu 14.04 это dir_mode. - person magnetik; 09.12.2014
comment
@magnetik: спасибо за информацию. Я не уверен, почему мод-нацисты отклонили ваше редактирование, поскольку оно было явно полезно всем, кто читал ответ. Но это было добавлено сейчас, несмотря на их усилия по улучшению StackOverflow. - person iconoclast; 09.12.2014
comment
Спасибо. Но как вы это используете? Кто-то дал мне кучу кода и сказал запустить vagrant up. Могу ли я что-то смонтировать в работающий виртуальный бокс? Могу ли я использовать его при перезапуске виртуального бокса? Должен ли я повторно запускать vagrant? Это идет в Vagrantfile? Может ли это конфликтовать с чем-то еще в Vagrantfile? Я знаю, что возникает много вопросов, но просто базовое представление о том, как использовать этот блок кода, или ссылка на документацию о том, как вы его используете, помогут мне выбрать правильное направление. - person nealmcb; 30.10.2015
comment
@nealmcb: Я бы попытался кратко ответить на некоторые ваши вопросы, но они очень неясны: что это за куча кода — проект или код для Vagrantfile? Что вы хотите использовать при перезапуске виртуальной машины? Кроме того, вы только что задали несколько вопросов в комментарии. намного лучше публиковать вопросы как вопросы в StackOverflow, если на них еще нет ответов. И, возможно, было бы неплохо сначала взглянуть на документацию Vagrant — вы можете сразу найти несколько ответов. Удачи. - person iconoclast; 31.10.2015
comment
Правильно - вы очень любезны. Это ваш код. Я хочу помочь сделать этот ответ более автономным или простым для кого-то с минимальными знаниями о бродяге. Немного поэкспериментировав, я обнаружил, что это сработало, чтобы добавить его в конец моего Vagrantfile, использовать аргументы для config.vm.synced_folder, которые сначала указывали путь на локальном хосте, а затем один внутри контейнера, убедитесь, что я использовал действительный идентификатор внутри контейнера или просто бросить эту часть, бежать вверх, и я был готов идти, насколько я помню. Но некоторые из них могут отличаться, поэтому некоторые советы экспертов будут даже лучше. - person nealmcb; 02.11.2015
comment
Небольшой совет: когда вы заменяете ‹username› и ‹group_name›, значения должны быть заключены в кавычки. - person authentictech; 26.10.2019

Пробовали ли вы настроить сервер 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
person Matt Cooper    schedule 04.07.2013
comment
Вот как мы в настоящее время запускаем наши виртуальные машины (с файлами, хранящимися локально внутри виртуальной машины и общими для хоста). Однако я надеялся, что Vagrant предложит что-то получше, тем более что он предлагает удобный способ уничтожить и восстановить виртуальные машины. - person Andrew; 08.07.2013
comment
Похоже, вы уже делаете это правильно тогда... Я не думаю, что есть лучший способ, если честно... на самом деле это не ограничение Vagrant как такового... скорее виртуальная коробка, которая делает его сложнее ... возможно, виртуальная машина VMware была бы лучше, но я не использовал ее раньше, поэтому не могу комментировать. - person Matt Cooper; 09.07.2013
comment
+1 Есть ли стандартный способ автоматического редактирования файлов с помощью Vagrant/puppet/chef, чтобы скрипт мог обнаружить и при необходимости добавить блок общего доступа в файл smb.conf, чтобы это не нужно было делать вручную? - person therobyouknow; 03.12.2013
comment
Да, и марионетка, и шеф-повар имеют концепцию файлов шаблонов, поэтому вы можете просто создать шаблон из файла smb.conf и поместить его в нужное место при предоставлении... посмотрите пример шеф-повара в разделе «Использование шаблонов». заголовок здесь: docs.opscode.com/resource_template.html - person Matt Cooper; 03.12.2013
comment
+1 спасибо @MattCooper за эту ссылку, мне нужно будет изучить ее, так как она довольно недоступна для новичка в puppet и нет примеров, но это начало - так что спасибо. Существует также puppet-samba, который теоретически может быть включен в настройку Vagrant, но опять же документация неудобна для пользователя, так как нет полного примера, поэтому я поднял вопрос об улучшении документации. Я ожидаю продолжения исследований — и если я смогу улучшить их сам, я это сделаю. - person therobyouknow; 17.01.2014
comment
Это именно то, что я хочу. Почему я продолжаю получать "Failed to retrieve share list from server: Connection refused" при попытке открыть папку на хосте (Ubuntu)? - person Redsandro; 09.04.2014

Обновление: просмотрите http://docs.vagrantup.com/v2/synced-folders/basic_usage.html снова внизу. Пример (копировать и вставить из документов):

config.vm.synced_folder "src/", "/srv/website", owner: "root", group: "root"
person Felix Rabe    schedule 20.08.2013

Вы пробовали 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 внутри виртуальной машины. У нас есть общий код между хостом и виртуальной машиной через папку Synced, чтобы мы могли разрабатывать с использованием Eclipse, который работает на хосте.

Среда: Mac

person Mingyu    schedule 04.07.2013
comment
Я использую синхронизированные папки, но они не позволяют изменять владельцев или разрешения с гостевой стороны. - person Andrew; 04.07.2013
comment
И поскольку файлы «хранятся» на хосте, а не в гостях, символические ссылки и т. д. не работают в общей файловой системе, когда хостом является Windows. (это проблема, из-за которой я нашел этот вопрос - собираюсь попробовать самбу) - person barryhunter; 04.09.2013
comment
Да, у меня тоже была эта проблема, поэтому просто установите разрешения на 777 или 666 на стороне хоста. - person therobyouknow; 03.12.2013
comment
Вы используете Windows или Mac? При использовании Windows 7 с той же настройкой, что и вы, я столкнулся с этой проблемой - stackoverflow.com/questions/23089023/. Но в предыдущем проекте, где я использовал Mac, я не помню, чтобы сталкивался с такой проблемой. - person Kevin Meredith; 16.04.2014
comment
Я использовал Mac... Я обновил ответ, чтобы включить эту информацию - person Mingyu; 16.04.2014

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

person bfitzpatrick    schedule 08.07.2013
comment
Мы используем эти виртуальные машины для разработки, что означает, что файлы постоянно меняются в течение дня. Мы используем хост-машины для разработки (запуск IDE). Наличие копии файлов, требующей синхронизации, станет основным источником проблем. - person Andrew; 29.10.2013