![我可以跨计算机移植 ext4 外部硬盘的用户权限吗?](https://linux22.com/image/53499/%E6%88%91%E5%8F%AF%E4%BB%A5%E8%B7%A8%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%BB%E6%A4%8D%20ext4%20%E5%A4%96%E9%83%A8%E7%A1%AC%E7%9B%98%E7%9A%84%E7%94%A8%E6%88%B7%E6%9D%83%E9%99%90%E5%90%97%EF%BC%9F.png)
我有一个外部 USB 3 磁盘驱动器(2TB 容量),很可能会在机器之间移动。该磁盘有一个 GUID 分区表和一个 ext4 分区。除非提升进程 ( sudo
),否则我无法写入磁盘。
截至目前,我正在考虑尝试以下一种或两种方法,并想知道每种方法的缺点 -
chmod 777 /mnt/externalDrive
chown nobody:nogroup /mnt/externalDrive
如果我授予 777 权限并且 user1 (UID:1005) 对其进行写入,然后我将磁盘移动到 user7 的 UID:1005 的另一台计算机上,会发生什么? user7 是否成为该计算机上文件的所有者?在我看来,我必须定期chown -R nobody:nogroup /mnt/externalDrive
在磁盘上运行。
我正在考虑的任何事情是否是明显的不良做法?该磁盘很可能包含视频、音乐和图片,它们都不需要像某些财务数据那样受到保护。
答案1
这就是多用户系统的问题,尤其是当您拥有多个用户系统时。 ;) 没有真的做你想做的事的好方法。我想到的方法是
- 在使用外部驱动器的每台计算机上为您的帐户设置相同的 UID(实际上不可行,因为很可能并非所有计算机都在您的控制之下)
- 使用不知道所有者/组连接的文件系统(想到了 FAT 或 NTFS,但是……啊,不)
最有效的方法是回归常见做法。在大多数(至少)Linux 系统上,存在一些具有以下功能的组:通常通用 GID。举个例子,它在大多数 Linux 发行版上users
都有 GID 。100
如果您能够设法在该组中拥有各自的用户帐户,您可以
- 使驱动器上的所有文件和目录都归该组所有
- 以某种方式设法对这些文件和目录拥有适当的组权限
- 以某种方式设法使用适当的组所有权分别创建新文件。权限。
第一点和第二点很容易实现(chown
, chmod
)。第三点有点棘手。
“组所有权”部分相对简单:您可以在驱动器上的所有目录上设置 SGID 位。应用于目录的 SGID 位告诉内核以 BSDish 方式运行:BSD 使在特定目录组下创建的每个文件/目录不由创建文件/目录的进程的主要组拥有(如 Linux 那样),而是由父目录的所有者。
权限位有点难。新创建的文件/目录的权限(除其他外)受到 的影响umask
,这是一个位掩码,告诉哪些位不是如果没有明确说明,则设置为。umask
例如,一个常见值是022
,这意味着通常不应设置“组”和“其他”的写入位。您可以将您的更改umask
为002
,表示您不想清除组的写入权限,但缺点是您不能基于目录设置此值,并且您通常不想为您创建的每个文件设置主要组的写入权限。
这可以使用 ACL 来解决:在 ACL 中,您可以设置一个权限mask
集default
,该权限集适用于具有此 ACL 集的目录内创建的所有文件和目录。所以你的问题的一种可能的解决方案是
- 确保您是要使用外部驱动器的所有系统上通用组的成员
- 使驱动器上的所有文件和目录都归该组所有,并在所有目录上设置 SGID 位
- 更改所有目录的 ACL 以包含掩码和默认权限,告诉内核创建每个新文件/目录,并为该组设置写权限。
请参阅setfacl(1)
、 和acl(5)
了解更多详细信息。
答案2
有另一个类似的问题并建议使用bindfs:
mkdir /home/$user/sda1
bindfs -u $user -g $group /mnt/sda1 /home/$user/sda1
OSX 用户建议noowners
安装选项如下所示:
忽略整个卷的所有权字段。这会导致所有对象显示为用户 ID 99 和组 ID 99 所有。用户 ID 99 被解释为当前有效用户 ID,而组 ID 99 被直接使用并转换为“未知”。
答案3
文件的所有者和组以数字形式存储。因此,该文件将归 uid=1005 所有,无论其连接到的系统上的哪个用户(或根本没有用户)。
将用户/组更改为无人无法解决您的问题。然后只有nobody 用户(或nobody 组的成员)才被允许访问这些文件。
不幸的是,我认为没有办法禁用 ext4 上的权限检查。例如,参见是否可以禁用 ext3 或 ext4 文件系统上的文件权限?
答案4
安德烈亚斯·维泽假设如果您在所有主机上都有共同的组 ID,则可以使用setgid
位和 ACL解决您的问题
经过自己的研究发现,这样的组存在于所有涉及的发行版中:Debian、Ubuntu、RedHat、Fedora、CentOS、Suse、FreeBSD、OpenBSD、NetBSD、MacOSX、Solaris 上的sys
组共享 ID 。3
有了这个:
$ sudo chgrp -R sys /mnt/data/dir
$ sudo chmod -R g+s /mnt/data/dir
$ sudo setfacl -R -m g:sys:rwx /mnt/data/dir
$ sudo setfacl -R -d -m g:sys:rwx /mnt/data/dir
和这个的味道:
$ sudo adduser user sys
您user
可以读取/写入 上的任何文件/dir
。
大多数工作可能会有所setgid
帮助,但不幸的是你通常无法控制umask
。因此使用ACL来提供完整的解决方案。
也可以看看:
- https://askubuntu.com/questions/12009/solving-permission-problems-when-using-external-ext4-hard-disk-with-multiple-lin/
- https://askubuntu.com/questions/252361/how-could-i-mount-an-ext4-partition-and-have-write-permission/
- https://serverfault.com/questions/306344/sharing-an-ext3-ext4-partition-on-external-drive/