我可以跨计算机移植 ext4 外部硬盘的用户权限吗?

我可以跨计算机移植 ext4 外部硬盘的用户权限吗?

我有一个外部 USB 3 磁盘驱动器(2TB 容量),很可能会在机器之间移动。该磁盘有一个 GUID 分区表和一个 ext4 分区。除非提升进程 ( sudo),否则我无法写入磁盘。

截至目前,我正在考虑尝试以下一种或两种方法,并想知道每种方法的缺点 -

  1. chmod 777 /mnt/externalDrive
  2. 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如果您能够设法在该组中拥有各自的用户帐户,您可以

  1. 使驱动器上的所有文件和目录都归该组所有
  2. 以某种方式设法对这些文件和目录拥有适当的组权限
  3. 以某种方式设法使用适当的组所有权分别创建新文件。权限。

第一点和第二点很容易实现(chown, chmod)。第三点有点棘手。

“组所有权”部分相对简单:您可以在驱动器上的所有目录上设置 SGID 位。应用于目录的 SGID 位告诉内核以 BSDish 方式运行:BSD 使在特定目录组下创建的每个文件/目录不由创建文件/目录的进程的主要组拥有(如 Linux 那样),而是由父目录的所有者。

权限位有点难。新创建的文件/目录的权限(除其他外)受到 的影响umask,这是一个位掩码,告诉哪些位不是如果没有明确说明,则设置为。umask例如,一个常见值是022,这意味着通常不应设置“组”和“其他”的写入位。您可以将您的更改umask002,表示您不想清除组的写入权限,但缺点是您不能基于目录设置此值,并且您通常不想为您创建的每个文件设置主要组的写入权限。

这可以使用 ACL 来解决:在 ACL 中,您可以设置一个权限maskdefault,该权限集适用于具有此 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解决您的问题

我问问题Linux 发行版中预定义的组 ID?

经过自己的研究发现,这样的组存在于所有涉及的发行版中: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来提供完整的解决方案。

也可以看看:

相关内容