Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

存储管理指南

Red Hat Enterprise Linux 7

在 RHEL 7 中部署和配置单节点存储

编辑

Marek Suchánek

Red Hat Customer Content Services

编辑

Apurva Bhide

Red Hat Customer Content Services

Milan Navrátil

Red Hat Customer Content Services

Jacquelynn East

Red Hat Customer Content Services

Don Domingo

Red Hat Customer Content Services

摘要

本指南提供了如何有效管理 Red Hat Enterprise Linux 7 上的存储设备和文件系统的说明。它供具有基本了解 Red Hat Enterprise Linux 或 Fedora 的系统管理员使用。

第 1 章 概述

存储管理指南包含有关 Red Hat Enterprise Linux 7 中支持的文件系统和数据存储功能的大量信息。本书旨在为管理单节点(即非群集)存储解决方案的管理员提供快速参考。
存储管理指南被分成以下部分: 文件系统、存储管理和数据重复数据删除以及使用 VDO 进行数据压缩。
文件系统部分详细介绍了 Red Hat Enterprise Linux 7 支持的各种文件系统。它描述了它们,并解释了如何最好地利用它们。
存储管理部分详细介绍了 Red Hat Enterprise Linux 7 支持的各种工具和存储管理任务。它描述了它们,并解释了如何最好地利用它们。
VDO 的数据重复数据删除和压缩部分描述了 Virtual Data Optimizer (VDO)。它解释了如何使用 VDO 来减少您的存储要求。

1.1. Red Hat Enterprise Linux 7 中的新功能和增强功能

Red Hat Enterprise Linux 7 具有以下文件系统改进:

不包括 eCryptfs

从 Red Hat Enterprise Linux 7 开始,不包括 eCryptfs。有关加密文件系统的更多信息,请参阅红帽的安全指南。

系统存储管理器

Red Hat Enterprise Linux 7 包括一个名为 System Storage Manager 的新应用程序,它提供了一个命令行界面来管理各种存储技术。如需更多信息,请参阅 第 16 章 系统存储管理器(SSM)

XFS 是默认文件系统

从 Red Hat Enterprise Linux 7 开始,XFS 是默认的文件系统。有关 XFS 文件系统的详情,请参考 第 3 章 XFS 文件系统

文件系统重组

Red Hat Enterprise Linux 7 引入了一个新的文件系统结构。目录 /bin/sbin/lib/lib64 现在嵌套在 /usr 下。

snapper

Red Hat Enterprise Linux 7 引入了一个名为 Snapper 的新工具,它可以方便地创建和管理 LVM 和 Btrfs 的快照。如需更多信息,请参阅 第 14 章 使用 Snapper 创建和维护快照

Btrfs(技术预览)

注意
Btrfs 在 Red Hat Enterprise Linux 7 中作为技术预览功能提供,但自 Red Hat Enterprise Linux 7.4 发行版本起已被弃用。它将在以后的 Red Hat Enterprise Linux 主发行版本中删除。
如需更多信息,请参阅 Red Hat Enterprise Linux 7.4 发行注记中的 已弃用的功能
Btrfs 是一个本地文件系统,旨在提供更好的性能和可扩展性,包括集成的 LVM 操作。红帽不完全支持这个文件系统,因此是一个技术预览。有关 Btrfs 的详情,请参考 第 6 章 Btrfs(技术预览)

NFSv2 没有支持长

从 Red Hat Enterprise Linux 7 开始,不再支持 NFSv2。

部分 I. 文件系统

文件系统部分提供有关红帽完全支持的文件系统结构和维护、Btrfs 技术预览和文件系统的信息:ext3、ext4、GFS2、XFS、NFS 和 FS-Cache。
注意
Btrfs 在 Red Hat Enterprise Linux 7 中作为技术预览功能提供,但自 Red Hat Enterprise Linux 7.4 发行版本起已被弃用。它将在以后的 Red Hat Enterprise Linux 主发行版本中删除。
如需更多信息,请参阅 Red Hat Enterprise Linux 7.4 发行注记中的 已弃用的功能
有关 Red Hat Enterprise Linux 文件系统和存储限制的概述,请参阅红帽知识库中的 Red Hat Enterprise Linux 技术功能和限制
XFS 是 Red Hat Enterprise Linux 7 和 Red Hat 中的默认文件系统,红帽建议您使用 XFS,除非您有强大的原因来使用另一个文件系统。有关常见文件系统及其属性的常规信息,请参阅以下红帽知识库文章: 如何选择您的 Red Hat Enterprise Linux 文件系统

第 2 章 文件系统结构和维护

文件系统结构是操作系统中最基本的组织级别。操作系统与其用户、应用程序和安全模型交互的方式几乎始终取决于操作系统如何在存储设备上组织文件。提供通用文件系统结构可确保用户和程序能够访问和写文件。
文件系统将文件划分为两个逻辑类别:
可共享和不可取的文件
可以在本地和远程主机访问 可共享 文件。Unsharable 文件仅在本地可用。
变量和静态文件
变量文件 (如文档)可以随时更改。静态文件 (如二进制文件)不会在没有系统管理员的操作的情况下改变。
以这种方式分类文件有助于将每个文件的功能与分配给保存它们的目录的权限相关联。操作系统及其用户与文件交互的方式决定了放置文件的目录、该目录是以只读还是读写权限挂载的,以及每个用户对该文件的访问级别。该组织的最高层至关重要;对底层目录的访问可能会受到限制,否则,如果从最高层向下的访问规则不遵循严格的结构,就会出现安全问题。

2.1. 文件系统层次结构标准(FHS)概述.

Red Hat Enterprise Linux 使用 文件系统层次结构标准 (FHS)文件系统结构,它定义了许多文件类型和目录的名称、位置和权限。
FHS 文档是任何符合 FHS 的文件系统的权威参考,,但该标准留下了许多未定义或可扩展的领域。本节概述了该标准,并描述了该标准未涵盖的文件系统部分。
FHS 合规的两个最重要的元素是:
  • 与其他符合 FHS 的系统兼容
  • 能够以只读形式挂载 /usr/ 分区。这很重要,因为 /usr/ 包含常见的可执行文件,用户不应更改。此外,由于 /usr/ 以只读形式挂载,它应该可以从 CD-ROM 驱动器或通过只读 NFS 挂载从另一台机器挂载。

2.1.1. FHS 组织

此处记下的目录和文件是 FHS 文档指定的目录和文件的一个子集。有关最完整的信息,请查看最新的 FHS 文档 http://refspecs.linuxfoundation.org/FHS_3.0/fhs-3.0.pdf; file-hierarchy(7) man page 还提供了概述。
注意
可用的目录取决于任意给定系统上安装的内容。以下列表只能是可以找到的内容的示例。

2.1.1.1. 收集文件系统信息

df 命令
df 命令报告系统的磁盘空间使用情况。其输出类似如下:

例 2.1. df 命令输出

Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                       11675568   6272120   4810348  57% / /dev/sda1
	                 100691      9281     86211  10% /boot
none                     322856         0    322856   0% /dev/shm
默认情况下,df 以 1 KB 块为单位显示分区大小,以及以 KB 为单位的已用和可用磁盘空间。要以 MB 和 GB 为单位查看信息,请使用命令 df -hh 参数代表"人类可读的"格式。df -h 的输出类似如下:

例 2.2. df -h 命令输出

Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                        12G  6.0G  4.6G  57% / /dev/sda1
			99M  9.1M   85M  10% /boot
none 			316M     0  316M   0% /dev/shm
注意
在给定示例中,挂载的分区 /dev/shm 代表系统的虚拟内存文件系统。
DU 命令
du 命令显示目录中文件使用的总空间量,显示每个子目录的磁盘使用情况。du 输出中的最后一行显示目录的总磁盘使用情况。要仅查看目录的总磁盘使用情况(以人类可读的格式),请使用 du -hs。有关更多选项,请参阅 man du
GNOME 系统监控器
要以图形格式查看系统的分区和磁盘空间使用情况,请点击 ApplicationsTools System Monitor 或使用 gnome-system-monitor 命令,使用 Gnome System Monitor。选择 File Systems 选项卡来查看系统的分区。下图展示了 File Systems 选项卡。

图 2.1. GNOME 系统监控器中的文件系统选项卡

GNOME 系统监控器中的文件系统选项卡

2.1.1.2. /boot/ 目录

/boot/ 目录包含引导系统所需的静态文件,例如 Linux 内核。这些文件对于系统正常启动至关重要。
警告
不要删除 /boot/ 目录。这样做会使系统无法启动。

2.1.1.3. /dev/ 目录

/dev/ 目录包含代表以下设备类型的设备节点:
  • 连接到系统的设备;
  • 内核提供的虚拟设备.
这些设备节点对于系统正常工作至关重要。udevd 守护进程根据需要在 /dev/ 中创建和删除设备节点。
/dev/ 目录和子目录中的设备定义为 字符 (仅提供输入和输出的串行流,如鼠标或键盘)或 (随机访问,如硬盘驱动器或软盘驱动器)。如果安装了 GNOME 或 KDE,则连接(如使用 USB)或插入(如 CD 或者 DVD 驱动器)时会自动检测一些存储设备,并显示其内容的弹出窗口。

表 2.1. /dev 目录中通用文件的示例

File 描述
/dev/hda 主 IDE 通道上的主设备。
/dev/hdb 主 IDE 通道上的从设备.
/dev/tty0 第一个虚拟控制台.
/dev/tty1 第二个虚拟控制台.
/dev/sda 主 SCSI 或 SATA 通道中的第一个设备。
/dev/lp0 第一个并行端口。
有效的块设备可以是两种类型的条目之一:
映射设备
卷组中的逻辑卷,例如 /dev/mapper/VolGroup00-LogVol02
静态设备
传统存储卷,例如 /dev/sdbX,其中 sdb 是存储设备名称,X 是分区号。/dev/sdbX 也可以是 /dev/disk/by-id/WWID,或 /dev/disk/by-uuid/UUID。如需更多信息,请参阅 第 25.8 节 “持久性命名”

2.1.1.4. /etc/ 目录

/etc/ 目录保留机器本地的配置文件。它不应包含任何二进制文件;如果存在二进制文件,请将其移到 /usr/bin//usr/sbin/
例如,/etc/skel/ 目录存储"框架"用户文件,这些文件用于在首次创建用户时填充主目录。应用也将其配置文件存储在此目录中,并且在执行时可能会引用这些文件。/etc/exports 文件控制哪些文件系统导出到远程主机。

2.1.1.5. /mnt/ 目录

为临时挂载的文件系统保留 /mnt/ 目录,如 NFS 文件系统挂载。对于所有可移动存储介质,请使用 /media/ 目录。自动检测到的可移动介质挂载在 /media 目录中。
重要
安装程序不能使用 /mnt 目录。

2.1.1.6. /opt/ 目录

/opt/ 目录通常为不属于默认安装的软件和附加软件包保留。安装到 /opt/ 的软件包会创建一个目录,例如,/opt/packagename/。在大多数情况下,此类软件包遵循可预测的子目录结构;大多数软件包将其二进制文件存储在 /opt/packagename/bin/ 中,其 man page 存储在 /opt/packagename/man/ 中。

2.1.1.7. /proc/ 目录

/proc/ 目录包含从内核中提取信息或向其发送信息的特殊文件。此类信息的示例包括系统内存、CPU 信息和硬件配置。有关 /proc/ 的详情,请参考 第 2.3 节 “/proc 虚拟文件系统”

2.1.1.8. /srv/ 目录

/srv/ 目录包含 Red Hat Enterprise Linux 系统提供的特定于站点的数据。此目录为用户提供特定服务(如 FTP、WWW 或 CVS)的数据文件的位置。仅与特定用户相关的数据应位于 /home/ 目录中。

2.1.1.9. /sys/ 目录

/sys/ 目录利用特定于内核的新 sysfs 虚拟文件系统。随着对内核中热插硬件设备的支持,/sys/ 目录包含与 /proc/ 持有的信息相似,但显示特定于热插拔设备的设备信息的层次结构视图。

2.1.1.10. /usr/ 目录

/usr/ 目录用于可在多台机器之间共享的文件。/usr/ 目录通常位于其自己的分区上,并以只读形式挂载。至少,/usr/ 应该包含以下子目录:
/usr/bin
此目录用于二进制文件。
/usr/etc
此目录用于系统范围的配置文件。
/usr/games
此目录存储游戏。
/usr/include
此目录用于 C 头文件。
/usr/kerberos
此目录用于与 Kerberos 相关的二进制文件和文件。
/usr/lib
此目录用于设计不是由 shell 脚本或用户直接使用的对象文件和库。
从 Red Hat Enterprise Linux 7.0 开始,/lib/ 目录已与 /usr/lib 合并。现在,它还包含在 /usr/bin/ 和 /usr/ sbin/ 中执行二进制文件所需的库。这些共享库镜像用于引导系统或执行根文件系统中的命令。
/usr/libexec
此目录包含其他程序调用的小型帮助程序。
/usr/sbin
从 Red Hat Enterprise Linux 7.0 开始,/sbin 已移到 /usr/sbin 中。这意味着它包含所有系统管理二进制文件,包括启动、恢复、恢复或修复系统所必需的。/usr/sbin/ 中的二进制文件需要 root 特权才能使用。
/usr/share
此目录存储不特定于架构的文件。
/usr/src
此目录存储源代码。
/usr/tmp 链接到 /var/tmp
此目录存储临时文件。
/usr/ 目录还应包含 /local/ 子目录。根据 FHS,系统管理员在本地安装软件时会使用这个子目录,在系统更新时应该不会被覆盖。/usr/local 目录的结构与 /usr/ 类似,包含以下子目录:
  • /usr/local/bin
  • /usr/local/etc
  • /usr/local/games
  • /usr/local/include
  • /usr/local/lib
  • /usr/local/libexec
  • /usr/local/sbin
  • /usr/local/share
  • /usr/local/src
Red Hat Enterprise Linux 对 /usr/local/ 的使用与 FHS 稍有不同。FHS 指出 /usr/local/ 应该用于存储系统软件升级安全的软件。由于 RPM Package Manager 可以安全地执行软件升级,因此不需要通过将文件存储在 /usr/local/ 中来保护文件。
相反,Red Hat Enterprise Linux 将 /usr/local/ 用于机器本地的软件。例如,如果 /usr/ 目录作为只读 NFS 共享从远程主机挂载,那么仍然可以将软件包或程序安装到 /usr/local/ 目录下。

2.1.1.11. /var/ 目录

由于 FHS 要求 Linux 将 /usr/ 挂载为只读,因此任何写入日志文件或需要 spool/lock/ 目录的程序都应将它们写入 /var/ 目录。FHS 指出 /var/ 用于变量数据,其中包括 spool 目录和文件、日志记录数据、临时和临时文件。
以下是在 /var/ 目录中找到的一些目录:
  • /var/account/
  • /var/arpwatch/
  • /var/cache/
  • /var/crash/
  • /var/db/
  • /var/empty/
  • /var/ftp/
  • /var/gdm/
  • /var/kerberos/
  • /var/lib/
  • /var/local/
  • /var/lock/
  • /var/log/
  • 链接到 /var/spool/mail//var/mail
  • /var/mailman/
  • /var/named/
  • /var/nis/
  • /var/opt/
  • /var/preserve/
  • /var/run/
  • /var/spool/
  • /var/tmp/
  • /var/tux/
  • /var/www/
  • /var/yp/
重要
/var/run/media/user 目录包含用作可移动介质挂载点的子目录,如 USB 存储介质、DVD、CD-ROM 和 Zip 磁盘。请注意,/media/ 目录用于此目的。
系统日志文件(如 messageslastlog )位于 /var/log/ 目录中。/var/lib/rpm/ 目录包含 RPM 系统数据库。锁定文件位于 /var/lock/ 目录中,通常位于使用该文件的程序的目录中。/var/spool/ 目录有存储某些程序数据文件的子目录。这些子目录包括:
  • /var/spool/at/
  • /var/spool/clientmqueue/
  • /var/spool/cron/
  • /var/spool/cups/
  • /var/spool/exim/
  • /var/spool/lpd/
  • /var/spool/mail/
  • /var/spool/mailman/
  • /var/spool/mqueue/
  • /var/spool/news/
  • /var/spool/postfix/
  • /var/spool/repackage/
  • /var/spool/rwho/
  • /var/spool/samba/
  • /var/spool/squid/
  • /var/spool/squirrelmail/
  • /var/spool/up2date/
  • /var/spool/uucp/
  • /var/spool/uucppublic/
  • /var/spool/vbox/

2.2. 特殊 Red Hat Enterprise Linux 文件位置

Red Hat Enterprise Linux 稍微扩展了 FHS 结构以适应特殊文件。
大多数与 RPM 相关的文件保存在 /var/lib/rpm/ 目录中。有关 RPM 的更多信息,请参阅 man rpm
/var/cache/yum/ 目录包含 Package Updater 使用的文件,包括系统的 RPM 标头信息。此位置还可用于在更新系统时临时存储下载的 RPM。有关红帽网络的详情请参考 https://rhn.redhat.com/
特定于 Red Hat Enterprise Linux 的另一个位置是 /etc/sysconfig/ 目录。该目录存储各种配置信息。许多在启动时运行的脚本都使用此目录中的文件。

2.3. /proc 虚拟文件系统

与大多数文件系统不同,/proc 既不包含文本文件,也不包含二进制文件。由于它托管了 虚拟文件/proc 被称为虚拟文件系统。这些虚拟文件的大小通常为零字节,即使它们包含大量信息。
/proc 文件系统不用于存储。它的主要用途是为硬件、内存、运行进程和其他系统组件提供基于文件的接口。可以通过查看相应的 /proc 文件,在多个系统组件上检索实时信息。还可以操作 /proc 中的某些文件(用户和应用程序)来配置内核。
以下 /proc 文件与管理和监控系统存储相关:
/proc/devices
显示当前配置的各种字符和块设备。
/proc/filesystems
列出内核当前支持的所有文件系统类型。
/proc/mdstat
包含系统上多个磁盘或 RAID 配置(如果存在)的当前信息。
/proc/mounts
列出系统当前使用的所有挂载。
/proc/partitions
包含分区块分配信息.
有关 /proc 文件系统的更多信息,请参阅 Red Hat Enterprise Linux 7 部署指南

2.4. 丢弃未使用的块

批量丢弃和在线丢弃操作是挂载的文件系统的功能,它们丢弃文件系统未使用的块。它们可用于固态硬盘和精简配置的存储。
  • 批量丢弃操作 由用户使用 fstrim 命令显式运行。此命令丢弃文件系统中符合用户条件的所有未使用的块。
  • 在线丢弃操作 在挂载时指定,可以使用 -o discard 选项作为 mount 命令的一部分,也可以使用 /etc/fstab 文件中的 discard 选项。它们在没有用户干预的情况下实时运行。在线丢弃操作只丢弃从已使用转变为空闲的块。
从 Red Hat Enterprise Linux 6.4 开始,ext4 文件系统都支持这两种操作类型,以及 XFS 文件系统。另外,文件系统底层的块设备必须支持物理丢弃操作。如果 /sys/block/设备/queue/discard_max_bytes 文件中存储的值不为零,则支持物理丢弃操作。
如果您要对以下执行 fstrim 命令:
  • 不支持丢弃操作的设备,或者
  • 一个由多个设备组成的逻辑设备(LVM 或者 MD),其中任何一个设备都不支持丢弃操作
将显示以下信息:
fstrim -v /mnt/non_discard
fstrim: /mnt/non_discard: the discard operation is not supported
注意
mount 命令允许您使用 -o discard 选项挂载不支持丢弃操作的设备。
红帽建议批量丢弃操作,除非系统的工作负载不允许批量丢弃,或者需要在线丢弃操作来保持性能。
详情请查看 fstrim(8)mount(8) man page。

第 3 章 XFS 文件系统

XFS 是一个高度可扩展的、高性能的文件系统,它最初是由 Silicon Graphics, Inc 设计的。XFS 是 Red Hat Enterprise Linux 7 的默认文件系统。
XFS 的主要功能
  • XFS 支持 元数据日志 ,这有助于更快地恢复崩溃。
  • XFS 文件系统可以在挂载和激活时进行碎片整理和放大。
  • 另外,Red Hat Enterprise Linux 7 支持特定于 XFS 的备份和恢复工具。
分配功能
XFS 具有以下分配方案:
  • 基于数据块的分配
  • 条带化分配策略
  • 延迟分配
  • 空间预分配
延迟分配和其他性能优化对 XFS 的影响与对 ext4 的影响一样。即,程序对 XFS 文件系统的写操作无法保证为磁盘上,除非程序随后发出 fsync () 调用。
有关延迟分配对文件系统(ext4 和 XFS)的影响的更多信息,请参阅 分配功能 中的 第 5 章 ext4 文件系统
注意
创建或扩展文件偶尔会失败,并显示意外的 ENOSPC 写入失败,即使磁盘空间似乎足够了。这是因为 XFS 的性能导向型设计。实际上,它不会成为问题,因为它只有在剩余空间只是几个块时才会发生。
其他 XFS 功能
XFS 文件系统还支持以下内容:
扩展的属性 (xattr)
这允许系统能够按文件关联多个额外的名称/值对。它会被默认启用。
配额日志
这可避免在崩溃后需要进行冗长的配额一致性检查。
项目/目录配额
这允许对目录树的配额限制。
小于秒的时间戳
这允许时间戳进入亚秒。
默认 atime 行为是 relatime
对于 XFS,relatime 默认为 on。与 noatime 相比,它几乎没有开销,同时仍维护 sane atime 值。

3.1. 创建 XFS 文件系统

  • 要创建 XFS 文件系统,请使用以下命令:
    # 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 选项来覆盖该文件系统。

例 3.1. mkfs.xfs 命令输出

以下是 mkfs.xfs 命令的输出示例:
meta-data=/dev/device            isize=256    agcount=4, agsize=3277258 blks
         =                       sectsz=512   attr=2
data     =                       bsize=4096   blocks=13109032, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal log           bsize=4096   blocks=6400, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
注意
XFS 文件系统创建后,其大小不能缩小。但是,仍然可以使用 xfs_growfs 命令放大。如需更多信息,请参阅 第 3.4 节 “增加 XFS 文件系统的大小”

条带块设备

对于条带块设备(如 RAID5 阵列),可以在创建文件系统时指定条带几何结构。使用合适的条带几何形状可显著提高 XFS 文件系统的性能。
在 LVM 或 MD 卷上创建文件系统时,mkfs.xfs 选择最佳的几何结构。对于将几何结构信息导出到操作系统的某些硬件 RAID,这可能也是如此。
如果设备导出条带几何结构信息,则 mkfs 工具(用于 ext3、ext4 和 xfs)将自动使用此 geometry。如果 mkfs 工具没有检测到条带几何结构,即使存储确实有条带几何结构,则可以在使用以下选项创建文件系统时手动指定它:
su=value
指定条带单位或 RAID 块大小。该值必须 以字节为单位,使用可选的 kmg 后缀。
sw=value
指定 RAID 设备中数据磁盘的数量,或者条带中条带单位的数量。
以下示例对包含 4 个条带单位的 RAID 设备指定了 64k 的块大小:
# mkfs.xfs -d su=64k,sw=4 /dev/block_device

其它资源

有关创建 XFS 文件系统的更多信息,请参阅:

3.2. 挂载 XFS 文件系统

XFS 文件系统可以在没有额外选项的情况下挂载,例如:
# mount /dev/device /mount/point
Red Hat Enterprise Linux 7 的默认值为 inode64。
注意
mke2fs 不同,mkfs.xfs 不使用配置文件;它们都是在命令行中指定的。

写屏障

默认情况下,XFS 使用写屏障来确保文件系统的完整性,即使启用了写缓存的设备掉电了。对于没有写缓存的设备,或者有电池支持的写缓存的设备,请使用 nobarrier 选项禁用障碍:
# mount -o nobarrier /dev/device /mount/point
有关写屏障的详情,请参考 第 22 章 写屏障

直接访问技术预览

从 Red Hat Enterprise Linux 7.3 开始,在 ext4 和 XFS 文件系统中作为技术预览提供 直接访问 (DAX)。应用是一种将持久内存直接映射到其地址空间的方法。要使用 DAX,系统必须有某种可用的持久性内存,通常使用一个或多个非易失性双内存模块(NVDIMM),必须在 NVDIMM 上创建支持 DAX 的文件系统。另外,该文件系统必须使用 dax 挂载选项挂载。然后,在 dax 挂载的文件系统中的一个文件 mmap 会导致存储直接映射到应用程序的地址空间中。

3.3. XFS 配额管理

XFS 配额子系统管理磁盘空间(块)和文件(inode)使用情况的限制。XFS 配额控制或报告在用户、组、目录或项目级别使用这些项目的使用情况。此外,请注意,尽管用户、组、目录或项目配额是独立启用的,但组和项目配额是互斥的。
在按目录或按项目管理时,XFS 管理与特定项目关联的目录层次结构的磁盘使用情况。为此,XFS 可以识别项目之间的跨组织的"组"边界。这提供了比管理用户或组配额更广泛的控制级别。
XFS 配额在挂载时通过特定的挂载选项启用。每个挂载选项也可以指定为 noenforce; 这允许在不强制实施任何限制的情况下报告使用情况。有效的配额挂载选项有:
  • uquota/uqnoenforce: 用户配额
  • gquota/gqnoenforce: 组配额
  • pquota/pqnoenforce: 项目配额
启用配额后,xfs_quota 工具可用于设置限制并报告磁盘使用情况。默认情况下,xfs_quota 以交互方式运行,并以 基本模式。基本模式子命令只是报告使用情况,适用于所有用户。基本 xfs_quota 子命令包括:
quota username/userID
显示给定 username 或数字 userID的使用情况和限制
df
显示块和 inode 的空闲和已使用数。
相反,xfs_quota 也具有 专家模式。此模式的子命令允许实际限制的配置,并且仅可提供给具有升级特权的用户使用。要以交互方式使用专家模式子命令,请使用以下命令:
# xfs_quota -x
专家模式子命令包括:
report /path
报告特定文件系统的配额信息。
limit
修改配额限制。
如需基本或专家模式的子命令的完整列表,请使用子命令 help
所有子命令也可以使用 -c 选项直接从命令行运行,而 -x 用于专家子命令。

例 3.2. 显示示例配额报告

例如,要显示 /home 的配额报告示例(在 /dev/blockdevice上),请使用命令 xfs_quota -x -c '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 [------]
...
要为用户 john 设置软和硬内节点计数限制为 500 和 700,其主目录为 /home/john,请使用以下命令:
# xfs_quota -x -c 'limit isoft=500 ihard=700 john' /home/
在这种情况下,传递 mount_point,这是挂载的 xfs 文件系统。
默认情况下,limit 子命令将目标识别为用户。在为组配置限制时,请使用 -g 选项(如上例中所示)。同样,将 -p 用于项目。
也可以使用 bsoftbhard 而不是 isoftihard 来配置软和硬块限制。

例 3.3. 设置 Soft 和 Hard Block Limit

例如,要将软和硬块限制分别设置为 1000m 和 1200m,来对 /target/path 文件系统上的 accounting 进行分组,请使用以下命令:
# xfs_quota -x -c 'limit -g bsoft=1000m bhard=1200m accounting' /target/path
注意
命令 bsoftbhard 计数为字节。
重要
虽然 man xfs_quota 中描述了实时块(rtbhard/rtbsoft),但在设置配额时,不会启用实时子卷。因此,rtbhardrtbsoft 选项不适用。

设置项目限制

使用 XFS 文件系统,您可以在称为受管树的文件系统中单独目录层次结构上设置配额。每个受管树都通过 项目 ID 和可选项目名称 唯一标识。
  1. 将项目控制的目录添加到 /etc/projects。例如,以下命令将唯一 ID 为 11/var/log 路径添加到 /etc/projects。您的项目 ID 可以是任何映射到项目的数字值。
    # echo 11:/var/log >> /etc/projects
  2. 将项目名称添加到 /etc/projid,将项目 ID 映射到项目名称。例如,以下命令将名为 logfiles 的项目与上一步中定义的项目 ID 11 关联:
    # echo logfiles:11 >> /etc/projid
  3. 初始化项目目录。例如,以下命令初始化项目目录 /var
    # xfs_quota -x -c 'project -s logfiles' /var
  4. 为使用初始化目录的项目配置配额:
    # xfs_quota -x -c 'limit -p bhard=lg logfiles' /var
通用配额配置工具(例如quota、picquota 和 edquota )也可用于操作 XFS 配额。但是这些工具不能用于 XFS 项目配额。
重要
红帽建议在所有其他可用工具中使用 xfs_quota
有关设置 XFS 配额的更多信息,请参阅 man xfs_quotaman projid (5)man projects (5)

3.4. 增加 XFS 文件系统的大小

使用 xfs_growfs 命令在挂载时可能会增大 XFS 文件系统:
# xfs_growfs /mount/point -D size
-D size 选项将文件系统增大到指定的大小(以文件系统块表示)。如果没有 -D size 选项,xfs_growfs 会将文件系统增大到该设备支持的最大大小。
在使用 -D 大小 增大 XFS 文件系统之前,请确保底层块设备具有适当的大小,以便以后存放文件系统。为受影响的块设备使用合适的调整大小的方法。
注意
尽管挂载时可以增大 XFS 文件系统,但不能缩小它们的大小。
有关增大文件系统的更多信息,请参阅 man xfs_growfs

3.5. 修复 XFS 文件系统

要修复 XFS 文件系统,请使用 xfs_repair
# xfs_repair /dev/device
xfs_repair 工具高度可扩展,旨在高效地修复具有许多 inode 的超大文件系统。与其他 Linux 文件系统不同,xfs_repair 不会在引导时运行,即使 XFS 文件系统没有被完全卸载。如果未完全卸载,xfs_repair 会在挂载时简单地重新执行日志,确保文件系统一致。
警告
xfs_repair 工具无法修复带有脏日志的 XFS 文件系统。要清除日志,请挂载并卸载 XFS 文件系统。如果日志损坏且无法重新执行,请使用 -L 选项("强制日志归零")清除日志,即 xfs_repair -L /dev/device。请注意,这可能导致进一步损坏或数据丢失。
有关修复 XFS 文件系统的更多信息,请参阅 man xfs_repair

3.6. 暂停 XFS 文件系统

要挂起或恢复对文件系统的写活动,请使用以下命令:
# xfs_freeze mount-point
暂停写活动允许使用基于硬件的设备快照捕获处于一致状态的文件系统。
注意
xfs_freeze 工具由 xfsprogs 软件包提供,该软件包仅适用于 x86_64。
要暂停(也就是冻结)XFS 文件系统,请使用:
# xfs_freeze -f /mount/point
要解冻 XFS 文件系统,请使用:
# xfs_freeze -u /mount/point
在进行 LVM 快照时,不需要先使用 xfs_freeze 来暂停文件系统。相反,LVM 管理工具将在拍摄快照之前自动暂停 XFS 文件系统。
有关冻结和释放 XFS 文件系统的更多信息,请参阅 man xfs_freeze

3.7. 备份和恢复 XFS 文件系统

XFS 文件系统备份和恢复涉及以下工具:
  • 用于创建备份的 xfsdump
  • xfsrestore 用于从备份中恢复

3.7.1. XFS 备份和恢复的功能

Backup

您可以使用 xfsdump 工具来:
  • 对常规文件镜像执行备份。
    只能将一个备份写入常规文件。
  • 在磁带驱动器中执行备份。
    xfsdump 工具还允许您将多个备份写入同一磁带。备份可跨越多个标题。
    要将多个文件系统备份到单个磁带设备,只需将备份写入已包含 XFS 备份的磁带。这会将新备份附加到上一个备份。默认情况下,xfsdump 不会覆盖现有的备份。
  • 创建增量备份。
    xfsdump 工具使用 转储级别 来决定其他备份相对的基本备份。从 09 的数字指的是增加的转储级别。增量备份只备份自上一次较低级别转储以来发生变化的文件:
    • 要执行全备份,请在 文件系统中执行 0 级 转储。
    • 1 级转储是全备份后的第一个增量备份。下一个增量备份为 2 级,它仅备份自上 1 级转储后更改的文件,以此类推,最多为 9 级。
  • 使用大小、子树或 inode 标志从备份中排除文件,以过滤它们。

恢复

xfsrestore 工具从 xfsdump 生成的备份中恢复文件系统。xfsrestore 工具有两种模式:
  • 简单 模式允许用户从 0 级转储恢复整个文件系统。这是默认的模式。
  • 累积 模式启用从增量备份恢复文件系统:即,1 级到 9 级。
唯一的 会话 ID会话标签 标识每个备份。从包含多个备份的磁带恢复备份需要相应的会话 ID 或标签。
要从备份中提取、添加或删除特定文件,请输入 xfsrestore 交互模式。交互模式提供了一组命令来操作备份文件。

3.7.2. 备份 XFS 文件系统

这个步骤描述了如何将 XFS 文件系统的内容备份到文件或者磁带中。

过程 3.1. 备份 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

例 3.4. 备份多个 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

其它资源

  • 有关备份 XFS 文件系统的详情请参考 xfsdump(8) man page。

3.7.3. 从备份中恢复 XFS 文件系统

这个步骤描述了如何从文件或者磁带备份中恢复 XFS 文件系统的内容。

先决条件

过程 3.2. 从备份中恢复 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 中的可用命令包括 cd,ls,add,delete, 和 extract; 如需命令的完整列表,请使用 help 命令。

例 3.5. 恢复多个 XFS 文件系统

要恢复 XFS 备份文件,并将其内容保存到 /mnt/ 下的目录中:
# xfsrestore -f /backup-files/boot.xfsdump /mnt/boot/
# xfsrestore -f /backup-files/data.xfsdump /mnt/data/
要从包含多个备份的磁带设备恢复,请使用会话标签或会话 ID 指定每个备份:
# xfsrestore -f /dev/st0 -L "backup_boot" /mnt/boot/
# xfsrestore -f /dev/st0 -S "45e9af35-efd2-4244-87bc-4762e476cbab" /mnt/data/

从 Tape 恢复备份时的信息性消息

当从带有来自多个文件系统的备份的磁带恢复备份时,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)
[...]
说明性消息会一直显示,直到找到匹配的备份。

其它资源

  • 有关恢复 XFS 文件系统的详情请参考 xfsrestore(8) man page。

3.8. 配置错误行为

当 I/O 操作过程中发生错误时,XFS 驱动程序以以下两种方式之一响应:
  • 继续重试,直到出现以下任一操作:
    • I/O 操作成功,或者
    • 超过 I/O 操作重试计数或时间限制。
  • 考虑永久错误并停止系统。
XFS 目前可识别您可以配置所需行为的以下错误条件:
  • EIO: 在尝试写入设备时出现错误
  • ENOSPC: 该设备中没有剩余空间
  • ENODEV: Device cannot found
所有其他可能的错误条件(没有定义特定的处理程序)共享一个全局配置。
您可以设置 XFS 在最大重试次数和最长时间(以秒为单位)中导致错误持久性的条件。当满足任何一个条件时,XFS 会停止重试。
在卸载文件系统时,还有一个选项可立即取消重试,而不考虑任何其他配置。这允许卸载操作在出现持久错误时也可以成功。

3.8.1. 特定和未定义的条件的配置文件

控制错误行为的配置文件位于 /sys/fs/xfs/device/error/ 目录中。
/sys/fs/xfs/设备/error/metadata/ 目录包含每个特定错误条件的子目录:
  • 用于 EIO 错误条件的 /sys/fs/xfs/device/error/metadata / EIO /
  • /sys/fs/xfs/device/error/metadata/ENODEV/ 用于 ENODEV 错误条件
  • /sys/fs/xfs/device/error/metadata/ENOSPC/ 用于 ENOSPC 错误条件
然后,每个配置文件包含以下配置文件:
  • /sys/fs/xfs/device/error/metadata/condition/max_retries: 控制 XFS 重新尝试操作的最大次数。
  • /sys/fs/xfs/device/error/metadata/condition/retry_timeout_seconds: XFS 将停止重试操作的时间限制(以秒为单位)
除了上一节中描述的其它错误条件外,所有其他可能的错误条件在这些文件中共享一个通用配置:
  • /sys/fs/xfs/device/error/metadata/default/max_retries: 控制重试的最大次数
  • /sys/fs/xfs/device/error/metadata/default/retry_timeout_seconds: 控制重试的时间限制

3.8.2. 为特定和未定义条件设置文件系统行为

要设置重试的最大数量,请将所需的数量写入 max_retries 文件。
  • 对于特定条件:
    # echo value > /sys/fs/xfs/device/error/metadata/condition/max_retries
  • 对于未定义的条件:
    # echo value > /sys/fs/xfs/device/error/metadata/default/max_retries
value-1 和最大可能值为 int 的值(C 签名的整数类型)之间的数字。64 位 Linux 中是 2147483647
要设置时间限制,请将所需的秒数写入 retry_timeout_seconds 文件。
  • 对于特定条件:
    # echo value > /sys/fs/xfs/device/error/metadata/condition/retry_timeout_seconds
  • 对于未定义的条件:
    # echo value > /sys/fs/xfs/device/error/metadata/default/retry_timeout_seconds
value-186400 之间的数字,这是一天的秒数。
max_retriesretry_timeout_seconds 选项中,-1 表示重试 forever 和 0 以立即停止。
device 是设备的名称,如 /dev/ 目录中找到,例如: sda
注意
每个错误条件的默认行为取决于错误上下文。一些错误(如 ENODEV )被视为致命且不可恢复的,无论重试计数如何,其默认值为 0。

3.8.3. 设置卸载行为

如果设置了 fail_at_unmount 选项,文件系统会在卸载过程中覆盖所有其他错误配置,并在不重试 I/O 操作的情况下立即修改文件系统。这允许卸载操作在出现持久错误时也可以成功。
设置卸载行为:
# echo value > /sys/fs/xfs/device/error/fail_at_unmount
值可以是 10
  • 1 表示如果找到错误,则立即取消重试。
  • 0 表示遵守 max_retriesretry_timeout_seconds 选项。
device 是设备的名称,如 /dev/ 目录中找到,例如: sda
重要
在尝试卸载文件系统前,需要根据需要设置 fail_at_unmount 选项。启动卸载操作后,配置文件和目录可能无法使用。

3.9. 其他 XFS 文件系统工具

Red Hat Enterprise Linux 7 还具有管理 XFS 文件系统的其他工具:
xfs_fsr
用于对已挂载的 XFS 文件系统进行碎片整理。当不使用任何参数调用时,xfs_fsr 会对所有挂载的 XFS 文件系统中的所有常规文件进行碎片整理。此工具还允许用户在指定的时间暂停碎片整理,并在以后从其停止的地方恢复。
另外,xfs_fsr 还允许只对一个文件进行碎片整理,如 xfs_fsr /path/to/file中所述。红帽建议不要定期取消整个文件系统碎片,因为 XFS 默认避免碎片。系统范围的碎片整理可能会导致空闲空间出现碎片的影响。
xfs_bmap
打印 XFS 文件系统中文件所使用的磁盘块图。此图列出了指定文件所使用的每一个块,以及文件中没有相应块(即漏洞)的区域。
xfs_info
打印 XFS 文件系统信息.
xfs_admin
更改 XFS 文件系统的参数.xfs_admin 工具只能修改卸载的设备或文件系统的参数。
xfs_copy
将整个 XFS 文件系统的内容并行复制到一个或多个目的地。
以下工具在调试和分析 XFS 文件系统时也很有用:
xfs_metadump
将 XFS 文件系统元数据复制到文件中。红帽只支持使用 xfs_metadump 工具复制卸载的文件系统或只读挂载的文件系统;否则,生成的转储可能会损坏或不一致。
xfs_mdrestore
将 XFS metadump 镜像(使用 xfs_metadump生成)恢复到文件系统镜像。
xfs_db
调试 XFS 文件系统。
有关这些工具的详情,请查看其各自的 man page。

3.10. 从 ext4 迁移到 XFS

从 Red Hat Enterprise Linux 7.0 开始,XFS 是默认文件系统,而不是 ext4。本节重点介绍使用或管理 XFS 文件系统时的区别。
Red Hat Enterprise Linux 7 中仍完全支持 ext4 文件系统,并在安装时可以选择。虽然可以从 ext4 迁移到 XFS,但这不是必须的。

3.10.1. Ext3/4 和 XFS 之间的区别

文件系统修复
Ext3/4 在引导时在用户空间中运行 e2fsck,以便根据需要恢复日志。相比之下,XFS 在挂载时在内核空间中执行日志恢复。提供了 fsck.xfs shell 脚本,但不执行任何有用的操作,因为它只能满足 initscript 要求。
当请求 XFS 文件系统修复或检查时,请使用 xfs_repair 命令。使用 -n 选项进行只读检查。
xfs_repair 命令不会在带有脏日志的文件系统上运行。要修复此类文件系统 挂载和卸载 ,必须首先执行重新执行来回放日志。如果日志损坏且无法重新执行,可以在日志中使用 -L 选项为零。
有关 XFS 文件系统修复文件系统的更多信息,请参阅 第 12.2.2 节 “XFS”
元数据错误行为
当遇到元数据错误时,ext3/4 文件系统具有可配置的行为,其默认设置只是继续。当 XFS 遇到不可恢复的元数据错误时,它将关闭文件系统并返回 EFSCORRUPTED 错误。系统日志将包含遇到的错误的详情,并在需要时推荐运行 xfs_repair
配额
XFS 配额不是一个可重新挂载的选项。必须在初始挂载上指定 -o quota 选项,才能使配额生效。
虽然 quota 软件包中的标准工具可以执行基本的配额管理任务(如 setquotarepquota), xfs_quota 工具可用于特定于 XFS 的功能,如项目配额管理。
quotacheck 命令对 XFS 文件系统没有影响。第一次在 XFS 上打开配额核算时,会在内部执行自动 quotacheck。由于 XFS 配额元数据是第一类,因此日志的元数据对象将始终一致,直到手动关闭配额为止。
文件系统重新定义大小
XFS 文件系统没有工具来缩小文件系统。XFS 文件系统可以通过 xfs_growfs 命令在线增长。
内节点(inode)号
对于大于 1 TB 且具有 256 字节索引节点的文件系统,或者大于 2 TB,XFS 索引节点编号可能超过 2^32。这种大型索引节点编号会导致 32 位 stat 调用失败,并显示 EOVERFLOW 返回值。使用默认的 Red Hat Enterprise Linux 7 配置时,上面描述的问题可能会发生:使用四个分配组非条带化。自定义配置(如文件系统扩展或更改 XFS 文件系统参数)可能会导致不同的行为。
应用程序通常正确处理此类更大的索引节点编号。如果需要,使用 -o inode32 参数挂载 XFS 文件系统,以强制低于 2^32 的 inode 号。请注意,使用 inode32 不会影响已分配了 64 位数的 inode。
重要
除非特定环境需要,否则不要使用 inode32 选项。inode32 选项可改变分配行为。因此,如果没有可用空间在较低磁盘块中分配 inode,则可能会出现 ENOSPC 错误。
定性预分配
XFS 使用 规范预分配 来分配块过去 EOF,因为文件被写入。这可避免因为 NFS 服务器上的并发流写工作负载造成文件碎片。默认情况下,此预分配会增加文件大小,并将在"du"输出中明显显示。如果没有在五分钟内没有指定指定预分配的文件,则会丢弃预分配。如果内节点在这个时间前从缓存中循环,则当内节点被回收时,将丢弃预分配。
如果因为定性预分配而看到了预规划 ENOSPC 问题,可以使用 -o allocsize=amount 挂载选项指定固定的预分配量。
与碎片相关的工具
由于 Heuristics 和行为(如延迟分配和规范预分配)导致 XFS 文件系统来说,碎片很少发生。但是,存在用于衡量文件系统碎片的工具,以及对文件系统进行碎片整理。不鼓励使用它们。
xfs_db frag 命令尝试将所有文件系统分配成单个碎片编号,以百分比表示。命令的输出需要大量的专业知识才能理解其含义。例如,一个碎片因数为 75% 意味着每个文件平均有 4 个扩展。因此,xfs_db 的 frag 的输出不被视为有用,并建议更小心地分析任何碎片问题。
警告
xfs_fsr 命令可用于对单个文件或文件系统上的所有文件进行碎片整理。强烈建议不要这样做,因为它可能会破坏文件的本地性,并可能出现碎片释放的空间。

使用 ext3 和 ext4 的命令与 XFS 的比较

下表将用于 ext3 和 ext4 的常见命令与特定于 XFS 的对应部分进行比较。

表 3.1. ext3 和 ext4 的通用命令与 XFS 的比较

任务 ext3/4 XFS
创建文件系统 mkfs.ext4 or mkfs.ext3 mkfs.xfs
文件系统检查 e2fsck xfs_repair
重新定义文件系统大小 resize2fs xfs_growfs
保存文件系统的镜像 e2image xfs_metadumpxfs_mdrestore
标签或者调整文件系统 tune2fs xfs_admin
备份文件系统 dumprestore xfsdumpxfsrestore
下表列出了 XFS 文件系统功能的通用工具,但 XFS 版本具有更具体的功能,因此推荐这样做。

表 3.2. ext4 和 XFS 的通用工具

任务 ext4 XFS
Quota quota xfs_quota
文件映射 filefrag xfs_bmap
有关许多列出的 XFS 命令的详情请参考 第 3 章 XFS 文件系统。如需更多信息,您还可以查阅列出的 XFS 管理工具的手册页。

第 4 章 ext3 文件系统

ext3 文件系统基本上是一个 ext2 文件系统的改进版本。这些改进提供以下优点:
可用性
在意外的电源故障或系统崩溃(也称为 未清理的系统关闭)后,机器上每个挂载的 ext2 文件系统都必须通过 e2fsck 程序检查一致性。这是一个耗时的过程,可能会显著延迟系统引导时间,特别是对于包含大量文件的大量卷而言。在这段时间中,卷上的任何数据都不可访问。
可以在实时文件系统上运行 fsck -n。但是,如果遇到写入了部分元数据,它不会进行任何更改,并且可能会产生误导。
如果在堆栈中使用 LVM,另一个选项是生成文件系统的 LVM 快照,并在其上运行 fsck
最后,您可以选择以只读形式重新挂载文件系统。然后,在重新挂载前,所有待处理的元数据更新(及写入)都会强制到磁盘中。这样可确保文件系统处于一致状态,前提是之前没有损坏。现在,可以运行 fsck -n
ext3 文件系统提供的日志意味着,在未清理的系统关闭后,不再需要此类文件系统检查。使用 ext3 进行一致性检查的唯一时间是在某些罕见的硬件故障情形中,如硬盘驱动器故障。在未清理的系统关闭后恢复 ext3 文件系统的时间不取决于文件系统的大小或文件的数量,而是取决于用于保持一致性的 日志 的大小。默认日志大小大约需要一秒钟就能恢复,具体取决于硬件的速度。
注意
红帽支持的 ext3 中的唯一日志模式是 data=ordered (默认)。
数据完整性
ext3 文件系统防止发生未清理系统关闭时数据完整性的丢失。ext3 文件系统允许您选择数据接受的保护类型和级别。对于文件系统的状态,ext3 卷配置为默认保持高级别的数据一致性。
速度
尽管多次写入一些数据,但大多数情况下, ext3 的吞吐量高于 ext2,因为 ext3 的日志优化了硬盘驱动器磁头的移动。您可以从三种日志记录模式中进行选择来优化速度,但这样做意味着在系统出现故障时要权衡数据的完整性。
注意
红帽支持的 ext3 中的唯一日志模式是 data=ordered (默认)。
轻松迁移
可轻松从 ext2 迁移到 ext3,并获得强大的日志记录文件系统的优势,而无需重新格式化。有关执行此任务的详情,请参考 第 4.2 节 “转换为 ext3 文件系统”
注意
Red Hat Enterprise Linux 7 提供统一的 extN 驱动程序。它通过禁用 ext2 和 ext3 配置,而是对这些磁盘上的格式使用 ext4.ko。这意味着,无论使用的 ext 文件系统是什么,内核信息总是指 ext4。

4.1. 创建 ext3 文件系统

安装后,有时需要创建新的 ext3 文件系统。例如,如果系统中添加了新的磁盘驱动器,您可能需要对该驱动器进行分区,并使用 ext3 文件系统。
  1. 使用 mkfs.ext3 工具使用 ext3 文件系统格式化分区或 LVM 卷:
    # mkfs.ext3 block_device
    • 使用到块设备的路径替换 block_device。例如: /dev/sdb1,/dev/disk/by-uuid/05e99ec8-def1-4a5e-8a9d-5945339ceb2a, 或 /dev/my-volgroup/my-lv
  2. 使用 e2label 工具标记文件系统:
    # e2label block_device volume_label

配置 UUID

也可以为文件系统设置特定的 UUID。要在创建文件系统时指定 UUID,请使用 -U 选项:
# mkfs.ext3 -U UUID device
  • 使用您要设置的 UUID 替换 UUID:例如 7cd65de3-e0be-41d9-b66d-96d749c02da7
  • 使用 ext3 文件系统的路径替换 device,以将 UUID 添加到其中:例如 /dev/sda8
要更改现有文件系统的 UUID,请参阅 第 25.8.3.2 节 “修改持久性命名属性”

其它资源

  • mkfs.ext3(8) man page
  • e2label(8) man page

4.2. 转换为 ext3 文件系统

tune2fs 命令将 ext2 文件系统转换为 ext3
注意
要将 ext2 转换为 ext3,请始终使用 e2fsck 工具,在使用 tune2fs 之前和之后检查您的文件系统。在尝试将 ext2 转换为 ext3 之前,请备份所有文件系统,以防出现错误。
另外,红帽建议创建新的 ext3 文件系统并将数据迁移到其中,而不是尽可能从 ext2 转换到 ext3。
要将 ext2 文件系统转换为 ext3,以 root 身份登录并在终端中输入以下命令:
# tune2fs -j block_device
block_device 包含要转换的 ext2 文件系统。
发出 df 命令来显示挂载的文件系统。

4.3. 恢复回 Ext2 文件系统

要恢复回 ext2 文件系统,请使用以下流程:
为简单起见,本节中的示例命令对块设备使用以下值:
/dev/mapper/VolGroup00-LogVol02

过程 4.1. 从 ext3 恢复回 ext2

  1. 以 root 身份登录,并输入以下内容来卸载分区:
    # umount /dev/mapper/VolGroup00-LogVol02
  2. 输入以下命令将文件系统类型改为 ext2:
    # tune2fs -O ^has_journal /dev/mapper/VolGroup00-LogVol02
  3. 输入以下命令检查分区是否有错误:
    # e2fsck -y /dev/mapper/VolGroup00-LogVol02
  4. 然后,通过输入以下内容将该分区再次挂载为 ext2 文件系统:
    # mount -t ext2 /dev/mapper/VolGroup00-LogVol02 /mount/point
    使用分区的挂载点替换 /mount/point
    注意
    如果分区的根级别存在 .journal 文件,请将其删除。
要将分区永久更改为 ext2,请记住要更新 /etc/fstab 文件,否则它将在引导后恢复回来。

第 5 章 ext4 文件系统

ext4 文件系统是 ext3 文件系统的可扩展扩展。对于 Red Hat Enterprise Linux 7,它可以支持最大大小为 16 TB 的单个文件大小,文件系统可以最多支持 50 TB,而 Red Hat Enterprise Linux 6 只支持最多 16 TB 的文件系统。它还支持无限数量的子目录(ext3 文件系统最多支持 32,000 个),但是一旦链接数超过 65,000 个,它将重置回 1 ,并且不再增加。目前不支持 bigalloc 功能。
注意
与 ext3 一样,必须卸载 ext4 卷才能执行 fsck。如需更多信息,请参阅 第 4 章 ext3 文件系统
主要功能
ext4 文件系统使用扩展(与 ext2 和 ext3 使用的传统块映射方案相反),这提高了使用大型文件时的性能,并减少大型文件的元数据开销。此外,ext4 还相应地标记未分配的块组和 inode 表部分,这允许在文件系统检查期间跳过它们。这样可加快文件系统检查的速度,随着文件系统大小的增加,这将变得更加有益。
分配功能
ext4 文件系统具有以下分配方案:
  • 持久性预分配
  • 延迟分配
  • 多块分配
  • 条带感知分配
由于延迟分配和其他性能优化,ext4 向磁盘写文件的行为与 ext3 不同。在 ext4 中,当程序写入文件系统时,无法保证为磁盘上,除非程序随后发出 fsync () 调用。
默认情况下,ext3 会自动立即将新创建的文件强制到磁盘,即使没有 fsync ()。此行为隐藏了程序中的错误,这些程序不使用 fsync () 来确保写入的数据在磁盘上。另一方面,ext4 文件系统通常会等待几秒钟才能将更改写入磁盘,从而允许它合并并重新排序写操作,以获得比 ext3 更好的磁盘性能。
警告
与 ext3 不同,ext4 文件系统不会在事务提交时强制数据写到磁盘。因此,将缓冲的写入刷新到磁盘需要更长的时间。与任何文件系统一样,请使用 fsync () 等数据完整性调用来确保数据被写入持久性存储。
其他 ext4 功能
ext4 文件系统还支持以下内容:
  • 扩展属性 (xattr) - 这允许系统为每个文件关联几个额外的名称和值对。
  • 配额日志 - 这避免了崩溃后需要冗长的配额一致性检查。
    注意
    ext4 中唯一支持的日志模式是 data=ordered (默认)。
  • 亚秒时间戳 - 这向亚秒提供时间戳。

5.1. 创建 ext4 文件系统

  • 要创建 ext4 文件系统,请使用以下命令:
    # mkfs.ext4 block_device
    • 使用到块设备的路径替换 block_device。例如: /dev/sdb1,/dev/disk/by-uuid/05e99ec8-def1-4a5e-8a9d-5945339ceb2a, 或 /dev/my-volgroup/my-lv
    • 一般说来,默认选项适用于大多数使用场景。

例 5.1. mkfs.ext4 命令输出

以下是这个命令的输出示例,它显示了生成的文件系统的几何结构和特性:
~]# mkfs.ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
245280 inodes, 979456 blocks
48972 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1006632960
30 block groups
32768 blocks per group, 32768 fragments per group
8176 inodes per group
Superblock backups stored on blocks:
 32768, 98304, 163840, 229376, 294912, 819200, 884736

Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
重要
可以使用 tune2fs 在 ext3 文件系统上启用特定的 ext4 功能。但是,以这种方式使用 tune2fs 尚未经过充分测试,因此 Red Hat Enterprise Linux 7 不支持。因此,红帽不能保证使用 tune2fs 转换或挂载的 ext3 文件系统的一致性性能和可预测的行为。

条带块设备

对于条带块设备(如 RAID5 阵列),可以在创建文件系统时指定条带几何结构。使用正确的条带几何结构可大大提高 ext4 文件系统的性能。
在 LVM 或 MD 卷上创建文件系统时,mkfs.ext4 选择最佳的几何结构。在将几何结构信息导出到操作系统的某些硬件 RAID 中也是如此。
要指定条带几何结构,请使用 mkfs.ext4-E 选项(即扩展的文件系统选项),包含以下子选项:
stride=value
指定 RAID 块大小。
stripe-width=value
指定 RAID 设备中数据磁盘的数量,或者条带中条带单位的数量。
对于这两个子选项,必须在文件系统块单元中指定 value。例如,要在 4k 块文件系统上创建带有 64k (即 16 x 4096)的文件系统,请使用以下命令:
# mkfs.ext4 -E stride=16,stripe-width=64 /dev/block_device

配置 UUID

也可以为文件系统设置特定的 UUID。要在创建文件系统时指定 UUID,请使用 -U 选项:
# mkfs.ext4 -U UUID device
  • 使用您要设置的 UUID 替换 UUID:例如 7cd65de3-e0be-41d9-b66d-96d749c02da7
  • 使用 ext4 文件系统的路径替换 device,以将 UUID 添加到其中:例如 /dev/sda8
要更改现有文件系统的 UUID,请参阅 第 25.8.3.2 节 “修改持久性命名属性”

其它资源

有关创建 ext4 文件系统的详情,请参考:
  • mkfs.ext4(8) man page

5.2. 挂载 ext4 文件系统

无需额外选项就可挂载 ext4 文件系统。例如:
# mount /dev/device /mount/point
ext4 文件系统也支持几个挂载选项来影响行为。例如,acl 参数启用访问控制列表,而 user_xattr 参数则启用用户扩展属性。要启用这两个选项,请使用它们对应的参数与 -o,如下所示:
# mount -o acl,user_xattr /dev/device /mount/point
与 ext3 一样,如果文件数据出现错误,则可以使用 data_err=abort 选项来中止日志。
# mount -o data_err=abort /dev/device /mount/point
tune2fs 工具还允许管理员在文件系统超级块中设置默认挂载选项。有关这方面的更多信息,请参阅 man tune2fs

写屏障

默认情况下,ext4 使用写屏障来确保文件系统的完整性,即使启用了写缓存的设备断电了也是如此。对于没有写缓存的设备,或使用电池支持的写缓存的设备,使用 nobarrier 选项禁用障碍,如下所示:
# mount -o nobarrier /dev/device /mount/point
有关写屏障的详情,请参考 第 22 章 写屏障

直接访问技术预览

从 Red Hat Enterprise Linux 7.3 开始,Direct Access (DAX)提供,作为 ext4 和 XFS 文件系统上的一个技术预览,一个应用程序可以将持久内存直接映射到其地址空间中。要使用 DAX,系统必须有某种可用的持久内存,通常使用一个或多个非线内存模块(NVDIMM),且必须在 NVDIMM 上创建支持 DAX 的文件系统。另外,该文件系统必须使用 dax 挂载选项挂载。然后,在 dax 挂载的文件系统中的一个文件 mmap 会导致存储直接映射到应用程序的地址空间中。

5.3. 重新定义 ext4 文件系统大小

在增大 ext4 文件系统之前,请确保底层块设备的大小合适,以便能够存放之后的文件系统。为受影响的块设备使用合适的调整大小的方法。
使用 resize2fs 命令挂载时可能会增大 ext4 文件系统:
# resize2fs /mount/device size
resize2fs 命令还可缩小 卸载的 ext4 文件系统的大小:
# resize2fs /dev/device size
在重新定义 ext4 文件系统大小时,size 2fs 工具以文件系统块大小为单位读取大小,除非使用了表示特定单元的后缀。以下后缀表示特定的单位:
  • s - 512 字节扇区
  • K — kilobytes
  • M - MB
  • G — gigabytes
注意
扩展时 size 参数是可选的(通常是多余的)。resize2fs 会自动扩展以填充容器的所有可用空间,通常是逻辑卷或分区。
有关调整 ext4 文件系统大小的更多信息,请参阅 man resize2fs

5.4. 备份 ext2、ext3 或 ext4 文件系统

这个步骤描述了如何将 ext4、ext3 或 ext2 文件系统的内容备份到文件中。

先决条件

  • 如果系统运行了很长时间,请在备份前在分区上运行 e2fsck 工具:
    # e2fsck /dev/device

过程 5.1. 备份 ext2、ext3 或 ext4 文件系统

  1. 备份配置信息,包括 /etc/fstab 文件的内容和 fdisk -l 命令的输出。这对恢复分区非常有用。
    要捕获这些信息,请运行 sosreportsysreport 工具。有关 sosreport 的更多信息,请参阅 sosreport 是什么以及如何在 Red Hat Enterprise Linux 4.6 及之后的版本中创建?Kdowledgebase 文章。
  2. 根据分区的角色:
    • 如果您要备份的分区是一个操作系统分区,请将您的系统引导至救援模式。请参阅 系统管理员 指南中的引导到救援模式 部分
    • 备份常规的数据分区时,将其卸载。
      虽然可以在挂载数据时备份数据分区,但备份挂载数据分区的结果可能会无法预测。
      如果您需要使用 dump 实用程序备份挂载的文件系统,当文件系统没有负载过重时,这样做。备份时,文件系统上会出现更多的活动,备份损坏的风险越高。
  3. 使用 dump 程序备份分区的内容:
    # dump -0uf backup-file /dev/device
    使用您要存储备份的文件的路径替换 backup-file。使用您要备份的 ext4 分区的名称替换 device。确保您将备份保存到挂载在与您要备份分区不同的分区的目录中。

    例 5.2. 备份多个 ext4 分区

    要将 /dev/ sda1、/dev /sda2/dev/sda3 分区的内容备份到存储在 /backup-files/ 目录中的备份文件,请使用以下命令:
    # dump -0uf /backup-files/sda1.dump /dev/sda1
    # dump -0uf /backup-files/sda2.dump /dev/sda2
    # dump -0uf /backup-files/sda3.dump /dev/sda3
    要执行远程备份,请使用 ssh 实用程序或配置免密码 ssh 登录。有关 ssh 和无密码登录的更多信息,请参阅 系统管理员指南中的使用 ssh 实用程序 和使用基于密钥的身份验证部分https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html-single/system_administrators_guide/index#s2-ssh-configuration-keypairs
    例如,在使用 ssh 时:

    例 5.3. 使用 ssh执行远程备份

    # dump -0u -f - /dev/device | ssh root@remoteserver.example.com dd of=backup-file
    请注意,如果使用标准重定向,则必须单独传递 -f 选项。

其它资源

  • 如需更多信息,请参阅 dump(8) man page。

5.5. 恢复 ext2、ext3 或 ext4 文件系统

这个步骤描述了如何从文件备份中恢复 ext4、ext3 或 ext2 文件系统。

先决条件

过程 5.2. 恢复 ext2、ext3 或 ext4 文件系统

  1. 如果您要恢复操作系统分区,请将您的系统引导至救援模式。请参阅 系统管理员 指南中的引导到救援模式 部分
    普通数据分区不需要这一步。
  2. 使用 fdiskparted utilites 重建您要恢复的分区。
    如果分区不再存在,重新创建它们。新分区必须足够大以包含恢复的数据。正确获取开始和结束号非常重要;它们是在备份时从 fdisk 实用程序获取的分区的开始和结束扇区号。
    有关修改分区的详情,请参考 第 13 章 分区
  3. 使用 mkfs 工具格式化目标分区:
    # mkfs.ext4 /dev/device
    重要
    不要 格式化存储您的备份文件的分区。
  4. 如果您创建了新分区,请重新标记所有分区,以便它们与 /etc/fstab 文件中的条目匹配:
    # e2label /dev/device label
  5. 创建临时挂载点并在其上挂载分区:
    # mkdir /mnt/device
    # mount -t ext4 /dev/device /mnt/device
  6. 从挂载的分区上的备份中恢复数据:
    # cd /mnt/device
    # restore -rf device-backup-file
    如果要在远程机器上恢复或从保存在远程主机上的备份文件恢复,您可以使用 ssh 工具。有关 ssh 的更多信息,请参阅 系统管理员指南中的使用 ssh 实用程序 章节。
    请注意,您需要为以下命令配置免密码登录。有关设置免密码 ssh 登录的更多信息,请参阅 系统管理员 指南中的使用基于密钥的身份验证部分
    • 从存储在同一台机器上的备份文件恢复远程机器上的分区:
      # ssh remote-address "cd /mnt/device && cat backup-file | /usr/sbin/restore -r -f -"
    • 从存储在不同远程机器上的备份文件恢复远程机器上的分区:
      # ssh remote-machine-1 "cd /mnt/device && RSH=/usr/bin/ssh /usr/sbin/restore -rf remote-machine-2:backup-file"
  7. reboot:
    # systemctl reboot

例 5.4. 恢复多个 ext4 分区

要从 例 5.2 “备份多个 ext4 分区” 恢复 /dev/sda1、 /dev/sda2/dev/sda3 分区:
  1. 使用 fdisk 命令重建您要恢复的分区。
  2. 格式化目标分区:
    # mkfs.ext4 /dev/sda1
    # mkfs.ext4 /dev/sda2
    # mkfs.ext4 /dev/sda3
  3. 重新标记所有分区,以便它们与 /etc/fstab 文件匹配:
    # e2label /dev/sda1 Boot1
    # e2label /dev/sda2 Root
    # e2label /dev/sda3 Data
  4. 准备工作目录。
    挂载新分区:
    # mkdir /mnt/sda1
    # mount -t ext4 /dev/sda1 /mnt/sda1
    # mkdir /mnt/sda2
    # mount -t ext4 /dev/sda2 /mnt/sda2
    # mkdir /mnt/sda3
    # mount -t ext4 /dev/sda3 /mnt/sda3
    挂载包含备份文件的分区:
    # mkdir /backup-files
    # mount -t ext4 /dev/sda6 /backup-files
  5. 将数据从备份恢复到挂载的分区:
    # cd /mnt/sda1
    # restore -rf /backup-files/sda1.dump
    # cd /mnt/sda2
    # restore -rf /backup-files/sda2.dump
    # cd /mnt/sda3
    # restore -rf /backup-files/sda3.dump
  6. reboot:
    # systemctl reboot

其它资源

  • 如需更多信息,请参阅 restore(8) man page。

5.6. 其他 ext4 文件系统实用程序

Red Hat Enterprise Linux 7 还具有管理 ext4 文件系统的其他工具:
e2fsck
用于修复 ext4 文件系统.由于 ext4 磁盘结构的更新,此工具对 ext4 文件系统的检查和修复比对 ext3 更高效。
e2label
更改 ext4 文件系统上的标签。此工具也适用于 ext2 和 ext3 文件系统。
quota
控制并报告 ext4 文件系统上用户和组的磁盘空间(块)和文件(inode)的使用情况。有关使用 配额 的详情,请参考 man quota第 17.1 节 “配置磁盘配额”
fsfreeze
要暂停对文件系统的访问,请使用命令 # fsfreeze -f mount-point 来冻结它,而 # fsfreeze -u mount-point to unfreeze it。这会停止对文件系统的访问,并在磁盘上创建稳定的镜像。
注意
对于设备映射器驱动器,不需要使用 fsfreeze
如需更多信息,请参阅 fsfreeze (8) 手册页。
第 5.2 节 “挂载 ext4 文件系统” 中所示,tuned2fs 工具也可以调整 ext2、ext3 和 ext4 文件系统的可配置文件系统参数。另外,以下工具在调试和分析 ext4 文件系统时也很有用:
debugfs
调试 ext2、ext3 或 ext4 文件系统。
e2image
将重要的 ext2、ext3 或 ext4 文件系统元数据保存到文件中。
有关这些工具的详情,请参考其各自的 man page。

第 6 章 Btrfs(技术预览)

注意
Btrfs 在 Red Hat Enterprise Linux 7 中作为技术预览功能提供,但自 Red Hat Enterprise Linux 7.4 发行版本起已被弃用。它将在以后的 Red Hat Enterprise Linux 主发行版本中删除。
如需更多信息,请参阅 Red Hat Enterprise Linux 7.4 发行注记中的 已弃用的功能
btrfs 是下一代 Linux 文件系统,它提供了高级管理功能,具有可靠性和可扩展性功能。提供快照、压缩和集成设备管理方面是唯一的。

6.1. 创建 btrfs 文件系统

要制作基本的 btrfs 文件系统,请使用以下命令:
# mkfs.btrfs /dev/device
有关创建带有添加设备的 btrfs 文件系统以及为元数据和数据指定多设备配置集的详情,请参考 第 6.4 节 “多个设备的集成卷管理”

6.2. 挂载 btrfs 文件系统

要挂载 btrfs 文件系统中的任何设备,请使用以下命令:
# mount /dev/device /mount-point
其他有用的挂载选项包括:
device=/dev/name
在 mount 命令中附加这个选项会告知 btrfs 扫描指定设备的 btrfs 卷。这用于确保挂载成功,因为尝试挂载不是 btrfs 的设备将导致挂载失败。
注意
这并不意味着所有设备都会添加到文件系统中,它只扫描它们。
max_inline=number
使用此选项设置可用于元数据 B-tree leaf 中的内联数据的最大空间量(以字节为单位)。默认值为 8192 字节。对于 4k 页,它会被限制为 3900 字节,因为额外的标头需要容纳到 leaf。
alloc_start=number
使用这个选项设置磁盘分配开始的位置。
thread_pool=number
使用这个选项分配分配的 worker 线程数量。
discard
使用这个选项在空闲块中启用 discard/TRIM。
noacl
使用这个选项禁用 ACL 的使用。
space_cache
使用这个选项将可用空间数据存储在磁盘上,以便更快地缓存块组。这是一个持久的更改,可以安全地引导到旧内核。
nospace_cache
使用这个选项禁用上述 space_cache
clear_cache
使用这个选项清除挂载期间的所有可用空间缓存。这是一个安全的选项,但将触发要重新构建的空间缓存。因此,让文件系统保持挂载,以便重建过程完成。这个挂载选项旨在被使用一次,且仅在问题出现可用空间后才被使用。
enospc_debug
这个选项用于调试"无空格"的问题。
recovery
使用这个选项在挂载时启用自动恢复。

6.3. 调整 btrfs 文件系统的大小

无法调整 btrfs 文件系统的大小,但可以调整其使用的每个设备的大小。如果只使用一个设备,则它的工作方式与调整文件系统的大小相同。如果使用多个设备,则必须手动调整大小以达到所需结果。
注意
单元大小不具体,它接受 Gg 用于 GiB。
该命令不接受 t 代表 TB,或 p 代表 PB。它仅接受 kmg

放大 btrfs 文件系统

要在单个设备中增大文件系统,请使用以下命令:
# btrfs filesystem resize amount /mount-point
例如:
# btrfs filesystem resize +200M /btrfssingle
Resize '/btrfssingle' of '+200M'
要放大多设备文件系统,必须指定要放大的设备。首先,在指定挂载点显示具有 btrfs 文件系统的所有设备:
# btrfs filesystem show /mount-point
例如:
# btrfs filesystem show /btrfstest
Label: none  uuid: 755b41b7-7a20-4a24-abb3-45fdbed1ab39
	Total devices 4 FS bytes used 192.00KiB
	devid    1 size 1.00GiB used 224.75MiB path /dev/vdc
	devid    2 size 524.00MiB used 204.75MiB path /dev/vdd
	devid    3 size 1.00GiB used 8.00MiB path /dev/vde
	devid    4 size 1.00GiB used 8.00MiB path /dev/vdf

Btrfs v3.16.2
然后,在识别要放大设备的 devid 后,使用以下命令:
# btrfs filesystem resize devid:amount /mount-point
例如:
# btrfs filesystem resize 2:+200M /btrfstest
Resize '/btrfstest/' of '2:+200M'
注意
数量 也可以是 max 而不是指定的数量。这将使用该设备上的所有剩余可用空间。

缩小 btrfs 文件系统

要缩小单个设备上的文件系统,请使用以下命令:
# btrfs filesystem resize amount /mount-point
例如:
# btrfs filesystem resize -200M /btrfssingle
Resize '/btrfssingle' of '-200M'
要缩小多设备文件系统,必须指定 shrunk 设备。首先,在指定挂载点显示具有 btrfs 文件系统的所有设备:
# btrfs filesystem show /mount-point
例如:
# btrfs filesystem show /btrfstest
Label: none  uuid: 755b41b7-7a20-4a24-abb3-45fdbed1ab39
	Total devices 4 FS bytes used 192.00KiB
	devid    1 size 1.00GiB used 224.75MiB path /dev/vdc
	devid    2 size 524.00MiB used 204.75MiB path /dev/vdd
	devid    3 size 1.00GiB used 8.00MiB path /dev/vde
	devid    4 size 1.00GiB used 8.00MiB path /dev/vdf

Btrfs v3.16.2
然后,在识别要缩小的设备的 devid 后,使用以下命令:
# btrfs filesystem resize devid:amount /mount-point
例如:
# btrfs filesystem resize 2:-200M /btrfstest
Resize '/btrfstest' of '2:-200M'

设置文件系统大小

要将文件系统设置为单一设备上的特定大小,请使用以下命令:
# btrfs filesystem resize amount /mount-point
例如:
# btrfs filesystem resize 700M /btrfssingle
Resize '/btrfssingle' of '700M'
要设置多设备文件系统的文件系统大小,必须指定更改的设备。首先,在指定挂载点显示具有 btrfs 文件系统的所有设备:
# btrfs filesystem show /mount-point
例如:
# btrfs filesystem show /btrfstest
Label: none  uuid: 755b41b7-7a20-4a24-abb3-45fdbed1ab39
	Total devices 4 FS bytes used 192.00KiB
	devid    1 size 1.00GiB used 224.75MiB path /dev/vdc
	devid    2 size 724.00MiB used 204.75MiB path /dev/vdd
	devid    3 size 1.00GiB used 8.00MiB path /dev/vde
	devid    4 size 1.00GiB used 8.00MiB path /dev/vdf

Btrfs v3.16.2
然后,在识别要更改的设备的 devid 后,使用以下命令:
# btrfs filesystem resize devid:amount /mount-point
例如:
# btrfs filesystem resize 2:300M /btrfstest
Resize '/btrfstest' of '2:300M'

6.4. 多个设备的集成卷管理

可以在很多设备上创建 btrfs 文件系统,并在文件系统创建后添加更多设备。默认情况下,元数据将跨两个设备进行镜像,数据将在所有存在的设备之间进行条带化,但如果只有一个设备,则元数据将在该设备上重复。

6.4.1. 创建使用多个设备的文件系统

mkfs.btrfs 命令(如 第 6.1 节 “创建 btrfs 文件系统” 所述)接受 -d 用于数据的选项,以及用于元数据的 -m。有效规格包括:
  • raid0
  • raid1
  • raid10
  • dup
  • 单个
m single 选项指示没有重复元数据。使用硬件 raid 时可能需要这样做。
注意
RAID 10 需要至少四个设备才能正确运行。

例 6.1. 创建 RAID 10 btrfs 文件系统

在四个设备(元数据镜像、数据条带化)中创建文件系统。
# mkfs.btrfs /dev/device1 /dev/device2 /dev/device3 /dev/device4
在没有镜像的情况下条带化元数据。
# mkfs.btrfs -m raid0 /dev/device1 /dev/device2
raid10 用于数据和元数据。
# mkfs.btrfs -m raid10 -d raid10 /dev/device1 /dev/device2 /dev/device3 /dev/device4
不要在单一驱动器中重复元数据。
# mkfs.btrfs -m single /dev/device
当驱动器大小不同时,使用单个 选项来使用每个驱动器的完整容量。
# mkfs.btrfs -d single /dev/device1 /dev/device2 /dev/device3
要在已创建的多设备文件系统中添加新设备,请使用以下命令:
# btrfs device add /dev/device1 /mount-point
重新引导或重新加载 btrfs 模块后,使用 btrfs 设备扫描 命令来发现所有多设备文件系统。请参阅 第 6.4.2 节 “扫描 btrfs 设备” 了解更多信息。

6.4.2. 扫描 btrfs 设备

使用 btrfs 设备扫描来扫描 /dev 下的所有块设备,并探测 btrfs 卷。如果在文件系统中有多个设备运行时,则必须在载入 btrfs 模块后执行此操作。
要扫描所有设备,请使用以下命令:
# btrfs device scan
要扫描单个设备,请使用以下命令:
# btrfs device scan /dev/device

6.4.3. 在 btrfs 文件系统中添加新设备

使用 btrfs filesystem show 命令列出所有 btrfs 文件系统及其包含的设备。
btrfs device add 命令用于向挂载的文件系统添加新设备。
btrfs filesystem balance 命令在所有现有设备中平衡(条带)分配的扩展。
用于添加新设备的所有这些命令示例如下:

例 6.2. 在 btrfs 文件系统中添加新设备

首先,创建并挂载 btrfs 文件系统。有关如何创建 btrfs 文件系统的详情,请参考 第 6.1 节 “创建 btrfs 文件系统”,以及 第 6.2 节 “挂载 btrfs 文件系统” 以了解有关如何挂载 btrfs 文件系统的更多信息。
# mkfs.btrfs /dev/device1
# mount /dev/device1
接下来,在挂载的 btrfs 文件系统中添加第二个设备。
# btrfs device add /dev/device2 /mount-point
这些设备的元数据和数据仍然仅存储在 /dev/device1 中。现在,它必须平衡才能分散到所有设备上。
# btrfs filesystem balance /mount-point
平衡文件系统将花费一些时间,因为它会读取所有文件系统的数据和元数据,并在新设备中重写。

6.4.4. 转换 btrfs 文件系统

要将非raid 文件系统转换为 raid,请添加设备并运行更改块分配配置文件的均衡过滤器。

例 6.3. 转换 btrfs 文件系统

要将现有的单个设备系统(本例中为 /dev/sdb 1)转换为两个设备,raid1 系统以便防止单个磁盘失败,请使用以下命令:
# mount /dev/sdb1 /mnt
# btrfs device add /dev/sdc1 /mnt
# btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt
重要
如果元数据没有从单设备默认转换,它会保留为 DUP。这不能保证块的副本位于单独的设备上。如果没有转换数据,则它根本没有任何冗余副本。

6.4.5. 删除 btrfs 设备

使用 btrfs device delete 命令删除在线设备。它将使用的任何扩展重新分发到文件系统中的其他设备,以便安全地删除。

例 6.4. 删除 btrfs 文件系统上的设备

首先创建并挂载一些 btrfs 文件系统。
# mkfs.btrfs /dev/sdb /dev/sdc /dev/sdd /dev/sde
# mount /dev/sdb /mnt
向文件系统添加一些数据。
最后,删除所需的设备。
# btrfs device delete /dev/sdc /mnt

6.4.6. 在 btrfs 文件系统中替换失败的设备

第 6.4.5 节 “删除 btrfs 设备” 可用于删除提供超级块的失败设备仍然可以读取。但是,如果设备丢失或者超级块损坏,则文件系统需要以降级模式挂载:
# mkfs.btrfs -m raid1 /dev/sdb /dev/sdc /dev/sdd /dev/sde


  ssd is destroyed or removed, use -o degraded to force the mount
  to ignore missing devices


# mount -o degraded /dev/sdb /mnt


  'missing' is a special device name


# btrfs device delete missing /mnt
命令 btrfs 设备删除缺少的 设备会删除文件系统元数据所描述的第一个设备,但在挂载文件系统时不存在。
重要
无法低于特定 raid 布局所需的最小设备数量,即使缺少的设备。可能需要添加新设备才能删除失败的设备。
例如,对于带有两个设备的 raid1 布局,如果设备失败,则需要它:
  1. 以 degraded 模式挂载,
  2. 添加新设备,
  3. 和 删除缺少的设备。

6.4.7. 在 /etc/fstab中注册 btrfs 文件系统

如果您没有 initrd 或它没有执行 btrfs 设备扫描,则可以通过将文件系统中所有设备明确传递给 mount 命令来挂载多卷 btrfs 文件系统。

例 6.5. /etc/fstab 条目示例

一个合适的 /etc/fstab 条目示例为:
/dev/sdb    /mnt    btrfs    device=/dev/sdb,device=/dev/sdc,device=/dev/sdd,device=/dev/sde    0
请注意,使用通用唯一标识符(UUID)也可以正常工作,且比使用设备路径更稳定。

6.5. SSD 优化

使用 btrfs 文件系统可以优化 SSD。可以通过两种方式完成此操作。
第一种方法是 mkfs.btrfs,在单个设备上为 /sys/block/设备/queue/rotational 关闭元数据重复。这等同于在命令行中指定 -m single。它可以通过提供 -m dup 选项来覆盖和重复元数据。由于 SSD 固件可能会丢失两个副本,因此不需要重复。这种浪费空间是性能成本。
第二种方法是通过一组 SSD 挂载选项: ssdnossdssd_spread
ssd 选项执行几个操作:
  • 它允许更大的元数据集群分配。
  • 它尽可能顺序分配数据。
  • 它禁用 btree leaf rewting 来匹配密钥和块顺序。
  • 它在不批量多个进程的情况下提交日志片段。
注意
ssd 挂载选项只启用 ssd 选项。使用 nossd 选项禁用它。
在经常重复使用块号时,一些 SSD 会最好地执行,而其他 SSD 则最好地分配未使用的空间的大块。默认情况下,mount -o ssd 将找到块分组,其中有多个可用块可能已混合在其中。命令 mount -o ssd_spread 确保没有混合分配的块。这提高了较低 SSD 的性能。
注意
ssd_spread 选项同时启用 ssdssd_spread 选项。使用 nossd 禁用这两个选项。
如果提供了任何 ssd 选项且任何设备都不可能,则会自动设置 ssd_spread 选项。
这些选项都需要使用特定的构建进行测试,以查看它们的使用是否提高或降低性能,因为 SSD 固件和应用程序负载的组合都不同。

6.6. Btrfs 参考

man page btrfs (8) 涵盖了所有重要的管理命令。特别是,这包括:
  • 用于管理快照的所有子卷命令。
  • 用于管理 设备 的设备命令。
  • 清理平衡、平衡碎片整理 命令。
man page mkfs.btrfs (8) 包含有关创建 btrfs 文件系统的信息,包括有关它的所有选项。
man page btrfsck (8) 以了解有关 btrfs 系统上 fsck 的信息。

第 7 章 全局文件系统 2

Red Hat Global File System 2 (GFS2)是一个原生文件系统,直接与 Linux 内核文件系统接口(VFS 层)连接。当作为集群文件系统实现时,GFS2 会使用分布式元数据和多个日志。
GFS2 基于 64 位构架,理论上可以容纳 8 EB 的文件系统。但是,当前支持的 GFS2 文件系统的最大值为 100 TB。如果系统需要大于 100 TB 的 GFS2 文件系统,请联络您的红帽服务代表。
在决定文件系统大小时,请考虑其恢复需求。在非常大的文件系统上运行 fsck 命令可能需要很长时间,并且消耗大量内存。此外,当磁盘或磁盘子系统发生故障时,恢复时间会受到备份介质速度的限制。
在 Red Hat Cluster Suite 中配置时,可以使用 Red Hat Cluster Suite 配置和管理工具配置和管理 Red Hat GFS2 节点。然后,Red Hat GFS2 在 GFS2 节点间提供数据共享,并在 GFS2 节点上提供文件系统命名空间的单一一致视图。这允许不同节点上的进程共享 GFS2 文件,这与同一节点上的进程可以共享本地文件系统上的文件一样,没有明显差异。有关 Red Hat Cluster Suite 的详情,请参考红帽 的集群管理指南
GFS2 必须构建在逻辑卷(使用 LVM 创建)上,该逻辑卷是线性卷或镜像卷。在红帽群集套件中使用 LVM 创建的逻辑卷通过 CLVM (LVM 的群集范围实现)进行管理,由 CLVM 守护进程 clvmd 启用,并在 Red Hat Cluster Suite 集群中运行。守护进程允许使用 LVM2 管理集群中的逻辑卷,允许集群中的所有节点共享逻辑卷。有关逻辑卷管理器的详情,请参考红帽 逻辑卷管理器管理指南
gfs2.ko 内核模块实现 GFS2 文件系统,并加载在 GFS2 集群节点上。
有关在集群和非集群存储中创建和配置 GFS2 文件系统的综合信息,请参阅红帽的 全局文件系统 2 指南。

第 8 章 网络文件系统 (NFS)

网络文件系统(NFS)允许远程主机通过网络挂载文件系统,并像它们是本地挂载的文件系统一样与它们进行交互。这使系统管理员能够将资源整合到网络上的集中式服务器上。
本章重点介绍了基本的 NFS 概念和补充信息。

8.1. NFS 简介

目前,Red Hat Enterprise Linux 中包括了两个 NFS 主版本:
  • NFS 版本 3 (NFSv3)支持安全异步写入,并在处理错误时比之前的 NFSv2 更强大。它还支持 64 位文件大小和偏移量,允许客户端访问超过 2 GB 的文件数据。
  • NFS 版本 4 (NFSv4)通过防火墙,并在 Internet 上工作,不再需要 rpcbind 服务,支持 ACL,并且使用有状态操作。
自 Red Hat Enterprise Linux 7.4 发布以来,Red Hat Enterprise Linux 完全支持 NFS 版本 4.2 (NFSv4.2)。
以下是 Red Hat Enterprise Linux 中的 NFSv4.2 的功能:
  • 稀疏文件 :它验证文件的空间效率,并允许占位符提高存储效率。它是具有一个或多个漏洞的文件;漏洞是未分配的或未初始化的数据块,仅包含零。lseek() NFSv4.2 中的操作支持 seek_hole()seek_data(),它允许应用程序在稀疏文件中映射漏洞的位置。
  • 空间保留:它允许存储服务器保留空闲空间,从而禁止服务器耗尽空间。NFSv4.2 支持 allocate() 操作来保留空间、deallocate() 操作,以及 fallocate() 操作来预分配或取消分配文件中的空间。
  • 标记的 NFS:它会强制实施数据访问权限,并为 NFS 文件系统上的单个文件在客户端和服务器之间启用 SELinux 标签。
  • 布局增强:NFSv4.2 提供新的操作 layoutstats(),客户端可以使用它来通知元数据服务器有关其与布局的通信。
7.4 之前的 Red Hat Enterprise Linux 版本支持到版本 4.1 的 NFS。
以下是 NFSv4.1 的功能:
  • 提高了网络的性能和安全性,还包括对并行 NFS (pNFS)的客户端支持。
  • 对于回调不再需要单独的 TCP 连接,这允许 NFS 服务器授予委托,即使它无法联系客户端。例如,当 NAT 或防火墙干扰时。
  • 它只提供一次语义(除重启操作外),防止之前的问题,当回复丢失并且操作被发送两次时,某些操作可能会返回不准确的结果。
NFS 客户端默认尝试使用 NFSv4.1 挂载,并在服务器不支持 NFSv4.1 时回退到 NFSv4.0。当服务器不支持 NFSv4.0 时,挂载将回退到 NFSv3。
注意
红帽不再支持 NFS 版本 2(NFSv2)。
所有版本的 NFS 都可以使用运行在 IP 网络上的 传输控制协议 (TCP),NFSv4 需要此协议。NFSv3 可以使用在 IP 网络上运行的 用户数据报协议 (UDP)在客户端和服务器之间提供无状态网络连接。
将 NFSv3 与 UDP 一起使用时,无状态 UDP 连接(在正常情况下)协议的开销比 TCP 少。这可在非常干净、无拥塞的网络上转化为更佳的性能。但是,由于 UDP 是无状态的,因此如果服务器意外停机,UDP 客户端将继续向网络发送对服务器的请求。此外,当使用 UDP 丢失帧时,必须重新传输整个 RPC 请求;使用 TCP 时,仅需要重新传输丢失的帧。因此,当连接 NFS 服务器时,TCP 是首选的协议。
挂载和锁定协议已合并到 NFSv4 协议中。该服务器还会监听已知的 TCP 端口 2049。因此,NFSv4 不需要与 rpcbind交互 [1]lockdrpc.statd 守护进程。NFS 服务器上仍然需要 rpc.mountd 守护进程来设置导出,但不涉及任何在线操作。
注意
TCP 是 Red Hat Enterprise Linux 下 NFS 版本 3 的默认传输协议。UDP 可以根据需要用于兼容性目的,但不建议广泛使用。NFSv4 需要 TCP。
所有 RPC/NFS 守护进程都有一个 '-p' 命令行选项,可以设置端口,使防火墙配置更容易。
在 TCP 包装程序授予对客户端的访问权限后,NFS 服务器指的是 /etc/exports 配置文件,以确定是否允许客户端访问任何导出的文件系统。一旦被验证,所有文件和目录操作都对用户有效。
重要
为了使 NFS 使用启用了防火墙的默认 Red Hat Enterprise Linux 安装,请使用默认 TCP 端口 2049 配置 IPTables。如果没有合适的 IPTables 配置,NFS 无法正常工作。
NFS 初始化脚本和 rpc.nfsd 进程现在允许在系统启动期间绑定到任何指定的端口。但是,如果端口不可用,或者与其他守护进程有冲突,这可能会出错。

8.1.1. 所需的服务

Red Hat Enterprise Linux 使用内核级支持和守护进程的组合来提供 NFS 文件共享。所有 NFS 版本都依赖于客户端和服务器之间的 远程过程调用 (RPC)。Red Hat Enterprise Linux 7 中的 RPC 服务由 rpcbind 服务控制。要共享或者挂载 NFS 文件系统,下列服务根据所使用的 NFS 版本而定:
注意
portmap 服务用于将 RPC 程序号映射到早期版本的 Red Hat Enterprise Linux 中的 IP 地址端口号。现在,在 Red Hat Enterprise Linux 7 中,该服务被 rpcbind 替代来启用 IPv6 支持。
nfs
systemctl start nfs 启动 NFS 服务器,以及为共享 NFS 文件系统请求提供服务的适当 RPC 进程。
nfslock
systemctl start nfs-lock 激活一个强制服务,该服务启动适当的 RPC 进程,允许 NFS 客户端锁定服务器上的文件。
rpcbind
rpcbind 接受本地 RPC 服务的端口保留。这些端口随后可用(或发布),以便相应的远程 RPC 服务可以访问它们。rpcbind 响应对 RPC 服务的请求,并设置到请求的 RPC 服务的连接。这不能与 NFSv4 一起使用。
以下 RPC 进程有助于 NFS 服务:
rpc.mountd
NFS 服务器使用这个进程来处理来自 NFSv3 客户端的 MOUNT 请求。它检查所请求的 NFS 共享是否目前由 NFS 服务器导出,并且允许客户端访问它。如果允许挂载请求,rpc.mountd 服务器会以 Success 状态回复,并将这个 NFS 共享的文件处理返回给 NFS 客户端。
rpc.nfsd
rpc.nfsd 允许定义服务器公告的显式 NFS 版本和协议。它与 Linux 内核配合使用,以满足 NFS 客户端的动态需求,例如在每次 NFS 客户端连接时提供服务器线程。这个进程对应于 nfs 服务。
lockd
lockd 是一个在客户端和服务器上运行的内核线程。它实现了 网络锁定管理器 (NLM)协议,它允许 NFSv3 客户端锁定服务器上的文件。每当运行 NFS 服务器以及挂载 NFS 文件系统时,它会自动启动。
rpc.statd
这个进程实现 网络状态监控器 (NSM)RPC 协议,该协议在 NFS 服务器没有正常关闭而重新启动时,通知 NFS 客户端。RPC.statdnfslock 服务自动启动,不需要用户配置。这不能与 NFSv4 一起使用。
rpc.rquotad
这个过程为远程用户提供用户配额信息。RPC.rquotadnfs 服务自动启动,不需要用户配置。
rpc.idmapd
rpc.idmapd 提供 NFSv4 客户端和服务器上调用,这些调用在线 NFSv4 名称(以 user@domain形式的字符串)和本地 UID 和 GID 之间进行映射。要使 idmapd 与 NFSv4 正常工作,必须配置 /etc/idmapd.conf 文件。至少应指定"Domain"参数,该参数定义 NFSv4 映射域。如果 NFSv4 映射域与 DNS 域名相同,可以跳过这个参数。客户端和服务器必须同意 NFSv4 映射域才能使 ID 映射正常工作。
注意
在 Red Hat Enterprise Linux 7 中,只有 NFSv4 服务器使用 rpc.idmapd。NFSv4 客户端使用基于密钥环的 idmapper nfsidmapnfsidmap 是一个独立程序,由内核按需调用来执行 ID 映射;它不是一个守护进程。如果 nfsidmap 出现问题,客户端会回退到使用 rpc.idmapd。有关 nfsidmap 的更多信息,请参阅 nfsidmap 手册页。

8.2. 配置 NFS 客户端

mount 命令在客户端上挂载 NFS 共享。其格式如下:
# mount -t nfs -o options server:/remote/export /local/directory
这个命令使用以下变量:
options
以逗号分隔的挂载选项列表 ; 有关有效 NFS 挂载选项的详情,请参考 第 8.4 节 “常用 NFS 挂载选项”
server
导出您要挂载的文件系统的服务器的主机名、IP 地址或完全限定域名
/remote/export
server 导出的文件系统或目录,即您要挂载的目录
/local/directory
挂载 /remote/export 的客户端位置
Red Hat Enterprise Linux 7 中使用的 NFS 协议版本由 挂载选项 nfsversvers 标识。默认情况下,mount 使用带有 mount -t nfs 的 NFSv4。如果服务器不支持 NFSv4,客户端会自动缩减到服务器支持的版本。如果使用 nfsvers/vers 选项传递服务器不支持的特定版本,挂载会失败。文件系统类型 nfs4 也可用于旧原因;这等同于运行 mount -t nfs -o nfsvers=4 host:/remote/export /local/directory
如需更多信息,请参阅 man mount
如果 NFS 共享是手动挂载的 ,则重新引导后不会自动挂载共享。Red Hat Enterprise Linux 提供了两种方法来在引导时自动挂载远程文件系统: /etc/fstab 文件和 autofs 服务。如需更多信息,请参阅 第 8.2.1 节 “使用 /etc/fstab挂载 NFS 文件系统”第 8.3 节 “autofs

8.2.1. 使用 /etc/fstab挂载 NFS 文件系统

从另一台计算机挂载 NFS 共享的另一个方法是向 /etc/fstab 文件中添加一行。行必须指定 NFS 服务器的主机名、要导出的服务器上的目录,以及 NFS 共享要挂载在本地计算机上的目录。您必须是 root 用户才能修改 /etc/fstab 文件。

例 8.1. 语法示例

/etc/fstab 中行的一般语法如下:
server:/usr/local/pub    /pub   nfs    defaults 0 0
在执行此命令之前,客户端计算机上必须存在挂载点 /pub。将这一行添加到客户端系统上的 /etc/fstab 后,使用命令 mount /pub,挂载点 /pub 是从服务器挂载的。
挂载 NFS 导出的有效 /etc/fstab 条目应包含以下信息:
server:/remote/export /local/directory nfs options 0 0
变量 server/remote/export/local/directoryoptions 与手动挂载 NFS 共享时所用的一样。如需更多信息,请参阅 第 8.2 节 “配置 NFS 客户端”
注意
在读取 /etc/fstab 之前,客户端上必须存在挂载点 /local/directory。否则,挂载会失败。
编辑 /etc/fstab 后,重新生成挂载单元,以便您的系统注册新配置:
# systemctl daemon-reload

其它资源

  • 有关 /etc/fstab 的详情,请参考 man fstab

8.3. autofs

使用 /etc/fstab 的一个缺点是,无论用户如何经常访问 NFS 挂载的文件系统,系统都必须指定资源来保持挂载的文件系统。对于一个或两个挂载没有问题,但当系统一次维护多个系统的挂载时,整体的系统性能可能会受到影响。/etc/fstab 的替代方法是使用基于内核的 automount 工具。自动挂载程序由两个组件组成:
  • 实现文件系统的内核模块,以及
  • 执行所有其他功能的用户空间守护进程。
automount 工具可以自动挂载和卸载 NFS 文件系统(按需挂载),从而节省了系统资源。它可用于挂载其他文件系统,包括 AFS、SMBFS、CIFS、CIFS 和本地文件系统。
重要
nfs-utils 软件包现在是"NFS 文件服务器"和"网络文件系统客户端"组的一部分。因此,默认情况下,它不再与 Base 组一起安装。尝试自动挂载 NFS 共享之前,请先确保系统上已安装 nfs-utils。
autofs 也是"网络文件系统客户端"组的一部分。
autofs 使用 /etc/auto.master (主映射)作为其默认主配置文件。可以使用 autofs 配置(在 /etc/sysconfig/autofs中)与名称服务交换机(NSS)机制结合使用其他支持的网络源和名称。为主映射中配置的每个挂载点运行一个 autofs 版本 4 守护进程的实例,因此可以在命令行中针对任何给定挂载点手动运行。autofs 版本 5 无法实现,因为它使用单个守护进程来管理所有配置的挂载点;因此,必须在主映射中配置所有自动挂载。这符合其他行业标准自动挂载程序的常规要求。挂载点、主机名、导出的目录和选项都可以在一组文件(或其他支持的网络源)中指定,而不必为每个主机手动配置它们。

8.3.1. 相对于版本 4 , autofs 版本 5 的改进

autofs 版本 5 与版本 4 相比有以下改进:
直接映射支持
autofs 中的直接映射提供了一种在文件系统层次结构中的任意点自动挂载文件系统的机制。直接映射由主映射中的挂载点 /- 表示。直接映射中的条目包含一个作为键的绝对路径名称(而不是间接映射中使用的相对路径名称)。
Lazy 挂载和卸载支持
多挂载映射条目描述了单个键下的挂载点层次结构。一个很好的例子是 -hosts 映射,通常用于将主机 /net/主机中 的所有导出自动挂载为多挂载映射条目。使用 -hosts 映射时,/net/主机的 ls 将为每个来自 主机 的导出挂载 autofs 触发器挂载。然后,它们将在被访问时进行挂载并使其过期。这可大幅减少访问具有大量导出的服务器时所需的活动挂载数量。
增强的 LDAP 支持
autofs 配置文件(/etc/sysconfig/autofs)提供了一种机制来指定站点实施的 autofs 模式,从而防止在应用程序本身中通过试用和错误来确定这一点。此外,现在支持对 LDAP 服务器进行身份验证的绑定,使用常见 LDAP 服务器实现支持的大多数机制。为此支持添加了一个新的配置文件: /etc/autofs_ldap_auth.conf。默认的配置文件是自文档文件,使用 XML 格式。
正确使用名称服务切换(nsswitch)配置。
名称服务切换配置文件的存在是为了提供一种方法来确定特定的配置数据来自哪里。这种配置的原因是让管理员可以灵活地使用选择的后端数据库,同时维护统一的软件接口来访问数据。尽管在处理 NSS 配置时,版本 4 自动挂载程序变得越来越好,但它仍然不完整。另一方面,autofs 版本 5 是一个完整的实现。
有关此文件支持的语法的更多信息,请参阅 man nsswitch.conf。并非所有 NSS 数据库都是有效的映射源,解析器将拒绝无效的映射源。有效的源是 file, yp,nis,nisplus,ldap, 和 hesiod
每个 autofs 挂载点都有多个主映射条目
经常使用但还没有提及的一件事是处理直接挂载点 /- 的多个主映射条目。每个条目的映射键被合并,并表现为一个映射的形式。

例 8.2. 每个 autofs 挂载点都有多个主映射条目

以下是直接挂载的 connectathon 测试映射中的示例:
/- /tmp/auto_dcthon
/- /tmp/auto_test3_direct
/- /tmp/auto_test4_direct
 

8.3.2. 配置 autofs

自动挂载程序的主要配置文件是 /etc/auto.master,也称为主映射,如 第 8.3.1 节 “相对于版本 4 , autofs 版本 5 的改进” 所述。主映射列出了系统上 autofs- 控制的挂载点,以及它们相应的配置文件或网络来源,称为自动挂载映射。master 映射的格式如下:
mount-point map-name options
使用这种格式的变量有:
mount-point
例如,autofs 挂载点 /home
map-name
包含挂载点列表的映射源的名称,以及挂载这些挂载点的文件系统的位置。
options
如果提供,它们适用于给定映射中的所有条目,只要它们本身没有指定选项。这个行为与 autofs 版本 4 不同,其中选项是累积的。这已被修改来实现混合环境兼容性。

例 8.3. /etc/auto.master 文件

以下是来自 /etc/auto.master 文件的示例行(使用 cat /etc/auto.master显示):
/home /etc/auto.misc
映射的常规格式与主映射类似,但"选项"会出现在挂载点和位置之间,而不是在主映射中的条目末尾:
mount-point   [options]   location
使用这种格式的变量有:
mount-point
这指的是 autofs 挂载点。这可以是间接挂载的单个目录名称,也可以是直接挂载的挂载点的完整路径。每个直接和间接映射条目键(挂载点)后面可以跟一个以空格分隔的偏移目录列表(每个以 /开头的子目录名称)使其称为多挂载条目。
options
每当提供时,这些都是未指定其自身选项的映射条目的挂载选项。
位置
这指的是文件系统位置,如本地文件系统路径(对于以 /开头的映射名称,前面带有 Sun 映射格式转义字符":")、NFS 文件系统或其他有效的文件系统位置。
以下是映射文件(例如 /etc/auto.misc)中的内容示例:
payroll -fstype=nfs personnel:/dev/hda3
sales -fstype=ext3 :/dev/hda4
映射文件中的第一列指示 autofs 挂载点(来自名为 personnel 的服务器的sales payroll )。第二列显示 autofs 挂载的选项,第三列则指示挂载的来源。在给定配置后,autofs 挂载点将是 /home/payroll/home/sales。通常省略 -fstype= 选项,通常不需要正确的操作。
如果目录不存在,自动挂载程序会创建它们。如果在自动挂载程序启动之前目录已存在,则自动挂载程序在退出时不会删除它们。
要启动自动挂载守护进程,请使用以下命令:
# systemctl start autofs
要重启自动挂载守护进程,请使用以下命令:
# systemctl restart autofs
使用给定配置时,如果进程需要访问 autofs 卸载的目录,如 /home/payroll/2006/July.sxc,则自动挂载守护进程会自动挂载该目录。如果指定了超时,则如果在超时时间内没有访问该目录,则目录会被自动卸载。
要查看自动挂载守护进程的状态,请使用以下命令:
# systemctl status autofs

8.3.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/&
  • 文件映射 /etc/auto.home 不存在。
鉴于这些条件,我们假设客户端系统需要覆盖 NIS 映射 auto.home 并从其他服务器挂载主目录。在这种情况下,客户端需要使用以下 /etc/auto.master 映射:
/home ­/etc/auto.home
+auto.master
/etc/auto.home 映射包含条目:
*    labserver.example.com:/export/home/&
由于自动挂载程序仅处理第一次出现的挂载点,/home 包含 /etc/auto.home 的内容,而不是 NIS auto.home 映射。
另外,要仅使用几个条目来增加站点范围的 auto.home 映射,请创建一个 /etc/auto.home 文件映射,并在其中放置新条目。在结尾处,包含 NIS auto.home 映射。然后 /etc/auto.home 文件映射类似:
mydir someserver:/export/mydir
+auto.home
使用这些 NIS auto.home 映射条件时,ls /home 命令输出:
beth joe mydir
最后一个示例按预期工作,因为 autofs 不包含与正在读取的文件映射同名的文件映射的内容。因此,autofs 转到 nsswitch 配置中的下一个映射源。

8.3.4. 使用 LDAP 来存储自动挂载程序映射

必须在所有配置的系统中安装 LDAP 客户端程序库,以便从 LDAP 检索自动挂载程序映射。在 Red Hat Enterprise Linux 上,openldap 软件包应作为 自动挂载程序 的依赖项自动安装。要配置 LDAP 访问,请修改 /etc/openldap/ldap.conf。确保为您的站点正确设置了 BASE、URI 和 模式。
rfc2307bis 描述了在 LDAP 中存储自动挂载映射的最新建立的模式。要使用此模式,必须通过从架构定义中删除注释字符,在 autofs 配置(/etc/sysconfig/autofs)中设置它。例如:

例 8.4. 设置 autofs 配置

DEFAULT_MAP_OBJECT_CLASS="automountMap"
DEFAULT_ENTRY_OBJECT_CLASS="automount"
DEFAULT_MAP_ATTRIBUTE="automountMapName"
DEFAULT_ENTRY_ATTRIBUTE="automountKey"
DEFAULT_VALUE_ATTRIBUTE="automountInformation"
确保它们是唯一在配置中未注释的模式条目。automountKey 替换 rfc2307bis 模式中的 cn 属性。以下是 LDAP 数据交换格式(LDIF)配置示例:

例 8.5. LDF 配置

# extended LDIF
#
# LDAPv3
# base <> with scope subtree
# filter: (&(objectclass=automountMap)(automountMapName=auto.master))
# requesting: ALL
#

# auto.master, example.com
dn: automountMapName=auto.master,dc=example,dc=com
objectClass: top
objectClass: automountMap
automountMapName: auto.master

# extended LDIF
#
# LDAPv3
# base <automountMapName=auto.master,dc=example,dc=com> with scope subtree
# filter: (objectclass=automount)
# requesting: ALL
#

# /home, auto.master, example.com
dn: automountMapName=auto.master,dc=example,dc=com
objectClass: automount
cn: /home

automountKey: /home
automountInformation: auto.home

# extended LDIF
#
# LDAPv3
# base <> with scope subtree
# filter: (&(objectclass=automountMap)(automountMapName=auto.home))
# requesting: ALL
#

# auto.home, example.com
dn: automountMapName=auto.home,dc=example,dc=com
objectClass: automountMap
automountMapName: auto.home

# extended LDIF
#
# LDAPv3
# base <automountMapName=auto.home,dc=example,dc=com> with scope subtree
# filter: (objectclass=automount)
# requesting: ALL
#

# 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/&

8.4. 常用 NFS 挂载选项

除了在远程主机上使用 NFS 挂载文件系统外,也可以在挂载时指定其他选项,使挂载的共享更易于使用。这些选项可用于 手动挂载 命令、/etc/fstab 设置和 autofs
以下是 NFS 挂载常用的选项:
lookupcache=mode
指定内核应该如何管理给定挂载点的目录条目缓存。模式 的有效参数为 allnonepos/positive
nfsvers=version
指定要使用的 NFS 协议版本,其中 version 为 3 或 4。这对于运行多个 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=num 和 wsize=num
这些选项设定在单个 NFS 读取或写入操作中传输的最大字节数。
rsizewsize 没有固定的默认值。默认情况下,NFS 使用服务器和客户端都支持的最大的可能值。在 Red Hat Enterprise Linux 7 中,客户端和服务器的最大值为 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 协议。
udp
指示 NFS 挂载使用 UDP 协议。
如需更多信息,请参阅 man mountman nfs

8.5. 启动和停止 NFS 服务器

先决条件

  • 对于支持 NFSv2 或 NFSv3 连接的服务器,rpcbind[1] 服务必须正在运行。要验证 rpcbind 是否处于活动状态,请使用以下命令:
    $ systemctl status rpcbind
    要配置只使用 NFSv4 的服务器,它不需要 rpcbind,请参阅 第 8.6.7 节 “配置只使用 NFSv4 的服务器”
  • 在 Red Hat Enterprise Linux 7.0 中,如果您的 NFS 服务器导出 NFSv3 并在引导时启用,则需要手动启动并启用 nfs-lock 服务:
    # systemctl start nfs-lock
    # systemctl enable nfs-lock
    在 Red Hat Enterprise Linux 7.1 及更高版本中,如果需要,nfs-lock 会自动启动,并尝试手动启用它。

流程

  • 要启动 NFS 服务器,请使用以下命令:
    # systemctl start nfs
  • 要使 NFS 在引导时启动,请使用以下命令:
    # systemctl enable nfs
  • 要停止服务器,请使用:
    # systemctl stop nfs
  • restart 选项是停止然后启动 NFS 的简写方式。这是编辑 NFS 配置文件后使配置更改生效的最有效方式。要重启服务器的类型:
    # systemctl restart nfs
  • 编辑 /etc/sysconfig/nfs 文件后,运行以下命令来重启 nfs-config 服务,使新值生效:
    # systemctl restart nfs-config
  • try-restart 命令仅在当前正在运行时启动 nfs。此命令等同于 Red Hat init 脚本中的 condrestart (有条件重启)非常有用,因为它不会在 NFS 未运行时启动守护进程。
    要有条件地重启服务器,请输入:
    # systemctl try-restart nfs
  • 要在不重启服务类型的情况下重新载入 NFS 服务器配置文件:
    # systemctl reload nfs

8.6. 配置 NFS 服务器

在 NFS 服务器中配置导出的方法有两种:
  • 手动编辑 NFS 配置文件,即 /etc/exports,以及
  • 通过命令行,即使用 exportfs命令

8.6.1. /etc/exports 配置文件

/etc/exports 文件控制哪些文件系统被导出到远程主机,并指定选项。它遵循以下语法规则:
  • 空白行将被忽略。
  • 要添加注释,以井号(#)开始一行。
  • 您可以使用反斜杠(\)换行长行。
  • 每个导出的文件系统都应该独立。
  • 所有在导出的文件系统后放置的授权主机列表都必须用空格分开。
  • 每个主机的选项必须在主机标识符后直接放在括号中,没有空格分离主机和第一个括号。
导出的文件系统的每个条目都有以下结构:
export host(options)
上述结构使用以下变量:
export
导出的目录
host
导出要共享的主机或网络
options
用于 host 的选项
可以指定多个主机,以及每个主机的特定选项。要做到这一点,将它们列在与用空格分隔的列表相同的行中,每个主机名后跟其各自的选项(在括号中),如下所示:
export host1(options1) host2(options2) host3(options3)
有关指定主机名的不同方法的详情,请参考 第 8.6.5 节 “主机名格式”
在最简单的形式中,/etc/exports 文件只指定导出的目录和允许访问它的主机,如下例所示:

例 8.6. /etc/exports 文件

/exported/directory bob.example.com
在这里,bob.example.com 可以从 NFS 服务器挂载 /exported/directory/。因为在这个示例中没有指定选项,所以 NFS 将 使用默认设置
默认设置为:
ro
导出的文件系统是只读的。远程主机无法更改文件系统中共享的数据。要允许主机更改文件系统(即读写),请指定 rw 选项。
同步
在将之前的请求所做的更改写入磁盘前,NFS 服务器不会回复请求。要启用异步写入,请指定 async 选项。
wdelay
如果 NFS 服务器预期另外一个写入请求即将发生,则 NFS 服务器会延迟写入磁盘。这可以提高性能,因为它可减少不同的写命令访问磁盘的次数,从而减少写开销。要禁用此功能,请指定 no_wdelay。只有指定了默认的 sync 选项时,no_wdelay 才可用。
root_squash
这可防止远程连接的 root 用户(而不是本地)具有 root 权限;相反,NFS 服务器会为他们分配用户 ID nfsnobody这可以有效地将远程 root 用户的权限"挤压"成最低的本地用户,从而防止在远程服务器上可能的未经授权的写操作。要禁用 root 压缩,请指定 no_root_squash
要对所有远程用户(包括 root 用户)进行压缩,请使用 all_squash :要指定 NFS 服务器应该分配给来自特定主机的远程用户的用户 ID 和组 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/ 读写,对磁盘的所有写入都是异步的。有关导出选项的更多信息,请参阅 man exportfs
其他选项在未指定默认值的情况下可用。这包括禁用子树检查、允许来自不安全端口的访问以及允许不安全的文件锁(对于某些早期 NFS 客户端实现是必需的)。有关这些较少使用的选项的更多信息,请参阅 man 导出
重要
/etc/exports 文件的格式要求非常精确,特别是在空格字符的使用方面。需要将导出的文件系统与主机、不同主机间使用空格分隔。但是,除了注释行外,文件中不应该包括其他空格。
例如,下面两行并不具有相同的意义:
/home bob.example.com(rw)
/home bob.example.com (rw)
第一行只允许 bob.example.com 中的用户对 /home 目录进行读写访问。第二行允许来自 bob.example.com 的用户以只读方式挂载目录(默认),而其他用户可以将其挂载为读/写。

8.6.2. exportfs 命令

使用 NFS 将每个文件系统导出到远程用户,以及这些文件系统的访问级别,均列在 /etc/exports 文件中。当 nfs 服务启动时,/usr/sbin/exportfs 命令启动并读取此文件,将控制传递给实际挂载进程的 rpc.mountd (如果 NFSv3),然后传给 rpc.nfsd,然后供远程用户使用。
手动发出时,/usr/sbin/exportfs 命令允许 root 用户有选择地导出或取消导出目录,而无需重启 NFS 服务。给定正确的选项后,/usr/sbin/exportfs 命令将导出的文件系统写入 /var/lib/nfs/xtab。由于 rpc.mountd 在决定对文件系统的访问权限时引用 xtab 文件,因此对导出的文件系统列表的更改会立即生效。
以下是 /usr/sbin/exportfs 常用的选项列表:
-r
通过在 /var/lib/nfs/etab 中构建新的导出列表,将 /etc/exports 中列出的所有目录导出。如果对 /etc/exports 做了任何更改,这个选项可以有效地刷新导出列表。
-a
根据将哪些其他选项传给 /usr/sbin/exportfs,导致所有目录被导出或取消导出。如果没有指定其他选项,/usr/sbin/exportfs 会导出 /etc/exports 中指定的所有文件系统。
-o file-systems
指定没有在 /etc/exports 中列出的要导出的目录。将 file-systems 替换为要导出的其它文件系统。这些文件系统的格式化方式必须与 /etc/exports 中指定的方式相同。此选项通常用于在将导出的文件系统永久添加到导出的文件系统列表之前,对其进行测试。有关 /etc/exports 语法的详情,请参考 第 8.6.1 节 “/etc/exports 配置文件”
-i
忽略 /etc/exports ;只有命令行上指定的选项才会用于定义导出的文件系统。
-u
不导出所有共享目录。命令 /usr/sbin/exportfs -ua 可暂停 NFS 文件共享,同时保持所有 NFS 守护进程正常运行。要重新启用 NFS 共享,请使用 exportfs -r
-v
详细操作,当执行 exportfs 命令时,更详细地显示正在导出的或取消导出的文件系统。
如果没有将选项传给 exportfs 命令,它将显示当前导出的文件系统列表。有关 exportfs 命令的详情,请参考 man exportfs

8.6.2.1. 使用带有 NFSv4 的 exportfs

在 Red Hat Enterprise Linux 7 中,不需要额外的步骤来配置 NFSv4 导出,因为上述任何文件系统都自动提供给使用相同路径的 NFSv3 和 NFSv4 客户端。在之前的版本中并非如此。
要防止客户端使用 NFSv4,请在 /etc/sysconfig/nfs 中设置 RPCNFSDARGS= -N 4 来将其关闭。

8.6.3. 在防火墙后面运行 NFS

NFS 需要 rpcbind,它可为 RPC 服务动态分配端口,并可能导致配置防火墙规则的问题。要允许客户端访问防火墙后面的 NFS 共享,请编辑 /etc/sysconfig/nfs 文件来设置 RPC 服务运行的端口。要允许客户端通过防火墙访问 RPC 配额,请参阅 第 8.6.4 节 “通过防火墙访问 RPC 配额”
默认情况下,/etc/sysconfig/nfs 文件在所有系统中都不存在。如果 /etc/sysconfig/nfs 不存在,请创建并指定以下内容:
RPCMOUNTDOPTS="-p port"
这会将"-p port"添加到 rpc.mount 命令行: rpc.mount -p port
要指定 nlockmgr 服务使用的端口,请在 /etc/modprobe.d/lockd.conf 文件中设置 nlm_tcpportnlm_udpport 选项的端口号。
如果 NFS 无法启动,请检查 /var/log/messages。通常,如果指定了已在使用的端口号,NFS 将无法启动。编辑 /etc/sysconfig/nfs 后,您需要重启 nfs-config 服务,以便新值在 Red Hat Enterprise Linux 7.2 中生效,然后再运行以下命令:
#  systemctl restart nfs-config
然后,重启 NFS 服务器:
#  systemctl restart nfs-server
运行 rpcinfo -p 以确认更改生效。
注意
要允许 NFSv4.0 回调通过防火墙设置 /proc/sys/fs/nfs/nfs_callback_tcpport,并允许服务器连接到客户端上的该端口。
NFSv4.1 或更高版本不需要这个过程,纯 NFSv4 环境中不需要 mountdstatdlockd 的其他端口。

8.6.3.1. 发现 NFS 导出

有两种方法可以发现 NFS 服务器导出了哪些文件系统。
  • 在支持 NFSv3 的任何服务器上,使用 showmount 命令:
    $ showmount -e myserver
    Export list for mysever
    /exports/foo
    /exports/bar
  • 在支持 NFSv4 的任何服务器上,挂载 根目录并查找。
    # mount myserver:/ /mnt/
    # cd /mnt/
    exports
    # ls exports
    foo
    bar
在同时支持 NFSv4 和 NFSv3 的服务器上,这两种方法都可以工作,并给出同样的结果。
注意
在较旧的 NFS 服务器上的 Red Hat Enterprise Linux 6 之前,具体取决于它们的配置方式,可以通过不同的路径将文件系统导出到 NFSv4 客户端。由于这些服务器默认没有启用 NFSv4,因此这不应有问题。

8.6.4. 通过防火墙访问 RPC 配额

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

过程 8.1. 使 RPC 配额访问防火墙不可行

  1. 要启用 rpc-rquotad 服务,请使用以下命令:
    # systemctl enable rpc-rquotad 
  2. 要启动 rpc-rquotad 服务,请使用以下命令:
    # systemctl start rpc-rquotad 
    请注意,如果启用 rpc-rquotad,则自动启动 nfs-server 服务。
  3. 要使配额 RPC 服务在防火墙后面访问,需要打开 UDP 或 TCP 端口 875。默认端口号定义在 /etc/services 文件中。
    您可以通过将 -p port-number 附加到 /etc/sysconfig/rpc-rquotad 文件中的 RPCRQUOTADOPTS 变量来覆盖默认端口号。
  4. 重启 rpc-rquotad 以使 /etc/sysconfig/rpc-rquotad 文件中的更改生效:
    # systemctl restart rpc-rquotad

从远程主机设置配额

默认情况下,配额只能由远程主机读取。要允许设置配额,请将 -S 选项附加到 /etc/sysconfig/rpc-rquotad 文件中的 RPCRQUOTADOPTS 变量中。
重启 rpc-rquotad 以使 /etc/sysconfig/rpc-rquotad 文件中的更改生效:
# systemctl restart rpc-rquotad

8.6.5. 主机名格式

主机可以采用以下形式:
单台机器
完全限定域名(可由服务器解析)、主机名(可由服务器解析)或 IP 地址。
使用通配符指定的一系列机器
使用 *? 字符指定字符串匹配项。通配符不能用于 IP 地址;但是,如果反向 DNS 查找失败,则可能会意外起作用。当在完全限定域名中指定通配符时,点(.)不会包含在通配符中。例如: *.example.com 包含 one.example.com,但不包括 include one.two.example.com
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 名称。

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

如果存在支持 RDMA 的硬件,则远程直接内存访问(RDMA)服务会在 Red Hat Enterprise Linux 7 中自动工作。
通过 RDMA 启用 NFS:
  1. 安装 rdmardma-core 软件包。
    /etc/rdma/rdma.conf 文件包含默认设置 XPRTRDMA_LOAD=yes 的行,它请求 rdma 服务加载 NFSoRDMA 客户端 模块。
  2. 要启用自动载入 NFSoRDMA 服务器模块,请在 /etc/rdma/rdma.conf 中的新行中添加 SVCRDMA_LOAD=yes
    RPCNFSDARGS="--rdma=20049"/etc/sysconfig/nfs 文件中指定 NFSoRDMA 服务侦听客户端的端口号。RFC 5667 指定服务器在通过 RDMA 提供 NFSv4 服务时必须侦听端口 20049
  3. 编辑 /etc/rdma/rdma.conf 文件后重启 nfs 服务:
    # systemctl restart nfs
    请注意,在较早的内核版本中,编辑 /etc/rdma/rdma.conf 后需要重启系统才能使更改生效。

8.6.7. 配置只使用 NFSv4 的服务器

默认情况下,NFS 服务器在 Red Hat Enterprise Linux 7 中支持 NFSv2、NFSv3 和 NFSv4 连接。但是,您还可以将 NFS 配置为只支持 NFS 版本 4.0 及更新的版本。这可最小化系统上开放端口的数量和运行的服务,因为 NFSv4 不需要 rpcbind 服务来侦听网络。
当您的 NFS 服务器配置为只使用 NFSv4 时,尝试使用 NFSv2 或 NFSv3 挂载共享的客户端会失败,并显示类似如下的错误:
Requested NFS version or transport protocol is not supported.

过程 8.2. 配置只使用 NFSv4 的服务器

将您的 NFS 服务器配置为只支持 NFS 版本 4.0 及更新的版本:
  1. 通过在 /etc/sysconfig/nfs 配置文件中添加以下行来禁用 NFSv2、NFSv3 和 UDP:
    RPCNFSDARGS="-N 2 -N 3 -U"
    
  2. (可选)禁用对 RPCBINDMOUNTNSM 协议调用的监听,这在仅使用 NFSv4 的情况下不需要。
    禁用这些选项的影响有:
    • 尝试使用 NFSv2 或 NFSv3 从服务器挂载共享的客户端变得无响应。
    • NFS 服务器本身无法挂载 NFSv2 和 NFSv3 文件系统。
    禁用这些选项:
    • /etc/sysconfig/nfs 文件中添加以下内容:
      RPCMOUNTDOPTS="-N 2 -N 3"
      
    • 禁用相关服务:
      # systemctl mask --now rpc-statd.service rpcbind.service rpcbind.socket
  3. 重启 NFS 服务器:
    # systemctl restart nfs
    一旦启动或重启 NFS 服务器,这些改变就会生效。

验证仅 NFSv4 配置

您可以使用 netstat 实用程序验证您的 NFS 服务器是否在 NFSv4 模式中配置。
  • 以下是仅使用 NFSv4 服务器上的 netstat 输出示例;也禁用了对 RPCBINDMOUNTNSM 的监听。在这里,nfs 是唯一侦听 NFS 服务:
    # netstat -ltu
    
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    tcp        0      0 0.0.0.0:nfs             0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN     
    tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN     
    tcp6       0      0 [::]:nfs                [::]:*                  LISTEN     
    tcp6       0      0 [::]:12432              [::]:*                  LISTEN     
    tcp6       0      0 [::]:12434              [::]:*                  LISTEN     
    tcp6       0      0 localhost:7092          [::]:*                  LISTEN     
    tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
    udp        0      0 localhost:323           0.0.0.0:*                          
    udp        0      0 0.0.0.0:bootpc          0.0.0.0:*                          
    udp6       0      0 localhost:323           [::]:*
    
  • 相比之下,在配置只使用 NFSv4 的服务器前 netstat 输出会包括 sunrpcmountd 服务:
    # netstat -ltu
    
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    tcp        0      0 0.0.0.0:nfs             0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:36069           0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:52364           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     
    tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN     
    tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN     
    tcp6       0      0 [::]:34941              [::]:*                  LISTEN     
    tcp6       0      0 [::]:nfs                [::]:*                  LISTEN     
    tcp6       0      0 [::]:sunrpc             [::]:*                  LISTEN     
    tcp6       0      0 [::]:mountd             [::]:*                  LISTEN     
    tcp6       0      0 [::]:12432              [::]:*                  LISTEN     
    tcp6       0      0 [::]:56881              [::]:*                  LISTEN     
    tcp6       0      0 [::]:12434              [::]:*                  LISTEN     
    tcp6       0      0 localhost:7092          [::]:*                  LISTEN     
    tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
    udp        0      0 localhost:323           0.0.0.0:*                          
    udp        0      0 0.0.0.0:37190           0.0.0.0:*                          
    udp        0      0 0.0.0.0:876             0.0.0.0:*                          
    udp        0      0 localhost:877           0.0.0.0:*                          
    udp        0      0 0.0.0.0:mountd          0.0.0.0:*                          
    udp        0      0 0.0.0.0:38588           0.0.0.0:*                          
    udp        0      0 0.0.0.0:nfs             0.0.0.0:*                          
    udp        0      0 0.0.0.0:bootpc          0.0.0.0:*                          
    udp        0      0 0.0.0.0:sunrpc          0.0.0.0:*                          
    udp6       0      0 localhost:323           [::]:*                             
    udp6       0      0 [::]:57683              [::]:*                             
    udp6       0      0 [::]:876                [::]:*                             
    udp6       0      0 [::]:mountd             [::]:*                             
    udp6       0      0 [::]:40874              [::]:*                             
    udp6       0      0 [::]:nfs                [::]:*                             
    udp6       0      0 [::]:sunrpc             [::]:*
    

8.7. 保护 NFS

NFS 适合透明地共享具有大量已知主机的整个文件系统。但是,由于易于使用,存在各种潜在安全问题。为最大程度地降低 NFS 安全风险并保护服务器上的数据,在服务器上导出 NFS 文件系统或将其挂载到客户端上时,请考虑以下部分:

8.7.1. 具有 AUTH_SYS 和导出控制的 NFS 安全性

传统上,为了控制对导出文件的访问, NFS 提供了两个选项。
首先,服务器限制允许哪些主机通过 IP 地址或主机名挂载哪些文件系统。
其次,服务器对 NFS 客户端上的用户强制执行文件系统权限的方式与对本地用户执行的方式相同。传统上,它使用 AUTH_SYS (也称为 AUTH_UNIX)执行此操作,它依赖于客户端来声明用户的 UID 和 GID。请注意,这意味着恶意或配置错误的客户端可能会很容易地出现这个错误,并允许用户访问他不应该访问的文件。
为限制潜在的风险,管理员通常允许只读访问权限,或将用户权限压缩为公共的用户和组 ID 。不幸的是,这些解决方案阻止了以最初预期的方式使用 NFS 共享。
另外,如果攻击者获得了导出 NFS 文件系统的系统所使用的 DNS 服务器的控制,则与特定主机名或完全限定域名关联的系统可以会指向未经授权的机器。此时,未经授权的机器 允许挂载 NFS 共享的系统,因为没有交换用户名或密码信息来为 NFS 挂载提供额外的安全。
在通过 NFS 导出目录时应谨慎使用通配符,因为通配符的范围可能包含比预期更多的系统。
也可以使用 TCP 包装程序限制对 rpcbind[1] 服务的访问。使用 iptables 创建规则也可以限制对 rpcbindrpc.mountdrpc.nfsd 使用的端口的访问。
有关保护 NFS 和 rpcbind 的更多信息,请参阅 man iptables

8.7.2. 带有 AUTH_GSS的 NFS 安全性

NFSv4 通过规定 RPCSEC_GSS 和 Kerberos 版本 5 GSS-API 机制的实施来促进 NFS 安全性。但是,RPCSEC_GSS 和 Kerberos 机制也可用于所有版本的 NFS。在 FIPS 模式中,只能使用 FIPS 批准的算法。
与 AUTH_SYS 不同,使用 RPCSEC_GSS Kerberos 机制,服务器不依赖于客户端就可以正确地表示哪个用户正在访问文件。相反,加密用于向服务器验证用户的身份,这可防止恶意客户端在没有用户的 Kerberos 凭据的情况下模拟用户。使用 RPCSEC_GSS Kerberos 机制是保护挂载的最直接方法,因为配置了 Kerberos 后不需要额外的设置。

配置 Kerberos

在配置 NFSv4 Kerberos 感知服务器前,您需要安装和配置 Kerberos 密钥分发中心(KDC)。Kerberos 是一种网络身份验证系统,其允许客户端和服务器使用对称加密和信任的第三方 KDC 来互相进行身份验证。红帽建议使用身份管理(IdM)来设置 Kerberos。

过程 8.3. 为 IdM 配置 NFS 服务器和客户端以使用 RPCSEC_GSS

    • 在 NFS 服务器端创建 nfs/hostname.domain@REALM 主体。
    • 在服务器和客户端端创建 host/hostname.domain@REALM 主体。
      注意
      主机名 必须与 NFS 服务器主机名相同。
    • 将对应的密钥添加到客户端和服务器的 keytab 中。
    具体步骤请查看 Red Hat Enterprise Linux 7 Linux Domain Identity, Authentication, and Policy Guide 中的 Adding and Editing Service Entries and Keytabs and setting an Kerberos-aware NFS Server 部分。
  1. 在服务器端,使用 sec= 选项启用所需的安全类型。启用所有安全类型和非加密挂载:
    /export *(sec=sys:krb5:krb5i:krb5p)
    
    sec= 选项一起使用的有效安全类型为:
    • sys: 没有加密保护,默认
    • krb5: authentication only
    • krb5i: 完整性保护
    • krb5p: 隐私保护
  2. 在客户端,将 sec=krb5 (或 sec=krb5i, 或 sec=krb5p,具体取决于设置)添加到挂载选项:
    # mount -o sec=krb5 server:/export /mnt
    
    有关如何配置 NFS 客户端的详情,请参考 Red Hat Enterprise Linux 7 Linux 域身份、身份验证和策略指南中的 设置 Kerberos 感知 NFS 客户端 部分

其它资源

8.7.2.1. 使用 NFSv4 的 NFS 安全性

NFSv4 包括基于 Microsoft Windows NT 模型的 ACL 支持,而不是 POSIX 模型,因为 Microsoft Windows NT 模型的功能和广泛的部署。
NFSv4 的另一个重要安全功能是删除使用 MOUNT 协议来挂载文件系统。MOUNT 协议存在安全风险,因为协议处理文件句柄的方式。

8.7.3. 文件权限

远程主机一旦将 NFS 文件系统挂载为读取或读写,则保护每个共享文件的唯一方法就是其权限。如果共享同一用户 ID 值的两个用户挂载同一个 NFS 文件系统,则他们可以修改彼此的文件。此外,在客户端系统上以 root 身份登录的任何人都可以使用 su - 命令访问 NFS 共享的任何文件。
默认情况下,Red Hat Enterprise Linux 的 NFS 支持访问控制列表(ACL)。红帽建议保持启用此功能。
默认情况下,NFS 在导出文件系统时使用 root 压缩。这会将本地机器上以 root 用户身份访问 NFS 共享的用户 ID 设置为 nobody。root squashing 由默认选项 root_squash 控制 ; 有关这个选项的详情请参考 第 8.6.1 节 “/etc/exports 配置文件”。如果可能的话,切勿禁用 root 压缩。
将 NFS 共享导出为只读时,请考虑使用 all_squash 选项。这个选项使访问导出的文件系统的每个用户都使用 nfsnobody 用户的用户 ID。

8.8. NFS 和 rpcbind

注意
以下部分仅适用于需要 rpcbind 服务以便向后兼容的 NFSv3 实现。
有关如何配置只使用 NFSv4 的服务器(不需要 rpcbind )的详情,请参考 第 8.6.7 节 “配置只使用 NFSv4 的服务器”
rpcbind[1] 工具将 RPC 服务映射到它们侦听的端口。RPC 进程在启动时通知 rpcbind,注册它们正在侦听的端口以及它们期望提供服务的 RPC 程序号。然后,客户端系统会使用特定的 RPC 程序号联系服务器上的 rpcbindrpcbind 服务将客户端重定向到正确的端口号,这样它就可以与请求的服务进行通信。
由于基于 RPC 的服务依赖 rpcbind 来与所有传入的客户端请求建立连接,因此 rpcbind 必须在这些服务启动之前可用。
rpcbind 服务使用 TCP 包装程序进行访问控制,而 rpcbind 的访问控制规则 会影响所有 基于 RPC 的服务。另外,也可以为每个 NFS RPC 守护进程指定访问控制规则。rpc.mountdrpc.statdman page 包含有关这些规则的确切语法的信息。

8.8.1. NFS 和 rpcbind故障排除

由于 rpcbind[1] 在 RPC 服务和用于与其通信的端口号之间提供协调,因此在进行故障排除时,使用 rpcbind 查看当前 RPC 服务的状态非常有用。rpcinfo 命令显示每个基于 RPC 的服务,以及端口号、RPC 程序号、版本号和 IP 协议类型(TCP 或 UDP)。
要确保为 rpcbind 启用了正确的基于 NFS RPC 的服务,请使用以下命令:
# rpcinfo -p

例 8.7. rpcinfo -p 命令输出

下面是一个这个命令的输出示例:
program vers proto  port service
      100021    1   udp  32774  nlockmgr
      100021    3   udp  32774  nlockmgr
      100021    4   udp  32774  nlockmgr
      100021    1   tcp  34437  nlockmgr
      100021    3   tcp  34437  nlockmgr
      100021    4   tcp  34437  nlockmgr
      100011    1   udp    819  rquotad
      100011    2   udp    819  rquotad
      100011    1   tcp    822  rquotad
      100011    2   tcp    822  rquotad
      100003    2   udp   2049  nfs
      100003    3   udp   2049  nfs
      100003    2   tcp   2049  nfs
      100003    3   tcp   2049  nfs
      100005    1   udp    836  mountd
      100005    1   tcp    839  mountd
      100005    2   udp    836  mountd
      100005    2   tcp    839  mountd
      100005    3   udp    836  mountd
      100005    3   tcp    839  mountd
如果其中一个 NFS 服务没有正确启动,rpcbind 将不能将来自客户端的对该服务的 RPC 请求映射到正确的端口。在很多情况下,如果 rpcinfo 输出中不存在 NFS,重启 NFS 会导致服务使用 rpcbind 正确注册并开始工作。
有关 rpcinfo 的更多信息和选项列表,请查看其 man page。

8.9. pNFS

从 Red Hat Enterprise Linux 6.4 开始,支持 Parallel NFS (pNFS)作为 NFS v4.1 标准的一部分。pNFS 架构提高了 NFS 的可扩展性,并可能提高性能。也就是说,当服务器也实现 pNFS 时,客户端也可以同时通过多个服务器访问数据。它支持三种存储协议或布局:文件、对象和块。
注意
该协议允许三种可能的 pNFS 布局类型:file、object 和 blocks。虽然 Red Hat Enterprise Linux 6.4 客户端只支持文件布局类型,但 Red Hat Enterprise Linux 7 支持 files 布局类型,对象和块布局类型作为技术预览包含。

pNFS Flex 文件

灵活的文件是 pNFS 的新布局,它允许将独立 NFSv3 和 NFSv4 服务器的聚合到一个扩展命名空间中。Flex Files 功能是 NFSv4.2 标准的一部分,如 RFC 7862 规范中所述。
从 Red Hat Enterprise Linux 7.4 开始,Red Hat Enterprise Linux 可以从 Flex Files 服务器挂载 NFS 共享。

挂载 pNFS 共享

  • 要启用 pNFS 功能,使用 NFS 版本 4.1 或更高版本从启用了 pNFS 的服务器挂载共享:
    # mount -t nfs -o v4.1 server:/remote-export /local-directory
    服务器启用 pNFS 后,在第一次挂载时会自动载入 nfs_layout_nfsv41_files 内核。输出中的挂载条目应包含 minorversion=1。使用以下命令验证模块是否已加载:
    $ lsmod | grep nfs_layout_nfsv41_files
  • 要从支持 Flex Files 的服务器中挂载带有 Flex Files 功能的 NFS 共享,请使用 NFS 版本 4.2 或更高版本:
    # mount -t nfs -o v4.2 server:/remote-export /local-directory
    验证 nfs_layout_flexfiles 模块是否已加载:
    $ lsmod | grep nfs_layout_flexfiles

其它资源

有关 pNFS 的详情,请参考: http://www.pnfs.com

8.10. 在 NFS 中启用 pNFS SCSI 布局

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

先决条件

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

8.10.1. 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 通过分配保留来处理保护。在服务器向客户端发送布局之前,它会保留 SCSI 设备,以确保只有注册的客户端才可以访问该设备。如果客户端可以向那个 SCSI 设备发送命令,但没有在该设备上注册,那么该设备上的客户端的许多操作都会失败。例如,如果服务器没有向客户端提供该设备的布局,客户端上的 blkid 命令将无法显示 XFS 文件系统的 UUID。
服务器不会删除其自身的持久性保留。这样可在重启客户端和服务器后保护该设备中的文件系统中的数据。为了重新使用 SCSI 设备,您可能需要手动删除 NFS 服务器中的持久性保留。

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

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

先决条件

  • 安装 sg3_utils 软件包:
    # yum install sg3_utils

过程 8.4. 检查与 pNFS 兼容的 SCSI 设备

  • 在服务器和客户端中检查正确的 SCSI 设备支持:
    # sg_persist --in --report-capabilities --verbose path-to-scsi-device
    确保设置了 Persist Through Power Los Active (PTPL_A)位。

    例 8.8.  支持 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

8.10.3. 在服务器中设置 pNFS SCSI

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

过程 8.5. 在服务器中设置 pNFS SCSI

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

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

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

其它资源

8.10.4. 在客户端中设置 pNFS SCSI

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

先决条件

过程 8.6. 在客户端中设置 pNFS SCSI

  • 在客户端中使用 NFS 版本 4.1 或更高版本挂载导出的 XFS 文件系统:
    # mount -t nfs -o nfsvers=4.1 host:/remote/export /local/directory
    不要在没有 NFS 的情况下直接挂载 XFS 文件系统。

其它资源

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

此流程释放 NFS 服务器在 SCSI 设备中拥有的持久保留。这可让您在不再需要导出 pNFS SCSI 时重新使用 SCSI 设备。
您必须从服务器中删除保留。它不能从不同的 IT Nexus 中删除。

先决条件

  • 安装 sg3_utils 软件包:
    # yum install sg3_utils

过程 8.7. 在服务器中释放 pNFS SCSI 保留

  1. 在服务器上查询现有保留:
    # sg_persist --read-reservation path-to-scsi-device

    例 8.10. 在 /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

    例 8.11. 删除 /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.10.6. 监控 pNFS SCSI 布局功能

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

先决条件

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

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

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

过程 8.8. 从使用 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.10.6.2. 使用 mountstats 从客户端检查 pNFS SCSI 操作

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

过程 8.9. 使用 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 操作的请求。
    • READWRITE 统计指示客户端和服务器回退到 NFS 操作的请求。

8.11. NFS 参考

管理 NFS 服务器可能是一个挑战。许多选项(包括本章中未提及的一些选项)可用于导出或挂载 NFS 共享。如需更多信息,请参阅以下源:

安装的文档

  • man mount - 包含了全面查看 NFS 服务器和客户端配置的挂载选项。
  • man fstab - 提供在启动时挂载文件系统的 /etc/fstab 文件格式的详细信息。
  • man nfs - 提供特定于 NFS 文件系统导出和挂载选项的详情。
  • man exports - 显示导出 NFS 文件系统时 /etc/exports 文件中使用的常见选项。

有用的网站



[1] rpcbind 服务取代了 portmap,这在以前的 Red Hat Enterprise Linux 版本中用于将 RPC 程序号映射到 IP 地址端口号组合。如需更多信息,请参阅 第 8.1.1 节 “所需的服务”

第 9 章 服务器消息块(SMB)

服务器消息块(SMB)协议实现用于访问服务器上资源的应用层网络协议,如文件共享和共享打印机。在 Microsoft Windows 上,默认实施 SMB 。如果您运行 Red Hat Enterprise Linux,请使用 Samba 提供 SMB 共享,以及 cifs-utils 工具从远程服务器挂载 SMB 共享。
注意
在 SMB 的上下文中,您有时会阅读有关通用互联网文件系统(CIFS)协议的信息,这是 SMB 的一种问题。SMB 和 CIFS 协议都支持,并且挂载 SMB 和 CIFS 共享时涉及的内核模块和工具都使用名称 cifs

9.1. 提供 SMB 共享

请参阅 Red Hat 系统管理员指南中的 Samba 部分。

9.2. 挂载 SMB 共享

在 Red Hat Enterprise Linux 上,内核的 cifs.ko 文件系统模块提供对 SMB 协议的支持。但是,要挂载并使用 SMB 共享,还必须安装 cifs-utils 软件包:
# yum install cifs-utils
cifs-utils 软件包提供以下工具:
  • 挂载 SMB 和 CIFS 共享
  • 在内核的密钥环中管理 NT Lan Manager (NTLM)凭据
  • 在 SMB 和 CIFS 共享上的安全描述符中设置和显示访问控制列表(ACL)

9.2.1. 支持的 SMB 协议版本

cifs.ko 内核模块支持以下 SMB 协议版本:
  • SMB 1
  • SMB 2.0
  • SMB 2.1
  • SMB 3.0
注意
根据协议版本,并非所有 SMB 功能都已实施。

9.2.1.1. UNIX 扩展支持

Samba 在 SMB 协议中使用 CAP_UNIX 功能位来提供 UNIX 扩展功能。cifs.ko 内核模块也支持这些扩展。但是,Samba 和内核模块仅支持 SMB 1 协议中的 UNIX 扩展。
要使用 UNIX 扩展:
  1. /etc/samba/smb.conf 文件中的 [global] 部分中的 server min protocol 选项设置为 NT1。这是 Samba 服务器中的默认设置。
  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 扩展。

9.2.2. 手动挂载 SMB 共享

要手动挂载 SMB 共享,在 -t cifs 参数中使用 mount 工具:
# mount -t cifs -o username=user_name //server_name/share_name /mnt/
Password for user_name@//server_name/share_name:  ********
-o options 参数中,您可以指定用于挂载共享的选项。详情请查看 第 9.2.6 节 “常用挂载选项” man page 中的 mount.cifs(8)OPTIONS 部分。

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

要将 \\服务器\示例\ 共享作为 DOMAIN\Administrator 用户通过加密的 SMB 3.0 连接挂载到 /mnt/ 目录:
# mount -t cifs -o username=DOMAIN\Administrator,seal,vers=3.0 //server/example /mnt/
Password for user_name@//server_name/share_name:  ********

9.2.3. 在系统引导时自动挂载 SMB 共享

要在系统引导时自动挂载 SMB 共享,请将共享条目添加到 /etc/fstab 文件中。例如:
//server_name/share_name  /mnt  cifs  credentials=/root/smb.cred  0 0
重要
要让系统自动挂载共享,您必须将用户名、密码和域名存储在凭据文件中。详情请查看 第 9.2.4 节 “使用凭据文件对 SMB 共享进行身份验证”
/etc/fstab 文件的第四个字段中,指定挂载选项,如凭据文件的路径。详情请查看 第 9.2.6 节 “常用挂载选项” man page 中的 mount.cifs(8)OPTIONS 部分。
要验证共享挂载是否成功,请输入:
# mount /mnt/

9.2.4. 使用凭据文件对 SMB 共享进行身份验证

在某些情况下,管理员希望在不输入用户名和密码的情况下挂载共享。要实施此操作,请创建一个凭据文件。例如:

过程 9.1. 创建凭证文件

  1. 创建一个文件,如 ~/smb.cred,并指定该文件的用户名、密码和域名:
    username=user_name
    password=password
    domain=domain_name
  2. 将权限设置为只允许所有者可以访问该文件:
    # chown user_name ~/smb.cred
    # chmod 600 ~/smb.cred
现在,您可以将 credentials=file_name 挂载选项传给 mount 工具,或者在 /etc/fstab 文件中使用它来挂载共享,而无需提示输入用户名和密码。

9.2.5. 执行多用户 SMB 挂载

您为挂载共享提供的凭据默认确定对挂载点的访问权限。例如,如果您在挂载共享时使用 DOMAIN\example 用户,则共享上的所有操作都将以该用户的身份执行,无论哪个本地用户执行该操作。
然而,在某些情况下,管理员希望在系统启动时自动挂载共享,但用户应使用自己的凭据对共享的内容执行操作。multiuser 挂载选项允许您配置此场景。
重要
要使用 multiuser,还必须将 sec=security_type 挂载选项设置为支持以非交互方式提供凭据的安全类型,如 krb5 或带有凭据文件的 ntlmssp 选项。请参阅 “以用户身份访问共享”一节
root 用户使用 multiuser 选项以及对共享内容具有最少访问权限的帐户挂载共享。然后,常规用户可以使用 cifscreds 实用程序将其用户名和密码提供给当前会话的内核密钥环。如果用户访问挂载的共享的内容,则内核将使用内核密钥环中的凭据,而不是最初用来挂载共享的凭据。

使用 multiuser 选项挂载共享

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

过程 9.2. 使用 multiuser 选项创建 /etc/fstab 文件条目

  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 共享的详情,请参考 第 9.2.2 节 “手动挂载 SMB 共享”

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

使用 multiuser 选项验证共享是否挂载:
# mount
...
//server_name/share_name on /mnt type cifs (sec=ntlmssp,multiuser,...)

以用户身份访问共享

如果使用 multiuser 选项挂载 SMB 共享,用户可以向内核的密钥环提供其服务器凭证:
# cifscreds add -u SMB_user_name server_name
Password: ********
现在,当用户在包含挂载的 SMB 共享的目录中执行操作时,服务器会为此用户应用文件系统权限,而不是挂载共享时最初使用的权限。
注意
多个用户可以同时对挂载的共享使用自己的凭据来执行操作。

9.2.6. 常用挂载选项

当您挂载 SMB 共享时,挂载选项将决定:
  • 如何与服务器建立连接。例如:连接到服务器时使用 SMB 协议版本。
  • 如何将共享挂载到本地文件系统.例如,如果系统覆盖了远程文件和目录的权限,使多个本地用户能够访问服务器上的内容。
要在 /etc/fstab 文件的第四个字段或 挂载 命令的 -o 参数中设置多个选项,请使用逗号分隔它们。例如,请参阅 过程 9.2, “使用 multiuser 选项创建 /etc/fstab 文件条目”
以下列表提供了常用挂载选项的概述:

表 9.1. 常用挂载选项

选项 描述
credentials=file_name 设置凭证文件的路径。请参阅 第 9.2.4 节 “使用凭据文件对 SMB 共享进行身份验证”
dir_mode=mode 如果服务器不支持 CIFS UNIX 扩展,则设置目录模式。
file_mode=mode 如果服务器不支持 CIFS UNIX 扩展,则设置文件模式。
password=password 设置在 SMB 服务器中验证的密码。另外,也可使用 credentials 选项指定凭据文件。
seal 使用 SMB 3.0 或更高的协议版本启用对连接的加密支持。因此,使用 sealvers 挂载选项来设置成 3.0 或更高版本。请参阅 例 9.1 “使用加密的 SMB 3.0 连接挂载共享”
sec=security_mode
设置安全模式,如 ntlmsspi,来启用 NTLMv2 密码哈希和已启用的数据包签名。有关支持的值列表,请查看 mount.cifs(8) man page 中的选项描述。
如果服务器不支持 ntlmv2 安全模式,则使用 sec=ntlmssp,这是默认值。出于安全考虑,请不要使用不安全的 ntlm 安全模式。
username=user_name 设置在 SMB 服务器中验证的用户名。另外,也可使用 credentials 选项指定凭据文件。
vers=SMB_protocol_version 设定用于与服务器通信的 SMB 协议版本。
有关完整列表,请查看 mount.cifs(8) man page 中的 OPTIONS 部分。

第 10 章 FS-Cache

FS-Cache 是一种永久的本地缓存,可供文件系统用于通过网络检索数据并将其缓存在本地磁盘上。这有助于最小化网络流量,以便用户从通过网络(例如 NFS)挂载的文件系统来访问数据。
下图显示了 FS-Cache 的工作原理:

图 10.1. FS-Cache 概述

FS-Cache 概述
FS-Cache 旨在对系统的用户和管理员尽可能透明。与 Solaris 上的 cachefs 不同,FS-Cache 允许服务器上的文件系统直接与客户端的本地缓存交互,而无需创建过度挂载的文件系统。使用 NFS 时,挂载选项指示客户端挂载启用了 FS-cache 的 NFS 共享。
FS-Cache 不会改变通过网络进行的文件系统的基本操作 - 它只是为文件系统提供一个永久的、可以缓存数据的地方。例如,客户端仍然可以挂载 NFS 共享,无论是否启用了 FS-Cache。此外,缓存的 NFS 可以处理不适合缓存的文件(无论是单独的还是全部的),因为文件可以部分缓存,且无需事先完全读取。FS-Cache 还会隐藏发生在客户端文件系统驱动程序的缓存中的所有 I/O 错误。
要提供缓存服务,FS-Cache 需要 缓存后端。缓存后端是配置为提供缓存服务(例如 cachefiles)的存储驱动程序。在这种情况下,FS-Cache 需要一个挂载的基于块的文件系统,它支持 bmap 和扩展属性(如 ext3)作为其缓存后端。
FS-Cache 无法任意缓存任何文件系统,无论是通过网络还是通过其他方式:必须更改共享文件系统的驱动程序,以允许与 FS-Cache、数据存储/检索以及元数据设置和验证进行交互。FS-Cache 需要来自缓存文件系统的 索引密钥一致性数据 来支持持久性:索引密钥将文件系统对象与缓存对象匹配,一致性数据确定缓存对象是否仍然有效。
注意
在 Red Hat Enterprise Linux 7 中,默认情况下不安装 cachefilesd 软件包,需要手动安装。

10.1. 性能保证

FS-Cache 保证性能的提高,但它通过避免网络拥塞来确保一致的性能。使用缓存后端会导致性能下降:例如,缓存的 NFS 共享会为跨网络查找添加磁盘访问。虽然 FS-Cache 尝试尽可能异步,但有一些同步路径(例如读取)是不可能的。
例如,使用 FS-Cache 通过其它未装载的 GigE 网络在两台计算机之间缓存 NFS 共享,将不会在文件访问方面显示出任何性能改进。相反,通过服务器内存而不是本地磁盘可以更快地满足 NFS 请求。
因此,使用 FS-Cache 是各种因素之间的 折衷。例如,如果使用 FS-Cache 来缓存 NFS 流量,它可能会减慢一点儿客户端的速度,但通过满足本地的读请求而无需消耗网络带宽,可以大量减少网络和服务器加载。

10.2. 设置缓存

目前,Red Hat Enterprise Linux 7 只提供 cachefiles 缓存后端。cachefilesd 守护进程启动并管理 cachefiles/etc/cachefilesd.conf 文件控制 cachefile 如何提供缓存服务。
在缓存后端中配置的第一个设置是要将哪个目录用作缓存。要配置它,请使用以下参数:
$ dir /path/to/cache
通常,缓存后端目录在 /etc/cachefilesd.conf 中被设置为 /var/cache/fscache,如下所示:
$ dir /var/cache/fscache
如果要更改缓存后端目录,selinux 上下文必须与 /var/cache/fscache 相同:
# semanage fcontext -a -e /var/cache/fscache /path/to/cache
# restorecon -Rv /path/to/cache
在设置缓存时,将 /path/to/cache 替换为目录名称。
注意
如果给定的设置 selinux 上下文的命令无法工作,请使用以下命令:
# semanage permissive -a cachefilesd_t
# semanage permissive -a cachefiles_kernel_t
FS-Cache 会将缓存存储在托管 /path/to/cache 的文件系统中。在笔记本电脑上,建议使用 root 文件系统(/)作为主机文件系统,但对于桌面计算机而言,更谨慎地挂载专门用于缓存的磁盘分区。
支持 FS-Cache 缓存后端所需的功能的文件系统包括以下文件系统的 Red Hat Enterprise Linux 7 实现:
  • ext3(启用了扩展属性)
  • ext4
  • Btrfs
  • XFS
主机文件系统必须支持用户定义的扩展属性;FS-Cache 使用这些属性来存储一致的维护信息。要为 ext3 文件系统(例如 设备)启用用户定义的扩展属性,请使用:
# tune2fs -o user_xattr /dev/device
另外,也可在挂载时启用文件系统的扩展属性,如下所示:
# mount /dev/device /path/to/cache -o user_xattr
缓存后端的工作原理是在托管缓存的分区上维护一定数量的空闲空间。当系统的其他元素耗尽空闲空间时,它会增长和收缩缓存,使得可以在根文件系统(例如,在笔记本电脑上)上安全地使用。FS-Cache 对此行为设置默认值,可以通过 缓存剔除限制 进行配置。有关配置缓存剔除限制的详情,请参考 第 10.4 节 “设置缓存剔除限制”
配置文件就位后,启动 cachefilesd 服务:
# systemctl start cachefilesd
要将 cachefilesd 配置为在引导时启动,请以 root 用户身份执行以下命令:
# systemctl enable cachefilesd

10.3. 在 NFS 中使用缓存

除非明确指示,否则 NFS 将不会使用缓存。要将 NFS 挂载配置为使用 FS-Cache,请在 mount 命令中包含 -o fsc 选项:
# mount nfs-share:/ /mount/point -o fsc
/mount/point 下文件的所有访问都将通过缓存,除非打开该文件以进行直接 I/O 或写入。如需更多信息,请参阅 第 10.3.2 节 “使用 NFS 的缓存限制”。NFS 使用 NFS 文件句柄 而不是 文件名来索引缓存内容,这意味着硬链接的文件可以正确共享缓存。
NFS 版本2、3 和 4 支持缓存。但是,每个版本使用不同的分支进行缓存。

10.3.1. 缓存共享

与 NFS 缓存共享相关的一些潜在问题。因为缓存是持久的,所以缓存中的数据块会根据由四个键组成的序列来索引的:
  • 第 1 级:服务器详情
  • 第 2 级:一些挂载选项;安全类型;FSID;uniquifier
  • 第 3 级:文件处理
  • 第 4 级:文件中的页号
为避免超级块之间一致性管理问题,希望缓存数据的所有 NFS 超级块都具有唯一的第 2 级密钥。通常,两个 NFS 挂载使用相同的源卷和选项共享超级块,因此共享缓存,即使它们在该卷中挂载不同的目录。

例 10.1. 缓存共享

使用以下两个 mount 命令:
mount home0:/disk0/fred /home/fred -o fsc
mount home0:/disk0/jim /home/jim -o fsc
在这里,/home/fred/home/jim 可能会共享超级块,因为它们具有相同的选项,特别是当它们来自 NFS 服务器(home0)上的相同卷/分区时。现在,考虑接下来的两个挂载命令:
mount home0:/disk0/fred /home/fred -o fsc,rsize=230
mount home0:/disk0/jim /home/jim -o fsc,rsize=231
在这种情况下,/home/fred/home/jim 不会共享超级块,因为它们具有不同的网络访问参数,这些参数是第 2 级密钥的一部分。以下的挂载序列也是如此:
mount home0:/disk0/fred /home/fred1 -o fsc,rsize=230
mount home0:/disk0/fred /home/fred2 -o fsc,rsize=231
此处,两个子树的内容(/home/fred1/home/fred2)将缓存 两次
避免超级块共享的另一种方法是使用 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 级密钥。要解决这个问题,请在至少一个挂载上添加一个 唯一标识符,即 fsc=unique-identifier。例如:
mount home0:/disk0/fred /home/fred -o nosharecache,fsc
mount home0:/disk0/jim /home/jim -o nosharecache,fsc=jim
在这里,唯一标识符 jim 添加到 /home/jim 缓存中使用的第 2 级键中。

10.3.2. 使用 NFS 的缓存限制

  • 为直接 I/O 打开共享文件系统的文件将自动绕过缓存。这是因为这种访问类型必须与服务器直接进行。
  • 打开共享文件系统的文件进行写入不适用于 NFS 版本 2 和 3。这些版本的协议无法为客户端提供足够的一致性管理信息,来检测另一客户端对同一文件的并发写入。
  • 从共享文件系统打开一个文件直接 I/O 或写入清除文件缓存的副本。FS-Cache 不会再次缓存文件,直到它不再为直接 I/O 或写操作而打开。
  • 另外,FS-Cache 的这个发行版本只缓存常规 NFS 文件。FS-Cache 不会 缓存目录、符号链接、设备文件、FIFO 和套接字。

10.4. 设置缓存剔除限制

cachefilesd 守护进程的工作原理是:缓存来自共享文件系统的远程数据,以释放磁盘上的空间。这可能会消耗掉所有空闲空间,如果磁盘还存放 root 分区,这可能会很糟糕。为了控制这一点,cachefiled 会尝试通过丢弃缓存中的旧对象(例如,最近未访问的)来维护一定数量的可用空间。这个行为被称为 缓存剔除
缓存剔除是根据块的百分比以及底层文件系统中可用文件的百分比来完成的。/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 PROFILE bstop < bcull < brun < 100
  • 0 PROFILE fstop < fcull < frun < 100
这些是可用空间和可用文件的百分比,不显示为 100 减去 df 程序所显示的百分比。
重要
剔除同时依赖于 bxxx 和 fxxx 对;它们不能被单独处理。

10.5. 统计信息

FS-Cache 还跟踪一般统计信息。要查看此信息,请使用:
# cat /proc/fs/fscache/stats
FS-Cache 统计数据包括有关决策点和对象计数器的信息。如需更多信息,请参阅以下内核文档:
/usr/share/doc/kernel-doc-version/Documentation/filesystems/caching/fscache.txt

10.6. FS-Cache 参考

有关 cachefilesd 以及如何配置它的更多信息,请参阅 man cachefilesdman cachefilesd.conf。以下内核文档还提供附加信息:
  • /usr/share/doc/cachefilesd-version-number/README
  • /usr/share/man/man5/cachefilesd.conf.5.gz
  • /usr/share/man/man8/cachefilesd.8.gz
有关 FS-Cache 的常规信息,包括其设计约束、可用统计和功能的详情,请查看以下内核文档: /usr/share/doc/kernel-doc-version/Documentation/filesystems/caching/fscache.txt

部分 II. 存储管理

存储管理部分从 Red Hat Enterprise Linux 7 的存储注意事项开始。有关分区、逻辑卷管理和交换分区的说明如下。接下来是磁盘配额、RAID 系统,然后是 mount 命令、volume_key 和 acls 的功能。SSD 调优、写屏障、I/O 限制和无盘系统遵循这一步。接下来是在线存储的大篇章,最后是需要完成的设备映射器多路径和虚拟存储。

第 11 章 安装过程中的存储注意事项

许多存储设备和文件系统设置只能在安装时配置。其他设置(如文件系统类型)只能修改到某个点,而无需重新格式化。因此,在安装 Red Hat Enterprise Linux 7 前,建议您相应地规划存储配置。
本章讨论为您的系统规划存储配置时需要考虑的事项。有关安装说明(包括安装期间的存储配置),请参阅红帽提供的 安装指南
有关红帽官方支持大小和存储限制的详情,请参考文章 http://www.redhat.com/resourcelibrary/articles/articles-red-hat-enterprise-linux-6-technology-capabilities-and-limits

11.1. 特殊注意事项

本节列举了对于特定存储配置需要考虑的几个问题和因素。

/home、/opt、/usr/local 的单独分区

如果您将来可能会升级您的系统,请将 /home/opt/usr/local 放在单独的设备中。这可让您重新格式化包含操作系统的设备或文件系统,同时保留您的用户和应用程序数据。

IBM System Z 上的 DASD 和 zFCP 设备

在 IBM System Z 平台上,DASD 和 zFCP 设备通过 通道命令字 (CCW)机制进行配置。CCW 路径必须明确添加到系统,然后将其上线。对于 DASD 设备,这意味着在引导命令行或 CMS 配置文件中将设备号(或设备号范围)列为 DASD= 参数。
对于 zFCP 设备,您必须列出设备号、逻辑单元号 (LUN)和 全局端口名称 (WWPN)。初始化 zFCP 设备后,它将映射到 CCW 路径。引导命令行(或 CMS 配置文件)中的 FCP_x= 行允许您为安装程序指定此信息。

使用 LUKS 加密块设备

使用 LUKS/dm-crypt 格式化块设备以进行加密,会破坏该设备上的任何现有格式。因此,在将新系统的存储配置作为安装过程的一部分激活之前,您应该决定对哪些设备进行加密(如果有的话)。

过时的 BIOS RAID 元数据

从为固件 RAID 配置的系统中移动磁盘,而不 从磁盘中删除 RAID 元数据,可能会阻止 Anaconda 正确检测磁盘。
警告
从磁盘中移除/删除 RAID 元数据可能会破坏任何存储的数据。红帽建议您在继续前备份数据。
注意
如果您使用 dmraid 创建 RAID 卷(现已弃用),请使用 dmraid 工具删除它:
# dmraid -r -E /device/
有关管理 RAID 设备的详情,请参考 man dmraid第 18 章 独立磁盘冗余阵列(RAID)

iSCSI 检测和配置

对于 iSCSI 驱动器的即插即用检测,请在支持启动的 网络接口卡 (NIC)的固件中配置它们。安装过程中支持 iSCSI 目标的 CHAP 验证。但是,在安装过程中不支持 iSNS 发现。

FCoE 检测和配置

对于 以太网光纤通道 (FCoE)驱动器的插件和播放检测,请在支持 EDD 引导的 NIC 的固件中配置它们。

DASD

无法在安装过程中添加或配置 直接访问的存储设备 (DASD)。此类设备在 CMS 配置文件中指定。

启用了 DIF/DIX 的块设备

DIF/DIX 是某些 SCSI 主机总线适配器和块设备提供的硬件校验和功能。启用 DIF/DIX 时,如果块设备用作通用块设备,则会出现错误。缓冲的 I/O 或 mmap (2)将无法可靠地工作,因为缓冲的写入路径中没有交集,以防止在计算 DIF/DIX 校验和后缓冲的数据被覆盖。
这会导致 I/O 稍后失败,并显示 checksum 错误。这个问题对于所有块设备(或基于文件系统)缓冲的 I/O 或 mmap (2) I/O 来说很常见,因此无法解决由于覆盖导致的这些错误。
因此,启用了 DIF/DIX 的块设备应仅与使用 O_DIRECT 的应用一起使用。此类应用应使用裸块设备。或者,只要通过文件系统发布 O_DIRECT I/O,在启用了 DIF/DIX 的块设备上使用 XFS 文件系统也很安全。XFS 是唯一在执行某些分配操作时不会回退到缓冲的 I/O 的文件系统。
确保在计算 DIF/DIX 校验和后 I/O 数据不会发生变化,因此只有设计用于 O_DIRECT I/O 和 DIF/DIX 硬件的应用程序应使用 DIF/DIX。

第 12 章 文件系统检查

可以使用特定于文件系统的用户空间工具检查文件系统的一致性,并选择性地进行修复。这些工具通常被称为 fsck 工具,其中 fsck文件系统检查 的简化版本。
注意
这些文件系统检查程序只保证跨文件系统的元数据的一致性;它们不知道文件系统中包含的实际数据,且不是数据恢复工具。
发生文件系统不一致的原因可能有多种,包括但不限于硬件错误、存储管理错误和软件 bug 。
在现代元数据日志文件系统变得常见之前,每当系统崩溃或断电时,都需要进行文件系统检查。这是因为文件系统更新可能已被中断,从而导致状态不一致。因此,通常会在启动时在 /etc/fstab 中列出的每个文件系统上运行文件系统检查。对于日志记录文件系统,这通常是一个非常短的操作,因为即使崩溃,文件系统的元数据日志也会确保一致性。
但是,有时可能会出现文件系统不一致或损坏,即使日志记录文件系统也是如此。发生这种情况时,必须使用文件系统检查程序来修复文件系统。以下提供了执行此流程时的最佳实践和其他有用信息。
重要
除非机器没有引导,否则红帽不推荐这样做,否则文件系统非常大,或者文件系统位于远程存储中。通过将 /etc/fstab 中的第六个字段设置为 0,可以在引导时禁用文件系统检查。

12.1. fsck 的最佳实践

通常,运行文件系统检查和修复工具至少可以自动修复发现的一些不一致问题。在某些情况下,如果无法修复严重损坏的 inode 或目录,可能会将它们丢弃。可能会对文件系统进行大量更改。要确保意外或不必要的更改不会永久发生,请执行以下预防步骤:
空运行
大多数文件系统检查程序都有一个操作模式,用于检查但不修复文件系统。在这个模式中,检查程序会输出它发现的任何错误以及它所执行的操作,而无需实际修改文件系统。
注意
稍后一致性检查阶段可能会打印额外的错误,因为在修复模式下运行时,它会发现可能在早期阶段已经修复了的不一致问题。
首先对文件系统镜像进行操作
大多数文件系统都支持创建 元数据镜像,这是仅包含元数据的文件系统的稀疏副本。由于文件系统检查程序仅在元数据上运行,因此此类镜像可用于对实际文件系统修复执行空运行,以评估实际要进行的更改。如果更改可以接受,则可以对文件系统本身进行修复。
注意
严重损坏的文件系统可能会导致元数据镜像创建出现问题。
保存文件系统镜像以进行支持调查
如果因为软件错误导致损坏,则预修复文件系统元数据镜像通常有助于支持调查。修复前镜像中存在的损坏模式可能有助于根本原因的分析。
仅在卸载的文件系统上运行
文件系统修复必须只在卸载的文件系统上运行。该工具必须具有对文件系统的唯一访问权限,或者可能导致进一步的损坏。大多数文件系统工具在修复模式下强制实施这个要求,虽然有些文件系统只支持在挂载的文件系统中只检查模式。如果在挂载的文件系统上运行只检查模式,则可能发现在卸载的文件系统上运行时未找到的错误。
磁盘错误
文件系统检查工具不能修复硬件问题。如果修复操作成功,文件系统必须是完全可读写的。如果文件系统因为硬件错误而损坏,则必须首先将文件系统移至良好磁盘,例如使用 dd (8) 工具。

12.2. fsck 的文件系统特定信息

12.2.1. ext2、ext3 和 ext4

所有这些文件 sytems 使用 e2fsck 二进制文件来执行文件系统检查和修复。文件名 fsck.ext2、 fsck.ext3fsck.ext4 是同一二进制文件的硬链接。这些二进制文件在引导时自动运行,其行为因正在检查的文件系统和文件系统的状态而异。
对于不是元数据日志记录文件系统的 ext2 和没有日志的 ext4 文件系统,会调用完整的文件系统检查和修复。
对于带有元数据日志的 ext3 和 ext4 文件系统,日志会在用户空间中重新执行,二进制文件会退出。这是默认操作,因为日志重播可确保崩溃后文件系统的一致性。
如果这些文件系统在挂载时遇到元数据不一致的情况,它们会在文件系统超级块中记录此事实。如果 e2fsck 发现文件系统标记为此类错误,e2fsck 会在重播日志(如果存在)后执行完整检查。
如果未指定 -p 选项,e2fsck 可能会在运行期间要求用户输入。p 选项告知 e2fsck 自动执行所有可以安全完成的修复。如果需要用户干预,e2fsck 会在其输出中指示未修复的问题,并在退出代码中反映此状态。
常用的 e2fsck 运行时选项包括:
-n
无修改模式.仅检查操作.
-b superblock
如果主块被损坏,请指定备用的 suprerblock 的块数。
-f
如果超级块没有记录的错误,也强制进行全面检查。
-j journal-dev
指定外部日志设备(若有的话)。
-p
自动修复或"复制"文件系统,无需用户输入。
-y
假设所有问题的答案都为"是"。
e2fsck 的所有选项都在 e2fsck (8) 手册页中指定。
e2fsck 在运行时执行以下五个基本阶段:
  1. Inode、块和大小检查.
  2. 目录结构检查。
  3. 目录连接性检查。
  4. 参考计数检查。
  5. 组摘要信息检查。
e2image (8) 工具可用于在修复前创建元数据镜像,以进行诊断或测试。-r 选项用于测试目的,以便创建与文件系统本身大小相同的稀疏文件。然后 e2fsck 可以直接对生成的文件进行操作。如果要存档或提供用于诊断的镜像,则应指定 -Q 选项。这会创建更精简的文件格式,适合传输。

12.2.2. XFS

在引导时不自动执行任何修复。要启动文件系统检查或修复,请使用 xfs_repair 工具。
注意
虽然 xfsprogs 软件包中存在 fsck.xfs 二进制文件,但这仅用于满足在启动时查找 fsck 的 initscripts。文件系统 二进制文件。fsck.xfs 立即退出,退出代码为 0。
旧的 xfsprogs 软件包包含一个 xfs_check 工具。这个工具非常慢,对于大型文件系统无法很好地扩展。因此,它已被 xfs_repair -n 替代。
xfs_repair 需要文件系统上的干净日志才能运行。如果没有完全卸载文件系统,则应在使用 xfs_repair 之前挂载和卸载文件系统。如果日志损坏且无法重新执行,则使用 -L 选项可将日志归零。
重要
只有无法重新执行日志时,必须使用 -L 选项。选项丢弃日志中的所有元数据更新,并产生进一步的不一致。
可以使用 -n 选项,以空运行(仅检查)模式运行 xfs_repair。指定此选项时,不会对文件系统进行任何更改。
xfs_repair 使用非常少的选项。常用的选项包括:
-n
无修改模式。仅检查操作.
-L
将元数据日志归零。仅当无法通过 mount 重新执行日志时才使用。
-m maxmem
将运行期间使用的内存限制为 maxmem MB。可以指定 0 来粗略估算所需的最小内存。
-l logdev
如果存在,指定外部日志设备。
xfs_repair 的所有选项都在 xfs_repair (8) 手册页中指定。
xfs_repair 在运行时执行以下八个基本阶段:
  1. inode 和 inode 块映射(寻址)检查.
  2. inode 分配映射检查。
  3. inode 大小检查。
  4. 目录检查。
  5. 路径名称检查。
  6. 链接数检查。
  7. 空闲映射检查。
  8. 超级块检查。
如需更多信息,请参阅 xfs_repair (8) 手册页。
xfs_repair 不是交互式的。所有操作都自动执行,无需用户输入。
如果需要在修复前为诊断或测试目的创建元数据镜像,则可以使用 xfs_metadump (8)xfs_mdrestore (8) 工具。

12.2.3. Btrfs

注意
Btrfs 在 Red Hat Enterprise Linux 7 中作为技术预览功能提供,但自 Red Hat Enterprise Linux 7.4 发行版本起已被弃用。它将在以后的 Red Hat Enterprise Linux 主发行版本中删除。
如需更多信息,请参阅 Red Hat Enterprise Linux 7.4 发行注记中的 已弃用的功能
btrfsck 工具用于检查和修复 btrfs 文件系统。此工具仍处于早期开发阶段,可能无法检测或修复所有类型的文件系统损坏。
默认情况下,btrfsck 不会对文件系统进行更改;也就是说,它默认运行仅检查模式。如果需要修复,则必须指定 --repair 选项。
btrfsck 在运行时执行以下三个基本阶段:
  1. 扩展检查。
  2. 文件系统 root 检查。
  3. 根参考计数检查。
btrfs-image (8) 工具可用于在修复前创建元数据镜像,以进行诊断或测试。

第 13 章 分区

注意
有关在块设备上使用分区的优缺点的概述,请参阅以下 KBase 文章: https://access.redhat.com/solutions/163853
使用 parted 工具,您可以:
  • 查看现有的分区表。
  • 更改现有分区的大小。
  • 从可用空间或其他硬盘添加分区。
parted 软件包默认安装在 Red Hat Enterprise Linux 7 中。要启动 parted,以 root 用户身份登录并输入以下命令:
# parted /dev/sda
使用要配置的驱动器的设备名称替换 /dev/sda

使用中的设备处理分区

对于不在使用中的设备,设备上的任何分区都不能挂载,且无法启用该设备上的交换空间。
如果要删除或调整分区大小,则该分区所在的设备不能处于使用中。
可以在正在使用的设备上创建新分区,但不建议这样做。

修改分区表

通常不建议使用同一磁盘上的另一个分区修改分区表,因为内核无法重新读取分区表。因此,更改不会应用到正在运行的系统。在上述情况下,重启系统,或者使用以下命令使系统注册新的或修改的分区:
# partx --update --nr partition-number disk
修改当前使用的磁盘的最简单方法是:
  1. 如果磁盘中的分区无法卸载,则以救援模式引导系统,例如在系统磁盘的情况下。
  2. 当提示挂载文件系统时,请选择 Skip
如果驱动器不包含任何正在使用的分区,没有系统进程使用或锁定文件系统,您可以使用 umount 命令卸载分区,并使用 swapoff 命令关闭硬盘驱动器上的所有交换空间。
要查看常用的 parted 命令,请参阅 表 13.1 “parted 命令”
重要
不要使用 parted 实用程序来创建文件系统。改为使用 mkfs 工具。

表 13.1. parted 命令

命令 描述
帮助 显示可用命令列表
mklabel label 为分区表创建磁盘标签
mkpart part-type [fs-type] start-mb end-mb 在不创建新文件系统的情况下创建分区
name minor-num name 只为 Mac 和 PC98 磁盘标签命名分区
print 显示分区表
quit 退出 parted
rescue start-mb end-mb 抢救丢失的分区(从 Start-mbend-mb
rm minor-num 删除分区
选择设备 选择要配置的其他设备
set minor-num flag state 在分区中设置标志 ; state 为 on 或 off
toggle [NUMBER [FLAG] 切换分区 NUMBER上的 FLAG 状态
unit UNIT 将默认单位设置为 UNIT

13.1. 查看分区表

查看分区表:
  1. 启动 parted
  2. 使用以下命令查看分区表:
    (parted) print
此时会出现类似如下的表:

例 13.1. 分区表

Model: ATA ST3160812AS (scsi)
Disk /dev/sda: 160GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End    Size    Type      File system  Flags
 1      32.3kB  107MB  107MB   primary   ext3         boot
 2      107MB   105GB  105GB   primary   ext3
 3      105GB   107GB  2147MB  primary   linux-swap
 4      107GB   160GB  52.9GB  extended		      root
 5      107GB   133GB  26.2GB  logical   ext3
 6      133GB   133GB  107MB   logical   ext3
 7      133GB   160GB  26.6GB  logical                lvm
以下是分区表的描述:
  • 模型:ATA ST3160812AS (scsi) :解释磁盘类型、制造商、型号号和接口。
  • 磁盘 /dev/sda: 160GB :显示块设备和存储容量的文件路径。
  • partition Table: msdos: 显示磁盘标签类型。
  • 在分区表中,Number 是分区号。例如,次号 1 的分区对应于 /dev/sda1StartEnd 值以 MB 为单位。有效的 Types 是 metadata, free, primary, extended, or logical。File system 是文件系统类型。Flags 列中列出了为分区设置的标志。可用的标志有 boot、root、swap、hidden、raid、lvm 或 lba。
分区表中的 File system 可以是以下任意一种:
  • ext2
  • ext3
  • fat16
  • fat32
  • hfs
  • jfs
  • linux-swap
  • ntfs
  • reiserfs
  • hp-ufs
  • sun-ufs
  • xfs
如果设备的 File system 没有显示值,这意味着其文件系统类型未知。
注意
要在不需要重启 parted 的情况下选择不同的设备,请使用以下命令,并将 /dev/sda 替换为您要选择的设备:
(parted) select /dev/sda
它允许您查看或配置设备的分区表。

13.2. 创建分区

警告
不要试图在正在使用的设备上创建分区。

过程 13.1. 创建分区

  1. 在创建分区前,引导进入救援模式,或者卸载该设备中的任何分区,并关闭该设备上的任何交换空间。
  2. 启动 parted
    # parted /dev/sda
    使用您要在其上创建分区的设备名称替换 /dev/sda
  3. 查看当前的分区表来确定是否有足够空闲空间:
    (parted) print
    如果没有足够的可用空间,您可以调整现有分区的大小。如需更多信息,请参阅 第 13.5 节 “使用 fdisk 重新定义分区大小”
    通过分区表来确定新分区的开始点和结束点,以及它的分区类型。在一个设备上只能有四个主分区(没有扩展分区)。如果您需要四个以上的分区,您可以有三个主分区、一个扩展分区,以及扩展分区中的多个逻辑分区。有关磁盘分区的概述,请参阅 Red Hat Enterprise Linux 7 安装指南 中的 磁盘分区简介 附录。
  4. 创建分区:
    (parted) mkpart part-type name fs-type start end
    根据您的要求,将 part-type 替换为 primary、logical 或 extended。
    使用分区名称替换 name ;GPT 分区表需要 name。
    使用 btrfs、ext2、ext3、ext4、fat16、fat32、hfs、hfs+、linux-swap、ntfs、reiserfs 或 xfs; fs-type 之一替换 fs-type。
    根据您的要求,将 start 以 MB 为单位表示。
    例如,要在硬盘上创建从 1024MB 到 2048 MB 的 ext3 文件系统的主分区,请输入以下命令:
    (parted) mkpart primary 1024 2048
    注意
    如果您使用 mkpartfs 命令,文件系统会在分区创建后创建。但是 parted 不支持创建 ext3 文件系统。因此,如果要创建 ext3 文件系统,请使用 mkpart 并使用 mkfs 命令创建文件系统,如稍后所述。
    Enter 键后,这些更改就会生效,因此请在执行前检查命令。
  5. 使用以下命令,查看分区表以确认创建的分区位于分区表中,并具有正确的分区类型、文件系统类型和大小:
    (parted) print
    还请记住新分区的次要号,以便您可以在其上面标记任何文件系统。
  6. 退出 parted shell:
    (parted) quit
  7. 在 parted 关闭后使用以下命令,以确保内核识别新分区:
    # cat /proc/partitions 
parted 可以创建的最大分区数为 128。尽管 GUID 分区表 (GPT)规范通过增加为分区表保留的区域来允许更多的分区,但 parted 的常见做法是将其限制为足够容纳 128个 分区的区域。

13.2.1. 格式化和标记分区

要格式化和标记分区,请使用以下流程:

过程 13.2. 格式化和标记分区

  1. 分区没有文件系统。要创建 ext4 文件系统,请使用:
    # mkfs.ext4 /dev/sda6
    警告
    格式化分区会永久销毁分区上当前存在的任何数据。
  2. 标记分区中的文件系统。例如:如果新分区中的文件系统是 /dev/sda6,而您想要将其标记为 Work,请使用:
    # e2label /dev/sda6 "Work"
    默认情况下,安装程序使用分区挂载点作为标签,以确保标签是唯一的。您可以使用您想要的任何标签。
  3. 以 root 身份创建挂载点(如 /work)。

13.2.2. 将分区添加到 /etc/fstab

  1. 以 root 用户身份,编辑 /etc/fstab 文件,以使用分区的 UUID 包含新分区。
    使用命令 blkid -o list 获取分区 UUID 的完整列表,或使用 blkid 设备 获取单个设备详情。
    /etc/fstab 中:
    • 第一列应当包含 UUID=,后跟文件系统的 UUID。
    • 第二列应包含新分区的挂载点。
    • 第三列应为文件系统类型:例如 ext4swap
    • 第四列列出了文件系统的挂载选项。此处的单词 defaults 表示分区在引导时使用默认选项挂载。
    • 第五个字段和第六个字段指定 backup 和 check 选项。非 root 分区的值示例为 0 2
  2. 重新生成挂载单元以便您的系统注册新配置:
    # systemctl daemon-reload
  3. 尝试挂载文件系统来验证配置是否正常工作:
    # mount /work

其它信息

  • 如果您需要有关 /etc/fstab 格式的更多信息,请参阅 fstab(5) man page。

13.3. 删除分区

警告
不要试图删除正在使用的设备上的分区。

过程 13.3. 删除分区

  1. 在删除分区前,请执行以下操作之一:
    • 引导至救援模式,或者
    • 卸载该设备中的任何分区,并关闭该设备上的任何交换空间。
  2. 启动 parted 工具:
    # parted device
    使用删除分区的设备替换 device :例如 /dev/sda
  3. 查看当前的分区表以确定要删除的分区的次号:
    (parted) print
  4. 使用命令 rm 删除分区。例如:要删除次要号为 3 的分区:
    (parted) rm 3
    Enter 键后,这些更改就会生效,因此请在提交前检查命令。
  5. 删除分区后,使用 print 命令确认它已从分区表中删除:
    (parted) print
  6. parted shell 退出:
    (parted) quit
  7. 检查 /proc/partitions 文件的内容,以确保内核知道分区已被删除:
    # cat /proc/partitions
  8. /etc/fstab 文件中删除分区。找到声明删除的分区的行,并将其从文件中删除。
  9. 重新生成挂载单元,以便您的系统注册新的 /etc/fstab 配置:
    # systemctl daemon-reload

13.4. 设置分区类型

运行的系统很少使用分区类型,而不是与文件系统类型混淆。但是,分区类型对于 on-the-fly 生成器很重要,如 systemd-gpt-auto-generator,它使用分区类型来自动识别和挂载设备。
您可以启动 fdisk 工具,并使用 t 命令设置分区类型。以下示例演示了如何将第一个分区的分区类型改为 0x83,在 Linux 中默认:
# fdisk /dev/sdc
Command (m for help): t
Selected partition 1
Partition type (type L to list all types): 83
Changed type of partition 'Linux LVM' to 'Linux'.
parted 工具尝试将分区类型映射到"flags" (对最终用户来说并不方便)来提供一些分区类型控制。parted 工具只能处理某些分区类型,如 LVM 或 RAID。例如,要使用 parted 从第一个分区中删除 lvm 标志,请使用:
# parted /dev/sdc 'set 1 lvm off'
有关常用分区类型和用于代表它们的十六进制数字的列表,请查看分区中的分区类型表 Red Hat Enterprise Linux 7 安装指南 的"打开 One Drive Into Many Appendix"部分。

13.5. 使用 fdisk 重新定义分区大小

fdisk 实用程序允许您创建和操作 GPT、R MBR、SGI 和 BSD 分区表。建议在带有 GUID 分区表(GPT)的磁盘上,建议使用 parted 工具,因为 fdisk GPT 支持处于实验性阶段。
在调整分区大小前,备份 文件系统中存储的数据并测试流程,因为使用 fdisk 更改分区大小的唯一方法是通过删除和重新创建分区。
重要
您大小的分区必须是特定磁盘上的最后一个分区。
红帽只支持扩展和重新定义 LVM 分区大小。

过程 13.4. 调整分区大小

以下过程仅提供 reference. follows 使用 fdisk 调整分区大小:
  1. 卸载该设备:
    # umount /dev/vda
  2. 运行 fdisk disk_name。例如:
    # fdisk /dev/vda
    Welcome to fdisk (util-linux 2.23.2).
    
    Changes will remain in memory only, until you decide to write them. Be careful before using the write command.
    
    Command (m for help):
    
  3. 使用 p 选项确定要删除的分区的行号。
    Command (m for help): p
    Disk /dev/vda: 16.1 GB, 16106127360 bytes, 31457280 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x0006d09a
    
    Device    Boot      Start         End      Blocks   Id  System
    /dev/vda1   *        2048     1026047      512000   83  Linux
    /dev/vda2         1026048    31457279    15215616   8e  Linux LVM
    
  4. 使用 d 选项删除分区。如果有多个分区可用,fdisk 会提示您提供要删除的多个分区:
    Command (m for help): d
    Partition number (1,2, default 2): 2
    Partition 2 is deleted
    
  5. 使用 n 选项创建分区并按照提示进行操作。允许足够空间以供将来重新定义大小。fdisk 默认行为(按 Enter)是使用设备上的所有空间。您可以根据扇区指定分区的结束,或使用 + <size> <suffix&gt; 指定人类可读的大小,如 +500M 或 +10G。
    如果您不想使用所有可用空间,红帽建议使用人类可读的大小规格,因为 fdisk 将分区的末尾与物理扇区一致。如果您通过提供准确数字(扇区)来指定大小,fdisk 不会对齐分区的末尾。
    Command (m for help): n
    Partition type:
       p   primary (1 primary, 0 extended, 3 free)
       e   extended
    Select (default p): *Enter*
    Using default response p
    Partition number (2-4, default 2): *Enter*
    First sector (1026048-31457279, default 1026048): *Enter*
    Using default value 1026048
    Last sector, +sectors or +size{K,M,G} (1026048-31457279, default 31457279): +500M
    Partition 2 of type Linux and of size 500 MiB is set
    
  6. 将分区类型设置为 LVM:
    Command (m for help): t
    Partition number (1,2, default 2): *Enter*
    Hex code (type L to list all codes): 8e
    Changed type of partition 'Linux' to 'Linux LVM'
    
  7. 当您确定更改正确时,使用 w 选项写入更改,因为错误可能会导致所选分区不稳定。
  8. 在设备上运行 e2fsck 来检查一致性:
    # e2fsck /dev/vda
    e2fsck 1.41.12 (17-May-2010)
    Pass 1:Checking inodes, blocks, and sizes
    Pass 2:Checking directory structure
    Pass 3:Checking directory connectivity
    Pass 4:Checking reference counts
    Pass 5:Checking group summary information
    ext4-1:11/131072 files (0.0% non-contiguous),27050/524128 blocks
    
  9. 挂载该设备:
    # mount /dev/vda
如需更多信息,请参阅 fdisk(8) 手册页。

第 14 章 使用 Snapper 创建和维护快照

快照卷是目标卷的时间副本中的一个点,它提供了一种将文件系统恢复到之前的状态的方法。snapper 是一个命令行工具,用于为 Btrfs 和精简配置的 LVM 文件系统创建和维护快照。

14.1. 创建 Initial Snapper 配置

snapper 需要每个在其上运行的卷的离散配置文件。您必须手动设置配置文件。默认情况下,只允许 root 用户执行 snapper 命令。
警告
如果您使用精简配置,请监控 thin-pool 中的可用空间。完全消耗的精简池可能会导致数据丢失。如需更多信息,请参阅 Red Hat Enterprise Linux 7 Logical Volume Manager Administration Guide 中的 Thinly-Provisioned Logical Volumes (Thin Volumes)
请注意,Btrfs 工具和文件系统作为技术预览提供,这使得它们不适合生产系统。
虽然允许 root 以外的用户或组使用某些 Snapper 命令,但 红帽建议您不要 向其他非特权用户或组群添加升级的权限。这种配置会绕过 SELinux,并可能导致安全风险。红帽建议您与安全团队审核这些功能,并考虑使用 sudo 基础架构。
注意
Btrfs 在 Red Hat Enterprise Linux 7 中作为技术预览功能提供,但自 Red Hat Enterprise Linux 7.4 发行版本起已被弃用。它将在以后的 Red Hat Enterprise Linux 主发行版本中删除。
如需更多信息,请参阅 Red Hat Enterprise Linux 7.4 发行注记中的 已弃用的功能

过程 14.1. 创建 Snapper 配置文件

  1. 创建或选择:
    • 一个精简配置的逻辑卷,它有一个红帽支持的文件系统,或者
    • Btrfs 子卷。
  2. 挂载文件系统。
  3. 创建定义此卷的配置文件。
    对于 LVM2:
    # snapper -c config_name create-config -f "lvm(fs_type)" /mount-point
    例如,要使用 ext4 文件系统(挂载于 /lvm_mount)在 LVM2 子卷上创建一个名为 lvm_config 的配置文件,请使用:
    # snapper -c lvm_config create-config -f "lvm(ext4)" /lvm_mount
    对于 Btrfs:
    # snapper -c config_name create-config -f btrfs /mount-point
    • -c config_name 选项指定配置文件的名称。
    • create-config 告知 snapper 创建配置文件。
    • f file_system 告知 snapper 要使用的文件系统;如果忽略了 snapper,则尝试检测文件系统。
    • /mount-point 是挂载子卷或精简配置的 LVM2 文件系统的位置。
    或者,要在挂载到 /btrfs_mount 的 Btrfs 子卷上创建一个名为 btrfs_config 的配置文件,请使用:
    # snapper -c btrfs_config create-config -f btrfs /btrfs_mount
配置文件存储在 /etc/snapper/configs/ 目录中。

14.2. 创建 Snapper 快照

snapper 可以创建以下类型的快照:
pre Snapshot
pre 快照充当后快照的原始卷。这两个操作都紧密关联,旨在跟踪两个点之间的文件系统修改。必须在创建快照前创建预快照。
后快照
post 快照充当预快照的端点。组合 pre 和 post 快照定义了要比较的范围。默认情况下,每个新 snapper 卷都配置为在成功创建相关后创建快照后创建后台比较。
单个快照
单个快照是在特定时间创建的独立快照。它们可用于跟踪修改时间表,并具有以后返回的一般点。

14.2.1. 创建 Pre 和 Post Snapshot Pair

14.2.1.1. 使用 Snapper 创建 Pre Snapshot

要创建预快照,请使用:
# snapper -c config_name create -t pre
-c config_name 选项根据指定配置文件中的规格创建快照。如果配置文件尚不存在,请参阅 第 14.1 节 “创建 Initial Snapper 配置”
create -t 选项指定要创建的快照类型。接受的条目为 prepostsingle
例如,要使用 lvm_config 配置文件创建预快照,如 第 14.1 节 “创建 Initial Snapper 配置” 中创建,请使用:
# snapper -c SnapperExample create -t pre -p
1
-p 选项打印创建快照的数量,并是可选的。

14.2.1.2. 使用 Snapper 创建 Post Snapshot

post 快照是快照的端点,应该按照 第 14.2.1.1 节 “使用 Snapper 创建 Pre Snapshot” 中的说明在父预快照后创建。

过程 14.2. 创建后快照

  1. 确定预快照的数量:
    # snapper -c config_name list
    例如,要显示使用配置文件 lvm_config 创建的快照列表,请使用:
    # snapper -c lvm_config list
    Type   | # | Pre # | Date              | User | Cleanup  | Description | Userdata
    -------+---+-------+-------------------+------+----------+-------------+---------
    single | 0 |       |                   | root |          | current     |
    pre    | 1 |       | Mon 06<...>       | root |          |             |
    
    此输出显示预快照为数字 1。
  2. 创建链接到之前创建的预快照的后快照:
    # snapper -c config_file create -t post --pre-num pre_snapshot_number
    • t post 选项指定创建快照类型的创建。
    • --pre-num 选项指定对应的 pre snapshot。
    例如,要使用 lvm_config 配置文件创建后快照并链接到预快照号 1,请使用:
    # snapper -c lvm_config create -t post --pre-num 1 -p
    2
    
    -p 选项打印创建快照的数量,并是可选的。
  3. 现在创建并配对了 pre 和 post 快照 1 和 2。使用 list 命令验证:
    # snapper -c lvm_config list
    Type   | # | Pre # | Date              | User | Cleanup  | Description | Userdata
    -------+---+-------+-------------------+------+----------+-------------+---------
    single | 0 |       |                   | root |          | current     |
    pre    | 1 |       | Mon 06<...>       | root |          |             |
    post   | 2 | 1     | Mon 06<...>       | root |          |             |
    

14.2.1.3. 在 Pre 和 Post Snapshots 中嵌套命令

您还可以在预快照和后快照中嵌套命令,这在测试时很有用。请参阅 过程 14.3, “在 Pre 和 Post Snapshots 中嵌套命令”,它是以下步骤的快捷方式:
  1. 运行 snapper create pre snapshot 命令。
  2. 运行命令或命令列表,以对文件系统内容有可能的影响。
  3. 运行 snapper create post snapshot 命令。

过程 14.3. 在 Pre 和 Post Snapshots 中嵌套命令

  1. 在预快照和后快照中嵌套命令:
    # snapper -c lvm_config create --command "command_to_be_tracked"
    例如,要跟踪 /lvm_mount/hello_file 文件的创建:
    # snapper -c lvm_config create --command "echo Hello > /lvm_mount/hello_file"
  2. 要验证这一点,请使用 status 命令:
    # snapper -c config_file status first_snapshot_number..second_snapshot_number
    例如,要跟踪第一步中所做的更改:
    # snapper -c lvm_config status 3..4
    +..... /lvm_mount/hello_file
    
    如果需要,使用 list 命令验证快照的数量。
    有关 status 命令的详情请参考 第 14.3 节 “跟踪 Snapper Snapshots 间的更改”
请注意,给定示例中 命令不能保证快照捕获的唯一内容。snapper 还记录系统修改的任何内容,而不仅仅是用户修改的内容。

14.2.2. 创建单个 Snapper 快照

创建单个 snapper 快照与创建预快照或后快照类似,只有 create -t 选项指定单个。单个快照用于随着时间的推移创建单个快照,而不与任何其他快照相关。但是,如果您想创建 LVM2 精简卷的快照,而无需自动生成比较或列出附加信息,红帽建议为此使用 System Storage Manager 而不是 Snapper,如 第 16.2.6 节 “Snapshot” 所述。
要创建单个快照,请使用:
# snapper -c config_name create -t single
例如,以下命令使用 lvm_config 配置文件创建单个快照。
# snapper -c lvm_config create -t single
虽然单个快照没有专门设计来跟踪更改,但您可以使用 snapper diffxadiffstatus 命令比较任何两个快照。有关这些命令的详情请参考 第 14.3 节 “跟踪 Snapper Snapshots 间的更改”

14.2.3. 配置 Snapper 以获取自动化快照

进行自动快照是 Snapper 的主要功能之一。默认情况下,当您为卷配置 Snapper 时,Snapper 会每小时开始对卷执行快照。
在默认配置下,Snapper 保留:
  • 10 每小时快照,最终每小时快照保存为"每天"快照。
  • 10 个每日快照,一个月的最终每日快照会保存为"月"快照。
  • 10 个月快照,最终每月快照保存为"每年"快照。
  • 10 年快照。
请注意,Snapper 默认不会超过 50 个快照。但是,Snapper 默认保留在 1,800 秒以前创建的所有快照。
默认配置在 /etc/snapper/config-templates/default 文件中指定。当您使用 snapper create-config 命令创建配置时,会根据默认配置设置任何未指定的值。您可以编辑 /etc/snapper/configs/config_name 文件中任何定义的卷的配置。

14.3. 跟踪 Snapper Snapshots 间的更改

使用 状态diffxadiff 命令来跟踪在快照之间对子卷所做的更改:
status
status 命令显示在两个快照之间创建、修改或删除的文件和目录列表,这是两个快照之间更改的完整列表。您可以使用此命令获得更改的概述,而无需过量详情。
diff
如果至少检测到一次修改,则 diff 命令显示从 status 命令接收的两个快照之间的修改文件和目录差异。
xadiff
xadiff 命令比较两个快照之间文件或目录的扩展属性变化。

14.3.1. 将更改与 status 命令进行比较

status 命令显示在两个快照之间创建、修改或删除的文件和目录列表。
要显示两个快照之间的文件状态,请使用:
# snapper -c config_file status first_snapshot_number..second_snapshot_number
如果需要,使用 list 命令确定快照号。
例如,以下命令使用配置文件 lvm_config 显示快照 1 和 2 之间所做的更改。
#snapper -c lvm_config status 1..2
tp.... /lvm_mount/dir1
-..... /lvm_mount/dir1/file_a
c.ug.. /lvm_mount/file2
+..... /lvm_mount/file3
....x. /lvm_mount/file4
cp..xa /lvm_mount/file5
作为列,将输出的第一个部分中的字母和点读为:
+..... /lvm_mount/file3
||||||
123456
列 1 表示对文件(目录条目)类型的任何修改。可能的值有:
列 1
输出含义
.没有改变。
+文件已创建。
-删除文件。
c内容更改。
t目录条目的类型已更改。例如,前一个符号链接已更改为具有相同文件名的常规文件。
列 2 表示文件权限中的任何更改。可能的值有:
列 2
输出含义
.没有更改权限。
p更改了权限。
列 3 表示用户所有权的任何更改。可能的值有:
列 3
输出含义
.没有更改用户所有权。
u用户所有权已更改。
列 4 表示组所有权的任何更改。可能的值有:
列 4
输出含义
.没有更改组所有权。
g组所有权已更改。
列 5 表示扩展属性中的任何更改。可能的值有:
列 5
输出含义
.没有更改扩展属性。
x扩展属性已更改。
列 6 表示访问控制列表(ACL)中的任何更改。可能的值有:
列 6
输出含义
.没有更改 ACL。
a修改 ACL。

14.3.2. 将更改与 diff 命令进行比较

diff 命令显示两个快照之间修改的文件和目录的更改。
# snapper -c config_name diff first_snapshot_number..second_snapshot_number
如果需要,使用 list 命令确定快照的数量。
例如,要比较使用 lvm_config 配置文件在快照 1 和快照 2 之间所做的更改,请使用:
# snapper -c lvm_config diff 1..2
--- /lvm_mount/.snapshots/13/snapshot/file4	19<...>
+++ /lvm_mount/.snapshots/14/snapshot/file4	20<...>
@@ -0,0 +1 @@
+words
此输出显示 file4 已被修改,以将"词语"添加到文件中。

14.3.3. 将更改与 xadiff 命令进行比较

xadiff 命令比较文件或目录的扩展属性在两个快照之间变化的方式:
# snapper -c config_name xadiff first_snapshot_number..second_snapshot_number
如果需要,使用 list 命令确定快照的数量。
例如,要显示使用 lvm_config 配置文件执行的快照号 1 和快照号 2 之间的 xadiff 输出,请使用:
# snapper -c lvm_config xadiff 1..2

14.4. 在快照之间撤销更改

要在两个现有的 Snapper 快照之间反向更改,请使用 undochange 命令,其中 1 是第一个快照,2 是第二个快照:
snapper -c config_name undochange 1..2
重要
使用 undochange 命令不会将 Snapper 卷恢复到其原始状态,且不会提供数据一致性。任何在指定范围之外的文件修改(如快照 2 后)将在恢复后保持不变,例如快照 1 的状态。例如,如果运行 undochange 来撤销用户的创建,则该用户拥有的任何文件仍然可以保留。
此外,也没有保证文件一致性为快照的机制,因此使用 undochange 命令时,已存在的任何不一致的不一致都将传输回快照。
不要将 Snapper undochange 命令与 root 文件系统一起使用,因为这样做可能会导致失败。
下图显示了 undochange 命令如何工作:

图 14.1. snapper Status over Time

snapper Status over Time
图中显示了创建 snapshot_1 的时间点,创建 file_a,然后删除 file_b。然后,会创建 Snapshot_2,之后编辑 file_a 并创建了 file_c。现在,这是系统的当前状态。当前系统具有 file_a 的编辑版本,无 file_b 以及新创建的 file_c
当调用 undochange 命令时,Snapper 会在第一个列出的快照和第二个快照之间生成修改的文件列表。在图中,如果您使用 snapper -c SnapperExample undochange 1..2 命令,Snapper 会创建修改的文件列表(即 file_a 已创建;删除了 file_b ),并将其应用到当前的系统。因此:
  • 当前系统没有 file_a,因为它必须在 snapshot_1 创建时创建。
  • file_b 将存在,从 snapshot_1 复制到当前系统。
  • file_c 将存在,因为它的创建是在指定时间之外。
请注意,如果 file_bfile_c 冲突,系统可能会损坏。
您还可以使用 snapper -c SnapperExample undochange 2..1 命令。在这种情况下,当前系统会将 edit 的 file_a 版本替换为从 snapshot_1 复制的版本,这会撤销在创建 snapshot_2 后对该文件的编辑。

使用 mount 和 unmount 命令反向更改

undochange 命令并不总是是恢复修改的最佳方法。使用 statusdiff 命令,您可以做出合格的决定,并使用 mountunmount 命令而不是 Snapper。只有在您要挂载快照并浏览独立于 Snapper 工作流的内容时,mountunmount 命令才有用。
如果需要,mount 命令在挂载前激活相应的 LVM Snapper 快照。例如,如果您有兴趣挂载快照并手动提取多个文件的旧版本,请使用 mountunmount 命令。要手动恢复文件,请将它们从挂载的快照复制到当前文件系统中。当前文件系统,快照 0 是 过程 14.1, “创建 Snapper 配置文件” 中创建的实时文件系统。将文件复制到原始 /mount-point 的子树中。
对于显式客户端请求,使用 mountunmount 命令。/etc/snapper/configs/config_name 文件包含 ALLOW_USERS= 和 ALLOW_GROUPS= 变量,您可以在其中添加用户和组。然后,snapper d 允许您为添加的用户和组执行挂载操作。

14.5. 删除 Snapper 快照

删除快照:
# snapper -c config_name delete snapshot_number
您可以使用 list 命令验证快照是否已成功删除。

第 15 章 swap 空间

当物理内存(RAM)已满时,将使用 Linux 中的 交换空间。如果系统需要更多的内存资源并且 RAM 已满,内存中的不活动页面将移到交换空间。虽然交换空间可以帮助具有少量 RAM 的计算机,但不应将其视为更多 RAM 的替代品。交换空间位于硬盘驱动器上,其访问时间比物理内存要慢。交换空间可以是专用的交换分区(推荐)、交换文件,或者交换分区和交换文件的组合。请注意,Btrfs 不支持 swap 空间。
过去数年,推荐的 swap 空间会随系统中的 RAM 量增加而线性增大。然而,现代系统通常包含了成百 GB 内存。因此,推荐的交换空间被视为系统内存工作负载的功能,而不是系统内存的功能。
表 15.1 “推荐的系统交换空间” 根据系统中的 RAM 量以及是否有足够的内存供系统休眠显示推荐的交换分区的大小。推荐的 swap 分区会在安装过程中自动建立。但是,为了允许休眠,您需要在自定义分区阶段编辑交换空间。
表 15.1 “推荐的系统交换空间” 中的建议对于内存不足的系统(1 GB 及更少)尤为重要。无法在这些系统中分配足够 swap 空间可能会导致问题,如不稳定,甚至会导致安装的系统无法引导。
注意
不建议使用超过 64 GB RAM 的系统进行休眠的原因有两个。首先,休眠需要额外的空间用于 inflated (可能不经常使用)交换区。其次,将驻留的数据从 RAM 移到磁盘并回到磁盘的过程可以花费大量时间完成。
表 15.1 “推荐的系统交换空间” 中列出的每个范围之间的边界(例如,具有 2 GB、8 GB 或 64 GB 系统 RAM 的系统),可以根据所选交换空间和休眠支持进行判断。如果您的系统资源允许这样做,增加交换空间可能会导致更好的性能。
请注意,将交换空间分布到多个存储设备也可以提高交换空间的性能,特别是在具有快速驱动器、控制器和接口的系统上。
重要
在修改时,不应 使用分配被为交换空间的文件系统和 LVM2 卷。如果系统进程或内核正在使用交换空间,则任何修改交换的尝试都会失败。使用 freecat /proc/swaps 命令验证交换的使用量以及位置。
在系统以 救援模式 引导时,您应该修改交换空间,请参阅 Red Hat Enterprise Linux 7 安装指南 中的 在 Rescue Mode 中引导您的计算机。当提示挂载文件系统时,请选择 Skip

15.1. 添加交换空间

有时,需要在安装后添加更多的交换空间。例如,您可以将系统中的 RAM 量从 1 GB 升级到 2 GB,但只有 2 GB 的交换空间。如果您执行内存密集型操作或运行需要大量内存的应用程序,则最好将交换空间大小增加到 4 GB。
您有三个选项:创建一个新的交换分区、创建一个新的交换文件,或者扩展现有 LVM2 逻辑卷上的交换空间。建议您扩展现有逻辑卷。

15.1.1. 在 LVM2 逻辑卷上扩展交换空间

默认情况下,Red Hat Enterprise Linux 7 在安装过程中使用所有可用空间。如果您的系统是这种情况,那么您必须首先向交换空间使用的卷组中添加一个新的物理卷。
在交换空间的卷组中添加额外的存储后,现在可以扩展它了。要做到这一点,请执行以下步骤(假设 /dev/VolGroup00/LogVol01 是您要扩展为 2 GB 的卷):

过程 15.1. 在 LVM2 逻辑卷上扩展交换空间

  1. 为关联的逻辑卷禁用交换:
    # swapoff -v /dev/VolGroup00/LogVol01
  2. 将 LVM2 逻辑卷大小调整 2 GB:
    # lvresize /dev/VolGroup00/LogVol01 -L +2G
  3. 格式化新 swap 空间:
    # mkswap /dev/VolGroup00/LogVol01
  4. 启用扩展的逻辑卷:
    # swapon -v /dev/VolGroup00/LogVol01
  5. 要测试是否成功扩展并激活 swap 逻辑卷,请检查活跃 swap 空间:
    $ cat /proc/swaps
    $ free -h

15.1.2. 为交换空间创建 LVM2 逻辑卷

要添加一个 swap 卷组 2 GB,假设 /dev/VolGroup00/LogVol02 是您要添加的交换卷:
  1. 创建大小为 2 GB 的 LVM2 逻辑卷:
    # lvcreate VolGroup00 -n LogVol02 -L 2G
  2. 格式化新 swap 空间:
    # mkswap /dev/VolGroup00/LogVol02
  3. /etc/fstab 文件中添加以下条目:
    /dev/VolGroup00/LogVol02   swap     swap    defaults     0 0
  4. 重新生成挂载单元以便您的系统注册新配置:
    # systemctl daemon-reload
  5. 在逻辑卷中激活 swap:
    # swapon -v /dev/VolGroup00/LogVol02
  6. 要测试是否成功创建并激活 swap 逻辑卷,请检查活跃 swap 空间:
    $ cat /proc/swaps
    $ free -h

15.1.3. 创建一个交换文件

添加一个交换文件:

过程 15.2. 添加交换文件

  1. 以 MB 为单位确定新交换文件的大小,再乘以 1024 来确定块的数量。例如: 64MB swap 文件的块大小为 65536。
  2. 创建一个空文件:
    # dd if=/dev/zero of=/swapfile bs=1024 count=65536
    使用与所需块大小相等的值替换 count
  3. 使用以下命令设定 swap 文件:
    # mkswap /swapfile
  4. 更改交换文件的安全性,使其不可读。
    # chmod 0600 /swapfile
  5. 要在引导时启用 swap 文件,以 root 用户身份编辑 /etc/fstab,使其包含以下条目:
    /swapfile          swap            swap    defaults        0 0
    下次系统引导时,它会激活新的 swap 文件。
  6. 重新生成挂载单元,以便您的系统注册新的 /etc/fstab 配置:
    # systemctl daemon-reload
  7. 立即激活 swap 文件:
    # swapon /swapfile
  8. 要测试新 swap 文件是否已成功创建并激活,请检查活跃 swap 空间:
    $ cat /proc/swaps
    $ free -h

15.2. 删除交换空间

有时,安装后减少交换空间要谨慎。例如:您将系统中的 RAM 大小从 1GB 降到 512MB,但仍分配了 2GB swap 空间。最好将交换空间大小减少到 1 GB,因为较大的 2 GB 可能会浪费磁盘空间。
您有三个选项:删除用于交换空间的整个 LVM2 逻辑卷、删除交换文件或减少现有 LVM2 逻辑卷上的交换空间。

15.2.1. 减少 LVM2 逻辑卷上的交换空间

要减少 LVM2 交换逻辑卷(假设 /dev/VolGroup00/LogVol01 是您要减少的卷):

过程 15.3. 减少 LVM2 交换空间

  1. 为关联的逻辑卷禁用交换:
    # swapoff -v /dev/VolGroup00/LogVol01
  2. 将 LVM2 逻辑卷减少 512 MB:
    # lvreduce /dev/VolGroup00/LogVol01 -L -512M
  3. 格式化新 swap 空间:
    # mkswap /dev/VolGroup00/LogVol01
  4. 在逻辑卷中激活 swap:
    # swapon -v /dev/VolGroup00/LogVol01
  5. 要测试是否成功缩小 swap 逻辑卷,请检查活跃 swap 空间:
    $ cat /proc/swaps
    $ free -h

15.2.2. 为交换空间删除一个 LVM2 逻辑卷

要删除交换卷组(假设 /dev/VolGroup00/LogVol02 是您要删除的交换卷):

过程 15.4. 删除一个交换空间卷组

  1. 为关联的逻辑卷禁用交换:
    # swapoff -v /dev/VolGroup00/LogVol02
  2. 删除 LVM2 逻辑卷:
    # lvremove /dev/VolGroup00/LogVol02
  3. /etc/fstab 文件中删除以下关联的条目:
    /dev/VolGroup00/LogVol02   swap     swap    defaults     0 0
  4. 重新生成挂载单元以便您的系统注册新配置:
    # systemctl daemon-reload
  5. /etc/default/grub 文件中删除对已删除 swap 存储的所有引用:
    # vi /etc/default/grub
  6. 重建 grub 配置:
    1. 在基于 BIOS 的机器上运行:
      # grub2-mkconfig -o /boot/grub2/grub.cfg
    2. 在基于 UEFI 的机器上,运行:
      # grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
  7. 要测试是否成功删除了逻辑卷,请检查活跃 swap 空间:
    $ cat /proc/swaps
    $ free -h

15.2.3. 删除一个交换文件

要删除一个交换文件:

过程 15.5. 删除一个交换文件

  1. 在 shell 提示符下,执行以下命令禁用交换文件(其中 /swapfile 是交换文件):
    # swapoff -v /swapfile
  2. /etc/fstab 文件中删除其条目。
  3. 重新生成挂载单元以便您的系统注册新配置:
    # systemctl daemon-reload
  4. 删除实际的文件:
    # rm /swapfile

15.3. 移动交换空间

将 swap 空间从一个位置移到另一个位置:

第 16 章 系统存储管理器(SSM)

系统存储管理器 (SSM)提供了一个命令行界面来管理各种技术中的存储。使用设备映射器(DM)、逻辑卷管理器(LVM)和多设备(MD),存储系统变得越来越复杂。这会创建一个不友好用户的系统,并更容易出现错误和问题。SSM 通过创建一个统一用户界面来缓解这个问题。此界面允许用户以简单的方式运行复杂的系统。例如,要创建并挂载没有 SSM 的新文件系统,必须使用五个命令。SSM 只需要一个。
本章介绍了 SSM 如何与各种后端交互,以及一些常见用例。

16.1. SSM 后端

SSM 使用 ssmlib/main.py 中的核心抽象层,它符合设备、池和卷抽象,忽略底层技术的细节。后端可以在 ssmlib/main.py 中注册,以处理特定的存储技术方法,如创建、快照 或移除 卷和池。
SSM 中已经注册了几个后端。以下小节提供有关它们的基本信息,以及它们如何处理池、卷、快照和设备的定义。

16.1.1. Btrfs 后端

注意
Btrfs 在 Red Hat Enterprise Linux 7 中作为技术预览功能提供,但自 Red Hat Enterprise Linux 7.4 发行版本起已被弃用。它将在以后的 Red Hat Enterprise Linux 主发行版本中删除。
如需更多信息,请参阅 Red Hat Enterprise Linux 7.4 发行注记中的 已弃用的功能
Btrfs 是一个具有许多高级功能的文件系统,用作 SSM 中的卷管理后端。可以使用 Btrfs 后端创建池、卷和快照。

16.1.1.1. Btrfs Pool

Btrfs 文件系统本身是池。通过移除设备可以添加更多设备或缩小它进行扩展。当创建 Btrfs 池时,SSM 会创建一个 Btrfs 文件系统。这意味着,每个新的 Btrfs 池都有一个名称与池相同的卷,这些卷在没有删除整个池的情况下不能被删除。默认的 Btrfs 池名称是 btrfs_pool
池的名称用作文件系统标签。如果系统中已有没有标签的 Btrfs 文件系统,则 Btrfs 池将生成用于内部使用的名称,格式为 btrfs_device_base_name

16.1.1.2. Btrfs 卷

在池中的第一个卷后创建的卷与子卷相同。SSM 会在卸载时临时挂载 Btrfs 文件系统,以创建子卷。
卷的名称用作 Btrfs 文件系统中的子卷路径。例如,子卷显示为 /dev/lvm_pool/lvol001。此路径中的每个对象都必须存在,才能创建卷。也可通过其挂载点引用卷。

16.1.1.3. Btrfs Snapshot

可以使用 SSM 在系统中生成任何 Btrfs 卷的快照。请注意,Btrfs 不区分子卷和快照。虽然这意味着 SSM 无法识别 Btrfs 快照目的地,但它会尝试识别特殊名称格式。如果创建快照时指定的名称是特定的模式,则不能识别快照,而是列为常规 Btrfs 卷。

16.1.1.4. Btrfs 设备

Btrfs 不需要在其上创建任何特殊设备。

16.1.2. LVM 后端

可以使用 LVM 创建池、卷和快照。以下定义来自 LVM 点的视图中。

16.1.2.1. LVM 池

LVM 池与 LVM 卷组相同。这意味着,可以在 LVM 池中创建对设备和新逻辑卷进行分组。默认的 LVM 池名称是 lvm_pool

16.1.2.2. LVM 卷

LVM 卷与常规逻辑卷相同。

16.1.2.3. LVM 快照

从 LVM 卷创建快照时,将创建一个新的 快照卷,然后可以像任何其他 LVM 卷一样处理。与 Btrfs 不同,LVM 能够从常规卷区分快照,因此不需要快照名称来匹配特定的模式。

16.1.2.4. LVM 设备

SSM 使得在物理设备上创建 LVM 后端的需求对用户来说是透明的。

16.1.3. crypt 后端

SSM 中的 crypt 后端使用 cryptsetupdm-crypt 目标 来管理加密卷。crypt 后端可用作在常规块设备(或其他卷(如 LVM 或 MD 卷)上创建加密卷的常规后端,或者在单一步骤中创建加密的 LVM 卷。
只能使用 crypt 后端创建卷;不支持池,且不需要特殊设备。
以下小节从 crypt 视图定义卷和快照。

16.1.3.1. 加密卷

加密卷由 dm-crypt 创建,并以未加密的形式代表原始加密设备中的数据。它不支持 RAID 或任何设备连接。
支持两种模式或扩展: luks 和 plain。默认情况下使用 LUKS。有关扩展的更多信息,请参阅 man cryptsetup

16.1.3.2. crypt Snapshot

虽然 crypt 后端不支持快照,但如果加密卷是在 LVM 卷之上创建的,则可以对卷本身进行快照。然后可以使用 cryptsetup 来打开快照。

16.1.4. 多个设备(MD)后端

目前,MD 后端仅限于收集系统中 MD 卷的信息。

16.2. 常见 SSM 任务

以下小节描述了常见的 SSM 任务。

16.2.1. 安装 SSM

要安装 SSM,请使用以下命令:
# yum install system-storage-manager
只有在安装了支持的软件包时,才会启用几个后端:
  • LVM 后端需要 lvm2 软件包。
  • Btrfs 后端需要 btrfs-progs 软件包。
  • Crypt 后端需要 device-mappercryptsetup 软件包。

16.2.2. 显示有关所有删除的设备的信息

使用 list 命令显示所有检测到的设备、池、卷和快照的信息。没有选项的 ssm list 命令会显示以下输出:
# ssm list
----------------------------------------------------------
Device        Free      Used      Total  Pool  Mount point
----------------------------------------------------------
/dev/sda                        2.00 GB        PARTITIONED
/dev/sda1                      47.83 MB        /test
/dev/vda                       15.00 GB        PARTITIONED
/dev/vda1                     500.00 MB        /boot
/dev/vda2  0.00 KB  14.51 GB   14.51 GB  rhel
----------------------------------------------------------
------------------------------------------------
Pool  Type  Devices     Free      Used     Total
------------------------------------------------
rhel  lvm   1        0.00 KB  14.51 GB  14.51 GB
------------------------------------------------
---------------------------------------------------------------------------------
Volume          Pool  Volume size  FS     FS size       Free  Type    Mount point
---------------------------------------------------------------------------------
/dev/rhel/root  rhel     13.53 GB  xfs   13.52 GB    9.64 GB  linear  /
/dev/rhel/swap  rhel   1000.00 MB                             linear
/dev/sda1                47.83 MB  xfs   44.50 MB   44.41 MB  part    /test
/dev/vda1               500.00 MB  xfs  496.67 MB  403.56 MB  part    /boot
---------------------------------------------------------------------------------
通过使用参数来指定应显示的内容,可以进一步缩小此显示范围。可用选项列表可以通过 ssm list --help 命令找到。
注意
根据给定的参数,SSM 可能无法显示所有内容。
  • 运行 devicesdev 参数会省略一些设备。例如,CDROMS 和 DM/MD 设备被有意隐藏,因为它们被列为卷。
  • 有些后端不支持快照,且无法区分快照和常规卷。在其中一个后端上运行 snapshot 参数会导致 SSM 尝试识别卷名称来识别快照。如果 SSM 正则表达式与快照模式不匹配,则不能识别快照。
  • 除了主 Btrfs 卷(文件系统本身)外,任何卸载的 Btrfs 卷都不会显示。

16.2.3. 创建新池、逻辑卷和文件系统

在本节中,使用默认名称创建一个新池,其具有设备 /dev/vdb/dev/vdc、1G 的逻辑卷和 XFS 文件系统。
要创建此场景的命令是 ssm create --fs xfs -s 1G /dev/vdb /dev/vdc。使用以下选项:
  • --fs 选项指定所需的文件系统类型。当前支持的文件系统类型有:
    • ext3
    • ext4
    • xfs
    • btrfs
  • -s 指定逻辑卷的大小。支持以下后缀来定义单元:
    • kk 表示 KB
    • Mm 用于 MB
    • GG 表示千兆字节
    • Tt for TB
    • Pp for PBs
    • ee 用于 exabytes
  • Additionaly 使用 -s 选项,新大小可指定为百分比。查看示例:
    • 总池大小达到 10%
    • 空闲池空间的 10%FREE
    • 10%USED 是已用池空间的 10%
列出的两个设备 /dev/vdb/dev/vdc 是您要创建的两个设备。
# ssm create --fs xfs -s 1G /dev/vdb /dev/vdc
  Physical volume "/dev/vdb" successfully created
  Physical volume "/dev/vdc" successfully created
  Volume group "lvm_pool" successfully created
  Logical volume "lvol001" created
ssm 命令 还有另外两个可能有用的选项。第一个是 -p pool 命令。这将指定要在其上创建卷的池。如果尚不存在,则 SSM 会创建它。在给定示例中省略了,这会导致 SSM 使用默认名称 lvm_pool。但是,要使用特定名称来适应任何现有命名约定,应使用 -p 选项。
第二个有用选项是 -n name 命令。这会命名新创建的逻辑卷。与 -p 一样,需要使用特定名称来适合任何现有命名约定。
以下是使用这两个选项的示例:
# ssm create --fs xfs -p new_pool -n XFS_Volume /dev/vdd
  Volume group "new_pool" successfully created
  Logical volume "XFS_Volume" created
SSM 现在创建了两个物理卷、一个池和一个逻辑卷,且只有一个命令。

16.2.4. 检查文件系统的一致性

ssm check 命令检查卷上的文件系统一致性。可以指定多个卷来检查。如果卷中没有文件系统,则会跳过该卷。
要检查卷 lvol001 中的所有设备,请运行命令 ssm check /dev/lvm_pool/lvol001
# ssm check /dev/lvm_pool/lvol001
Checking xfs file system on '/dev/mapper/lvm_pool-lvol001'.
Phase 1 - find and verify superblock...
Phase 2 - using internal log
        - scan filesystem freespace and inode maps...
        - found root inode chunk
Phase 3 - for each AG...
        - scan (but don't clear) agi unlinked lists...
        - process known inodes and perform inode discovery...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
        - agno = 4
        - agno = 5
        - agno = 6
        - process newly discovered inodes...
Phase 4 - check for duplicate blocks...
        - setting up duplicate extent list...
        - check for inodes claiming duplicate blocks...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
        - agno = 4
        - agno = 5
        - agno = 6
No modify flag set, skipping phase 5
Phase 6 - check inode connectivity...
        - traversing filesystem ...
        - traversal finished ...
        - moving disconnected inodes to lost+found ...
Phase 7 - verify link counts...
No modify flag set, skipping filesystem flush and exiting.

16.2.5. 增加卷的大小

ssm resize 命令更改指定卷和文件系统的大小。如果没有文件系统,则仅调整卷本身的大小。
在本例中,我们目前在 /dev/vdb 上有一个逻辑卷,名为 lvol001
# ssm list
-----------------------------------------------------------------
Device          Free       Used      Total  Pool      Mount point
-----------------------------------------------------------------
/dev/vda                          15.00 GB            PARTITIONED
/dev/vda1                        500.00 MB            /boot
/dev/vda2    0.00 KB   14.51 GB   14.51 GB  rhel
/dev/vdb   120.00 MB  900.00 MB    1.00 GB  lvm_pool
/dev/vdc                           1.00 GB
-----------------------------------------------------------------
---------------------------------------------------------
Pool      Type  Devices       Free       Used       Total
---------------------------------------------------------
lvm_pool  lvm   1        120.00 MB  900.00 MB  1020.00 MB
rhel      lvm   1          0.00 KB   14.51 GB    14.51 GB
---------------------------------------------------------
--------------------------------------------------------------------------------------------
Volume                 Pool      Volume size  FS     FS size       Free  Type    Mount point
--------------------------------------------------------------------------------------------
/dev/rhel/root         rhel         13.53 GB  xfs   13.52 GB    9.64 GB  linear  /
/dev/rhel/swap         rhel       1000.00 MB                             linear
/dev/lvm_pool/lvol001  lvm_pool    900.00 MB  xfs  896.67 MB  896.54 MB  linear
/dev/vda1                          500.00 MB  xfs  496.67 MB  403.56 MB  part    /boot
--------------------------------------------------------------------------------------------
逻辑卷需要被另外 500MB 增加。要做到这一点,我们需要在池中添加额外的设备:
~]# ssm resize -s +500M /dev/lvm_pool/lvol001 /dev/vdc
  Physical volume "/dev/vdc" successfully created
  Volume group "lvm_pool" successfully extended
Phase 1 - find and verify superblock...
Phase 2 - using internal log
        - scan filesystem freespace and inode maps...
        - found root inode chunk
Phase 3 - for each AG...
        - scan (but don't clear) agi unlinked lists...
        - process known inodes and perform inode discovery...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
        - process newly discovered inodes...
Phase 4 - check for duplicate blocks...
        - setting up duplicate extent list...
        - check for inodes claiming duplicate blocks...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
No modify flag set, skipping phase 5
Phase 6 - check inode connectivity...
        - traversing filesystem ...
        - traversal finished ...
        - moving disconnected inodes to lost+found ...
Phase 7 - verify link counts...
No modify flag set, skipping filesystem flush and exiting.
  Extending logical volume lvol001 to 1.37 GiB
  Logical volume lvol001 successfully resized
meta-data=/dev/mapper/lvm_pool-lvol001 isize=256    agcount=4, agsize=57600 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0
data     =                       bsize=4096   blocks=230400, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=853, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 230400 to 358400

SSM 在设备上运行检查,然后根据指定数量扩展卷。这可以通过 ssm list 命令验证。
# ssm list
------------------------------------------------------------------
Device          Free        Used      Total  Pool      Mount point
------------------------------------------------------------------
/dev/vda                           15.00 GB            PARTITIONED
/dev/vda1                         500.00 MB            /boot
/dev/vda2    0.00 KB    14.51 GB   14.51 GB  rhel
/dev/vdb     0.00 KB  1020.00 MB    1.00 GB  lvm_pool
/dev/vdc   640.00 MB   380.00 MB    1.00 GB  lvm_pool
------------------------------------------------------------------
------------------------------------------------------
Pool      Type  Devices       Free      Used     Total
------------------------------------------------------
lvm_pool  lvm   2        640.00 MB   1.37 GB   1.99 GB
rhel      lvm   1          0.00 KB  14.51 GB  14.51 GB
------------------------------------------------------
----------------------------------------------------------------------------------------------
Volume                 Pool      Volume size  FS      FS size        Free  Type    Mount point
----------------------------------------------------------------------------------------------
/dev/rhel/root         rhel         13.53 GB  xfs    13.52 GB     9.64 GB  linear  /
/dev/rhel/swap         rhel       1000.00 MB                               linear
/dev/lvm_pool/lvol001  lvm_pool      1.37 GB  xfs     1.36 GB     1.36 GB  linear
/dev/vda1                          500.00 MB  xfs   496.67 MB   403.56 MB  part    /boot
----------------------------------------------------------------------------------------------
注意
只能缩小 LVM 卷的大小 ; 不支持其他卷类型。这可以通过使用 - 而不是 + 完成。例如:要将 LVM 卷的大小减小到 50M,命令将是:
# ssm resize -s-50M /dev/lvm_pool/lvol002
  Rounding size to boundary between physical extents: 972.00 MiB
  WARNING: Reducing active logical volume to 972.00 MiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lvol002? [y/n]: y
  Reducing logical volume lvol002 to 972.00 MiB
  Logical volume lvol002 successfully resized
如果没有 +-,则该值会取为绝对值。

16.2.6. Snapshot

要为现有卷执行快照,请使用 ssm snapshot 命令。
注意
如果卷所属的后端不支持快照,则此操作会失败。
要为 lvol001 创建快照,请使用以下命令:
# ssm snapshot /dev/lvm_pool/lvol001
  Logical volume "snap20150519T130900" created
要验证这一点,请使用 ssm 列表,并记下额外的快照部分。
# ssm list
----------------------------------------------------------------
Device        Free        Used      Total  Pool      Mount point
----------------------------------------------------------------
/dev/vda                         15.00 GB            PARTITIONED
/dev/vda1                       500.00 MB            /boot
/dev/vda2  0.00 KB    14.51 GB   14.51 GB  rhel
/dev/vdb   0.00 KB  1020.00 MB    1.00 GB  lvm_pool
/dev/vdc                          1.00 GB
----------------------------------------------------------------
--------------------------------------------------------
Pool      Type  Devices     Free        Used       Total
--------------------------------------------------------
lvm_pool  lvm   1        0.00 KB  1020.00 MB  1020.00 MB
rhel      lvm   1        0.00 KB    14.51 GB    14.51 GB
--------------------------------------------------------
----------------------------------------------------------------------------------------------
Volume                 Pool      Volume size  FS      FS size        Free  Type    Mount point
----------------------------------------------------------------------------------------------
/dev/rhel/root         rhel         13.53 GB  xfs    13.52 GB     9.64 GB  linear  /
/dev/rhel/swap         rhel       1000.00 MB                               linear
/dev/lvm_pool/lvol001  lvm_pool    900.00 MB  xfs   896.67 MB   896.54 MB  linear
/dev/vda1                          500.00 MB  xfs   496.67 MB   403.56 MB  part    /boot
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------
Snapshot                           Origin   Pool      Volume size     Size  Type
----------------------------------------------------------------------------------
/dev/lvm_pool/snap20150519T130900  lvol001  lvm_pool    120.00 MB  0.00 KB  linear
----------------------------------------------------------------------------------

16.2.7. 删除项

ssm remove 用于删除项目,可以是设备、池或卷。
注意
如果在删除时池使用了设备,它将会失败。这可以通过使用 -f 参数强制使用。
如果卷在删除时挂载,它将会失败。与设备不同,无法使用 -f 参数强制使用它。
要删除 lvm_pool 及其其中的所有内容,请使用以下命令:
# ssm remove lvm_pool
Do you really want to remove volume group "lvm_pool" containing 2 logical volumes? [y/n]: y
Do you really want to remove active logical volume snap20150519T130900? [y/n]: y
  Logical volume "snap20150519T130900" successfully removed
Do you really want to remove active logical volume lvol001? [y/n]: y
  Logical volume "lvol001" successfully removed
  Volume group "lvm_pool" successfully removed

16.3. SSM 资源

有关 SSM 的更多信息,请参阅以下资源:

第 17 章 磁盘配额

通过实施磁盘配额来限制磁盘空间,配额可在用户消耗太多磁盘空间或分区已满前提醒系统管理员。
可以为单独的用户以及用户组配置磁盘配额。这样便可以将分配给用户特定文件(例如电子邮件)的空间与分配给用户工作的项目的空间分开管理(假设项目有自己的组)。
此外,配额不仅可用来控制所消耗磁盘块的数量,还可以用来控制 inode (包含 UNIX 文件系统中文件信息的数据结构)数。由于 inode 用于包含与文件有关信息,因此允许控制可以创建的文件数。
必须安装 quota RPM 才能实现磁盘配额。
注意
本章适用于所有文件系统,但有些文件系统都有自己的配额管理工具。有关适用的文件系统,请查看相应的描述。
对于 XFS 文件系统,请参阅 第 3.3 节 “XFS 配额管理”
Btrfs 没有磁盘配额,因此不涵盖。

17.1. 配置磁盘配额

要实现磁盘配额,请执行以下步骤:
  1. 通过修改 /etc/fstab 文件,为每个文件系统启用配额。
  2. 重新挂载文件系统。
  3. 创建配额数据库文件,并生成磁盘使用情况表。
  4. 分配配额策略。
在以下小节中会详细讨论这些步骤的具体内容。

17.1.1. 启用配额

过程 17.1. 启用配额

  1. 以 root 身份登录。
  2. 编辑 /etc/fstab 文件。
  3. usrquotagrpquota 或两个选项添加到需要配额的文件系统中。

例 17.1. 编辑 /etc/fstab

例如,要使用文本编辑器 vim,请键入以下内容:
# vim /etc/fstab

例 17.2. 添加配额

/dev/VolGroup00/LogVol00 /         ext3    defaults        1 1
LABEL=/boot              /boot     ext3    defaults        1 2
none                     /dev/pts  devpts  gid=5,mode=620  0 0
none                     /dev/shm  tmpfs   defaults        0 0
none                     /proc     proc    defaults        0 0
none                     /sys      sysfs   defaults        0 0
/dev/VolGroup00/LogVol02 /home     ext3    defaults,usrquota,grpquota  1 2
/dev/VolGroup00/LogVol01 swap      swap    defaults        0 0 . . .
在这个示例中,/home 文件系统同时启用了用户和组配额。
备注
以下示例假定在安装 Red Hat Enterprise Linux 过程中创建了单独的 /home 分区。root (/)分区可用于设置 /etc/fstab 文件中的配额策略。

17.1.2. 重新挂载文件系统

添加 usrquotagrpquota 或两个选项后,重新挂载修改 fstab 条目的每个文件系统。如果文件系统没有被任何进程使用,请使用以下方法之一:
  • 运行 umount 命令,后跟 mount 命令以重新挂载文件系统。有关挂载和卸载各种文件系统类型的具体语法,请参阅 umountmount man page。
  • 运行 mount -o remount file-system 命令(其中 file-system 是文件系统的名称)以重新挂载文件系统。例如,要重新挂载 /home 文件系统,请运行 mount -o remount /home 命令。
如果文件系统当前正在使用,则重新挂载文件系统的最简单方法是重新启动系统。

17.1.3. 创建配额数据库文件

重新挂载每个启用了配额的文件系统后,请运行 quotacheck 命令。
quotacheck 命令检查启用了配额的文件系统,并为每个文件系统构建一个当前磁盘使用情况的表。该表随后用于更新操作系统磁盘使用情况的副本。此外,还会更新文件系统的磁盘配额文件。
注意
quotacheck 命令对 XFS 没有影响,因为磁盘使用量表在挂载时会自动完成。如需更多信息,请参阅 man page xfs_quota (8)

过程 17.2. 创建配额数据库文件

  1. 使用以下命令在文件系统中创建配额文件:
    # quotacheck -cug /file system
  2. 使用以下命令为每个文件系统生成当前磁盘用量表:
    # quotacheck -avug
以下是用于创建配额文件的选项:
c
指定应为每个启用配额的文件系统创建配额文件。
u
检查用户配额。
g
检查组配额。如果只指定 -g,则仅创建组配额文件。
如果未指定 -u-g 选项,则仅创建用户配额文件。
以下选项用于生成当前磁盘用量表:
a
检查所有启用了配额的、本地挂载的文件系统
v
在配额检查进行时显示详细的状态信息
u
检查用户磁盘配额信息
g
检查组磁盘配额信息
quotacheck 完成运行后,与启用的配额(用户或组或两者)对应的配额文件会填充每个启用了配额的本地挂载的文件系统(如 /home )的数据。

17.1.4. 为每个用户分配配额

最后一步是使用 edquota 命令分配磁盘配额。
前提条件
  • 用户必须在设置用户配额前存在。

过程 17.3. 为每个用户分配配额

  1. 要为用户分配配额,请使用以下命令:
    # edquota username
    使用您要为其分配配额的用户替换 username
  2. 要验证是否为该用户设定了配额,使用以下命令:
    # quota username

例 17.3. 为用户分配配额

例如,如果在 /etc/fstab 中为 /home 分区(以下示例中的/dev/VolGroup00/LogVol02 )启用了配额,并且执行了命令 edquota testuser,则会在配置为系统默认设置的编辑器中显示以下内容:
Disk quotas for user testuser (uid 501):
		Filesystem                blocks     soft     hard    inodes   soft   hard
		/dev/VolGroup00/LogVol02  440436        0        0     37418      0      0
备注
edquota 使用由 EDITOR 环境变量定义的文本编辑器。要更改编辑器,将 ~/.bash_profile 文件中的 EDITOR 环境变量设置为您选择的编辑器的完整路径。
第一列是启用了配额的文件系统的名称。第二列显示目前该用户使用的块数。下面的两列是为该用户在文件系统中设定软限制和硬限制。inodes 列显示用户当前使用的 inode 数。最后两列是为该用户在文件系统中设定软和硬的内节点限制。
硬块限制是用户或者组群可以使用的绝对最大磁盘空间量。达到这个限制后,就无法再使用其他磁盘空间。
软块限制定义可以使用的最大磁盘空间量。然而,与硬限制不同,在一定时间内可以超过软限制。该时间称为 宽限期。宽限期可以用秒、分钟、小时、天、周或月表示。
如果值为 0,则代表没有设定那个限制。在文本编辑器中,更改所需的限制。

例 17.4. 更改限制

例如:
Disk quotas for user testuser (uid 501):
Filesystem                blocks     soft     hard   inodes   soft   hard
/dev/VolGroup00/LogVol02  440436   500000   550000    37418      0      0
要验证是否为用户设定了配额,请使用以下命令:
# quota testuser
Disk quotas for user username (uid 501):
   Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
     /dev/sdb    1000*   1000    1000               0       0       0

17.1.5. 为每个组分配配额

配额可以针对单独组群进行分配。
前提条件
  • 组群在设定组群配额前必须已经存在。

过程 17.4. 为每个组分配配额

  1. 要设置组配额,请使用以下命令:
    # edquota -g groupname
  2. 要验证是否设定了组群配额,请使用以下命令:
    # quota -g groupname

例 17.5. 为组分配配额

例如,要为 devel 组设置组配额,请使用以下命令:
# edquota -g devel
这个命令在文本编辑器中显示该组群的现有配额:
Disk quotas for group devel (gid 505):
Filesystem                blocks    soft     hard    inodes    soft    hard
/dev/VolGroup00/LogVol02  440400       0        0     37418       0       0
修改限制后保存文件。
要验证是否设置了组配额,请使用以下命令:
# quota -g devel

17.1.6. 为软限制设置宽限期

如果给定配额有软限制,您可以使用以下命令编辑宽限期(即可以超过软限制的时间):
# edquota -t
此命令适用于针对用户或组的 inode 或块的配额。
重要
虽然其他 edquota 命令针对特定用户或组的配额进行操作,但 -t 选项在每个启用了配额的文件系统中运行。

17.2. 管理磁盘配额

如果实施了配额,它们主要需要一些维护,以便查看是否超过了配额,并确保配额是准确的。
如果用户重复超过配额,或者持续达到其软限制,系统管理员可根据用户类型以及影响其工作的空间数量而决定一些选择。管理员可以帮助用户决定如何使用较少的磁盘空间,或者增加用户的磁盘配额。

17.2.1. 启用和禁用

可以在不将其设置为 0 的情况下禁用配额。要关闭所有用户和组配额,请使用以下命令:
# quotaoff -vaug
如果未指定 -u-g 选项,则仅禁用用户配额。如果只指定 -g,则只禁用组配额。-v 开关会在命令执行时显示详细状态信息。
要再次启用用户和组群配额,请使用以下命令:
# quotaon
要为所有文件系统启用用户和组群配额,请使用以下命令:
# quotaon -vaug
如果未指定 -u-g 选项,则只启用用户配额。如果只指定 -g,则只启用组配额。
要为特定文件系统(如 /home )启用配额,请使用以下命令:
# quotaon -vug /home
注意
XFS 并不总是需要 quotaon 命令,因为它是在挂载时自动执行的。如需更多信息,请参阅 man page quotaon (8)

17.2.2. 报告磁盘配额

创建磁盘用量报告需要运行 repquota 工具。

例 17.6. repquota 命令的输出

例如,命令 repquota /home 生成此输出:
*** Report for user quotas on device /dev/mapper/VolGroup00-LogVol02
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
要查看所有启用了配额的文件系统的磁盘使用情况报告(选项 -a),请使用命令:
# repquota -a
虽然报告易于阅读,但有以下几点需要解释:每个用户后面显示的 -- 是确定是否超过块或内节点限制的快速方法。如果超过了任何一个软限制,则 + 会出现在对应的 - 的位置,第一个 - 代表块限制,第二个代表内节点限制。
grace 列通常为空。如果超过了软限制,则该列包含的时间规格等同于宽限期中剩余的时间量。如果宽限期已过期,none 会出现在其位置上。

17.2.3. 使配额保持准确

当文件系统无法完全卸载时,例如因为系统崩溃,需要运行以下命令:
# quotacheck
但是,quotacheck 可以定期运行,即使系统没有崩溃。定期运行 quotacheck 的安全方法包括:
确保 quotacheck 在下次重启时运行
大多数系统的最佳方法
这个方法最适合定期重启的多用户系统。
使用以下命令将 shell 脚本保存到 /etc/cron.daily//etc/cron.weekly/ 目录中,或者使用以下命令调度一个:
# crontab -e
crontab -e 命令包含 touch /forcequotacheck 命令。这会在根目录中创建一个空的 forcequotacheck 文件,系统初始化脚本会在引导时查找该文件。如果找到了,初始化脚本将运行 quotacheck。之后,初始化脚本会删除 /forcequotacheck 文件;因此,使用 cron 定期创建此文件,确保在下次重启时运行 quotacheck
有关 cron 的更多信息,请参阅 man cron
在单用户模式下运行 quotacheck
安全运行 quotacheck 的替代方法是将系统引导至单用户模式,以防止配额文件中出现数据崩溃并运行以下命令:
# quotaoff -vug /file_system
# quotacheck -vug /file_system
# quotaon -vug /file_system
在运行的系统上运行 quotacheck
如有必要,可以在没有用户登录的情况下在机器上运行 quotacheck,因此没有正在检查的文件系统上的打开文件。运行 quotacheck -vug file_system 命令;如果 quotacheck 无法以只读形式重新挂载给定的 file_system,此命令将失败。请注意,在检查后,文件系统将以读写形式重新挂载。
警告
不建议在以读写形式挂载的实时文件系统上运行 quotacheck,因为可能会损坏配额文件。
有关配置 cron 的更多信息,请参阅 man cron

17.3. 磁盘配额参考

有关磁盘配额的详情,请参考以下命令的 手册页
  • quotacheck
  • edquota
  • repquota
  • quota
  • quotaon
  • quotaoff

第 18 章 独立磁盘冗余阵列(RAID)

RAID 的基本理念是将多个小、成本低廉的磁盘驱动器合并到一个阵列中,以取得一个大而昂贵的驱动无法实现的性能或冗余目标。这个驱动器阵列在计算机上显示为一个逻辑存储单元或驱动器。
RAID 允许信息分布在多个磁盘上。RAID 使用 磁盘条带(RAID 0)、磁盘镜像(RAID 1)和 带奇偶校验的磁盘条带(RAID 5)来实现冗余、低延迟、增大带宽以及最大程度从硬盘崩溃恢复的能力。
RAID 通过将数据拆分为统一大小的块(通常为 256K 或 512k,但也接受其他值),从而将数据分布在阵列中的每个驱动器上。然后,每个块根据所使用的 RAID 级写到 RAID 阵列中的硬盘驱动器上。当读取数据时,过程会反过来,给人产生一种阵列中的多个驱动器实际上是一个大驱动器的错觉。
系统管理员以及管理大量数据的其他人将受益于使用 RAID 技术。部署 RAID 的主要原因包括:
  • 加强速度
  • 使用单一虚拟磁盘增加存储容量
  • 尽可能减少磁盘失败的数据丢失

18.1. RAID 类型

有三种可能的 RAID 方法:固件 RAID、硬件 RAID 和软件 RAID。

固件 RAID

固件 RAID (也称为 ATARAID)是一种软件 RAID,可以使用基于固件的菜单配置 RAID 集。此类 RAID 使用的固件也会挂接到 BIOS 中,允许您从 RAID 集启动。不同的供应商使用不同的磁盘元数据格式来标记 RAID 集成员。Intel Matrix RAID 是固件 RAID 系统的一个很好的例子。

硬件 RAID

基于硬件的阵列独立于主机管理 RAID 子系统。它按每个 RAID 阵列一个磁盘的形式呈现给主机。
硬件 RAID 设备可能是系统内部或外部的,内部设备通常由专用的控制器卡组成,该卡通常包括对操作系统透明的 RAID 任务,以及外部设备通常通过 SCSI、光纤通道、iSCSI、InfiniBand 或其他高速度网络互连和向系统呈现逻辑卷。
RAID 控制器卡的功能与操作系统的 SCSI 控制器相同,用于处理所有实际驱动器间的通信。用户将驱动器插入 RAID 控制器(就像普通的 SCSI 控制器)中,然后将它们添加到 RAID 控制器配置中。操作系统将无法辨别它们的不同。

软件 RAID

软件 RAID 在内核磁盘(块设备)代码中实现各种 RAID 级。它提供最便宜的解决方案,如昂贵的磁盘控制器卡或热插拔机箱 [2] 不需要。软件 RAID 也适用于更便宜的 IDE 磁盘以及 SCSI 磁盘。随着当今 CPU 速度越来越快,软件 RAID 通常会优于硬件 RAID。
Linux 内核包含一个 多磁盘(MD)驱动程序,其允许 RAID 解决方案完全独立于硬件。基于软件的阵列的性能取决于服务器 CPU 的性能和负载。
Linux 软件 RAID 堆栈的主要特性:
  • 多线程设计
  • 在不同的 Linux 机器间移动磁盘阵列不需要重新构建数据
  • 使用空闲系统资源进行后台阵列重构
  • 热插拔驱动器的支持
  • 自动 CPU 检测,以利用某些 CPU 功能,如流 SIMD 支持
  • 自动更正阵列磁盘上坏扇区
  • 定期检查 RAID 数据,以确保阵列健康
  • 主动监控阵列,在发生重要事件时将电子邮件报警发送到指定的电子邮件地址
  • 写意图位图通过允许内核准确了解磁盘的哪些部分需要重新同步,而不必重新同步整个阵列,从而大大提高了重新同步事件的速度
  • 重新同步检查点,以便如果您在重新同步期间重新启动计算机,则在启动时重新同步会从其停止的地方开始,而不是从头开始
  • 安装后更改阵列参数的能力。例如:当有新磁盘需要添加时,您可以将 4 磁盘 RAID5 阵列增加成 5 磁盘 RAID5 阵列。这种增加操作是实时的,不需要您在新阵列上重新安装。

18.2. RAID 级和线性支持

RAID 支持各种配置,包括 0、1、4、5、6、10 和 linear。这些 RAID 类型定义如下:
0 级
RAID 0,通常称为"条带化",是一种面向性能的条带数据映射技术。这意味着写入阵列的数据被分成条,写入到阵列的成员磁盘上,从而以较低的成本提供较高的 I/O 性能,但不提供冗余。
许多 RAID 0 实现只会在成员设备上条带化数据,最大条带为阵列中最小设备的大小。这意味着,如果您有多个设备,它们的大小稍有不同,则每个设备都会被视为与最小驱动器的大小相同。因此,级别 0 阵列的一般存储容量等于,硬件 RAID 中容量最小的成员磁盘的容量,或软件 RAID 中的最小成员分区的容量,在乘以阵列中的磁盘或分区的数量。
1 级
RAID 1 或 "镜像" 比任何其它形式的 RAID 使用的时间都长。1 级通过将相同的数据写入阵列的每个成员磁盘来提供冗余,在每个磁盘上都保留一个"镜像"副本。因为其简单且数据高度可用,RAID 1 仍然被广泛使用。级别 1 需要两个或者多个磁盘,它提供了很好的数据可靠性,提高了需要读取的应用程序的性能,但是成本相对高。[3]
级别 1 阵列的存储容量等于硬件 RAID 中最小镜像硬盘或者软件 RAID 中最小镜像分区的容量相同。级别 1 所提供的冗余性是所有 RAID 级别中最高的,因为阵列只需要在有一个成员可以正常工作的情况下就可以提供数据。
4 级
4 级使用奇偶校验 [4] 集中在单个磁盘驱动器上来保护数据.因为 RAID 4 使用一个专门的偶校验磁盘,因此这个磁盘就会成为对 RAID 阵列的写入操作的一个固有的瓶颈。所以, RAID 4 较少被使用。因此,Anaconda 中并没有提供 RAID 4 这个选项。但是,如果真正需要,用户可以手动创建它。
硬件 RAID 4 的存储容量等于分区数量减一乘以最小成员分区的容量。RAID 4 阵列的性能总是非对称的,即读比写的性能要好。这是因为,写会在生成奇偶校验时消耗额外的 CPU 和主内存带宽,然后在将实际数据写入磁盘时也会消耗额外的总线带宽,因为您不仅写数据,而且还写奇偶校验。读取只需要读取数据而不是奇偶校验,除非该阵列处于降级状态。因此,在正常操作条件下,对于相同数量的数据传输,读会对驱动器和计算机总线产生较少的流量。
5 级
这是最常见的 RAID 类型。通过将奇偶校验分布在阵列的所有成员磁盘驱动器上,RAID 5 消除了 4 级中固有的写瓶颈。唯一性能瓶颈是奇偶校验计算过程本身。在使用现代 CPU 和软件 RAID 时,这通常不会成为瓶颈,因为现代 CPU 可能会非常快速地生成奇偶校验。然而,如果您的软件 RAID5 阵列中有大量成员设备,且在所有设备间有大量的数据进行传输时,就可能出现瓶颈。
与 4 级一样,5 级具有非对称性能,其读性能大大优于写性能。RAID 5 的存储容量的计算方法与级别 4 的计算方法是一样的。
级别 6
如果数据的冗余性和保护性比性能更重要,且无法接受 RAID 1 的空间利用率低的问题,则通常会选择使用级别 6。级别 6 使用一个复杂的奇偶校验方式,可以在阵列中出现任意两个磁盘失败的情况下进行恢复。因为使用的奇偶校验方式比较复杂,软件 RAID 设备会对 CPU 造成较大负担,同时对写操作造成更大的负担。因此,与级别 4 和 5 相比,级别 6 的性能不对称性更严重。
RAID 6 阵列的总容量与 RAID 5 和 4 类似,但您必须从额外奇偶校验存储空间的设备数中减去 2 个设备(而不是 1 个)。
级别 10
这个 RAID 级别将级别 0 的性能优势与级别 1 的冗余合并。它还有助于减少在有多于 2 个设备时,级别 1 阵列中的利用率低的问题。对于 10 级,可以创建一个 3 个驱动器阵列,来仅存储每块数据的 2 个副本,然后允许整个阵列的大小为最小设备的 1.5 倍,而不是只等于最小设备(这与 3 设备1 级阵列类似)。
创建 10 级阵列时可用的选项数量,以及为特定用例选择正确的选项的复杂性,使在安装过程中创建它们不切实际。可以使用命令行 mdadm 工具手动创建一个。有关选项及其各自性能权衡的更多信息,请参阅 man md
线性 RAID
线性 RAID 是创建更大的虚拟驱动器的一组驱动器。在线性 RAID 中,块会被从一个成员驱动器中按顺序分配,只有在第一个完全填充时才会进入下一个驱动器。这个分组方法不会提供性能优势,因为 I/O 操作不太可能在不同成员间同时进行。线性 RAID 也不提供冗余性并降低可靠性 ; 如果任何一个成员驱动器失败,则整个阵列无法使用。该容量是所有成员磁盘的总量。


[3] 为了实现数据可靠性,需要向阵列中的所有磁盘写入相同的信息,所以 RAID 1 的成本会很高。与基于奇偶校验的其他级别(如级别 5)相比,空间的利用效率较低。然而,对空间利用率的牺牲提供了高性能:基于奇偶校验的 RAID 级别会消耗大量 CPU 资源以便获得奇偶校验,而 RAID 级别 1 只是一次向多个 RAID 成员中写入同样数据,其对 CPU 的消耗较小。因此,在使用软件 RAID 的系统中,或系统中有其他操作需要大量使用 CPU 资源时,RAID 1 可能会比使用基于奇偶校验的 RAID 级别的性能更好。
[4] 奇偶校验信息是根据阵列中剩余成员磁盘的内容计算出来的。然后当阵列中的一个磁盘失败时,这个信息就可以被用来重建数据。然后,在出现问题的磁盘被替换前,使用被重建的数据就可以满足 I/O 的请求。在磁盘被替换后,可以在上面重新生成数据。

18.3. Linux RAID 子系统

Linux 中的 RAID 由以下子系统组成:

Linux 硬件 RAID 控制器驱动程序

硬件 RAID 控制器在 Linux 中没有特定的 RAID 子系统。由于它们使用特殊的 RAID 芯片组,因此硬件 RAID 控制器有自己的驱动程序;这些驱动程序允许系统将 RAID 集作为常规磁盘来检测。

mdraid

mdraid 子系统设计为 Linux 的软件 RAID 解决方案;它也是 Linux 下软件 RAID 的首选解决方案。此子系统使用自己的元数据格式,通常称为原生 mdraid 元数据。
mdraid 还支持其他元数据格式,称为外部元数据。Red Hat Enterprise Linux 7 使用带有外部元数据的 mdraid 来访问 ISW / IMSM (Intel 固件 RAID)集。mdraid 集通过 mdadm 工具进行配置和控制。

dmraid

dmraid 工具用于各种固件 RAID 实现。dmraid 还支持 Intel 固件 RAID,但 Red Hat Enterprise Linux 7 使用 mdraid 访问 Intel 固件 RAID 集。
注意
从 Red Hat Enterprise Linux 7.5 发行版本起,dmraid 已被弃用。它将在以后的 Red Hat Enterprise Linux 主发行版本中删除。如需更多信息,请参阅 Red Hat Enterprise Linux 7.5 发行注记中的 已弃用的功能

18.4. Anaconda 安装程序中的 RAID 支持

Anaconda 安装程序自动检测系统上的任何硬件和固件 RAID 集,使其可用于安装。Anaconda 还支持使用 mdraid 的软件 RAID,并且可以识别现有的 mdraid 集。
Anaconda 提供了在安装过程中创建 RAID 集的工具,但这些工具只允许分区(而不是整个磁盘)成为新集合的成员。要将整个磁盘用于集合,请在上面创建一个跨整个磁盘的分区,并将该分区用作 RAID 设置成员。
当 root 文件系统使用 RAID 集时,Anaconda 会在引导装载程序配置中添加特殊的内核命令行选项,告知 initrd 在搜索根文件系统前要激活哪个 RAID 集。
有关在安装过程中配置 RAID 的详情,请查看 Red Hat Enterprise Linux 7 安装指南

18.5. 安装后将根磁盘转换为 RAID1

如果您需要在安装 Red Hat Enterprise Linux 7 后将非 RAID 磁盘转换为 RAID1 镜像,请参阅以下红帽知识库文章:安装 Red Hat Enterprise Linux 7 后如何将我的根磁盘转换为 RAID1
在 PowerPC (PPC) 构架中,执行以下步骤:
  1. 将 PowerPC Reference Platform (PReP) 引导分区从 /dev/sda1 复制到 /dev/sdb1
    # dd if=/dev/sda1 of=/dev/sdb1 
  2. 在两个磁盘的第一个分区中更新 Prep 和 boot 标志:
    $ parted /dev/sda set 1 prep on
    $ parted /dev/sda set 1 boot on
    
    $ parted /dev/sdb set 1 prep on
    $ parted /dev/sdb set 1 boot on 
注意
运行 grub2-install /dev/sda 命令无法在 PowerPC 机器上工作,并返回错误,但系统会按预期引导。

18.6. 配置 RAID 集

大多数 RAID 集在创建过程中配置,通常通过固件菜单或安装程序来配置。在某些情况下,您可能需要在安装系统后创建或修改 RAID 集,最好不需要重启计算机,进入到固件菜单来完成此操作。
某些硬件 RAID 控制器允许您动态配置 RAID 集,甚至在添加额外磁盘后定义全新的 RAID 集。这需要使用特定于驱动程序的工具,因为没有标准的 API。如需更多信息,请参阅硬件 RAID 控制器的驱动程序文档。

mdadm

mdadm 命令行工具用于管理 Linux 中的软件 RAID,如 mdraid。有关不同 mdadm 模式和选项的详情,请参考 man mdadmman page 还包含创建、监控和组装软件 RAID 阵列等常见操作的有用示例。

dmraid

顾名思义,dmraid 用于管理设备映射器 RAID 集。dmraid 工具使用多个元数据格式处理程序查找 ATARAID 设备,每个处理程序都支持各种格式。如需支持的格式的完整列表,请运行 dmraid -l
如前面 第 18.3 节 “Linux RAID 子系统” 所述,dmraid 工具无法在创建后配置 RAID 集。有关使用 dmraid 的更多信息,请参阅 man dmraid

18.7. 创建高级 RAID 设备

在某些情况下,您可能想要在安装完成后在无法创建的阵列上安装操作系统。通常,这意味着在复杂的 RAID 设备上设置 /boot 或 root 文件系统阵列;在这种情况下,您可能需要使用 Anaconda 不支持的数组选项。要临时解决这个问题,请执行以下步骤:

过程 18.1. 创建高级 RAID 设备

  1. 插入安装磁盘。
  2. 在初始引导过程中,选择 Rescue Mode 而不是 InstallUpgrade。当系统完全引导到 Rescue mode 时,用户会看到一个命令行终端。
  3. 在这个终端中,使用 parted 在目标硬盘上创建 RAID 分区。然后,使用 mdadm 使用任何以及所有可用的设置和选项从这些分区手动创建 raid 阵列。有关如何进行此操作的更多信息,请参阅 第 13 章 分区man partedman mdadm
  4. 创建阵列后,您可以选择在阵列上创建文件系统。
  5. 重启计算机,此时选择 InstallUpgrade 以正常安装。当 Anaconda 搜索系统中的磁盘时,它将找到预先存在的 RAID 设备。
  6. 当被问到如何使用系统中的磁盘时,请选择 Custom Layout 并单击 Next。在设备列表中,会列出预先存在的 MD RAID 设备。
  7. 选择 RAID 设备,点 Edit 并配置其挂载点,并(可选)应使用的文件系统类型(如果您之前没有创建),然后点 DoneAnaconda 将对此预先存在的 RAID 设备执行安装,在 Rescue Mode 中创建时保留您选择的自定义选项。
注意
安装程序的有限 Rescue Mode 不包括 man page。man mdadmman md 都包含创建自定义 RAID 阵列的有用信息,在整个临时解决方案中可能需要。因此,可以使用这些 man page 访问机器,或者在引导到救援模式并创建自定义阵列前打印它们。


[2] 热插拔机箱允许您移除硬盘驱动器,而无需关闭系统电源。

第 19 章 使用 mount 命令

在 Linux、UNIX 和类似操作系统上,不同分区和可移动设备(例如,CD、DVD 或者 USB 闪存驱动器)上的文件系统可以附加到目录树中的某个点( 挂载点),然后再次分离。要附加或分离文件系统,请分别使用 mountumount 命令。本章描述了这些命令的基本用途,以及一些高级主题,如移动挂载点或创建共享子树等。

19.1. 列出当前挂载的文件系统

要显示所有当前附加的文件系统,请使用以下命令,没有附加参数:
$ mount
此命令显示已知挂载点的列表。每行都提供有关设备名称、文件系统类型、挂载目录的重要信息,以及相关的挂载选项,格式如下:
device on directory type type (options)
Red Hat Enterprise Linux 6.1 也提供 findmnt 工具,它允许用户以类似于树形的形式列出挂载的文件系统。要显示所有当前附加的文件系统,请运行不带额外参数的 findmnt 命令:
$ findmnt

19.1.1. 指定文件系统类型

默认情况下,mount 命令的输出包括各种虚拟文件系统,如 sysfstmpfs。要只显示具有特定文件系统类型的设备,请提供 -t 选项:
$ mount -t type
同样,使用 findmnt 命令只显示具有特定文件系统的设备:
$ findmnt -t type
有关通用文件系统类型的列表,请参阅 表 19.1 “通用文件系统类型”。有关用法示例,请参阅 例 19.1 “列出当前挂载的 ext4 文件系统”

例 19.1. 列出当前挂载的 ext4 文件系统

通常,//boot 分区都被格式化为使用 ext4。要只显示使用此文件系统的挂载点,请使用以下命令:
$ mount -t ext4
/dev/sda2 on / type ext4 (rw)
/dev/sda1 on /boot type ext4 (rw)
要使用 findmnt 命令列出这些挂载点,请输入:
$ findmnt -t ext4
TARGET SOURCE    FSTYPE OPTIONS
/      /dev/sda2 ext4   rw,realtime,seclabel,barrier=1,data=ordered
/boot  /dev/sda1 ext4   rw,realtime,seclabel,barrier=1,data=ordered

19.2. 挂载文件系统

要附加某个文件系统,请使用以下格式的 mount 命令:
$ mount [option] device directory
该设备 可通过以下方法识别:
  • 块设备 的完整路径:例如 /dev/sda3
  • 通用唯一标识符 (UUID):例如 UUID=34795a28-ca6d-4fd8-a347-73671d0c19cb
  • 卷标签 :例如 LABEL=home
请注意,尽管挂载了文件系统,但无法访问 directory 中的原始内容。
重要:确保目录没有被使用
Linux 不阻止用户将文件系统挂载到已附加到其上的目录。要确定特定目录是否充当挂载点,请使用目录作为其参数运行 findmnt 工具,并验证退出代码:
findmnt directory; echo $?
如果没有将文件系统附加到目录,则给定命令会返回 1
当您运行不带所有所需信息的 mount 命令时,如果没有设备名称、目标目录或文件系统类型,挂载 会读取 /etc/fstab 文件的内容,以检查是否列出了给定的文件系统。/etc/fstab 文件包含设备名称列表、所选文件系统要挂载的目录,以及文件系统类型和挂载选项。因此,当挂载在 /etc/fstab 中指定的文件系统时,您可以选择以下选项之一:
mount [option] directory
mount [option] device
请注意,除非以 root 用户身份运行命令,否则挂载文件系统需要权限(请参阅 第 19.2.2 节 “指定挂载选项”)。
注: 确定 Particular 设备的 UUID 和标签
要确定 UUID 和-如果设备使用特定设备的标签,请使用以下格式的 blkid 命令:
blkid device
例如:要显示 /dev/sda3 的信息:
# blkid /dev/sda3
/dev/sda3: LABEL="home" UUID="34795a28-ca6d-4fd8-a347-73671d0c19cb" TYPE="ext3"

19.2.1. 指定文件系统类型

在大多数情况下,mount 会自动检测文件系统。但是,有一些某些文件系统,如 NFS (网络文件系统)或 CIFS (通用互联网文件系统),它们不能被识别,需要手动指定。要指定文件系统类型,请使用以下格式的 mount 命令:
$ mount -t type device directory
表 19.1 “通用文件系统类型” 提供可与 mount 命令一起使用的常用文件系统类型列表。有关所有可用文件系统类型的完整列表,请参阅 “手册页文档”一节

表 19.1. 通用文件系统类型

Type 描述
ext2 ext2 文件系统。
ext3 ext3 文件系统。
ext4 ext4 文件系统。
btrfs btrfs 文件系统。
xfs xfs 文件系统。
iso9660 ISO 9660 文件系统。它通常由光学介质(通常为 CD)使用。
nfs NFS 文件系统。它通常用于通过网络访问文件。
nfs4 NFSv4 文件系统。它通常用于通过网络访问文件。
udf UDF 文件系统。它通常由光学介质(通常为 DVD)使用。
vfat FAT 文件系统。它通常用于运行 Windows 操作系统的机器,以及某些数字媒体,如 USB 闪存驱动器或软盘。
有关示例用法,请查看 例 19.2 “挂载 USB 闪存驱动器”

例 19.2. 挂载 USB 闪存驱动器

较旧的 USB 闪存驱动器通常使用 FAT 文件系统。假设此类驱动器使用 /dev/sdc1 设备,并且 /media/flashdisk/ 目录存在,请以 root 用户身份在 shell 提示符后输入以下内容来将其挂载到此目录:
~]# mount -t vfat /dev/sdc1 /media/flashdisk

19.2.2. 指定挂载选项

要指定附加挂载选项,请使用以下格式的命令:
mount -o options device directory
在提供多个选项时,不要在逗号后插入空格,或者 mount 会将以下空格的值错误地解析为额外的参数。
表 19.2 “常用挂载选项” 提供了常用挂载选项的列表.有关所有可用选项的完整列表,请参阅 “手册页文档”一节 中的相关手册页。

表 19.2. 常用挂载选项

选项 描述
async 允许文件系统上的异步输入/输出操作。
auto 允许使用 mount -a 命令自动挂载文件系统。
默认值 async,auto,dev,exec,nouser,rw,suid 提供别名。
exec 允许在特定文件系统中执行二进制文件。
loop 将镜像挂载为 loop 设备。
noauto 默认行为不允许使用 mount -a 命令自动挂载文件系统。
noexec 不允许在特定文件系统中执行二进制文件。
nouser 不允许普通用户(即 root以外的用户)挂载和卸载文件系统。
remount 如果已经挂载文件系统,则会重新挂载文件系统。
ro 仅挂载文件系统以读取。
rw 挂载文件系统以进行读和写操作。
user 允许普通用户(即 root以外的用户)挂载和卸载文件系统。
有关示例用法,请查看 例 19.3 “挂载 ISO 镜像”

例 19.3. 挂载 ISO 镜像

可以使用 loop 设备挂载 ISO 镜像(一般而言是磁盘镜像)。假设 Fedora 14 安装磁盘的 ISO 镜像存在于当前工作目录中,并且 /media/cdrom/ 目录存在,请运行以下命令将镜像挂载到这个目录中:
# mount -o ro,loop Fedora-14-x86_64-Live-Desktop.iso /media/cdrom
请注意,ISO 9660 设计为只读文件系统。

19.2.3. 共享挂载

有时,某些系统管理任务需要从目录树中的多个位置(例如,准备 chroot 环境时)访问同一文件系统。这可以实现,而且 Linux 允许您根据需要将同一文件系统挂载到多个目录。另外,mount 命令实现了 --bind 选项,它提供复制某些挂载的方法。其用法如下:
$ mount --bind old_directory new_directory
虽然此命令允许用户从两个位置访问文件系统,但它不适用于原始目录中挂载的文件系统。要包括这些挂载,请使用以下命令:
$ mount --rbind old_directory new_directory
此外,为了提供尽可能多的灵活性,Red Hat Enterprise Linux 7 实现了称为 共享子树 的功能。此功能允许使用以下四种挂载类型:
共享挂载
共享挂载允许创建给定挂载点的精确副本。当挂载点标记为共享挂载时,原始挂载点中的任何挂载都会反映在其中,反之亦然。要将挂载点类型改为共享挂载,请在 shell 提示符下输入以下内容:
$ mount --make-shared mount_point
或者,要更改所选挂载点的挂载类型,以及其下的所有挂载点:
$ mount --make-rshared mount_point
有关示例用法,请查看 例 19.4 “创建共享挂载点”

例 19.4. 创建共享挂载点

其他文件系统通常挂载在两个位置:可移动介质的 /media/ 目录,以及用于临时挂载的文件系统的 /mnt/ 目录。通过使用共享挂载,您可以使这两个目录共享相同的内容。要做到这一点,以 root 用户身份将 /media/ 目录标记为 shared :
# mount --bind /media /media
# mount --make-shared /media
使用以下命令在 /mnt/ 中创建副本:
# mount --bind /media /mnt
现在,可以验证 /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
同样,可以验证 /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
从属挂载
从属挂载允许创建给定挂载点的有限副本。当挂载点标记为从属挂载时,原始挂载点中的任何挂载都会反映在其中,但从属挂载中的挂载不会反映在其原始挂载点中。要将挂载点类型改为从属挂载,在 shell 提示符下输入以下内容:
mount --make-slave mount_point
或者,要更改所选挂载点的挂载类型,以及其下的所有挂载点,请输入:
mount --make-rslave mount_point
有关示例用法,请查看 例 19.5 “创建从属挂载点”

例 19.5. 创建从属挂载点

本例演示了如何使 /media/ 目录的内容也出现在 /mnt/ 中,但 /mnt/ 目录中的任何挂载都不会反映在 /media/ 目录中。以 root 用户身份,首先将 /media/ 目录标记为共享:
~]# mount --bind /media /media
~]# mount --make-shared /media
然后,在 /mnt/ 中创建副本,但将其标记为"slave":
~]# mount --bind /media /mnt
~]# mount --make-slave /mnt
现在,验证 /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
同时还要验证 /mnt/ 目录中挂载的文件系统没有反映在 /media/ 中。例如,如果插入了使用 /dev/sdc1 设备的非空 USB 闪存驱动器,并且存在 /mnt/flashdisk/ 目录,请输入:
~]# mount /dev/sdc1 /mnt/flashdisk
~]# ls /media/flashdisk
~]# ls /mnt/flashdisk
en-US  publican.cfg
私有挂载
私有挂载是默认挂载类型,与共享或从属挂载不同,它不接收或转发任何传播事件。要将挂载点显式标记为私有挂载,在 shell 提示符下输入以下内容:
mount --make-private mount_point
另外,也可以更改所选挂载点的挂载类型,以及其下的所有挂载点:
mount --make-rprivate mount_point
有关示例用法,请查看 例 19.6 “创建私有挂载点”

例 19.6. 创建私有挂载点

考虑 例 19.4 “创建共享挂载点” 中的场景,假设之前已以 root 用户身份使用以下命令创建了共享挂载点:
~]# mount --bind /media /media
~]# mount --make-shared /media
~]# mount --bind /media /mnt
要将 /mnt/ 目录标记为私有,请输入:
~]# mount --make-private /mnt
现在,可以验证 /media/ 中的挂载没有出现在 /mnt/ 中。例如,如果 CD-ROM 驱动器包含非空介质,并且 /media/cdrom/ 目录存在,请运行以下命令:
~]# mount /dev/cdrom /media/cdrom
~]# ls /media/cdrom
EFI  GPL  isolinux  LiveOS
~]# ls /mnt/cdrom
~]#
也可以验证 /mnt/ 目录中挂载的文件系统没有反映在 /media/ 中。例如,如果插入了使用 /dev/sdc1 设备的非空 USB 闪存驱动器,并且存在 /mnt/flashdisk/ 目录,请输入:
~]# mount /dev/sdc1 /mnt/flashdisk
~]# ls /media/flashdisk
~]# ls /mnt/flashdisk
en-US  publican.cfg
不可绑定挂载
为了防止指定挂载点重复,需要使用不可绑定挂载。要将挂载点类型更改为不可绑定挂载,在 shell 提示符下输入以下内容:
mount --make-unbindable mount_point
另外,也可以更改所选挂载点的挂载类型,以及其下的所有挂载点:
mount --make-runbindable mount_point
有关示例用法,请查看 例 19.7 “创建不可绑定挂载点”

例 19.7. 创建不可绑定挂载点

要防止 /media/ 目录被共享,以 root 用户身份:
# mount --bind /media /media
# mount --make-unbindable /media
这样,任何后续尝试重复此挂载都会失败,并显示错误:
# mount --bind /media /mnt
mount: wrong fs type, bad option, bad superblock on /media,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail  or so

19.2.4. 移动挂载点

要更改挂载文件系统的目录,请使用以下命令:
# mount --move old_directory new_directory
有关示例用法,请查看 例 19.8 “移动现有的 NFS 挂载点”

例 19.8. 移动现有的 NFS 挂载点

NFS 存储包含用户目录,并且已挂载到 /mnt/userdirs/ 中。以 root 用户身份,使用以下命令将此挂载点移到 /home
# mount --move /mnt/userdirs /home
要验证挂载点是否已移动,请列出两个目录中的内容:
# ls /mnt/userdirs
# ls /home
jill  joe

19.2.5. 为 root设置只读权限

有时,您需要使用只读权限挂载 root 文件系统。示例用例包括在系统意外断电后增强安全性或确保数据完整性。

19.2.5.1. 将 root 配置为在引导时使用只读权限挂载

  1. /etc/sysconfig/readonly-root 文件中,将 READONLY 更改为 yes
    # Set to 'yes' to mount the file systems as read-only.
    READONLY=yes
    [output truncated]
  2. /etc/fstab 文件中的 root 条目(/)中将默认更改为 ro
    /dev/mapper/luks-c376919e... / ext4 ro,x-systemd.device-timeout=0 1 1
  3. ro 添加到 /etc/default/grub 文件中的 GRUB_CMDLINE_LINUX 指令中,并确保它不包含 rw
    GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet ro"
  4. 重新创建 GRUB2 配置文件:
    # grub2-mkconfig -o /boot/grub2/grub.cfg
  5. 如果您需要在 tmpfs 文件系统中添加需要挂载具有写权限的文件和目录,请在 /etc/rwtab.d/ 目录中创建一个文本文件,并将配置放在其中。例如,要挂载具有写入权限的 /etc/example/file,请将此行添加到 /etc/rwtab.d/示例 文件中:
    files /etc/example/file
    重要
    tmpfs 中的文件和目录所做的更改不会在启动后保留。
    有关此步骤的详情,请查看 第 19.2.5.3 节 “保留写权限的文件和目录”
  6. 重启系统。

19.2.5.2. 重新挂载 root Instantly

如果 root (/)在系统引导时以只读权限挂载,您可以使用写入权限重新挂载它:
# mount -o remount,rw /
/ 错误地挂载了只读权限时,这特别有用。
要再次以只读权限重新挂载 /,请运行:
# mount -o remount,ro /
注意
此命令使用只读权限挂载 整个 /。更好的方法是将特定文件和目录的写入权限复制到 RAM 中,如 第 19.2.5.1 节 “将 root 配置为在引导时使用只读权限挂载” 所述。

19.2.5.3. 保留写权限的文件和目录

要使系统正常工作,一些文件和目录需要保留写权限。使用只读模式的 root 时,它们将挂载到 tmpfs 临时文件系统的 RAM 中。这些文件和目录的默认集合是从 /etc/rwtab 文件中读取的,该文件包含:
dirs	/var/cache/man
dirs	/var/gdm
[output truncated]
empty	/tmp
empty	/var/cache/foomatic
[output truncated]
files	/etc/adjtime
files	/etc/ntp.conf
[output truncated]
/etc/rwtab 文件中的条目遵循以下格式:
how the file or directory is copied to tmpfs       	path to the file or directory
文件或目录可以通过以下三种方式复制到 tmpfs
  • 路径 :空路径复制到 tmpfs。示例: 空 /tmp
  • 目录路径 :目录树被复制到 tmpfs,空。示例: dirs /var/run
  • 文件路径 :将文件或目录树复制到 tmpfs。示例: 文件 /etc/resolv.conf
在向 /etc/rwtab.d/ 添加自定义路径时,也适用相同的格式。

19.3. 卸载文件系统

要分离之前挂载的文件系统,请使用以下 umount 命令的变体之一:
$ umount directory
$ umount device
请注意,除非以 root 身份登录时执行此操作,否则必须有正确的权限才能卸载文件系统。如需更多信息,请参阅 第 19.2.2 节 “指定挂载选项”。有关示例用法,请查看 例 19.9 “卸载 CD”
重要:确保目录没有被使用
当使用文件系统时(例如,当某个进程正在读取此文件系统上的文件时,或者内核使用该文件时),运行 umount 命令会失败并显示错误。要确定哪个进程正在访问文件系统,请使用以下格式的 fuser 命令:
$ fuser -m directory
例如,列出正在访问挂载到 /media/cdrom/ 目录的文件系统的进程:
$ fuser -m /media/cdrom
/media/cdrom:         1793  2013  2022  2435 10532c 10672c

例 19.9. 卸载 CD

要卸载之前挂载到 /media/cdrom/ 目录的 CD,请使用以下命令:
$ umount /media/cdrom

19.4. mount 命令参考

以下资源提供有关该主题的深入文档:

手册页文档

  • man 8 mountmount 命令的手册页,提供了有关其使用的完整文档。
  • man 8 umount: umount 命令的手册页,提供了有关其使用的完整文档。
  • man 8 findmntfindmnt 命令的手册页,提供了有关其使用的完整文档。
  • man 5 fstab :手册页提供了 /etc/fstab 文件格式的详细描述。

有用的网站

  • 共享子树 - 涵盖了共享子树概念的 LWN 文章。

第 20 章 volume_key Function

volume_key 功能提供两个工具:libvolume_key 和 volume_key. libvolume_key,是用于操作存储卷加密密钥的库,并将它们与卷分开存储。volume_key 是一个关联的命令行工具,用于提取密钥和密码短语,以便恢复对加密硬盘驱动器的访问。
这对于员工突然离开后,主要用户忘记了他们的密钥和密码,或者由于硬件或软件故障破坏了加密卷的头后提取数据时,非常有用。在公司设置中,IT 帮助台可以使用 volume_key 在将计算机移交至最终用户之前备份加密密钥。
目前,volume_key 只支持 LUKS 卷加密格式。
注意
volume_key 不包含在 Red Hat Enterprise Linux 7 服务器标准安装中。有关安装的详情,请参考: http://fedoraproject.org/wiki/Disk_encryption_key_escrow_use_cases

20.1. volume_key 命令

volume_key 的格式是:
volume_key [OPTION]... OPERAND
volume_key 的操作对象和操作模式是通过指定以下选项之一来确定的:
--save
此命令需要操作对象 volume [packet]。如果提供了 数据包,则 volume_key 将从中提取密钥和密码短语。如果没有提供 数据包,则 volume _key 将从卷中提取密钥和密码短语,并在需要时提示用户输入。然后这些密钥和密码短语将存储在一个或多个输出数据包中。
--restore
此命令需要操作对象 volume packet。然后,它打开 volume ,并使用 packet 中的密钥和密码短语使 volume 可再次访问,并在需要时提示用户,例如允许用户输入新的密语。
--setup-volume
此命令需要操作对象 volume packet name。然后,它打开 volume ,并使用 packet 中的密钥和密码短语来设置 volume,以便将解密的数据用作 name
Name 是 dm-crypt 卷的名称。此操作使解密的卷作为 /dev/mapper/名称 提供。
例如,此操作不会通过添加新密码短语来永久更改 volume。用户可以访问和修改解密的卷,从而可以在过程中修改 volume
--reencrypt--secrets--dump
这三个命令使用不同的输出方法执行类似的功能。它们每个都需要操作对象 packet,并且每个都打开 packet,根据需要对其进行解密。然后 --reencrypt 将信息存储在一个或多个新输出数据包中。--secrets 输出包含在 数据包 中的密钥和密码短语。--dump 输出数据包的内容,但默认情况下不会输出密钥和密码短语。这可以通过在命令中附加 --with-secrets 来更改。也可以使用 --unencrypted 命令仅转储数据包的未加密部分(若有)。这不需要任何密语或私钥访问。
每个选项均可附加以下选项:
-o,--output packet
此命令将默认密钥或密语写入 packet。默认密钥或密语取决于卷格式。确保它不太可能过期,并且允许 --restore 恢复对卷的访问。
--output-format format
此命令对所有输出数据包使用指定的 format。目前,format 可以是以下之一:
  • 非对称 :使用 CMS 来加密整个数据包,并且需要证书
  • asymmetric_wrap_secret_only: 仅打包 secret 或密钥和密码短语,并且需要证书
  • 密码短语 :使用 GPG 来加密整个数据包,并且需要密码短语
--create-random-passphrase packet
此命令生成随机的字母数字密码短语,将它添加到 volume 中(而不影响其他密语),然后将此随机密语存储到 packet 中。

20.2. 将 volume_key 用作单个用户

作为单个用户,可以按照以下流程使用 volume_key 来保存加密密钥。
注意
对于此文件中的所有示例,/path/to/volume 是 LUKS 设备,而不是包含在其中的明文设备。blkid -s type /path/to/volume 应该报告 type="crypto_LUKS"

过程 20.1. 使用 volume_key Stand-alone

  1. 运行:
    volume_key --save /path/to/volume -o escrow-packet
    然后,系统将出现提示,要求使用托管包密语来保护密钥。
  2. 保存生成的 escrow-packet 文件,确保不会忘记密码短语。
如果忘记了卷密语,请使用保存的托管包恢复对数据的访问。

过程 20.2. 使用 Escrow Packet 将数据访问恢复到数据

  1. 在可以运行 volume_key 且托管数据包可用的环境中引导系统(例如,救援模式)。
  2. 运行:
    volume_key --restore /path/to/volume escrow-packet
    将显示一个提示,提示创建托管数据包时使用的托管数据包密码短语,以及卷的新密语。
  3. 使用所选的密码短语挂载卷。
要在加密卷的 LUKS 标头中释放密码短语插槽,请使用 cryptsetup luksKillSlot 命令删除旧的、忘记的密码短语。

20.3. 在大型机构中使用 volume_key

在大型组织中,使用每位系统管理员知道的单个密码并跟踪各个系统的单独密码是不切实际的,而且存在安全风险。为克服这一点,volume_key 可以使用非对称加密加密来最小化知道访问任何计算机上加密数据所需的密码的人员数量。
本节将涵盖在保存加密密钥前需要准备的流程、如何保存加密密钥、恢复对卷的访问以及设置紧急密码短语。

20.3.1. 准备保存加密密钥

为了开始保存加密密钥,需要进行一些准备。

过程 20.3. 准备

  1. 创建 X509 证书/专用对。
  2. 指定信任的用户,这些用户可信,不会泄露私钥。这些用户将能够解密托管数据包。
  3. 选择将使用哪些系统解密托管数据包。在这些系统上,建立包含私钥的 NSS 数据库。
    如果没有在 NSS 数据库中创建私钥,请按照以下步骤操作:
    • 将证书和私钥存储在 PKCScriu 文件中
    • 运行:
      certutil -d /the/nss/directory -N
      此时,可以选择 NSS 数据库密码。每个 NSS 数据库都有不同的密码,因此如果每个用户使用单独的 NSS 数据库,则指定的用户无需共享单个密码。
    • 运行:
      pk12util -d /the/nss/directory -i the-pkcs12-file
  4. 将证书分发给安装系统或将密钥保存在现有系统上的任何人。
  5. 对于保存的私钥,准备允许按机器和卷查找它们的存储。例如,这可以是一个简单的目录,每台机器有一个子目录,或者用于其他系统管理任务的数据库。

20.3.2. 保存加密密钥

完成所需的准备(请参阅 第 20.3.1 节 “准备保存加密密钥”)后,现在可以使用以下流程保存加密密钥。
注意
对于此文件中的所有示例,/path/to/volume 是 LUKS 设备,而不是包含的明文设备; blkid -s 类型 /path/to/volume 应报告 type="crypto_LUKS"

过程 20.4. 保存加密密钥

  1. 运行:
    volume_key --save /path/to/volume -c /path/to/cert escrow-packet
  2. 将生成的 escrow-packet 文件保存到准备好的存储中,将其与系统和卷相关联。
这些步骤可以手动执行,也可以作为系统安装的一部分编写成脚本。

20.3.3. 恢复对卷的访问

保存加密密钥(请参阅 第 20.3.1 节 “准备保存加密密钥”第 20.3.2 节 “保存加密密钥”)后,可以根据需要恢复对驱动程序的访问。

过程 20.5. 恢复对卷的访问

  1. 从数据包存储中获取卷的托管数据包,并将其发送到指定用户之一进行解密。
  2. 指定的用户运行:
    volume_key --reencrypt -d /the/nss/directory escrow-packet-in -o escrow-packet-out
    提供 NSS 数据库密码后,指定的用户选择加密 escrow-packet-out 的密码短语。此密语每次都可能会有所不同,且只在加密密钥从指定用户移至目标系统时保护加密密钥。
  3. 从指定的用户获取 escrow-packet-out 文件和密码短语。
  4. 在可以运行 volume_key 且可以使用 escrow-packet-out 文件的环境中引导目标系统,比如在救援模式下。
  5. 运行:
    volume_key --restore /path/to/volume escrow-packet-out
    将出现一个提示,提示指定用户所选择的数据包密码,以及卷的新密码。
  6. 使用所选的卷密语挂载卷。
可以使用 cryptsetup luksKillSlot 删除忘记的旧密码短语,例如,在加密卷的 LUKS 标头中释放密语插槽。这可以通过 cryptsetup luksKillSlot device key-slot 命令完成。如需更多信息和示例,请参阅 cryptsetup --help

20.3.4. 设置紧急密码

在某些情况下(如业务旅行),系统管理员直接操作受影响的系统是不切实际的,但用户仍需要访问这些系统的数据。在这种情况下,volume_key 可以使用密码短语和加密密钥。
在系统安装过程中,运行:
volume_key --save /path/to/volume -c /path/to/ert --create-random-passphrase passphrase-packet
这会生成随机密码短语,将其添加到指定的卷中,并将其保存到 passphrase-packet 中。也可以组合 --create-random-passphrase-o 选项,以同时生成这两个数据包。
如果用户忘记了密码,指定用户运行:
volume_key --secrets -d /your/nss/directory passphrase-packet
这将显示随机密码短语。向最终用户提供此密码短语。

20.4. volume_key 参考

有关 volume_key 的更多信息,请参阅:

第 21 章 固态磁盘部署指南

固态磁盘 (SSD)是使用 NAND 闪存芯片来持久存储数据的存储设备。这样可将其与之前生成的磁盘外设置,后者将数据存储在旋转、大体上手中。在 SSD 中,完整逻辑块地址(LBA)范围的数据访问时间是恒定的;而对于使用旋转介质的旧磁盘,跨越大型地址范围的访问模式会导致成本。因此,SSD 设备具有更好的延迟和吞吐量。
性能降低,因为已用块的数量接近磁盘容量。性能影响的程度因供应商而异。但是,所有设备都出现某种降级。
要解决降级的问题,主机系统(如 Linux 内核)可以使用丢弃的请求来告知存储给定范围的块不再使用。SSD 可以使用此信息在内部释放空间,使用空闲块进行磨损均衡。只有存储宣传支持其存储协议(ATA 或 SCSI)时,才会发出丢弃。使用特定于存储协议的协商 discard 命令(用于 ATA 的TRIM 命令和带有 UNMAP 集的 WRITE SAME 或 SCSI 的 UNMAP 命令)向存储发出丢弃请求。
当以下点为 true 时启用 丢弃 支持最有用:
  • 可用空间仍可在文件系统中可用。
  • 底层存储设备上的大多数逻辑块已被写入。
有关 TRIM 的更多信息,请参阅 数据集管理 T13 规范
有关 UNMAP 的更多信息,请参阅 SCSI 块命令 3 T10 规范 的 4.7.3.4 部分。
注意
不是市场中的所有固态设备 都支持。要确定您的固态设备是否支持 丢弃,请检查 /sys/block/sda/queue/discard_granularity,这是设备的内部分配单元的大小。

部署注意事项

由于 SSD 的内部布局和操作,最好在内部 擦除块边界 上对设备进行分区。如果 SSD 导出拓扑信息,Red Hat Enterprise Linux 7 中的分区工具会选择 sane 默认值。但是,如果设备 没有 导出拓扑信息,红帽建议在 1MB 边界下创建第一个分区。
SSD 有不同的 TRIM 机制,具体取决于供应商选择。早期版本的磁盘通过在 read 命令后影响数据泄漏来提高性能。
以下是 TRIM 机制的类型:
  • 非确定的 TRIM
  • 确定性 TRIM (DRAT)
  • TRIM (RZAT)后确定性读零
TRIM 返回不同或相同数据后,前两种 TRIM 机制可能会导致数据泄漏,因为 read 命令会泄漏到 LBA。RZAT 在 read 命令后返回零,红帽建议这种 TRIM 机制以避免数据泄露。它只在 SSD 中受到影响。选择支持 RZAT 机制的磁盘。
使用的 TRIM 机制类型取决于硬件实现。要在 ATA 上查找 TRIM 机制的类型,请使用 hdparm 命令。请参阅以下示例来查找 TRIM 机制的类型:
# hdparm -I /dev/sda | grep TRIM
Data Set Management TRIM supported (limit 8 block)
Deterministic read data after TRIM
如需更多信息,请参阅 man hdparm
LVM 使用的逻辑卷管理器(LVM)、设备映射器(DM)目标和 MD (软件 raid)目标。不支持丢弃的唯一 DM 目标是 dm-snapshot、dm-crypt 和 dm-raid45。在 Red Hat Enterprise Linux 6.1 中添加了对 dm-mirror 的丢弃支持,在 7.0 MD 中支持丢弃。
如果 SSD 无法正确处理 丢弃,则使用 RAID 5 与 SSD 的性能会较低。您可以在 raid456.conf 文件中设置 discard,或者在 GRUB2 配置中设置 discard。具体步骤请查看以下步骤。

过程 21.1. 在 raid456.conf 中设置 discard

devices_handle_discard_safely 模块参数在 raid456 模块中设置。在 raid456.conf 文件中启用丢弃:
  1. 验证您的硬件支持丢弃:
    # cat /sys/block/disk-name/queue/discard_zeroes_data
    如果返回的值是 1,则支持丢弃。如果命令返回 0, RAID 代码必须归零磁盘,这需要更长的时间。
  2. 创建 /etc/modprobe.d/raid456.conf 文件,并包含以下行:
    options raid456 devices_handle_discard_safely=Y
    
  3. 使用 dracut -f 命令重建初始 ramdisk (initrd)。
  4. 重启系统以使更改生效。

过程 21.2. 在 GRUB2 配置中设置 discard

devices_handle_discard_safely 模块参数在 raid456 模块中设置。在 GRUB2 配置中启用丢弃:
  1. 验证您的硬件支持丢弃:
    # cat /sys/block/disk-name/queue/discard_zeroes_data
    如果返回的值是 1,则支持丢弃。如果命令返回 0, RAID 代码必须归零磁盘,这需要更长的时间。
  2. /etc/default/grub 文件中添加以下行:
    raid456.devices_handle_discard_safely=Y
    
  3. 在使用 BIOS 固件以及带有 UEFI 的系统中,GRUB2 配置文件的位置有所不同。使用以下命令之一重新创建 GRUB2 配置文件。
    • 在带有 BIOS 固件的系统中,使用:
      # grub2-mkconfig -o /boot/grub2/grub.cfg
    • 在具有 UEFI 固件的系统中,使用:
      # grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
  4. 重启系统以使更改生效。
注意
在 Red Hat Enterprise Linux 7 中,仅 ext4 和 XFS 文件系统完全支持 discard。
在 Red Hat Enterprise Linux 6.3 及更早版本中,只有 ext4 文件系统完全支持 discard。从 Red Hat Enterprise Linux 6.4 开始,ext4 和 XFS 文件系统都完全支持 discard。要在设备上启用 discard 命令,请使用 mount 命令的 discard 选项。例如:要将 /dev/sda2 挂载到启用了 discard 的 /mnt 中,请使用:
# mount -t ext4 -o discard /dev/sda2 /mnt
默认情况下,ext4 不会发出 discard 命令,主要避免了可能无法正确实现丢弃的设备出现问题。Linux swap 代码为启用丢弃的设备发出丢弃命令,没有控制此行为的选项。

性能调优注意事项

有关固态磁盘性能调优注意事项的详情,请查看 Red Hat Enterprise Linux 7 性能调节指南 中的 Solid-State 磁盘 部分。

第 22 章 写屏障

中获取的内容
写屏障 是一种内核机制,用于确保正确写入文件系统元数据,并在持久存储上排序,即使具有易失性写缓存的存储设备断电。启用写屏障的文件系统可确保通过 fsync () 传输的数据在电源丢失过程中持久保留。
启用写屏障会给某些应用程序带来大量性能损失。具体来说,大量使用 fsync () 或创建和删除许多小文件的应用程序可能会运行得非常慢。

22.1. 写屏障的重要性

文件系统安全地更新元数据,确保一致性。Journalled 文件系统将元数据更新捆绑到事务中,并以以下方式将它们发送到持久性存储:
  1. 文件系统将事务正文发送到存储设备。
  2. 文件系统发送提交块。
  3. 如果事务及其相应的提交块写入了磁盘,则文件系统假定事务将在任何电源失败后都能生存。
但是,对于带有额外缓存的存储设备而言,电源失败期间文件系统的完整性会变得更加复杂。存储目标设备(如本地 S-ATA 或 SAS 驱动器)可能具有大小为 32MB 到 64MB 的写缓存(与现代驱动器)。硬件 RAID 控制器通常包含内部写缓存。此外,像 NetApp、IBM、Hitachi 和 EMC(其他人)的高端阵列也具有大型缓存。
当数据处于缓存中时,带有写缓存的存储设备会报告 I/O 为"完成";如果缓存断电,也会丢失数据。更糟糕的情况是,当缓存降级到持久存储时,它可能会更改原始元数据排序。发生这种情况时,提交块可能会出现在磁盘上,而没有完整的、相关的事务。因此,日志可能会在断电后的恢复期间将这些未初始化的事务块重新运行到文件系统中,这会导致数据不一致和损坏。

写障碍是如何工作的

在 Linux 内核中,写障碍是通过 I/O 前后的存储写缓存刷新实现的,这是 顺序关键的。写事务后,将刷新存储缓存,提交块被写入,然后再次刷新缓存。这样可确保:
  • 磁盘包含所有数据。
  • 未发生重新排序。
启用障碍后,fsync () 调用也会发出存储缓存清除。这样可保证文件数据在磁盘上持久保留,即使 fsync () 返回后不久发生断电。

22.2. 启用和禁用写障碍

为了降低掉电期间数据损坏的风险,一些存储设备使用电池支持的写缓存。通常,高端阵列和一些硬件控制器使用电池支持的写缓存。但是,由于缓存的剧剧性对内核不可见,因此 Red Hat Enterprise Linux 7 在所有支持的日志记录文件系统中默认启用写障碍。
注意
写入缓存旨在提高 I/O 性能。但是,启用写屏障意味着持续清除这些缓存,这可以显著降低性能。
对于具有非易失性、支持电池支持的写缓存的设备以及禁用写缓存的设备,您可以在挂载时使用 mount-o nobarrier 选项安全地禁用写障碍。但是,有些设备不支持写屏障,此类设备会将错误消息记录到 /var/log/messages。如需更多信息,请参阅 表 22.1 “每个文件系统的写障碍错误消息”

表 22.1. 每个文件系统的写障碍错误消息

文件系统错误消息
ext3/ext4JBD: barrier-based sync failed on device - disabling barriers
XFSFilesystem device - Disabling barriers, trial barrier write failed
btrfsbtrfs: disabling barriers on dev device

22.3. 写障碍注意事项

有些系统配置不需要写屏障来保护数据。在大多数情况下,其他方法比写屏障更可取,因为启用写障碍会导致严重的性能损失。

禁用写缓存

避免数据完整性问题的另一种方法是确保在电源失败时不丢失任何写缓存数据。在可能的情况下,配置此功能的最佳方法是禁用写缓存。在使用一个或多个 SATA 驱动器的简单服务器或桌面上(关闭本地 SATA 控制器 Intel AHCI 部分),您可以使用以下命令在目标 SATA 驱动器中禁用写缓存:
# hdparm -W0 /device/

电池支持的写缓存

当系统使用带有电池支持的写缓存的硬件 RAID 控制器时,写障碍也是不必要的。如果系统带有此类控制器,并且其组件驱动器禁用了写缓存,则控制器将充当直写缓存,这会告知内核写缓存数据在电源丢失后仍存在。
大多数控制器使用特定于供应商的工具来查询和操作目标驱动器。例如,LSI Megaraid SAS 控制器使用电池支持的写缓存;这种类型的控制器需要 MegaCli64 工具来管理目标驱动器。要显示 LSI Megaraid SAS 的所有后端驱动器的状态,请使用:
# MegaCli64 -LDGetProp -DskCache -LAll -aALL
要禁用 LSI Megaraid SAS 的所有后端驱动器的写缓存,请使用:
# MegaCli64 -LDSetProp -DisDskCache -Lall -aALL
注意
在系统运行时,硬件 RAID 卡会对电池充电。如果系统关机的时间较长,则电池将不会充电,从而在电源故障期间存储的数据会丢失。

高端阵列

高端阵列在电源故障时有多种保护数据的方法。因此,不需要验证外部 RAID 存储中的内部驱动器的状态。

NFS

NFS 客户端不需要启用写障碍,因为数据完整性是由 NFS 服务器端处理的。因此,应配置 NFS 服务器,以确保断电过程中数据的持久性(无论是通过写障碍还是通过其他方法)。

第 23 章 存储 I/O 校准和大小

最近对 SCSI 和 ATA 标准的增强允许存储设备指明其首选的(在某些情况下需要的) I/O 校准I/O 大小。对于将物理扇区大小从 512 字节增加到 4k 字节的较新的磁盘驱动器,此信息特别有用。此信息可能对 RAID 设备有好处,其中块大小和条带大小可能会影响性能。
Linux I/O 堆栈已被改进,可处理供应商提供的 I/O 校准和 I/O 大小信息,允许存储管理工具(partedlvmmkfs. X 等)来优化数据放置和访问。如果传统设备没有导出 I/O 校准和大小数据,Red Hat Enterprise Linux 7 中的存储管理工具会更保守地在 4k (或更大 2 的指数 2)边界上校准 I/O。这可以确保 4k 扇区设备正确运行,即使它们没有指出任何需要/首选的 I/O 校准和大小。
有关确定操作系统从该设备中获取的信息,请参考 第 23.2 节 “用户空间访问”。存储管理工具随后将使用此数据来确定数据放置。
Red Hat Enterprise Linux 7 的 IO 调度程序已更改。默认的 IO 调度程序现在为 Deadline,但 SATA 驱动器除外。CFQ 是 SATA 驱动器的默认 IO 调度程序。为实现更快的存储,Deadline 优于 CFQ 的性能,在使用时可以提高性能,无需特殊调优。
如果默认值不适合某些磁盘(例如,SAS 轮转磁盘),则将 IO 调度程序更改为 CFQ。此实例将取决于工作负载。

23.1. 存储访问参数

操作系统使用以下信息来确定 I/O 校准和大小:
physical_block_size
设备可操作的最小内部单位
logical_block_size
用于外部定位设备上的位置
alignment_offset
Linux 块设备开始的字节数(分区/MD/LVM 设备)是底层物理校准的偏移量
minimum_io_size
设备用于随机 I/O 的首选最小单位
optimal_io_size
设备用于流 I/O 的首选单位
例如,某些 4K 扇区设备可以在内部使用 4K physical_block_size,但向 Linux 公开更精细的 512 字节 logical_block_size。这种差异可能会导致 I/O 不准。为解决这个问题,Red Hat Enterprise Linux 7 I/O 堆栈将尝试启动自然对齐边界(physical_block_size)上的所有数据区域,如果块设备的开头是底层物理校准的偏移量。
存储供应商还可以提供有关设备的随机 I/O (minimum_io_size)和流 I/O (optimal_io_size)的首选最小单元的 I/O 提示。例如: minimum_io_sizeoptimal_io_size 分别对应于 RAID 设备的块大小和条带大小。

23.2. 用户空间访问

始终要小心使用正确校准和大小的 I/O。这对于直接 I/O 访问尤为重要。直接 I/O 应在 logical_block_size 边界上对齐,并在 logical_block_size 的倍数上保持一致。
使用原生 4K 设备(即 logical_block_size 为 4K)现在对于在设备的 logical_block_size 的倍数中执行直接 I/O 至关重要。这意味着,如果带有原生 4k 设备的应用程序执行 512 字节校准的 I/O,而不是 4k 校准的 I/O 时将失败。
为避免这种情况,应用程序应参考设备的 I/O 参数来确保使用了正确的 I/O 校准和大小。如前文所述,I/O 参数通过 sysfs 和块设备 ioctl 接口公开。
如需更多信息,请参阅 man libblkid。此 man page 由 libblkid-devel 软件包提供。

sysfs 接口

  • /sys/block/disk/alignment_offset
    或者
    /sys/block/disk/partition/alignment_offset
    注意
    文件位置取决于磁盘是物理磁盘(即本地磁盘、本地 RAID 或者多路径 LUN)还是虚拟磁盘。第一个文件位置适用于物理磁盘,第二个文件位置适用于虚拟磁盘。其原因是 virtio-blk 始终会报告分区的对齐值。物理磁盘可能也可能不会报告对齐值。
  • /sys/block/disk/queue/physical_block_size
  • /sys/block/disk/queue/logical_block_size
  • /sys/block/disk/queue/minimum_io_size
  • /sys/block/disk/queue/optimal_io_size
内核仍会为不提供 I/O 参数信息的"传统"设备导出这些 sysfs 属性,例如:

例 23.1. sysfs 接口

alignment_offset:    0
physical_block_size: 512
logical_block_size:  512
minimum_io_size:     512
optimal_io_size:     0

块设备 ioctls

  • BLKALIGNOFF: alignment_offset
  • BLKPBSZGET: physical_block_size
  • BLKSSZGET: logical_block_size
  • BLKIOMIN: minimum_io_size
  • BLKIOOPToptimal_io_size

23.3. I/O 标准

这部分描述了 ATA 和 SCSI 设备所使用的 I/O 标准。

ATA

ATA 设备必须通过 IDENTIFY DEVICE 命令报告合适的信息。ATA 设备仅报告 physical_block_sizelogical_block_sizealignment_offset 的 I/O 参数。其他 I/O 提示超出了 ATA 命令集的范围。

SCSI

Red Hat Enterprise Linux 7 中的 I/O 参数支持至少需要 SCSI 主命令 (SPC-3) 协议的版本 3。内核只会向声明符合 SPC-3 的设备发送 扩展查询 (其可以访问 BLOCK LIMITS VPD 页面)和 READ CAPACITY (16) 命令。
READ CAPACITY (16) 命令提供块大小和校准偏移量:
  • LOGICAL BLOCK LENGTH IN BYTES 用于派生 /sys/block/磁盘/queue/physical_block_size
  • LOGICAL BLOCKS PER PHYSICAL BLOCK EXPONENT 用于派生 /sys/block/磁盘/queue/logical_block_size
  • LOWEST ALIGNED LOGICAL BLOCK ADDRESS 用于派生:
    • /sys/block/disk/alignment_offset
    • /sys/block/disk/partition/alignment_offset
BLOCK LIMITS VPD 页面(0xb0)提供 I/O 提示。它还使用 OPTIMAL TRANSFER LENGTH GRANULARITYOPTIMAL TRANSFER LENGTH 派生:
  • /sys/block/disk/queue/minimum_io_size
  • /sys/block/disk/queue/optimal_io_size
sg3_utils 软件包提供 sg_inq 工具,可用于访问 BLOCK LIMITS VPD 页面。为此,请运行:
# sg_inq -p 0xb0 disk

23.4. 堆栈 I/O 参数

Linux I/O 堆栈的所有层都经过了设计,可以在堆栈之上传播各种 I/O 参数。当层消耗属性或聚合多个设备时,该层必须公开适当的 I/O 参数,以便上层设备或工具在转换后能够准确地查看存储。一些实际的示例如下:
  • 对于非零 alignment_offset,仅应调整 I/O 堆栈中的一个层;当层相应地调整后,它将导出具有 alignment_offset 为 0 的设备。
  • 使用 LVM 创建的条状设备映射器(DM)设备必须导出相对于条带数(磁盘数)和用户提供的块大小的 minimum_io_sizeoptimal_io_size
在 Red Hat Enterprise Linux 7 中,设备映射器和软件 Raid (MD)设备驱动程序可用于任意组合具有不同 I/O 参数的设备。内核的块层将尝试合理组合各个设备的 I/O 参数。内核不会阻止组合异构设备;但是,请注意这样做所带来的风险。
例如,512 字节设备和 4K 设备可以合并为一个逻辑 DM 设备,其将有 4K 的 logical_block_size。在这种混合设备上分层的文件系统假定 4K 会以原子方式写入,但实际上,在发布到 512 字节设备时,该文件将跨越 8 个逻辑块地址。将 4K logical_block_size 用于更高级别的 DM 设备会增加系统崩溃时部分写入 512 字节设备的可能性。
如果组合多个设备的 I/O 参数会导致冲突,则块层可以发出一个警告,指出设备易受部分写入和/或未对齐的影响。

23.5. 逻辑卷管理器

LVM 提供用于管理内核 DM 设备的用户空间工具。LVM 将转换数据区域的开头(给定的 DM 设备将使用)来考虑与 LVM 管理的任何设备关联的非零 alignment_offset。这意味着逻辑卷将正确对齐(alignment_offset=0)。
默认情况下,LVM 将针对任何 alignment_offset 进行调整,但可以通过在 /etc/lvm/lvm.conf 中将 data_alignment_offset_detection 设置为 0 来禁用此行为。不建议禁用此功能。
LVM 还将检测设备的 I/O 提示。设备数据区的开头将是 sysfs 中公开的 minimum_io_sizeoptimal_io_size 的倍数。如果 optimal_io_size 未定义(例如 0),LVM 将使用 minimum_io_size
默认情况下,LVM 将自动决定这些 I/O 提示,但可以通过在 /etc/lvm/lvm.conf 中将 data_alignment_detection 设置为 0 来禁用此行为。不建议禁用此功能。

23.6. 分区和文件系统工具

这部分论述了不同的分区和文件系统管理工具如何与设备的 I/O 参数进行交互。

util-linux-ng 的 libblkid 和 fdisk

util-linux-ng 软件包提供的 libblkid 库包括用于访问设备的 I/O 参数的编程 API。libblkid 允许应用程序(特别是那些使用直接 I/O 的应用程序)正确调整其 I/O 请求的大小。util-linux-ngfdisk 工具使用 libblkid 来确定设备的 I/O 参数,以优化所有分区的位置。fdisk 实用程序将在 1MB 边界上校准所有分区。

parted 和 libparted

partedlibparted 库也使用 libblkid 的 I/O 参数 API。Red Hat Enterprise Linux 7 安装程序 Anaconda 使用 libparted,这意味着由安装程序或 parted 创建的所有分区都会被正确对齐。对于在似乎不提供 I/O 参数的设备上创建的所有分区,默认校准为 1MB。
Heuristics parted 使用如下:
  • 始终使用报告的 alignment_offset 作为第一个主分区开头的偏移量。
  • 如果定义了 optimal_io_size (即不是 0),在 optimal_io_size 边界上校准所有分区。
  • 如果 optimal_io_size 未定义(即 0 ),则 alignment_offset 为 0,而 minimum_io_size 是 2 的指数,使用 1MB 默认对齐。
    这是对“遗留”设备的总称,这些设备似乎不提供 I/O 提示。因此,默认情况下,所有分区将在 1MB 边界上校准。
    注意
    Red Hat Enterprise Linux 7 无法区分不提供 I/O 提示的设备和使用 alignment_offset=0optimal_io_size=0 的设备。此类设备可能是单个 SAS 4K 设备;因此,最坏情况下,磁盘开始时会丢失 1MB 空间。

文件系统工具

不同的 mkfs. 文件系统工具已被改进,以使用设备的 I/O 参数。这些工具不允许格式化文件系统以使用比底层存储设备的 logical_block_size 小的块大小。
mkfs.gfs2 外,所有其他 mkfs.filesystem 工具也使用 I/O 提示来布局与底层存储设备的 minimum_io_sizeoptimal_io_size 相关的磁盘上数据结构和数据区域。这使得文件系统可以针对各种 RAID(条带)布局进行最佳格式化。

第 24 章 设置远程无盘系统

要设置通过 PXE 引导的基本得远程无盘系统,您需要以下软件包:
  • tftp-server
  • xinetd
  • dhcp
  • syslinux
  • dracut-network
    注意
    安装 dracut-network 软件包后,请在 /etc/dracut.conf 中添加以下行:
    add_dracutmodules+="nfs"
远程无盘系统引导需要 tftp 服务(由 tftp-server提供)和 DHCP 服务(由 dhcp提供)。tftp 服务用于通过 PXE 加载程序通过网络检索内核镜像和 initrd
注意
SELinux 只在 NFSv4.2 上被支持。要使用 SELinux,必须通过添加以下行在 /etc/sysconfig/nfs 中明确启用 NFS:
RPCNFSDARGS="-V 4.2"
然后,在 /var/lib/tftpboot/pxelinux.cfg/default 中,将 root=nfs:server-ip:/exported/root/directory 改为 root=nfs:server-ip:/exported/root/directory,vers=4.2
最后,重启 NFS 服务器。
以下小节概述了在网络环境中部署远程无盘系统所需的步骤。
重要
有些 RPM 软件包开始使用文件功能(如 setcapgetcap)。但是,NFS 目前不支持它们,因此尝试安装或更新任何使用文件功能的软件包都会失败。

24.1. 为无盘客户端配置 tftp 服务

先决条件

流程

要配置 tftp,请执行以下步骤:

过程 24.1. 配置 tftp

  1. 通过网络启用 PXE 引导:
    # systemctl enable --now tftp
  2. tftp 根目录(chroot)位于 /var/lib/tftpboot 中。将 /usr/share/syslinux/pxelinux.0 复制到 /var/lib/tftpboot/
    # cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
  3. tftp 根目录中创建 pxelinux.cfg 目录:
    # mkdir -p /var/lib/tftpboot/pxelinux.cfg/
  4. 配置防火墙规则以允许 tftp 流量。
    因为 tftp 支持 TCP 包装器,您可以在 /etc/hosts.allow 配置文件中配置主机对 tftp 的访问。有关配置 TCP 包装器和 /etc/hosts.allow 配置文件的更多信息,请参阅 Red Hat Enterprise Linux 7 安全指南hosts_access(5) 也提供有关 /etc/hosts.allow 的信息。

后续步骤

为无盘客户端配置 tftp 后,相应地配置 DHCP、NFS 和导出的文件系统。有关配置 DHCP、NFS 和导出的文件系统的步骤,请参考 第 24.2 节 “为无盘客户端配置 DHCP”第 24.3 节 “为无盘客户端配置导出的文件系统”

24.2. 为无盘客户端配置 DHCP

先决条件

流程

  1. 配置 tftp 服务器后,您需要在同一主机上设置 DHCP 服务。有关设置 DHCP 服务器的步骤,请参阅 配置 DHCP 服务器
  2. 通过在 /etc/dhcp/dhcpd.conf 中添加以下配置,在 DHCP 服务器上启用 PXE 引导:
    allow booting;
    allow bootp;
    class "pxeclients" {
       match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";
       next-server server-ip;
       filename "pxelinux.0";
    }
    • 使用 tftp 和 DHCP 服务所在的主机的 IP 地址替换 server-ip
    注意
    libvirt 虚拟机用作无盘客户端时,libvirt 提供 DHCP 服务,并且不使用独立 DHCP 服务器。在这种情况下,必须使用 libvirt 网络配置中的 bootp file='filename' 选项启用网络引导,virsh net-edit

后续步骤

现在,tftp 和 DHCP 已配置,请配置 NFS 和导出的文件系统。具体步骤请查看 第 24.3 节 “为无盘客户端配置导出的文件系统”

24.3. 为无盘客户端配置导出的文件系统

先决条件

流程

  1. 导出的文件系统的根目录(由网络中的无盘客户端使用)通过 NFS 共享。通过将根目录添加到 /etc/exports,将 NFS 服务配置为导出根目录。有关如何操作的步骤,请查看 第 8.6.1 节 “/etc/exports 配置文件”
  2. 要完全使用无盘客户机,根目录应该包含完整的 Red Hat Enterprise Linux。您可以克隆现有安装或安装新的基本系统:
    • 要与正在运行的系统同步,请使用 rsync 工具:
      # rsync -a -e ssh --exclude='/proc/*' --exclude='/sys/*' \
             hostname.com:/exported-root-directory
      • 使用要通过 rsync 进行同步的正在运行的系统的主机名替换 hostname.com
      • 使用导出的文件系统的路径替换 exported-root-directory
    • 要将 Red Hat Enterprise Linux 安装到导出的位置,请使用带有 --installroot 选项的 yum 工具:
      # yum install @Base kernel dracut-network nfs-utils \
            --installroot=exported-root-directory --releasever=/
      
在被无盘客户端使用之前,要导出的文件系统仍然需要做进一步的配置。要做到这一点,请执行以下步骤:

过程 24.2. 配置文件系统

  1. 选择无盘客户端应使用的内核(vmlinuz-kernel-version)并将其复制到 tftp 引导目录中:
    # cp /boot/vmlinuz-kernel-version /var/lib/tftpboot/
  2. 使用 NFS 支持创建 initrd (即 initramfs-kernel-version.img):
    # dracut --add nfs initramfs-kernel-version.img kernel-version
  3. 使用以下命令将 initrd 的文件权限改为 644:
    # chmod 644 initramfs-kernel-version.img
    警告
    如果没有更改 initrd 的文件权限,pxelinux.0 引导装载程序将失败,并显示 "file not found" 错误。
  4. 同时,将生成的 initramfs-kernel-version.img 复制到 tftp 引导目录中。
  5. 编辑默认启动配置,以使用 /var/lib/tftpboot/ 目录中的 initrd 和内核。此配置应指示无盘客户端的 root 用户以读写形式挂载导出的文件系统(/exported/root/directory)。在 /var/lib/tftpboot/pxelinux.cfg/default 文件中添加以下配置:
    default rhel7
    
    label rhel7
      kernel vmlinuz-kernel-version
      append initrd=initramfs-kernel-version.img root=nfs:server-ip:/exported/root/directory rw
    使用 tftp 和 DHCP 服务所在的主机的 IP 地址替换 server-ip
NFS 共享现在可以导出到无盘客户端。这些客户端可通过 PXE 通过网络引导。

第 25 章 在线存储管理

在操作系统运行时,通常最好在操作系统运行时添加、删除或重新调整存储设备,而且无需重新启动。本章概述了在系统运行时,在 Red Hat Enterprise Linux 7 主机系统中重新配置存储设备的步骤。它涵盖了 iSCSI 和光纤通道存储互连;以后可能会添加其他互连类型。
本章重点介绍添加、删除、修改和监控存储设备。它不会详细讨论光纤通道或 iSCSI 协议。有关这些协议的更多信息,请参阅其他文档。
本章引用各种 sysfs 对象。红帽建议 sysfs 对象名称和目录结构在主 Red Hat Enterprise Linux 版本中有所变化。这是因为上游 Linux 内核不提供稳定的内部 API。有关如何以传输的方式引用 sysfs 对象的说明,请参阅内核源树中的文档 /usr/share/doc/kernel-doc-版本/Documentation/sysfs-rules.txt
警告
必须谨慎进行在线存储重新配置。处理过程中的系统故障或中断可能会导致意外的结果。红帽建议在更改操作期间最大程度地减少系统负载。这将减少配置更改期间发生 I/O 错误、内存不足或类似错误的可能性。以下章节提供了关于此方面的更具体的指南。
另外,红帽建议您在重新配置在线存储前备份所有数据。 

25.1. 目标设置

Red Hat Enterprise Linux 7 使用 targetcli shell 作为前端来查看、编辑和保存 Linux-IO 目标配置,而无需直接操作内核目标的配置文件。targetcli 工具是一个命令行界面,允许管理员将本地存储资源导出,这些资源由文件、卷、本地 SCSI 设备或 RAM 磁盘支持。targetcli 工具具有一个基于树形的布局,包含内置 tab 自动完成功能,并提供完整的自动完成支持和内联文档。
targetcli 的层次结构并不总是与内核接口完全匹配,因为 targetcli 尽可能简化。
重要
要确保 targetcli 中所做的更改是持久的,请启动并启用 target 服务:
# systemctl start target
# systemctl enable target

25.1.1. 安装并运行 targetcli

要安装 targetcli,请使用:
# yum install targetcli
启动 目标 服务:
# systemctl start target
将目标 配置为在引导时启动:
# systemctl enable target
在防火墙中打开端口 3260,并重新载入防火墙配置:
# firewall-cmd --permanent --add-port=3260/tcp
Success
# firewall-cmd --reload
Success
使用 targetcli 命令,然后使用 ls 命令获取树接口的布局:
# targetcli
:
/> ls
o- /........................................[...]
  o- backstores.............................[...]
  | o- block.................[Storage Objects: 0]           
  | o- fileio................[Storage Objects: 0]       
  | o- pscsi.................[Storage Objects: 0]         
  | o- ramdisk...............[Storage Ojbects: 0]         
  o- iscsi...........................[Targets: 0]   
  o- loopback........................[Targets: 0]
注意
在 Red Hat Enterprise Linux 7.0 中,使用 Bash 中的 targetcli 命令(例如 targetcli iscsi/ create )无法正常工作,且不会返回错误。从 Red Hat Enterprise Linux 7.1 开始,提供了一个错误状态代码,以便使用 targetcli 和 shell 脚本。

25.1.2. 创建后端存储

后端存储支持在本地计算机上存储导出的 LUN 数据的不同方法。创建存储对象定义了后端存储使用的资源。
注意
在 Red Hat Enterprise Linux 6 中,术语"backing-store"用于引用创建的映射。但是,为了避免在 Red Hat Enterprise Linux 7 中使用 'backstores' 的不同方法混淆,在 Red Hat Enterprise Linux 7 术语 'storage objects' 指的是所创建的映射和"backstores"来描述不同类型的后备设备。
LIO 支持的后端存储设备有:
FILEIO (Linux 文件支持的存储)
FILEIO 存储对象可以支持 write_backwrite_thru 操作。write_back 启用本地文件系统缓存。这提高了性能,但会增加数据丢失的风险。建议您使用 write_back=false 禁用 write_back,而是使用 write_thru
要创建 fileio 存储对象,请运行命令 /backstores/fileio create file_name file_location file_size write_back=false。例如:
/> /backstores/fileio create file1 /tmp/disk1.img 200M write_back=false
Created fileio file1 with size 209715200
BLOCK (Linux BLOCK 设备)
块驱动程序允许使用 /sys/block 中出现的任何块设备与 LIO 一起使用。这包括物理设备(如 HDD、SSD、CD、DVD)和逻辑设备(如软件或硬件 RAID 卷或 LVM 卷)。
注意
BLOCK backstores 通常提供最佳性能。
要使用任何块设备创建 BLOCK 后端存储,请使用以下命令:
# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x39dc48fb.

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): *Enter*
Using default response p
Partition number (1-4, default 1): *Enter*
First sector (2048-2097151, default 2048): *Enter*
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +250M
Partition 1 of type Linux and of size 250 MiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
/> /backstores/block create name=block_backend dev=/dev/vdb
Generating a wwn serial.
Created block storage object block_backend using /dev/vdb.
注意
您还可以在逻辑卷中创建 BLOCK 后端存储。
PSCSI (Linux 直通 SCSI 设备)
任何支持直接传递 SCSI 命令且无 SCSI 模拟的存储对象,并且使用 /proc/scsi/scsi (如 SAS 硬盘驱动器)中显示的底层 SCSI 设备可以配置为后备存储。这个子系统支持 SCSI-3 及更高系统。
警告
PSCSI 应该只供高级用户使用。高级 SCSI 命令(如 Aysmmetric Logical Unit Assignment (ALUAs)或 Persistent Reservations (ALUAs))或 Persistent Reservations (如 VMware ESX 和 vSphere 使用)通常不会在设备固件中实施,并可能导致故障或崩溃。如果有疑问,请对生产环境设置使用 BLOCK。
要为物理 SCSI 设备创建 PSCSI 后端存储,本例中使用 /dev/sr0TYPE_ROM 设备,请使用:
/> backstores/pscsi/ create name=pscsi_backend dev=/dev/sr0
Generating a wwn serial.
Created pscsi storage object pscsi_backend using /dev/sr0
内存复制 RAM 磁盘(Linux RAMDISK_MCP)
Memory Copy RAM 磁盘(ramdisk)为 RAM 磁盘提供完整的 SCSI 模拟,并使用启动器的内存副本来分隔内存映射。这为多会话提供了功能,对于生产环境的快速易失性存储特别有用。
要创建 1GB RAM 磁盘后备存储,请使用以下命令:
/> backstores/ramdisk/ create name=rd_backend size=1GB
Generating a wwn serial.
Created rd_mcp ramdisk rd_backend with size 1GB.

25.1.3. 创建 iSCSI 目标

创建 iSCSI 目标:

过程 25.1. 创建 iSCSI 目标

  1. 运行 targetcli
  2. 移动到 iSCSI 配置路径:
    /> iscsi/
    注意
    cd 命令还可接受更改目录,并只是列出要移动到的路径。
  3. 使用默认目标名称创建 iSCSI 目标。
    /iscsi> create
    Created target
    iqn.2003-01.org.linux-iscsi.hostname.x8664:sn.78b473f296ff
    Created TPG1
    或者使用指定名称创建 iSCSI 目标。
    /iscsi > create iqn.2006-04.com.example:444
    Created target iqn.2006-04.com.example:444
    Created TPG1
  4. 使用 ls 列出目标时,验证新创建的目标是否可见。
    /iscsi > ls
    o- iscsi.......................................[1 Target]
        o- iqn.2006-04.com.example:444................[1 TPG]
            o- tpg1...........................[enabled, auth]
                o- acls...............................[0 ACL]
                o- luns...............................[0 LUN]
                o- portals.........................[0 Portal]
    
注意
从 Red Hat Enterprise Linux 7.1 开始,每当创建目标时,也会创建一个默认门户。

25.1.4. 配置 iSCSI 门户

要配置 iSCSI 门户,必须首先创建 iSCSI 目标并与 TPG 关联。有关如何进行此操作的步骤,请参考 第 25.1.3 节 “创建 iSCSI 目标”
注意
从 Red Hat Enterprise Linux 7.1 创建 iSCSI 目标时,也会创建一个默认门户。此门户设置为使用默认端口号(00:3260)侦听所有 IP 地址。要删除此功能并只添加指定的门户,请使用 /iscsi/iqn-name/tpg1/portals delete ip_address=0.0.0.0 ip_port=3260,然后使用所需信息创建一个新门户。

过程 25.2. 创建 iSCSI 门户

  1. 移至 TPG。
    /iscsi> iqn.2006-04.example:444/tpg1/
  2. 创建门户的方法有两种:创建一个默认门户,或者创建一个门户,指定要侦听的 IP 地址。
    创建默认门户使用默认 iSCSI 端口 3260,并允许目标侦听该端口上的所有 IP 地址。
    /iscsi/iqn.20...mple:444/tpg1> portals/ create
    Using default IP port 3260
    Binding to INADDR_Any (0.0.0.0)
    Created network portal 0.0.0.0:3260
    
    要创建门户,请指定要侦听的 IP 地址,请使用以下命令:
    /iscsi/iqn.20...mple:444/tpg1> portals/ create 192.168.122.137
    Using default IP port 3260
    Created network portal 192.168.122.137:3260
    
  3. 使用 ls 命令,验证新创建的门户是否可见。
    /iscsi/iqn.20...mple:444/tpg1> ls
    o- tpg.................................. [enambled, auth] 
        o- acls ......................................[0 ACL]
        o- luns ......................................[0 LUN]
        o- portals ................................[1 Portal]
            o- 192.168.122.137:3260......................[OK]
    

25.1.5. 配置 LUN

要配置 LUN,首先请创建存储对象。请参阅 第 25.1.2 节 “创建后端存储” 了解更多信息。

过程 25.3. 配置 LUN

  1. 创建已创建的存储对象的 LUN。
    /iscsi/iqn.20...mple:444/tpg1> luns/ create /backstores/ramdisk/rd_backend
    Created LUN 0.
    
    /iscsi/iqn.20...mple:444/tpg1> luns/ create /backstores/block/block_backend
    Created LUN 1.
    
    /iscsi/iqn.20...mple:444/tpg1> luns/ create /backstores/fileio/file1
    Created LUN 2.
    
  2. 显示更改。
    /iscsi/iqn.20...mple:444/tpg1> ls
    o- tpg.................................. [enambled, auth]
        o- acls ......................................[0 ACL]
        o- luns .....................................[3 LUNs]
        |  o- lun0.........................[ramdisk/ramdisk1]
        |  o- lun1.................[block/block1 (/dev/vdb1)]
        |  o- lun2...................[fileio/file1 (/foo.img)]
        o- portals ................................[1 Portal]
            o- 192.168.122.137:3260......................[OK]
    
    注意
    请注意,默认的 LUN 名称从 0 开始,而不是在 Red Hat Enterprise Linux 6 中使用 tgtd 时为 1。
  3. 配置 ACL。如需更多信息,请参阅 第 25.1.6 节 “配置 ACL”
重要
默认情况下,使用读写权限创建 LUN。如果在创建 ACL 后添加了新的 LUN,则 LUN 将自动映射到所有可用 ACL。这可能导致安全风险。使用以下步骤以只读方式创建 LUN。

过程 25.4. 创建一个只读 LUN

  1. 要创建具有只读权限的 LUN,首先使用以下命令:
    /> set global auto_add_mapped_luns=false
    Parameter auto_add_mapped_luns is now 'false'.
    
    这样可防止 LUN 自动映射到现有 ACL,从而允许手动映射 LUN。
  2. 接下来,使用命令 iscsi/target_iqn_name/tpg1/acls/initiator_iqn_name/ create mapped_lun=next_sequential_LUN_number tpg_lun_or_backstore=backstore write_protect=1 来手动创建 LUN。
    /> iscsi/iqn.2015-06.com.redhat:target/tpg1/acls/iqn.2015-06.com.redhat:initiator/ create mapped_lun=1 tpg_lun_or_backstore=/backstores/block/block2 write_protect=1
    Created LUN 1.
    Created Mapped LUN 1.
    /> ls
    o- / ...................................................... [...]
      o- backstores ........................................... [...]
      <snip>
      o- iscsi ......................................... [Targets: 1]
      | o- iqn.2015-06.com.redhat:target .................. [TPGs: 1]
      |   o- tpg1 ............................ [no-gen-acls, no-auth]
      |     o- acls ....................................... [ACLs: 2]
      |     | o- iqn.2015-06.com.redhat:initiator .. [Mapped LUNs: 2]
      |     | | o- mapped_lun0 .............. [lun0 block/disk1 (rw)]
      |     | | o- mapped_lun1 .............. [lun1 block/disk2 (ro)]
      |     o- luns ....................................... [LUNs: 2]
      |     | o- lun0 ...................... [block/disk1 (/dev/vdb)]
      |     | o- lun1 ...................... [block/disk2 (/dev/vdc)]
      <snip>
    
    mapping_lun1 行现在在结尾有(ro) (不像 mapping_lun0's (rw)),表示它是只读的。
  3. 配置 ACL。如需更多信息,请参阅 第 25.1.6 节 “配置 ACL”

25.1.6. 配置 ACL

为要连接的每个启动器创建 ACL。这会在启动器连接时强制身份验证,仅允许将 LUN 公开给每个启动器。通常,每个 initator 都具有对 LUN 的独占访问权限。目标和发起方都有唯一的标识名称。必须知道启动器的唯一名称来配置 ACL。对于 open-iscsi 启动器,可在 /etc/iscsi/initiatorname.iscsi 中找到。

过程 25.5. 配置 ACL

  1. 移动到 acls 目录。
    /iscsi/iqn.20...mple:444/tpg1> acls/
  2. 创建 ACL。使用启动器上 /etc/iscsi/initiatorname.iscsi 中找到的启动器名称,或者使用更易于记住的名称,请参阅 第 25.2 节 “创建 iSCSI 启动器” 来确保 ACL 与启动器匹配。例如:
    /iscsi/iqn.20...444/tpg1/acls> create iqn.2006-04.com.example.foo:888
    Created Node ACL for iqn.2006-04.com.example.foo:888
    Created mapped LUN 2.
    Created mapped LUN 1.
    Created mapped LUN 0.
    
    注意
    给定示例的行为取决于所使用的设置。在这种情况下,使用全局设置 auto_add_mapped_luns。这会自动将 LUN 映射到任何创建的 ACL。
    您可以在目标服务器上的 TPG 节点中设置用户创建的 ACL:
    /iscsi/iqn.20...scsi:444/tpg1> set attribute generate_node_acls=1
  3. 显示更改。
    /iscsi/iqn.20...444/tpg1/acls> ls
    o- acls .................................................[1 ACL]
        o- iqn.2006-04.com.example.foo:888 ....[3 Mapped LUNs, auth]
            o- mapped_lun0 .............[lun0 ramdisk/ramdisk1 (rw)]
            o- mapped_lun1 .................[lun1 block/block1 (rw)]
            o- mapped_lun2 .................[lun2 fileio/file1 (rw)]
    

25.1.7. 通过以太网配置光纤通道(FCoE)目标

除了通过 FCoE 挂载 LUN 外,如 第 25.5 节 “通过以太网接口配置光纤通道” 所述,还支持通过 FCoE 将 LUN 导出到其它机器,并帮助 targetcli
重要
在继续操作前,请参阅 第 25.5 节 “通过以太网接口配置光纤通道” 并验证基本 FCoE 设置已完成,并且 fcoeadm -i 显示配置的 FCoE 接口。

过程 25.6. 配置 FCoE 目标

  1. 设置 FCoE 目标需要安装 targetcli 软件包,及其依赖项。有关 targetcli 基础知识和设置的详情,请参考 第 25.1 节 “目标设置”
  2. 在 FCoE 接口上创建 FCoE 目标实例。
    /> tcm_fc/ create 00:11:22:33:44:55:66:77
    如果系统上存在 FCoE 接口,则创建后相应的选项卡将列出可用的接口。如果没有,请确保 fcoeadm -i 显示活动的接口。
  3. 将后端存储映射到目标实例。

    例 25.1. 将后端存储映射到目标实例的示例

    /> tcm_fc/00:11:22:33:44:55:66:77
    /> luns/ create /backstores/fileio/example2
  4. 允许从 FCoE 启动器访问 LUN。
    /> acls/ create 00:99:88:77:66:55:44:33
    现在,LUN 应该可以被该启动器访问。
  5. 要使更改在重启后保留,请使用 saveconfig 命令,并在提示时输入 yes。如果没有这样做,则配置将在重新引导后丢失。
  6. 通过键入 exit 或输入 ctrl+D 退出 targetcli

25.1.8. 使用 targetcli删除对象

要删除后端存储,请使用以下命令:
/> /backstores/backstore-type/backstore-name
要删除 iSCSI 目标(如 ACL)的部分,请使用以下命令:
/> /iscsi/iqn-name/tpg/acls/ delete iqn-name
要删除整个目标,包括所有 ACL、LUN 和门户,请使用以下命令:
/> /iscsi delete iqn-name

25.1.9. targetcli 参考

有关 targetcli 的更多信息,请参阅以下资源:
man targetcli
targetcli 手册页。它包括示例步骤。
Linux SCSI Target Wiki
Andy Grover 的录屏
注意
这于 2012 年 2 月 28 日上传。因此,服务名称已从 targetcli 改为 target

25.2. 创建 iSCSI 启动器

在 Red Hat Enterprise Linux 7 中,iSCSI 服务默认是 lazily 启动: 服务会在运行 iscsiadm 命令后启动。

过程 25.7. 创建 iSCSI 启动器

  1. 安装 iscsi-initiator-utils:
    # yum install iscsi-initiator-utils -y
  2. 如果 ACL 在 第 25.1.6 节 “配置 ACL” 中被授予自定义名称,请相应地修改 /etc/iscsi/initiatorname.iscsi 文件。例如:
    # cat /etc/iscsi/initiatorname.iscsi
    InitiatorName=iqn.2006-04.com.example.node1
    
    # vi /etc/iscsi/initiatorname.iscsi
  3. 发现目标:
    # iscsiadm -m discovery -t st -p target-ip-address 
    10.64.24.179:3260,1 iqn.2006-04.com.example:3260
    
  4. 使用在第 3 步中发现的目标 IQN 登录到目标:
    # iscsiadm -m node -T iqn.2006-04.com.example:3260 -l 
    Logging in to [iface: default, target: iqn.2006-04.com.example:3260, portal: 10.64.24.179,3260] (multiple)
    Login to [iface: default, target: iqn.2006-04.com.example:3260, portal: 10.64.24.179,3260] successful.
    
    对于连接到同一 LUN 的任意数量的 initator,只要将其特定启动器名称添加到 ACL 中,就可以遵循这个过程,如 第 25.1.6 节 “配置 ACL” 所述。
  5. 找到 iSCSI 磁盘名称并在这个 iSCSI 磁盘中创建文件系统:
    # grep "Attached SCSI" /var/log/messages
    
    # mkfs.ext4 /dev/disk_name
    使用 /var/log/messages 中显示的 iSCSI 磁盘名称替换 disk_name
  6. 挂载文件系统:
    # mkdir /mount/point
    # mount /dev/disk_name /mount/point
    使用分区的挂载点替换 /mount/point
  7. 编辑 /etc/fstab 以在系统引导时自动挂载文件系统:
    # vim /etc/fstab
    /dev/disk_name /mount/point ext4 _netdev 0 0
    
    使用 iSCSI 磁盘名称替换 disk_name
  8. 从目标登出:
    # iscsiadm -m node -T iqn.2006-04.com.example:3260 -u

25.3. 设置 Challenge-Handshake 身份验证协议

配置 ACL 并创建 iSCSI 启动器后,设置 Challenge-Handshake Authentication Protocol (CHAP)。有关配置 ACL 和创建 iSCSI 启动器的详情,请参考 第 25.1.6 节 “配置 ACL”第 25.2 节 “创建 iSCSI 启动器”
CHAP 允许用户使用密码保护目标。发起方必须了解这个密码才能连接到目标。

过程 25.8. 为目标设置 CHAP

  1. 设置属性身份验证:
    /iscsi/iqn.20...mple:444/tpg1> set attribute authentication=1
    
    Parameter authentication is now '1'.
    
  2. 设置 userid 和密码:
    /iscsi/iqn.20...mple:444/tpg1> set auth userid=redhat
    
    Parameter userid is now 'redhat'.
    
    /iscsi/iqn.20...mple:444/tpg1> set auth password=redhat_passwd
    
    Parameter password is now 'redhat_passwd'.
    

过程 25.9. 为发起方设置 CHAP

  1. 编辑 iscsid.conf 文件:
    • iscsid.conf 文件中启用 CHAP 身份验证:
      # vi /etc/iscsi/iscsid.conf
      
      node.session.auth.authmethod = CHAP
      
      默认情况下,node.session.auth.authmethod 选项被设置为 None
    • iscsid.conf 文件中添加目标用户名和密码:
      node.session.auth.username = redhat
      node.session.auth.password = redhat_passwd
  2. 重启 iscsid 服务:
    # systemctl restart iscsid.service
如需更多信息,请参阅 targetcliiscsiadm man page。

25.4. Fibre Channel

本节讨论光纤通道 API、原生 Red Hat Enterprise Linux 7 光纤通道驱动程序以及这些驱动程序的光纤通道功能。

25.4.1. 光纤通道 API

以下是 /sys/class/ 目录的列表,其中包含用于提供用户空间 API 的文件。在每个项目中,主机号由 H 指定,总线号为 B,目标为 T,逻辑单元号(LUN)为 L,远程端口号为 R
重要的
如果您的系统使用多路径软件,红帽建议您在更改本部分中所描述的值之前咨询您的硬件厂商。
Transport: /sys/class/fc_transport/targetH:B:T/
  • port_id - 24 位端口 ID/地址
  • node_name - 64 位节点名称
  • port_name - 64 位端口名称
Remote Port: /sys/class/fc_remote_ports/rport-H:B-R/
  • port_id
  • node_name
  • port_name
  • dev_loss_tmo :控制 scsi 设备从系统中删除的时间。在 dev_loss_tmo 触发后,scsi 设备被删除。
    multipath.conf 中,您可以将 dev_loss_tmo 设置为 infinity,它将它的值设为 2,147,483,647 秒, 或 68 年,它是 dev_loss_tmo 的最大值。
    在 Red Hat Enterprise Linux 7 中,如果您没有设置 fast_io_fail_tmo 选项,dev_loss_tmo 的上限为 600 秒。默认情况下,如果 multipathd 服务正在运行,fast_io_fail_tmo 会在 Red Hat Enterprise Linux 7 中被设置为 5 秒;否则,它被设置为 off
  • fast_io_fail_tmo: 指定在将链接标记为"bad"前要等待的秒数。链接被标记为坏的后,现有正在运行的 I/O 或相应路径上的任何新 I/O 都将失败。
    如果 I/O 处于阻塞队列中,则在 dev_loss_tmo 到期前和队列未阻塞前,它不会失败。
    如果 fast_io_fail_tmo 设置为除 off 以外的任何值,则会取消dev_loss_tmo。如果 fast_io_fail_tmo 设为 off,则在从系统中删除该设备前不会出现 I/O 失败。如果 fast_io_fail_tmo 设置为一个数字,则在达到 fast_io_fail_tmo 设置的超时会立即触发 I/O 失败。
Host: /sys/class/fc_host/hostH/
  • port_id
  • issue_lip :指示驱动程序重新发现远程端口。

25.4.2. 原生光纤通道驱动程序和能力

Red Hat Enterprise Linux 7 附带以下原生 Fibre Channel 驱动程序:
  • lpfc
  • qla2xxx
  • zfcp
  • bfa
重要
默认情况下,qla2xxx 驱动程序在 initiator 模式下运行。要将 qla2xxx 与 Linux-IO 搭配使用,请使用对应的 qlini_mode 模块参数启用光纤通道目标模式。
首先,确保安装了 qla 设备(如 ql2200-firmware 或类似)的固件软件包。
要启用目标模式,请在 /usr/lib/modprobe.d/qla2xxx.conf qla2xxx 模块配置文件中添加以下参数:
options qla2xxx qlini_mode=disabled
然后,使用 dracut -f 命令重建初始 ramdisk (initrd),并重启系统以使更改生效。
表 25.1 “Fibre Channel API 功能” 描述每个原生 Red Hat Enterprise Linux 7 驱动程序的不同光纤通道 API 功能。X 表示对该功能的支持。

表 25.1. Fibre Channel API 功能

lpfcqla2xxxzfcpbfa
Transport port_idXXXX
Transport node_nameXXXX
Transport port_nameXXXX
Remote Port dev_loss_tmoXXXX
Remote Port fast_io_fail_tmoXX [a]X [b] X
Host port_idXXXX
Host issue_lipXX X
[a] 从 Red Hat Enterprise Linux 5.4 开始支持
[b] 从 Red Hat Enterprise Linux 6.0 开始支持

25.5. 通过以太网接口配置光纤通道

设置和部署以太网光纤通道(FCoE)接口需要两个软件包:
  • fcoe-utils
  • lldpad
安装这些软件包后,请执行以下流程来启用虚拟 LAN(VLAN) FCoE:

过程 25.10. 将以太网接口配置为使用 FCoE

  1. 要配置新的 VLAN,请制作现有网络脚本的副本,如 /etc/fcoe/cfg-eth0,并将名称改为支持 FCoE 的以太网设备。这为您提供了一个要配置的默认文件。假设 FCoE 设备是 ethX,请运行:
    # cp /etc/fcoe/cfg-ethx  /etc/fcoe/cfg-ethX
    根据需要修改 cfg-ethX 的内容。值得注意的是,对于实现硬件数据中心桥接交换(DCBX)协议客户端的网络接口,将 DCB_REQUIRED 设置为 no
  2. 如果您希望设备在引导时自动载入,请在相应的 /etc/sysconfig/network-scripts/ifcfg-ethX 文件中设置 ONBOOT=yes。例如,如果 FCoE 设备是 eth2,请相应地编辑 /etc/sysconfig/network-scripts/ifcfg-eth2
  3. 运行以下命令启动数据中心桥接守护进程(dcbd):
    # systemctl start lldpad
    
  4. 对于实现硬件 DCBX 客户端的网络接口,请跳过这一步。
    对于需要软件 DCBX 客户端的接口,请运行以下命令在以太网接口上启用数据中心桥接:
    # dcbtool sc ethX dcb on
    
    然后,运行以下命令在以太网接口上启用 FCoE:
    # dcbtool sc ethX app:fcoe e:1
    
    请注意,只有在以太网接口的 dcbd 设置没有改变时,这些命令才起作用。
  5. 现在使用以下方法载入 FCoE 设备:
    # ip link set dev ethX up
    
  6. 使用以下方法启动 FCoE:
    # systemctl start fcoe
    
    如果光纤上的所有其他设置都正确,则 FCoE 设备很快出现。要查看配置的 FCoE 设备,请运行:
    # fcoeadm -i
    
在正确配置以太网接口以使用 FCoE 后,红帽建议您将 FCoE 和 lldpad 服务设置为在启动时运行。要做到这一点,请使用 systemctl 工具:
# systemctl enable lldpad
# systemctl enable fcoe
注意
运行 # systemctl stop fcoe 命令将停止守护进程,但不会重置 FCoE 接口的配置。为此,请运行 # systemctl -s SIGHUP kill fcoe 命令。
从 Red Hat Enterprise Linux 7 开始,网络管理器能够查询和设置具有 DCB 的以太网接口的 DCB 设置。

25.6. 将 FCoE 接口配置为在引导时自动挂载

注意
从 Red Hat Enterprise Linux 6.1 开始,本节中的说明包括在 /usr/share/doc/fcoe-utils-版本/README 中。有关小版本的任何可能的更改,请参阅该文档。
您可以通过 udev 规则、autofs 和其他类似方法挂载新发现的磁盘。但有时候,特定的服务可能会要求在启动时挂载 FCoE 磁盘。在这种情况下,应在 fcoe 服务运行时以及需要 FCoE 磁盘的任何服务启动前 立即 挂载 FCoE 磁盘。
要将 FCoE 磁盘配置为在引导时自动挂载,请将正确的 FCoE 挂载代码添加到 fcoe 服务的启动脚本中。fcoe 启动脚本为 /lib/systemd/system/fcoe.service
FCoE 挂载代码在每个系统配置中都有所不同,无论您使用的是简单格式化的 FCoE 磁盘、LVM 还是多路径设备节点。

例 25.2. FCoE 挂载代码

以下是通过 /etc/fstab 中通配符指定的挂载文件系统的 FCoE 挂载代码示例:
mount_fcoe_disks_from_fstab()
	{
	    local timeout=20
	    local done=1
	    local fcoe_disks=($(egrep 'by-path\/fc-.*_netdev' /etc/fstab | cut -d ' ' -f1))

	    test -z $fcoe_disks && return 0

	    echo -n "Waiting for fcoe disks . "
	    while [ $timeout -gt 0 ]; do
		for disk in ${fcoe_disks[*]}; do
			if ! test -b $disk; then
				done=0
				break
			fi
		done

		test $done -eq 1 && break;
		sleep 1
		echo -n ". "
		done=1
		let timeout--
	    done

	    if test $timeout -eq 0; then
		echo "timeout!"
	    else
		echo "done!"
	    fi

	    # mount any newly discovered disk
	    mount -a 2>/dev/null
	}
fcoe 服务脚本启动 fcoemon 守护进程后,应调用 mount_fcoe_disks_from_fstab 功能。这将挂载由 /etc/fstab 中的以下路径指定的 FCoE 磁盘:
/dev/disk/by-path/fc-0xXX:0xXX /mnt/fcoe-disk1 ext3  defaults,_netdev    0 0
/dev/disk/by-path/fc-0xYY:0xYY /mnt/fcoe-disk2 ext3  defaults,_netdev    0 0
带有 fc-_netdev 子字符串的条目启用 mount_fcoe_disks_from_fstab 功能来识别 FCoE 磁盘挂载条目。有关 /etc/fstab 条目的更多信息,请参阅 man 5 fstab
注意
fcoe 服务不为 FCoE 磁盘发现实现超时。因此,FCoE 挂载代码应该实现它自己的超时时间。

25.7. iSCSI

本节描述了 iSCSI API 和 iscsiadm 工具。在使用 iscsiadm 工具前,请先运行 yum install iscsi-initiator-utils 软件包来安装 iscsi-initiator-utils 软件包。
在 Red Hat Enterprise Linux 7 中,iSCSI 服务默认为 lazily 启动。如果 root 不在 iSCSI 设备上,或者没有标记为 node.startup = automatic 的节点,则 iSCSI 服务将不会启动,直到运行 iscsiadm 命令需要 iscsid 或 iscsi 内核模块启动。例如,运行发现命令 iscsiadm -m discovery -t st -p ip:port 将导致 iscsiadm 启动 iSCSI 服务。
要强制 iscsid 守护进程运行和 iSCSI 内核模块进行加载,请运行 systemctl start iscsid.service

25.7.1. iSCSI API

要获取有关正在运行的会话的信息,请运行:
# iscsiadm -m session -P 3
这个命令显示会话/设备状态、会话 ID (sid)、一些协商的参数以及可通过会话访问的 SCSI 设备。
对于较短的输出(例如,只显示 sid-to-node 映射),请运行:
# iscsiadm -m session -P 0
或者
# iscsiadm -m session
这些命令使用格式打印正在运行的会话列表:
driver [sid] target_ip:port,target_portal_group_tag proper_target_name

例 25.3. iscsisadm -m session 命令的输出

例如:
# iscsiadm -m session

tcp [2] 10.15.84.19:3260,2 iqn.1992-08.com.netapp:sn.33615311
tcp [3] 10.15.85.19:3260,3 iqn.1992-08.com.netapp:sn.33615311
有关 iSCSI API 的更多信息,请参阅 /usr/share/doc/iscsi-initiator-utils-版本/README

25.8. 持久性命名

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

25.8.1. 存储设备的主和次号

sd 驱动程序管理的存储设备由一组主要设备号及其关联的副号码来标识。用于此目的的主要设备号不在连续范围内。每个存储设备都由一个主号和一系列次要号表示,用于标识整个设备或设备中的分区。以 sd <letter (s)> 号的形式分配给设备和[号码在主号和次号之间进行直接关联]。每当 sd 驱动程序检测到新设备时,都会分配一个可用的主号码和次号范围。每当从操作系统中删除设备时,主号码和次号范围都会被释放,以便稍后重复使用。
当检测到设备时,会为每个设备分配主号和次号范围,以及相关的 sd 名称。这意味着,如果设备检测顺序发生了变化,主号和次号范围之间的关联以及相关的 sd 名称可能会发生变化。虽然这对于一些硬件配置(例如,内部 SCSI 控制器和磁盘将其 SCSI 目标 ID 被它们在机箱中的物理位置分配的 SCSI 目标 ID)不同,但它永远不会发生。可能发生这种情况的情况示例如下:
  • 磁盘可能无法启动或响应 SCSI 控制器。这会导致正常设备探测不会检测到它。这个磁盘无法被系统访问,后续的设备将具有其主号和次号范围,包括相关的 sd 名称下移。例如,如果没有检测到通常称为 sdb 的磁盘,则通常称为 sdc 的磁盘将显示为 sdb
  • SCSI 控制器(主机总线适配器或 HBA)可能无法初始化,从而导致无法检测到连接到那个 HBA 的所有磁盘。任何连接到随后探测到的 HBA 的磁盘都会被分配不同的主号和次号范围,以及不同的相关 sd 名称。
  • 如果系统中存在不同类型的 HBA,则驱动程序初始化顺序可能会改变。这会导致以不同顺序检测到连接到这些 HBA 的磁盘。如果 HBA 移到系统的不同 PCI 插槽中,也会发生这种情况。
  • 连接到带有光纤通道、iSCSI 或 FCoE 适配器的系统的磁盘可能在检测存储设备时无法访问,例如,由于存储阵列或中间交换机断电。如果存储阵列需要比系统启动的时间更长,则系统在电源失败后重启时会出现这种情况。虽然某些光纤通道驱动程序支持一种机制来向 WWPN 映射指定持久的 SCSI 目标 ID,但这不会导致主号和次号范围,以及相关的 sd 名称被保留,它只提供一致的 SCSI 目标 ID 号。
这些原因使得在引用设备(例如在 /etc/fstab文件中的)时不希望使用主号和次号范围或相关的 sd 名称。可能挂载错误的设备,并可能导致数据崩溃。
然而,偶尔仍然需要引用 sd 名称,即使使用了其他机制(比如当设备报告错误时)。这是因为 Linux 内核在有关设备的内核消息中使用 sd 名称(以及 SCSI 主机/通道/目标/LUN 元组)。

25.8.2. 全球标识符(WWID)

全球识别符(WWID)可用于可靠地识别设备。它是 SCSI 标准要求所有 SCSI 设备提供的持久的、独立于系统的 ID。保证 WWID 标识符对于每个存储设备都是唯一的,并且独立于用于访问该设备的路径。
可通过发出 SCSI 查询来检索设备识别重要产品数据(第 0x 83 页)或 单元序列号 (第 0x80页)来获取此标识符。在 /dev/disk/by-id/ 目录中维护的符号链接中,可以看到从这些 WWID 到当前 /dev/sd 名称的映射。

例 25.4. WWID

例如,带有页 0x83 标识符的设备应该有:
scsi-3600508b400105e210000900000490000 -> ../../sda
或者,带有页 0x80 标识符的设备应该有:
scsi-SSEAGATE_ST373453LW_3HW1RHM6 -> ../../sda
Red Hat Enterprise Linux 自动维护系统上从基于 WWID 的设备名称到当前 /dev/sd 名称的正确映射。应用程序可以使用 /dev/disk/by-id/ 名称来引用磁盘上的数据,即使设备的路径有变化,即使从不同的系统访问该设备也一样。
如果系统中存在多个路径到某个设备,DM 多路径 会使用 WWID 来检测这一点。然后,DM 多路径会在 /dev/mapper/wwid 目录中显示一个"pseudo-device",如 /dev/mapper/3600508b400105df70000e00000ac0000
命令 multipath -l 显示到非持久性标识符的映射: Host:Channel:Target:LUN, /dev/sd name, 和 major:minor 号。
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 名称的正确映射。这些名称可在路径更改之间保留,在从不同系统访问该设备时会保持一致。
当使用 user_friendly_names 功能( DM 多路径)时,WWID 会映射到 /dev/mapper/mpathn 格式的名称。默认情况下,此映射在 /etc/multipath/bindings 文件中维护。只要该文件被维护,这些 mpathn 名称就会持久存在。
重要
如果使用 user_friendly_names,则需要额外的步骤来获得集群中的一致名称。请参阅 DM 多路径 本书 中的集群部分中的 一致性多路径设备名称部分。
除了系统提供的这些持久名称外,您还可以使用 udev 规则来实现映射到存储的 WWID 的持久名称。

25.8.3. 由 /dev/disk/byjpeg 中的 udev 机制管理的设备名称

udev 机制由三个主要组件组成:
内核
生成在设备添加、删除或更改时发送到用户空间的事件。
udevd 服务
接收事件。
udev 规则
指定 udev 服务接收内核事件时要执行的操作。
这个机制用于 Linux 中的所有设备,而不仅仅是存储设备。对于存储设备,Red Hat Enterprise Linux 包含 udev 规则,该规则在 /dev/disk/ 目录中创建符号链接,允许存储设备被其内容引用、唯一标识符、序列号或用于访问该设备的硬件路径。
/dev/disk/by-label/
此目录中的条目提供一个符号链接名称,它通过存储在设备上的内容(即数据)中的标签引用存储设备。blkid 实用程序用于从设备读取数据,并确定该设备的名称(即标签)。例如:
/dev/disk/by-label/Boot
注意
该信息从设备上的内容(即数据)获取,以便在内容复制到另一个设备时,标签将保持不变。
该标签也可用于使用以下语法指向 /etc/fstab 中的设备:
LABEL=Boot
/dev/disk/by-uuid/
此目录中的条目提供一个符号链接名称,它通过存储在设备上的内容(即数据)中的唯一标识符来引用存储设备。blkid 实用程序用于从设备读取数据,并获取该设备的唯一标识符(即 UUID)。例如:
UUID=3e6be9de-8139-11d1-9106-a43f08d823a6
/dev/disk/by-id/
这个目录中的条目提供了一个符号链接名称,它通过唯一标识符(与所有其他存储设备不同)指向存储设备。标识符是设备的属性,但不存储在设备上的内容(即数据)中。例如:
/dev/disk/by-id/scsi-3600508e000000000ce506dc50ab0ad05
/dev/disk/by-id/wwn-0x600508e000000000ce506dc50ab0ad05
id 从设备的全球 ID 或设备序列号获得。/dev/disk/by-id/ 条目也可以包含分区号。例如:
/dev/disk/by-id/scsi-3600508e000000000ce506dc50ab0ad05-part1
/dev/disk/by-id/wwn-0x600508e000000000ce506dc50ab0ad05-part1
/dev/disk/by-path/
这个目录中的条目提供了一个符号链接名称,它通过用于访问该设备的硬件路径引用,从 PCI 层次结构中的存储控制器的引用,包括 SCSI 主机、频道、目标和 LUN 号,以及可选的分区号。虽然这些名称最好使用主号和次号或 sd 名称,但必须小心谨慎,以确保目标号在光纤通道 SAN 环境中不会改变(例如,通过使用持久绑定),如果主机适配器移至不同的 PCI 插槽,则更新名称。另外,如果 HBA 无法探测、如果以不同顺序载入驱动程序,或者系统上安装了新的 HBA,则 SCSI 主机号可能会改变。by-path 列表的示例如下:
/dev/disk/by-path/pci-0000:03:00.0-scsi-0:1:0:0
/dev/disk/by-path/ 条目可能还包括分区号,例如:
/dev/disk/by-path/pci-0000:03:00.0-scsi-0:1:0:0-part1

25.8.3.1. udev 设备命名约定的限制

以下是 udev 命名规则的一些限制。
  • 执行查询时可能无法访问该设备,因为 udev 机制可能依赖于为 udev 事件处理 udev 规则时查询 存储设备的能力。当设备不在服务器机箱中时,这更可能会在光纤频道、iSCSI 或者 FCoE 存储设备中发生。
  • 内核也可以随时发送 udev 事件,从而导致规则被处理,并可能导致 /dev/disk/by KafkaUser/ 链接在设备无法访问时被删除。
  • udev 事件生成和处理时(如检测到大量设备且用户空间 udevd 服务需要一定时间来处理每个事件)之间可能会有延迟。这可能会导致内核检测到该设备和 /dev/disk/byjpeg/ 名称可用之间延迟。
  • 规则调用的 blkid 等外部程序可以在短时间内打开该设备,使设备无法被其他用途访问。

25.8.3.2. 修改持久性命名属性

虽然 udev 命名属性是持久的,但它们在系统重启后不会自行更改,但有一部分也是可以配置的。您可以为以下持久性命名属性设置自定义值:
  • UUID :文件系统 UUID
  • LABEL: 文件系统标签
由于 UUIDLABEL 属性与文件系统相关,因此您需要使用的工具取决于该分区上的文件系统。
  • 要更改 XFS 文件系统的 UUIDLABEL 属性,请卸载文件系统,然后使用 xfs_admin 工具更改属性:
    # umount /dev/device
    # xfs_admin [-U new_uuid] [-L new_label] /dev/device
    # udevadm settle
  • 要更改 ext4、ext3 或 ext2 文件系统的 UUIDLABEL 属性,请使用 tune2fs 工具:
    # tune2fs [-U new_uuid] [-L new_label] /dev/device
    # udevadm settle
使用您要设置的 UUID 替换 new_uuid ;例如,1cdfbc07-1c90-4984-b5ec-f61943f5ea50。使用标签替换 new_label,例如 backup_data
注意
更改 udev 属性在后台进行,可能需要很长时间。udevadm settle 命令一直等待直到更改完全注册,这样可确保您的下一个命令能够正确使用新属性。
您还应在创建新设备后使用 命令;例如,在使用 parted 工具创建带有自定义 PARTUUIDPARTLABEL 属性的分区后,或者在创建新文件系统后使用。

25.9. 删除存储设备

在删除对存储设备本身的访问前,建议先备份设备上的数据。之后,刷新 I/O ,并删除对该设备的所有操作系统引用(如下所述)。如果该设备使用多路径,则对多路径"伪设备"(第 25.8.2 节 “全球标识符(WWID)”)以及代表该设备路径的每个标识符进行此操作。如果您只删除多路径设备的路径,则其他路径会保留,那么这个流程会很简单,如 第 25.11 节 “添加存储设备或路径” 所述。
当系统面临内存压力时,不建议移除存储设备,因为 I/O 刷新会增加负载。要确定内存压力的级别,请运行命令 vmstat 1 100; 不建议删除设备,如果:
  • 可用内存小于每 100 超过 10 个样本的 5%( 可用 命令也可用于显示总内存)。
  • 交换处于活跃状态( vmstat 输出中的非零 siso 列)。
删除对设备的所有访问的一般流程如下:

过程 25.11. 确保彻底的设备删除

  1. 根据需要,关闭设备的所有用户,并备份设备数据。
  2. 使用 umount 卸载挂载该设备的任何文件系统。
  3. 使用它的任何 md 和 LVM 卷中删除该设备。如果设备是 LVM 卷组的成员,那么可能需要使用 pvmove 命令将数据移出设备,然后使用 vgreduce 命令删除物理卷,以及(可选) pvremove 从磁盘中删除 LVM 元数据。
  4. 运行 multipath -l 命令来查找配置为多路径设备 的设备列表。如果该设备被配置为多路径设备,请运行 multipath -f device 命令来清除任何未完成的 I/O 并删除多路径设备。
  5. 将未完成的 I/O 刷新到已用路径。这对 raw 设备非常重要,其中没有 umountvgreduce 操作来导致 I/O 刷新。只有在出现以下情况时,才需要执行此步骤:
    • 该设备没有配置为多路径设备,或者
    • 该设备被配置为多路径设备,I/O 是在过去某个点直接发布到其独立路径。
    使用以下命令刷新任何未完成的 I/O:
    # blockdev --flushbufs device
  6. 删除对设备的基于路径名称的任何引用,如 /dev/sd/dev/disk/by-path 或系统上的 major:minor 号、应用程序、脚本或工具。这对于确保以后添加的不同设备不会被