问题-vbox / ubuntu中的权限问题访问OSX共享驱动器
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
目标是在Mac和Ubuntu环境之间共享目录的简单方法。不幸的是,到目前为止,我所看到的示例似乎比实际需要的要复杂一些,并且并没有真正解释需要解决的实际问题。我将尝试在这里处理这两个问题。
这里的环境是一台运行OSX 10.9.5的Mac,其中的Virtual Box 4.3.16执行Ubuntu-14.04.1并安装了Guest扩展。2014年9月的资料。
我认为这里的整个问题是Mac上和Ubuntu中目录的uid必须匹配— OSX和Ubuntu之间为用户和组分配的默认gid不同,这就是问题所在。
要访问文件,必须要么拥有它,要么成为拥有它的组的成员。由于访问实际上是基于组的ID号而不是组名,因此所需要做的就是在用户两侧创建一个通用的组号。
这正是下面的解决方案所要做的。不要被所写内容的长度误导,这实际上很简单。发生了很多事。
我将在此文档中的OSX和VBOX控制台(mac和virtual-box / ubuntu)之间切换-确保您了解其中的窗口。
最后说明:下面显示的解决方案基于在OSX和Ubuntu环境之间建立公共组ID,以便文件权限起作用。可能还有其他更现代的解决方案。这是一个非常简单且易于理解的工具,可以在基本的未经修饰的基础上运行。
OSX:—————
请注意,此操作是在全新的10.9.5 Mac上完成的,没有任何内容,没有连接到公司网络,除了库存软件外,没有其他花哨的东西在运行。这很简单。
当我在Mac上进行默认安装时,joe_public是管理员用户,而其uid被设置为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)
请注意,uid为501(这是OSX上默认的第一个帐户ID),没什么特别的
我创建了一些要在Mac端共享的目录-请注意,出于备份原因,我没有将它们放在用户目录下。
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:——————
简单的默认虚拟盒和ubuntu安装-同样,joe_public是我安装ubuntu时创建的默认管理员。
请再次注意,OSX和Ubuntu之间的名称空间完全不同。这两个名称之间绝对没有关系。
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)
使用“ 虚拟盒子”的“设置”->“共享文件夹” gui 创建了三个安装点。
Name Path Auto-mount Access
images /vdisk/images Yes Full
public /vdisk/pubic Yes Read-only
shared /vdisk/shared Yes Full
注意:实际上,我必须重新启动会话才能使所有这些挂载点出现。
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)
请注意,它们的gid为999,这是vboxsf组。
joe_public@joe_public-ubuntu-VirtualBox:~$ grep 999 /etc/group
vboxsf:x:999
这是由Virtual Box版本4.3.16自动为我们分配的。vbox文档显示了通过命令行手动安装路径时如何更改此设置的方法,但是谁会记住这一点—只需采用GUI强制我们使用的默认设置即可。
但这是行不通的(目前为止,这就是我们要解决的问题)
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
请注意,此时joe_public还不是该vboxsf组的成员-除非我们解决它,否则这将是一个问题。仅供参考:这些是创建帐户时分配给帐户的默认组。
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
因此,我们目前所拥有的(我们还没有做任何事情来修复它)
• 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
我们不想在任何一侧更改用户joe_public的权限,因为这在已经安装的系统上很麻烦,并且不能为其他用户解决。最简单的解决方案是在mac端制作一个匹配的组ID(vboxsf),并确保joe_public在两侧都是它的成员。
因此,仍然在vbox / ubuntu上,使joe_public成为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
我想我注销了帐户,做完之后再次回到这里。
OSX:—————
现在,我们需要在Mac上创建一个vboxsf组。我怀疑名称实际上在这里是否有所不同-重要的是999组ID。请记住,主机和VM操作系统之间的目录系统名称空间(以及用户名)是不同的。但是,为了使生活理智,我们在Mac上都将其称为vboxsf。为何在两边都使用joe_public用户名的原因相同。
OSX没有像linux一样简单的add group命令-因此,请使用dscl命令分多个步骤进行操作。请参阅mac os文档以获取更多详细信息。注意,我们创建了vboxsf组,并在此处将joe_public添加到该组。
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
因此,在这一点上,我们应该
• 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
这里的证明是是否有效–下一步是
VBOX:——————
进入我们的目录并触摸文件
joe_public@joe_public-ubuntu-VirtualBox:/$ cd /media/sf_shared
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_shared$ touch foo
检查我们是否成功创建了文件。
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
这一切似乎都在起作用。
VBOX:——————最终验证
我们在这里检查的是,这整个过程取决于用户joe_public是vboxsf组的成员,而最简单的方法就是从组中删除joe_public
从组vboxsf中删除用户joe_public
joe_public@joe_public-ubuntu-VirtualBox:~$ sudo gpasswd -d joe_public vboxsf
log out/in ubuntu
查看我们是否可以访问目录-不能访问目录,这证明这是组权限问题
joe_public@joe_public-ubuntu-VirtualBox:/$ ls /media/sf_shared
ls: cannot open directory /media/sf_shared: Permission denied
将用户重新添加到vboxsf
joe_public@joe_public-ubuntu-VirtualBox:/$ sudo usermod -a -G vboxsf joe_public
log out/in ubuntu
它再次工作!
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:-一个更多的问题-vbox中的符号链接-------
如果进入/ media / sf_shared,您会发现共享目录中的符号链接根本不起作用。如果您试图在共享驱动器上设置完整的linux开发环境,这将是一个很大的问题。
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
默认情况下,虚拟盒共享不支持符号链接。请参阅下面的说明。基本上,据我了解,符号链接是一个安全漏洞,已通过在4.1.8时限(2011)中禁用对其的支持而在Virtual Box中“修复”。我在这里运行4.3.16 ...
https://www.virtualbox.org/ticket/10085
http://ahtik.com/blog/fixing-your-virtualbox-shared-folder-symlink-error/
幸运的是,有一个后门可以通过主机的VBoxManage命令重新启用它。与往常一样,请在此处了解您可能会打开的安全漏洞。我在独立开发计算机上,所以这似乎不是问题。
OSX:------------
Joes-MacBook-Pro:shared pbradstr$ VBoxManage setextradata Ubuntu VBoxInternal2/SharedFoldersEnableSymlinksCreate/shared 1
注意:Ubuntu是我的虚拟机名称,shared是共享目录名称。
您可以这样获得虚拟机名称:
Joes-MacBook-Pro:shared pbradstr$ VBoxManage list vms
"Ubuntu" {8461045a-1cee-4d44-8148-05920a47cee0}
Joes-MacBook-Pro:shared pbradstr$
以及共享文件夹的名称,可以通过Virtual Box gui或
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
我在这里重新启动了整个虚拟盒子系统,但我没有弄清楚它的最低要求。
无论如何,要进行测试,请返回到vbox窗口
VBOX:---------
joe_public@joe_public-ubuntu-VirtualBox:/media/sf_images$ ln -s test test2
没有错误-并进行验证
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:----------
回到Mac方面-只是为了证明一切正常
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
请注意,我仅在OSX主机和Ubuntu虚拟机客户端上对此进行了测试。我上面列出的参考似乎表明运行基于Windows的主机可能存在问题。
锻炼学生———————
上面列出的方法的好处是它可以在独立的计算机上运行,而无需网络访问。但是,如果考虑到这一点,这个名称-verses-id问题一定是任何异构计算环境之间的常见问题。
如果有解决该问题的方法,还有哪些其他解决方案?—诸如Active Directory(Microsoft产品)之类的东西可能能够解决此问题。获得这些解决方案的集合并在那里比较各种功能和折衷方案将很有趣。
sudo mount.vboxsf -o umask=002,gid=1000,uid=1000 src /media/sf_src
,其中umask是umask
用户的值,uid和gid来自fromid <user>
,src
是VBox共享的名称,并且/meida/sf_src
是所需的安装点。