前言
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 篇。