与在 Virtual Box VM 中以正确的权限运行的 Ubuntu 共享目录的正确方法是什么?

与在 Virtual Box VM 中以正确的权限运行的 Ubuntu 共享目录的正确方法是什么?

在 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

我明白了!

重现:

  1. 关闭虚拟机,在 VBox 的设置中添加共享文件夹(永久=是,自动安装=否)
  2. 启动虚拟机
  3. 从终端,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)
    
  4. 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 号,而不是组名,因此只需在双方创建一个用户所属的公共组号即可。

这正是下面的解决方案所做的。不要被写的内容误导,它实际上非常简单。有很多例子来说明发生了什么。

我将切换OSXVBOX本文档中的控制台(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)

请注意用户ID501— 这是 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、、、等。要访问自动挂载的共享文件夹(默认情况下带有前缀),您只需做一件事:mountchmodumask/mediasf_vboxsf通过将您的用户名添加到群组sudo usermod -a -G vboxsf [username]

为了方便起见,您可能还需要在home文件夹内创建指向这些共享文件夹的符号链接(例如ln -s /media/sf_Stuff ~/Stuff)。

来源:http://www.virtualbox.org/manual/ch04.html#sf_mount_auto

相关内容