当前位置: 首页>>技术教程>>正文


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

, ,

问题描述

在 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

最佳方法

我想通了!

重现:

  1. 关闭虚拟机,在 VBox 的设置中添加共享文件夹(Permanent=Yes, Auto-Mount=No)

  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

次佳方法

问题 – 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 开始,这些权限问题就很容易解决了!您无需担心 mkdirmountchmodumask 等。要访问您的 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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/12579.html,未经允许,请勿转载。