O problema - problemas de permissão no vbox / ubuntu ao acessar 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 eu vi até agora parecem ser um pouco mais complexos do que realmente precisam ser, e realmente não explicam qual é o problema real que precisa ser resolvido. Vou tentar lidar com esses dois problemas aqui.
O ambiente aqui é um Mac rodando o OSX 10.9.5, com o Virtual Box 4.3.16 executando o Ubuntu-14.04.1 com 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 coincidir - O gid padrão atribuído para usuários e grupos são diferentes entre OSX e Ubuntu, e é aí que o problema está.
Para acessar um arquivo, ele deve ser o proprietário 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 em ambos os lados, ao qual os usuários pertençam.
Isso é exatamente o que a solução abaixo faz. Não se deixe enganar pela duração do que está escrito, na verdade é muito simples. Há muitos e 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 qual janela sua em.
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: —————
Note que isso foi feito em um novo out-of-the-box 10.9.5 Mac, sem nada, não conectado a uma rede corporativa, nada sofisticado rodando nele além do software padrão. Isso é tão simples quanto parece.
Quando fiz a instalação padrão no Mac, joe_public é o usuário admin, 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 - este é o ID da primeira conta padrão no OSX - nada especial
Eu criei alguns diretórios que desejo compartilhar no lado do Mac - Observe que eu não os coloquei sob o 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 admin padrão criado quando eu instalei o ubuntu.
Por favor, note mais uma vez, 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)
Criaram três pontos de montagem, usando a configuração do Virtual Box - & gt; Pastas compartilhadas gui.
Name Path Auto-mount Access
images /vdisk/images Yes Full
public /vdisk/pubic Yes Read-only
shared /vdisk/shared Yes Full
NOTA: Eu tive que reiniciar a minha sessão para todos esses pontos de montagem aparecerem.
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 estes é 999 - este é o grupo vboxsf .
joe_public@joe_public-ubuntu-VirtualBox:~$ grep 999 /etc/group
vboxsf:x:999
Isso foi atribuído automaticamente pela VirtualBox versão 4.3.16 para nós. A documentação do vbox mostra maneiras de mudar isso se você montar o caminho manualmente através da linha de comando, mas quem vai se lembrar disso - simplesmente pegue os padrões que a GUI nos força ..
Mas isso não funciona (esperado neste momento - é o 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é corrigirmos o problema. 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 em nenhum dos lados, já que isso é um saco nos 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 membro dele nos dois lados.
Portanto, ainda no vbox / ubuntu, torne 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 fiz logout da minha conta e voltei aqui novamente depois que fiz isso.
OSX: —————
Agora, precisamos criar um grupo vboxsf no mac. Duvido que o nome realmente faça diferença aqui - é o 999 ID de grupo que é importante. Lembre-se de que os espaços de nomes do sistema de diretórios (assim como os nomes de usuários) são diferentes entre o host e os sistemas operacionais da VM. Mas apenas para tornar a vida saudável, todos nós chamamos de vboxsf no mac.Mesmo raciocínio porque joe_public é usado um nome de usuário em ambos os lados.
O OSX não possui um comando simples de adicionar grupo, como o Linux, portanto, use o comando dscl para fazer isso em várias etapas. Por favor, consulte a documentação do Mac OS para 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 ponto, devemos 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 isso 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 podemos 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
Adicione o usuário de volta 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ê entrar em / media / sf_shared , verá que os links simbólicos em diretórios compartilhados simplesmente não funcionam. Este é 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 caixa virtual. Veja abaixo as explicações. Basicamente, como eu entendo, links simbólicos são uma falha de segurança que foram "corrigidos" no Virtual Box, desabilitando o suporte para eles no período de tempo 4.1.8 (2011). Estou executando o 4.3.16 aqui ...
Ссылка
Ссылка
Felizmente, há uma porta dos fundos para reativá-la, através do comando VBoxManage do Host. Como sempre, por favor, entenda as falhas de segurança aqui que você pode estar abrindo. Eu estou em uma máquina de desenvolvimento independente, então isso não parece ser um problema.
OSX: ------------
Joes-MacBook-Pro:shared pbradstr$ VBoxManage setextradata Ubuntu VBoxInternal2/SharedFoldersEnableSymlinksCreate/shared 1
Nota: Ubuntu é o nome do meu vm e compartilhado é o nome do diretório compartilhado.
Você pode obter o nome da 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, seja pelo 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
Eu reiniciei todo o sistema de caixas virtuais aqui, não descobri o requisito mínimo para isso.
De qualquer forma, 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
Por favor note, 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 EXERCIDO PARA O ALUNO ------------------
O benefício do método listado acima é que ele pode ser executado em uma máquina de stand-along, sem acesso à rede. Mas se você pensar sobre isso, esse problema nome-versos-id tem que ser um problema comum entre qualquer ambiente de computação heterogêneo.
Quais outras soluções estão disponíveis onde as soluções para esse problema estão disponíveis? - Coisas como o Active Directory (um produto Microsoft) e similares podem resolver isso. Seria interessante obter uma coleção dessas soluções e comparar vários recursos e tradeoffs.