了解如何在 Linux 上正确使用外部驱动器。
虽然云存储提供了许多优势,但没有什么比将数据保存在物理硬盘上更合适的了。当您将数据保存到驱动器时,您就知道数据的确切位置,并且在您需要时随时可用。当您将数据保存到 U盘等外部便携式驱动器时,效果会更好——您不仅知道数据在哪里,而且可以随身携带数据。如果您是Linux新手,或者您尝试在外部驱动器上使用 Linux 文件系统,您可能会发现外部驱动器令人困惑,容易出现权限错误或冲突,甚至丢失元数据。

对此有两个“正确”的答案:

ExFAT

以前,ExFAT 是一个来自微软受法律保护的文件系统,因为他们拥有代码。他们之前曾起诉公司和组织以捍卫他们对 FAT 的所有权,因此人们普遍担心他们可以对 ExFAT 做同样的事情。不过,最近。微软为 ExFAT 制定了开源规范。不幸的是,他们没有提供驱动程序,但是有一个现有的驱动程序可以使其在 Linux 上运行,而且现在开发人员可以访问完整的规范,改进是不可避免的。

ExFAT 的优势在于它是跨平台的(Windows、Mac 和许多便携式设备都使用它),并且它的设计没有文件权限的开销。您可以将格式化为 ExFAT 的驱动器连接到任何计算机,并且任何人都可以使用所有文件。这是好是坏取决于您的用途,但对于便携式存储,这比较适用。

访问控制列表 (ACL)

如果您更喜欢在便携式驱动器上使用 Linux 文件系统,那么您可以这样做,但是为了无缝共享文件,您应该使用访问控制列表 (ACL)。

当您在驱动器上创建文件或目录时,您的系统上有默认值来确定它获得的文件权限。在大多数情况下,这些默认值是有意义的——当您在主目录中创建文件时,您可能不希望其他用户访问该文件。但是,当您在外部驱动器上创建文件时,很有可能是因为您需要与其他人共享该文件(即使该人是您在另一台计算机上)。

您可以使用 ACL 覆盖查看文件的默认权限,并且可以通过定义默认设置来控制默认文件创建模式。ACL 是目录和文件的扩展属性中的一层安全策略。它允许您指定文件系统权限指示的例外情况。最值得注意的是,这允许您超越传统 UNIX 权限的单一所有者和单一组模型。
例如,虽然seth (ID 1000) 帐户可能拥有在我的桌面上创建的目录,但我的笔记本电脑上的seth (ID 500) 没有,因为用户 ID 不同。

对于一个群体来说也是如此。如果将组 ID 为 1000 的目录分配给一台计算机上的目录,则 ID 为 500 或 10922 的组无法在另一台计算机上访问该目录。但是 ACL 可以向目录和文件添加二级所有者和组。

查看当前 ACL

默认情况下,任何常见 Linux 文件系统上的任何目录和文件都有 ACL 规则。它们存储在扩展属性中,这是一种您通常看不到的元数据。
您可以在终端中查看它们:

$ getfacl 。/ example
# file: /run/media/drive/example
# owner: seth
# group: users
user::rwx
group::rwx
other::r--

注释行仅供您参考;它们会告诉您正在查看信息的文件或目录的路径、所有者和组。下一行显示应用于文件或目录的规则。在此示例中,用户权限设置为rwx,组设置为rx,其他设置为rx。这些权限由普通文件系统列表反映:

$ ls -lA /run/media/drive
drwxrwxr-- 26 seth users 4096 Jan 16 21:04 example
$ id
uid=1000(seth) gid=100(users) groups=100(users)...

只要用户seth (UID 1000) 或组成员(GID 100) 与示例目录交互,就会授予完全访问权限。但是,任何其他帐户只有读取 ( r ) 权限。

设置ACL

要修改 ACL,请使用setfacl命令或使用具有 ACL 支持的文件管理器。在设置 ACL 时,您可以非常具体或非常通用。

要仅修改文件系统权限设置,您可以使用chmodsetfacl。这是一个非常通用的 ACL 设置,因为您没有向文件系统规范中已提供给 UNIX 的权限添加任何内容。

$ setfacl --modify g::r example
$ getfacl ./example | grep "group::"
group::r--
$ ls -l . | grep example
drwxr--r-- 26 seth users 4096 Jan 16 21:04 example

chmod命令可以获得相同的效果:

$ chmod g+x example
$ getfacl ./example | grep "group::"
group::r-x
$ ls -l . | grep example
drwxr-xr-- 26 seth users 4096 Jan 16 21:04 example

添加用户和组

真正从 ACL 中受益是将其用于本机 UNIX 权限范围之外的权限。如果我以用户 ID 1000 的seth身份登录到我的桌面,并且我知道便携式驱动器上的目录需要可供笔记本电脑上 ID 为 500的seth使用,那么仅将seth声明为所有者是不够的,因为用户 ID 不一样。

您可以将用户或用户 ID 添加到访问控制列表:

$ setfacl --modify u: 500 :rwx example
$ getfacl example
# file: /run/media/drive/example
# owner: seth
# group: users
user::rwx
user: 500 :rwx
[ ... ]

特定于用户 ID 500 的新条目已添加到列表中。将驱动器连接到另一台 Linux 或 UNIX 计算机现在允许 ID 500 的用户访问示例文件夹。

您还可以按帐户名添加用户,或按组名或组 ID 添加组。但是,ID 才是真正重要的权限,因此,如果您处于混合环境(例如 RHEL 服务器和 Elementary 客户端),您应该验证潜伏在表面上的帐户后面的用户 ID 和组 ID,完全相同的。

设置默认ACL规则

如果您将访问控制视为一次性设置,一旦您的不同用户帐户开始创建文件和目录,您很快就会遇到问题。每个用户创建的任何新文件或目录都会继承系统的默认权限(和 ACL)。这意味着一旦ID 为 500 的笔记本电脑用户seth在目录中创建了一个文件,它就可能被ID 为 1000 的桌面用户seth 禁止,因为该文件的所有者设置为 UID 500。

可以将默认 ACL 应用于目录,以便在其中创建的文件和子目录继承父 ACL。您可以使用--default选项设置目录的默认 ACL :

$ setfacl --default --modify u:500:rwx example
$ setfacl --default --modify u:1000:rwx example
$ getfacl --omit-header example
user::rwx
user:500:rwx
group::rw-
mask::rwx
other::r-x
default:user::rwx
default:group::rw-
default:group:500:rwx
default:group:1000:rwx
default:mask::rwx
default:other::r-x

当用户在example目录中创建新目录时,继承的 ACL 与其父目录相同:

$ cd example
$ mkdir penguins
$ getfacl --omit-header penguins
user::rwx
group::rw-
group:500:rwx
group:1000:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::rw-
default:group:500:rwx
default:group:1000:rwx
default:mask::rwx
default:other::r-x

这意味着创建的任何目录或文件都继承相同的 ACL,因此用户 500 或 1000 都不会被排除在访问之外。

适用于外部驱动器的实用 ACL

将 Linux 文件系统用于外部驱动器时,确保它适用于所有希望使用便携式驱动器的用户的简单方法是在单个顶级目录上设置 ACL。

例如,假设您已将名为mydrive的U盘格式化为 ext4 文件系统。您希望您的笔记本电脑和台式机上的帐户以及您的同事 Alice 能够访问这些文件。

首先,在驱动器的顶层创建一个目录:

$ mkdir /mnt/mydrive/umbrella

然后将 ACL 应用于顶级目录以授予所有重要用户访问权限:

$ setfacl --modify \
  u:500:rwx,u:1000:rwx,u:alice:rwx \
  /mnt/mydrive/umbrella

最后,应用默认 ACL,以便在顶级目录伞中创建的所有目录和文件都继承相同的默认 ACL(请注意,此命令使用–modify的简短版本):

$ setfacl --default -m u:500:rwx,u:1000:rwx,u:alice:rwx \
  /mnt/mydrive/umbrella

将默认值应用于现有系统

如果您需要将 ACL 设置应用于许多已经存在的文件,您可以使用find命令来完成。

首先,找到所有目录并应用 ACL 规则:

$ find /mnt/mydrive/umbrella -type d | \
  parallel --max-args=6 setfacl \
  --default -m u:500:rwx,u:1000:rwx,u:alice:rwx

不分青红皂白地将所有文件权限设置为可执行是不明智的,所以接下来,找到所有文件并将权限设置为re。需要可执行位的文件可以手动设置或通过文件扩展名设置:

$ find /mnt/mydrive/umbrella -type f | \
  parallel --max-args=6 setfacl \
  --default -m u:500:rw,u:1000:rw,u:alice:rw

调整这些命令的逻辑以满足您的个人需要(例如,不要运行删除/usr上的可执行位的命令,或者在只包含可执行程序的目录上运行的命令)。

外部驱动器

不要让 Linux 上的外部驱动器混淆使您感到困惑,也不要将自己限制在传统的 UNIX 权限上。让访问控制列表为您服务,并随意在您的便携式驱动器上使用原生日志 Linux 文件系统。

转自:opensource