Le problème - problèmes d'autorisation dans vbox / ubuntu accédant à un lecteur partagé OSX
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
L'objectif est un moyen simple de partager des répertoires entre les environnements Mac et Ubuntu. Malheureusement, les exemples que j'ai vus jusqu'à présent semblent être un peu plus complexes qu'ils ne devraient l'être, et n'expliquent pas vraiment quel est le vrai problème qui doit être résolu. J'essaierai de traiter ces deux problèmes ici.
L'environnement ici est un Mac exécutant OSX 10.9.5, avec Virtual Box 4.3.16 exécutant Ubuntu-14.04.1 avec des extensions invité installées. Trucs de septembre 2014.
Je pense que tout le problème ici est que l' uid des répertoires sur Mac et dans Ubuntu doit correspondre - Les gid par défaut attribués pour les utilisateurs et les groupes sont différents entre OSX et Ubuntu, et c'est là que réside le problème.
Pour accéder à un fichier, il faut soit le posséder, soit être membre du groupe qui le possède. Et comme l'accès est en fait basé sur le numéro d'identification du groupe, et non sur le nom du groupe, tout ce qui est nécessaire est de créer un numéro de groupe commun des deux côtés, auquel les utilisateurs appartiennent.
C'est exactement ce que fait la solution ci-dessous. Ne vous laissez pas induire en erreur par la longueur de ce qui est écrit, c'est en fait très simple. Il y a juste beaucoup, beaucoup d'exemples de ce qui se passe.
Je vais basculer entre les consoles OSX et VBOX ici (mac et virtual-box / ubuntu) dans ce document - assurez-vous de comprendre dans quelle fenêtre vous êtes.
Remarque finale: La solution présentée ci-dessous est basée sur l'établissement d'un identifiant de groupe commun entre les environnements OSX et Ubuntu, afin que les autorisations de fichier fonctionnent. Il peut y avoir d'autres solutions plus modernes. Celui-ci est vraiment simple et compréhensible, et fonctionne sur des installations de base sans fioritures.
OSX: —————
Notez que cela a été fait sur un Mac 10.9.5 tout neuf, sans rien dessus, non connecté à un réseau d'entreprise, rien de spécial à exécuter dessus, à part un logiciel standard. C'est aussi simple que possible.
Lorsque j'ai effectué l'installation par défaut sur le Mac, joe_public est l'utilisateur administrateur et son UID a été défini sur 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)
Notez que l' uid est 501 - c'est le premier identifiant de compte par défaut sur OSX - rien de spécial
J'ai créé quelques répertoires que je souhaite partager côté Mac - Notez que je ne les ai pas mis sous mon répertoire utilisateur pour des raisons de sauvegarde.
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: ——————
Boîte virtuelle par défaut simple et installation d'ubuntu - encore une fois, joe_public est l'administrateur par défaut créé lorsque j'ai installé ubuntu.
Veuillez noter une fois de plus que l'espace de nom entre OSX et Ubuntu est complètement différent. Il n'y a absolument aucune relation entre les deux noms ici.
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)
Création de trois points de montage à l'aide de la configuration de Virtual Box -> Gui Dossiers partagés.
Name Path Auto-mount Access
images /vdisk/images Yes Full
public /vdisk/pubic Yes Read-only
shared /vdisk/shared Yes Full
REMARQUE: j'ai dû redémarrer ma session pour que tous ces points de montage apparaissent.
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)
Notez que le gid pour ceux-ci est 999 - c'est le groupe vboxsf .
joe_public@joe_public-ubuntu-VirtualBox:~$ grep 999 /etc/group
vboxsf:x:999
Cela a été attribué automatiquement par Virtual Box version 4.3.16 pour nous. La documentation de la vbox montre comment changer cela si vous montez le chemin manuellement via la ligne de commande, mais qui s'en souviendra - Prenez simplement les valeurs par défaut que la GUI nous impose.
Mais cela ne fonctionne pas (attendu à ce stade - c'est ce que nous essayons de résoudre)
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
Notez qu'à ce stade, joe_public n'est pas membre de ce groupe vboxsf - et ce sera un problème jusqu'à ce que nous le corrigions. Pour info: ce sont les groupes par défaut affectés au compte lors de sa création.
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
Donc, ce que nous avons à ce stade (nous n'avons encore rien fait pour y remédier)
• 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
Nous ne voulons pas changer le gid de l'utilisateur joe_public de chaque côté, car c'est une douleur dans le cul sur les systèmes déjà installés, et ne résout pas cela pour les autres utilisateurs. La solution la plus simple consiste à créer un identifiant de groupe correspondant - vboxsf - côté mac et à vous assurer que joe_public en est membre des deux côtés.
Alors, encore Vbox / ubuntu, faire joe_public membre du 999 vboxsf groupe
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
Je pense que je me suis déconnecté de mon compte et que je me suis reconnecté ici après avoir fait cela.
OSX: —————
Maintenant, nous devons créer un groupe vboxsf sur le mac. Je doute que le nom fasse réellement une différence ici - c'est l' identifiant du groupe 999 qui est important. N'oubliez pas que les espaces de nom du système d'annuaire (ainsi que les noms d'utilisateur) sont différents entre les systèmes d'exploitation hôte et VM. Mais juste pour rendre la vie saine, nous l'appelons tous vboxsf sur mac. Même raisonnement pour lequel joe_public utilise un nom d'utilisateur des deux côtés.
OSX n'a pas une simple commande d'ajout de groupe comme Linux - utilisez donc la commande dscl pour le faire en plusieurs étapes. Veuillez consulter la documentation de mac os pour plus de détails à ce sujet. Notez que nous créons le groupe vboxsf et ajoutons joe_public à ce groupe ici.
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
Donc, à ce stade, nous devrions avoir
• 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
La preuve ici est que cela fonctionne - c'est donc la prochaine étape
VBOX: ——————
cd dans notre répertoire et touchez un fichier
joe_public@joe_public-ubuntu-VirtualBox:/$ cd /media/sf_shared
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_shared$ touch foo
Vérifiez que nous avons créé un fichier avec succès.
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
Tout semble fonctionner ..
VBOX: —————— VÉRIFICATION FINALE
Ce que nous vérifions ici, c'est que tout cela dépend du fait que l'utilisateur joe_public soit membre du groupe vboxsf - et la manière la plus simple consiste simplement à supprimer joe_public du groupe
Suppression de l'utilisateur joe_public du groupe vboxsf
joe_public@joe_public-ubuntu-VirtualBox:~$ sudo gpasswd -d joe_public vboxsf
log out/in ubuntu
Voyant si nous pouvons y accéder notre répertoire - et nous ne pouvons pas, et cela prouve que c'est un problème d'autorisation de groupe
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
Ajouter un utilisateur dans vboxsf
joe_public@joe_public-ubuntu-VirtualBox:/$ sudo usermod -a -G vboxsf joe_public
log out/in ubuntu
Ça marche encore!
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: - UN PROBLÈME DE PLUS - liens symboliques dans vbox -------
Si vous allez dans / media / sf_shared , vous constaterez que les liens symboliques dans les répertoires partagés ne fonctionnent tout simplement pas. C'est un très gros problème si vous essayez de configurer un environnement de développement Linux complet sur un lecteur partagé.
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
Par défaut, les liens symboliques ne sont pas pris en charge sur les partages de boîtes virtuelles. Voir ci-dessous pour des explications. Fondamentalement, si je comprends bien, les liens symboliques sont un trou de sécurité qui ont été "corrigés" dans Virtual Box en désactivant leur prise en charge dans la période 4.1.8 (2011). Je lance 4.3.16 ici ...
https://www.virtualbox.org/ticket/10085
http://ahtik.com/blog/fixing-your-virtualbox-shared-folder-symlink-error/
Heureusement, il existe une porte dérobée pour la réactiver, via la commande VBoxManage de l'hôte . Comme toujours, veuillez comprendre les failles de sécurité que vous pourriez ouvrir. Je suis sur une machine de développement autonome, donc cela ne semble pas être un problème.
OSX: ------------
Joes-MacBook-Pro:shared pbradstr$ VBoxManage setextradata Ubuntu VBoxInternal2/SharedFoldersEnableSymlinksCreate/shared 1
Remarque: Ubuntu est le nom de mon vm et shared est le nom du répertoire partagé.
Vous pouvez obtenir le nom vm comme ceci:
Joes-MacBook-Pro:shared pbradstr$ VBoxManage list vms
"Ubuntu" {8461045a-1cee-4d44-8148-05920a47cee0}
Joes-MacBook-Pro:shared pbradstr$
Et le nom des dossiers partagés, soit via l'interface virtuelle de la boîte virtuelle, soit
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
J'ai redémarré l'ensemble du système de boîte virtuelle ici, je n'ai pas compris la configuration minimale requise.
Quoi qu'il en soit, pour tester cela, revenez à votre fenêtre vbox
VBOX: ---------
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_images$ ln -s test test2
Aucune erreur - et à vérifier
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: ----------
Et de retour du côté mac - juste pour prouver que tout fonctionne
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
Veuillez noter que je n'ai testé cela que sur un hôte OSX et un client de boîte virtuelle Ubuntu. Les références que j'ai énumérées ci-dessus semblent indiquer qu'il pourrait y avoir un problème lors de l'exécution d'un hôte Windows.
EXERCICE À GAUCHE POUR L'ÉLÈVE ————————
L'avantage de la méthode répertoriée ci-dessus est qu'elle peut fonctionner sur une machine autonome, sans accès au réseau. Mais si vous y réfléchissez, ce problème de nom-vers-id doit être un problème commun à tous les environnements informatiques hétérogènes.
Quelles autres solutions sont disponibles là où des solutions à ce problème sont disponibles? - Des choses comme Active Directory (un produit Microsoft) et similaires pourraient résoudre ce problème. Il serait intéressant d'obtenir une collection de ces solutions et d'y comparer diverses fonctionnalités et compromis.
sudo mount.vboxsf -o umask=002,gid=1000,uid=1000 src /media/sf_src
, où le umask est la valeur deumask
l'utilisateur, uid et gid sontid <user>
,src
est le nom du partage VBox et/meida/sf_src
est le point de montage souhaité.