问题描述
在 VirtualBox 中,在 OS X 主机和 Ubuntu 来宾之间共享目录的最佳方式是什么?
-
主机:Mac OS X 10.7.3
-
来宾:Ubuntu 12.04
-
来宾有一个通过 VirtualBox 设置挂载的共享目录,Access=Full 和 Auto-Mount=Yes。
此设置的问题如下所示。在我的共享目录中,我根本无法更改权限(不是权限被拒绝错误,但它们只是没有生效)。
Ubuntu 12.04(来宾):
% ls -l
total 0
-rwxrwx--- 1 root vboxsf 0 Apr 17 21:56 1
-rwxrwx--- 1 root vboxsf 0 Apr 17 21:56 10
-rwxrwx--- 1 root vboxsf 0 Apr 17 21:56 2
-rwxrwx--- 1 root vboxsf 0 Apr 17 21:56 3
-rwxrwx--- 1 root vboxsf 0 Apr 17 21:56 4
-rwxrwx--- 1 root vboxsf 0 Apr 17 21:56 5
-rwxrwx--- 1 root vboxsf 0 Apr 17 21:56 6
-rwxrwx--- 1 root vboxsf 0 Apr 17 21:56 7
-rwxrwx--- 1 root vboxsf 0 Apr 17 21:56 8
-rwxrwx--- 1 root vboxsf 0 Apr 17 21:56 9
Mac OS X 10.7.3(主机):
$ ls -l
total 0
-rw-r--r-- 1 <my-mac-user> staff 0 Apr 17 21:56 1
-rw-r--r-- 1 <my-mac-user> staff 0 Apr 17 21:56 10
-rw-r--r-- 1 <my-mac-user> staff 0 Apr 17 21:56 2
-rw-r--r-- 1 <my-mac-user> staff 0 Apr 17 21:56 3
-rw-r--r-- 1 <my-mac-user> staff 0 Apr 17 21:56 4
-rw-r--r-- 1 <my-mac-user> staff 0 Apr 17 21:56 5
-rw-r--r-- 1 <my-mac-user> staff 0 Apr 17 21:56 6
-rw-r--r-- 1 <my-mac-user> staff 0 Apr 17 21:56 7
-rw-r--r-- 1 <my-mac-user> staff 0 Apr 17 21:56 8
-rw-r--r-- 1 <my-mac-user> staff 0 Apr 17 21:56 9
如果我对客人进行 chmod,则没有任何变化:
% chmod +x 1 | ls -l 1 # guest
-rwxrwx--- 1 root vboxsf 0 Apr 17 21:56 1
如果我在主机上 chmod,它会在主机上更改,但不会在来宾上更改:
$ chmod +x 1 | ls -l 1 # host
-rwxrwx--x 1 <my-mac-user> staff 0 Apr 17 21:56 1
% ls -l 1 # guest
-rwxrwx--- 1 root vboxsf 0 Apr 17 21:56 1
最佳方法
我想通了!
重现:
-
关闭虚拟机,在 VBox 的设置中添加共享文件夹(Permanent=Yes, Auto-Mount=No)
-
启动虚拟机
-
从终端,以普通用户身份运行
umask && id
以获得如下信息:002 # this is your umask uid=1000(luser) gid=1000(luser) groups=1000(luser),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(lpadmin),124(sambashare),125(vboxsf)
-
sudo mkdir -p /media/sf_src # src is the shared directory
挂载 src
目录作为测试:
sudo mount.vboxsf -o umask=002,gid=1000,uid=1000 src /media/sf_src
| | | | |-> where to mount
| | | | the file
| | | |-> name of the shared dir
| | | (in VBox settings)
| | |
\ | /
from the `id` command
要在登录时自动挂载它,请编辑 /etc/fstab
并添加以下内容:
src /media/sf_src vboxsf umask=002,gid=1000,uid=1000
次佳方法
问题 – 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 上的目录的 uid 和 Ubuntu 必须匹配 – 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)
使用 Virtual Box 的设置创建了三个挂载点 ->共享文件夹 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 的 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。请记住,主机和 VM 操作系统之间的目录系统名称空间(以及用户名)是不同的。但只是为了让生活更理智,我们在 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: ——————
cd 进入我们的目录并触摸一个文件
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
默认情况下,虚拟盒子共享不支持符号链接。请参阅下面的说明。基本上据我所知,符号链接是一个安全漏洞,它是 Virtual Box 中的 “fixed”,通过在 4.1.8 时间框架(2011 年)禁用对它们的支持。我在这里运行 4.3.16 ……
https://www.virtualbox.org/ticket/10085
http://ahtik.com/blog/fixing-your-virtualbox-shared-folder-symlink-error/
幸运的是,通过主机的 VBoxManage 命令,它有一个 re-enable 的后门。与往常一样,请了解您可能会打开的安全漏洞。我在 stand-alone 开发机器上,所以这似乎不是问题。
操作系统:————
Joes-MacBook-Pro:shared pbradstr$ VBoxManage setextradata Ubuntu VBoxInternal2/SharedFoldersEnableSymlinksCreate/shared 1
注意:ubuntu是我的vm的名字,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 的主机可能存在问题。
留给学生的练习 ——————
上面列出的方法的好处是它可以在 stand-along 机器上运行,无需网络访问。但如果你仔细想想,这个 name-verses-id 问题一定是任何异构计算环境之间的常见问题。
在可以解决该问题的情况下,还有哪些其他可用的解决方案? — Active Directory(Microsoft 产品)之类的东西可能能够解决这个问题。获得这些解决方案的集合并在其中比较各种功能和权衡会很有趣。
第三种方法
对我来说,我需要做的就是:
sudo adduser [username] vboxsf
这足以让我访问共享文件夹。该文件夹有一组 vboxsf,用户只需分配到该组即可访问。如果您需要设置更严格的访问权限或更可控的访问权限,您可能需要通过正确的 userid-s 手动安装它的步骤。
对我来说,fstab 解决方案不起作用,导致机器无法正确启动。
第四种方法
在 Virtualbox 设置中创建共享文件夹后,Ubuntu 会在您下次启动系统时自动挂载它(您会在桌面上看到一个图标)。
但是,如果您不使用 root 帐户,您将无权访问它。您需要做的是将您的用户帐户添加到名为 ‘vboxsf’ 的用户组中:
sudo usermod -G vboxsf -a $USER
然后注销并再次登录。您现在可以访问共享文件夹。
第五种方法
从 VirtualBox v4.0 开始,这些权限问题就很容易解决了!您无需担心 mkdir
、 mount
、 chmod
、 umask
等。要访问您的 auto-mounted 共享文件夹(默认显示在 /media
中,带有 sf_
前缀),您只需要做一件事:将您的用户名添加到vboxsf
组通过 sudo usermod -a -G vboxsf [username]
。
为方便起见,您可能还希望在 home
文件夹(例如 ln -s /media/sf_Stuff ~/Stuff
)中创建指向这些共享文件夹的符号链接。
来源:http://www.virtualbox.org/manual/ch04.html#sf_mount_auto