我遇到了一个奇怪的权限问题;
共享文件夹在 Windows 中显示一组权限,而在 Linux 中通过 VirtualBox 访问时则显示完全不同的权限。
共享文件夹是我的 XAMPP htdocs/ 目录,因为我希望能够在两个不同的环境中处理相同的存储库/站点 - 所以我无法移动该文件夹。
我当前的设置
- Windows 7(主机),Ubuntu 在 VirtualBox 中运行(客户机)
- 我已将该文件夹设置为共享位置,并且可以通过 Ubuntu 下的终端访问它
/media/sf_<myfolder>
。 - 共享文件夹设置为自动挂载,并在 VirtualBox 的设置中永久保留。
- 我的用户属于该
vboxsf
用户组,并且我已经通过检查确认了这一点/etc/group
。 - 我已经安装了
vitrualbox-guest-additions-iso
。共享剪贴板运行良好。 - 我
cygwin
在 Windows 终端上使用
权限如何出现
Windows(从 cygwin 终端),使用$ ls -alF
me@my-server /cygdrive/c/xampp/htdocs/my-website$ ls -alF
total 61313
drwxrwxr-x+ 1 me Domain Users 0 Sep 6 12:12 ./
drwxrwx---+ 1 me Domain Users 0 Sep 8 16:22 ../
drwxrwxr-x+ 1 me Domain Users 0 Sep 8 15:57 .git/
drwxrwxr-x+ 1 me Domain Users 0 Sep 6 12:06 bal/
-rw-rw-r--+ 1 me Domain Users 1065 Sep 6 12:06 .csslintrc
-rw-rw-r--+ 1 me Domain Users 367 Sep 6 12:06 .editorconfig
Ubuntu 终端(VirtualBox),使用$ ls -alF
me@my-server:/media/sf_htdocs/my-website$ ls -alF
total 61256
drwxrwx--- 1 root vboxsf 12288 Sep 6 12:12 ./
drwxrwx--- 1 root vboxsf 4096 Sep 8 16:22 ../
drwxrwx--- 1 root vboxsf 4096 Sep 8 15:57 .git/
drwxrwx--- 1 root vboxsf 0 Sep 6 12:06 bal/
-rwxrwx--- 1 root vboxsf 1065 Sep 6 12:06 .csslintrc*
-rwxrwx--- 1 root vboxsf 367 Sep 6 12:06 .editorconfig*
Windows,使用$ stat
me@my-server /cygdrive/c/xampp/htdocs/my-website$ stat .csslintrc
File: .csslintrc
Size: 1065 Blocks: 4 IO Block: 65536 regular file
Device: bcd2ece6h/3167939814d Inode: 4222124651673917 Links: 1
Access: (0664/-rw-rw-r--) Uid: (1051198/me) Gid: (1049089/Domain Users)
Access: 2017-09-06 12:06:15.578083600 +1000
Modify: 2017-09-06 12:06:15.578583700 +1000
Change: 2017-09-06 12:06:15.578583700 +1000
Birth: 2017-09-06 12:06:15.578083600 +1000
Ubuntu,使用$ stat
me@my-server:/media/sf_htdocs/my-website$ stat .csslintrc
File: '.csslintrc'
Size: 1065 Blocks: 3 IO Block: 4096 regular file
Device: 29h/41d Inode: 14 Links: 1
Access: (0770/-rwxrwx---) Uid: ( 0/ root) Gid: ( 999/ vboxsf)
Access: 2017-09-06 12:06:15.578083600 +1000
Modify: 2017-09-06 12:06:15.578583700 +1000
Change: 2017-09-06 12:06:15.578583700 +1000
Birth: -
我还从两个系统创建了一个文件,以检查默认权限。我对测试目录执行了同样的操作,两个文件 + 文件夹都显示完全相同的权限。
视窗
-rwxrwxr-x+ 1 Administrators Domain Users 0 Sep 11 08:52 .test-from-linux-vm*
-rw-rw-r--+ 1 me Domain Users 0 Sep 11 08:52 .test-from-windows
Ubuntu虚拟机
-rwxrwx--- 1 root vboxsf 0 Sep 11 08:52 .test-from-linux-vm*
-rwxrwx--- 1 root vboxsf 0 Sep 11 08:52 .test-from-windows*
我注意到
- 我无法在 Ubuntu 中更改文件/文件夹权限,即使使用
sudo chmod <permissions> <file>
- 虽然我可以在 Windows 中更改权限,但这些更改不会反映在 Ubuntu 中:
视窗;将 web.config 从 更新664
为755
-rwxr-xr-x+ 1 me Domain Users 4555 Sep 6 12:06 web.config*
Ubuntu
-rwxrwx--- 1 root vboxsf 4555 Sep 6 12:06 web.config*
我已经尝试过了...
- 重新启动虚拟机(多次 ;D)
- 通过在一个系统中创建测试文件并检查它们是否出现在另一个系统中,确认 Windows 和 Linux 中的共享目录是同一个。
- 建议这个问题的建议
我的问题:
- 为什么不同系统的权限集不同?
- 它们是在操作系统级别而不是文件级别分配的吗?
任何帮助都是极好的!
答案1
简短回答:您正在使用不兼容的环境和软件;Windows、Cygwin 和 VirtualBox 都实现了不向后兼容的实现POSIX 标准,因此其中一个的变化不会反映在其他的变化中。
一般来说:将文件的组和用户存储为字符串会非常浪费。这不仅会占用大量额外的磁盘空间,而且还需要在)在最坏的情况下处理时间来检查您是否具有对单个文件的权限!
相反,这些属性被存储为数字,这总是需要欧拉(1)检查权限。您可以使用以下stat
命令查看权限:
$ stat r600_state_common.c
File: r600_state_common.c
Size: 90718 Blocks: 184 IO Block: 4096 regular file
Device: 26h/38d Inode: 70588 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/constantine) Gid: ( 1000/constantine)
Access: 2017-09-08 00:18:26.243828226 +0300
Modify: 2017-09-07 10:52:33.387136858 +0300
Change: 2017-09-07 10:52:33.387136858 +0300
Birth: -
因此,在您的系统中,文件的 UID 与用户 匹配root
。在另一个系统中,则为Domain
。
如果与 Windows 系统交叉工作还有更多。尽管 POSIX 标准没有发生任何真正根本性的变化,但微软程序员一直在努力应对它。从 Windows NT 到 Windows 10 的过程中已经进行了三次不向后兼容的重写。因此,为了兼容性,Cygwin 使用其自己的实现将 Windows 安全描述符映射到 POSIX 权限。
最重要的是,你正在尝试通过 VirtualBox 访问 Windows 文件系统。VirtualBox 当然也实现了自己的映射,而且这种映射效果不太好(正如你通过 chmod 更改权限所看到的,但没有看到反映出来的更改)。
因此,目前您的系统上有 3 个实现,彼此不兼容。这就是您看到问题的原因。
自由贸易协定:VirtualBox 是开源的,所以如果你真的对它感兴趣,你可以重写它以与 Cygwin 兼容(因为据我所知,他们的实现是 Windows 上唯一向后兼容的 POSIX 实现)。
注意:以 root 身份使用系统是一种非常糟糕的做法!尤其是考虑到您是开发人员。请考虑使用普通用户。