El problema: problemas de permisos en vbox / ubuntu para acceder a una unidad compartida OSX
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
El objetivo es una forma sencilla de compartir directorios entre entornos Mac y Ubuntu. Desafortunadamente, los ejemplos que he visto hasta ahora parecen ser un poco más complejos de lo que realmente deben ser, y realmente no explican cuál es el problema real que debe resolverse. Intentaré manejar ambos problemas aquí.
El entorno aquí es una Mac con OSX 10.9.5, con Virtual Box 4.3.16 ejecutando Ubuntu-14.04.1 con extensiones Guest instaladas. Septiembre 2014 cosas.
Creo que todo el problema aquí es que el uid de los directorios en la Mac y en Ubuntu deben coincidir: los gid predeterminados asignados para usuarios y grupos son diferentes entre OSX y Ubuntu, y ahí es donde radica el problema.
Para acceder a un archivo, uno debe poseerlo o ser miembro del grupo que lo posee. Y como el acceso se basa realmente en el número de identificación del grupo, no en el nombre del grupo, todo lo que se necesita es crear un número de grupo común en ambos lados, al que pertenezcan los usuarios.
Eso es exactamente lo que hace la solución a continuación. No se deje engañar por la longitud de lo que está escrito, en realidad es muy simple. Hay muchos ejemplos de lo que está sucediendo.
Voy a cambiar entre las consolas OSX y VBOX aquí (mac y virtual-box / ubuntu) dentro de este documento; asegúrese de comprender en qué ventana está.
Nota final: La solución que se muestra a continuación se basa en establecer una identificación de grupo común entre los entornos OSX y Ubuntu, para que los permisos de archivo funcionen. Puede haber otras soluciones más modernas. Este es realmente simple y comprensible, y se ejecuta en instalaciones básicas sin adornos.
OSX: —————
Tenga en cuenta que se realizó en una Mac 10.9.5 recién preparada, sin nada, no conectada a una red corporativa, nada más sofisticado que el software estándar. Esto es tan simple como se pone.
Cuando hice la instalación predeterminada en la Mac, joe_public es el usuario administrador y su uid se configuró en 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)
Tenga en cuenta que el uid es 501 , este es el primer ID de cuenta predeterminado en OSX, nada especial
Creé algunos directorios que quiero compartir en el lado de Mac. Tenga en cuenta que no los puse en mi directorio de usuario por razones de respaldo.
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: ——————
Instalación virtual simple predeterminada de ubuntu y box: nuevamente, joe_public es el administrador predeterminado creado cuando instalé ubuntu.
Tenga en cuenta una vez más que el espacio de nombres entre OSX y Ubuntu es completamente diferente. No hay absolutamente ninguna relación entre los dos nombres aquí.
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)
Creé tres puntos de montaje, usando la configuración de Virtual Box -> Carpetas compartidas gui.
Name Path Auto-mount Access
images /vdisk/images Yes Full
public /vdisk/pubic Yes Read-only
shared /vdisk/shared Yes Full
NOTA: De hecho, tuve que reiniciar mi sesión para que aparecieran todos estos puntos de montaje.
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)
Tenga en cuenta que el gid para estos es 999: este es el grupo vboxsf .
joe_public@joe_public-ubuntu-VirtualBox:~$ grep 999 /etc/group
vboxsf:x:999
Esto fue asignado automáticamente por Virtual Box versión 4.3.16 para nosotros. La documentación de vbox muestra formas de cambiar esto si monta la ruta manualmente a través de la línea de comando, pero quién va a recordar eso: simplemente tome los valores predeterminados que la GUI nos impone.
Pero no funciona (esperado en este punto, eso es lo que estamos tratando de resolver)
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
Tenga en cuenta que en este momento joe_public no es miembro de ese grupo vboxsf , y eso será un problema hasta que lo arreglemos . FYI: estos son los grupos predeterminados asignados a la cuenta cuando se crea.
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
Entonces, lo que tenemos en este momento (aún no hemos hecho nada para solucionarlo)
• 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
No queremos cambiar el gid del usuario joe_public en ninguno de los lados, ya que es un fastidio en los sistemas ya instalados y no resuelve esto para otros usuarios. La solución más simple es hacer una identificación de grupo coincidente, vboxsf , en el lado de Mac, y asegurarse de que joe_public sea miembro de ambos lados.
Por lo tanto, todavía en vbox / ubuntu, hacen joe_public un miembro de la 999 vboxsf grupo
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
Creo que salí de mi cuenta y volví a ingresar aquí después de hacer esto.
OSX: —————
Ahora necesitamos crear un grupo vboxsf en la mac. Dudo que el nombre realmente haga una diferencia aquí: es la identificación del grupo 999 lo que es importante. Recuerde que los espacios de nombres del sistema de directorio (así como los nombres de usuario) son diferentes entre el host y los sistemas operativos VM. Pero solo para hacer que la vida sea sensata , todos lo llamamos vboxsf en la Mac. El mismo razonamiento por el cual joe_public usa un nombre de usuario en ambos lados.
OSX no tiene un simple comando agregar grupo como Linux, así que use el comando dscl para hacerlo en varios pasos. Consulte la documentación de Mac OS para obtener más detalles al respecto. Observe que creamos el grupo vboxsf y agregamos joe_public a ese grupo aquí.
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
Entonces, en este punto, deberíamos tener
• 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 prueba aquí es si funciona, así que ese es el siguiente paso
VBOX: ——————
cd en nuestro directorio y toque un archivo
joe_public@joe_public-ubuntu-VirtualBox:/$ cd /media/sf_shared
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_shared$ touch foo
Comprueba que creamos un archivo con éxito.
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
Todo parece estar funcionando ...
VBOX: —————— VERIFICACIÓN FINAL
Lo que estamos verificando aquí es que todo esto depende de que el usuario joe_public sea miembro del grupo vboxsf , y la forma más simple es simplemente eliminar joe_public del grupo
Eliminando al usuario joe_public del grupo vboxsf
joe_public@joe_public-ubuntu-VirtualBox:~$ sudo gpasswd -d joe_public vboxsf
log out/in ubuntu
Ver si podemos acceder a nuestro directorio, y no podemos, y esto demuestra que es un problema de permiso de grupo
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
Agregar usuario nuevamente a vboxsf
joe_public@joe_public-ubuntu-VirtualBox:/$ sudo usermod -a -G vboxsf joe_public
log out/in ubuntu
Funciona de nuevo!
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 PROBLEMA MÁS - enlaces simbólicos en vbox -------
Si va a / media / sf_shared , encontrará que los enlaces simbólicos en directorios compartidos simplemente no funcionan. Este es un problema realmente grande si está intentando configurar un entorno de desarrollo de Linux completo en una unidad compartida.
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
De forma predeterminada, los enlaces simbólicos no son compatibles con los recursos compartidos de caja virtual. Vea a continuación las explicaciones. Básicamente, según tengo entendido, los enlaces simbólicos son un agujero de seguridad que se "solucionó" en Virtual Box al deshabilitar el soporte para ellos en el marco de tiempo 4.1.8 (2011). Estoy ejecutando 4.3.16 aquí ...
https://www.virtualbox.org/ticket/10085
http://ahtik.com/blog/fixing-your-virtualbox-shared-folder-symlink-error/
Afortunadamente, hay una puerta trasera para volver a habilitarla, a través del comando VBoxManage del Host . Como siempre, comprenda los agujeros de seguridad que puede estar abriendo aquí. Estoy en una máquina de desarrollo independiente, por lo que esto no parece ser un problema.
OSX: ------------
Joes-MacBook-Pro:shared pbradstr$ VBoxManage setextradata Ubuntu VBoxInternal2/SharedFoldersEnableSymlinksCreate/shared 1
Nota: Ubuntu es el nombre de mi vm, y shared es el nombre del directorio compartido.
Puede obtener el nombre de VM de esta manera:
Joes-MacBook-Pro:shared pbradstr$ VBoxManage list vms
"Ubuntu" {8461045a-1cee-4d44-8148-05920a47cee0}
Joes-MacBook-Pro:shared pbradstr$
Y el nombre de las carpetas compartidas, ya sea a través de la GUI de Virtual Box o
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
Reinicié todo el sistema de caja virtual aquí, no descubrí el requisito mínimo para que tenga.
De todos modos, para probar esto, regrese a su ventana de vbox
VBOX: ---------
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_images$ ln -s test test2
Sin error, y para verificar
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: ----------
Y de vuelta en el lado de Mac, solo para demostrar que todo funciona
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
Tenga en cuenta que solo he probado esto en un host OSX y un cliente de Ubuntu virtual box. Las referencias que enumeré anteriormente parecían indicar que podría haber un problema al ejecutar un host basado en Windows.
EJERCICIO IZQUIERDO PARA EL ESTUDIANTE ———————
El beneficio del método mencionado anteriormente es que puede ejecutarse en una máquina en espera, sin acceso a la red. Pero si piensa en esto, este problema de name-verses-id tiene que ser un problema común entre cualquier entorno informático heterogéneo.
¿Qué otras soluciones están disponibles donde están disponibles las soluciones a ese problema? - Cosas como Active Directory (un producto de Microsoft) y similares podrían resolver esto. Sería interesante obtener una colección de esas soluciones y comparar varias características y compensaciones.
sudo mount.vboxsf -o umask=002,gid=1000,uid=1000 src /media/sf_src
, donde umask es el valor delumask
usuario, de dónde provienen uid y gidid <user>
,src
es el nombre del recurso compartido VBox y/meida/sf_src
es el punto de montaje deseado.