как смонтировать virtualbox shared folder от имени пользователя

или как настроить виртуальный сервер разработки

Постановка задачи: многие разработчики держат зоопарк серверного ПО (MySQL, Apache, PHP, Nginx, Tomcat и проч.) прямо у себя под Windows. В тоже время, все что они разрабатывают — деплоится на сервера под linux-ом. Удобно? Сомневаюсь! Конечно можно настроить sftp или даже ftp на худой конец и деплоить каждый чих в своем приложении/сайте прямо из вашей любимой IDE, однако не удобнее-ли использовать опцию shared folders, которая идёт в VirtualBox прямо "из коробки". При условии, что вы установили VirtualBox Guest Additions.

Естественно речь идёт о девелоперском окружении (dev. environment). Речи о деплойменте на крупный кластер в этой статье не идёт. Для этого смотрите в сторону Ansible и Chef.

1. Установка VirtualBox Guest Additions

Без установленных дополнений такая полезная опция, как шареные папки будет недоступна на нашей виртуальном сервере разработки. Установка детально описана в документации, здесь же мы её опишем теми коммандами, что необходимо выполнить из консоли Debian.

root@devserver:/# apt-get update && apt-get upgrade
root@devserver:/# apt-get install dkms

Не забудьте вставить образ VBoxGuestAdditions.iso в нашу виртуалку и потом запустите установку VirtualBox Guest Additions командой:

root@devserver:/# cd /media/cdrom
root@devserver:/# sh ./VBoxLinuxAdditions.run

2. Настройка общих папок (shared folders) в VirtualBox

Добавим новую общую папку shared в VirtualBox для нашего виртуального сервера разработки. Можно из командной строки конечно, но мы сделаем проще — так, как приблизительно это показано на рисунке ниже:

создание нового раздела с помощью cfdisk
рисунок 1 — создание новой общей папки в VirtualBox

Примечание: Здесь укажите путь до папки на хостовой машине, которую вы хотите пошарить и имя ресурса-шары (в нашем случае — shared). Авто-монтирование можете не включать — по-умолчанию VirtualBox смонтирует Вашу шареную папку в папку /media/sf_shared — и доступ к ней будет иметь только пользователь root, что явно не наш вариант.

3. Монтирование общей папки (shared folder) в Linux от имени рядового пользователя

Наша цель — смонтировать файлы и папки от имени обычного пользователя dmitry, но с указанием группы www-data. Причём права на папки должны быть выставлены в 755, а на файлы в 644. Для начала узнаем id-ки наших пользователей/групп, которые будут выступать в качестве пользователя-разработчика и группы для монтируемых файлов:

root@devserver:/# cat /etc/passwd

...
www-data:x:33:33:www-data:/var/www:/bin/sh
...
dmitry:x:1000:1000:Dmitry Vl. Rendov,,,:/home/dmitry:/bin/bash

Итак, искомые id-ки у нас на руках — www-data=33, dmitry=1000. Теперь воспользуемся следующей коммандой, чтобы смонтировать нашу общую папку shared folder к папке на которую смотрит наш Apache:

root@devserver:/# sudo mount -t vboxsf -o rw,uid=1000,gid=33,dmask=022,fmask=133 shared /home/dmitry/vhosts/demon.of.by/public_html/

Для интересующихся, опции и их значения описаны ниже:

vboxsf     файловая система VirtualBox

rw         смонтировать чтобы можно было записывать в папку (default)
uid        установить владельца файлов (user id)
gid        установить группу для файлов (group id)
dmask      umask директорий
fmask      umask файлов

shared     имя Вашей расшаренной на хосте папки
/home/...  точка монтирования (папка должна существовать в файловой системе) 

Примечание: Если все сработало как надо, добавьте эту строку в автозагрузку  — поместив эту команду в /etc/rc.local. Почему не в /etc/fstab? Потому-что fstab читается раньше при загрузке системы и могут возникнуть проблемы при монтировании нашей папки.

Примечание 2: не знаю как сейчас, но раньше я неоднократно сталкивался с проблемой обновления маленьких файлов (до 2КБ) и файловой системы vboxsf от VirtualBox. Проблема в том, что изменения в небольших файлах не подхватывались Apache-м и контент отдавался все равно старый. Хотя листинг файла с помощью команды cat показывал, что в папке лежат верные версии файлов. Решение нашлось в стране гугла и заключается в добавлении опций EnableSendfile Off и EnableMMAP Off в файл конфигурации хоста Apache:

root@devserver:/# vim /etc/apache2/sites-available/demon.of.by 

...
EnableSendfile Off
EnableMMAP Off
...

Примечание 3: К сожалению, начиная с версии VirtualBox 4.1.8 — Вы не сможете создавать в шареной папке (файловой системе vboxsf) символические ссылки по соображениям безопасности. Чтобы включить эту опцию, Вам необходимо на хостовой машине (под Windows) выполнить следующую команду:

c:\Program Files\Oracle\VirtualBox\VBoxManage setextradata "Debian Build" VBoxInternal2/SharedFoldersEnableSymlinksCreate/shared 1

Где "Debian Build" — имя Вашей виртуальной машины, а "shared" — имя шареной папки. Дополнительно в оснастке secpol.msc добавьте себя в "Local Policies->User Rights Assignment->Create symbolic links" политику, если вы на хостовой машине не являетесь администратором.

Подсмотрено в официальном баг-трекере здесь — making a symlink fails on a shared folder with EROFS

Вот и всё. Теперь смело запускаете свой любимый IDE на хостовой машине, и работайте вроде как с локальной папкой — но на самом деле непосредственно на своем виртуальном сервере разработки.

Комментарии 1

  1. Алексей — Feb 06, 2017 at 08:02 PM

    У меня так и не заработали символический ссылки под виндой (

  • 1

Комментарии отключены, сожалеем