在 VirtualBox 中,在 OS X 主机和 Ubuntu 客户机之间共享目录的最佳方法是什么?
- 主机:Mac OS X 10.7.3
- 访客:Ubuntu 12.04
- 客户机通过 VirtualBox 设置挂载了共享目录 访问权限=完全和自动安装=是。
此设置的问题如下所示。在我的共享目录中,我根本无法更改权限(不是权限被拒绝错误,但它们就是不生效)。
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
如果我对 guest 执行 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
答案1
我明白了!
重现:
- 关闭虚拟机,在 VBox 的设置中添加共享文件夹(永久=是,自动安装=否)
- 启动虚拟机
从终端,
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
答案2
问题——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 月的东西。
我认为整个问题在于用户IDMac 上的目录和 Ubuntu 中的目录必须匹配 — OSX 和 Ubuntu 之间分配给用户和组的默认 gid 不同,这就是问题所在。
要访问某个文件,用户必须是该文件的所有者,或者是拥有该文件的组的成员。由于访问实际上是基于组的 ID 号,而不是组名,因此只需在双方创建一个用户所属的公共组号即可。
这正是下面的解决方案所做的。不要被写的内容误导,它实际上非常简单。有很多例子来说明发生了什么。
我将切换OSX和VBOX本文档中的控制台(mac 和 virtual-box/ubuntu) — 确保您了解自己所处的窗口。
最后说明:下面显示的解决方案基于在 OSX 和 Ubuntu 环境之间建立通用组 ID,以便文件权限可以正常工作。可能还有其他更现代的解决方案。这个解决方案非常简单易懂,可以在最基本的未加修饰的安装上运行。
OSX:————
请注意,这是在一台全新的 10.9.5 Mac 上完成的,上面没有任何东西,没有连接到公司网络,除了库存软件外,没有运行任何花哨的东西。这是最简单的了。
当我在 Mac 上进行默认安装时,乔·普利普是管理员用户,他的 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)
请注意用户ID是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时创建的默认管理员。
请再次注意,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 — 这是響箱团体。
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@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
我们不想改变用户的 gid乔·普利普在任何一方,因为这在已安装的系统上都是一件麻烦事,而且无法为其他用户解决这个问题。最简单的解决方案是创建一个匹配的组 ID —響箱— 在 Mac 端,并确保乔·普利普双方都是其成员。
因此,仍然在 vbox/ubuntu 上,进行乔·普利普999 的一员響箱团体
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 上,组。我怀疑名称在这里实际上没有什么区别——它是999组 ID 很重要。请记住,目录系统名称空间(以及用户名)在主机和 VM 操作系统之间是不同的。但为了让生活更理智,我们都称它为響箱在 Mac 上。同样的原因乔·普利普双方均使用用户名。
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@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
将用户重新添加至響箱
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 中的符号链接 -------
如果你进入/媒体/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/
幸运的是,有一个后门可以重新启用它,通过主机的垂直框管理命令。像往常一样,请了解您可能打开的安全漏洞。我在一台独立的开发机器上,所以这似乎不是问题。
OSX: ------------
Joes-MacBook-Pro:shared pbradstr$ VBoxManage setextradata Ubuntu VBoxInternal2/SharedFoldersEnableSymlinksCreate/shared 1
笔记:Ubuntu是我的虚拟机名称,共享是共享目录的名称。
您可以像这样获取虚拟机名称:
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 Virtual Box 客户端上测试过。我上面列出的参考资料似乎表明运行基于 Windows 的主机可能会出现问题。
留给学生的练习————————
上面列出的方法的好处是它可以在独立机器上运行,无需网络访问。但如果你仔细想想,这个 name-verses-id 问题一定是任何异构计算环境之间的常见问题。
在可以解决该问题的情况下,还有哪些其他解决方案可用? — 像 Active Directory(Microsoft 产品)之类的东西可能能够解决这个问题。获得这些解决方案的集合并比较它们的各种功能和权衡将会很有趣。
答案3
对我来说我需要做的就是:
sudo adduser [username] vboxsf
这足以让我访问共享文件夹。该文件夹有一个 vboxsf 组,用户只需被分配到该组即可获得访问权限。如果您需要设置更严格的访问权限或更可控的访问权限,您可能需要使用正确的用户 ID 手动安装它。
对我来说,fstab 解决方案不起作用并导致机器无法正确启动。
答案4
自从 VirtualBox v4.0 以来,解决这些权限问题变得非常容易!您无需担心mkdir
、、、等。要访问自动挂载的共享文件夹(默认情况下带有前缀),您只需做一件事:mount
chmod
umask
/media
sf_
vboxsf
通过将您的用户名添加到群组sudo usermod -a -G vboxsf [username]
。
为了方便起见,您可能还需要在home
文件夹内创建指向这些共享文件夹的符号链接(例如ln -s /media/sf_Stuff ~/Stuff
)。