前言

mkfs 时的灵魂拷问:ext4 还是 xfs?两者都是成熟的日志式文件系统,但性格差异明显。这篇从原理到选型讲清楚。

一、文件系统要解决什么

数据的逻辑组织 + 崩溃一致性:

应用写入 "hello"
   │
   ▼
文件系统: 把数据拆成块 + 维护元数据(inode 表、目录项、空闲块位图)
   │
   ▼
日志(Journal): 先把"要做的修改"记一笔, 再真正落盘
   │          断电重启后: 重放日志或回滚 —— 保证一致性
   ▼
磁盘块

inode:存文件元数据(权限、时间戳、数据块指针),不含文件名。经典问题——“磁盘有空间但创建不了文件”= inode 耗尽(海量小文件):

df -i          # 看 inode 使用率
df -h          # 空间正常但 df -i 满 → 找出小文件目录清理

二、核心对比

维度 ext4 XFS
出生 2008(ext 系第四代) 1994 SGI,2001 入 Linux
最大卷 1EB / 单文件 16TB 8EB / 单文件 8EB
日志 固定区域,可独立设备 元数据日志,更精细
元数据规模 mkfs 时定死 inode 数 动态分配 inode
大文件性能 良好 优秀(并行 IO、分配组)
海量小文件 良好 略逊(但动态 inode 救场)
在线扩容 ✅ resize2fs ✅ xfs_growfs
在线缩容 ❌(离线也高危) ❌(根本不支持)
延迟分配 ✅ ✅
RHEL 默认 RHEL6 RHEL7+ 默认

注意:两者都不能在线缩容。规划容量时宁可先大后扩,别指望缩回来。

三、性能差异的本质

XFS 的分配组(AG)

XFS 把卷切成多个 Allocation Group,每个 AG 有独立的元数据与锁——多线程写不同区域时天然并行,大文件吞吐和并发扩展性强。

mkfs.xfs -d agcount=8 /dev/vdb1      # 大阵列可显式调多 AG

ext4 的稳

ext4 在单线程小 IO、元数据操作、碎片控制上表现均衡,社区生态最长(fsck 工具链、文档、极端案例经验都最丰富)。

简单实测(fio)

dnf install -y fio

# 顺序大文件写
fio -name=seq -rw=write -bs=1M -size=4G -numjobs=1 -directory=/data -direct=1

# 随机小 IO(数据库形态)
fio -name=rand -rw=randwrite -bs=4k -size=2G -numjobs=8 -iodepth=32 -directory=/data -direct=1

典型结果:顺序大文件 XFS 略优;4K 随机写两者接近(瓶颈在设备本身)。

四、日常操作

# 创建
mkfs.ext4 -L appdata /dev/vdb1
mkfs.xfs  -L bigdata /dev/vdb1

# 挂载(XFS 常用 noatime 减少元数据写)
mount -o noatime /dev/vdb1 /data

# 在线扩容(云盘扩容后)
resize2fs /dev/vdb1                 # ext4
xfs_growfs /data                    # xfs(注意: 参数是挂载点!)

# 查看信息
dumpe2fs /dev/vdb1 | head -20       # ext4 详情
xfs_info /data                       # xfs 详情(会显示 agcount/inosize)

# 检查修复(先卸载!)
e2fsck -f /dev/vdb1                  # ext4
xfs_repair /dev/vdb1                 # xfs(严重时 -L 丢日志, 最后手段)

挂载选项实践:

noatime     不更新访问时间(几乎所有场景推荐)
nodiratime  不更新目录访问时间(noatime 已含)
discard     TRIM(SSD/云盘适用)

五、怎么选(结论向)

场景 推荐
RHEL 系默认跟随 XFS(发行版已替你选好)
大文件为主(视频、备份、镜像仓库、日志归档) XFS
海量小文件 + 需要极致小文件性能调研 ext4 / 特殊方案
通用业务盘、拿不准 XFS
需要离线缩容可能性的极少数场景 都不支持,重新规划
U盘/移动盘跨平台交换 ext4(兼容面更广)

一句话:跟随发行版默认(XFS),大文件场景更坚定 XFS,纠结时选 XFS。

六、通用排障

# 只读重挂载(磁盘错误时内核的保护动作)
mount -o remount,rw /data            # 恢复读写前先看 dmesg

# 看文件系统错误
dmesg | grep -iE "ext4|xfs|error"

# 碎片情况
filefrag -v /data/bigfile            # ext4 单文件碎片
xfs_db -c frag -r /dev/vdb1          # xfs 碎片率

# 被删但占空间的文件(进程仍持有句柄)
lsof +L4 | grep deleted

小结

  • 两者都是日志文件系统,稳定性都过关
  • XFS 强在大文件/高并发/动态 inode,是现代 RHEL 默认
  • ext4 强在均衡与生态,小文件友好
  • 都只扩不缩,容量规划宁大勿小
  • df -h 满先看 df -i,空间与 inode 是两条账

本文是「Linux 基础」系列第 6 篇。