问题--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执行安装了Guest扩展的Ubuntu-14.04.1。2014年9月的东西。
我认为整个问题在于Mac上的目录的uid和Ubuntu中的目录必须匹配 - 在OSX和Ubuntu之间分配给用户和组的默认gid是不同的,这就是问题所在。
要访问文件,必须拥有它或者是拥有它的组的成员。由于访问实际上是基于组的id号码而不是组名,所以只需要在双方创建一个共同的组号码,用户属于该组即可。
下面的解决方案正是这样做的。不要被所写内容的长度误导,它实际上非常简单。只是有很多很多关于正在发生的事情的例子。
我在这里会在OSX和VBOX控制台之间切换(mac和虚拟机/virtual-box/ubuntu),请确保你知道自己在哪个窗口。最后一点注意:下面的解决方案是基于在OSX和Ubuntu环境之间建立一个共同的组ID,以便文件权限正常工作。可能还有其他更现代的解决方案。这个解决方案非常简单易懂,在纯净的基本安装上运行。
注意这是在一个全新的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安装 - 再次强调,当我安装Ubuntu时,默认管理员是joe_public。
请再次注意,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)
创建了三个挂载点,使用Virtual Box的设置->共享文件夹图形界面。
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的gid,因为这会给已安装的系统带来麻烦,并且不能解决其他用户的问题。最简单的解决方案是在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。请记住,主机和虚拟机操作系统之间的目录系统名称空间(以及用户名)是不同的。但为了让生活变得简单,我们都称之为Mac上的vboxsf。同样的道理,为什么在两边都使用joe_public作为用户名。
OSX没有像Linux那样简单的添加组命令 - 所以使用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从组中移除
从组中移除用户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
默认情况下,虚拟盒子共享不支持符号链接。请参阅下文以了解详细说明。基本上我理解的是,符号链接是一个安全漏洞,在2011年的4.1.8版本中通过禁用对它们的支持来进行了“修复”。我正在使用的是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图形界面,还是通过共享文件夹名称,
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的主机上可能会出现问题。
留给学生的练习———————
上述方法的好处是它可以在独立的机器上运行,没有网络访问。但是,如果您考虑一下,这个名称与ID的问题必须是任何异构计算环境之间的常见问题。
还有哪些解决方案可用,其中解决该问题的解决方案可用?像Active Directory(微软产品)之类的东西可能能够解决这个问题。有趣的是,获取这些解决方案的集合并比较它们的各种功能和权衡。
sudo mount.vboxsf -o umask=002,gid=1000,uid=1000 src /media/sf_src
,其中umask是用户的umask
值,uid和gid来自于id <user>
,src
是VBox共享的名称,而/meida/sf_src
是所需的挂载点。 - jmdeldin