O problema - problemas de permissão no vbox / ubuntu acessando uma unidade compartilhada OSX
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
O objetivo é uma maneira simples de compartilhar diretórios entre os ambientes Mac e Ubuntu. Infelizmente, os exemplos que vi até agora parecem ser um pouco mais complexos do que realmente precisam e não explicam realmente qual é o verdadeiro problema que precisa ser resolvido. Vou tentar lidar com esses dois problemas aqui.
O ambiente aqui é um Mac executando o OSX 10.9.5, com o Virtual Box 4.3.16 executando o Ubuntu-14.04.1 com as extensões Guest instaladas. Coisas de setembro de 2014.
Eu acho que todo o problema aqui é que o uid dos diretórios no Mac e no Ubuntu deve corresponder - Os gid padrão atribuídos a usuários e grupos são diferentes entre OSX e Ubuntu, e é aí que está o problema.
Para acessar um arquivo, é necessário possuí-lo ou ser um membro do grupo que o possui. E como o acesso é realmente baseado no número de identificação do grupo, não no nome do grupo, tudo o que é necessário é criar um número de grupo comum nos dois lados, ao qual os usuários pertencem.
É exatamente isso que a solução abaixo faz. Não se deixe enganar pelo tamanho do que está escrito, é realmente muito simples. Existem muitos exemplos do que está acontecendo.
Vou alternar entre os consoles OSX e VBOX aqui (mac e virtual-box / ubuntu) neste documento - certifique-se de entender em qual janela está.
Nota final: A solução mostrada abaixo é baseada no estabelecimento de um ID de grupo comum entre os ambientes OSX e Ubuntu, para que as permissões de arquivo funcionem. Pode haver outras soluções mais modernas. Este é realmente simples e compreensível, e roda em instalações básicas sem adornos.
OSX: —————
Observe que isso foi feito em um Mac pronto para uso 10.9.5, sem nada nele, não conectado a uma rede corporativa, nada sofisticado em execução, exceto software de estoque. Isto é o mais simples possível.
Quando eu fiz a instalação padrão no Mac, joe_public é o usuário administrador e seu uid foi definido como 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)
Observe que o uid é 501 - esse é o primeiro ID de conta padrão no OSX - nada de especial
Criei alguns diretórios que quero compartilhar no lado do Mac - observe que não os coloquei no diretório de usuários por motivos de 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: ——————
Caixa virtual padrão simples e instalação do ubuntu - novamente, joe_public é o administrador padrão criado quando eu instalei o ubuntu.
Observe novamente que o espaço de nome entre o OSX e o Ubuntu é completamente diferente. Não há absolutamente nenhuma relação entre os dois nomes aqui.
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)
Criou três pontos de montagem, usando o gui Configuração da Caixa Virtual -> Pastas Compartilhadas.
Name Path Auto-mount Access
images /vdisk/images Yes Full
public /vdisk/pubic Yes Read-only
shared /vdisk/shared Yes Full
NOTA: Na verdade, tive que reiniciar minha sessão para que todos esses pontos de montagem aparecessem.
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)
Observe que o gid para esses é 999 - este é o grupo vboxsf .
joe_public@joe_public-ubuntu-VirtualBox:~$ grep 999 /etc/group
vboxsf:x:999
Isso foi atribuído automaticamente pela Virtual Box versão 4.3.16 para nós. A documentação do vbox mostra maneiras de como alterar isso se você montar o caminho manualmente através da linha de comando, mas quem se lembrará disso - basta aceitar os padrões que a GUI impõe sobre nós.
Mas não funciona (esperado neste momento - é isso que estamos tentando resolver)
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
Observe que, neste momento, joe_public não é membro desse grupo vboxsf - e isso será um problema até que possamos corrigi-lo. FYI: Estes são os grupos padrão atribuídos à conta quando ela é criada.
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
Então, o que temos neste momento (ainda não fizemos nada para corrigi-lo)
• 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
Não queremos alterar o gid do usuário joe_public de nenhum dos lados, pois isso é chato em sistemas já instalados e não resolve isso para outros usuários. A solução mais simples é criar um ID de grupo correspondente - vboxsf - no lado do mac e garantir que joe_public seja um membro dos dois lados.
Portanto, ainda no vbox / ubuntu, faça do joe_public um membro do grupo 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
Acho que saí da minha conta e voltei novamente aqui depois de fazer isso.
OSX: —————
Agora precisamos criar um grupo vboxsf no mac. Duvido que o nome realmente faça a diferença aqui - é o ID do grupo 999 que é importante. Lembre-se de que os espaços para nome do sistema de diretórios (assim como os nomes de usuário) são diferentes entre os sistemas operacionais host e VM. Mas apenas para tornar a vida saudável, todos chamamos de vboxsf no mac. O mesmo raciocínio pelo qual joe_public é usado como um nome de usuário nos dois lados.
O OSX não possui um comando add group simples como o linux - portanto, use o comando dscl para fazer isso em várias etapas. Consulte a documentação do Mac OS para obter mais detalhes sobre isso. Observe que criamos o grupo vboxsf e adicionamos joe_public a esse grupo aqui.
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
Então, neste momento, deveríamos ter
• 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
A prova aqui é se funciona - então esse é o próximo passo
VBOX: ——————
cd em nosso diretório e toque em um arquivo
joe_public@joe_public-ubuntu-VirtualBox:/$ cd /media/sf_shared
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_shared$ touch foo
Verifique se criamos um arquivo com sucesso.
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
Tudo parece estar funcionando ..
VBOX: —————— VERIFICAÇÃO FINAL
O que estamos verificando aqui é que tudo depende do usuário joe_public ser membro do grupo vboxsf - e a maneira mais simples é simplesmente remover joe_public do grupo
Removendo o usuário joe_public do grupo vboxsf
joe_public@joe_public-ubuntu-VirtualBox:~$ sudo gpasswd -d joe_public vboxsf
log out/in ubuntu
Ver se conseguimos acessar nosso diretório - e não podemos - e isso prova que é um problema de permissão de grupo
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
Adicionar usuário novamente ao vboxsf
joe_public@joe_public-ubuntu-VirtualBox:/$ sudo usermod -a -G vboxsf joe_public
log out/in ubuntu
Funciona de novo!
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: - MAIS UM PROBLEMA - links simbólicos no vbox -------
Se você acessar / media / sf_shared , verá que os links simbólicos nos diretórios compartilhados simplesmente não funcionam. Esse é realmente um grande problema se você estiver tentando configurar um ambiente de desenvolvimento Linux completo em uma unidade compartilhada.
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
Por padrão, links simbólicos não são suportados em compartilhamentos de caixas virtuais. Veja abaixo explicações. Basicamente, no meu entender, os links simbólicos são uma brecha de segurança que foi "corrigida" no Virtual Box, desativando o suporte a eles no período 4.1.8 (2011). Estou executando o 4.3.16 aqui ...
https://www.virtualbox.org/ticket/10085
http://ahtik.com/blog/fixing-your-virtualbox-shared-folder-symlink-error/
Felizmente, há uma porta traseira para reativá-lo, através do comando VBoxManage do host . Como sempre, entenda as falhas de segurança aqui que você pode estar abrindo. Estou em uma máquina de desenvolvimento autônoma, portanto isso não parece ser um problema.
OSX: ------------
Joes-MacBook-Pro:shared pbradstr$ VBoxManage setextradata Ubuntu VBoxInternal2/SharedFoldersEnableSymlinksCreate/shared 1
Nota: Ubuntu é o nome da minha vm e shared é o nome do diretório compartilhado.
Você pode obter o nome vm assim:
Joes-MacBook-Pro:shared pbradstr$ VBoxManage list vms
"Ubuntu" {8461045a-1cee-4d44-8148-05920a47cee0}
Joes-MacBook-Pro:shared pbradstr$
E o nome das pastas compartilhadas, através da GUI da Caixa Virtual ou
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
Reiniciei todo o sistema de caixas virtuais aqui, não descobri o requisito mínimo para isso.
Enfim, para testar isso, volte para a janela do vbox
VBOX: ---------
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_images$ ln -s test test2
Nenhum erro - e 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: ----------
E de volta ao lado do mac - apenas para provar que tudo 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
Observe que eu só testei isso em um host OSX e no cliente de caixa virtual do Ubuntu. As referências listadas acima parecem indicar que pode haver um problema ao executar um host baseado no Windows.
EXERCÍCIO ESQUERDO PARA O ESTUDANTE ———————
O benefício do método listado acima é que ele pode ser executado em uma máquina autônoma, sem acesso à rede. Mas se você pensar sobre isso, esse problema de nome-versos-id deve ser um problema comum entre quaisquer ambientes de computação heterogêneos.
Que outras soluções estão disponíveis onde estão disponíveis soluções para esse problema? - Coisas como o Active Directory (um produto da Microsoft) e similares podem resolver isso. Seria interessante obter uma coleção dessas soluções e comparar lá vários recursos e vantagens e desvantagens.
sudo mount.vboxsf -o umask=002,gid=1000,uid=1000 src /media/sf_src
, onde o umask é o valor doumask
usuário, uid e gidid <user>
,src
o nome do compartilhamento VBox e/meida/sf_src
o ponto de montagem desejado.