Menu Close

管理文件系统

Red Hat Enterprise Linux 9

在 Red Hat Enterprise Linux 9 中创建、修改和管理文件系统

摘要

本文档集合提供了如何有效管理 Red Hat Enterprise Linux 9 中的文件系统的说明。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息

对红帽文档提供反馈

我们感谢您对文档提供反馈信息。请让我们了解如何改进文档。

  • 关于特定内容的简单评论:

    1. 请确定您使用 Multi-page HTML 格式查看文档。另外,确定 Feedback 按钮出现在文档页的右上方。
    2. 用鼠标指针高亮显示您想评论的文本部分。
    3. 点在高亮文本上弹出的 Add Feedback
    4. 按照显示的步骤操作。
  • 要通过 Bugzilla 提交反馈,请创建一个新的 ticket:

    1. 进入 Bugzilla 网站。
    2. 在 Component 中选择 Documentation
    3. Description 中输入您要提供的信息。包括文档相关部分的链接。
    4. Submit Bug

第 1 章 可用文件系统概述

由于大量的可用选项以及所涉及的权衡,因此选择适合您应用程序的文件系统是一个重要的决定。本章论述了 Red Hat Enterprise Linux 9 附带的一些文件系统,并提供适合应用程序的正确文件系统上历史背景和建议。

1.1. 文件系统类型

Red Hat Enterprise Linux 9 支持各种文件系统(FS)。不同类型的文件系统可以解决不同类型的问题,它们的使用会根据特定应用程序而有所不同。在最一般的级别上,可用的文件系统可以分为以下主要类型:

表 1.1. 文件系统类型及其用例

类型文件系统属性和使用案例

磁盘或本地 FS

XFS

XFS 是 RHEL 中的默认文件系统。由于它将文件布局为扩展数据块,所以它不像 ext4 那样易受碎片的影响。红帽建议将 XFS 部署为本地文件系统,除非有特定原因部署为其它:例如,兼容性或涉及性能方面的情况。

ext4

ext4 在 Linux 中具有长寿的优势。因此,几乎所有 Linux 应用程序都支持它。在大多数情况下,它与 XFS 在性能上竞争。ext4 通常用于主目录。

网络或客户端-和-服务器 FS

NFS

使用 NFS 在同一个网络中的多个系统间共享文件。

SMB

使用 SMB 进行与微软 Windows 系统的文件共享。

共享存储或共享磁盘 FS

GFS2

GFS2 为计算集群成员提供共享写入访问。其重点在于稳定性和可靠性,获得与本地文件系统类似的体验。SAS Grid、Tibco MQ、IBM Websphere MQ 和 Red Hat Active MQ 已被成功部署在 GFS2 上。

卷管理 FS

Stratis(技术预览)

Stratis 是基于 XFS 和 LVM 的组合构建的卷管理器。Stratis 的目的是模拟卷管理文件系统(如 Btrfs 和 ZFS)所提供的功能。可以手动构建此堆栈,但 Stratis 可减少配置的复杂度、实施最佳实践并整合错误信息。

1.2. 本地文件系统

本地文件系统是在单一本地服务器中运行并直接附加到存储中的文件系统。

例如,本地文件系统是内部 SATA 或 SAS 磁盘的唯一选择,可在当您的服务器具有带有本地驱动器的内部硬件 RAID 控制器时使用。当 SAN 上导出的设备未共享时,本地文件系统也是 SAN 连接的存储上最常用的文件系统。

所有本地文件系统都与 POSIX 兼容,且与所有支持的 Red Hat Enterprise Linux 版本完全兼容。与 POSIX 兼容的文件系统为一组定义良好的系统调用提供支持,如 read()write()seek()

从应用程序员的角度来看,本地文件系统之间的差别相对较少。从用户的角度来看,最显著的差异与可扩展性和性能相关。在考虑文件系统的选择时,请考虑文件系统需要多大、应具有哪些独特功能,以及它在您的工作负载下性能如何。

可用的本地文件系统
  • XFS
  • ext4

1.3. XFS 文件系统

XFS 是一个高度可扩展、高性能、健壮且成熟的 64 位日志文件系统,其支持单个主机上非常大的文件和文件系统。它是 Red Hat Enterprise Linux 9 中的默认文件系统。XFS 最初于 1990 年代由 SGI 早期开发,并在非常大型的服务器和存储阵列中运行有很长的历史记录。

XFS 的功能包括:

可靠性
  • 元数据日志,其确保系统崩溃后文件系统的完整性,方法是保留系统重启和重新挂载文件系统时可以重新执行的文件系统操作的记录,
  • 广泛的运行时元数据一致性检查
  • 可扩展且快速修复工具
  • 配额日志。这可避免在崩溃后进行冗长的配额一致性检查。
可伸缩性和性能
  • 支持最多 1024 TiB 的文件系统大小
  • 支持大量并发操作的能力
  • B-tree 索引,用于空闲空间的可扩展性管理
  • 复杂的元数据读头算法
  • 优化流视频工作负载
分配方案
  • 基于扩展数据块的分配
  • 条带化分配策略
  • 延迟分配
  • 空间预分配
  • 动态分配的 inode
其他功能
  • 基于 Reflink 的文件副本
  • 严格集成备份和恢复工具
  • 在线清理
  • 在线文件系统增大
  • 全面的诊断功能
  • 扩展属性(xattr)。这允许系统能够按文件关联多个额外的名称/值对。
  • 项目或目录配额。这允许对目录树的配额限制。
  • 小于秒的时间戳

性能特性

XFS 在具有企业工作负载的大型系统上具有高性能。大型系统是一个有相对较多的 CPU 、多个 HBA 和连接外部磁盘阵列的系统。XFS 在具有多线程、并行 I/O 工作负载的较小系统上也表现良好。

对于单线程、元数据密集型工作负载,XFS 的性能相对较低:例如,在单个线程中创建或删除大量小文件的工作负载。

1.4. ext4 文件系统

ext4 文件系统是 ext 文件系统系列的第四代。它是 Red Hat Enterprise Linux 6 中的默认文件系统。

ext4 驱动程序可以对 ext2 和 ext3 文件系统进行读写,但 ext4 文件系统格式与 ext2 和 ext3 驱动程序不兼容。

ext4 添加了几个新的改进的功能,例如:

  • 支持的文件系统大小高达 50 TiB
  • 基于扩展的元数据
  • 延迟分配
  • 日志的 checksum
  • 大型存储支持

基于扩展数据块的元数据和延迟分配功能提供了一种更加紧凑和高效的方法来跟踪文件系统中的已用空间。这些功能提高了文件系统性能,并减少了元数据所占用的空间。延迟分配允许文件系统延迟选择新写入用户数据的永久位置,直到数据刷新到磁盘。这可实现更高的性能,因为它允许更大的、连续的分配,允许文件系统根据更佳的信息做出决策。

ext4 中使用 fsck 工具的文件系统修复时间比 在 ext2 和 ext3 中要快得多。一些文件系统修复的性能会增加最多 6 倍。

1.5. XFS 和 ext4 的比较

XFS 是 RHEL 中的默认文件系统。本节比较 XFS 和 ext4 的用法和功能。

元数据错误行为
在 ext4 中,当文件系统遇到元数据错误时您可以配置行为。默认的行为是继续操作。当 XFS 遇到不可恢复的元数据错误时,它会关闭文件系统,并返回 EFSCORRUPTED 错误。
配额

在 ext4 中,您可以在创建文件系统时启用配额,或稍后在现有文件系统上启用配额。然后您可以使用挂载选项配置配额强制。

XFS 配额不是一个可重新挂载的选项。您必须在初始挂载中激活配额。

在 XFS 文件系统上运行 quotacheck 命令没有效果。当您第一次打开配额记帐时,XFS 会自动检查配额。

文件系统重新定义大小
XFS 没有工具来缩小文件系统的大小。您只能增大 XFS 文件系统的大小。而 ext4 支持扩展和缩小文件系统大小。
内节点(inode)号

ext4 文件系统不支持超过 232 内节点。

XFS 动态分配内节点。只要文件系统上存在空闲空间,XFS 文件系统就无法耗尽 inode 。

某些应用程序无法正确处理 XFS 文件系统上大于232 的 inode 数。这些应用程序可能会导致 32 位 stat 调用失败,返回值为 EOVERFLOW 。在以下情况下,inode 数超过 232:

  • 文件系统大于 1 TiB,其 inode 为 256 字节。
  • 文件系统大于 2 TiB,其 inode 为 512 字节。

如果您的应用程序由于 inode 数太大而失败,请使用 -o inode32 选项挂载 XFS 文件系统,来强制inode 数低于 232。请注意,使用 inode32 不会影响已分配了 64 位数的 inode。

重要

除非特定环境需要,否则 请勿 使用 inode32 选项。inode32 选项可改变分配行为。因此,如果没有可用空间在较低磁盘块中分配 inode ,则可能会出现 ENOSPC 错误。

1.6. 选择本地文件系统

要选择一个满足应用程序要求的文件系统,您需要了解要在其上部署文件系统的目标系统。您可以使用以下问题来说明您的决定:

  • 您有一个大的服务器吗?
  • 您有大的存储要求或一个本地的慢速的 SATA 驱动器吗?
  • 您所期望的应用程序存在哪一种 I/O 工作负载?
  • 您对吞吐量和延迟的要求是什么?
  • 您的服务器和存储硬件稳定性如何?
  • 您的文件和数据组的典型大小是什么?
  • 如果系统失败,您可以承受多少停机时间?

如果您的服务器和存储设备都很大,那么 XFS 是最佳选择。即使存储阵列较小,当平均文件大小较大(例如,几百兆字节)时,XFS 也表现良好。

如果您的现有工作负载在 ext4 上表现良好,则继续使用 ext4 会为您和您的应用程序提供一个非常熟悉的环境。

ext4 文件系统在 I/O 能力有限的系统上往往表现更好。它在有限带宽(小于 200MB/s)上性能更好,最高可达到 1000 IOPS 的能力。对于较高能力的任何事情,XFS 往往会更快。

与 ext4 相比,XFS 消耗大约两倍的每个元数据所使用的 CPU ,因此如果您有一个很少并发的 CPU 绑定工作负载,则 ext4 将更快。通常,如果应用程序使用单个读/写线程和小文件,则 ext4 更佳;而当应用程序使用多个读/写线程和较大的文件时,XFS 会更出色。

您无法缩小 XFS 文件系统。如果您需要缩小文件系统,请考虑使用 ext4 ,其支持离线缩小。

通常,红帽建议您使用 XFS,除非您有 ext4 的特定用例。您还应衡量目标服务器和存储系统上特定应用的性能,以确保您选择了合适的文件系统类型。

表 1.2. 本地文件系统建议概述

场景推荐的文件系统

没有特殊用例

XFS

大服务器

XFS

大存储设备

XFS

大文件

XFS

多线程 I/O

XFS

单线程 I/O

ext4

有限 I/O 功能(在 1000 IOPS 下)

ext4

有限带宽(在 200MB/s 下)

ext4

CPU 绑定工作负载

ext4

支持离线缩小

ext4

1.7. 网络文件系统

网络文件系统也称为客户端/服务器文件系统,使客户端系统能够访问存储在共享服务器上的文件。这使得多个系统上的多个用户可以共享文件和存储资源。

此类文件系统构建自一个或多个服务器,它们将一组文件系统导出到一个或多个客户端。客户端节点无法访问底层的块存储,而是使用允许更好的访问控制的协议来与存储进行交互。

可用网络文件系统
  • RHEL 客户最常用的客户端/服务器文件系统是 NFS 文件系统。RHEL 提供了一个 NFS 服务器组件,来通过网络导出本地文件系统,并提供 NFS 客户端来导入这些文件系统。
  • RHEL 还包括 CIFS 客户端,其支持流行的 Microsoft SMB 文件服务器来实现 Windows 互操作性。用户空间 Samba 服务器为 Windows 客户端提供 RHEL 服务器的 Microsoft SMB 服务。

1.8. 共享存储文件系统

共享存储文件系统有时称为集群文件系统,允许集群中的每台服务器通过本地存储区域网络(SAN)直接访问共享块设备。

和网络文件系统的比较
与客户端/服务器文件系统一样,共享存储文件系统在一组服务器上工作,这些服务器都是群集的成员。但与 NFS 不同,没有一个服务器向其他成员提供对数据或元数据的访问:群集的每个成员都可以直接访问同一存储设备( 共享存储),并且所有群集节点都可以访问同一组文件。
并发

缓存一致性是集群文件系统中确保数据一致性和完整性的关键。集群中所有文件的单个版本都必须对群集内的所有节点可见。文件系统必须阻止群集成员同时更新同一存储块,以防止数据损坏。为此,共享存储文件系统使用集群范围的锁机制作为并发控制机制来仲裁对存储的访问。例如,在创建新文件或写入在多个服务器上打开的文件之前,服务器上的文件系统组件必须获得正确的锁。

群集文件系统的要求是提供一种像 Apache Web 服务器那样高可用的服务。群集的任何成员都将看到存储在共享磁盘文件系统中的数据的完全一致的视图,并且所有更新都会通过锁机制正确仲裁。

性能特性

由于锁开销的计算成本,共享磁盘文件系统并不总像运行在同一系统上的本地文件系统那样表现良好。如果每个节点几乎以独占方式写入一组不与其他节点共享的特定文件,或者一组文件在一组节点上以几乎独占的只读方式被共享,那么共享磁盘文件系统可以很好地执行这种工作负载。这将导致最小的跨节点缓存失效,并可最大限度地提高性能。

设置共享磁盘文件系统非常复杂,调优应用以在共享磁盘文件系统上表现良好非常有挑战性。

可用的共享存储文件系统
  • Red Hat Enterprise Linux 提供 GFS2 文件系统。GFS2 与 Red Hat Enterprise Linux High Availability Add-On 和 Resilient Storage 附加组件紧密整合。

Red Hat Enterprise Linux 支持集群中大小为 2 到 16 个节点的 GFS2。

1.9. 在网络和共享存储文件系统间进行选择

在网络和共享存储文件系统间选择时,请考虑以下几点:

  • 对于提供 NFS 服务器的环境,基于 NFS 的网络文件系统是非常常见和流行的选择。
  • 网络文件系统可以使用非常高性能的网络技术(如 Infiniband 或 10 GB 以太网卡)进行部署。这意味着您不应该仅仅为了获得存储的原始带宽而转向共享存储文件系统。如果访问速度至关重要,则使用 NFS 导出类似 XFS 的本地文件系统。
  • 共享存储文件系统的设置或维护并非易事,因此您应仅在无法用本地或网络文件系统提供所需的可用性时才部署它们。
  • 集群环境中的共享存储文件系统通过消除在涉及重新分配高可用性服务的典型故障切换情景中需要执行的卸载和挂载所需的步骤,来帮助减少停机时间。

红帽建议您使用网络文件系统,除非您有共享存储文件系统的特定用例。共享存储文件系统主要用于需要以最少的停机时间提供高可用性服务且具有严格的服务等级要求的部署。

1.10. 卷管理文件系统

卷管理文件系统集成整个存储堆栈,以实现简洁和堆栈内优化。

可用卷管理文件系统
  • Red Hat Enterprise Linux 9 作为技术预览提供 Stratis 卷管理器。Stratis 对文件系统层使用 XFS,并将其与 LVM、设备映射器和其他组件集成。

Stratis 首次在 Red Hat Enterprise Linux 8.0 中发布。它被设计为填补红帽弃用 Btrfs 时出现的空白。Stratis 1.0 是一个直观的、基于命令行的卷管理器,可以在隐藏用户复杂性的同时执行重要的存储管理操作:

  • 卷管理
  • 创建池
  • 精简存储池
  • 快照
  • 自动读取缓存

Stratis 提供强大的功能,但目前缺乏其他产品(如 Btrfs 或 ZFS)的某些功能。最值得注意的是,它不支持带自我修复的 CRC。

第 2 章 使用 RHEL 系统角色管理本地存储

要使用 Ansible 管理 LVM 和本地文件系统(FS),您可以使用 Storage 角色,这是 RHEL 9 中可用的 RHEL 系统角色之一。

使用 Storage 角色可让您在多台计算机上的磁盘和逻辑卷上自动管理文件系统,并在从 RHEL 7.7 开始的所有 RHEL 版本间自动管理文件系统。

有关 RHEL 系统角色以及如何应用它们的更多信息,请参阅 RHEL 系统角色简介

2.1. 存储角色简介

Storage 角色可以管理:

  • 磁盘上未被分区的文件系统
  • 完整的 LVM 卷组,包括其逻辑卷和文件系统

使用 Storage 角色,您可以执行以下任务:

  • 创建文件系统
  • 删除文件系统
  • 挂载文件系统
  • 卸载文件系统
  • 创建 LVM 卷组
  • 删除 LVM 卷组
  • 创建逻辑卷
  • 删除逻辑卷
  • 创建 RAID 卷
  • 删除 RAID 卷
  • 创建带有 RAID 的 LVM 池
  • 删除带有 RAID 的 LVM 池

2.2. 在存储系统角色中识别存储设备的参数

您的存储角色配置仅影响您在以下变量中列出的文件系统、卷和池。

storage_volumes

在所有要管理的未分区磁盘中的文件系统列表。

当前不支持的分区。

storage_pools

要管理的池列表。

目前唯一支持的池类型是 LVM。使用 LVM 时,池代表卷组(VG)。每个池中都有一个要由角色管理的卷列表。对于 LVM,每个卷对应一个带文件系统的逻辑卷(LV)。

2.3. 在块设备中创建 XFS 文件系统的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用存储角色,以使用默认参数在块设备中创建 XFS 文件系统。

警告

存储角色只能在未分区、整个磁盘或者逻辑卷(LV)上创建文件系统。它不能在分区中创建文件系统。

例 2.1. 在 /dev/sdb 上创建 XFS 的 playbook

---
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - sdb
        fs_type: xfs
  roles:
    - rhel-system-roles.storage
  • 卷名称(示例中为 barefs )目前是任意的。Storage 角色根据 disk: 属性中列出的磁盘设备标识卷。
  • 您可以省略 fs_type: xfs 行,因为 XFS 是 RHEL 9 中的默认文件系统。
  • 要在 LV 上创建文件系统,请在 disks: 属性下提供 LVM 设置,包括括起的卷组。

    不要提供到 LV 设备的路径。

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.4. 永久挂载文件系统的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用存储角色,以立即和永久挂载 XFS 文件系统。

例 2.2. 将 /dev/sdb 上的文件系统挂载到 /mnt/data 的 playbook

---
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - sdb
        fs_type: xfs
        mount_point: /mnt/data
  roles:
    - rhel-system-roles.storage
  • 此 playbook 将文件系统添加到 /etc/fstab 文件中,并立即挂载文件系统。
  • 如果 /dev/sdb 设备上的文件系统或挂载点目录不存在,则 playbook 会创建它们。

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.5. 管理逻辑卷的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用存储角色在卷组中创建 LVM 逻辑卷。

例 2.3. 在 myvg 卷组中创建 mylv 逻辑卷的 playbook

- hosts: all
  vars:
    storage_pools:
      - name: myvg
        disks:
          - sda
          - sdb
          - sdc
        volumes:
          - name: mylv
            size: 2G
            fs_type: ext4
            mount_point: /mnt
  roles:
    - rhel-system-roles.storage
  • myvg 卷组由以下磁盘组成:

    • /dev/sda
    • /dev/sdb
    • /dev/sdc
  • 如果 myvg 卷组已存在,则 playbook 会将逻辑卷添加到卷组。
  • 如果 myvg 卷组不存在,则 playbook 会创建它。
  • playbook 在 mylv 逻辑卷上创建 Ext4 文件系统,并在 /mnt 上永久挂载文件系统。

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.6. 启用在线块丢弃的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用存储角色,以挂载启用了在线块丢弃的 XFS 文件系统。

例 2.4. 一个 playbook,它在 /mnt/data/ 上启用在线块丢弃功能

---
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - sdb
        fs_type: xfs
        mount_point: /mnt/data
        mount_options: discard
  roles:
    - rhel-system-roles.storage

其它资源

2.7. 创建和挂载 Ext4 文件系统的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用存储角色来创建和挂载 Ext4 文件系统。

例 2.5. 在 /dev/sdb 上创建 Ext4 并挂载到 /mnt/data 的 playbook

---
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - sdb
        fs_type: ext4
        fs_label: label-name
        mount_point: /mnt/data
  roles:
    - rhel-system-roles.storage
  • playbook 在 /dev/sdb 磁盘上创建文件系统。
  • playbook 永久将文件系统挂载在 /mnt/data 目录。
  • 文件系统的标签是 label-name

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.8. 创建和挂载 ext3 文件系统的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用存储角色来创建和挂载 Ext3 文件系统。

例 2.6. 在 /dev/sdb 上创建 Ext3 ,并将其挂载到 /mnt/data 的 playbook

---
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - sdb
        fs_type: ext3
        fs_label: label-name
        mount_point: /mnt/data
  roles:
    - rhel-system-roles.storage
  • playbook 在 /dev/sdb 磁盘上创建文件系统。
  • playbook 永久将文件系统挂载在 /mnt/data 目录。
  • 文件系统的标签是 label-name

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.9. 使用存储 RHEL 系统角色调整现有 Ext4 或 Ext3 文件系统的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用存储角色,以在块设备上调整现有 Ext4 或 Ext3 文件系统的大小。

例 2.7. 在磁盘上设置单个卷的 playbook

---
- name: Create a disk device mounted on /opt/barefs
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - /dev/sdb
	size: 12 GiB
        fs_type: ext4
        mount_point: /opt/barefs
  roles:
    - rhel-system-roles.storage
  • 如果上例中的卷已存在,若要调整卷大小,您需要运行相同的 playbook,只是参数 size 的值不同。例如:

例 2.8. 在 /dev/sdb上调整 ext4 大小的 playbook

---
- name: Create a disk device mounted on /opt/barefs
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - /dev/sdb
	size: 10 GiB
        fs_type: ext4
        mount_point: /opt/barefs
  roles:
    - rhel-system-roles.storage
  • 卷名称(示例中为 barefs)当前是任意的。Storage 角色根据 disk: 属性中列出的磁盘设备标识卷。
注意

在其他文件系统中使用 Resizing 操作可能会破坏您正在使用的设备上的数据。

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.10. 使用存储 RHEL 系统角色在 LVM 上调整现有文件系统的大小的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用存储 RHEL 系统角色,以使用文件系统重新定义 LVM 逻辑卷大小。

警告

在其他文件系统中使用 Resizing 操作可能会破坏您正在使用的设备上的数据。

例 2.9. 调整 myvg 卷组中现有 mylv1 和 myvl2 逻辑卷大小的 playbook

---

- hosts: all
   vars:
    storage_pools:
      - name: myvg
        disks:
          - /dev/sda
          - /dev/sdb
          - /dev/sdc
        volumes:
            - name: mylv1
              size: 10 GiB
              fs_type: ext4
              mount_point: /opt/mount1
            - name: mylv2
              size: 50 GiB
              fs_type: ext4
              mount_point: /opt/mount2

- name: Create LVM pool over three disks
  incude_role:
    name: rhel-system-roles.storage
  • 此 playbook 调整以下现有文件系统的大小:

    • 挂载在 /opt/mount1 上的 mylv1 卷上的 Ext4 文件系统,大小调整为 10 GiB。
    • 挂载在 /opt/mount2 上的 mylv2 卷上的 Ext4 文件系统,大小调整为 50 GiB。

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.11. 使用存储 RHEL 系统角色创建交换分区的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用存储角色来创建交换分区(如果不存在),或者修改交换分区(如果已存在),在使用默认参数的块设备上。

例 2.10. 创建或修改 /dev/sdb 上现有 XFS 的 playbook

---
- name: Create a disk device with swap
- hosts: all
  vars:
    storage_volumes:
      - name: swap_fs
        type: disk
        disks:
          - /dev/sdb
	size: 15 GiB
        fs_type: swap
  roles:
    - rhel-system-roles.storage
  • 卷名称(示例中的 swap_fs )目前是任意的。Storage 角色根据 disk: 属性中列出的磁盘设备标识卷。

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.12. 使用存储系统角色配置 RAID 卷

使用 Storage 系统角色,您可以使用 Red Hat Ansible Automation Platform 在 RHEL 上配置 RAID 卷。在本小节中,您将了解如何使用可用参数设置 Ansible playbook,以配置 RAID 卷以满足您的要求。

先决条件

  • Ansible Core 软件包安装在控制机器上。
  • 您已在要运行 playbook 的系统上安装了 rhel-system-roles 软件包。
  • 您有一个清单文件详细描述了您要使用存储系统角色部署 RAID 卷的系统。

流程

  1. 使用以下内容创建一个新的 playbook.yml 文件:

    - hosts: all
      vars:
        storage_safe_mode: false
        storage_volumes:
          - name: data
            type: raid
            disks: [sdd, sde, sdf, sdg]
            raid_level: raid0
            raid_chunk_size: 32 KiB
            mount_point: /mnt/data
            state: present
      roles:
        - name: rhel-system-roles.storage
    警告

    设备名称在某些情况下可能会改变,例如:当您在系统中添加新磁盘时。因此,为了避免数据丢失,我们不建议在 playbook 中使用特定的磁盘名称。

  2. 可选。验证 playbook 语法。

    # ansible-playbook --syntax-check playbook.yml
  3. 在清单文件上运行 playbook:

    # ansible-playbook -i inventory.file /path/to/file/playbook.yml

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.13. 使用存储系统角色使用 RAID 配置 LVM 池

使用 Storage 系统角色,您可以使用 Red Hat Ansible Automation Platform 在 RHEL 上使用 RAID 配置 LVM 池。在本小节中,您将了解如何使用可用参数设置 Ansible playbook,以配置使用 RAID 的 LVM 池。

先决条件

  • Ansible Core 软件包安装在控制机器上。
  • 您已在要运行 playbook 的系统上安装了 rhel-system-roles 软件包。
  • 您有一个清单文件详细描述了您要使用存储系统角色使用 RAID 配置 LVM 池的系统。

流程

  1. 使用以下内容创建一个新的 playbook.yml 文件:

    - hosts: all
      vars:
        storage_safe_mode: false
        storage_pools:
          - name: my_pool
            type: lvm
            disks: [sdh, sdi]
            raid_level: raid1
            volumes:
              - name: my_pool
                size: "1 GiB"
                mount_point: "/mnt/app/shared"
                fs_type: xfs
                state: present
      roles:
        - name: rhel-system-roles.storage
    注意

    要使用 RAID 创建 LVM 池,您必须使用 raid_level 参数来指定 RAID 类型。

  2. 可选。验证 playbook 语法。

    # ansible-playbook --syntax-check playbook.yml
  3. 在清单文件上运行 playbook:

    # ansible-playbook -i inventory.file /path/to/file/playbook.yml

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.14. 使用存储 RHEL 系统角色在 LVM 中压缩和重复数据删除 VDO 卷的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用存储 RHEL 系统角色,以使用 Virtual Data Optimizer(VDO)卷为逻辑卷管理器卷(LVM)启用压缩和重复数据删除。

例 2.11. 在 myvg 卷组中创建 mylv1 LVM VDO 卷的 playbook

---
- name: Create LVM VDO volume under volume group 'myvg'
  hosts: all
  roles:
    -rhel-system-roles.storage
  vars:
    storage_pools:
     - name: myvg
       disks:
         - /dev/sdb
       volumes:
         - name: mylv1
           compression: true
           deduplication: true
           vdo_pool_size: 10 GiB
           size: 30 GiB
           mount_point: /mnt/app/shared

在本例中,compressiondeduplication 池被设为 true,这指定使用 VDO。下面描述了这些参数的用法:

  • deduplication 用于去除存储在存储卷上的重复数据。
  • compression 用于压缩存储在存储卷上的数据,从而提高存储量。
  • vdo_pool_size 指定卷在设备上占用的实际大小。VDO 卷的虚拟大小由 size 参数设置。注:由于 Storage 角色使用 LVM VDO,每个池只有一个卷可以使用压缩和重复数据删除。

2.15. 使用存储系统角色创建 LUKS 加密卷

您可以通过运行 Ansible playbook,使用 Storage 角色创建并配置使用 LUKS 加密的卷。

先决条件

  • Ansible Core 软件包安装在控制机器上。
  • Ansible 控制器上您已安装了 rhel-system-roles 软件包。
  • 您有一个清单文件详细描述了您要使用存储系统角色部署 LUKS 加密卷的系统。

流程

  1. 使用以下内容创建一个新的 playbook.yml 文件:

    - hosts: all
      vars:
        storage_volumes:
          - name: barefs
            type: disk
            disks:
             - sdb
            fs_type: xfs
            fs_label: label-name
            mount_point: /mnt/data
            encryption: true
            encryption_password: your-password
      roles:
       - rhel-system-roles.storage
  2. 可选:验证 playbook 语法:

    # ansible-playbook --syntax-check playbook.yml
  3. 在清单文件上运行 playbook:

    # ansible-playbook -i inventory.file /path/to/file/playbook.yml

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.storage/README.md file

2.16. 使用 Storage RHEL 系统角色以百分比表示池卷大小的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用存储系统角色,以表达作为池总大小的百分比的逻辑卷管理器卷(LVM)卷大小。

例 2.12. 将卷大小表示为池总大小百分比形式的 playbook

---
- name: Express volume sizes as a percentage of the pool's total size
  hosts: all
  roles
    - rhel-system-roles.storage
  vars:
    storage_pools:
    - name: myvg
      disks:
        - /dev/sdb
      volumes:
        - name: data
          size: 60%
          mount_point: /opt/mount/data
        - name: web
          size: 30%
          mount_point: /opt/mount/web
        - name: cache
          size: 10%
          mount_point: /opt/cache/mount

这个示例将 LVM 卷的大小指定为池大小的百分比,例如:"60%"。另外,您还可以将 LVM 卷的大小指定为人类可读的文件系统形式(如 "10g" 或 "50 GiB")的池大小的百分比。

2.17. 其它资源

  • /usr/share/doc/rhel-system-roles/storage/
  • /usr/share/ansible/roles/rhel-system-roles.storage/

第 3 章 挂载 NFS 共享

作为系统管理员,您可以在您的系统上挂载远程 NFS 共享来访问共享数据。

3.1. NFS 简介

这部分解释了 NFS 服务的基本概念。

网络文件系统(NFS)允许远程主机通过网络挂载文件系统,并像它们挂载在本地那样与这些文件系统进行交互。这可让您将资源整合到网络的集中服务器中。

NFS 服务器参考 /etc/exports 配置文件,来确定是否允许客户端访问任何导出的文件系统。一旦被验证,所有文件和目录操作都对用户有效。

3.2. 支持的 NFS 版本

这部分列出了 Red Hat Enterprise Linux 支持 NFS 版本及其特性。

目前,Red Hat Enterprise Linux 9 支持以下 NFS 主版本:

  • 与 NFSv2 相比,NFS 版本 3(NFSv3)支持安全异步写入操作,并在处理错误时更可靠。它也支持 64 位文件大小和偏移,允许客户端访问超过 2 GB 文件数据。
  • NFS 版本 4(NFSv4)通过防火墙,并在 Internet 上工作,不再需要 rpcbind 服务,支持访问控制列表(ACL),并且使用有状态操作。

红帽不再支持 NFS 版本 2(NFSv2)。

默认 NFS 版本

Red Hat Enterprise Linux 9 中的默认 NFS 版本为 4.2。NFS 客户端默认试图使用 NFSv4.2 挂载,并在服务器不支持 NFSv4.2 时回退到 NFSv4.1。之后挂载会返回 NFSv4.0,然后回退到 NFSv3。

次要 NFS 版本的特性

以下是 Red Hat Enterprise Linux 9 中的 NFSv4.2 的功能:

服务器端复制
使用 copy_file_range() 系统调用,可以使 NFS 客户端高效地复制数据,而不浪费网络资源。
稀疏文件
使文件有一个或者多个 洞(hole),它们是不分配或者未初始化的数据块,只由 0 组成。NFSv4.2 中的 lseek() 操作支持 seek_hole()seek_data(),这使得应用程序能够在稀疏文件中映射漏洞的位置。
保留空间
允许存储服务器保留空闲空间,这会防止服务器耗尽空间。NFSv4.2 支持 allocate() 操作来保留空间,支持 deallocate() 操作来释放空间,支持 fallocate() 操作来预分配和释放文件中的空间。
标记的 NFS
强制实施数据访问权限,并为 NFS 文件系统上的各个文件在客户端和服务器之间启用 SELinux 标签。
布局增强
提供 layoutstats() 操作,它可让一些并行 NFS(pNFS)服务器收集更好的性能统计数据。

以下是 NFSv4.1 的功能:

  • 增强性能和网络安全,同时包括对 pNFS 的客户端支持。
  • 对于回调不再需要单独的 TCP 连接,回调允许 NFS 服务器在无法联系客户端的情况下授予委托:例如,当 NAT 或防火墙干扰时。
  • 只提供一次语义(除重启操作外),防止出现先前的问题,即如果回复丢失,且操作被发送了两次,则某些操作有时会返回不准确的结果。

3.3. NFS 所需的服务

这部分列出了运行 NFS 服务器或挂载 NFS 共享所需的系统服务。Red Hat Enterprise Linux 会自动启动这些服务。

Red Hat Enterprise Linux 使用内核级支持和服务流程组合提供 NFS 文件共享。所有 NFS 版本都依赖于客户端和服务器间的远程过程调用(RPC)。要共享或者挂载 NFS 文件系统,下列服务根据所使用的 NFS 版本而定:

nfsd
为共享 NFS 文件系统请求的 NFS 服务器内核模块。
rpcbind
接受本地 RPC 服务的端口保留。这些端口随后可用(或公布出去),这样相应的远程 RPC 服务可以访问它们。rpcbind 服务响应对 RPC 服务的请求,并建立到请求的 RPC 服务的连接。这不能与 NFSv4 一起使用。
rpc.mountd
NFS 服务器使用这个进程来处理来自 NFSv3 客户端的 MOUNT 请求。它检查所请求的 NFS 共享是否目前由 NFS 服务器导出,并且允许客户端访问它。如果允许挂载请求,nfs-mountd 服务会回复 Success 状态,并将此 NFS 共享的文件句柄返回给 NFS 客户端。
rpc.nfsd
这个过程启用了要定义的服务器公告的显式 NFS 版本和协议。它与 Linux 内核一起使用,来满足 NFS 客户端的动态需求,例如,在每次连接 NFS 客户端时提供服务器线程。这个进程对应于 nfs-server 服务。
lockd
这是一个在客户端和服务器中运行的内核线程。它实现网络锁管理器(NLM)协议,它允许 NFSv3 客户端锁住服务器上的文件。每当运行 NFS 服务器以及挂载 NFS 文件系统时,它会自动启动。
rpc.statd
这个进程实现网络状态监控器(NSM)RPC 协议,该协议可在 NFS 服务器没有正常关机而重启时通知 NFS 客户端。rpc-statd 服务由 nfs-server 服务自动启动,不需要用户配置。这不能与 NFSv4 一起使用。
rpc.rquotad
这个过程为远程用户提供用户配额信息。启动 nfs-server 时,用户也必须启动 quota-rpc 软件包提供的 rpc-rquotad 服务。
rpc.idmapd

此进程为 NFSv4 客户端和服务器提供上行调用,这些调用在线上 NFSv4 名称(user@domain形式的字符串)和本地 UID 和 GID 之间进行映射。要使 idmapd 与 NFSv4 正常工作,必须配置 /etc/idmapd.conf 文件。至少应指定 Domain 参数,该参数定义 NFSv4 映射域。如果 NFSv4 映射域与 DNS 域名相同,可以跳过这个参数。客户端和服务器必须同意 NFSv4 映射域才能使 ID 映射正常工作。

只有 NFSv4 服务器使用 rpc.idmapd,它由 nfs-idmapd 服务启动。NFSv4 客户端使用基于密钥环的 nfsidmap 工具,内核按需调用它来执行 ID 映射。如果 nfsidmap 有问题,客户端将退回使用 rpc.idmapd

NFSv4 的 RPC 服务

挂载和锁定协议已合并到 NFSv4 协议中。该服务器还会监听已知的 TCP 端口 2049。因此,NFSv4 不需要与 rpcbindlockdrpc-statd 服务进行交互。NFS 服务器上仍然需要 nfs-mountd 服务来设置导出,但不涉及任何线上操作。

3.4. NFS 主机名格式

这部分论述了在挂载或导出 NFS 共享时用来指定主机的不同格式。

您可以使用以下格式指定主机:

单台机器

以下任意一种:

  • 完全限定域名(可由服务器解析)
  • 主机名(可由服务器解析)
  • IP 地址。
IP 网络

以下格式之一有效:

  • a.b.c.d/z ,其中 a.b.c.d 是网络,z 是子网掩码中的位数,例如 192.168.0.0/24
  • a.b.c.d/netmask,其中 a.b.c.d 是网络,netmask 是子网掩码;例如 192.168.100.8/255.255.255.0
Netgroups
@group-name 格式,其中 group-name 是 NIS netgroup 名称。

3.5. 安装 NFS

这个过程安装挂载或导出 NFS 共享所需的所有软件包。

流程

  • 安装 nfs-utils 软件包:

    # dnf install nfs-utils

3.6. 发现 NFS 导出

这个步骤发现给定 NFSv3 或者 NFSv4 服务器导出哪个文件系统。

流程

  • 对于支持 NFSv3 的任何服务器,请使用 showmount 工具:

    $ showmount --exports my-server
    
    Export list for my-server
    /exports/foo
    /exports/bar
  • 对于支持 NFSv4 的任何服务器,挂载根目录并查找:

    # mount my-server:/ /mnt/
    # ls /mnt/
    
    exports
    
    # ls /mnt/exports/
    
    foo
    bar

在同时支持 NFSv4 和 NFSv3 的服务器上,这两种方法都可以工作,并给出同样的结果。

其它资源

  • showmount(8) 手册页

3.7. 使用 mount 挂载一个 NFS 共享

这个流程使用 mount 工具挂载从服务器导出的 NFS 共享。

流程

  • 要挂载一个 NFS 共享,请使用以下命令:

    # mount -t nfs -o options host:/remote/export /local/directory

    这个命令使用以下变量:

    选项
    以逗号分隔的挂载选项列表。
    主机
    导出您要挂载的文件系统的服务器的主机名、IP 地址或者完全限定域名。
    /remote/export
    从服务器导出的文件系统或目录,即您要挂载的目录。
    /local/directory
    挂载 /remote/export 的客户端位置。

其它资源

3.8. 常用 NFS 挂载选项

这部分列出了在挂载 NFS 共享时常用的选项。这些选项可用于手动挂载命令、/etc/fstab 设置和 autofs

lookupcache=mode
指定内核应该如何管理给定挂载点的目录条目缓存。mode 的有效参数为 allnonepositive
nfsvers=version

指定要使用 NFS 协议的哪个版本,其中 version344.04.14.2。这对于运行多个 NFS 服务器的主机很有用,或者禁止使用较低版本重试挂载。如果没有指定版本,NFS 将使用内核和 mount 工具支持的最高版本。

选项 vers 等同于 nfsvers ,出于兼容性的原因包含在此发行版本中。

noacl
关闭所有 ACL 处理。当与旧版本的 Red Hat Enterprise Linux、Red Hat Linux 或 Solaris 交互时,可能需要此功能,因为最新的 ACL 技术与较旧的系统不兼容。
nolock
禁用文件锁定。当连接到非常旧的 NFS 服务器时,有时需要这个设置。
noexec
防止在挂载的文件系统中执行二进制文件。这在系统挂载不兼容二进制文件的非 Linux 文件系统时有用。
nosuid
禁用 set-user-identifierset-group-identifier 位。这可防止远程用户通过运行 setuid 程序获得更高的特权。
port=num
指定 NFS 服务器端口的数字值。如果 num0(默认值),则 mount 查询远程主机上 rpcbind 服务,以获取要使用的端口号。如果远程主机上的 NFS 服务没有注册其 rpcbind 服务,则使用标准的 NFS 端口号 TCP 2049。
rsize=numwsize=num

这些选项设定单一 NFS 读写操作传输的最大字节数。

rsizewsize 没有固定的默认值。默认情况下,NFS 使用服务器和客户端都支持的最大的可能值。在 Red Hat Enterprise Linux 9 中,客户端和服务器最大为 1,048,576 字节。详情请查看 rsize 和 wsize 的默认和最大值是什么?Kbase 文章。

sec=flavors

用于访问挂载导出上文件的安全类别。flavors 值是一个冒号分隔的、由一个或多个安全类别组成的列表。

默认情况下,客户端会尝试查找客户端和服务器都支持的安全类别。如果服务器不支持任何选定的类别,挂载操作将失败。

可用类别:

  • sec=sys 使用本地 UNIX UID 和 GID。它们使用 AUTH_SYS 验证 NFS 操作。
  • sec=krb5 使用 Kerberos V5 ,而不是本地 UNIX UID 和 GID 来验证用户。
  • sec=krb5i 使用 Kerberos V5 进行用户身份验证,并使用安全校验和执行 NFS 操作的完整性检查,以防止数据被篡改。
  • sec=krb5p 使用 Kerberos V5 进行用户身份验证、完整性检查,并加密 NFS 流量以防止流量嗅探。这是最安全的设置,但它也会涉及最大的性能开销。
tcp
指示 NFS 挂载使用 TCP 协议。

其它资源

  • mount(8) 手册页
  • nfs(5) 手册页

3.9. 其它资源

第 4 章 导出 NFS 共享

作为系统管理员,您可以使用 NFS 服务器来通过网络共享系统上的目录。

4.1. NFS 简介

这部分解释了 NFS 服务的基本概念。

网络文件系统(NFS)允许远程主机通过网络挂载文件系统,并像它们挂载在本地那样与这些文件系统进行交互。这可让您将资源整合到网络的集中服务器中。

NFS 服务器参考 /etc/exports 配置文件,来确定是否允许客户端访问任何导出的文件系统。一旦被验证,所有文件和目录操作都对用户有效。

4.2. 支持的 NFS 版本

这部分列出了 Red Hat Enterprise Linux 支持 NFS 版本及其特性。

目前,Red Hat Enterprise Linux 9 支持以下 NFS 主版本:

  • 与 NFSv2 相比,NFS 版本 3(NFSv3)支持安全异步写入操作,并在处理错误时更可靠。它也支持 64 位文件大小和偏移,允许客户端访问超过 2 GB 文件数据。
  • NFS 版本 4(NFSv4)通过防火墙,并在 Internet 上工作,不再需要 rpcbind 服务,支持访问控制列表(ACL),并且使用有状态操作。

红帽不再支持 NFS 版本 2(NFSv2)。

默认 NFS 版本

Red Hat Enterprise Linux 9 中的默认 NFS 版本为 4.2。NFS 客户端默认试图使用 NFSv4.2 挂载,并在服务器不支持 NFSv4.2 时回退到 NFSv4.1。之后挂载会返回 NFSv4.0,然后回退到 NFSv3。

次要 NFS 版本的特性

以下是 Red Hat Enterprise Linux 9 中的 NFSv4.2 的功能:

服务器端复制
使用 copy_file_range() 系统调用,可以使 NFS 客户端高效地复制数据,而不浪费网络资源。
稀疏文件
使文件有一个或者多个 洞(hole),它们是不分配或者未初始化的数据块,只由 0 组成。NFSv4.2 中的 lseek() 操作支持 seek_hole()seek_data(),这使得应用程序能够在稀疏文件中映射漏洞的位置。
保留空间
允许存储服务器保留空闲空间,这会防止服务器耗尽空间。NFSv4.2 支持 allocate() 操作来保留空间,支持 deallocate() 操作来释放空间,支持 fallocate() 操作来预分配和释放文件中的空间。
标记的 NFS
强制实施数据访问权限,并为 NFS 文件系统上的各个文件在客户端和服务器之间启用 SELinux 标签。
布局增强
提供 layoutstats() 操作,它可让一些并行 NFS(pNFS)服务器收集更好的性能统计数据。

以下是 NFSv4.1 的功能:

  • 增强性能和网络安全,同时包括对 pNFS 的客户端支持。
  • 对于回调不再需要单独的 TCP 连接,回调允许 NFS 服务器在无法联系客户端的情况下授予委托:例如,当 NAT 或防火墙干扰时。
  • 只提供一次语义(除重启操作外),防止出现先前的问题,即如果回复丢失,且操作被发送了两次,则某些操作有时会返回不准确的结果。

4.3. NFSv3 和 NFSv4 中的 TCP 和 UDP 协议

NFSv4 需要通过 IP 网络运行的传输控制协议(TCP)。

NFSv3 还可以使用早期 Red Hat Enterprise Linux 版本中的用户数据报协议(UDP)。在 Red Hat Enterprise Linux 9 中不再支持通过 UDP 的 NFS。默认情况下,UDP 在 NFS 服务器中被禁用。

4.4. NFS 所需的服务

这部分列出了运行 NFS 服务器或挂载 NFS 共享所需的系统服务。Red Hat Enterprise Linux 会自动启动这些服务。

Red Hat Enterprise Linux 使用内核级支持和服务流程组合提供 NFS 文件共享。所有 NFS 版本都依赖于客户端和服务器间的远程过程调用(RPC)。要共享或者挂载 NFS 文件系统,下列服务根据所使用的 NFS 版本而定:

nfsd
为共享 NFS 文件系统请求的 NFS 服务器内核模块。
rpcbind
接受本地 RPC 服务的端口保留。这些端口随后可用(或公布出去),这样相应的远程 RPC 服务可以访问它们。rpcbind 服务响应对 RPC 服务的请求,并建立到请求的 RPC 服务的连接。这不能与 NFSv4 一起使用。
rpc.mountd
NFS 服务器使用这个进程来处理来自 NFSv3 客户端的 MOUNT 请求。它检查所请求的 NFS 共享是否目前由 NFS 服务器导出,并且允许客户端访问它。如果允许挂载请求,nfs-mountd 服务会回复 Success 状态,并将此 NFS 共享的文件句柄返回给 NFS 客户端。
rpc.nfsd
这个过程启用了要定义的服务器公告的显式 NFS 版本和协议。它与 Linux 内核一起使用,来满足 NFS 客户端的动态需求,例如,在每次连接 NFS 客户端时提供服务器线程。这个进程对应于 nfs-server 服务。
lockd
这是一个在客户端和服务器中运行的内核线程。它实现网络锁管理器(NLM)协议,它允许 NFSv3 客户端锁住服务器上的文件。每当运行 NFS 服务器以及挂载 NFS 文件系统时,它会自动启动。
rpc.statd
这个进程实现网络状态监控器(NSM)RPC 协议,该协议可在 NFS 服务器没有正常关机而重启时通知 NFS 客户端。rpc-statd 服务由 nfs-server 服务自动启动,不需要用户配置。这不能与 NFSv4 一起使用。
rpc.rquotad
这个过程为远程用户提供用户配额信息。启动 nfs-server 时,用户也必须启动 quota-rpc 软件包提供的 rpc-rquotad 服务。
rpc.idmapd

此进程为 NFSv4 客户端和服务器提供上行调用,这些调用在线上 NFSv4 名称(user@domain形式的字符串)和本地 UID 和 GID 之间进行映射。要使 idmapd 与 NFSv4 正常工作,必须配置 /etc/idmapd.conf 文件。至少应指定 Domain 参数,该参数定义 NFSv4 映射域。如果 NFSv4 映射域与 DNS 域名相同,可以跳过这个参数。客户端和服务器必须同意 NFSv4 映射域才能使 ID 映射正常工作。

只有 NFSv4 服务器使用 rpc.idmapd,它由 nfs-idmapd 服务启动。NFSv4 客户端使用基于密钥环的 nfsidmap 工具,内核按需调用它来执行 ID 映射。如果 nfsidmap 有问题,客户端将退回使用 rpc.idmapd

NFSv4 的 RPC 服务

挂载和锁定协议已合并到 NFSv4 协议中。该服务器还会监听已知的 TCP 端口 2049。因此,NFSv4 不需要与 rpcbindlockdrpc-statd 服务进行交互。NFS 服务器上仍然需要 nfs-mountd 服务来设置导出,但不涉及任何线上操作。

4.5. NFS 主机名格式

这部分论述了在挂载或导出 NFS 共享时用来指定主机的不同格式。

您可以使用以下格式指定主机:

单台机器

以下任意一种:

  • 完全限定域名(可由服务器解析)
  • 主机名(可由服务器解析)
  • IP 地址。
IP 网络

以下格式之一有效:

  • a.b.c.d/z ,其中 a.b.c.d 是网络,z 是子网掩码中的位数,例如 192.168.0.0/24
  • a.b.c.d/netmask,其中 a.b.c.d 是网络,netmask 是子网掩码;例如 192.168.100.8/255.255.255.0
Netgroups
@group-name 格式,其中 group-name 是 NIS netgroup 名称。

4.6. NFS 服务器配置

这部分论述了在 NFS 服务器中配置导出的语法和选项:

  • 手动编辑 /etc/exports 配置文件
  • 在命令行上使用 exportfs 工具

4.6.1. /etc/exports 配置文件

/etc/exports 文件控制哪些文件系统被导出到远程主机,并指定选项。它遵循以下语法规则:

  • 空白行将被忽略。
  • 要添加注释,以井号(#)开始一行。
  • 您可以使用反斜杠(\)换行长行。
  • 每个导出的文件系统都应该独立。
  • 所有在导出的文件系统后放置的授权主机列表都必须用空格分开。
  • 每个主机的选项必须在主机标识符后直接放在括号中,没有空格分离主机和第一个括号。
导出条目

导出的文件系统的每个条目都有以下结构:

export host(options)

您还可以指定多个主机以及每个主机的特定选项。要做到这一点,在同一行中列出主机列表(以空格分隔),每个主机名带有其相关的选项(在括号中),如下所示:

export host1(options1) host2(options2) host3(options3)

在这个结构中:

export
导出的目录
主机
导出要共享的主机或网络
选项
用于主机的选项

例 4.1. 一个简单的 /etc/exports 文件

在最简单的形式中,/etc/exports 文件只指定导出的目录和允许访问它的主机:

/exported/directory bob.example.com

这里,bob.example.com 可以挂载 NFS 服务器的 /exported/directory/。因为在这个示例中没有指定选项,所以 NFS 使用默认选项。

重要

/etc/exports 文件的格式要求非常精确,特别是在空格字符的使用方面。需要将导出的文件系统与主机、不同主机间使用空格分隔。但是,除了注释行外,文件中不应该包括其他空格。

例如,下面两行并不具有相同的意义:

/home bob.example.com(rw)
/home bob.example.com (rw)

第一行仅允许来自 bob.example.com 的用户读写 /home 目录。第二行允许来自 bob.example.com 的用户以只读方式挂载目录(默认),而其他用户可以将其挂载为读/写。

默认选项

导出条目的默认选项有:

ro
导出的文件系统是只读的。远程主机无法更改文件系统中共享的数据。要允许主机更改文件系统(即读写),指定 rw 选项。
sync
在将之前的请求所做的更改写入磁盘前,NFS 服务器不会回复请求。要启用异步写,请指定 async 选项。
wdelay
如果 NFS 服务器预期另外一个写入请求即将发生,则 NFS 服务器会延迟写入磁盘。这可以提高性能,因为它可减少不同的写命令访问磁盘的次数,从而减少写开销。要禁用此功能,请指定 no_wdelay 选项,该选项仅在指定了默认 sync 选项时才可用。
root_squash

这可以防止远程连接的 root 用户(与本地连接相反)具有 root 特权;相反,NFS 服务器为他们分配用户 ID nobody。这可以有效地将远程 root 用户的权限"挤压"成最低的本地用户,从而防止在远程服务器上可能的未经授权的写操作。要禁用 root 挤压,请指定 no_root_squash 选项。

要挤压每个远程用户(包括 root 用户),请使用 all_squash 选项。要指定 NFS 服务器应该分配给来自特定主机的远程用户的用户和组 ID,请分别使用 anonuidanongid 选项,如下所示:

export host(anonuid=uid,anongid=gid)

这里,uidgid 分别是用户 ID 号和组 ID 号。anonuidanongid 选项允许您为要共享的远程 NFS 用户创建特殊的用户和组帐户。

默认情况下,Red Hat Enterprise Linux 下的 NFS 支持访问控制列表(ACL)。要禁用此功能,请在导出文件系统时指定 no_acl 选项。

默认和覆盖选项

每个导出的文件系统的默认值都必须被显式覆盖。例如,如果没有指定 rw 选项,则导出的文件系统将以只读形式共享。以下是 /etc/exports 中的示例行,其覆盖两个默认选项:

/another/exported/directory 192.168.0.3(rw,async)

在此示例中,192.168.0.3 可以以读写形式挂载 /another/exported/directory/ ,并且所有对磁盘的写入都是异步的。

4.6.2. exportfs 工具

exportfs 工具使 root 用户能够有选择地导出或取消导出目录,而无需重启 NFS 服务。给定合适的选项后,exportfs 工具将导出的文件系统写到 /var/lib/nfs/xtab。由于 nfs-mountd 服务在决定访问文件系统的特权时参考 xtab 文件,所以对导出的文件系统列表的更改会立即生效。

常用的 exportfs 选项

以下是用于 exportfs 的常用选项列表:

-r
通过在 /var/lib/nfs/etab 中构建新的导出列表,将 /etc/exports 中列出的所有目录导出。如果对 /etc/exports 做了任何更改,这个选项可以有效地刷新导出列表。
-a
根据哪些其它选项传给了 exportfs,将导出或取消导出所有目录。如果没有指定其他选项,exportfs 会导出 /etc/exports 中指定的所有文件系统。
-o file-systems
指定没有在 /etc/exports 中列出的要导出的目录。使用要导出的额外文件系统替换 file-systems。这些文件系统的格式化方式必须与 /etc/exports 中指定的方式相同。此选项通常用于在将其永久添加到导出的文件系统列表之前测试导出的文件系统。
-i
忽略 /etc/exports ;只有命令行上指定的选项才会用于定义导出的文件系统。
-u
不导出所有共享目录。命令 exportfs -ua 可暂停 NFS 文件共享,同时保持所有 NFS 服务正常运行。要重新启用 NFS 共享,请使用 exportfs -r
-v
详细操作,当执行 exportfs 命令时,更详细地显示正在导出的或取消导出的文件系统。

如果没有选项传给 exportfs 工具,它将显示当前导出的文件系统列表。

其它资源

4.7. NFS 和 rpcbind

本节解释 NFSv3 所需的 rpcbind 服务的用途。

rpcbind 服务将远程过程调用(RPC)服务映射到其侦听的端口。RPC 进程在启动时通知 rpcbind,注册它们正在侦听的端口以及它们期望提供服务的 RPC 程序号。然后,客户端系统会使用特定的 RPC 程序号联系服务器上的 rpcbindrpcbind 服务将客户端重定向到正确的端口号,这样它就可以与请求的服务进行通信。

由于基于 RPC 的服务依赖 rpcbind 来与所有传入的客户端请求建立连接,因此 rpcbind 必须在这些服务启动之前可用。

rpcbind 的访问控制规则会影响所有基于 RPC 的服务。另外,也可以为每个 NFS RPC 守护进程指定访问控制规则。

其它资源

  • rpc.mountd(8) man page
  • rpc.statd(8) man page

4.8. 安装 NFS

这个过程安装挂载或导出 NFS 共享所需的所有软件包。

流程

  • 安装 nfs-utils 软件包:

    # dnf install nfs-utils

4.9. 启动 NFS 服务器

这个步骤描述了如何启动 NFS 服务器,这是导出 NFS 共享所必需的。

先决条件

  • 对于支持 NFSv3 连接的服务器,rpcbind 服务必须处于运行状态。要验证 rpcbind 是否处于活动状态,请使用以下命令:

    $ systemctl status rpcbind

    如果停止该服务,启动并启用该服务:

    $ systemctl enable --now rpcbind

流程

  • 要启动 NFS 服务器,并使其在引导时自动启动,请使用以下命令:

    # systemctl enable --now nfs-server

4.10. NFS 和 rpcbind 故障排除

由于 rpcbind 服务在 RPC 服务和用于与之通信的端口号之间提供协调,因此在排除故障时,使用 rpcbind 查看当前 RPC 服务的状态非常有用。rpcinfo 工具显示每个基于 RPC 的服务,以及其端口号、RPC 程序号、版本号和 IP 协议类型(TCP 或 UDP)。

流程

  1. 要确保为 rpcbind 启用了正确的基于 NFS RPC 的服务,请使用以下命令:

    # rpcinfo -p

    例 4.2. rpcinfo -p 命令输出

    下面是一个这个命令的输出示例:

       program vers proto   port  service
        100000    4   tcp    111  portmapper
        100000    3   tcp    111  portmapper
        100000    2   tcp    111  portmapper
        100000    4   udp    111  portmapper
        100000    3   udp    111  portmapper
        100000    2   udp    111  portmapper
        100005    1   udp  20048  mountd
        100005    1   tcp  20048  mountd
        100005    2   udp  20048  mountd
        100005    2   tcp  20048  mountd
        100005    3   udp  20048  mountd
        100005    3   tcp  20048  mountd
        100024    1   udp  37769  status
        100024    1   tcp  49349  status
        100003    3   tcp   2049  nfs
        100003    4   tcp   2049  nfs
        100227    3   tcp   2049  nfs_acl
        100021    1   udp  56691  nlockmgr
        100021    3   udp  56691  nlockmgr
        100021    4   udp  56691  nlockmgr
        100021    1   tcp  46193  nlockmgr
        100021    3   tcp  46193  nlockmgr
        100021    4   tcp  46193  nlockmgr

    如果其中一个 NFS 服务没有正确启动,rpcbind 将不能将来自客户端的对该服务的 RPC 请求映射到正确的端口。

  2. 在很多情况下,如果 NFS 没有出现在 rpcinfo 输出中,重启 NFS 会使服务正确使用 rpcbind 注册,并开始工作:

    # systemctl restart nfs-server

4.11. 将 NFS 服务器配置为在防火墙后运行

NFS 需要 rpcbind 服务,该服务为 RPC 服务动态分配端口,并可能导致配置防火墙规则时出现问题。下面的部分描述了如何在防火墙后配置 NFS 版本(如果要支持):

  • NFSv3

    这包括支持 NFSv3 的任何服务器:

    • NFSv3-only 服务器
    • 支持 NFSv3 和 NFSv4 的服务器
  • 只使用 NFSv4

4.11.1. 将 NFSv3-enabled 服务器配置为在防火墙后运行

下面的步骤描述了如何将支持 NFSv3 的服务器配置为在防火墙后运行。这包括支持 NFSv3 和 NFSv4 的 NFSv3-only 服务器和服务器。

流程

  1. 要允许客户端访问防火墙后面的 NFS 共享,请在 NFS 服务器上运行以下命令来配置防火墙:

    firewall-cmd --permanent --add-service mountd
    firewall-cmd --permanent --add-service rpc-bind
    firewall-cmd --permanent --add-service nfs
  2. 指定 /etc/nfs.conf 文件中 RPC 服务 nlockmgr 使用的端口,如下所示:

    [lockd]
    
    port=tcp-port-number
    udp-port=udp-port-number

    或者,您可以在 /etc/modprobe.d/lockd.conf 文件中指定 nlm_tcpportnlm_udpport

  3. 在 NFS 服务器中运行以下命令打开防火墙中指定的端口:

    firewall-cmd --permanent --add-port=<lockd-tcp-port>/tcp
    firewall-cmd --permanent --add-port=<lockd-udp-port>/udp
  4. 通过编辑 /etc/nfs.conf 文件的 [statd] 部分为 rpc.statd 添加静态端口,如下所示:

    [statd]
    
    port=port-number
  5. 在 NFS 服务器中运行以下命令,在防火墙中打开添加的端口:

    firewall-cmd --permanent --add-port=<statd-tcp-port>/tcp
    firewall-cmd --permanent --add-port=<statd-udp-port>/udp
  6. 重新载入防火墙配置:

    firewall-cmd --reload
  7. 首先重启 rpc-statd 服务,然后重启 nfs-server 服务:

    # systemctl restart rpc-statd.service
    # systemctl restart nfs-server.service

    或者,如果您在 /etc/modprobe.d/ lockd.conf 文件中指定锁定端口:

    1. 更新 /proc/sys/fs/nfs/nlm_tcpport/proc/sys/fs/nfs/nlm_udpport 的当前值:

      # sysctl -w fs.nfs.nlm_tcpport=<tcp-port>
      # sysctl -w fs.nfs.nlm_udpport=<udp-port>
    2. 重启 rpc-statdnfs-server 服务:

      # systemctl restart rpc-statd.service
      # systemctl restart nfs-server.service

4.11.2. 将只使用 NFSv4 的服务器配置为在防火墙后运行

下面的步骤描述了如何将只使用 NFSv4 的服务器配置为在防火墙后运行。

流程

  1. 要允许客户端在防火墙后访问 NFS 共享,在 NFS 服务器中运行以下命令配置防火墙:

    firewall-cmd --permanent --add-service nfs
  2. 重新载入防火墙配置:

    firewall-cmd --reload
  3. 重启 nfs-server:

    # systemctl restart nfs-server

4.11.3. 将 NFSv3 客户端配置为在防火墙后运行

将 NFSv3 客户端配置为在防火墙后运行的步骤类似于将 NFSv3 服务器配置为在防火墙后运行。

如果您要配置的机器既是 NFS 客户端和服务器,请按照 将 NFSv3-enabled 服务器配置为在防火墙后运行 中所述的步骤进行。

以下流程描述了如何配置只在防火墙后运行的 NFS 客户端的机器。

流程

  1. 要在客户端位于防火墙后允许 NFS 客户端对 NFS 客户端执行回调,请在 NFS 客户端上运行以下命令将 rpc-bind 服务添加到防火墙中:

    firewall-cmd --permanent --add-service rpc-bind
  2. 指定 /etc/nfs.conf 文件中 RPC 服务 nlockmgr 使用的端口,如下所示:

    [lockd]
    
    port=port-number
    udp-port=upd-port-number

    或者,您可以在 /etc/modprobe.d/lockd.conf 文件中指定 nlm_tcpportnlm_udpport

  3. 在 NFS 客户端中运行以下命令打开防火墙中指定的端口:

    firewall-cmd --permanent --add-port=<lockd-tcp-port>/tcp
    firewall-cmd --permanent --add-port=<lockd-udp-port>/udp
  4. 通过编辑 /etc/nfs.conf 文件的 [statd] 部分为 rpc.statd 添加静态端口,如下所示:

    [statd]
    
    port=port-number
  5. 在 NFS 客户端中运行以下命令,在防火墙中打开添加的端口:

    firewall-cmd --permanent --add-port=<statd-tcp-port>/tcp
    firewall-cmd --permanent --add-port=<statd-udp-port>/udp
  6. 重新载入防火墙配置:

    firewall-cmd --reload
  7. 重启 rpc-statd 服务:

    # systemctl restart rpc-statd.service

    或者,如果您在 /etc/modprobe.d/ lockd.conf 文件中指定锁定端口:

    1. 更新 /proc/sys/fs/nfs/nlm_tcpport/proc/sys/fs/nfs/nlm_udpport 的当前值:

      # sysctl -w fs.nfs.nlm_tcpport=<tcp-port>
      # sysctl -w fs.nfs.nlm_udpport=<udp-port>
    2. 重启 rpc-statd 服务:

      # systemctl restart rpc-statd.service

4.11.4. 将 NFSv4 客户端配置为在防火墙后运行

仅在客户端使用 NFSv4.0 时执行此步骤。在这种情况下,需要为 NFSv4.0 回调打开端口。

NFSv4.1 或更高版本不需要这个过程,因为在后续协议版本中,服务器在客户端发起的同一连接上执行回调。

流程

  1. 要允许 NFSv4.0 回调通过防火墙,请设置 /proc/sys/fs/nfs_callback_tcpport 并允许服务器连接到客户端上的该端口,如下所示:

    # echo "fs.nfs.nfs_callback_tcpport = <callback-port>" >/etc/sysctl.d/90-nfs-callback-port.conf
    # sysctl -p /etc/sysctl.d/90-nfs-callback-port.conf
  2. 在 NFS 客户端中运行以下命令打开防火墙中指定的端口:

    firewall-cmd --permanent --add-port=<callback-port>/tcp
  3. 重新载入防火墙配置:

    firewall-cmd --reload

4.12. 通过防火墙导出 RPC 配额

如果您导出使用磁盘配额的文件系统,您可以使用配额远程过程调用(RPC)服务来给 NFS 客户端提供磁盘配额数据。

流程

  1. 启用并启动 rpc-rquotad 服务:

    # systemctl enable --now rpc-rquotad
    注意

    如果启用了 rpc-rquotad 服务,其会在启动 nfs-server 服务后自动启动。

  2. 为了使配额 RPC 服务可在防火墙后访问,需要打开 TCP(如果启用了 UDP,则为 UDP)端口 875。默认端口号定义在 /etc/services 文件中。

    您可以通过将 -p port-number 附加到 /etc/sysconfig/rpc-rquotad 文件中的 RPCRQUOTADOPTS 变量来覆盖默认端口号。

  3. 默认情况下,远程主机只能读配额。如果要允许客户端设置配额,请将 -S 选项附加到 /etc/sysconfig/rpc-rquotad 文件中的 RPCRQUOTADOPTS 变量中。
  4. 重启 rpc-rquotad ,以使 /etc/sysconfig/rpc-rquotad 文件中的更改生效:

    # systemctl restart rpc-rquotad

4.13. 启用通过 RDMA(NFSoRDMA) 的 NFS

如果存在支持 RDMA 的硬件,则在 Red Hat Enterprise Linux 9 中,远程直接内存访问(RDMA)服务会自动工作。

流程

  1. 安装 rdma-core 软件包:

    # dnf install rdma-core
  2. 重启 nfs-server 服务:

    # systemctl restart nfs-server

其它资源

4.14. 其它资源

第 5 章 配置只使用 NFSv4 的服务器

作为 NFS 服务器管理员,您可以配置 NFS 服务器来仅支持 NFSv4,这可最大程度地减少系统上开放端口的数量和运行的服务。

5.1. 只使用 NFSv4 的服务器的好处和缺陷

这部分论述了将 NFS 服务器配置为只支持 NFSv4 的优点和缺陷。

默认情况下,NFS 服务器在 Red Hat Enterprise Linux 9 中支持 NFSv3 和 NFSv4 连接。但是,您还可以将 NFS 配置为只支持 NFS 版本 4.0 及更新的版本。这可最大限度地减少系统上打开的端口的数量和运行的服务,因为 NFSv4 不需要 rpcbind 服务来侦听网络。

当您的 NFS 服务器配置为仅使用 NFSv4 时,尝试使用 NFSv3 挂载共享的客户端会失败,并显示类似如下的错误:

Requested NFS version or transport protocol is not supported.

另外,您还可以禁用对 RPCBINDMOUNTNSM 协议调用的监听,这在仅使用 NFSv4 的情况下不需要。

禁用这些额外选项的影响有:

  • 试图使用 NFSv3 从服务器挂载共享的客户端变得无响应。
  • NFS 服务器本身无法挂载 NFSv3 文件系统。

5.2. 将 NFS 服务器配置为只支持 NFSv4

这个步骤描述了如何配置 NFS 服务器来支持 NFS 版本 4.0 及更新的版本。

流程

  1. 通过在 /etc/nfs.conf 配置文件的 [nfsd] 部分添加以下行来禁用 NFSv3:

    [nfsd]
    
    vers3=no
  2. (可选)禁用对 RPCBINDMOUNTNSM 协议调用的监听,在仅使用 NFSv4 情况下不需要这些调用。禁用相关服务:

    # systemctl mask --now rpc-statd.service rpcbind.service rpcbind.socket
  3. 重启 NFS 服务器:

    # systemctl restart nfs-server

一旦启动或重启 NFS 服务器,这些改变就会生效。

5.3. 验证只读 NFSv4 配置

这个流程描述了如何使用 netstat 工具来验证您的 NFS 服务器是否是在仅使用 NFSv4 模式下配置的。

流程

  • 使用 netstat 工具列出侦听 TCP 和 UDP 协议的服务:

    # netstat --listening --tcp --udp

    例 5.1. 仅使用 NFSv4 服务器上的输出

    以下是仅使用 NFSv4 服务器上 netstat 输出的示例;也禁用了对 RPCBINDMOUNTNSM 的侦听。这里,nfs 是唯一侦听 NFS 的服务:

    # netstat --listening --tcp --udp
    
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
    tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN
    tcp        0      0 0.0.0.0:nfs             0.0.0.0:*               LISTEN
    tcp6       0      0 [::]:ssh                [::]:*                  LISTEN
    tcp6       0      0 [::]:nfs                [::]:*                  LISTEN
    udp        0      0 localhost.locald:bootpc 0.0.0.0:*

    例 5.2. 配置仅使用 NFSv4 服务器前的输出

    相比之下,在配置仅使用 NFSv4 服务器前,netstat 输出中包含 sunrpcmountd 服务:

    # netstat --listening --tcp --udp
    
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address State
    tcp        0      0 0.0.0.0:ssh             0.0.0.0:*       LISTEN
    tcp        0      0 0.0.0.0:40189           0.0.0.0:*       LISTEN
    tcp        0      0 0.0.0.0:46813           0.0.0.0:*       LISTEN
    tcp        0      0 0.0.0.0:nfs             0.0.0.0:*       LISTEN
    tcp        0      0 0.0.0.0:sunrpc          0.0.0.0:*       LISTEN
    tcp        0      0 0.0.0.0:mountd          0.0.0.0:*       LISTEN
    tcp6       0      0 [::]:ssh                [::]:*          LISTEN
    tcp6       0      0 [::]:51227              [::]:*          LISTEN
    tcp6       0      0 [::]:nfs                [::]:*          LISTEN
    tcp6       0      0 [::]:sunrpc             [::]:*          LISTEN
    tcp6       0      0 [::]:mountd             [::]:*          LISTEN
    tcp6       0      0 [::]:45043              [::]:*          LISTEN
    udp        0      0 localhost:1018          0.0.0.0:*
    udp        0      0 localhost.locald:bootpc 0.0.0.0:*
    udp        0      0 0.0.0.0:mountd          0.0.0.0:*
    udp        0      0 0.0.0.0:46672           0.0.0.0:*
    udp        0      0 0.0.0.0:sunrpc          0.0.0.0:*
    udp        0      0 0.0.0.0:33494           0.0.0.0:*
    udp6       0      0 [::]:33734              [::]:*
    udp6       0      0 [::]:mountd             [::]:*
    udp6       0      0 [::]:sunrpc             [::]:*
    udp6       0      0 [::]:40243              [::]:*

第 6 章 保护 NFS

为最大程度地降低 NFS 安全风险并保护服务器上的数据,在服务器上导出 NFS 文件系统或将其挂载到客户端上时,请考虑以下部分:

6.1. 带有 AUTH_SYS 和导出控制的 NFS 安全性

NFS 提供以下传统选项来控制对导出文件的访问:

  • 服务器限制哪些主机可以通过 IP 地址或主机名挂载哪些文件系统。
  • 服务器对 NFS 客户端上的用户强制执行文件系统权限的方式与对本地用户强制执行权限的方式相同。传统上,NFS 使用 AUTH_SYS 调用消息(也称为 AUTH_UNIX)来执行此操作,该消息依赖于客户端来声明用户的 UID 和 GID。请注意,这意味着恶意或者错误配置的客户端可能会轻松地利用这个问题,导致用户可以访问不应该被访问的文件。

为限制潜在的风险,管理员通常将访问权限限制为只读或将用户权限挤压成普通用户和组 ID。不幸的是,这些解决方案会阻止 NFS 共享以最初预期的方式使用。

另外,如果攻击者获得了对导出 NFS 文件系统的系统所使用的 DNS 服务器的控制,它们可将与特定主机名或完全限定域名关联的系统指向未授权的机器。此时,未经授权的机器 允许挂载 NFS 共享的系统,因为没有交换用户名或密码信息来为 NFS 挂载提供额外的安全。

在通过 NFS 导出目录时应谨慎使用通配符,因为通配符的范围可能包含比预期更多的系统。

其它资源

  • 要保护 NFS 和 rpcbind,例如,可使用 nftablesfirewalld
  • nft(8) man page
  • firewalld-cmd(1) man page

6.2. 带有 AUTH_GSS 的 NFS 安全性

NFS 的所有版本都支持 RPCSEC_GSS 和 Kerberos 机制。

与 AUTH_SYS 不同,使用 RPCSEC_GSS Kerberos 机制,服务器不依赖于客户端就可以正确地表示哪个用户正在访问文件。相反,加密用于向服务器验证用户的身份,这可防止恶意的客户端在没有用户的 Kerberos 凭据的情况下模拟该用户。使用 RPCSEC_GSS Kerberos 机制是保护挂载的最直接方法,因为配置了 Kerberos 后不需要额外的设置。

6.3. 配置 NFS 服务器和客户端使用 Kerberos

Kerberos 是一种网络身份验证系统,其允许客户端和服务器使用对称加密和信任的第三方 KDC 来互相进行身份验证。红帽建议使用身份管理(IdM)来设置 Kerberos。

先决条件

  • Kerberos 密钥分发中心(KDC)已安装和配置 。

流程

    • 在 NFS 服务器端创建 nfs/hostname.domain@REALM 主体。
    • 在服务器和客户端端创建 host/hostname.domain@REALM 主体。
    • 将对应的密钥添加到客户端和服务器的 keytab 中。
  1. 在服务器端,使用 sec= 选项来启用所想要的安全类别。启用所有安全类型和非加密挂载:

    /export *(sec=sys:krb5:krb5i:krb5p)

    sec= 选项一起使用的有效安全类型为:

    • sys: 无加密保护,默认值
    • krb5 :仅用于验证
    • krb5i :完整性保护

      • 使用 Kerberos V5 进行用户身份验证,并使用安全校验和执行 NFS 操作的完整性检查,以防止数据篡改。
    • krb5p :隐私保护

      • 使用 Kerberos V5 进行用户身份验证、完整性检查及加密 NFS 流量以防止流量嗅探。这是最安全的设置,但它也会涉及最大的性能开销。
  2. 在客户端,将 sec=krb5 (或 sec=krb5isec=krb5p,取决于设置 )添加到挂载选项:

    # mount -o sec=krb5 server:/export /mnt

其它资源

6.4. NFSv4 安全选项

NFSv4 包括基于 Microsoft Windows NT 模型,而非 POSIX 模型的 ACL 支持,因为 Microsoft Windows NT 模型的功能和广泛的部署。

NFSv4 的另一个重要安全功能是,对挂载文件系统删除了 MOUNT 协议的使用。MOUNT 协议存在安全风险,因为协议处理文件句柄的方式。

6.5. 挂载的 NFS 导出的文件权限

远程主机一旦将 NFS 文件系统挂载为读取或读写,则保护每个共享文件的唯一方法就是其权限。如果共享同一用户 ID 值的两个用户在不同的客户端系统上挂载相同的 NFS 文件系统,他们可以修改彼此的文件。此外,在客户端系统上以 root 身份登录的任何人都可以使用 su - 命令来访问 NFS 共享的任何文件。

默认情况下,Red Hat Enterprise Linux 的 NFS 支持访问控制列表(ACL)。红帽建议启用此功能。

默认情况下,NFS 在导出文件系统时使用 root squashing。这会将本地机器上以 root 用户身份访问 NFS 共享的任何人的用户 ID 设为 nobody。Root squashing 由默认选项 root_squash 控制;有关此选项的更多信息,请参阅 NFS 服务器配置

将 NFS 共享导出为只读时,请考虑使用 all_squash 选项。这个选项使访问导出的文件系统的每个用户都使用 nobody 用户的用户 ID。

第 7 章 在 NFS 中启用 pNFS SCSI 布局

您可以将 NFS 服务器和客户端配置为使用 pNFS SCSI 布局访问数据。

先决条件

  • 客户端和服务器必须能够向同一个块设备发送 SCSI 命令。就是说块设备必须位于共享的 SCSI 总线中。
  • 块设备必须包含 XFS 文件系统。
  • SCSI 设备必须支持 SCSI Persistent Reservations,如 SCSI-3 Ppriary Commands 规格中所述。

7.1. pNFS 技术

pNFS 构架提高了 NFS 的可伸缩性。当服务器实现 pNFS 时,客户端可以同时通过多个服务器访问数据。这可提高性能。

pNFS 支持 RHEL 中的以下存储协议或布局:

  • 文件
  • Flexfiles
  • SCSI

7.2. pNFS SCSI 布局

SCSI 布局基于 pNFS 块布局的工作。布局在 SCSI 设备中定义。它包含一系列固定大小的块来作为逻辑单元(LU),这些逻辑单元必须能够支持 SCSI 持久保留。LU 设备识别通过其 SCSI 设备识别。

在涉及长时间的单客户端访问文件的用例中,pNFS SCSI 表现良好。例如:邮件服务器或者虚拟机。

客户端和服务器间的操作

当 NFS 客户端从文件读取或写入文件时,客户端会执行 LAYOUTGET 操作。服务器会使用文件在 SCSI 设备中的位置进行响应。客户端可能需要执行 GETDEVICEINFO 的额外操作,以确定要使用哪个 SCSI 设备。如果这些操作正常工作,客户端可以直接向 SCSI 设备发出 I/O 请求,而不必向服务器发送 READWRITE 操作。

客户端之间的错误或争用可能会导致服务器重新调用布局,或者不将它们发送给客户端。在这些情况下,客户端回退到向服务器发出 READWRITE 操作,而不是直接向 SCSI 设备发送 I/O 请求。

要监控操作,请参阅 监控 pNFS SCSI 布局功能

设备保留

pNFS SCSI 通过分配保留来处理保护。在服务器向客户端发送布局之前,它会保留 SCSI 设备,以确保只有注册的客户端才可以访问该设备。如果客户端可以向那个 SCSI 设备发送命令,但没有在该设备上注册,那么该设备上的客户端的许多操作都会失败。例如,如果服务器没有向客户端提供该设备的布局,则客户端上的 blkid 命令将无法显示 XFS 文件系统的 UUID。

服务器不会删除其自身的持久性保留。这样可在重启客户端和服务器后保护该设备中的文件系统中的数据。为了重新使用 SCSI 设备,您可能需要手动删除 NFS 服务器中的持久性保留。

7.3. 检查与 pNFS 兼容的 SCSI 设备

这个过程检查 SCSI 设备是否支持 pNFS SCSI 布局。

先决条件

  • 安装 sg3_utils 软件包:

    # dnf install sg3_utils

流程

  • 在服务器和客户端中检查正确的 SCSI 设备支持:

    # sg_persist --in --report-capabilities --verbose path-to-scsi-device

    确保设置了 Persist Through Power Los Active (PTPL_A)位。

    例 7.1. 支持 pNFS SCSI 的 SCSI 设备

    以下是支持 pNFS SCSI 的 SCSI 设备的 sg_persist 输出示例。PTPL_A 位报告 1

        inquiry cdb: 12 00 00 00 24 00
        Persistent Reservation In cmd: 5e 02 00 00 00 00 00 20 00 00
      LIO-ORG   block11           4.0
      Peripheral device type: disk
    Report capabilities response:
      Compatible Reservation Handling(CRH): 1
      Specify Initiator Ports Capable(SIP_C): 1
      All Target Ports Capable(ATP_C): 1
      Persist Through Power Loss Capable(PTPL_C): 1
      Type Mask Valid(TMV): 1
      Allow Commands: 1
      Persist Through Power Loss Active(PTPL_A): 1
        Support indicated in Type mask:
          Write Exclusive, all registrants: 1
          Exclusive Access, registrants only: 1
          Write Exclusive, registrants only: 1
          Exclusive Access: 1
          Write Exclusive: 1
          Exclusive Access, all registrants: 1

其它资源

  • sg_persist(8) man page

7.4. 在服务器中设置 pNFS SCSI

这个过程将 NFS 服务器配置为导出 pNFS SCSI 布局。

流程

  1. 在服务器中挂载在 SCSI 设备中创建的 XFS 文件系统。
  2. 将 NFS 服务器配置为导出 NFS 版本 4.1 或更高版本。在 /etc/nfs.conf 文件的 [nfsd] 部分设置以下选项:

    [nfsd]
    
    vers4.1=y
  3. 配置 NFS 服务器,来使用 pnfs 选项通过 NFS 导出 XFS 文件系统:

    例 7.2. /etc/exports 中的条目导出 pNFS SCSI

    /etc/exports 配置文件中的以下条目将挂载于 /exported/directory/ 的文件系统导出到 allowed.example.com 客户端,来作为 pNFS SCSI 布局:

    /exported/directory allowed.example.com(pnfs)

其它资源

7.5. 在客户端中设置 pNFS SCSI

这个过程将 NFS 客户端配置为挂载 pNFS SCSI 布局。

先决条件

流程

  • 在客户端中使用 NFS 版本 4.1 或更高版本挂载导出的 XFS 文件系统:

    # mount -t nfs -o nfsvers=4.1 host:/remote/export /local/directory

    不要在没有 NFS 的情况下直接挂载 XFS 文件系统。

其它资源

7.6. 在服务器中释放 pNFS SCSI 保留

此流程释放 NFS 服务器在 SCSI 设备中拥有的持久保留。这可让您在不再需要导出 pNFS SCSI 时重新使用 SCSI 设备。

您必须从服务器中删除保留。它不能从不同的 IT Nexus 中删除。

先决条件

  • 安装 sg3_utils 软件包:

    # dnf install sg3_utils

流程

  1. 在服务器上查询现有保留:

    # sg_persist --read-reservation path-to-scsi-device

    例 7.3. 在 /dev/sda 中查询保留

    # *sg_persist --read-reservation /dev/sda*
    
      LIO-ORG   block_1           4.0
      Peripheral device type: disk
      PR generation=0x8, Reservation follows:
        Key=0x100000000000000
        scope: LU_SCOPE,  type: Exclusive Access, registrants only
  2. 删除服务器上的现有注册:

    # sg_persist --out \
                 --release \
                 --param-rk=reservation-key \
                 --prout-type=6 \
                 path-to-scsi-device

    例 7.4. 删除 /dev/sda 中的保留

    # sg_persist --out \
                 --release \
                 --param-rk=0x100000000000000 \
                 --prout-type=6 \
                 /dev/sda
    
      LIO-ORG   block_1           4.0
      Peripheral device type: disk

其它资源

  • sg_persist(8) man page

第 8 章 监控 pNFS SCSI 布局功能

您可以监控 pNFS 客户端和服务器是否交换正确的 pNFS SCSI 操作,或者它们是否回退到常规的 NFS 操作。

先决条件

  • 配置了 pNFS SCSI 客户端和服务器。

8.1. 使用 nfsstat 从服务器检查 pNFS SCSI 操作

这个流程使用 nfsstat 工具来监控服务器的 pNFS SCSI 操作。

流程

  1. 监控服务器中服务的操作:

    # watch --differences \
            "nfsstat --server | egrep --after-context=1 read\|write\|layout"
    
    Every 2.0s: nfsstat --server | egrep --after-context=1 read\|write\|layout
    
    putrootfh    read         readdir      readlink     remove	 rename
    2         0% 0         0% 1         0% 0         0% 0         0% 0         0%
    --
    setcltidconf verify	  write        rellockowner bc_ctl	 bind_conn
    0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
    --
    getdevlist   layoutcommit layoutget    layoutreturn secinfononam sequence
    0         0% 29        1% 49        1% 5         0% 0         0% 2435     86%
  2. 客户端和服务器在以下情况下使用 pNFS SCSI 操作:

    • layoutgetlayoutreturnlayoutcommit 计数器递增。这意味着服务器提供布局。
    • 服务器 计数器不会递增。这意味着客户端正在直接向 SCSI 设备执行 I/O 请求。

8.2. 使用 mountstats 检查客户端中的 pNFS SCSI 操作

这个流程使用 /proc/self/mountstats 文件来监控客户端的 pNFS SCSI 操作。

流程

  1. 列出每个挂载的操作计数器:

    # cat /proc/self/mountstats \
          | awk /scsi_lun_0/,/^$/ \
          | egrep device\|READ\|WRITE\|LAYOUT
    
    device 192.168.122.73:/exports/scsi_lun_0 mounted on /mnt/rhel7/scsi_lun_0 with fstype nfs4 statvers=1.1
        nfsv4:  bm0=0xfdffbfff,bm1=0x40f9be3e,bm2=0x803,acl=0x3,sessions,pnfs=LAYOUT_SCSI
                READ: 0 0 0 0 0 0 0 0
               WRITE: 0 0 0 0 0 0 0 0
            READLINK: 0 0 0 0 0 0 0 0
             READDIR: 0 0 0 0 0 0 0 0
           LAYOUTGET: 49 49 0 11172 9604 2 19448 19454
        LAYOUTCOMMIT: 28 28 0 7776 4808 0 24719 24722
        LAYOUTRETURN: 0 0 0 0 0 0 0 0
         LAYOUTSTATS: 0 0 0 0 0 0 0 0
  2. 在结果中:

    • LAYOUT 统计数据指示客户端和服务器使用 pNFS SCSI 操作的请求。
    • 统计指示客户端和服务器回退到 NFS 操作的请求。

第 9 章 FS-Cache 入门

FS-Cache 是一种持久的本地缓存,文件系统可以使用它通过网络检索数据,并将其缓存在本地磁盘上。这有助于最小化网络流量,以便用户从通过网络挂载的文件系统访问数据(例如 NFS)。

9.1. FS-Cache 概述

下图显示了 FS-Cache 的工作原理:

图 9.1. FS-Cache 概述

FS-Cache 概述

FS-Cache 旨在对系统的用户和管理员尽可能透明。与 Solaris 上的 cachefs 不同,FS-Cache 允许服务器上的文件系统直接与客户端的本地缓存进行交互,而不创建过度挂载的文件系统。使用 NFS 时,挂载选项指示客户端挂载启用了 FS-cache 的 NFS 共享。挂载点将导致两个内核模块的自动上传:fscachecachefilecachefilesd 守护进程与内核模块进行通信来实施缓存。

FS-Cache 不会改变通过网络工作的文件系统的基本操作 - 它只是为文件系统提供了一个永久的位置,它可以在该位置缓存数据。例如,客户端仍然可以挂载 NFS 共享,无论是否启用了 FS-Cache。此外,缓存的 NFS 可以处理不能全部放入缓存的文件(无论是单独的还是总体的),因为文件可以部分缓存,且不必预先完全读取。FS-Cache 还会隐藏发生在客户端文件系统驱动程序的缓存中的所有 I/O 错误。

要提供缓存服务,FS-Cache 需要一个 缓存后端。缓存后端是配置来提供缓存服务的存储驱动程序,即 cachefile。在这种情况下,FS-Cache 需要一个挂载的基于块的文件系统,该文件系统支持 bmap 和扩展属性(例如 ext3)来作为其缓存后端。

支持 FS-Cache 缓存后端所需的功能的文件系统包括以下文件系统的 Red Hat Enterprise Linux 9 实现:

  • ext3(启用了扩展属性)
  • ext4
  • XFS

FS-Cache 不能任意缓存任何文件系统,不论是通过网络还是通过其他方式:必须更改共享文件系统的驱动程序,来允许与 FS-Cache、数据存储/检索以及元数据设置和验证进行交互。FS-Cache 需要来自缓存文件系统的 索引密钥一致性数据 来支持持久性:使用索引密钥匹配文件系统对象来缓存对象,使用一致性数据来确定缓存对象是否仍然有效。

注意

在 Red Hat Enterprise Linux 9 中,不会默认安装 cachefilesd 软件包,需要手动安装。

9.2. 性能保证

FS-Cache 保证更高的性能。使用缓存会导致性能下降:例如,缓存的 NFS 共享会为跨网络查找增加对磁盘的访问。虽然 FS-Cache 尝试尽可能异步,但有一些同步路径(例如读取)的情况,其中异步是不可能的。

例如,使用 FS-Cache ,通过没有负载的 GigE 网络在两台计算机之间缓存 NFS 共享,可能不会在文件访问方面显示出任何性能的改进。相反,从服务器内存而不是从本地磁盘可以更快地满足NFS 请求。

因此,使用 FS-Cache 是各种因素之间的 折衷。例如,如果使用 FS-Cache 来缓存 NFS 流量,它可能会减慢一点儿客户端的速度,但通过满足本地的读请求而无需消耗网络带宽,可以大量减少网络和服务器加载。

9.3. 设置缓存

目前,Red Hat Enterprise Linux 9 只提供 cachefiles 缓存后端。cachefilesd 守护进程启动并管理 cachefile/etc/cachefilesd.conf 文件控制 cachefile 如何提供缓存服务。

缓存后端的工作原理是在托管缓存的分区上维护一定数量的空闲空间。当系统的其他元素耗尽空闲空间时,它会增长和收缩缓存,使得可以在根文件系统(例如,在笔记本电脑上)上安全地使用。FS-Cache 对此行为设置默认值,可以通过 cache cull limits 进行配置。有关配置 cache cull limits 的更多信息,请参阅 Cache cull limits 配置

这个过程演示了如何设置缓存。

先决条件

  • 安装 cachefilesd 软件包,且服务已成功启动。要确定该服务正在运行,请使用以下命令:

    # systemctl start cachefilesd
    # systemctl status cachefilesd

    状态必须 处于活动状态(正在运行)

流程

  1. 在缓存后端中配置要将哪个目录用作缓存,请使用以下参数:

    $ dir /path/to/cache
  2. 通常,缓存后端目录是在 /etc/cachefilesd.conf 中将其设为 /var/cache/fscache,如下所示:

    $ dir /var/cache/fscache
  3. 如果要更改缓存后端目录,selinux 上下文必须与 /var/cache/fscache 相同:

    # semanage fcontext -a -e /var/cache/fscache /path/to/cache
    # restorecon -Rv /path/to/cache
  4. 设置缓存时,将 /path/to/cache 替换为目录名称。
  5. 如果给定的设置 selinux 上下文的命令无法工作,请使用以下命令:

    # semanage permissive -a cachefilesd_t
    # semanage permissive -a cachefiles_kernel_t

    FS-Cache 会将缓存存储在托管 /path/to/cache 的文件系统中。在笔记本电脑上,建议使用 root 文件系统(/)作为主机文件系统,但对于台式电脑而言,挂载专门用于缓存的磁盘分区更为明智。

  6. 主机文件系统必须支持用户定义的扩展属性;FS-Cache 使用这些属性来存储一致的维护信息。要为 ext3 文件系统(例如 device)启用用户定义的扩展属性,请使用:

    # tune2fs -o user_xattr /dev/device
  7. 要在挂载时为文件系统启用扩展属性,作为替代方法,请使用以下命令:

    # mount /dev/device /path/to/cache -o user_xattr
  8. 配置文件就位后,启动 cachefilesd 服务:

    # systemctl start cachefilesd
  9. 要将 cachefilesd 配置为在引导时启动,请以 root 用户身份执行以下命令:

    # systemctl enable cachefilesd

9.4. cache cull limits 配置

cachefilesd 守护进程的工作原理是:缓存来自共享文件系统的远程数据,以释放磁盘上的空间。这可能会消耗掉所有空闲空间,如果磁盘还存放 root 分区,这可能会很糟糕。为了对此进行控制,cachefiled 会尝试通过丢弃缓存中的旧对象(例如,最近不经常访问的)来维护一定数量的空闲空间。这个行为被称为 cache culling

缓存筛选是根据底层文件系统中可用块的百分比以及可用文件的百分比来实现的。/etc/cachefilesd.conf 中有控制六个限制的设置:

brun N%(块百分比)、frun N%(文件百分比)
如果缓存中空闲空间的数量和可用文件的数量超过这两个限制,则关闭筛选。
bcull N%(块百分比)、fcull N%(文件百分比)
如果缓存中可用空间的数量或文件的数量低于其中任何一个限制,则启动筛选。
bstop N%(块百分比)、fstop N%(文件百分比)
如果缓存中可用空间的数量或可用文件的数量低于其中任何一个限制,则不允许进一步分配磁盘空间或文件,直到筛选再次引发超过这些限制的情况。

每个设置的 N 的默认值如下:

  • brun/frun - 10%
  • bcull/fcull - 7%
  • bstop/fstop - 3%

在配置这些设置时,必须满足以下条件:

  • 0 ࣘ bstop < bcull < brun < 100
  • 0 ࣘ fstop < fcull < frun < 100

这些是可用空间和可用文件的百分比,不会显示成 100 减去 df 程序所显示的百分比。

重要

筛选同时依赖于 bxxx 和 fxxx 对;用户不能单独处理它们。

9.5. 从 fscache 内核模块检索统计信息

FS-Cache 还跟踪一般的统计信息。这个流程演示了如何获取此信息。

流程

  1. 要查看有关 FS-Cache 的统计信息,请使用以下命令:

    # cat /proc/fs/fscache/stats

FS-Cache 统计数据包括有关决策点和对象计数器的信息。如需更多信息,请参阅以下内核文档:

/usr/share/doc/kernel-doc-4.18.0/Documentation/filesystems/caching/fscache.txt

9.6. FS-Cache 参考

本节提供了 FS-Cache 的参考信息。

  1. 有关 cachefilesd 以及如何配置它的更多信息,请参阅 man cachefilesdman cachefilesd.conf。以下内核文档还提供附加信息:

    • /usr/share/doc/cachefilesd/README
    • /usr/share/man/man5/cachefilesd.conf.5.gz
    • /usr/share/man/man8/cachefilesd.8.gz
  2. 有关 FS-Cache 的常用信息,包括其设计约束、可用统计和功能的详情,请查看以下内核文档:

    /usr/share/doc/kernel-doc-4.18.0/Documentation/filesystems/caching/fscache.txt

第 10 章 在 NFS 中使用缓存

除非明确指示,否则 NFS 将不会使用缓存。本段落介绍了如何使用 FS-Cache 配置 NFS 挂载。

先决条件

  • cachefilesd 软件包已安装并在运行。要确保它正在运行,请使用以下命令:

    # systemctl start cachefilesd
    # systemctl status cachefilesd

    状态必须 处于活动状态(正在运行)

  • 使用以下选项挂载 NFS 共享:

    # mount nfs-share:/ /mount/point -o fsc

    /mount/point 下文件的所有访问都将通过缓存,除非文件是为了直接 I/O 或写而打开。如需更多信息,请参阅 NFS 的缓存限制

NFS 使用 NFS 文件句柄 而不是 文件名来索引缓存内容,这意味着硬链接的文件可以正确共享缓存。

NFS 版本 3、4.0、4.1 和 4.2 支持缓存。但是,每个版本使用不同的分支进行缓存。

10.1. 配置 NFS 缓存共享

与 NFS 缓存共享相关的一些潜在问题。因为缓存是持久的,所以缓存中的数据块会根据由四个键组成的序列来索引的:

  • 第 1 级:服务器详情
  • 第 2 级:一些挂载选项;安全类型;FSID;uniquifier
  • 第 3 级:文件处理
  • 第 4 级:文件中的页号

为避免超级块之间一致性管理的问题,需要缓存数据的所有 NFS 超级块都有唯一的第 2 级键。通常,两个 NFS 挂载使用相同的源卷和选项共享超级块,因此共享缓存,即使它们在该卷中挂载不同的目录。

以下是如何通过不同选项配置缓存共享的示例。

流程

  1. 使用以下命令挂载 NFS 共享:

    mount home0:/disk0/fred /home/fred -o fsc
    mount home0:/disk0/jim /home/jim -o fsc

    这里,/home/fred/home/jim 可能会共享超级块,因为它们具有相同的选项,尤其是如果它们来自 NFS 服务器(home0)上的相同的卷/分区。

  2. 要不共享超级块,请使用 mount 命令和以下选项:

    mount home0:/disk0/fred /home/fred -o fsc,rsize=8192
    mount home0:/disk0/jim /home/jim -o fsc,rsize=65536

    在这种情况下,/home/fred/home/jim 将不会共享超级块,因为它们具有不同的网络访问参数,这些参数是第 2 级键的一部分。

  3. 要在不共享超级块的情况下缓存两个子树(/home/fred1/home/fred2)的内容 两次,请使用以下命令:

    mount home0:/disk0/fred /home/fred1 -o fsc,rsize=8192
    mount home0:/disk0/fred /home/fred2 -o fsc,rsize=65536
  4. 避免超级块共享的另一种方法是使用 nosharecache 参数显式阻止它。使用相同的示例:

    mount home0:/disk0/fred /home/fred -o nosharecache,fsc
    mount home0:/disk0/jim /home/jim -o nosharecache,fsc

    但是,在这种情况下,只允许其中一个超级块使用缓存,因为无法区分 home0:/disk0/fredhome0:/disk0/jim 的第 2 级键。

  5. 要指定对超级块的寻址,请在至少在一个挂载上添加一个 唯一标识符,例如 fsc=唯一标识符

    mount home0:/disk0/fred /home/fred -o nosharecache,fsc
    mount home0:/disk0/jim /home/jim -o nosharecache,fsc=jim

    这里,唯一标识符 jim 被添加到 /home/jim 缓存中所使用的第 2 级键中。

重要

用户不能在具有不同通信或协议参数的超级块之间共享缓存。例如,在 NFSv4.0 和 NFSv3 之间或在 NFSv4.1 和 NFSv4.2 之间无法共享,因为它们会强制使用不同的超级块。另外,设置读取大小(rsize)等参数可防止缓存共享,因为它也强制使用不同的超级块。

10.2. NFS 的缓存限制

NFS 有一些缓存限制:

  • 为直接 I/O 打开共享文件系统的文件将自动绕过缓存。这是因为这种访问类型必须与服务器直接进行。
  • 从共享文件系统打开一个文件直接 I/O 或写入清除文件缓存的副本。FS-Cache 不会再次缓存文件,直到它不再为直接 I/O 或写操作而打开。
  • 另外,FS-Cache 的这个发行版本只缓存常规 NFS 文件。FS-Cache 不会 缓存目录、符号链接、设备文件、FIFO 和套接字。

第 11 章 在 Red Hat Enterprise Linux 中挂载 SMB 共享

服务器消息块(SMB)协议实现用于访问服务器上资源的应用层网络协议,如文件共享和共享打印机。

注意

在 SMB 的上下文中,您可以发现提到了通用 Internet 文件系统(CIFS)协议,该协议是 SMB 的一种方言。SMB 和 CIFS 协议都支持,并且挂载 SMB 和 CIFS 共享时所涉及的内核模块和工具均使用名称 cifs

这部分描述了如何从 SMB 服务器挂载共享。

先决条件

在 Microsoft Windows 上,默认实施 SMB 。在 Red Hat Enterprise Linux 上,内核的 cifs.ko 文件系统模块提供对挂载 SMB 共享的支持。因此,安装 cifs-utils 软件包:

# dnf install cifs-utils

cifs-utils 软件包为以下情况提供工具:

  • 挂载 SMB 和 CIFS 共享
  • 在内核的密钥环中管理 NT Lan Manager(NTLM)凭据
  • 在 SMB 和 CIFS 共享上的安全描述符中设置和显示访问控制列表(ACL)

11.1. 支持的 SMB 协议版本

cifs.ko 内核模块支持以下 SMB 协议版本:

  • SMB 1

    警告

    因为已知的安全问题,SMB1 协议已弃用,仅 在私有网络上可以安全使用。SMB1 仍然作为受支持的选项提供,其主要原因是,当前它是唯一支持 UNIX 扩展的 SMB 协议版本。如果您不需要在 SMB 上使用 UNIX 扩展,红帽强烈建议您使用 SMB2 或更高版本。

  • SMB 2.0
  • SMB 2.1
  • SMB 3.0
  • SMB 3.1.1
注意

根据协议版本,并非所有 SMB 功能都已实施。

11.2. UNIX 扩展支持

Samba 在 SMB 协议中使用 CAP_UNIX 功能位来提供 UNIX 扩展功能。cifs.ko 内核模块也支持这些扩展。但是,Samba 和内核模块仅支持 SMB 1 协议中的 UNIX 扩展。

要使用 UNIX 扩展:

  1. /etc/samba/smb.conf 文件 [global] 部分中的 server min protocol 参数设为 NT1
  2. 通过向 mount 命令提供 -o vers=1.0 选项,使用 SMB 1 协议来挂载共享。例如:

    # mount -t cifs -o vers=1.0,username=user_name //server_name/share_name /mnt/

    默认情况下,内核模块使用 SMB 2 或服务器支持的最高协议版本。将 -o vers=1.0 选项传给 mount 命令会强制内核模块使用 SMB 1 协议,该协议在使用 UNIX 扩展时是必需的。

要验证是否启用了 UNIX 扩展,请显示挂载共享的选项:

# mount
...
//server/share on /mnt type cifs (...,unix,...)

如果在挂载选项列表中显示了 unix 条目,则启用了 UNIX 扩展。

11.3. 手动挂载 SMB 共享

如果您只需要临时挂载 SMB 共享,您可以使用 mount 工具手动挂载它。

注意

重启系统时,手动挂载的共享不会再次自动挂载。要配置 Red Hat Enterprise Linux 在系统启动时自动挂载共享,请参阅 在系统启动时自动挂载 SMB 共享

先决条件

  • cifs-utils 软件包已安装。

流程

要手动挂载 SMB 共享,请使用带 -t cifs 参数的 mount 工具:

# mount -t cifs -o username=user_name //server_name/share_name /mnt/
Password for user_name@//server_name/share_name:  password

-o 参数中,您可以指定用于挂载共享的选项。详情请查看 mount.cifs(8) 手册页中的 OPTIONS 部分,以及 常用的挂载选项

例 11.1. 使用加密的 SMB 3.0 连接挂载共享

要以 DOMAIN\Administrator 用户的身份,将 \\server\example\ 共享通过加密的 SMB 3.0 连接挂载到 /mnt/ 目录:

# mount -t cifs -o username=DOMAIN\Administrator,seal,vers=3.0 //server/example /mnt/
Password for DOMAIN\Administrator@//server_name/share_name:  password

11.4. 系统启动时自动挂载 SMB 共享

如果服务器上需要永久访问挂载的 SMB 共享,请在启动时自动挂载共享。

先决条件

  • cifs-utils 软件包已安装。

流程

要在系统引导时自动挂载 SMB 共享,请将共享条目添加到 /etc/fstab 文件中。例如:

//server_name/share_name  /mnt  cifs  credentials=/root/smb.cred  0 0
重要

要让系统自动挂载共享,您必须将用户名、密码和域名存储在凭据文件中。详情请参阅 使用凭据文件对 SMB 共享进行验证

/etc/fstab 行的第四个字段中,指定挂载选项,如凭据文件的路径。详情请查看 mount.cifs(8) 手册页中的 OPTIONS 部分,以及 常用的挂载选项

要验证共享挂载是否成功,请输入:

# mount /mnt/

11.5. 使用凭据文件对 SMB 共享进行验证

在某些情况下,比如在启动时自动挂载共享,应当在不输入用户名和密码的情况下挂载共享。要实施此操作,请创建一个凭据文件。

先决条件

  • cifs-utils 软件包已安装。

流程

  1. 创建一个文件,如 /root/smb.cred,并指定用户名、密码和域名:

    username=user_name
    password=password
    domain=domain_name
  2. 将权限设置为只允许所有者可以访问该文件:

    # chown user_name /root/smb.cred
    # chmod 600 /root/smb.cred

现在,您可以将 credentials=file_name 挂载选项传给 mount 工具,或者在 /etc/fstab 文件中使用它来挂载共享,而无需提示输入用户名和密码。

11.6. 常用的挂载选项

当您挂载 SMB 共享时,挂载选项将决定:

  • 如何与服务器建立连接。例如:连接到服务器时使用 SMB 协议版本。
  • 如何将共享挂载到本地文件系统.例如,如果系统覆盖了远程文件和目录的权限,使多个本地用户能够访问服务器上的内容。

要在 /etc/fstab 文件的第四个字段或在 mount 命令的 -o 参数中设置多个选项,请将它们用逗号分开。例如,请参阅 使用 multiuser 选项挂载共享

以下列表给出了常用的挂载选项:

选项描述

credentials=file_name

设置凭证文件的路径。请参阅 使用凭据文件认证到 SMB 共享

dir_mode=mode

如果服务器不支持 CIFS UNIX 扩展,则设置目录模式。

file_mode=mode

如果服务器不支持 CIFS UNIX 扩展,则设置文件模式。

password=password

设置在 SMB 服务器中验证的密码。另外,也可使用 credentials 选项指定凭据文件。

seal

使用 SMB 3.0 或更高的协议版本启用对连接的加密支持。因此,使用 sealvers 挂载选项来设置成 3.0 或更高版本。请参阅 手动挂载 SMB 共享 中的示例。

sec=security_mode

设置安全模式,如 ntlmsspi,来启用 NTLMv2 密码哈希和已启用的数据包签名。有关支持值的列表,请查看 mount.cifs(8) 手册页中的选项描述。

如果服务器不支持 ntlmv2 安全模式,则使用 sec=ntlmssp,这是默认值。

出于安全考虑,请不要使用不安全的 ntlm 安全模式。

username=user_name

设置在 SMB 服务器中验证的用户名。另外,也可使用 credentials 选项指定凭据文件。

vers=SMB_protocol_version

设定用于与服务器通信的 SMB 协议版本。

有关完整的列表,请参阅 mount.cifs(8) 手册页中的 OPTIONS 部分。

第 12 章 执行多用户 SMB 挂载

您为挂载共享提供的凭据默认确定对挂载点的访问权限。例如,如果您在挂载共享时使用 DOMAIN\example 用户,则共享上的所有操作都将以该用户的身份执行,而不管哪个本地用户执行此操作。

然而,在某些情况下,管理员希望在系统启动时自动挂载共享,但用户应使用他们自己的凭据对共享的内容执行操作。multiuser 挂载选项允许您配置此场景。

重要

要使用 multiuser 挂载选项,还必须将 sec 挂载选项设置为支持以非交互方式提供凭据的安全类型,如 krb5 ,或带有凭据文件的 ntlmssp 选项。详情请参阅 以用户身份访问共享

root 用户使用 multiuser 选项以及对共享内容具有最少访问权限的帐户挂载共享。然后,常规用户可以使用 cifscreds 工具将其用户名和密码提供给当前会话的内核密钥环。如果用户访问挂载的共享的内容,则内核将使用内核密钥环中的凭据,而不是最初用来挂载共享的凭据。

使用此功能包含以下步骤:

先决条件

  • cifs-utils 软件包已安装。

12.1. 使用 multiuser 选项挂载共享

在用户可以使用他们自己的凭据访问共享之前,使用权限有限的帐户,以 root 用户身份挂载共享。

流程

在系统启动时,使用 multiuser 选项自动挂载共享:

  1. /etc/fstab 文件中为共享创建条目。例如:

    //server_name/share_name  /mnt  cifs  multiuser,sec=ntlmssp,credentials=/root/smb.cred  0 0
  2. 挂载共享:

    # mount /mnt/

如果您不想在系统启动时自动挂载共享,请通过将 -o multiuser,sec=security_type 传给 mount 命令来手动挂载它。有关手动挂载 SMB 共享的详情,请参考 手动挂载 SMB 共享

12.2. 验证是否使用 multiuser 选项挂载 SMB 共享

若要验证共享是否是通过 multiuser 选项挂载的,可显示挂载选项。

流程

# mount
...
//server_name/share_name on /mnt type cifs (sec=ntlmssp,multiuser,...)

如果挂载选项列表中显示了 multiuser 条目,则启用了该功能。

12.3. 以用户身份访问共享

如果 SMB 共享是使用 multiuser 选项挂载的 ,则用户可以向内核密钥环提供其服务器凭据:

# cifscreds add -u SMB_user_name server_name
Password: password

当用户在包含挂载的 SMB 共享的目录中执行操作时,服务器将为此用户应用文件系统权限,而不是挂载共享时最初使用的权限。

注意

多个用户可以同时对挂载的共享使用自己的凭据来执行操作。

第 13 章 持久性命名属性概述

作为系统管理员,您需要引用使用持久性命名属性的存储卷来构建比多个系统引导更可靠存储设置。

13.1. 非持久性命名属性的缺陷

Red Hat Enterprise Linux 提供识别存储设备的多种方法。在使用时,务必要使用正确的选项来识别每个设备,以避免意外访问错误的设备,特别是在安装到或重新格式化驱动器时。

通常,Linux 中使用非持久性名称来表示存储设备,格式为 /dev/sd(主号)(次号)。当检测到设备时,会为每个设备分配主号和次号范围,以及相关的 sd 名称。这意味着,如果设备检测顺序发生了变化,主号和次号范围之间的关联以及相关的 sd 名称可能会发生变化。

在以下情况下可能会在以下情况下更改排序:

  • 系统引导过程的并行化会根据每个系统引导的顺序检测到存储设备。
  • 磁盘无法启动或响应 SCSI 控制器。这会导致通常的设备探测不会检测到它。磁盘不能被系统访问,后续的设备将有其主号和次号范围,包括相关的 sd 名称会下移。例如,如果没有检测到通常称为 sdb 的磁盘,则通常称为 sdc 的磁盘将显示为 sdb
  • SCSI 控制器(主机总线适配器或 HBA)无法初始化,从而导致不能检测到与该 HBA 连接的所有磁盘。任何连接到随后探测到的 HBA 的磁盘都会被分配不同的主号和次号范围,以及不同的相关 sd 名称。
  • 如果系统中存在不同类型的 HBA,则驱动初始化顺序会改变。这会导致连接到那些 HBA 的磁盘以不同顺序被检测到。当将 HBA 移动到系统的不同 PCI 插槽时也会出现这种情况。
  • 连接到带有光纤通道、iSCSI 或 FCoE 适配器的系统的磁盘可能在检测存储设备时无法访问,例如,由于存储阵列或中间交换机断电。如果存储阵列的在线需要比系统启动的时间更长,则系统在电源失败后重启时会出现这种情况。虽然某些光纤通道驱动程序支持一种机制来将持久性 SCSI 目标 ID 指定到 WWPN 映射,但这不会保留主号和次号范围,以及相关的 sd 名称,它只提供一致的 SCSI 目标 ID 号。

这些原因使得在引用设备(例如在 /etc/fstab文件中的)时不希望使用主号和次号范围或相关的 sd 名称。可能挂载了错误的设备,并可能导致数据崩溃。

然而,仍然有必要引用 sd 名称,即使使用了其它机制,比如当设备报告错误时。这是因为 Linux 内核在有关设备的内核消息中使用 sd 名称(以及 SCSI 主机/通道/目标/LUN 元组)。

13.2. 文件系统和设备识别符

这部分解释了识别文件系统和块设备的持久性属性之间的区别。

文件系统识别符

文件系统标识符与在块设备中创建的特定文件系统绑定。标识符也作为文件系统的一部分保存。如果您将文件系统复制到不同的设备中,它仍采用相同的文件系统识别符。另一方面,如果您重写设备,比如使用 mkfs 工具进行格式化,设备会丢失属性。

文件系统识别符包括:

  • 唯一标识符(UUID)
  • 标签

设备识别符

设备标识符与块设备绑定:例如磁盘或者分区。如果您重写设备,比如使用 mkfs 工具进行格式化,设备会保留属性,因为它没有存储在文件系统中。

设备识别符包括:

  • World Wide Identifier (WWID)
  • 分区 UUID
  • 序列号

建议

  • 有些文件系统(比如逻辑卷)会跨越多个设备。红帽建议您使用文件系统识别符而不是设备标识符访问这些文件系统。

13.3. 使用 /dev/disk/ 中的 udev 机制管理的设备名称

本节列出了 udev 服务在 /dev/disk/ 目录中提供的不同类型的持久命名属性。

udev 机制用于 Linux 中的所有设备,而不仅仅是存储设备。对于存储设备,Red Hat Enterprise Linux 包含 在 /dev/disk/ 目录中创建符号链接的 udev 规则。这可让您使用以下方法指向存储设备:

  • 其内容
  • 唯一标识符
  • 它们的序列号。

虽然 udev 命名属性是持久的,但它们在系统重启后不会自行更改,但有一部分也是可以配置的。

13.3.1. 文件系统识别符

/dev/disk/by-uuid/ 中的 UUID 属性

此目录中的条目提供一个符号链接名称,通过存储在设备上的内容(即数据)中的 唯一标识符 (UUID) 来指向存储设备。例如:

/dev/disk/by-uuid/3e6be9de-8139-11d1-9106-a43f08d823a6

您可以使用以下语法,使用 UUID 指向 /etc/fstab 文件中的设备:

UUID=3e6be9de-8139-11d1-9106-a43f08d823a6

您可以在创建文件系统时配置 UUID 属性,您也可以稍后修改它。

/dev/disk/by-label/ 中的 Label 属性

这个目录中的条目提供了一个符号链接名称,它们使用保存在该设备中的内容(即数据)的一个 label 指向存储设备。

例如:

/dev/disk/by-label/Boot

您可以使用以下语法,使用标签来指向 /etc/fstab 文件中的设备:

LABEL=Boot

您可以在创建文件系统时配置 Label 属性,您也可以稍后修改它。

13.3.2. 设备识别符

/dev/disk/by-id/ 中的 WWID 属性

全球识别符(WWID)是一个持久的、系统独立的标识符,SCSI 标准要求所有 SCSI 设备都使用它。保证 WWID 标识符对于每个存储设备都是唯一的,并且独立于用于访问该设备的路径。标识符是设备的属性,但不存储在设备上的内容(也就是数据)中。

可通过发出 SCSI 询问来检索设备识别重要产品数据(第 0x83 页)或单元序列号(第 0x80 页)来获取此标识符。

Red Hat Enterprise Linux 自动维护从基于 WWID 的设备名称到该系统上当前 /dev/sd 名称的正确映射。应用程序可以使用 /dev/disk/by-id/ 名称来引用磁盘上的数据,即使设备的路径有变化,即使从不同的系统访问该设备也一样。

例 13.1. WWID 映射

WWID 符号链接非持久性设备备注

/dev/disk/by-id/scsi-3600508b400105e210000900000490000

/dev/sda

具有页面 0x83 标识符的设备

/dev/disk/by-id/scsi-SSEAGATE_ST373453LW_3HW1RHM6

/dev/sdb

具有页面 0x80 标识符的设备

/dev/disk/by-id/ata-SAMSUNG_MZNLN256HMHQ-000L7_S2WDNX0J336519-part3

/dev/sdc3

磁盘分区

除了系统提供的这些持久名称外,您还可以使用 udev 规则来实现映射到存储的 WWID 的持久名称。

/dev/disk/by-partuuid 中的分区 UUID 属性

分区 UUID(PARTUUID)属性标识 GPT 分区表定义的分区。

例 13.2. 分区 UUID 映射

PARTUUID 符号链接非持久性设备

/dev/disk/by-partuuid/4cd1448a-01

/dev/sda1

/dev/disk/by-partuuid/4cd1448a-02

/dev/sda2

/dev/disk/by-partuuid/4cd1448a-03

/dev/sda3

/dev/disk/by-path/ 中的 Path 属性

此属性通过用于访问该设备的 硬件路径 来提供一个指向存储设备的符号链接。

如果硬件路径的任何部分(如 PCI ID、目标端口或 LUN 号)发生变化,Path 属性会失败。因此 Path 属性是不可靠的。但是 Path 属性在以下情况下可能有用:

  • 您需要识别您要替换的磁盘。
  • 您计划在特定位置的磁盘中安装存储服务。

13.4. 使用 DM 多路径的通用识别符

这部分论述了全球识别符(WWID)与设备映射器多路径配置中非持久性设备名称之间的映射。

如果系统中有多路径到某个设备,DM 多路径会使用 WWID 探测到这个设备。然后,DM 多路径会在 /dev/mapper/wwid 目录中显示一个"pseudo-device",如 /dev/mapper/3600508b400105df70000e00000ac0000

multipath -l 命令显示到非持久性标识符的映射:

  • Host:Channel:Target:LUN
  • /dev/sd 名称
  • major:minor

例 13.3. 多路径配置中的 WWID 映射

multipath -l 命令的一个输出示例:

3600508b400105df70000e00000ac0000 dm-2 vendor,product
[size=20G][features=1 queue_if_no_path][hwhandler=0][rw]
\_ round-robin 0 [prio=0][active]
 \_ 5:0:1:1 sdc 8:32  [active][undef]
 \_ 6:0:1:1 sdg 8:96  [active][undef]
\_ round-robin 0 [prio=0][enabled]
 \_ 5:0:0:1 sdb 8:16  [active][undef]
 \_ 6:0:0:1 sdf 8:80  [active][undef]

DM 多路径自动维护每个基于 WWID 的设备名称到系统上相应的 /dev/sd 名称的正确映射。这些名称可在路径更改之间保留,在从不同系统访问该设备时会保持一致。

当使用 DM 多路径的 user_friendly_names 功能时,WWID 被映射成 /dev/mapper/mpathN 形式的名称。默认情况下,此映射在 /etc/multipath/bindings 文件中维护。只要该文件被维护,这些 mpathN 名称就会持久存在。

重要

如果使用 user_friendly_names,则需要额外的步骤来获得集群中的一致名称。

13.5. udev 设备命名规则的限制

以下是 udev 命名规则的一些限制:

  • 执行查询时可能无法访问设备,因为当为 udev 事件处理 udev 规则时,udev 机制可能依赖于查询存储设备的能力。当设备不在服务器机箱中时,这更可能会在光纤频道、iSCSI 或者 FCoE 存储设备中发生。
  • 内核可能会随时发送 udev 事件,从而导致规则被处理,并可能导致设备无法访问时,/dev/disk/by-*/ 链接被删除。
  • udev 事件产生和处理时,如检测到大量设备,用户空间 udevd 服务花费一些时间来处理每个事件的规则时,可能会有延迟。这可能会在内核检测到该设备和在 /dev/disk/by-*/ 名称可用之间出现延迟。
  • 规则调用的 blkid 等外部程序可能会打开设备一小段时间,从而使设备无法被其他用途访问。
  • /dev/disk/ 中由 udev 机制管理的设备名称可能会在主版本之间有所变化,需要您更新链接。

13.6. 列出持久性命名属性

这个步骤描述了如何找到非持久性存储设备的持久命名属性。

流程

  • 要列出 UUID 和 Label 属性,请使用 lsblk 工具:

    $ lsblk --fs storage-device

    例如:

    例 13.4. 查看文件系统的 UUID 和标签

    $ lsblk --fs /dev/sda1
    
    NAME FSTYPE LABEL UUID                                 MOUNTPOINT
    sda1 xfs    Boot  afa5d5e3-9050-48c3-acc1-bb30095f3dc4 /boot
  • 要列出 PARTUUID 属性,请使用 lsblk 工具以及 --output +PARTUUID 选项:

    $ lsblk --output +PARTUUID

    例如:

    例 13.5. 查看分区的 PARTUUID 属性

    $ lsblk --output +PARTUUID /dev/sda1
    
    NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT PARTUUID
    sda1   8:1    0  512M  0 part /boot      4cd1448a-01
  • 要列出 WWID 属性,请检查 /dev/disk/by-id/ 目录中符号链接的目标。例如:

    例 13.6. 查看系统中所有存储设备的 WWID

    $ file /dev/disk/by-id/*
    
    /dev/disk/by-id/ata-QEMU_HARDDISK_QM00001
    symbolic link to ../../sda
    /dev/disk/by-id/ata-QEMU_HARDDISK_QM00001-part1
    symbolic link to ../../sda1
    /dev/disk/by-id/ata-QEMU_HARDDISK_QM00001-part2
    symbolic link to ../../sda2
    /dev/disk/by-id/dm-name-rhel_rhel8-root
    symbolic link to ../../dm-0
    /dev/disk/by-id/dm-name-rhel_rhel8-swap
    symbolic link to ../../dm-1
    /dev/disk/by-id/dm-uuid-LVM-QIWtEHtXGobe5bewlIUDivKOz5ofkgFhP0RMFsNyySVihqEl2cWWbR7MjXJolD6g
    symbolic link to ../../dm-1
    /dev/disk/by-id/dm-uuid-LVM-QIWtEHtXGobe5bewlIUDivKOz5ofkgFhXqH2M45hD2H9nAf2qfWSrlRLhzfMyOKd
    symbolic link to ../../dm-0
    /dev/disk/by-id/lvm-pv-uuid-atlr2Y-vuMo-ueoH-CpMG-4JuH-AhEF-wu4QQm
    symbolic link to ../../sda2

13.7. 修改持久性命名属性

这个步骤描述了如何更改文件系统的 UUID 或 Label persistent naming 属性。

注意

更改 udev 属性在后台进行,可能需要很长时间。udevadm settle 命令一直等待直到更改完全注册,这样可确保您的下一个命令能够正确使用新属性。

在以下命令中:

  • new-uuid 替换为您要设置的 UUID;例如,1cdfbc07-1c90-4984-b5ec-f61943f5ea50。您可以使用 uuidgen 命令生成一个 UUID。
  • 使用标签替换 new-label,如 backup_data

先决条件

  • 如果您要修改 XFS 文件系统的属性,首先卸载它。

流程

  • 要更改 XFS 文件系统的 UUID 或 Label 属性,请使用 xfs_admin 工具:

    # xfs_admin -U new-uuid -L new-label storage-device
    # udevadm settle
  • 要更改 ext4ext3ext2 文件系统的 UUID 或 Label 属性,请使用 tune2fs 工具:

    # tune2fs -U new-uuid -L new-label storage-device
    # udevadm settle
  • 要更改 swap 卷的 UUID 或 Label 属性,请使用 swaplabel 工具:

    # swaplabel --uuid new-uuid --label new-label swap-device
    # udevadm settle

第 14 章 重新划分现存分区的大小

作为系统管理员,您可以显示块设备的分区表来查看分区布局和单个分区的详情。有关在块设备上使用分区的优缺点的概述,请参阅以下 KBase 文章:https://access.redhat.com/solutions/163853

14.1. 查看使用 parted 的分区表

这个流程描述了如何使用 parted 工具来查看块设备上的分区表。

流程

  1. 启动交互式 parted shell:

    # parted block-device
    • 使用您要检查的设备的路径替换 block-device :例如:/dev/sda
  2. 查看分区表:

    (parted) print
  3. 另外,使用以下命令切换到您想要检查下一个设备的另一个设备:

    (parted) select block-device

其它资源

  • parted(8) 手册页。

14.2. parted print 的输出示例

本节提供了 parted shell 中的 print 命令的输出示例,并描述了输出中的字段。

例 14.1. print 命令的输出

Model: ATA SAMSUNG MZNLN256 (scsi)
Disk /dev/sda: 256GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  269MB   268MB   primary   xfs          boot
 2      269MB   34.6GB  34.4GB  primary
 3      34.6GB  45.4GB  10.7GB  primary
 4      45.4GB  256GB   211GB   extended
 5      45.4GB  256GB   211GB   logical

下面是这些字段的描述:

模型:ATA SAMSUNG MZNLN256(scsi)
磁盘类型、制造商、型号号和接口。
磁盘 /dev/sda: 256GB
块设备的文件路径和存储容量。
分区表:msdos
磁盘标签类型。
Number
分区号。例如,次号 1 的分区对应于 /dev/sda1
StartEnd
在分区启动和结束的设备中的位置。
Type
有效类型为 metadata、free、primary、extended 或 logical。
File system
文件系统类型。如果设备的 File system 字段未显示值,这意味着其文件系统类型为未知。parted 工具无法识别加密设备上的文件系统。
标记
列出为分区设置的标记。可用的标志有 bootrootswaphiddenraidlvmlba

第 15 章 在磁盘中创建分区表

作为系统管理员,您可以使用不同类型的分区表格式化块设备来启用该设备的分区。

警告

使用分区表格式化块设备会删除该设备中所有存储的数据。

15.1. 修改磁盘分区前的注意事项

本节列出了在创建、删除或重新定义分区大小前需要考虑的关键点。

注意

本节不涵盖 DASD 分区表,它特定于 IBM Z 构架。有关 DASD 的详情请参考:

分区的最大数量

设备中的分区数量受分区表类型的限制:

  • 在使用 主引导记录(MBR) 分区表格式化的设备上,您可以有:

    • 最多四个主分区,或者
    • 最多有三个主分区,以及一个扩展分区,其中包括多个逻辑分区。
  • 在使用 GUID 分区表(GPT) 格式化的设备上,最大的分区数为 128。尽管 GPT 规范通过增大为分区表保留的空间来允许更多的分区,但 parted 工具的常用的做法是将其限制为足够容纳 128 个分区的空间。
注意

红帽建议,除非有其他原因,否则 至少 要创建以下分区: swap/boot// (root)。

分区的最大大小

设备中的分区大小受分区表类型的限制:

  • 在使用主引导记录(MBR) 分区表格式化的设备中,最大值为 2TiB。
  • 在使用 GUID 分区表(GPT) 格式化的设备上,最大大小为 8ZiB。

如果要创建一个大于 2TiB 的分区,该磁盘必须使用 GPT 格式化。

大小协调

parted 工具可让您使用多个不同的后缀来指定分区的大小:

MiB、GiB 或 TiB

大小为 2 的指数代表。

  • 分区的起点与根据大小指定的扇区一致。
  • 结束点与指定大小减 1 扇区一致。
MB、GB 或 TB

以 10 的指数表示容量。

起始和结束点在指定单元的一半内一致:例如,使用 MB 后缀时 ±500KB。

15.2. 分区表类型比较

本节比较您可以在块设备中创建的不同类型的分区表的属性。

表 15.1. 分区表类型

分区表最多分区数最大分区大小

主引导记录(MBR)

4 个主分区,或 3 个主分区和一个扩展分区中的 12 个逻辑分区

2TiB

GUID 分区表(GPT)

128

8ZiB

15.3. MBR 磁盘分区

本章图表显示分区表与实际磁盘分开。但这并不完全准确。实际上,分区表被保存在磁盘的最开始,并在任何文件系统或用户数据之前。为了简洁,下图将它们分开。

图 15.1. 有 MBR 分区表的磁盘

未使用的分区驱动器

如上图所示,分区表被分为四节(四个主分区)。主分区是在硬盘中只能包含一个逻辑驱动器(或部分)的分区。每个部分都保存定义单个分区所需的信息,意味着分区表可定义不超过四个分区。

每个分区表条目包含分区的几个重要特征:

  • 磁盘上分区开始和结束的地方。
  • 分区是否 活跃。只能有一个分区被标记为活跃分区。
  • 分区的类型。

起点和结束点定义了分区的大小和在磁盘中的位置。"active(活跃)"标志是被某些操作系统引导装载程序使用。换句话说,位于被标记为"活跃"的分区中的操作系统会被引导。

类型是一个数字,用于识别分区预定的用法。某些操作系统使用分区类型来表示特定的文件系统类型,来将分区标记为与特定操作系统关联的分区,来表示分区包含可引导的操作系统,或三者的某种组合。

下图显示了含有单一分区的驱动器示例:

图 15.2. 只有一个分区的磁盘

dos 单个分区

本例中的单个分区被标记为 DOS。此标签显示分区类型,DOS 是最常见的分区类型之一。

15.4. 扩展 MBR 分区

如果四个分区不足,您可以使用扩展分区来创建额外的分区。您可以把分区类型设置为"Extended"来达到此目的。

扩展分区本身就如同磁盘驱动器一样 - 它有自己的分区表,指向一个或多个分区(现在称为逻辑分区,而不是四个主分区),它完全包含在扩展的分区中。下图显示了一个磁盘驱动器,它有两个主分区和一个包含两个逻辑分区(以及一些未分区的可用空间)的扩展分区:

图 15.3. 带主和扩展 MBR 分区的磁盘

扩展分区

如图表中所暗示,主分区和逻辑分区之间有一个区别 - 主分区和扩展分区的数量只能是 4 个,但逻辑分区的数量没有固定限制。但是,由于在 Linux 中访问分区的方式,单个磁盘驱动器上不能定义超过 15 个逻辑分区。

15.5. MBR 分区类型

下表显示了一些常用的 MBR 分区类型和用于代表它们的十六进制数字。

表 15.2. MBR 分区类型

MBR 分区类型

MBR 分区类型

00

Novell Netware 386

65

DOS 12-bit FAT

01

PIC/IX

75

XENIX root

O2

Old MINIX

80

XENIX usr

O3

Linux/MINUX

81

DOS 16-bit ⇐32M

04

Linux swap

82

Extended

05

Linux native

83

DOS 16-bit >=32

06

Linux extended

85

OS/2 HPFS

07

Amoeba

93

AIX

08

Amoeba BBT

94

AIX bootable

09

BSD/386

a5

OS/2 Boot Manager

0a

OpenBSD

a6

Win95 FAT32

0b

NEXTSTEP

a7

Win95 FAT32(LBA)

0c

BSDI fs

b7

Win95 FAT16(LBA)

0e

BSDI swap

b8

Win95 Extended (LBA)

0f

Syrinx

c7

Venix 80286

40

CP/M

db

Novell

51

DOS access

e1

PRep Boot

41

DOS R/O

e3

GNU HURD

63

DOS secondary

f2

Novell Netware 286

64

BBT

ff

15.6. GUID 分区表

GUID 分区表(GPT)是基于使用全局唯一标识符(GUID)的分区方案。GPT 的开发目的是弥补 MBR 分区表的限制,特别是对磁盘的最大可寻址存储空间的限制。MBR 无法寻址大于 2 TiB 的存储(等同于大约 2.2 TB),而 GPT 可以用于大于这个存储限制的硬盘,其可寻址的最大磁盘大小为 2.2 ZiB。另外,GPT 默认支持创建最多 128 个主分区。这个号码可以通过为分区表分配更多空间来扩展。

注意

GPT 有基于 GUID 的分区类型。请注意,某些分区需要一个特定的 GUID。例如,EFI 引导加载程序的系统分区需要 GUID C12A7328-F81F-11D2-BA4B-00A0C93EC93B

GPT 磁盘使用逻辑块寻址(LBA),分区布局如下:

  • 为了保持与 MBR 磁盘的向后兼容性,GPT 的第一个扇区(LBA 0)被保留给 MBR 数据,它称为"保护的 MBR"。
  • 主 GPT 头从设备的第二个逻辑块(LBA 1)开始。标头中包含磁盘 GUID、主分区表的位置、从属 GPT 标头的位置、自身的 CRC32 checksum 以及主分区表。它还指定表上的分区条目数目。
  • 默认情况下,主 GPT 包括 128 个分区条目,每个条目的大小为 128 字节,具有分区类型 GUID 和唯一分区 GUID。
  • 二级 GPT 与主 GPT 相同。它主要用作恢复的备份表,以防主分区表损坏。
  • 辅助 GPT 头位于磁盘的最后一个逻辑扇区,在主头损坏时可用于恢复 GPT 信息。它包含磁盘 GUID、二级分区表和主 GPT 标头的位置、自身的 CRC32 checksums 校验、从属分区表,以及可能的分区条目数目。

图 15.4. 带有 GUID 分区表的磁盘

GPT 分区
重要

必须有一个 BIOS 引导分区才能成功安装引导装载程序到包含 GPT(GUID 分区表)的磁盘中。这包括 Anaconda 初始化的磁盘。如果磁盘已经包含 BIOS 引导分区,则它可以被重复使用。

15.7. 使用 parted 在磁盘中创建分区表

这个流程描述了如何使用 parted 工具将块设备格式化为具有分区表。

流程

  1. 启动交互式 parted shell:

    # parted block-device
    • 使用您要创建分区表的设备的路径替换 block-device :例如 /dev/sda
  2. 确定该设备中是否已有一个分区表:

    (parted) print

    如果设备已经包含分区,将在后续步骤中删除它们。

  3. 创建新分区表:

    (parted) mklabel table-type
    • 用预期的分区表类型来替换 table-type

      • 用于的 MBR 的 msdos
      • 用于 GPT 的 gpt

    例 15.1. 创建 GPT 表

    例如,要在磁盘中创建 GPT 表,请使用:

    (parted) mklabel gpt

    输入此命令后,这些更改就会生效,因此在执行前请先重新检查。

  4. 查看分区表以确认分区表是否存在:

    (parted) print
  5. 退出 parted shell:

    (parted) quit

其它资源

  • parted(8) 手册页。

第 16 章 创建分区

作为系统管理员,您可以在磁盘上创建新分区。

16.1. 修改磁盘分区前的注意事项

本节列出了在创建、删除或重新定义分区大小前需要考虑的关键点。

注意

本节不涵盖 DASD 分区表,它特定于 IBM Z 构架。有关 DASD 的详情请参考:

分区的最大数量

设备中的分区数量受分区表类型的限制:

  • 在使用 主引导记录(MBR) 分区表格式化的设备上,您可以有:

    • 最多四个主分区,或者
    • 最多有三个主分区,以及一个扩展分区,其中包括多个逻辑分区。
  • 在使用 GUID 分区表(GPT) 格式化的设备上,最大的分区数为 128。尽管 GPT 规范通过增大为分区表保留的空间来允许更多的分区,但 parted 工具的常用的做法是将其限制为足够容纳 128 个分区的空间。
注意

红帽建议,除非有其他原因,否则 至少 要创建以下分区: swap/boot// (root)。

分区的最大大小

设备中的分区大小受分区表类型的限制:

  • 在使用主引导记录(MBR) 分区表格式化的设备中,最大值为 2TiB。
  • 在使用 GUID 分区表(GPT) 格式化的设备上,最大大小为 8ZiB。

如果要创建一个大于 2TiB 的分区,该磁盘必须使用 GPT 格式化。

大小协调

parted 工具可让您使用多个不同的后缀来指定分区的大小:

MiB、GiB 或 TiB

大小为 2 的指数代表。

  • 分区的起点与根据大小指定的扇区一致。
  • 结束点与指定大小减 1 扇区一致。
MB、GB 或 TB

以 10 的指数表示容量。

起始和结束点在指定单元的一半内一致:例如,使用 MB 后缀时 ±500KB。

16.2. 分区类型

本节描述了指定分区类型的不同属性。

分区类型或标志

正在运行的系统很少使用分区类型或标志。但是,分区类型与动态生成器有关,例如 systemd-gpt-auto-generator,其使用分区类型来自动识别和挂载设备。

  • parted 工具通过将分区类型映射到 标志 来提供对分区类型的一些控制。parted 工具只能处理某些分区类型:例如 LVM、swap 或 RAID。
  • fdisk 工具通过指定十六进制代码来支持所有的分区类型。

分区文件系统类型

parted 工具在创建分区时接受文件系统类型参数。该值用于:

  • 在 MBR 中设定分区标记,或者
  • 在 GPT 中设定分区 UUID 类型。例如,swapfathfs 文件系统类型设置不同的 GUID。默认值为 Linux Data GUID。

参数不会以任何形式修改分区中的文件系统。它只区分受支持的标志或 GUID。

支持以下文件系统类型:

  • xfs
  • ext2
  • ext3
  • ext4
  • fat16
  • fat32
  • hfs
  • hfs+
  • linux-swap
  • ntfs
  • reiserfs
注意

RHEL 9 中唯一支持的本地文件系统是 ext4xfs

16.3. 分区命名方案

Red Hat Enterprise Linux 使用基于文件的命名方案,其文件名采用 /dev/xxyN 的形式。

设备和分区名称由以下结构组成:

/dev/
这是所有设备文件所在的目录名称。由于分区放置在硬盘上,而硬盘就是设备,因此代表所有可能分区的文件位于 /dev 中。
xx
分区名称的前两个字母表示分区所在的设备的类型,通常是 sd
y
这个字母标明分区所在的设备。例如,第一个硬盘为 /dev/sda,第二个硬盘为 /dev/sdb,以此类推。在超过 26 个驱动器的系统中,您可以使用更多字母。例如: /dev/sdaa1
N
最后的字母代表分区的数字。前四个(主或扩展)分区编号为 14。逻辑分区从 5 开始。例如,/dev/sda3 是第一个硬盘上的第三个主分区或扩展分区,/dev/sdb6 是第二个硬盘上的第二个逻辑分区。驱动器分区编号只适用于 MBR 分区表。请注意,N 并不总是意味着分区。
注意

即使 Red Hat Enterprise Linux 可以识别和引用 所有类型的磁盘分区,它可能无法读取文件系统,因此无法访问分区类型中保存的数据。然而,在很多情况下,成功访问专用于另一个操作系统的分区中的数据是可能的。

16.4. 挂载点和磁盘分区

在 Red Hat Enterprise Linux 中,每个分区都被用来成为支持一组文件和目录所必需的存储的一部分。这可使用名为 mounting 的进程完成,该进程可将分区和目录相关联。挂载分区使其存储从指定的目录(称为 挂载点 )开始可用。

例如,如果分区 /dev/sda5 挂载在 /usr/ 上,这意味着 /usr/ 下的所有文件和目录都在 /dev/sda5 上。因此,文件 /usr/share/doc/FAQ/txt/Linux-FAQ 将存储在 /dev/sda5 上,而文件 /etc/gdm/custom.conf 则不会存储在 /dev/sda5 上。

继续这个示例,也可以将 /usr/ 下的一个或多个目录作为其他分区的挂载点。例如,分区 /dev/sda7 可以挂载到 /usr/local 上,意味着 /usr/local/man/whatis 将位于 /dev/sda7 上,而不是 /dev/sda5 上。

16.5. 使用 parted 创建分区

这个流程描述了如何使用 parted 工具在块设备上创建新分区。

先决条件

  • 磁盘上有一个分区表。有关如何格式化磁盘的详情,请参阅 在磁盘上创建分区表
  • 如果您要创建的分区大于 2TiB,则必须使用 GUID 分区表(GPT)格式化该磁盘。

流程

  1. 启动交互式 parted shell:

    # parted block-device
    • 使用您要创建分区的设备的路径替换 block-device :例如 /dev/sda
  2. 查看当前的分区表来确定是否有足够空闲空间:

    (parted) print
    • 如果没有足够的可用空间,您可以调整现有分区的大小。如需更多信息,请参阅 重新定义分区大小
    • 从分区表中决定:

      • 新分区的开始和结束点
      • 在 MBR 上,应该是什么分区类型。
  3. 创建新分区:

    (parted) mkpart part-type name fs-type start end
    • 根据您在分区表中的决定,使用 primarylogicalextended 替换 part-type。这只适用于 MBR 分区表。
    • 使用任意分区名称替换 name。对于 GPT 分区表,这是必需的。
    • 使用 xfsext2ext3ext4fat16fat32hfshfs+Linux-swapntfsreiserfs 其中之一替换 fs-typefs-type 参数是可选的。请注意,parted 不会在分区上创建文件系统。
    • 使用从磁盘开头计算分区开始和结束点的大小替换 startend。您可以使用大小后缀,如 512MiB20GiB1.5TiB。默认大小 MB。

    例 16.1. 创建小的主分区

    例如:要在 MBR 表中创建主分区(从 1024MiB 到 2048MiB),使用:

    (parted) mkpart primary 1024MiB 2048MiB

    输入此命令后,这些更改就会生效,因此在执行前请先重新检查。

  4. 查看分区表以确认创建的分区位于分区表中,并具有正确的分区类型、文件系统类型和大小:

    (parted) print
  5. 退出 parted shell:

    (parted) quit
  6. 使用以下命令等待系统注册新设备节点:

    # udevadm settle
  7. 验证内核是否识别了新的分区:

    # cat /proc/partitions

其它资源

  • parted(8) 手册页。

16.6. 使用 fdisk 设置分区类型

这个流程描述了如何使用 fdisk 工具设置分区类型或标志。

先决条件

  • 磁盘上有一个分区。

流程

  1. 启动交互式 fdisk shell:

    # fdisk block-device
    • 使用您要设置分区类型的设备的路径替换 block-device :例如 /dev/sda
  2. 查看当前的分区表以确定副分区号码:

    Command (m for help): print

    您可以在 Type 列中看到当前的分区类型,在 Id 列中看到相应的类型 ID 。

  3. 输入分区类型命令并使用它的副号码选择分区:

    Command (m for help): type
    Partition number (1,2,3 default 3): 2
  4. 另外,还可列出可用的十六进制代码:

    Hex code (type L to list all codes): L
  5. 设置分区类型:

    Hex code (type L to list all codes): 8e
  6. 写入更改并退出 fdisk shell:

    Command (m for help): write
    The partition table has been altered.
    Syncing disks.
  7. 验证您的更改:

    # fdisk --list block-device

第 17 章 删除分区

作为系统管理员,您可以删除不再用来释放磁盘空间的磁盘分区。

警告

删除分区将删除保存在分区中的所有数据。

17.1. 修改磁盘分区前的注意事项

本节列出了在创建、删除或重新定义分区大小前需要考虑的关键点。

注意

本节不涵盖 DASD 分区表,它特定于 IBM Z 构架。有关 DASD 的详情请参考:

分区的最大数量

设备中的分区数量受分区表类型的限制:

  • 在使用 主引导记录(MBR) 分区表格式化的设备上,您可以有:

    • 最多四个主分区,或者
    • 最多有三个主分区,以及一个扩展分区,其中包括多个逻辑分区。
  • 在使用 GUID 分区表(GPT) 格式化的设备上,最大的分区数为 128。尽管 GPT 规范通过增大为分区表保留的空间来允许更多的分区,但 parted 工具的常用的做法是将其限制为足够容纳 128 个分区的空间。
注意

红帽建议,除非有其他原因,否则 至少 要创建以下分区: swap/boot// (root)。

分区的最大大小

设备中的分区大小受分区表类型的限制:

  • 在使用主引导记录(MBR) 分区表格式化的设备中,最大值为 2TiB。
  • 在使用 GUID 分区表(GPT) 格式化的设备上,最大大小为 8ZiB。

如果要创建一个大于 2TiB 的分区,该磁盘必须使用 GPT 格式化。

大小协调

parted 工具可让您使用多个不同的后缀来指定分区的大小:

MiB、GiB 或 TiB

大小为 2 的指数代表。

  • 分区的起点与根据大小指定的扇区一致。
  • 结束点与指定大小减 1 扇区一致。
MB、GB 或 TB

以 10 的指数表示容量。

起始和结束点在指定单元的一半内一致:例如,使用 MB 后缀时 ±500KB。

17.2. 使用 parted 删除分区

这个流程描述了如何使用 parted 工具删除磁盘分区。

流程

  1. 启动交互式 parted shell:

    # parted block-device
    • 使用您要删除分区的设备的路径替换 block-device :例如 /dev/sda
  2. 查看当前的分区表以确定要删除的分区的次号:

    (parted) print
  3. 删除分区:

    (parted) rm minor-number
    • 使用您要删除的分区的次号替换 minor-number :例如 3

    输入此命令后,这些更改就会生效,因此在执行前请先重新检查。

  4. 确认分区已从分区表中被删除:

    (parted) print
  5. 退出 parted shell:

    (parted) quit
  6. 确定内核知道已删除该分区:

    # cat /proc/partitions
  7. 如果分区存在,请从 /etc/fstab 文件中删除该分区。找到声明删除的分区的行,并将其从文件中删除。
  8. 重新生成挂载单元,以便您的系统注册新的 /etc/fstab 配置:

    # systemctl daemon-reload
  9. 如果您删除了交换分区或删除了 LVM 部分,请从 /etc/default/grub 文件的内核命令行中删除对分区的所有引用,并重新生成 GRUB 配置:

    • 在基于 BIOS 的系统中:

      # grub2-mkconfig --output=/etc/grub2.cfg
    • 在基于 UEFI 的系统中:

      # grub2-mkconfig --output=/etc/grub2-efi.cfg
  10. 要在早期引导系统中注册更改,请重建 initramfs 文件系统:

    # dracut --force --verbose

其它资源

  • parted(8) 手册页

第 18 章 重新定义分区尺寸

作为系统管理员,您可以扩展分区来利用未使用的磁盘空间,或者缩小分区以达到不同的目的。

18.1. 修改磁盘分区前的注意事项

本节列出了在创建、删除或重新定义分区大小前需要考虑的关键点。

注意

本节不涵盖 DASD 分区表,它特定于 IBM Z 构架。有关 DASD 的详情请参考:

分区的最大数量

设备中的分区数量受分区表类型的限制:

  • 在使用 主引导记录(MBR) 分区表格式化的设备上,您可以有:

    • 最多四个主分区,或者
    • 最多有三个主分区,以及一个扩展分区,其中包括多个逻辑分区。
  • 在使用 GUID 分区表(GPT) 格式化的设备上,最大的分区数为 128。尽管 GPT 规范通过增大为分区表保留的空间来允许更多的分区,但 parted 工具的常用的做法是将其限制为足够容纳 128 个分区的空间。
注意

红帽建议,除非有其他原因,否则 至少 要创建以下分区: swap/boot// (root)。

分区的最大大小

设备中的分区大小受分区表类型的限制:

  • 在使用主引导记录(MBR) 分区表格式化的设备中,最大值为 2TiB。
  • 在使用 GUID 分区表(GPT) 格式化的设备上,最大大小为 8ZiB。

如果要创建一个大于 2TiB 的分区,该磁盘必须使用 GPT 格式化。

大小协调

parted 工具可让您使用多个不同的后缀来指定分区的大小:

MiB、GiB 或 TiB

大小为 2 的指数代表。

  • 分区的起点与根据大小指定的扇区一致。
  • 结束点与指定大小减 1 扇区一致。
MB、GB 或 TB

以 10 的指数表示容量。

起始和结束点在指定单元的一半内一致:例如,使用 MB 后缀时 ±500KB。

18.2. 使用 parted 重新定义分区大小

这个过程使用 parted 工具重新定义磁盘分区大小。

先决条件

  • 如果您想缩小分区,备份保存在分区上的数据。

    警告

    缩小分区可能会导致分区上的数据丢失。

  • 如果要将分区大小调整为大于 2TiB,必须使用 GUID 分区表(GPT)对磁盘进行格式化。有关如何格式化磁盘的详情,请参阅 在磁盘上创建分区表

流程

  1. 如果您想缩小分区,首先缩小它上面的文件系统,使其不大于重新定义大小的分区。请注意 XFS 不支持缩小。
  2. 启动交互式 parted shell:

    # parted block-device
    • 使用您要调整分区大小的设备的路径替换 block-device :例如 /dev/sda
  3. 查看当前的分区表:

    (parted) print

    从分区表中决定:

    • 分区的从号码
    • 调整大小后现有分区的位置和新结束点
  4. 重新定义分区大小:

    (parted) resizepart minor-number new-end
    • 使用您要调整大小的分区的次号替换 minor-number :例如 3
    • 用决定重新定义大小的新分区的结束点(从磁盘开始计算)替换 new-end。您可以使用大小后缀,如 512MiB20GiB1.5TiB。默认大小 MB。

    例 18.1. 扩展分区

    例如,要将位于磁盘开头的分区大小扩展为 2GiB,请使用:

    (parted) resizepart 1 2GiB

    输入此命令后,这些更改就会生效,因此在执行前请先重新检查。

  5. 查看分区表以确认调整了大小的分区位于分区表中,且大小正确:

    (parted) print
  6. 退出 parted shell:

    (parted) quit
  7. 验证内核是否识别了新的分区:

    # cat /proc/partitions
  8. 如果您扩展了分区,也扩展了它上面的文件系统。详情请参阅(参考)。

其它资源

  • parted(8) 手册页。

第 19 章 重新分区磁盘策略

重新分区磁盘的方法有几种。本节讨论以下可能的方法:

  • 有可用的未分区的空闲空间
  • 有可用的未使用过的分区
  • 被活跃使用的分区内有可用的空闲空间

请注意,本节仅从理论上讨论了前面提到的概念,不包括关于如何逐步执行磁盘重新分区的任何流程步骤。

注意

为了清晰起见,以下示意图进行了简化,不反映您在实际安装 Red Hat Enterprise Linux 时遇到的确切分区布局。

19.1. 使用未分区的空闲空间

在这种情况下,已定义的分区不会跨越整个硬盘,留下的未分配空间不是任何已定义分区的一部分。下图显示了这可能是什么样子:

图 19.1. 有未分区的可用空间的磁盘

未分区空间

在上例中,第一个图表示一个具有一个主分区的磁盘,以及一个具有未分配空间的未定义分区的磁盘,第二个图表示具有两个定义分区且分配了空间的磁盘。

未使用的硬盘也属于这一类别。唯一的区别是,所有 空间并不是任何定义的分区的一部分。

无论哪种情况,您都可以从未使用的空间创建必要的分区。这种情境很可能是新磁盘。大部分预安装的操作系统都被配置为占据磁盘驱动器上所有可用空间。

19.2. 使用未使用分区中的空间

在这种情况下,您可以有一个或者多个不再使用的分区。下图显示了这种情况。

图 19.2. 有未使用分区的磁盘

未使用的分区

在上例中,第一个图表示带有未使用分区的磁盘,第二个图表示为 Linux 重新分配未使用的分区。

在这种情况下,您可以使用分配给未使用分区的空间。您必须删除分区,然后在此位置上创建合适的 Linux 分区。您可以删除未使用的分区,并在安装过程中手动创建新分区。

19.3. 使用活跃分区中的空闲空间

这是最常见的情况。它也是最难处理的,因为即使您有足够的可用空间,它目前也被分配给一个已经在使用的分区。如果您购买了一台带有预装软件的计算机,硬盘很可能有一个大型分区存放操作系统和数据。

除了向系统添加新硬盘外,您还可以选择破坏性和非破坏性重新分区。

19.3.1. 破坏性重新分区

这会删除分区并创建几个较小的分区。您必须进行完整备份,因为原始分区中的所有数据都会被破坏。创建两个备份,使用验证(如果您的备份软件提供的话),并在删除分区 尝试从备份中读取数据。

警告

如果在该分区上安装了操作系统,必须重新安装它才能使用该系统。请注意,一些预装了操作系统的计算机可能不包括安装介质来重新安装原始操作系统。在销毁原始分区及其操作系统安装 ,您应该检查这是否适合您的系统。

为现有操作系统创建一个更小的分区后,您可以重新安装软件,恢复您的数据并启动 Red Hat Enterprise Linux 安装。

图 19.3. 在磁盘上进行破坏性重新分区动作

dstrct reprt
警告

原有分区中的数据将会丢失。

19.3.2. 非破坏性重新分区

通过非破坏性重新分区,您可以执行一个程序,使大分区变小,而又不会丢失该分区中存储的任何文件。这个方法通常是可靠的,但在大型驱动器上可能非常耗时。

非破坏性重新分区过程很简单,它由三个步骤组成:

  1. 压缩和备份现存数据
  2. 重新划分现存分区的大小
  3. 创建新分区

每个步骤都会详细介绍。

19.3.2.1. 压缩现有数据

第一步要压缩现存分区上的数据。这样做的原因是重新安排数据,以最大化分区"结尾"处的可用空间。

图 19.4. 磁盘压缩

compression

在上例中,第一个图代表压缩前的磁盘,第二个图表代表压缩后的磁盘。

这一步骤至关重要。如果没有它,数据的位置可能会阻止分区调整为所需的大小。请注意,有些数据不能移动。在这种情况下,它会严重限制新分区的大小,并且可能会强制您以破坏性方式重新分区磁盘。

19.3.2.2. 重新调整现有分区的大小

下图显示了实际调整大小的流程。虽然重新调整大小操作的实际结果会有所不同,具体取决于所使用的软件,但在大多数情况下,新释放的空间用于创建与原始分区类型相同的、未格式化的分区。

图 19.5. 分区在磁盘上调整大小

部分调整大小

在上例中,第一个图表示调整大小前的分区,第二个图表示调整大小后的分区。

务必要了解调整大小的软件如何处理新释放的空间,以便您可以执行相应的步骤。在此处演示的情形中,最好删除新的 DOS 分区,并创建合适的 Linux 分区。

19.3.2.3. 创建新分区

如上例中所述,也不一定要创建新分区。然而,除非重新分区软件支持安装 Linux 系统,您很可能需要删除在调整大小过程中创建的分区。

图 19.6. 带有最终分区配置的磁盘

nondestruct fin

在上例中,第一个图表示配置前的磁盘,第二个图表示配置后的磁盘。

第 20 章 XFS 入门

这是如何创建和维护 XFS 文件系统的概述。

20.1. XFS 文件系统

XFS 是一个高度可扩展、高性能、健壮且成熟的 64 位日志文件系统,其支持单个主机上非常大的文件和文件系统。它是 Red Hat Enterprise Linux 9 中的默认文件系统。XFS 最初于 1990 年代由 SGI 早期开发,并在非常大型的服务器和存储阵列中运行有很长的历史记录。

XFS 的功能包括:

可靠性
  • 元数据日志,其确保系统崩溃后文件系统的完整性,方法是保留系统重启和重新挂载文件系统时可以重新执行的文件系统操作的记录,
  • 广泛的运行时元数据一致性检查
  • 可扩展且快速修复工具
  • 配额日志。这可避免在崩溃后进行冗长的配额一致性检查。
可伸缩性和性能
  • 支持最多 1024 TiB 的文件系统大小
  • 支持大量并发操作的能力
  • B-tree 索引,用于空闲空间的可扩展性管理
  • 复杂的元数据读头算法
  • 优化流视频工作负载
分配方案
  • 基于扩展数据块的分配
  • 条带化分配策略
  • 延迟分配
  • 空间预分配
  • 动态分配的 inode
其他功能
  • 基于 Reflink 的文件副本
  • 严格集成备份和恢复工具
  • 在线清理
  • 在线文件系统增大
  • 全面的诊断功能
  • 扩展属性(xattr)。这允许系统能够按文件关联多个额外的名称/值对。
  • 项目或目录配额。这允许对目录树的配额限制。
  • 小于秒的时间戳

性能特性

XFS 在具有企业工作负载的大型系统上具有高性能。大型系统是一个有相对较多的 CPU 、多个 HBA 和连接外部磁盘阵列的系统。XFS 在具有多线程、并行 I/O 工作负载的较小系统上也表现良好。

对于单线程、元数据密集型工作负载,XFS 的性能相对较低:例如,在单个线程中创建或删除大量小文件的工作负载。

20.2. 和 ext4 和 XFS 一起使用的工具比较

这部分比较用于完成 ext4 和 XFS 文件系统中常用任务的工具。

任务ext4XFS

创建文件系统

mkfs.ext4

mkfs.xfs

文件系统检查

e2fsck

xfs_repair

重新定义文件系统大小

resize2fs

xfs_growfs

保存文件系统的镜像

e2image

xfs_metadumpxfs_mdrestore

标签或者调整文件系统

tune2fs

xfs_admin

备份文件系统

tarrsync

xfsdumpxfsrestore

配额管理

quota

xfs_quota

文件映射

filefrag

xfs_bmap

注意

如果您需要通过网络进行备份的完整客户端-服务器解决方案,您可以使用 RHEL 9 中提供的 bacula 备份实用程序。有关 Bacula 的更多信息,请参阅 Bacula 备份解决方案

第 21 章 创建 XFS 文件系统

作为系统管理员,您可以在块设备上创建 XFS 文件系统,使其可以存储文件和目录。

21.1. 使用 mkfs.xfs 创建 XFS 文件系统

这个流程描述了如何在块设备上创建 XFS 文件系统。

流程

  1. 要创建文件系统,请执行以下操作:

    • 如果设备是常规分区、LVM 卷、MD 卷、磁盘或者类似的设备,请使用以下命令:

      # mkfs.xfs block-device
      • 使用到块设备的路径替换 block-device。例如: /dev/sdb1/dev/disk/by-uuid/05e99ec8-def1-4a5e-8a9d-5945339ceb2a/dev/my-volgroup/my-lv
      • 一般情况下,默认选项是常见用途的最佳选择。
      • 在包含现有文件系统的块设备上使用 mkfs.xfs 时,添加 -f 选项来覆盖该文件系统。
    • 要在硬件 RAID 设备上创建文件系统,检查系统是否正确检测到该设备的条带几何结构:

      • 如果条带几何结构信息正确,则不需要额外的选项。创建文件系统:

        # mkfs.xfs block-device
      • 如果信息不正确,请使用 -d 选项的 susw 参数 来手动指定条带几何结构。su 参数指定 RAID 块大小,sw 参数指定 RAID 设备中数据磁盘的数量。

        例如:

        # mkfs.xfs -d su=64k,sw=4 /dev/sda3
  2. 使用以下命令等待系统注册新设备节点:

    # udevadm settle

其它资源

  • mkfs.xfs(8) 手册页。

第 22 章 使用 RHEL 系统角色在块设备中创建 XFS 文件系统

这部分描述了如何使用 存储 角色在多个目标机器的块设备上创建 XFS 文件系统。

先决条件

  • 存在一个使用该 存储 角色的 Ansible playbook。

    如需有关如何应用此类 playbook 的信息,请参阅 应用角色

22.1. 在块设备中创建 XFS 文件系统的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用存储角色,以使用默认参数在块设备中创建 XFS 文件系统。

警告

存储角色只能在未分区、整个磁盘或者逻辑卷(LV)上创建文件系统。它不能在分区中创建文件系统。

例 22.1. 在 /dev/sdb 上创建 XFS 的 playbook

---
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - sdb
        fs_type: xfs
  roles:
    - rhel-system-roles.storage
  • 卷名称(示例中为 barefs )目前是任意的。Storage 角色根据 disk: 属性中列出的磁盘设备标识卷。
  • 您可以省略 fs_type: xfs 行,因为 XFS 是 RHEL 9 中的默认文件系统。
  • 要在 LV 上创建文件系统,请在 disks: 属性下提供 LVM 设置,包括括起的卷组。

    不要提供到 LV 设备的路径。

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

22.2. 其它资源

第 23 章 备份 XFS 文件系统

作为系统管理员,您可以使用 xfsdump 将 XFS 文件系统备份到文件或磁带。这提供了一个简单的备份机制。

23.1. XFS 备份特性

这部分描述了使用 xfsdump 工具备份 XFS 文件系统的主要概念和功能。

您可以使用 xfsdump 工具来:

  • 对常规文件镜像执行备份。

    只能将一个备份写入常规文件。

  • 在磁带驱动器中执行备份。

    xfsdump 工具还允许您将多个备份写入同一磁带。备份可跨越多个标题。

    要将多个文件系统备份到单个磁带设备,只需将备份写入已包含 XFS 备份的磁带。这会将新备份附加到上一个备份。默认情况下,xfsdump 永远不会覆盖现有的备份。

  • 创建增量备份。

    xfsdump 工具使用转储级来确定其他备份所相对的基本备份。从 0 到 9 的数字表示增加的转储级。增量备份只备份自上一次较低级别转储以来发生变化的文件:

    • 要执行全备份,请对文件系统中执行 0 级转储。
    • 1 级转储是全备份后的第一个增量备份。下一个增量备份为 2 级,它仅备份自 1 级转储以来更改的文件,以此类推,最高到 9 级。
  • 使用大小、子树或 inode 标志从备份中排除文件,以过滤它们。

其它资源

  • xfsdump(8) 手册页。

23.2. 使用 xfsdump 备份 XFS 文件系统

这个步骤描述了如何将 XFS 文件系统的内容备份到文件或者磁带中。

先决条件

  • 您可以备份的 XFS 文件系统。
  • 可以保存备份的其它文件系统或者磁带驱动器。

流程

  • 使用以下命令备份 XFS 文件系统:

    # xfsdump -l level [-L label] \
              -f backup-destination path-to-xfs-filesystem
    • 使用备份的转储级别替换 level。使用 0 执行全备份,或使用 19 执行后续增量备份。
    • 使用您要存储备份的路径替换 backup-destination。目的地可以是常规文件、磁带驱动器或远程磁带设备。例如:用于文件的 /backup-files/Data.xfsdump 或者用于磁带驱动器的 /dev/st0
    • 使用您要备份的 XFS 文件系统的挂载点替换 path-to-xfs-filesystem。例如:/mnt/data/。文件系统必须挂载。
    • 当备份多个文件系统,并将它们保存在单个磁带设备上时,请使用 -L label 选项来为每个备份添加一个会话标签,以便在恢复时更轻松地识别它们。使用备份的任何名称替换 label :例如 backup_data

例 23.1. 备份多个 XFS 文件系统

  • 要备份挂载在 /boot//data/ 目录中的 XFS 文件系统内容,并将它们保存为 /backup-files/ 目录中的文件:

    # xfsdump -l 0 -f /backup-files/boot.xfsdump /boot
    # xfsdump -l 0 -f /backup-files/data.xfsdump /data
  • 要备份单个磁带设备中的多个文件系统,请使用 -L label 选项来为每个备份添加一个会话标签:

    # xfsdump -l 0 -L "backup_boot" -f /dev/st0 /boot
    # xfsdump -l 0 -L "backup_data" -f /dev/st0 /data

其它资源

  • xfsdump(8) 手册页。

23.3. 其它资源

  • xfsdump(8) 手册页。

第 24 章 从备份中恢复 XFS 文件系统

作为系统管理员,您可以使用 xfsrestore 工具来恢复用 xfsdump 工具创建的,并存储在文件或磁带中的 XFS 备份。

24.1. 从备份中恢复 XFS 的特性

这部分描述了使用 xfsrestore 工具从备份中恢复 XFS 文件系统的主要概念和特性。

xfsrestore 工具从 xfsdump 生成的备份中恢复文件系统。xfsrestore 工具有两个模式:

  • 简单 模式允许用户从 0 级转储恢复整个文件系统。这是默认的模式。
  • 累计 模式启用从增量备份恢复文件系统:即,1 级到 9 级。

唯一 会话 ID会话标签 标识每个备份。从包含多个备份的磁带恢复备份需要相应的会话 ID 或标签。

要从备份中提取、添加或删除特定文件,请进入 xfsrestore 交互模式。交互模式提供了一组命令来操作备份文件。

其它资源

  • xfsrestore(8) 手册页。

24.2. 使用 xfsrestore 从备份中恢复 XFS 文件系统

这个步骤描述了如何从文件或者磁带备份中恢复 XFS 文件系统的内容。

先决条件

  • XFS 文件系统的文件或磁带备份,如 备份 XFS 文件系统 中所述。
  • 您可以恢复备份的存储设备。

流程

  • 恢复备份的命令因您是从全备份或增量备份中恢复,还是从单个磁带设备恢复多个备份而有所不同:

    # xfsrestore [-r] [-S session-id] [-L session-label] [-i]
                 -f backup-location restoration-path
    • 使用备份位置替换 backup-location。这可以是常规文件、磁带驱动器或远程磁带设备。例如:用于文件的 /backup-files/Data.xfsdump 或者用于磁带驱动器的 /dev/st0
    • 使用要恢复文件系统的目录的路径替换 restore-path。例如:/mnt/data/
    • 要从增量(1 级到 9 级)备份恢复文件系统,请添加 -r 选项。
    • 要从包含多个备份的磁带设备恢复备份,请使用 -S-L 选项指定备份。

      -S 选项允许您按会话 ID 选择备份,而 -L 选项则允许您按会话标签进行选择。要获取会话 ID 和会话标签,请使用 xfsrestore -I 命令。

      使用备份的会话 ID 替换 session-id。例如,b74a3586-e52e-4a4a-8775-c3334fa8ea2c。使用备份的会话标签替换 session-label。例如,my_backup_session_label

    • 要以交互方式使用 xfsrestore,请使用 -i 选项。

      xfsrestore 完成读取指定设备后,交互对话框开始。交互式 xfsrestore shell 中的可用命令包括 cdlsadddeleteextract; 如需命令的完整列表,请使用 help 命令。

例 24.1. 恢复多个 XFS 文件系统

  • 要恢复 XFS 备份文件,并将其内容保存到 /mnt/ 下的目录中:

    # xfsrestore -f /backup-files/boot.xfsdump /mnt/boot/
    # xfsrestore -f /backup-files/data.xfsdump /mnt/data/
  • 要从包含多个备份的磁带设备恢复,请使用会话标签或会话 ID 指定每个备份:

    # xfsrestore -L "backup_boot" -f /dev/st0 /mnt/boot/
    # xfsrestore -S "45e9af35-efd2-4244-87bc-4762e476cbab" \
                 -f /dev/st0 /mnt/data/

其它资源

  • xfsrestore(8) 手册页。

24.3. 从磁带恢复 XFS 备份时的说明性消息

当从存有多个文件系统备份的磁带恢复备份时,xfsrestore 工具可能会发出消息。当 xfsrestore 按顺序检查磁带上的每个备份时,消息会通知您是否找到了与请求的备份相匹配的备份。例如:

xfsrestore: preparing drive
xfsrestore: examining media file 0
xfsrestore: inventory session uuid (8590224e-3c93-469c-a311-fc8f23029b2a) does not match the media header's session uuid (7eda9f86-f1e9-4dfd-b1d4-c50467912408)
xfsrestore: examining media file 1
xfsrestore: inventory session uuid (8590224e-3c93-469c-a311-fc8f23029b2a) does not match the media header's session uuid (7eda9f86-f1e9-4dfd-b1d4-c50467912408)
[...]

说明性消息会一直显示,直到找到匹配的备份。

24.4. 其它资源

  • xfsrestore(8) 手册页。

第 25 章 增加 XFS 文件系统的大小

作为系统管理员,您可以增大 XFS 文件系统的大小来使用较大的存储容量。

重要

目前不能缩小 XFS 文件系统的大小。

25.1. 使用 xfs_growfs 增加 XFS 文件系统的大小

这个流程描述了如何使用 xfs_growfs 工具增大 XFS 文件系统。

先决条件

  • 确保底层块设备的大小适当,以便以后保留调整了大小的文件系统。为受影响的块设备使用合适的调整大小的方法。
  • 挂载 XFS 文件系统。

流程

  • 在挂载 XFS 文件系统时,使用 xfs_growfs 工具来增加其大小:

    # xfs_growfs file-system -D new-size
    • 使用 XFS 文件系统的挂载点替换 file-system
    • 使用 -D 选项,将 new-size 替换为在文件系统块数中指定的文件系统所需的新大小。

      要找出给定 XFS 文件系统的块大小(kB),请使用 xfs_info 工具:

      # xfs_info block-device
      
      ...
      data     =              bsize=4096
      ...
    • 如果没有 -D 选项,xfs_growfs 将文件系统增大到底层设备所支持的最大大小。

其它资源

  • xfs_growfs(8) 手册页。

第 26 章 配置 XFS 错误行为

您可以配置 XFS 文件系统在遇到不同的 I/O 错误时的行为方式。

26.1. XFS 中的可配置错误处理

当 I/O 操作期间发生错误时,XFS 文件系统以以下其中一种方式响应:

  • XFS 重复重试 I/O 操作,直到操作成功或 XFS 达到设定的限制。

    限制是基于重试的最大次数或重试的最长时间。

  • XFS 认为错误是永久性的,并停止文件系统上的操作。

您可以配置 XFS 如何对以下错误情况做出响应:

EIO
读取或写入时出错
ENOSPC
该设备中没有剩余空间
ENODEV
无法找到设备

您可以设置重试的最大次数,以及 XFS 认为其是永久错误前的最长时间(以秒为单位)。XFS 在达到任合一个限制时停止重试操作。

您还可以配置 XFS,以便在卸载文件系统时,XFS 会立即取消重试,而不考虑任何其他配置。但此配置可让卸载操作成功,尽管存在持续的错误。

默认行为

每个 XFS 错误情况的默认行为取决于错误上下文。ENODEV 等 XFS 错误都被视为致命且不可恢复的,无论重试次数如何。其默认重试限制为 0。

26.2. 特定和未定义的 XFS 错误条件的配置文件

以下目录保存用来控制不同错误条件的 XFS 错误行为的配置文件:

/sys/fs/xfs/device/error/metadata/EIO/
对于 EIO 错误情况
/sys/fs/xfs/device/error/metadata/ENODEV/
对于 ENODEV 错误情况
/sys/fs/xfs/device/error/metadata/ENOSPC/
对于 ENOSPC 错误情况
/sys/fs/xfs/device/error/default/
所有其他未定义错误条件的通用配置

每个目录包括以下配置文件来配置重试限制:

max_retries
控制 XFS 重试操作的次数上限。
retry_timeout_seconds
指定 XFS 停止重试操作后的时间限值(以秒为单位)。

26.3. 为特定条件设置 XFS 行为

这个步骤配置了 XFS 如何响应特定的错误条件。

流程

  • 设置重试的最大重试次数、重试时间限制或两者:

    • 要设置重试的最大次数,请将所需的次数写入 max_retries 文件:

      # echo value > /sys/fs/xfs/device/error/metadata/condition/max_retries
    • 要设置时间限制,将所需的秒数写入 retry_timeout_seconds 文件:

      # echo value > /sys/fs/xfs/device/error/metadata/condition/retry_timeout_second

    value 是介于 -1 和 C 带符号整数类型的最大可能值之间的数字。64 位 Linux 中是 2147483647。

    在这两个限制中,值 -1 用于持续重试,0 用于立即停止。

    device 是设备的名称,可以在 /dev/ 目录中找到;例如,sda.

26.4. 为未定义条件设置 XFS 行为

此流程配置 XFS 如何对共享一个通用配置的所有未定义的错误情况做出响应。

流程

  • 设置重试的最大重试次数、重试时间限制或两者:

    • 要设置重试的最大次数,请将所需的次数写入 max_retries 文件:

      # echo value > /sys/fs/xfs/device/error/metadata/default/max_retries
    • 要设置时间限制,将所需的秒数写入 retry_timeout_seconds 文件:

      # echo value > /sys/fs/xfs/device/error/metadata/default/retry_timeout_seconds

    value 是介于 -1 和 C 带符号整数类型的最大可能值之间的数字。64 位 Linux 中是 2147483647。

    在这两个限制中,值 -1 用于持续重试,0 用于立即停止。

    device 是设备的名称,可以在 /dev/ 目录中找到;例如,sda.

26.5. 设置 XFS 卸载行为

这个流程配置 XFS 在卸载文件系统时如何对错误情况做出响应。

如果您在文件系统中设置 fail_at_unmount 选项,它会在卸载过程中覆盖所有其他错误配置,并立即卸载文件系统,而不重试 I/O 操作。这允许卸载操作在出现持久错误时也可以成功。

警告

在卸载过程启动后,您不能更改 fail_at_unmount 值,因为卸载过程会从相应文件系统的 sysfs 接口删除配置文件。您必须在文件系统开始卸载前配置卸载行为。

流程

  • 启用或禁用 fail_at_unmount 选项:

    • 要在文件系统卸载时取消重试所有操作,请启用这个选项:

      # echo 1 > /sys/fs/xfs/device/error/fail_at_unmount
    • 要在文件系统卸载时遵守 max_retriesretry_timeout_seconds 重试限制,请禁用这个选项:

      # echo 0 > /sys/fs/xfs/device/error/fail_at_unmount

    device 是设备的名称,可以在 /dev/ 目录中找到;例如,sda.

第 27 章 检查和修复文件系统

RHEL 提供可以检查和修复文件系统的文件系统管理工具。这些工具通常被称为 fsck 工具,其中 fsck文件系统检查 的缩写版本。在大多数情况下,这些工具会根据需要在系统引导期间自动运行,但也可以根据需要手动调用。

重要

文件系统检查程序只保证跨文件系统的元数据的一致性。它们不知道文件系统中所包含的实际数据,它们不是数据恢复工具。

27.1. 需要文件系统检查的场景

如果出现以下情况,可以使用相关的 fsck 工具来检查您的系统:

  • 系统无法引导
  • 特定磁盘上的文件损坏
  • 由于不一致,文件系统关闭或变为只读
  • 文件系统上的文件无法访问

发生文件系统不一致的原因可能有多种,包括但不限于硬件错误、存储管理错误和软件 bug 。

重要

文件系统检查工具不能修复硬件问题。如果修复操作成功,文件系统必须是完全可读写的。如果文件系统因为硬件错误而损坏,则必须首先将该文件系统移至好的磁盘,例如,使用 dd(8) 工具。

对于日志文件系统,启动时通常需要的所有操作是重播日志(如果需要),此操作通常是一个短操作。

但是,如果发生文件系统不一致或损坏的情况,即使是对于日志记录文件系统,也必须使用文件系统检查程序来修复文件系统。

重要

通过将 /etc/fstab 中的第 6 字段设为 0,可以在引导时禁用文件系统检查。但是,红帽不建议这样做,除非您在启动时遇到 fsck 问题,例如对于非常大的或远程文件系统。

其它资源

  • fstab(5) 手册页。
  • fsck(8) 手册页。
  • dd(8) 手册页。

27.2. 运行 fsck 的潜在副作用

通常,运行文件系统检查和修复工具至少可以自动修复发现的一些不一致问题。在某些情况下可能会出现以下问题:

  • 如果无法修复,可以丢弃严重损坏的 inode 或目录。
  • 可能会对文件系统进行大量更改。

要确保不会永久地进行意外或不必要的更改,请确保遵循流程中概述的任何预防步骤。

27.3. XFS 中的错误处理机制

这部分论述了 XFS 如何处理文件系统中各种错误。

未完全卸载

日志维护文件系统上发生的元数据变化的事务记录。

在系统崩溃、电源故障或其他未完全卸载的情况下,XFS 使用 journal (也称为 log )来恢复文件系统。挂载 XFS 文件系统时,内核执行日志恢复。

损坏

在这种情况下,损坏 意味着文件系统中出现以下情况引起的错误,例如:

  • 硬件故障
  • 存储固件、设备驱动程序、软件堆栈或者文件系统本身的错误
  • 导致文件系统部分内容被文件系统之外的内容覆盖的问题

当 XFS 检测到文件系统或文件系统元数据中的损坏时,它可以关闭文件系统,并在系统日志中报告该事件。请注意,如果损坏发生在托管 /var 目录的文件系统上,重启后这些日志将不可用。

例 27.1. 系统日志条目报告 XFS 崩溃

# dmesg --notime | tail -15

XFS (loop0): Mounting V5 Filesystem
XFS (loop0): Metadata CRC error detected at xfs_agi_read_verify+0xcb/0xf0 [xfs], xfs_agi block 0x2
XFS (loop0): Unmount and run xfs_repair
XFS (loop0): First 128 bytes of corrupted metadata buffer:
00000000027b3b56: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000000005f9abc7a: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000000005b0aef35: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000000da9d2ded: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000000001e265b07: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000000006a40df69: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000000000b272907: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000000e484aac5: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
XFS (loop0): metadata I/O error in "xfs_trans_read_buf_map" at daddr 0x2 len 1 error 74
XFS (loop0): xfs_imap_lookup: xfs_ialloc_read_agi() returned error -117, agno 0
XFS (loop0): Failed to read root inode 0x80, error 11

当尝试访问损坏的 XFS 文件系统时,用户空间工具通常会报告 输入/输出错误 消息。挂载带有损坏日志的 XFS 文件系统会导致挂载失败,并出现以下错误消息:

mount: /mount-point: mount(2) system call failed: Structure needs cleaning.

您必须手动使用 xfs_repair 工具来修复损坏。

其它资源

  • xfs_repair(8) 手册页。

27.4. 使用 xfs_repair 检查 XFS 文件系统

这个过程使用 xfs_repair 工具对 XFS 文件系统执行只读检查。您必须手动使用 xfs_repair 工具来修复任何损坏。与其他文件系统修复工具不同,xfs_repair 不会在引导时运行,即使 XFS 文件系统没有被完全卸载。在未完全卸载的情况下,XFS 会在挂载时重播日志,从而确保文件系统一致;xfs_repair 不能在不先重新挂载脏日志的情况下修复带有脏日志的 XFS 文件系统。

注意

虽然 xfsprogs 软件包中有 fsck.xfs 二进制文件,但这仅用于满足在引导时查找 fsck.file 系统二进制文件的 initscriptsfsck.xfs 立即退出,退出代码为 0。

流程

  1. 通过挂载和卸载文件系统重新显示日志:

    # mount file-system
    # umount file-system
    注意

    如果挂载失败,并带有结构需要清理的错误,则日志已损坏,且无法重播。试运行应发现并报告更多有关磁盘损坏的信息。

  2. 使用 xfs_repair 工具执行试运行来检查文件系统。打印任何错误并指示将要采取的操作,而不修改文件系统。

    # xfs_repair -n block-device
  3. 挂载文件系统:

    # mount file-system

其它资源

  • xfs_repair(8) 手册页。
  • xfs_metadump(8) 手册页。

27.5. 使用 xfs_repair 修复 XFS 文件系统

这个过程使用 xfs_repair 工具修复损坏的 XFS 文件系统。

流程

  1. 使用 xfs_metadump 工具在修复前为诊断或测试目的创建元数据镜像。如果损坏是由软件 bug 导致的,则预修复文件系统元数据映像对于支持调查非常有用。预修复镜像中出现的损坏模式有助于分析根本原因。

    • 使用 xfs_metadump 调试工具将 XFS 文件系统中的元数据复制到文件。如果需要发送大的 metadump 文件来支持,可使用标准压缩工具来压缩生成的 metadump 文件,以减少文件大小。

      # xfs_metadump block-device metadump-file
  2. 通过重新挂载文件系统来重新显示日志:

    # mount file-system
    # umount file-system
  3. 使用 xfs_repair 工具来修复卸载的文件系统:

    • 如果挂载成功,则不需要额外的选项:

      # xfs_repair block-device
    • 如果挂载失败,带有 Structure needs cleaning 错误,日志会破坏且无法重复显示。使用 -L 选项(强制日志归零)来清除日志:

      警告

      该命令会导致崩溃时正在进行的所有元数据更新丢失,这可能会造成严重的文件系统损坏和数据丢失。只有在无法重播日志时,才应将其作为最后的手段。

      # xfs_repair -L block-device
  4. 挂载文件系统:

    # mount file-system

其它资源

  • xfs_repair(8) 手册页。

27.6. ext2、ext3 和 ext4 中的处理机制出错

ext2、ext3 和 ext4 文件系统使用 e2fsck 工具来执行文件系统检查和修复。文件名 fsck.ext2fsck.ext3fsck.ext4e2fsck 工具的硬链接。这些二进制文件在引导时自动运行,其行为因正在检查的文件系统和文件系统的状态而异。

对于不是元数据日志记录文件系统的 ext2 和没有日志的 ext4 文件系统,会调用完整的文件系统检查和修复。

对于带有元数据日志的 ext3 和 ext4 文件系统,日志将在用户空间中重播,从实用工具退出。这是默认操作,因为日志重播确保崩溃后文件系统的一致性。

如果这些文件系统在挂载时遇到元数据不一致的情况,它们会在文件系统超级块中记录此事实。如果 e2fsck 发现文件系统标记有这样的错误,e2fsck 会在重播日志(如果存在)后执行全面的检查。

其它资源

  • fsck(8) 手册页。
  • e2fsck(8) 手册页。

27.7. 使用 e2fsck 检查 ext2、ext3 或者 ext4 文件系统

这个流程使用 e2fsck 工具检查 ext2、ext3 或 ext4 文件系统。

流程

  1. 通过重新挂载文件系统来重新显示日志:

    # mount file-system
    # umount file-system
  2. 执行空运行检查文件系统。

    # e2fsck -n block-device
    注意

    打印任何错误并指示将要采取的操作,而不修改文件系统。稍后一致性检查阶段可能会打印额外的错误,因为在修复模式下运行时,它会发现可能在早期阶段已经修复了的不一致问题。

其它资源

  • e2image(8) 手册页。
  • e2fsck(8) 手册页。

27.8. 使用 e2fsck 修复 ext2、ext3 或者 ext4 文件系统

这个流程使用 e2fsck 工具修复损坏的 ext2、ext3 或 ext4 文件系统。

流程

  1. 保存文件系统镜像以进行支持调查。如果损坏是由软件 bug 导致的,则预修复文件系统元数据映像对于支持调查非常有用。预修复镜像中出现的损坏模式有助于分析根本原因。

    注意

    严重损坏的文件系统可能会导致元数据镜像创建出现问题。

    • 如果要为测试目的创建镜像,请使用 -r 选项来创建与文件系统本身大小相同的稀疏文件。然后 e2fsck 可以直接对生成的文件进行操作。

      # e2image -r block-device image-file
    • 如果您要创建要存档或提供用于诊断的镜像,请使用 -Q 选项,该选项可创建适合于传输的更紧凑的文件格式。

      # e2image -Q block-device image-file
  2. 通过重新挂载文件系统来重新显示日志:

    # mount file-system
    # umount file-system
  3. 自动修复文件系统。如果需要用户干预,e2fsck 指明其输出中未修复的问题,并在退出代码中反映此状态。

    # e2fsck -p block-device

    其它资源

    • e2image(8) 手册页。
    • e2fsck(8) 手册页。

第 28 章 挂载文件系统

作为系统管理员,您可以在系统上挂载文件系统以访问其上的数据。

28.1. Linux 挂载机制

这部分论述了在 Linux 中挂载文件系统的基本概念。

在 Linux、UNIX 和类似的操作系统中,不同分区和可移动设备(例如,CD、DVD 或者 USB 闪存)上的文件系统可以附加到目录树中的某个点(挂载点),然后再次分离。虽然文件系统挂载在目录上,但无法访问该目录的原始内容。

请注意,Linux 不会阻止您将文件系统挂载到已附加了文件系统的目录。

挂载时,您可以通过以下方法识别设备:

  • 通用唯一标识符(UUID):例如,UUID=34795a28-ca6d-4fd8-a347-73671d0c19cb
  • 卷标签:例如,LABEL=home
  • 到非持久性块设备的完整路径:例如,/dev/sda3

当您使用 mount 命令挂载文件系统时,如果没有提供所有必需的信息,即设备名称、目标目录或文件系统类型,mount 工具会读取 /etc/fstab 文件的内容,以检查其中是否列出了给定的文件系统。/etc/fstab 文件包含设备名称列表、所选文件系统要挂载的目录,以及文件系统类型和挂载选项。因此,当挂载在 /etc/fstab 中指定的文件系统时,以下命令语法就足够了:

  • 使用挂载点挂载:

    # mount directory
  • 使用块设备挂载:

    # mount device

其它资源

28.2. 列出当前挂载的文件系统

这个流程描述了如何在命令行上列出所有当前挂载的文件系统。

流程

  • 要列出所有挂载的文件系统,请使用 findmnt 工具:

    $ findmnt
  • 要将列出的文件系统限制为特定的文件系统类型,请添加 --types 选项:

    $ findmnt --types fs-type

    例如:

    例 28.1. 只列出 XFS 文件系统

    $ findmnt --types xfs
    
    TARGET  SOURCE                                                FSTYPE OPTIONS
    /       /dev/mapper/luks-5564ed00-6aac-4406-bfb4-c59bf5de48b5 xfs    rw,relatime
    ├─/boot /dev/sda1                                             xfs    rw,relatime
    └─/home /dev/mapper/luks-9d185660-7537-414d-b727-d92ea036051e xfs    rw,relatime

其它资源

  • findmnt(8) 手册页

28.3. 使用 mount 挂载文件系统

这个流程描述了如何使用 mount 工具挂载文件系统。

先决条件

  • 确定在您选择的挂载点上还没有挂载文件系统:

    $ findmnt mount-point

流程

  1. 要附加某个文件系统,请使用 mount 工具:

    # mount device mount-point

    例 28.2. 挂载 XFS 文件系统

    例如:要挂载由 UUID 识别的本地 XFS 文件系统:

    # mount UUID=ea74bbec-536d-490c-b8d9-5b40bbd7545b /mnt/data
  2. 如果 mount 无法自动识别文件系统类型,请使用 --types 选项来指定:

    # mount --types type device mount-point

    例 28.3. 挂载 NFS 文件系统

    例如:要挂载远程 NFS 文件系统:

    # mount --types nfs4 host:/remote-export /mnt/nfs

其它资源

  • mount(8) 手册页

28.4. 移动挂载点

这个步骤描述了如何将挂载的文件系统挂载点更改为不同的目录。

流程

  1. 要更改挂载文件系统的目录:

    # mount --move old-directory new-directory

    例 28.4. 移动本地文件系统

    例如,将挂载在 /mnt/userdirs/ 目录的文件系统移动到 /home/ 挂载点:

    # mount --move /mnt/userdirs /home
  2. 验证文件系统是否已如预期移动:

    $ findmnt
    $ ls old-directory
    $ ls new-directory

其它资源

  • mount(8) 手册页

28.5. 使用 umount 卸载文件系统

这个流程描述了如何使用 umount 工具卸载文件系统。

流程

  1. 使用以下命令之一卸载文件系统:

    • 通过挂载点:

      # umount mount-point
    • 通过设备:

      # umount device

    如果命令失败并显示类似如下的错误,这意味着文件系统正在使用,因为进程正在使用其上的资源:

    umount: /run/media/user/FlashDrive: target is busy.
  2. 如果文件系统正在使用,请使用 fuser 工具来确定哪个进程正在访问它。例如:

    $ fuser --mount /run/media/user/FlashDrive
    
    /run/media/user/FlashDrive: 18351

    之后,终止正在使用文件系统的进程,并尝试再次卸载它。

28.6. 常用挂载选项

这部分列出了 mount 工具的一些常用选项。

您可以按以下语法使用这些选项:

# mount --options option1,option2,option3 device mount-point

表 28.1. 常用挂载选项

选项描述

async

对文件系统启用异步输入和输出操作。

auto

使用 mount -a 命令使文件系统被自动挂载。

defaults

async,auto,dev,exec,nouser,rw,suid 选项提供别名。

exec

允许在特定文件系统中执行二进制文件。

loop

将镜像挂载为 loop 设备。

noauto

默认行为禁用使用 mount -a 命令对文件系统进行自动挂载。

noexec

不允许在特定文件系统中执行二进制文件。

nouser

不允许普通用户(即 root 用户)挂载和卸载文件系统。

remount

如果已经挂载文件系统,则会重新挂载文件系统。

ro

仅挂载文件系统以读取。

rw

挂载文件系统以进行读和写操作。

user

允许普通用户(即 root 用户)挂载和卸载该文件系统。

第 29 章 在多个挂载点共享挂载

作为系统管理员,您可以重复挂载点以便从多个目录中访问文件系统。

29.1. 共享挂载的类型

您可以使用多种共享挂载。当您在共享挂载点挂载另一个文件系统时,这两种文件系统之间的区别就是这种情况。共享挂载使用共享子树功能实现。

可用的挂载类型如下:

private

这个类型不接收或转发任何传播事件。

当您在重复或者原始挂载点下挂载另一个文件系统时,不会反映在另一个文件系统中。

shared

这个类型会为给定挂载点创建准确的副本。

当挂载点被标记为 shared 挂载时,原始挂载点中的任何挂载都会反映在其中,反之亦然。

这是根文件系统的默认挂载类型。

slave

此类型会创建给定挂载点的有限重复。

当挂载点标记为 slave 挂载时,原始挂载点中的任何挂载都会反映在该挂载点中,但 slave 挂载中的任何挂载都没有反映在其原始挂载中。

unbindable
此类型可防止给定挂载点被复制。

29.2. 创建私有挂载点副本

这个流程将挂载点复制为私有挂载。您稍后挂载到复制或原始挂载点下的文件系统不会反映在另一个文件系统中。

流程

  1. 从原始挂载点创建虚拟文件系统(VFS)节点:

    # mount --bind original-dir original-dir
  2. 将原始挂载点标记为私有:

    # mount --make-private original-dir

    或者,要更改所选挂载点以及其下的所有挂载点的挂载类型,请使用 --make-rprivate 选项,而不是 --make-private 选项。

  3. 创建副本:

    # mount --bind original-dir duplicate-dir

例 29.1. 将 /media 复制到 /mnt 作为专用挂载点

  1. /media 目录创建 VFS 节点:

    # mount --bind /media /media
  2. /media 目录标记为私有:

    # mount --make-private /media
  3. /mnt 中创建副本:

    # mount --bind /media /mnt
  4. 现在可以验证 /media/mnt 共享内容,但 /media 中的挂载内容没有出现在 /mnt 中。例如,如果 CD-ROM 驱动器包含非空介质,并且 /media/cdrom/ 目录存在,请使用:

    # mount /dev/cdrom /media/cdrom
    # ls /media/cdrom
    EFI  GPL  isolinux  LiveOS
    # ls /mnt/cdrom
    #
  5. 还可以验证 /mnt 目录中挂载的文件系统没有反映在 /media 中。例如,如果插入了使用 /dev/sdc1 设备的非空 USB 闪存,且 /mnt/flashdisk/ 目录存在,请使用:

    # mount /dev/sdc1 /mnt/flashdisk
    # ls /media/flashdisk
    # ls /mnt/flashdisk
    en-US  publican.cfg

其它资源

  • mount(8) 手册页

29.3. 创建共享挂载点副本

这个流程将挂载点复制为共享挂载。您稍后挂载到原始目录或副本下的文件系统始终反映在其它文件系统中。

流程

  1. 从原始挂载点创建虚拟文件系统(VFS)节点:

    # mount --bind original-dir original-dir
  2. 将原始挂载点标记为共享:

    # mount --make-shared original-dir

    或者,要更改所选挂载点和其下的所有挂载点的挂载类型,请使用 --make-rshared 选项,而不是 --make-shared

  3. 创建副本:

    # mount --bind original-dir duplicate-dir

例 29.2. 将 /media 重复到 /mnt 作为共享挂载点

要使 /media/mnt 目录共享相同的内容:

  1. /media 目录创建 VFS 节点:

    # mount --bind /media /media
  2. /media 目录标记为共享:

    # mount --make-shared /media
  3. /mnt 中创建副本:

    # mount --bind /media /mnt
  4. 现在,可以验证 /media 中的挂载是否也出现在 /mnt 中。例如,如果 CD-ROM 驱动器包含非空介质,并且 /media/cdrom/ 目录存在,请使用:

    # mount /dev/cdrom /media/cdrom
    # ls /media/cdrom
    EFI  GPL  isolinux  LiveOS
    # ls /mnt/cdrom
    EFI  GPL  isolinux  LiveOS
  5. 同样,还可以验证 /mnt 目录中挂载的任何文件系统是否反映在 /media 中。例如,如果插入了使用 /dev/sdc1 设备的非空 USB 闪存,且 /mnt/flashdisk/ 目录存在,请使用:

    # mount /dev/sdc1 /mnt/flashdisk
    # ls /media/flashdisk
    en-US  publican.cfg
    # ls /mnt/flashdisk
    en-US  publican.cfg

其它资源

  • mount(8) 手册页

29.4. 创建从挂载点副本

这个流程将挂载点复制为 slave 挂载类型。您稍后挂载在原始挂载点下的文件系统将反映在副本中,而不是反过来。

流程

  1. 从原始挂载点创建虚拟文件系统(VFS)节点:

    # mount --bind original-dir original-dir
  2. 将原始挂载点标记为共享:

    # mount --make-shared original-dir

    或者,要更改所选挂载点和其下的所有挂载点的挂载类型,请使用 --make-rshared 选项,而不是 --make-shared

  3. 创建副本,并将其标记为 slave 类型:

    # mount --bind original-dir duplicate-dir
    # mount --make-slave duplicate-dir

例 29.3. 将 /media 复制到 /mnt 作为从挂载点

这个示例演示了如何使 /media 目录的内容也出现在 /mnt 中,但 /mnt 目录中的任何挂载都不会反映在 /media 中。

  1. /media 目录创建 VFS 节点:

    # mount --bind /media /media
  2. /media 目录标记为共享:

    # mount --make-shared /media
  3. /mnt 中创建副本,并将其标记为 slave

    # mount --bind /media /mnt
    # mount --make-slave /mnt
  4. 验证 /media 中的挂载是否也出现在 /mnt 中。例如,如果 CD-ROM 驱动器包含非空介质,并且 /media/cdrom/ 目录存在,请使用:

    # mount /dev/cdrom /media/cdrom
    # ls /media/cdrom
    EFI  GPL  isolinux  LiveOS
    # ls /mnt/cdrom
    EFI  GPL  isolinux  LiveOS
  5. 还要验证 /mnt 目录中挂载的文件系统是否没有反映在 /media 中。例如,如果插入了使用 /dev/sdc1 设备的非空 USB 闪存,且 /mnt/flashdisk/ 目录存在,请使用:

    # mount /dev/sdc1 /mnt/flashdisk
    # ls /media/flashdisk
    # ls /mnt/flashdisk
    en-US  publican.cfg

其它资源

  • mount(8) 手册页

29.5. 防止挂载点重复

这个流程将挂载点标记为 unbindable,因此不能在另一个挂载点中复制它。

流程

  • 要将挂载点的类型改为 unbindable 挂载,请使用:

    # mount --bind mount-point mount-point
    # mount --make-unbindable mount-point

    或者,要更改所选挂载点和其下的所有挂载点的挂载类型,请使用 --make-runbindable 选项,而不是 --make-unbindable 选项。

    重复此挂载的任何后续尝试都会失败,并显示以下错误:

    # mount --bind mount-point duplicate-dir
    
    mount: wrong fs type, bad option, bad superblock on mount-point,
    missing codepage or helper program, or other error
    In some cases useful info is found in syslog - try
    dmesg | tail  or so

例 29.4. 防止 /media 被复制

  • 要防止 /media 目录被共享,请使用:

    # mount --bind /media /media
    # mount --make-unbindable /media

其它资源

  • mount(8) 手册页

第 30 章 永久挂载文件系统

作为系统管理员,您可以永久地挂载文件系统以配置不可移动的存储。

30.1. /etc/fstab 文件

这部分描述了控制文件系统永久挂载点的 /etc/fstab 配置文件。使用 /etc/fstab 是永久挂载文件系统的建议方法。

/etc/fstab 文件中的每一行定义了文件系统的挂载点。它包括六个字段,用空格分开:

  1. 由持久属性标识的块设备或其 /dev 目录的路径。
  2. 挂载该设备的目录。
  3. 该设备的文件系统。
  4. 文件系统的挂载选项。选项 defaults 表示在启动时使用默认选项挂载分区。本节还识别 x-systemd.选项 格式的 systemd 挂载单元选项。
  5. dump 工具的备份选项。
  6. fsck 工具的检查顺序。
注意

RHEL 9 中删除了用于备份文件系统的 转储 实用程序,并可在 EPEL 9 软件仓库中找到。

例 30.1. /etc/fstab 中的 /boot 文件系统

块设备挂载点File system选项Backup检查

UUID=ea74bbec-536d-490c-b8d9-5b40bbd7545b

/boot

xfs

defaults

0

0

systemd 服务从 /etc/fstab 中的条目自动生成挂载单元。

其它资源

  • fstab(5) 手册页
  • systemd.mount(5) 手册页

30.2. 在 /etc/fstab 中添加文件系统

这个流程描述了如何在 /etc/fstab 配置文件中为文件系统配置持久性挂载点。

流程

  1. 找到文件系统的 UUID 属性:

    $ lsblk --fs storage-device

    例如:

    例 30.2. 查看分区的 UUID

    $ lsblk --fs /dev/sda1
    
    NAME FSTYPE LABEL UUID                                 MOUNTPOINT
    sda1 xfs    Boot  ea74bbec-536d-490c-b8d9-5b40bbd7545b /boot
  2. 如果挂载点目录不存在,请创建它:

    # mkdir --parents mount-point
  3. 以 root 用户身份,编辑 /etc/fstab 文件,并为文件系统添加一行,由 UUID 标识。

    例如:

    例 30.3. /etc/fstab 中的 /boot 挂载点

    UUID=ea74bbec-536d-490c-b8d9-5b40bbd7545b /boot xfs defaults 0 0
  4. 重新生成挂载单元以便您的系统注册新配置:

    # systemctl daemon-reload
  5. 尝试挂载文件系统来验证配置是否正常工作:

    # mount mount-point

第 31 章 使用 RHEL 系统角色永久挂载文件系统

这部分描述了如何使用 存储 角色永久挂载文件系统。

先决条件

  • 存在一个使用该 存储 角色的 Ansible playbook。

    如需有关如何应用此类 playbook 的信息,请参阅 应用角色

31.1. 永久挂载文件系统的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用存储角色,以立即和永久挂载 XFS 文件系统。

例 31.1. 将 /dev/sdb 上的文件系统挂载到 /mnt/data 的 playbook

---
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - sdb
        fs_type: xfs
        mount_point: /mnt/data
  roles:
    - rhel-system-roles.storage
  • 此 playbook 将文件系统添加到 /etc/fstab 文件中,并立即挂载文件系统。
  • 如果 /dev/sdb 设备上的文件系统或挂载点目录不存在,则 playbook 会创建它们。

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

第 32 章 根据需要挂载文件系统

作为系统管理员,您可以将 NFS 等文件系统配置为按需自动挂载。

32.1. autofs 服务

本节解释了 autofs 服务的优点和基本概念,用于按需挂载文件系统。

使用 /etc/fstab 配置进行永久挂载的一个缺点是,无论用户访问挂载的文件系统的频率有多低,系统都必须投入资源来保持装载的文件系统。例如,当系统同时维护多个系统的 NFS 挂载时,这可能会影响系统性能。

/etc/fstab 的替代方法是使用基于内核的 autofs 服务。它由以下组件组成:

  • 实施文件系统的内核模块,以及
  • 执行所有其他功能的用户空间服务。

autofs 服务可以自动挂载和卸载文件系统(按需),从而节省了系统资源。它可用于挂载文件系统,如 NFS、AFS、SMBFS、CIFS、CIFS 和本地文件系统。

其它资源

  • autofs(8) 手册页。

32.2. autofs 配置文件

本节描述了 autofs 服务所使用的配置文件的用法和语法。

主映射文件

autofs 服务使用 /etc/auto.master (主映射)作为其默认的主配置文件。这可以通过使用 /etc/autofs.conf 配置文件中的 autofs 配置以及名称服务开关(NSS)机制来将其更改为使用其他受支持的网络源和名称。

所有 on-demand 挂载点都必须在主映射中配置。挂载点、主机名、导出的目录和选项都可以在一组文件(或其他支持的网络源)中指定,而不必为每个主机手动配置它们。

主映射文件列出了 autofs 控制的挂载点,以及它们相应的配置文件或网络来源(称为自动挂载映射)。master 映射的格式如下:

mount-point  map-name  options

使用这种格式的变量有:

mount-point
autofs 挂载点;例如,/mnt/data
map-file
映射源文件,其中包含挂载点列表以及应该挂载这些挂载点的文件系统的位置。
options
如果提供了这个选项,则它们适用于给定映射中的所有条目(如果它们本身没有指定选项的话)。

例 32.1. /etc/auto.master 文件

以下是 /etc/auto.master 文件中的一个示例行:

/mnt/data  /etc/auto.data

映射文件

映射文件配置单个 on-demand 挂载点的属性。

如果目录不存在,自动挂载程序会创建它们。如果在自动挂载程序启动之前目录已存在,则自动挂载程序在退出时不会删除它们。如果指定了超时,则如果在超时时间内没有访问该目录,则目录会被自动卸载。

映射的一般格式与主映射类似。但是,options 字段会出现在挂载点和位置之间,而不是像 master 映射那样在条目的末尾:

mount-point  options  location

使用这种格式的变量有:

mount-point
这指的是 autofs 挂载点。这可以是间接挂载的单个目录名称,也可以是直接挂载的挂载点的完整路径。每个直接和间接映射条目键(挂载点)后面都跟着一个以空格分隔的偏移目录列表(每个子目录名称都以 / 开头),这就是所谓的多挂载条目。
options
在提供这个选项时,这些选项将附加到主映射条目选项(如果有的话),或者如果配置条目 append_options 设为 no,则使用这些选项代替主映射选项。
location
这指的是文件系统的位置,如本地文件系统路径(对于以 / 开头的映射名称,前面带有 Sun 映射格式转义字符 )、NFS 文件系统或其他有效的文件系统位置。

例 32.2. 映射文件

以下是映射文件(例如 /etc/auto.misc )中的一个示例:

payroll  -fstype=nfs4  personnel:/exports/payroll
sales    -fstype=xfs   :/dev/hda4

映射文件中的第一列指示 autofs 挂载点:来自名为 personnel 的服务器的 salespayroll。第二列指示 autofs 挂载的选项。第三列显示挂载源。

根据给定的配置,autofs 挂载点将是 /home/payroll/home/sales。通常省略 -fstype= 选项,如果文件系统是 NFS,则不需要该选项,如果系统默认是 NFS 挂载的 NFSv4,则包括 NFSv4 的挂载。

使用给定配置时,如果进程需要访问 autofs 卸载的目录,如 /home/payroll/2006/July.sxc,则 autofs 服务会自动挂载该目录。

amd 映射格式

autofs 服务也识别 amd 格式的映射配置。如果要重复使用为 am-utils 服务编写的现有的自动挂载程序配置(已从 Red Hat Enterprise Linux 中删除),这将非常有用。

但是,红帽建议使用前面章节中描述的更简单的 autofs 格式。

其它资源

  • autofs(5) 手册页
  • autofs.conf(5) 手册页
  • auto.master(5) 手册页
  • /usr/share/doc/autofs/README.amd-maps 文件

32.3. 配置 autofs 挂载点

这个流程描述了如何使用 autofs 服务配置按需挂载点。

先决条件

  • 安装 autofs 软件包:

    # dnf install autofs
  • 启动并启用 autofs 服务:

    # systemctl enable --now autofs

流程

  1. 为位于 /etc/auto.identifier 的按需挂载点创建一个映射文件。使用标识挂载点的名称替换 identifier
  2. 在 映射文件中,按照 autofs 配置文件 部分中所述填写挂载点、选项和位置字段。
  3. 在主映射文件中注册映射文件,如 autofs 配置文件部分中所述
  4. 允许服务重新读取配置,以便它可以管理新配置的 autofs 挂载:

    # systemctl reload autofs.service
  5. 尝试访问 on-demand 目录中的内容:

    # ls automounted-directory

32.4. 使用 autofs 服务自动挂载 NFS 服务器用户主目录

这个流程描述了如何配置 autofs 服务来自动挂载用户主目录。

先决条件

  • 已安装 autofs 软件包。
  • autofs 服务已启用并正在运行。

流程

  1. 通过在需要挂载用户主目录的服务器上编辑 /etc/auto.master 文件,指定映射文件的挂载点和位置。要做到这一点,请在 /etc/auto.master 文件中添加以下行:

    /home /etc/auto.home
  2. 在需要挂载用户主目录的服务器中创建名为 /etc/auto.home 的映射文件,并使用以下参数编辑该文件:

    * -fstype=nfs,rw,sync host.example.com:/home/&i

    您可以跳过 fstype 参数,因为它默认为 nfs。有关详细信息,请参阅 autofs(5) 手册页。

  3. 重新载入 autofs 服务:

    # systemctl reload autofs

32.5. 覆盖或添加 autofs 站点配置文件

有时覆盖客户端系统上特定挂载点的站点默认值会很有用。

例 32.3. 初始条件

例如,请考虑以下情况:

  • 自动挂载程序映射存储在 NIS 中,/etc/nsswitch.conf 文件具有以下指令:

    automount:    files nis
  • auto.master 文件包含:

    +auto.master
  • NIS auto.master 映射文件包含:

    /home auto.home
  • NIS auto.home 映射包含:

    beth    fileserver.example.com:/export/home/beth
    joe     fileserver.example.com:/export/home/joe
    *       fileserver.example.com:/export/home/&
  • autofs 配置选项 BROWSE_MODE 设为 yes

    BROWSE_MODE="yes"
  • 文件映射 /etc/auto.home 不存在。

流程

这部分描述了从不同服务器挂载主目录的示例,并使用所选条目增强 auto.home

例 32.4. 从不同服务器挂载主目录

根据上述条件,假设客户端系统需要覆盖 NIS 映射 auto.home ,并从其他服务器挂载主目录。

  • 在这种情况下,客户端需要使用以下 /etc/auto.master 映射:

    /home ­/etc/auto.home
    +auto.master
  • /etc/auto.home 映射包含条目:

    *    host.example.com:/export/home/&

由于自动挂载程序仅处理第一次出现的挂载点,即包含 /etc/auto.home 内容的 /home 目录,而不是 NIS auto.home 映射。

例 32.5. 仅使用所选条目增强 auto.home

或者,使用几个条目来增加站点范围的 auto.home 映射:

  1. 创建一个 /etc/auto.home 文件映射,并在其中放置新条目。在结尾处,包含 NIS auto.home 映射。然后 /etc/auto.home 文件映射类似:

    mydir someserver:/export/mydir
    +auto.home
  2. 有了这些 NIS auto.home 映射条件,列出 /home 目录输出的内容:

    $ ls /home
    
    beth joe mydir

最后一个示例按预期工作,因为 autofs 不包含与正在读取的文件映射同名的文件映射的内容。因此,autofs 转到 nsswitch 配置中的下一个映射源。

32.6. 使用 LDAP 存储自动挂载器映射

此流程将 autofs 配置为将自动挂载程序映射存储在 LDAP 配置中,而不是存储在 autofs 映射文件中。

先决条件

  • 必须在所有配置的系统中安装 LDAP 客户端程序库,以便从 LDAP 检索自动挂载程序映射。在 Red Hat Enterprise Linux 上,openldap 软件包应作为 autofs 软件包的依赖项自动安装。

流程

  1. 要配置 LDAP 访问,请修改 /etc/openldap/ldap.conf 文件。确保为您的站点正确设置了 BASEURIschema 选项。
  2. rfc2307bis 草案中描述了最近建立的用于在 LDAP 中存储自动映射的模式。要使用此模式,请在 /etc/autofs.conf 配置文件中通过删除模式定义中的注释字符来设置它。例如:

    例 32.6. 设置 autofs 配置

    DEFAULT_MAP_OBJECT_CLASS="automountMap"
    DEFAULT_ENTRY_OBJECT_CLASS="automount"
    DEFAULT_MAP_ATTRIBUTE="automountMapName"
    DEFAULT_ENTRY_ATTRIBUTE="automountKey"
    DEFAULT_VALUE_ATTRIBUTE="automountInformation"
  3. 确保配置中所有其他模式条目都被注释了。rfc2307bis 模式的 automountKey 属性替换 rfc2307 模式的 cn 属性。以下是 LDAP 数据交换格式(LDIF)配置的一个示例:

    例 32.7. LDIF 配置

    # auto.master, example.com
    dn: automountMapName=auto.master,dc=example,dc=com
    objectClass: top
    objectClass: automountMap
    automountMapName: auto.master
    
    # /home, auto.master, example.com
    dn: automountMapName=auto.master,dc=example,dc=com
    objectClass: automount
    automountKey: /home
    automountInformation: auto.home
    
    # auto.home, example.com
    dn: automountMapName=auto.home,dc=example,dc=com
    objectClass: automountMap
    automountMapName: auto.home
    
    # foo, auto.home, example.com
    dn: automountKey=foo,automountMapName=auto.home,dc=example,dc=com
    objectClass: automount
    automountKey: foo
    automountInformation: filer.example.com:/export/foo
    
    # /, auto.home, example.com
    dn: automountKey=/,automountMapName=auto.home,dc=example,dc=com
    objectClass: automount
    automountKey: /
    automountInformation: filer.example.com:/export/&

其它资源

32.7. 使用 systemd.automount 在 /etc/fstab 按需挂载文件系统

这个步骤演示了如何在 /etc/fstab 中定义挂载点时,使用自动挂载 systemd 单元根据需要挂载文件系统。您必须为每个挂载添加自动挂载单元并启用它。

流程

  1. 添加所需的 fstab 条目,如 Chapter 30 中所述。永久挂载文件系统。例如:

    /dev/disk/by-id/da875760-edb9-4b82-99dc-5f4b1ff2e5f4  /mount/point  xfs  defaults  0 0
  2. x-systemd.automount 添加到上一步中创建的条目的 options 字段中。
  3. 加载新创建的单元,以便您的系统注册新配置:

    # systemctl daemon-reload
  4. 启动自动挂载单元:

    # systemctl start mount-point.automount

验证

  1. 检查 mount-point.automount 是否正在运行:

    # systemctl status mount-point.automount
  2. 检查自动挂载的目录是否有所需的内容:

    # ls /mount/point

其它资源

  • systemd.automount(5) 手册页.
  • systemd.mount(5) 手册页.
  • systemd 简介.

32.8. 使用 systemd.automount 通过挂载单元根据需要挂载文件系统

这个步骤演示了如何在由挂载单元定义挂载点时,使用自动挂载 systemd 单元根据需要挂载文件系统。您必须为每个挂载添加自动挂载单元并启用它。

流程

  1. 创建挂载单元。例如:

    mount-point.mount
    [Mount]
    What=/dev/disk/by-uuid/f5755511-a714-44c1-a123-cfde0e4ac688
    Where=/mount/point
    Type=xfs
  2. 创建一个名称与挂载单元相同的单元文件,但带有 .automount 扩展。
  3. 打开文件并创建 [Automount] 部分。将 Where= 选项设置为挂载路径:

    [Automount]
    Where=/mount/point
    [Install]
    WantedBy=multi-user.target
  4. 加载新创建的单元,以便您的系统注册新配置:

    # systemctl daemon-reload
  5. 启用并启动自动挂载单元:

    # systemctl enable --now mount-point.automount

验证

  1. 检查 mount-point.automount 是否正在运行:

    # systemctl status mount-point.automount
  2. 检查自动挂载的目录是否有所需的内容:

    # ls /mount/point

其它资源

  • systemd.automount(5) 手册页.
  • systemd.mount(5) 手册页.
  • systemd 简介.

第 33 章 使用 IdM 中的 SSSD 组件来缓存 autofs 映射

系统安全服务守护进程(SSSD)是一种系统服务,来访问远程服务目录和身份验证机制。当网络连接较慢时,数据缓存非常有用。要将 SSSD 服务配置为缓存 autofs 映射,请按照本节中的以下步骤操作。

33.1. 手动配置 autofs ,来将 IdM 服务器用作 LDAP 服务器

这个流程演示了如何配置 autofs ,来将 IdM 服务器用作 LDAP 服务器。

流程

  1. 编辑 /etc/autofs.conf 文件,来指定 autofs 搜索的模式属性:

    #
    # Other common LDAP naming
    #
    map_object_class = "automountMap"
    entry_object_class = "automount"
    map_attribute = "automountMapName"
    entry_attribute = "automountKey"
    value_attribute = "automountInformation"
    注意

    用户可以在 /etc/autofs.conf 文件中以小写和大写形式写入属性。

  2. (可选)指定 LDAP 配置。有两种方法可以做到这一点:最简单的方法是让自动挂载服务自行发现 LDAP 服务器和位置:

    ldap_uri = "ldap:///dc=example,dc=com"

    这个选项要求 DNS 包含可发现服务器的 SRV 记录。

    或者,明确设置要使用的 LDAP 服务器,以及用于 LDAP 搜索的基本 DN:

    ldap_uri = "ldap://ipa.example.com"
    search_base = "cn=location,cn=automount,dc=example,dc=com"
  3. 编辑 /etc/autofs_ldap_auth.conf 文件,以便 autofs 允许客户端通过 IdM LDAP 服务器进行身份验证。

    • authrequired 更改为 yes。
    • 将主体设置为 IdM LDAP 服务器(host/fqdn@REALM)的 Kerberos 主机主体。主体名称用于连接 IdM 目录,来作为 GSS 客户端身份验证的一部分。

      <autofs_ldap_sasl_conf
           usetls="no"
           tlsrequired="no"
           authrequired="yes"
           authtype="GSSAPI"
           clientprinc="host/server.example.com@EXAMPLE.COM"
           />

      有关主机主体的更多信息,请参阅在 IdM 中使用规范的 DNS 主机名

      如有必要,请运行 klist -k 来获取确切的主机主体信息。

33.2. 配置 SSSD 来缓存 autofs 映射

SSSD 服务可用于缓存存储在 IdM 服务器上的 autofs 映射,而无需配置 autofs 以使用 IdM 服务器。

先决条件

  • sssd 软件包已安装。

流程

  1. 打开 SSSD 配置文件:

    # vim /etc/sssd/sssd.conf
  2. autofs 服务添加到由 SSSD 处理的服务列表中。

    [sssd]
    domains = ldap
    services = nss,pam,autofs
  3. 创建一个新的 [autofs] 部分。您可以将此留空,因为 autofs 服务的默认设置适用于大多数基础架构。

    [nss]
    
    [pam]
    
    [sudo]
    
    [autofs]
    
    [ssh]
    
    [pac]

    如需更多信息,请参阅 sssd.conf 手册页。

  4. (可选)为 autofs 条目设置搜索库。默认情况下,这是 LDAP 搜索库,但可以在 ldap_autofs_search_base 参数中指定子树。

    [domain/EXAMPLE]
    
    ldap_search_base = "dc=example,dc=com"
    ldap_autofs_search_base = "ou=automount,dc=example,dc=com"
  5. 重启 SSSD 服务:

    # systemctl restart sssd.service
  6. 检查 /etc/nsswitch.conf 文件,以便 SSSD 被列为自动挂载配置的源:

    automount: sss files
  7. 重启 autofs 服务:

    # systemctl restart autofs.service
  8. 通过列出用户的 /home 目录来测试配置,假设 /home 有一个主映射条目:

    # ls /home/userName

    如果这没有挂载远程文件系统,请检查 /var/log/messages 文件是否有错误。如有必要,通过将 logging 参数设为 debug 来提高 /etc/sysconfig/autofs 文件的 debug 级别。

第 34 章 为 root 文件系统设置只读权限

有时,您需要使用只读权限挂载 root 文件系统(/)。示例用例包括在系统意外断电后增强安全性或确保数据完整性。

34.1. 始终保留写入权限的文件和目录

要使系统正常工作,一些文件和目录需要保留写权限。当 root 文件系统以只读模式挂载时,这些文件将使用 tmpfs 临时文件系统挂载到 RAM 中。

这些文件和目录的默认集合是从 /etc/rwtab 文件中读取的。请注意,readonly-root 需要在系统中存在这个文件。

dirs	/var/cache/man
dirs	/var/gdm
<content truncated>

empty	/tmp
empty	/var/cache/foomatic
<content truncated>

files	/etc/adjtime
files	/etc/ntp.conf
<content truncated>

/etc/rwtab 文件中的条目遵循以下格式:

copy-method    path

在这个语法中:

  • 用指定如何将文件或者目录复制到 tmpfs 的关键字之一替换 copy-method
  • 使用到文件或目录的路径替换 path

/etc/rwtab 文件可识别将文件或目录复制到 tmpfs 的以下方法:

empty

一个空路径被复制到 tmpfs。例如:

empty /tmp
dirs

目录树被空复制到 tmpfs。例如:

dirs /var/run
files

将文件或目录树被完整地复制到 tmpfs。例如:

files /etc/resolv.conf

在向 /etc/rwtab.d/ 添加自定义路径时,也适用相同的格式。

34.2. 将 root 文件系统配置为在引导时使用只读权限挂载

使用这个流程时,根文件系统将以只读方式安装在所有后续引导上。

流程

  1. /etc/sysconfig/readonly-root 文件中,将 READONLY 选项设为 yes

    # Set to 'yes' to mount the file systems as read-only.
    READONLY=yes
  2. 在 / etc/fstab 文件中的 root 条目(/ )中添加 ro 选项:

    /dev/mapper/luks-c376919e...  /  xfs  x-systemd.device-timeout=0,ro  1  1
  3. /etc/default/grub 文件中的 GRUB_CMDLINE_LINUX 指令中添加 ro 选项,并确保该指令不包含 rw

    GRUB_CMDLINE_LINUX="rhgb quiet... ro"
  4. 重新创建 GRUB2 配置文件:

    # grub2-mkconfig -o /boot/grub2/grub.cfg
  5. 如果您需要在 tmpfs 文件系统中添加需要挂载具有写权限的文件和目录,请在 /etc/rwtab.d/ 目录中创建一个文本文件,并将配置放在其中。

    例如:要将 /etc/example/file 文件挂载为具有写权限,请将此行添加到 /etc/rwtab.d/example 文件中:

    files /etc/example/file
    重要

    tmpfs 中的文件和目录所做的更改不会在启动后保留。

  6. 重启系统以应用更改。

故障排除

  • 如果您错误地将 root 文件系统挂载为具有只读权限,则可以使用以下命令再次将其重新挂载为具有读写权限:

    # mount -o remount,rw /

第 35 章 对带有配额的 XFS 限制存储空间的使用

您可以使用磁盘配额来限制用户或组群可用的磁盘空间量。您还可以定义一个警告级别,在用户消耗太多磁盘空间或分区已满前通知系统管理员。

XFS 配额子系统管理对磁盘空间(块)和文件(inode)使用情况的限制。XFS 配额控制或报告在用户、组群、目录或项目级别使用这些项目的使用情况。组和项目配额只适用于旧的非默认 XFS 磁盘格式。

在按目录或按项目管理时,XFS 管理与特定项目相关联的目录层次结构的磁盘使用情况。

35.1. 磁盘配额

在大多数计算环境中,磁盘空间不会是无限的。quota 子系统提供控制磁盘空间使用的机制。

您可以为独立用户和本地文件系统中的用户组群配置磁盘配额。这样就使得可以将分配给用户特定文件(如电子邮件)的空间与分配给用户所从事的项目的空间分开来管理。配额子系统在用户超过分配的限制时警告用户,但会为当前的工作提供一些额外的空间(硬限制/软限制)。

如果实施了配额,您需要检查是否超过了配额,并确保配额准确。如果用户重复超过配额或者持续达到其软限制,则系统管理员可以帮助用户确定如何使用较少的磁盘空间或增加用户的磁盘配额。

您可以通过配额设置来控制:

  • 消耗的磁盘块数量。
  • 内节点数,这是在 UNIX 文件系统中包含文件信息的数据结构。由于 inode 存储与文件相关的信息,因此这允许控制可创建的文件数。

35.2. xfs_quota 工具

您可以使用 xfs_quota 工具来管理 XFS 文件系统上的配额。另外,您可以使用关闭了限制强制的 XFS 文件系统作为有效的磁盘用量记帐系统。

XFS 配额系统在许多方面与其他文件系统不同。最重要的是,XFS 将配额信息视为文件系统元数据,并使用日志记录来提供更高级别的一致性保证。

其它资源

  • xfs_quota(8) 手册页。

35.3. XFS 中的文件系统配额管理

XFS 配额子系统管理对磁盘空间(块)和文件(inode)使用情况的限制。XFS 配额控制或报告在用户、组群、目录或项目级别使用这些项目的使用情况。组和项目配额只适用于旧的非默认 XFS 磁盘格式。

在按目录或按项目管理时,XFS 管理与特定项目相关联的目录层次结构的磁盘使用情况。

35.4. 为 XFS 启用磁盘配额

这个过程为 XFS 文件系统中的用户、组群和项目启用磁盘配额。启用配额后,xfs_quota 工具可用来设置限制并报告磁盘使用情况。

流程

  1. 为用户启用配额:

    # mount -o uquota /dev/xvdb1 /xfs

    使用 uqnoenforce 替换 uquota ,以允许在不强制实施任何限制的情况下报告使用情况。

  2. 为组群启用配额:

    # mount -o gquota /dev/xvdb1 /xfs

    使用 gqnoenforce 替换 gquota,以允许在不强制实施任何限制的情况下报告使用情况。

  3. 为项目启用配额:

    # mount -o pquota /dev/xvdb1 /xfs

    pquota 替换为 pqnoenforce,以允许在不强制实施任何限制的情况下报告使用情况。

  4. 或者,也可以在 /etc/fstab 文件中包含配额挂载选项。以下示例显示了 /etc/fstab 文件中用来分别在 XFS 文件系统上为用户、组和项目启用配额的条目。这些示例还使用读写权限挂载文件系统:

    # vim /etc/fstab
    /dev/xvdb1    /xfs    xfs    rw,quota       0  0
    /dev/xvdb1    /xfs    xfs    rw,gquota      0  0
    /dev/xvdb1    /xfs    xfs    rw,prjquota    0  0

其它资源

  • mount(8) 手册页。
  • xfs_quota(8) 手册页。

35.5. 报告 XFS 使用量

您可以使用 xfs_quota 工具来设置限制并报告磁盘使用情况。默认情况下,xfs_quota 以交互方式运行,并处于基本模式。基本模式子命令只是报告使用情况,适用于所有用户。

先决条件

流程

  1. 启动 xfs_quota shell:

    # xfs_quota
  2. 显示给定用户的使用情况和限制:

    # xfs_quota> quota username
  3. 显示块和内节点的空闲和已使用的数量:

    # xfs_quota> df
  4. 运行 help 命令来显示 xfs_quota 可使用的基本命令。

    # xfs_quota> help
  5. 指定 q 来退出 xfs_quota

    # xfs_quota> q

其它资源

  • xfs_quota(8) 手册页。

35.6. 修改 XFS 配额限制

启动带有 -x 选项的 xfs_quota 工具,来启用专家模式,并运行管理员命令,该命令允许修改配额系统。此模式的子命令允许实际限制的配置,并且仅可提供给具有升级特权的用户使用。

先决条件

流程

  1. 启动带有 -x 选项的 xfs_quota shell ,来启用专家模式:

    # xfs_quota -x
  2. 报告具体文件系统的配额信息:

    # xfs_quota> report /path

    例如,若要显示 /home 的配额报告示例(在 /dev/blockdevice 上),请使用命令 report -h /home。此时会显示类似如下的输出:

    User quota on /home (/dev/blockdevice)
    Blocks
    User ID      Used   Soft   Hard Warn/Grace
    ---------- ---------------------------------
    root            0      0      0  00 [------]
    testuser   103.4G      0      0  00 [------]
  3. 修改配额限制:

    # xfs_quota> limit isoft=500m ihard=700m user /path

    例如,要为用户 john (其主目录为 /home/john )软和硬 inode 数限制分别设置为 500 和 700,请使用以下命令:

    # xfs_quota -x -c 'limit isoft=500 ihard=700 john' /home/

    在这种情况下,传递 mount_point,这是挂载的 xfs 文件系统。

  4. 运行 help 命令来显示 xfs_quota -x 可用的专家命令:

    # xfs_quota> help

其它资源

  • xfs_quota(8) 手册页。

35.7. 为 XFS 设置项目限制

此流程为项目控制的目录配置限制。

流程

  1. 将项目控制的目录添加到 /etc/projects。例如,以下命令将唯一 ID 为 11 的 /var/log 路径添加到 /etc/projects :您的项目 ID 可以是任何映射到项目的数字值。

    # echo 11:/var/log >> /etc/projects
  2. 将项目名称添加到 /etc/projid,来将项目 ID 映射到项目名称。例如,以下命令将名为 Logs 的项目与上一步中定义的 ID 为 11 的项目相关联:

    # echo Logs:11 >> /etc/projid
  3. 初始化项目目录。例如,以下命令初始化项目目录 /var:

    # xfs_quota -x -c 'project -s logfiles' /var
  4. 为使用初始化目录的项目配置配额:

    # xfs_quota -x -c 'limit -p bhard=lg logfiles' /var

其它资源

  • xfs_quota(8) 手册页。
  • projid(5) 手册页。
  • projects(5) 手册页。

第 36 章 对带有配额的 ext4 限制存储空间使用

在分配前,您必须在系统中启用磁盘配额。您可以为每个用户、每个组或每个项目分配磁盘配额。但是,如果设置了软限制,您可以在一个可配置的期间内(称为宽限期)超过这些配额。

36.1. 安装配额工具

您必须安装 quota RPM 软件包才能实现磁盘配额。

流程

  • 安装 quota 软件包:

    # dnf install quota

36.2. 在创建文件系统时启用配额功能

这个步骤描述了如何在创建文件系统时启用配额。

流程

  1. 在创建文件系统时启用配额:

    # mkfs.ext4 -O quota /dev/sda
    注意

    默认仅启用和初始化用户和组群配额。

  2. 更改创建文件系统时的默认设置:

    # mkfs.ext4 -O quota -E quotatype=usrquota:grpquota:prjquota /dev/sda
  3. 挂载文件系统:

    # mount /dev/sda

其它资源

  • ext4(5) 手册页。

36.3. 在现有文件系统中启用配额功能

这个流程描述了如何使用 tune2fs 命令在现有文件系统上启用配额功能。

流程

  1. 卸载文件系统:

    # umount /dev/sda
  2. 在现有文件系统中启用配额:

    # tune2fs -O quota /dev/sda
    注意

    默认只初始化用户和组群配额。

  3. 更改默认值:

    # tune2fs -Q usrquota,grpquota,prjquota /dev/sda
  4. 挂载文件系统:

    # mount /dev/sda

其它资源

  • ext4(5) 手册页。

36.4. 启用配额强制

在不使用任何额外选项挂载文件系统后,默认启用配额记帐,但不启用配额强制。

先决条件

  • 启用配额功能,并初始化默认配额。

流程

  • 通过 quotaon 为用户配额启用配额强制:

    # mount /dev/sda /mnt
    # quotaon /mnt
    注意

    可以使用 usrquotagrpquotaprjquota 挂载选项在挂载时启用配额强制。

    # mount -o usrquota,grpquota,prjquota /dev/sda /mnt
  • 在所有文件系统中启用用户、组群和项目配额:

    # quotaon -vaugP
    • 如果未指定 -u-g-P 选项,则仅启用用户配额。
    • 如果只指定 -g 选项,则只启用组配额。
    • 如果只指定 -P 选项,则只启用项目配额。
  • 为特定文件系统(如 /home)启用配额:

    # quotaon -vugP /home

其它资源

  • quotaon(8) 手册页。

36.5. 为每个用户分配配额

磁盘配额通过 edquota 命令分配给用户。

注意

edquota 使用由 EDITOR 环境变量定义的文本编辑器。要更改编辑器,请将 ~/.bash_profile 文件中的 EDITOR 环境变量设为您选择的编辑器的完整路径。

先决条件

  • 用户必须在设置用户配额前存在。

流程

  1. 为用户分配配额:

    # edquota username

    使用您要为其分配配额的用户替换 username

    例如,如果您为 /dev/sda 分区启用配额,并执行命令 quota testuser,则会在系统配置的默认编辑器中显示以下内容:

    Disk quotas for user testuser (uid 501):
    Filesystem   blocks   soft   hard   inodes   soft   hard
    /dev/sda      44043      0      0    37418      0      0
  2. 更改所需限制。

    如果值为 0,则代表没有设定限制。在文本编辑器中更改它们。

    例如,下面显示了 testuser 的软和硬限制,它们分别被设置为 50000 和 55000。

    Disk quotas for user testuser (uid 501):
    Filesystem   blocks   soft   hard   inodes   soft   hard
    /dev/sda      44043  50000  55000    37418      0      0
    • 第一列是启用了配额的文件系统的名称。
    • 第二列显示目前该用户使用的块数。
    • 下面的两列是为该用户在文件系统中设定软限制和硬限制。
    • inodes 列显示用户当前使用的 inodes 数。
    • 最后两列是为该用户在文件系统中设定软和硬的内节点限制。

      • 硬块限制是用户或者组群可以使用的绝对最大磁盘空间量。达到这个限制后,就无法再使用其他磁盘空间。
      • 软块限制定义可以使用的最大磁盘空间量。然而,与硬限制不同,在一定时间内可以超过软限制。这段时间被称为宽限期。宽限期可以用秒、分钟、小时、天、周或月表示。

验证步骤

  • 验证是否为该用户设定了配额:

    # quota -v testuser
    Disk quotas for user testuser:
    Filesystem  blocks  quota  limit  grace  files  quota  limit  grace
    /dev/sda      1000*  1000   1000             0      0      0

36.6. 为每个组群分配配额

您可以根据组群分配配额。

先决条件

  • 组群在设定组群配额前必须已经存在。

流程

  1. 设置组群配额:

    # edquota -g groupname

    例如,要为 devel 组设置组配额:

    # edquota -g devel

    这个命令在文本编辑器中显示该组群的现有配额:

    Disk quotas for group devel (gid 505):
    Filesystem   blocks  soft  hard  inodes  soft  hard
    /dev/sda     440400     0     0   37418     0     0
  2. 修改限制并保存文件。

验证步骤

  • 验证是否设定了组群配额:

    # quota -vg groupname

36.7. 为每个项目分配配额

此流程为每个项目分配配额。

先决条件

  • 在您的文件系统中启用了项目配额。

流程

  1. 将项目控制的目录添加到 /etc/projects。例如,以下命令将唯一 ID 为 11 的 /var/log 路径添加到 /etc/projects :您的项目 ID 可以是任何映射到项目的数字值。

    # echo 11:/var/log >> /etc/projects
  2. 将项目名称添加到 /etc/projid,来将项目 ID 映射到项目名称。例如,以下命令将名为 Logs 的项目与上一步中定义的 ID 为 11 的项目相关联:

    # echo Logs:11 >> /etc/projid
  3. 设置所需的限制:

    # edquota -P 11
    注意

    您可以通过其项目 ID(本例中为 11)或其名称(本例中为 Logs)来选择项目。

  4. 使用 quotaon,启用配额强制:

    请参阅 启用配额强制

验证步骤

  • 验证是否设置了项目配额:

    # quota -vP 11
    注意

    您可以使用项目 ID 或项目名称验证。

其它资源

  • edquota(8) 手册页。
  • projid(5) 手册页。
  • projects(5) 手册页。

36.8. 为软限制设置宽限期

如果给定配额具有软限制,您可以编辑宽限期,这是可以超过软限制的时间。您可以为用户、组或项目设置宽限期。

流程

  • 编辑宽限期:

    # edquota -t
重要

虽然其它 edquota 命令针对特定用户、组或项目的配额操作,但 -t 选项在每个启用了配额的文件系统上操作。

其它资源

  • edquota(8) 手册页。

36.9. 关闭文件系统配额

使用 quotaoff 来在指定的文件系统上关闭磁盘配额强制。执行此命令后可启用配额核算。

流程

  • 关闭所有用户和组群配额:

    # quotaoff -vaugP
    • 如果未指定 -u-g-P 选项,则仅禁用用户配额。
    • 如果只指定 -g 选项,则只禁用组配额。
    • 如果只指定 -P 选项,则只禁用项目配额。
    • -v 开关会在命令执行时显示详细状态信息。

其它资源

  • quotaoff(8) 手册页。

36.10. 报告磁盘配额

您可以使用 repquota 工具创建磁盘配额报告。

流程

  1. 运行 repquota 命令:

    # repquota

    例如,命令 repquota /dev/sda 产生此输出:

    *** Report for user quotas on device /dev/sda
    Block grace time: 7days; Inode grace time: 7days
    			Block limits			File limits
    User		used	soft	hard	grace	used	soft	hard	grace
    ----------------------------------------------------------------------
    root      --      36       0       0              4     0     0
    kristin   --     540       0       0            125     0     0
    testuser  --  440400  500000  550000          37418     0     0
  2. 查看所有启用了配额的文件系统的磁盘用量报告:

    # repquota -augP

每个用户后显示的 -- 符号确定是否超过了块或 inode 限制。如果超过了任何一个软限制,则 + 字符会出现在相应的 - 字符的位置。第一个 - 字符表示块限制,第二个表示 inode 限制。

grace 列通常为空。如果超过了软限制,则该列包含的时间规格等同于宽限期中剩余的时间量。如果宽限期过期了,则 none 会出现在其位置上。

其它资源

有关详细信息,请参阅 repquota(8) 手册页。

第 37 章 丢弃未使用块

您可以在支持它们的块设备中执行或调度丢弃操作。

37.1. 块忽略操作

块忽略操作丢弃了被挂载的文件系统不再使用的块。它们在以下方面很有用:

  • 固态驱动器(SSD)
  • 精简置备存储

要求

基本文件系统的块设备必须支持物理的丢弃(discard)操作。

如果 /sys/block/device/queue/discard_max_bytes 文件中的值不为零,则支持物理丢弃操作。

37.2. 块丢弃操作的类型

您可以使用不同方法运行 discard 操作:

批量丢弃
由用户明确运行。它们丢弃所选文件系统中的所有未使用块。
在线丢弃
在挂载时指定。它们在没有用户干预的情况下实时运行。在线丢弃操作只丢弃从已使用到空闲的块。
定期丢弃
systemd 服务定期运行的批量操作。

XFS 和 ext4 文件系统以及 VDO 支持所有类型。

建议

红帽建议您使用批处理或周期性丢弃。

仅在以下情况下使用在线丢弃:

  • 系统负载不允许使用批量丢弃,或者
  • 为了保持性能,需要在线丢弃操作。

37.3. 执行批块丢弃

这个过程执行批块丢弃操作,忽略挂载的文件系统中未使用的块。

先决条件

  • 挂载文件系统。
  • 文件系统底层的块设备支持物理忽略操作。

流程

  • 使用 fstrim 工具:

    • 要只在所选文件系统中执行丢弃,请使用:

      # fstrim mount-point
    • 要在所有挂载的文件系统中执行丢弃,请使用:

      # fstrim --all

如果您在以下设备上执行 fstrim 命令:

  • 不支持丢弃操作的设备,或者
  • 由多个设备组成的逻辑设备(LVM 或者 MD),其中任意设备不支持丢弃操作:

下面的信息将显示:

# fstrim /mnt/non_discard

fstrim: /mnt/non_discard: the discard operation is not supported

其它资源

  • fstrim(8) 手册页。

37.4. 启用在线块丢弃

这个过程启用在线块丢弃操作,该操作可自动丢弃所有支持的文件系统中未使用的块。

流程

  • 在挂载时启用在线丢弃:

    • 手动挂载文件系统时,请添加 -o discard 挂载选项:

      # mount -o discard device mount-point
    • 永久挂载文件系统时,请将 discard 选项添加到 /etc/fstab 文件的挂载条目中。

其它资源

  • mount(8) 手册页。
  • fstab(5) 手册页。

37.5. 启用定期块丢弃

这个流程启用 systemd 计时器,它会定期丢弃所有支持的文件系统上未使用的块。

流程

  • 启用并启动 systemd 计时器:

    # systemctl enable --now fstrim.timer

第 38 章 使用 RHEL 系统角色启用在线块丢弃

本节描述了如何使用 存储 角色启用在线块丢弃。

先决条件

  • 包含 存储 角色的 Ansible playbook 已存在。

    如需有关如何应用此类 playbook 的信息,请参阅 应用角色

38.1. 启用在线块丢弃的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用存储角色,以挂载启用了在线块丢弃的 XFS 文件系统。

例 38.1. 一个 playbook,它在 /mnt/data/ 上启用在线块丢弃功能

---
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - sdb
        fs_type: xfs
        mount_point: /mnt/data
        mount_options: discard
  roles:
    - rhel-system-roles.storage

其它资源

38.2. 其它资源

第 39 章 设置 Stratis 文件系统

Stratis 作为服务运行,来管理物理存储设备池,简化本地存储管理,易于使用,同时帮助您设置和管理复杂的存储配置。

重要

Stratis 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。有关红帽技术预览功能支持范围的更多信息,请参阅 https://access.redhat.com/support/offerings/techpreview

39.1. 什么是 Stratis

Stratis 是 Linux 的本地存储管理解决方案。它着重说明简单性和易用性,并可让您访问高级存储功能。

Stratis 使以下操作更为容易:

  • 存储的初始配置
  • 稍后进行修改
  • 使用高级存储功能

Stratis 是一个支持高级存储功能的混合用户和内核本地存储管理系统。Stratis 的核心概念是一个存储。这个池是从一个或多个本地磁盘或分区创建,卷是从池中创建的。

池启用了许多有用的功能,例如:

  • 文件系统快照
  • 精简置备
  • 等级

其它资源

39.2. Stratis 卷的组件

了解组成 Stratis 卷的组件。

另外,Stratis 在命令行界面和 API 中显示以下卷组件:

blockdev
块设备,如磁盘或者磁盘分区。
pool

由一个或多个块设备组成。

池有固定大小,与块设备的大小相等。

池包含大多数 Stratis 层,如使用 dm-cache 目标的非易失性数据缓存。

Stratis 为每个池创建一个 /dev/stratis/my-pool/ 目录。这个目录包含了到代表池里 Stratis 文件系统的设备的链接。

filesystem

每个池可以包含一个或多个文件系统来存储文件。

文件系统会被精简置备,且没有固定的总大小。文件系统的实际大小随着保存着文件系统中的数据而增长。如果数据的大小接近文件系统的虚拟大小,Sratis 将自动增大精简卷和文件系统。

文件系统使用 XFS 格式化。

重要

Stratis 跟踪关于使用 Stratis 创建的文件系统的信息,但 XFS 并不知道,并且使用 XFS 进行的更改不会在 Stratis 中自动创建更新。用户不得重新格式化或重新配置由 Stratis 管理的 XFS 文件系统。

Stratis 在 /dev/stratis/my-pool/my-fs 路径创建到文件系统的链接。

注意

Stratis 使用许多设备映射器设备,显示在 dmsetup 列表中和 /proc/partitions 文件中。类似地,lsblk 命令输出反映了 Stratis 的内部工作方式和层。

39.3. 可用于 Stratis 的块设备

可与 Stratis 一起使用的存储设备。

支持的设备

Stratis 池已被测试以可用于这些块设备:

  • LUKS
  • LVM 逻辑卷
  • MD RAID
  • DM Multipath
  • iSCSI
  • HDD 和 SSD
  • NVMe 设备

不支持的设备

因为 Stratis 包含精简置备层,因此红帽不推荐将 Stratis 池放在已经精简置备的块设备中。

39.4. 安装 Stratis

安装 Stratis 所需的软件包。

流程

  1. 安装提供 Stratis 服务和命令行工具的软件包:

    # dnf install stratisd stratis-cli
  2. 确保 stratisd 服务已启用:

    # systemctl enable --now stratisd

39.5. 创建未加密的 Stratis 池

您可以从一个或多个块设备创建未加密的 Stratis 池。

先决条件

  • 已安装 Stratis。如需更多信息,请参阅 安装 Stratis
  • stratisd 服务在运行。
  • 创建 Stratis 池的块设备没有被使用,且没有被挂载。
  • 要在其上创建 Stratis 池的每个块设备至少为 1 GB。
  • 在 IBM Z 构架中,必须对 /dev/dasd* 块设备进行分区。使用 Stratis 池中的分区。

有关分区 DASD 设备的详情,请参考在 IBM Z 中配置 Linux 实例

注意

您无法加密未加密的 Stratis 池。

流程

  1. 删除您要在 Stratis 池中使用的每个块设备上存在的任何文件系统、分区表或 RAID 签名:

    # wipefs --all block-device

    其中 block-device 是块设备的路径;例如,/dev/sdb

  2. 在所选的块设备上创建新的未加密的 Stratis 池:

    # stratis pool create my-pool block-device

    其中 block-device 是到空或已擦除的块设备的路径。

    注意

    在一行中指定多个块设备:

    # stratis pool create my-pool block-device-1 block-device-2
  3. 确认创建了新的 Stratis 池:

    # stratis pool list

39.6. 创建一个加密的 Stratis 池

要保护您的数据,您可以从一个或多个块设备创建一个加密的 Stratis 池。

当您创建加密的 Stratis 池时,内核密钥环将用作主加密机制。后续系统重启此内核密钥环后,用来解锁加密的 Stratis 池。

当从一个或多个块设备创建加密的 Stratis 池时,请注意以下几点:

  • 每个块设备都使用 cryptsetup 库进行加密,并实施 LUKS2 格式。
  • 每个 Stratis 池都可以有一个唯一的密钥,或者与其他池共享相同的密钥。这些密钥保存在内核密钥环中。
  • 组成 Stratis 池的块设备必须全部加密或者全部未加密。不可能同时在同一个 Stratis 池中加密和未加密块设备。
  • 添加到加密 Stratis 池的数据层中的块设备会自动加密。

先决条件

  • Stratis v2.1.0 或更高版本已安装。如需更多信息,请参阅 安装 Stratis
  • stratisd 服务在运行。
  • 创建 Stratis 池的块设备没有被使用,且没有被挂载。
  • 在其上创建 Stratis 池的每个块设备至少为 1GB。
  • 在 IBM Z 构架中,必须对 /dev/dasd* 块设备进行分区。使用 Stratis 池中的分区。

有关分区 DASD 设备的详情,请参考在 IBM Z 中配置 Linux 实例

流程

  1. 删除您要在 Stratis 池中使用的每个块设备上存在的任何文件系统、分区表或 RAID 签名:

    # wipefs --all block-device

    其中 block-device 是块设备的路径;例如,/dev/sdb

  2. 如果您还没有创建密钥集,请运行以下命令,并按照提示创建用于加密的密钥集。

    # stratis key set --capture-key key-description

    其中 key-description 是对在内核密钥环中创建的密钥的引用。

  3. 创建加密的 Stratis 池并指定用于加密的密钥描述。您还可以使用 --keyfile-path 选项指定密钥路径,而不是使用 key-description 选项。

    # stratis pool create --key-desc key-description my-pool block-device

    其中

    key-description
    引用您在上一步中创建的内核密钥环中存在的密钥。
    my-pool
    指定新的 Stratis 池的名称。
    block-device

    指定到空或者有线块设备的路径。

    注意

    在一行中指定多个块设备:

    # stratis pool create --key-desc key-description my-pool block-device-1 block-device-2
  4. 确认创建了新的 Stratis 池:

    # stratis pool list

39.7. 将 Stratis 池绑定到 NBDE

将加密的 Stratis 池绑定到网络绑定磁盘加密(NBDE)需要 Tang 服务器。当包含 Stratis 池的系统重启时,它与 Tang 服务器进行连接,以自动解锁加密的池,而无需提供内核密钥环描述。

注意

将 Stratis 池绑定到补充的 Clevis 加密机制不会删除主内核密钥环加密。

先决条件

流程

  • 将加密的 Stratis 池绑定到 NBDE:

    # stratis pool bind nbde my-pool key-description tang-server

    其中

    my-pool
    指定加密的 Stratis 池的名称。
    key-description
    引用内核密钥环中存在的密钥,该密钥是在您创建加密的 Stratis 池时生成的。
    tang-server
    指定 Tang 服务器的 IP 地址或 URL。

39.8. 将 Stratis 池绑定到 TPM

当您将加密的 Stratis 池绑定到信任的平台模块(TPM) 2.0 时,当包含池的系统重启时,池会自动解锁,而您无需提供内核密钥环描述。

先决条件

  • Stratis v2.3.0 或更高版本已安装。如需更多信息,请参阅 安装 Stratis
  • stratisd 服务在运行。
  • 您已创建了一个加密的 Stratis 池。如需更多信息,请参阅 创建加密的 Stratis 池

流程

  • 将加密的 Stratis 池绑定到 TPM:

    # stratis pool bind tpm my-pool key-description

    其中

    my-pool
    指定加密的 Stratis 池的名称。
    key-description
    引用内核密钥环中存在的密钥,该密钥是在您创建加密的 Stratis 池时生成的。

39.9. 使用内核密钥环解加密的 Stratis 池

系统重启后,您的加密 Stratis 池或组成它的块设备可能不可见。您可以使用用来加密池的内核密钥环来解锁池。

先决条件

  • Stratis v2.1.0 已安装。如需更多信息,请参阅 安装 Stratis
  • stratisd 服务在运行。
  • 您已创建了一个加密的 Stratis 池。如需更多信息,请参阅 创建加密的 Stratis 池

流程

  1. 使用之前使用的相同密钥描述重新创建密钥集:

    # stratis key set --capture-key key-description

    其中 key-description 引用内核密钥环中存在的密钥,该密钥是您在创建加密的 Stratis 池时生成的。

  2. 解锁 Stratis 池以及组成它的块设备:

    # stratis pool unlock keyring
  3. 验证 Stratis 池是可见的:

    # stratis pool list

39.10. 使用 Clevis 解锁加密的 Stratis 池

系统重启后,您的加密 Stratis 池或组成它的块设备可能不可见。您可以使用池绑定到的附加加密机制来解锁加密的 Stratis 池。

先决条件

流程

  1. 解锁 Stratis 池以及组成它的块设备:

    # stratis pool unlock clevis
  2. 验证 Stratis 池是可见的:

    # stratis pool list

39.11. 解除 Stratis 池与补充加密的绑定

当您解除加密的 Stratis 池与支持的附加加密机制的绑定时,主内核密钥环加密将保持不变。

先决条件

  • Stratis v2.3.0 或更高版本已安装在您的系统上。如需更多信息,请参阅安装 Stratis
  • 您已创建了一个加密的 Stratis 池。如需更多信息,请参阅 创建加密的 Stratis 池
  • 加密的 Stratis 池绑定到受支持的补充加密机制。

流程

  • 解除加密的 Stratis 池与补充加密机制的绑定:

    # stratis pool unbind clevis my-pool

    其中

    my-pool 指定您要解绑的 Stratis 池的名称。

39.12. 创建 Stratis 文件系统

在现有 Stratis 池上创建 Stratis 文件系统。

先决条件

流程

  1. 要在池中创建 Stratis 文件系统,请使用:

    # stratis fs create my-pool my-fs

    其中

    my-pool
    指定 Stratis 池的名称。
    my-fs
    为文件系统指定一个任意名称。
  2. 要验证,列出池中的文件系统:

    # stratis fs list my-pool

39.13. 挂载 Stratis 文件系统

挂载现有的 Stratis 文件系统以访问其内容。

先决条件

流程

  • 要挂载文件系统,请使用 Stratis 在 /dev/stratis/ 目录中维护的条目:

    # mount /dev/stratis/my-pool/my-fs mount-point

现在该文件系统被挂载到 mount-point 目录中并可使用。

39.14. 永久挂载 Stratis 文件系统

这个过程永久挂载 Stratis 文件系统,以便在引导系统后自动可用。

先决条件

流程

  1. 确定文件系统的 UUID 属性:

    $ lsblk --output=UUID /stratis/my-pool/my-fs

    例如:

    例 39.1. 查看 Stratis 文件系统的 UUID

    $ lsblk --output=UUID /stratis/my-pool/fs1
    
    UUID
    a1f0b64a-4ebb-4d4e-9543-b1d79f600283
  2. 如果挂载点目录不存在,请创建它:

    # mkdir --parents mount-point
  3. 以 root 用户身份,编辑 /etc/fstab 文件,并为文件系统添加一行,由 UUID 标识。使用 xfs 作为文件系统类型,并添加 x-systemd.requires=stratisd.service 选项。

    例如:

    例 39.2. /etc/fstab 中的 /fs1 挂载点

    UUID=a1f0b64a-4ebb-4d4e-9543-b1d79f600283 /fs1 xfs defaults,x-systemd.requires=stratisd.service 0 0
  4. 重新生成挂载单元以便您的系统注册新配置:

    # systemctl daemon-reload
  5. 尝试挂载文件系统来验证配置是否正常工作:

    # mount mount-point

第 40 章 使用额外块设备扩展 Stratis 卷

您可以在 Stratis 池中添加附加块设备以便为 Stratis 文件系统提供更多存储容量。

重要

Stratis 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。有关红帽技术预览功能支持范围的更多信息,请参阅 https://access.redhat.com/support/offerings/techpreview

40.1. Stratis 卷的组件

了解组成 Stratis 卷的组件。

另外,Stratis 在命令行界面和 API 中显示以下卷组件:

blockdev
块设备,如磁盘或者磁盘分区。
pool

由一个或多个块设备组成。

池有固定大小,与块设备的大小相等。

池包含大多数 Stratis 层,如使用 dm-cache 目标的非易失性数据缓存。

Stratis 为每个池创建一个 /dev/stratis/my-pool/ 目录。这个目录包含了到代表池里 Stratis 文件系统的设备的链接。

filesystem

每个池可以包含一个或多个文件系统来存储文件。

文件系统会被精简置备,且没有固定的总大小。文件系统的实际大小随着保存着文件系统中的数据而增长。如果数据的大小接近文件系统的虚拟大小,Sratis 将自动增大精简卷和文件系统。

文件系统使用 XFS 格式化。

重要

Stratis 跟踪关于使用 Stratis 创建的文件系统的信息,但 XFS 并不知道,并且使用 XFS 进行的更改不会在 Stratis 中自动创建更新。用户不得重新格式化或重新配置由 Stratis 管理的 XFS 文件系统。

Stratis 在 /dev/stratis/my-pool/my-fs 路径创建到文件系统的链接。

注意

Stratis 使用许多设备映射器设备,显示在 dmsetup 列表中和 /proc/partitions 文件中。类似地,lsblk 命令输出反映了 Stratis 的内部工作方式和层。

40.2. 在 Stratis 池中添加块设备

此流程在 Stratis 池中添加一个或多个块设备,供 Stratis 文件系统使用。

先决条件

  • 已安装 Stratis。请参阅安装 Stratis
  • stratisd 服务在运行。
  • 要添加到 Stratis 池中的块设备不会被使用且没有挂载。
  • 要添加到 Stratis 池中的块设备的大小至少为 1 GiB。

流程

  • 要在池中添加一个或多个块设备,请使用:

    # stratis pool add-data my-pool device-1 device-2 device-n

其它资源

  • Stratis(8) 手册页

40.3. 其它资源

第 41 章 监控 Stratis 文件系统

作为 Stratis 用户,您可以查看系统中 Stratis 卷的信息,以监控其状态和剩余空间。

重要

Stratis 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。有关红帽技术预览功能支持范围的更多信息,请参阅 https://access.redhat.com/support/offerings/techpreview

41.1. 不同工具报告的 Stratis 大小

本节解释了标准工具(如 df )和 stratis 工具所报告的 Stratis 大小之间的区别。

标准 Linux 工具(如 df )报告 Stratis 上 的 XFS 文件系统层的大小,其为 1 TiB。这不是有用的信息,因为由于精简资源调配, Stratis 的实际存储使用率较少,而且在 XFS 层接近满了的时侯,Stratis 会自动增加文件系统。

重要

定期监控写入 Stratis 文件系统的数据量,将其报告为 总物理使用 值。请确定没有超过总计物理大小值。

其它资源

  • Stratis(8) 手册页。

41.2. 显示关于 Stratis 卷的信息

此流程列出了您的 Stratis 卷的统计信息,如总数、使用量、可用大小、文件系统以及属于池中的块设备。

先决条件

流程

  • 要显示系统中用于 Stratis 的所有块设备的信息:

    # stratis blockdev
    
    Pool Name  Device Node    Physical Size   State  Tier
    my-pool    /dev/sdb            9.10 TiB  In-use  Data
  • 显示系统中所有 Stratis 的信息:

    # stratis pool
    
    Name    Total Physical Size  Total Physical Used
    my-pool            9.10 TiB              598 MiB
  • 显示系统中所有 Stratis 文件系统的信息:

    # stratis filesystem
    
    Pool Name  Name  Used     Created            Device
    my-pool    my-fs 546 MiB  Nov 08 2018 08:03  /dev/stratis/my-pool/my-fs

其它资源

  • Stratis(8) 手册页。

41.3. 其它资源

第 42 章 在 Stratis 文件系统中使用快照

您可以使用 Stratis 文件系统的快照任意时间捕获文件系统状态,并在以后恢复它。

重要

Stratis 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。有关红帽技术预览功能支持范围的更多信息,请参阅 https://access.redhat.com/support/offerings/techpreview

42.1. Stratis 快照的特性

这部分论述了 Stratis 中文件系统快照的属性和局限性。

在 Stratis 中,快照是作为另一个 Stratis 文件系统的副本创建的常规 Stratis 文件系统。快照最初包含与原始文件系统相同的文件内容,但可以随快照的更改而改变。您对快照所做的任何修改都不会反映在原始文件系统中。

Stratis 中的当前快照实现的特征如下:

  • 文件系统快照是另一个文件系统。
  • 快照及其原始卷在生命周期中不会被链接。快照的文件系统可以比它从中创建的文件系统更长。
  • 文件系统不一定被挂载来生成快照。
  • 每个快照使用大约一半的实际后备存储,这是 XFS 日志所需要的。

42.2. 创建 Stratis 快照

这个过程会创建一个 Stratis 文件系统作为现有 Stratis 文件系统的快照。

先决条件

流程

  • 要创建 Stratis 快照,请使用:

    # stratis fs snapshot my-pool my-fs my-fs-snapshot

其它资源

  • Stratis(8) 手册页。

42.3. 访问 Stratis 快照的内容

这个过程挂载 Stratis 文件系统的快照,使其可在读写操作中访问。

先决条件

流程

  • 要访问快照,请将其作为常规文件系统挂载到 /dev/stratis/my-pool/ 目录:

    # mount /dev/stratis/my-pool/my-fs-snapshot mount-point

其它资源

42.4. 将 Stratis 文件系统恢复到以前的快照

这个过程将 Stratis 文件系统的内容恢复到 Stratis 快照中捕获的状态。

先决条件

流程

  1. 另外,备份文件系统的当前状态,以便以后可以访问它:

    # stratis filesystem snapshot my-pool my-fs my-fs-backup
  2. 卸载并删除原始文件系统:

    # umount /dev/stratis/my-pool/my-fs
    # stratis filesystem destroy my-pool my-fs
  3. 在原始文件系统名称下创建快照副本:

    # stratis filesystem snapshot my-pool my-fs-snapshot my-fs
  4. 挂载快照,它现在可以和原始文件系统的名称相同:

    # mount /dev/stratis/my-pool/my-fs mount-point

名为 my-fs 的文件系统的内容与快照 my-fs-snapshot 一致。

其它资源

  • Stratis(8) 手册页。

42.5. 删除 Stratis 快照

这个过程从池中删除 Stratis 快照。快照中的数据会丢失。

先决条件

流程

  1. 卸载快照:

    # umount /dev/stratis/my-pool/my-fs-snapshot
  2. 销毁快照:

    # stratis filesystem destroy my-pool my-fs-snapshot

其它资源

  • Stratis(8) 手册页。

42.6. 其它资源

第 43 章 删除 Stratis 文件系统

您可以删除现有 Stratis 文件系统或 Stratis 池,销毁其中的数据。

重要

Stratis 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。有关红帽技术预览功能支持范围的更多信息,请参阅 https://access.redhat.com/support/offerings/techpreview

43.1. Stratis 卷的组件

了解组成 Stratis 卷的组件。

另外,Stratis 在命令行界面和 API 中显示以下卷组件:

blockdev
块设备,如磁盘或者磁盘分区。
pool

由一个或多个块设备组成。

池有固定大小,与块设备的大小相等。

池包含大多数 Stratis 层,如使用 dm-cache 目标的非易失性数据缓存。

Stratis 为每个池创建一个 /dev/stratis/my-pool/ 目录。这个目录包含了到代表池里 Stratis 文件系统的设备的链接。

filesystem

每个池可以包含一个或多个文件系统来存储文件。

文件系统会被精简置备,且没有固定的总大小。文件系统的实际大小随着保存着文件系统中的数据而增长。如果数据的大小接近文件系统的虚拟大小,Sratis 将自动增大精简卷和文件系统。

文件系统使用 XFS 格式化。

重要

Stratis 跟踪关于使用 Stratis 创建的文件系统的信息,但 XFS 并不知道,并且使用 XFS 进行的更改不会在 Stratis 中自动创建更新。用户不得重新格式化或重新配置由 Stratis 管理的 XFS 文件系统。

Stratis 在 /dev/stratis/my-pool/my-fs 路径创建到文件系统的链接。

注意

Stratis 使用许多设备映射器设备,显示在 dmsetup 列表中和 /proc/partitions 文件中。类似地,lsblk 命令输出反映了 Stratis 的内部工作方式和层。

43.2. 删除 Stratis 文件系统

这个过程删除现有的 Stratis 文件系统。保存的数据会丢失。

先决条件

流程

  1. 卸载文件系统:

    # umount /dev/stratis/my-pool/my-fs
  2. 销毁文件系统:

    # stratis filesystem destroy my-pool my-fs
  3. 验证文件系统不再存在:

    # stratis filesystem list my-pool

其它资源

  • Stratis(8) 手册页。

43.3. 删除 Stratis 池

此流程删除现有的 Stratis 池。保存的数据会丢失。

先决条件

流程

  1. 列出池中的文件系统:

    # stratis filesystem list my-pool
  2. 卸载池中的所有文件系统:

    # umount /dev/stratis/my-pool/my-fs-1 \
             /dev/stratis/my-pool/my-fs-2 \
             /dev/stratis/my-pool/my-fs-n
  3. 销毁文件系统:

    # stratis filesystem destroy my-pool my-fs-1 my-fs-2
  4. 销毁池:

    # stratis pool destroy my-pool
  5. 验证池不再存在:

    # stratis pool list

其它资源

  • Stratis(8) 手册页。

43.4. 其它资源

第 44 章 ext4 文件系统入门

作为系统管理员,您可以创建、挂载、调整大小、备份和恢复 ext4 文件系统。ext4 文件系统是 ext3 文件系统的可扩展扩展。使用 Red Hat Enterprise Linux 9,它可以支持的最大的文件大小为 16 TB,支持的最大的文件系统大小为 50 TB。

44.1. ext4 文件系统的特性

以下是 ext4 文件系统的特性:

  • 使用数据块:ext4 文件系统使用数据块,这可在使用大型文件时提高性能,并减少大型文件的元数据开销。
  • Ext4 相应地标记未分配的块组和 inode 表部分,这允许在文件系统检查期间跳过块组和表部分。它可快速进行文件系统检查,随着文件系统大小的增加,该检查将变得更加有益。
  • 元数据校验和:默认情况下,在 Red Hat Enterprise Linux 9 中启用此功能。
  • ext4 文件系统的分配特性:

    • 持久性预分配
    • 延迟分配
    • 多块分配
    • 条带感知分配
  • 扩展属性(xattr):这允许系统为每个文件关联多个额外名称和值对。
  • 配额日志:这避免了崩溃后需要很长时间的配额一致性检查。

    注意

    ext4 中唯一支持的日志模式是 data=ordered (默认)。如需更多信息,请参阅 RHEL 是否支持 EXT journaling 选项 "data=writeback"?知识库文章。

  • 次秒时间戳 - 这为次秒提供时间戳。

其它资源

  • ext4 手册页。

44.2. 创建 ext4 文件系统

作为系统管理员,您可以使用 mkfs.ext4 命令在块设备上创建 ext4 文件系统。

先决条件

  • 您磁盘中的一个分区。有关创建 MBR 或 GPT 分区的详情,请参阅 在磁盘上创建分区表

    另外,还可使用 LVM 或者 MD 卷。

流程

  1. 要创建 ext4 文件系统:

    • 对于常规分区设备、LVM 卷、MD 卷或者类似的设备,使用以下命令:

      # mkfs.ext4 /dev/block_device

      使用到块设备的路径替换 /dev/block_device

      例如:/dev/sdb1/dev/disk/by-uuid/05e99ec8-def1-4a5e-8a9d-5945339ceb2a/dev/my-volgroup/my-lv。一般说来,默认选项适用于大多数使用场景。

    • 对于条带块设备(如 RAID5 阵列),可以在创建文件系统时指定条带几何结构。使用正确的条带几何结构可提高 ext4 文件系统的性能。例如,要在 4k-块文件系统上创建跨距为 64k(即 16 x 4096)的文件系统,请使用以下命令:

      # mkfs.ext4 -E stride=16,stripe-width=64 /dev/block_device

      在给定示例中:

      • stride=value:指定 RAID 块大小
      • stripe-width=value:指定 RAID 设备中数据磁盘的数量,或者条带中的条带单元的数量。
    注意
    • 在创建文件系统时指定 UUID:

      # mkfs.ext4 -U UUID /dev/block_device

      使用您要设置的 UUID 替换 UUID:例如,7cd65de3-e0be-41d9-b66d-96d749c02da7

      使用 ext4 文件系统的路径替换 /dev/block_device,来将 UUID 添加给它:例如 /dev/sda8

    • 在创建文件系统时指定标签:

      # mkfs.ext4 -L label-name /dev/block_device
  2. 查看创建的 ext4 文件系统:

    # blkid

其它资源

  • ext4 手册页。
  • mkfs.ext4 手册页。

44.3. 挂载 ext4 文件系统

作为系统管理员,您可以使用 mount 工具挂载 ext4 文件系统。

先决条件

流程

  1. 要创建一个挂载点来挂载文件系统:

    # mkdir /mount/point

    使用创建分区挂载点的目录名替换 /mount/point

  2. 挂载 ext4 文件系统:

    • 要挂载一个没有额外选项的 ext4 文件系统:

      # mount /dev/block_device /mount/point
    • 要永久挂载文件系统,请参阅 永久挂载文件系统
  3. 查看挂载的文件系统:

    # df -h

其它资源

44.4. 重新定义 ext4 文件系统大小

作为系统管理员,您可以使用 resize2fs 工具调整 ext4 文件系统的大小。resize2fs 工具以文件系统块大小为单位读取大小,除非使用后缀表示特定的单位。以下后缀表示特定的单位:

  • s(扇区)- 512 字节扇区
  • K(KB)- 1,024 字节
  • M(兆字节)- 1,048,576 字节
  • G(GB)- 1,073,741,824 字节
  • T(TB)- 1,099,511,627,776 字节

先决条件

  • ext4 文件系统。有关创建 ext4 文件系统的详情,请参考 创建 ext4 文件系统
  • 调整大小后可保留文件系统的基本块设备。

流程

  1. 要重新定义 ext4 文件系统大小,请执行以下步骤:

    • 要缩小并增大卸载的 ext4 文件系统的大小:

      # umount /dev/block_device
      # e2fsck -f /dev/block_device
      # resize2fs /dev/block_device size

      使用块设备的路径替换 /dev/block_device,例如 /dev/sdb1

      使用 sKMGT 后缀将 size 替换为所需的调整大小的值。

    • 可以使用 resize2fs 命令在挂载时增大 ext4 文件系统:

      # resize2fs /mount/device size
      注意

      扩展时 size 参数是可选的(通常是多余的)。resize2fs 会自动扩展来填充容器的可用空间,通常是逻辑卷或分区。

  2. 查看重新定义大小的文件系统:

    # df -h

其它资源

  • resize2fs 手册页。
  • e2fsck 手册页。
  • ext4 手册页。

44.5. 和 ext4 和 XFS 一起使用的工具比较

这部分比较用于完成 ext4 和 XFS 文件系统中常用任务的工具。

任务ext4XFS

创建文件系统

mkfs.ext4

mkfs.xfs

文件系统检查

e2fsck

xfs_repair

重新定义文件系统大小

resize2fs

xfs_growfs

保存文件系统的镜像

e2image

xfs_metadumpxfs_mdrestore

标签或者调整文件系统

tune2fs

xfs_admin

备份文件系统

tarrsync

xfsdumpxfsrestore

配额管理

quota

xfs_quota

文件映射

filefrag

xfs_bmap

注意

如果您需要通过网络进行备份的完整客户端-服务器解决方案,您可以使用 RHEL 9 中提供的 bacula 备份实用程序。有关 Bacula 的更多信息,请参阅 Bacula 备份解决方案

第 45 章 使用 RHEL 系统角色创建并挂载 ext4 文件系统

这部分描述了如何在磁盘上创建带有给定标签的 ext4 文件系统,并使用 存储 角色永久挂载文件系统。

先决条件

  • 包含 存储 角色的 Ansible playbook 已存在。

如需有关如何应用此类 playbook 的信息,请参阅 应用角色

45.1. 创建和挂载 Ext4 文件系统的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用存储角色来创建和挂载 Ext4 文件系统。

例 45.1. 在 /dev/sdb 上创建 Ext4 并挂载到 /mnt/data 的 playbook

---
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - sdb
        fs_type: ext4
        fs_label: label-name
        mount_point: /mnt/data
  roles:
    - rhel-system-roles.storage
  • playbook 在 /dev/sdb 磁盘上创建文件系统。
  • playbook 永久将文件系统挂载在 /mnt/data 目录。
  • 文件系统的标签是 label-name

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

45.2. 其它资源