Проблема - проблеми з дозволом у vbox / ubuntu для доступу до спільного диска OSX
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
Мета - простий спосіб ділитися каталогами між середовищами Mac та Ubuntu. На жаль, приклади, які я бачив до цих пір, здаються трохи складнішими, ніж вони насправді потребують, і не пояснюють справжню проблему, яку потрібно вирішити. Я спробую вирішити обидва ці питання тут.
Середовищем тут є Mac, що працює на базі OSX 10.9.5, з Virtual Box 4.3.16, що виконує Ubuntu-14.04.1 з встановленими розширеннями гостей. Вересень 2014 року.
Я думаю, що вся проблема тут полягає в тому, що uid каталогів на Mac і Ubuntu повинен збігатися - gid за замовчуванням, призначений для користувачів та груп, відрізняється між OSX та Ubuntu, і саме тут криється проблема.
Щоб отримати доступ до файлу, він повинен мати його або бути членом групи, яка йому належить. Оскільки доступ насправді заснований на ідентифікаційному номері групи, а не назви групи, все, що потрібно, - це створити загальний номер групи з обох сторін, до якого належать користувачі.
Саме це робить рішення нижче. Не вводьте в оману довжиною написаного, це насправді дуже просто. Прикладів того, що відбувається, є дуже багато.
Я переходжу тут між консолями OSX та VBOX (mac та virtual-box / ubuntu) у цьому документі - переконайтеся, що ви розумієте, у якому вікні знаходиться ваш.
Підсумкове зауваження: Рішення, показане нижче, засноване на встановленні загального ідентифікатора групи між середовищами OSX та Ubuntu, щоб дозволили працювати файли. Можуть бути й інші, більш сучасні рішення. Цей по-справжньому простий і зрозумілий і працює на голих кістках основних неприбраних установках.
OSX: —————
Зауважте, що це було зроблено на свіжому з коробки 10.9.5 Mac, без нічого на ньому, не підключеного до корпоративної мережі, нічого фантазійного, що працює на ньому, крім програмного забезпечення акцій. Це так просто, як це виходить.
Коли я зробив установку за замовчуванням на Mac, joe_public є користувачем адміністратора, а його uid встановлено на 501 .
Joes-MacBook-Pro:/ joe_public$ id
uid=501(joe_public) gid=20(staff) groups=20(staff),999(vboxsf),401(com.apple.sharepoint.group.1),12(everyone),61(localaccounts),79(_appserverusr),80(admin),81(_appserveradm),98(_lpadmin),501(access_bpf),33(_appstore),100(_lpoperator),204(_developer),398(com.apple.access_screensharing),399(com.apple.access_ssh)
Зауважте, що uid становить 501 - це перший ідентифікатор облікового запису за замовчуванням на OSX - нічого особливого
Я створив декілька каталогів, якими я хочу поділитися на стороні Mac. Зауважте, що я не розміщував їх під своїм каталогом користувачів з резервних причин.
Joes-MacBook-Pro:/ joe_public$ mkdir /vdisk
Joes-MacBook-Pro:/ joe_public$ mkdir /vdisk/shared
Joes-MacBook-Pro:/ joe_public$ mkdir /vdisk/public
Joes-MacBook-Pro:/ joe_public$ mkdir /vdisk/images
Joes-MacBook-Pro:vdisk joe_public$ ls -al
total 0
drwxr-xr-x 5 joe_public admin 170 Oct 8 01:08 .
drwxrwxr-t 36 root admin 1292 Oct 6 02:26 ..
drwxrwxrwx 2 joe_public admin 68 Oct 6 01:08 images
drwxr-xr-x 3 joe_public admin 102 Oct 8 01:07 public
drwxrwxrwx 4 joe_public admin 136 Oct 8 00:45 shared
VBOX: ——————
Просте віртуальне вікно за замовчуванням та установка ubuntu - знову ж таки, joe_public - адміністратор за замовчуванням, створений, коли я встановив ubuntu.
Зауважте ще раз, що простір імен між OSX та Ubuntu зовсім інший. Тут немає абсолютно ніяких стосунків між двома іменами.
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_shared$ id
uid=1000(joe_public) gid=1000(joe_public) groups=1000(joe_public),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)
Створив три точки монтажу, використовуючи Налаштування віртуальної скриньки -> спільні папки gui.
Name Path Auto-mount Access
images /vdisk/images Yes Full
public /vdisk/pubic Yes Read-only
shared /vdisk/shared Yes Full
ПРИМІТКА. Насправді мені довелося перезавантажити сеанс, щоб з’ясувати всі ці точки монтажу.
joe_public@joe_public-ubuntu-VirtualBox:~$ mount | grep vboxsf
shared on /media/sf_shared type vboxsf (gid=999,rw)
public on /media/sf_public type vboxsf (gid=999,rw)
images on /media/sf_images type vboxsf (gid=999,rw)
Зауважте, що gid для них - 999 - це група vboxsf .
joe_public@joe_public-ubuntu-VirtualBox:~$ grep 999 /etc/group
vboxsf:x:999
Це було призначено автоматично для нас Virtual Box версії 4.3.16. Документація vbox показує способи, як це змінити, якщо ви встановите шлях вручну через командний рядок, але хто пам’ятатиме це - Просто візьміть за замовчуванням, що GUI на нас примушує ..
Але це не працює (очікується в цей момент - саме це ми намагаємося вирішити)
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
Зауважте, що на даний момент joe_public не є членом цієї групи vboxsf - і це буде проблемою, поки ми не виправити це. FYI: Це групи за замовчуванням, призначені для облікового запису під час його створення.
joe_public@joe_public-ubuntu-VirtualBox:/media$ grep joe_public /etc/group
adm:x:4:syslog,joe_public
cdrom:x:24:joe_public
sudo:x:27:joe_public
dip:x:30:joe_public
plugdev:x:46:joe_public
lpadmin:x:108:joe_public
joe_public:x:1000:
sambashare:x:124:joe_public
Отже, що ми маємо на даний момент (ми ще нічого не зробили, щоб виправити це)
• On mac, joe_public gid is 501
• On linux, joe_public gid is 1000
• On linux, vboxfs gid is 999
• On mac, vboxsf does not exist
Ми не хочемо змінювати gid користувача joe_public з обох боків, оскільки це біль у попці вже встановлених систем, і це не вирішує для інших користувачів. Найпростішим рішенням є скласти відповідний ідентифікатор групи - vboxsf - на стороні mac і переконатися, що joe_public є її членом з обох сторін.
Так, до цих пір на VBox / Убунту, зробити joe_public членом 999 vboxsf групи
joe_public@joe_public-ubuntu-VirtualBox:/$ sudo usermod -a -G vboxsf joe_public
joe_public@joe_public-ubuntu-VirtualBox:/$ grep 999 /etc/group
vboxsf:x:999:joe_public
Думаю, я вийшов зі свого облікового запису і знову повернувся сюди після цього.
OSX: —————
Тепер нам потрібно створити групу vboxsf на mac. Сумніваюсь, що назва насправді має значення - тут важливий ідентифікатор групи 999 . Пам'ятайте, що простори імен системи каталогів (а також імена користувачів) відрізняються між хостом та операційними системами VM. Але просто щоб зробити життя здоровим, ми всі називаємо це vboxsf на mac. Ті ж міркування, чому в joe_public використовується ім'я користувача з обох сторін.
У OSX немає такої простої команди додавання групи, як Linux, тому використовуйте команду dscl, щоб зробити це в декілька етапів. Будь ласка, дивіться документацію на mac os для отримання більш детальної інформації про це. Зауважте, що ми створюємо групу vboxsf і додаємо сюди joe_public до цієї групи.
sudo dscl . -create /Groups/vboxsf
sudo dscl . -create /Groups/vboxsf name vboxsf
sudo dscl . -create /Groups/vboxsf passwd "*”
sudo dscl . -create /Groups/vboxsf gid 999
sudo dscl . -create /Groups/vboxsf GroupMembership joe_public
Отже, на цьому етапі ми повинні були
• On mac, joe_public gid is 501
• On linux, joe_public gid is 1000
• On linux, vboxfs gid is 999
• On mac, vboxsf gid is 999
• On linux, joe_public is member of vboxsf
• On mac, joe_public is member of vboxsf
Доказ тут - якщо він працює - тож наступний крок
VBOX: ——————
CD в наш каталог і торкніться файлу
joe_public@joe_public-ubuntu-VirtualBox:/$ cd /media/sf_shared
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_shared$ touch foo
Перевірте, чи ми успішно створили файл.
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_shared$ ls -al
total 4
drwxrwx--- 1 root vboxsf 102 Oct 8 00:44 .
drwxr-xr-x 5 root root 4096 Oct 8 00:30 ..
-rwxrwx--- 1 root vboxsf 0 Oct 8 00:44 foo
OSX: —————
Joes-MacBook-Pro:shared joe_public$ cd /vdisk/shared
Joes-MacBook-Pro:shared joe_public$ ls -al
total 0
drwxrwxrwx 3 joe_public vboxsf 102 Oct 8 00:44 .
drwxr-xr-x 6 joe_public admin 204 Oct 8 00:17 ..
-rw-r--r-- 1 joe_public vboxsf 0 Oct 8 00:44 foo
Joes-MacBook-Pro:shared joe_public$ touch bar
Joes-MacBook-Pro:shared joe_public$ ls -al
total 0
drwxrwxrwx 4 joe_public vboxsf 136 Oct 8 00:45 .
drwxr-xr-x 6 joe_public admin 204 Oct 8 00:17 ..
-rw-r--r-- 1 joe_public vboxsf 0 Oct 8 00:45 bar
VBOX: ——————
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_shared$ ls -al
total 4
drwxrwx--- 1 root vboxsf 136 Oct 8 00:45 .
drwxr-xr-x 5 root root 4096 Oct 8 00:30 ..
-rwxrwx--- 1 root vboxsf 0 Oct 8 00:45 bar
-rwxrwx--- 1 root vboxsf 0 Oct 8 00:44 foo
Це, здається, працює ..
VBOX: —————— ЗАКЛЮЧНА ПРОВЕРКА
Що ми перевіряємо тут, це те, що все це залежить від того, що користувач joe_public є членом групи vboxsf - і найпростіший спосіб - просто видалити joe_public з групи
Видалення користувача joe_public з групи vboxsf
joe_public@joe_public-ubuntu-VirtualBox:~$ sudo gpasswd -d joe_public vboxsf
log out/in ubuntu
Побачивши, чи можемо ми отримати до нього доступ до нашого каталогу - а ми не можемо, і це доводить, що це проблема групового дозволу
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
Додайте користувача назад у vboxsf
joe_public@joe_public-ubuntu-VirtualBox:/$ sudo usermod -a -G vboxsf joe_public
log out/in ubuntu
Це працює знову!
joe_public@joe_public-ubuntu-VirtualBox:~$ ls -al /media/sf_shared
total 4
drwxrwx--- 1 root vboxsf 170 Oct 8 01:48 .
drwxr-xr-x 6 root root 4096 Oct 8 01:25 ..
-rwxrwx--- 1 root vboxsf 0 Oct 8 00:45 bar
-rwxrwx--- 1 root vboxsf 0 Oct 8 00:44 foo
VBOX: - ОДНА БІЛЬШЕ ПРОБЛЕМА - символічні посилання у vbox -------
Якщо зайти в / media / sf_shared , ви побачите, що символьні посилання в спільних каталогах просто не працюють. Це дійсно велика проблема, якщо ви намагаєтесь створити повне середовище розробки Linux на спільному диску.
joe_public@joe_public-ubuntu-VirtualBox:/media$ cd sf_images
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_images$ ls
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_images$ mkdir test
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_images$ ln -s test test2
ln: failed to create symbolic link ‘test2’: Read-only file system
За замовчуванням символьні посилання не підтримуються у віртуальних скриптах. Пояснення див. Нижче. По суті, наскільки я розумію, символічні посилання - це отвір у захисті, яке було "зафіксовано" у віртуальному вікні, відключивши підтримку для них у часовій рамці 4.1.8 (2011). Я тут біжу 4.3.16 ...
https://www.virtualbox.org/ticket/10085
http://ahtik.com/blog/fixing-your-virtualbox-shared-folder-symlink-error/
На щастя, є задня дверцята для її повторного включення за допомогою команди VBoxManage хоста . Як завжди, будь ласка, зрозумійте тут безпечні отвори, які ви можете відкрити. Я працюю на автономній розробці, тому це, здається, не є проблемою.
OSX: ------------
Joes-MacBook-Pro:shared pbradstr$ VBoxManage setextradata Ubuntu VBoxInternal2/SharedFoldersEnableSymlinksCreate/shared 1
Примітка: Ubuntu - це ім'я мого vm, а спільне - ім'я спільного каталогу.
Ви можете отримати ім'я vm таким чином:
Joes-MacBook-Pro:shared pbradstr$ VBoxManage list vms
"Ubuntu" {8461045a-1cee-4d44-8148-05920a47cee0}
Joes-MacBook-Pro:shared pbradstr$
І назва спільних папок, або через gui Virtual Box, або
Joes-MacBook-Pro:shared pbradstr$ VBoxManage showvminfo Ubuntu | grep -A 5 "Shared folders"
Shared folders:
Name: 'shared', Host path: '/vdisk/shared' (machine mapping), writable
Name: 'public', Host path: '/vdisk/public' (machine mapping), readonly
Name: 'images', Host path: '/vdisk/images' (machine mapping), writable
Я перезавантажив всю тут систему віртуальних ящиків, я не з'ясував мінімальної вимоги, яку він повинен прийняти.
У будь-якому випадку, щоб перевірити це, поверніться до вікна vbox
VBOX: ---------
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_images$ ln -s test test2
Без помилок - і для підтвердження
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_shared$ ls -ald test*
drwxrwx--- 1 root vboxsf 102 Oct 8 11:33 test
lrwxrwx--- 1 root vboxsf 4 Oct 8 13:10 test2 -> test
OSX: ----------
І назад з боку mac - просто щоб довести, що це все працює
Joes-MacBook-Pro:shared pbradstr$ ln -s test test3
Joes-MacBook-Pro:shared pbradstr$ ls -ald test*
drwxr-xr-x 4 joe_public admin 136 Oct 8 13:20 test
lrwxr-xr-x 1 joe_public admin 4 Oct 8 13:10 test2 -> test
lrwxr-xr-x 1 joe_public admin 4 Oct 8 13:21 test3 -> test
Зауважте, я протестував це лише на хості OSX та клієнта віртуальної коробки Ubuntu. Посилання, які я перераховував вище, ніби вказували на те, що може виникнути проблема із запуском хоста на базі Windows.
Вправа ліворуч для студента ———————
Перевага перерахованого вище методу полягає в тому, що він може працювати на автономній машині без доступу до мережі. Але якщо ви подумаєте над цим, ця проблема з іменами-віршами-ідентифікатором має стати загальною проблемою між будь-якими неоднорідними обчислювальними середовищами.
Які ще є рішення, де є рішення цієї проблеми? - Такі речі, як Active Directory (продукт Microsoft) і подібні, можливо, зможуть вирішити це. Було б цікаво отримати колекцію цих рішень і порівняти там різні особливості та вигоди.
sudo mount.vboxsf -o umask=002,gid=1000,uid=1000 src /media/sf_src
, де Umask є значенняumask
користувача, UID і GID взяті зid <user>
,src
це ім'я частки VBox, і/meida/sf_src
є шуканої точкою монтування.