XFS

来自 Arch Linux 中文维基

XFS 是由硅谷图形公司 (Silicon Graphics, Inc.) 开发的高性能日志式文件系统。XFS 因其基于分配组 (allocation group) 的设计而特别擅长并行 IO。当该文件系统跨越多个存储设备时,这种设计使得 IO 线程数、文件系统带宽、文件和文件系统大小都具有极大的可伸缩性。

预备[编辑 | 编辑源代码]

为了使用 XFS 用户空间实用程序,请安装 xfsprogs 软件包。 它包含了管理 XFS 文件系统所需的必要工具。

数据损坏[编辑 | 编辑源代码]

如果遇到了任何原因的引起的数据损坏,就需要手动修复文件系统。

修复 XFS 文件系统[编辑 | 编辑源代码]

先卸载 XFS 文件系统:

# umount /dev/sda3

卸载后,运行 xfs_repair(8) 工具来修复:

# xfs_repair -v /dev/sda3

在线元数据检查 (scrub)[编辑 | 编辑源代码]

警告: 该程序目前是实验性的,这意味着它的行为和接口可能随时发生变化。参见 xfs_scrub(8)

xfs_scrub 请求内核检查 XFS 文件系统中的所有元数据对象。内核会扫描元数据记录以查找明显错误的值,然后与其他元数据进行交叉引用。其目的是通过检查单个元数据记录与文件系统中其他元数据的一致性,建立对整个文件系统一致性的合理置信度。如果存在完整的冗余数据结构,则可以根据其他元数据重建损坏的元数据。

启用/运行 xfs_scrub_all.timer 以定期在线检查所有 XFS 文件系统元数据。

注意: 有时可能需要 编辑 xfs_scrub_all.timer,它会 (默认) 在每周日上午 3:10 运行,并且如果错过了上一次执行时间 (也就是说因为系统关机/断电) ,计时器将会 立即激发

数据完整性[编辑 | 编辑源代码]

xfsprogs 3.2.0 引入了一种新型磁盘格式 (v5),其包含了称为自描述元数据 (Self-Describing Metadata) 的元数据校验方案。 基于 CRC32,它提供的额外保护措施可以在意外断电时防止元数据损坏。当使用 xfsprogs 3.2.3 或更高版本时,这种校验默认是打开的。如果需要在旧版内核中挂载 XFS 为可读写,可以在调用 mkfs.xfs(8) 时加上 -m crc=0 来关闭校验特性。

# mkfs.xfs -m crc=0 /dev/target_partition

自 Linux Kernel 3.15 起,XFS v5 磁盘格式被视作稳定特性,可用于生产环境。

注意:BtrfsZFS 不同,XFS 中的 CRC32 校验仅用于元数据而非实际数据。

使用管理[编辑 | 编辑源代码]

调整文件系统大小[编辑 | 编辑源代码]

注意: 目前来讲,缩减 XFS 大小还 没可能实现[失效链接 2021-11-19 ⓘ]

当更改分区后,XFS 可以被在线调整大小。只需将挂载点作为第一参数执行 xfs_growfs, 即可将 XFS 文件系统增大到可能的最大大小:

# xfs_growfs /path/to/mnt/point

性能[编辑 | 编辑源代码]

要获得最佳速度,只要这样创建 XFS 文件系统:

# mkfs.xfs /dev/target_partition

对,就是这么简单 - 因为所有新特性默认都是开启的[失效链接 2021-11-19 ⓘ]

另请参阅 xfs(5) 以详细了解所有可用的挂载选项。

提示:当在 RAID 设备上使用 XFS 文件系统时,可通过使用 largeioswalloc 值,以及比默认情况更大的 logbsizeallocsize 值等来提高性能。下列文章能提供更多有关详情:

带区大小和宽度[编辑 | 编辑源代码]

如果这个文件系统位于条带化的 RAID 上,可以在 mkfs.xfs(8) 命令中指定带区大小来获得显著的性能提升。

XFS 有时可以检测到软 RAID 下的几何形 (geometry), 但万一您要重塑其或您正在使用硬 RAID, 请参阅如何计算出正确的 sunit 和 swidth 值以获得最佳性能[失效链接 2021-11-19 ⓘ]

访问时间记录[编辑 | 编辑源代码]

某些文件系统可以通过在 /etc/fstab 文件中添加 noatime 挂载选项来增强性能。对于 XFS 文件系统来说,默认的访问时间记录行为是 relatime,与 noatime 相比这几乎没有额外开销,且仍然可以记录正确的访问时间。所有 Linux 文件系统现在都以这个选项为默认值(从大约 2.6.30 版本开始),但是 XFS 从 2006 年开始就采用了类似 relatime 的特性,因此不需要出于性能考虑而在 XFS 上使用 noatime。

另外,noatime 包含了 nodiratime,所以指定了 noatime 时就不需要指定 nodiratime

磁盘碎片整理[编辑 | 编辑源代码]

尽管 XFS 本质上基于区段 (Extent) 并且延迟分配策略很大程度上增强了它对磁盘碎片的抗性,XFS 仍然提供了磁盘碎片整理程序(xfs_fsr,XFS filesystem reorganizer 的缩写),它可以在已挂载且活动的 XFS 文件系统上整理碎片。定期查看 XFS 碎片也很有用。

xfs_fsr(8) 改进了已挂载文件系统的文件组织。该重组织算法一次操作一份文件,对文件进行压缩或改进文件区段布局(改成连续数据块)。

检查碎片程度[编辑 | 编辑源代码]

查看当前文件系统中有多少磁盘碎片:

# xfs_db -c frag -r /dev/sda3

进行碎片整理[编辑 | 编辑源代码]

要启动碎片整理,使用 xfs_fsr(8) 命令:

# xfs_fsr /dev/sda3

B+树(用于索引未用 inode)[编辑 | 编辑源代码]

自 Linux 3.16 起,XFS 增加了 B+树用于索引未被使用的 inode。它等同于索引已使用 inode 的 B+树,不同之处在于索引未用 inode 的 B+树至少包含一个未用 inode。这一设计的目的是改进分配 inode 时寻找未用 inode 簇的性能。它可以提高长期使用后的文件系统性能,比如你在数月或数年之间已经向文件系统写入或删除了数百万的文件。使用这个功能不会影响整个文件系统的可靠性程度或恢复能力。

这个功能依赖于新的 v5 磁盘格式,自 Linux Kernel 3.15 起它被视作可用于生产环境的稳定特性。它没有改变磁盘上原本的数据结构,但会添加一个新的结构来使它与 B+树(用于分配 inode)保持兼容;因此,旧版本的内核只能将带有 B+树功能的文件系统挂载为只读模式。

当使用 xfsprogs 3.2.3 或更高版本时这个功能默认是开启的。如果你需要一个旧版本内核可写入的文件系统,这个功能可以在格式化 XFS 分区时用 finobt=0 开关来关闭。你还需要把它和 crc=0 一起用。

# mkfs.xfs -m crc=0,finobt=0 /dev/target_partition

也可以简写(crc 包含了 finobt

# mkfs.xfs -m crc=0 /dev/target_partition

外部 XFS 日志[编辑 | 编辑源代码]

使用外部日志 (元数据日志) 可能对提高性能很有帮助 (例如在 SSD 上)[1][失效链接 2022-09-23 ⓘ]。请参阅 mkfs.xfs(8) 获取有关 logdev 参数的更多详情.

警告: 当心:使用闪存的情况下可能会减损硬盘寿命。请参阅 Improving performance#Reduce disk reads/writes 获取有关 SSD 寿命减损的详情。

要在创建 XFS 文件系统时保留指定大小的外部日志,请为 mkfs.xfs 命令指定 -l logdev=device,size=size 选项。如果省略 size 参数, 则会使用基于文件系统大小的日志大小。要挂载 XFS 文件系统让其使用外部日志,请为 mount 命令指定 -o logdev=device 选项。

同步间隔[编辑 | 编辑源代码]

XFS 有其专有的 sysctl 变量来设置 "回写间隔"。在 Arch 上这个默认值为 3000,可以设置到更大的值,只是切记更大的值在有些情况下会导致数据丢失:

/etc/sysctl.d/20-xfs-sync-interval.conf
fs.xfs.xfssyncd_centisecs = 10000

故障排除[编辑 | 编辑源代码]

根文件系统配额[编辑 | 编辑源代码]

XFS 配额挂载选项(uquotagquotaprjquota 等)会在重新挂载文件系统时失效。要对根文件系统启用配额功能,这个挂载选项需要作为内核参数 rootflags= 传递给初始化内存盘 (initramfs)。在随后的启动过程中,这个选项不需要在 /etc/fstab 中挂载根 (/) 文件系统的选项里再次列出。

注意: XFS 配额相较于标准 Linux 磁盘配额 有一些区别,这篇文章 https://inai.de/linux/adm_quota 或许值得一读。

如果用户 "nobody" 无法访问挂载点,xfs_scrub_all 会执行失败[编辑 | 编辑源代码]

当执行 xfs_scrub_all 时,它将为每个已挂载的 XFS 文件系统启动 xfs_scrub@.service 服务。这项服务以用户 nobody 身份运行,所以如果 nobody 无法导向至目录,命令执行将会失败,并随附以下错误:

xfs_scrub@mountpoint.service: Changing to the requested working directory failed: Permission denied
xfs_scrub@mountpoint.service: Failed at step CHDIR spawning /usr/bin/xfs_scrub: Permission denied
xfs_scrub@mountpoint.service: Main process exited, code=exited, status=200/CHDIR

为了能让对应服务运行,请更改挂载点的权限以使用户 nobody 拥有执行权限。

参考资料[编辑 | 编辑源代码]