Il problema: problemi di autorizzazione in vbox / ubuntu che accedono a un'unità condivisa OSX
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
L'obiettivo è un modo semplice per condividere directory tra ambienti Mac e Ubuntu. Sfortunatamente gli esempi che ho visto finora sembrano essere un po 'più complessi di quanto debbano essere realmente, e non spiegano davvero quale sia il vero problema che deve essere risolto. Cercherò di gestire entrambi questi problemi qui.
L'ambiente qui è un Mac con OSX 10.9.5, con Virtual Box 4.3.16 che esegue Ubuntu-14.04.1 con estensioni Guest installate. Roba di settembre 2014.
Penso che l'intero problema qui sia che l' uid delle directory sul Mac e in Ubuntu deve corrispondere: il gid predefinito assegnato per utente e gruppi è diverso tra OSX e Ubuntu, ed è qui che sta il problema.
Per accedere a un file, è necessario possederlo o essere un membro del gruppo che lo possiede. E poiché l'accesso si basa in realtà sul numero ID del gruppo, non sul nome del gruppo, tutto ciò che è necessario è creare un numero di gruppo comune su entrambi i lati a cui appartengono gli utenti.
Questo è esattamente ciò che fa la soluzione di seguito. Non lasciarti ingannare dalla lunghezza di ciò che è scritto, in realtà è molto semplice. Ci sono solo molti e molti esempi di ciò che sta succedendo.
Scorrerò tra le console OSX e VBOX qui (mac e virtual-box / ubuntu) all'interno di questo documento - assicurati di capire in quale finestra sei.
Nota finale: la soluzione mostrata di seguito si basa sulla creazione di un ID di gruppo comune tra gli ambienti OSX e Ubuntu, in modo che i permessi dei file funzionino. Potrebbero esserci altre soluzioni più moderne. Questo è davvero semplice e comprensibile e funziona su installazioni semplici e disadorno.
OSX: —————
Si noti che è stato fatto su un Mac 10.9.5 nuovo di zecca, con nulla su di esso, non collegato a una rete aziendale, niente di speciale in esecuzione su di esso diverso dal software di serie. Questo è semplice come si arriva.
Quando ho eseguito l'installazione predefinita sul Mac, joe_public è l'utente admin e il suo uid era impostato su 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)
Nota che l' UID è 501 - questo è il primo ID account predefinito su OSX - niente di speciale
Ho creato alcune directory che voglio condividere sul lato Mac. Nota che non le ho inserite nella mia directory utente per motivi di backup.
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: ——————
Semplice scatola virtuale predefinita e installazione di Ubuntu - ancora una volta, joe_public è l'amministratore predefinito creato quando ho installato Ubuntu.
Si noti ancora una volta che lo spazio dei nomi tra OSX e Ubuntu è completamente diverso. Non c'è assolutamente alcuna relazione tra i due nomi qui.
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)
Creato tre punti di montaggio, usando le impostazioni di Virtual Box -> Gui Cartelle condivise.
Name Path Auto-mount Access
images /vdisk/images Yes Full
public /vdisk/pubic Yes Read-only
shared /vdisk/shared Yes Full
NOTA: in realtà ho dovuto riavviare la sessione per visualizzare tutti questi punti di montaggio.
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)
Si noti che il gid per questi è 999 - questo è il gruppo vboxsf .
joe_public@joe_public-ubuntu-VirtualBox:~$ grep 999 /etc/group
vboxsf:x:999
Questo è stato assegnato automaticamente dalla Virtual Box versione 4.3.16 per noi. La documentazione di Vbox mostra come modificarlo se si monta il percorso manualmente attraverso la riga di comando, ma chi lo ricorderà - Basta prendere le impostazioni predefinite che la GUI ci impone.
Ma non funziona (previsto a questo punto - questo è ciò che stiamo cercando di risolvere)
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
Nota che a questo punto joe_public non è un membro di quel gruppo vboxsf - e questo sarà un problema fino a quando non lo ripareremo. Cordiali saluti: Questi sono i gruppi predefiniti assegnati all'account quando viene creato.
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
Quindi quello che abbiamo a questo punto (non abbiamo ancora fatto nulla per risolverlo)
• 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
Non vogliamo cambiare il gid dell'utente joe_public su entrambi i lati, poiché questo è un problema nel culo su sistemi già installati e non risolve questo problema per altri utenti. La soluzione più semplice è quella di creare un id di gruppo corrispondente - vboxsf - sul lato Mac e assicurarsi che joe_public ne sia membro su entrambi i lati.
Quindi, ancora sul vbox / ubuntu, fanno joe_public un membro del 999 vboxsf gruppo
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
Penso di essermi disconnesso dal mio account e di nuovo qui dopo averlo fatto.
OSX: —————
Ora dobbiamo creare un gruppo vboxsf sul mac. Dubito che il nome in realtà faccia la differenza qui - è l' id del gruppo 999 che è importante. Ricordare che gli spazi dei nomi del sistema di directory (così come i nomi degli utenti) sono diversi tra l'host e i sistemi operativi della VM. Ma solo per rendere la vita sana, la chiamiamo tutti vboxsf sul Mac. Stesso ragionamento per cui a joe_public viene utilizzato un nome utente su entrambi i lati.
OSX non ha un semplice comando aggiungi gruppo come fa Linux - quindi usa il comando dscl per farlo in più passaggi. Per ulteriori dettagli, consultare la documentazione di mac os. Si noti che creiamo il gruppo vboxsf e aggiungiamo joe_public a quel gruppo qui.
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
Quindi, a questo punto, dovremmo
• 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 prova qui è se funziona - quindi questo è il prossimo passo
VBOX: ——————
cd nella nostra directory e toccare un file
joe_public@joe_public-ubuntu-VirtualBox:/$ cd /media/sf_shared
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_shared$ touch foo
Verifica che il file sia stato creato correttamente.
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
Sembra funzionare tutto ..
VBOX: —————— VERIFICA FINALE
Quello che stiamo verificando qui è che tutto dipende dal fatto che l'utente joe_public sia un membro del gruppo vboxsf - e il modo più semplice è semplicemente rimuovere joe_public dal gruppo
Rimozione dell'utente joe_public dal gruppo vboxsf
joe_public@joe_public-ubuntu-VirtualBox:~$ sudo gpasswd -d joe_public vboxsf
log out/in ubuntu
Vedere se possiamo accedere alla nostra directory - e non possiamo, e questo dimostra che si tratta di un problema di autorizzazione del gruppo
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
Aggiungi l'utente di nuovo in vboxsf
joe_public@joe_public-ubuntu-VirtualBox:/$ sudo usermod -a -G vboxsf joe_public
log out/in ubuntu
Funziona di nuovo!
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 ALTRO PROBLEMA - collegamenti simbolici in vbox -------
Se vai in / media / sf_shared , scoprirai che i collegamenti simbolici nelle directory condivise semplicemente non funzionano. Questo è un grosso problema se stai cercando di impostare un ambiente di sviluppo completo per Linux su un'unità condivisa.
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
Per impostazione predefinita, i collegamenti simbolici non sono supportati nelle condivisioni di scatole virtuali. Vedi sotto per le spiegazioni. Fondamentalmente, come ho capito, i collegamenti simbolici sono una falla di sicurezza che sono stati "riparati" in Virtual Box disabilitando il supporto per loro nel periodo di tempo 4.1.8 (2011). Sto correndo il 4.3.16 qui ...
https://www.virtualbox.org/ticket/10085
http://ahtik.com/blog/fixing-your-virtualbox-shared-folder-symlink-error/
Fortunatamente c'è una backdoor per riattivarla, tramite il comando VBoxManage dell'host . Come sempre, ti preghiamo di comprendere le falle di sicurezza che potresti aprire. Sono su una macchina di sviluppo autonoma, quindi questo non sembra essere un problema.
OSX: ------------
Joes-MacBook-Pro:shared pbradstr$ VBoxManage setextradata Ubuntu VBoxInternal2/SharedFoldersEnableSymlinksCreate/shared 1
Nota: Ubuntu è il nome della mia VM, e condiviso è il nome della directory condivisa.
È possibile ottenere il nome VM in questo modo:
Joes-MacBook-Pro:shared pbradstr$ VBoxManage list vms
"Ubuntu" {8461045a-1cee-4d44-8148-05920a47cee0}
Joes-MacBook-Pro:shared pbradstr$
E il nome delle cartelle condivise, tramite la GUI di Virtual Box, oppure
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
Ho riavviato l'intero sistema di scatole virtuali qui, non ho capito il requisito minimo per farlo.
Ad ogni modo, per provarlo, torna alla tua finestra di vbox
VBOX: ---------
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_images$ ln -s test test2
Nessun errore - e da verificare
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: ----------
E di nuovo sul lato Mac - solo per dimostrare che tutto funziona
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
Nota, l'ho testato solo su un host OSX e client di virtual box Ubuntu. I riferimenti che ho elencato sopra sembravano indicare che potrebbe esserci un problema con un host basato su Windows.
ESERCIZIO A SINISTRA PER LO STUDENTE ———————
Il vantaggio del metodo sopra elencato è che può essere eseguito su una macchina stand-alone, senza accesso alla rete. Ma se ci pensate, questo problema nome-versi-ID deve essere un problema comune tra qualsiasi ambiente di elaborazione eterogeneo.
Quali altre soluzioni sono disponibili dove sono disponibili soluzioni a quel problema? - Cose come Active Directory (un prodotto Microsoft) e simili potrebbero essere in grado di risolverlo. Sarebbe interessante ottenere una raccolta di quelle soluzioni e confrontare lì varie caratteristiche e compromessi.
sudo mount.vboxsf -o umask=002,gid=1000,uid=1000 src /media/sf_src
, dove umask è il valoreumask
dell'utente, da dove provengono uid e gidid <user>
,src
è il nome della condivisione VBox ed/meida/sf_src
è il punto di montaggio desiderato.