ext4和XFS文件系统有什么区别?Linux服务器存储选型指南

给一块新磁盘分区之后,第一件要决定的事就是"格式化成什么文件系统"。老一点的教程习惯性写 mkfs.ext4,而现在的云主机镜像、CentOS 7 之后的默认安装、以及各种容器节点,默认又常常是 XFS。于是很多人会卡在同一个问题上:ext4 和 XFS 到底差在哪?我到底该选哪个?

这篇文章不讲文件系统的源码实现,只讲服务器选型时要关心的几件事:它们的定位差异、关键能力对比、各自适合什么业务场景,以及怎么用命令创建和查看。读完你应该能在一分钟内判断"这台机器的数据盘应该格式化成 ext4 还是 XFS",并且知道为什么。

需要先说明一个前提:文件系统的选择,本质上是在"单文件性能、并发扩展性、元数据操作、可缩容性、老硬件兼容性"这几个维度之间做取舍。没有绝对更好的那一个,只有更适合当前业务的那一个。下面的对比都基于主流发行版(RHEL/CentOS/Rocky 8/9、Ubuntu 20.04/22.04)自带的默认版本。

一、先理解两者的"出身"和设计取向

ext4 是 ext 系列的第四代,2008 年进入主线内核,属于"稳扎稳打"的路线。它的设计目标是兼容老版本、单盘性能好、工具链成熟,几乎所有 Linux 发行版、救援盘、老旧硬件都能无痛识别。它继承了一个重要特性:支持在线缩容(用 resize2fs 可以缩小),这一点让它在"虚拟机磁盘经常需要调整大小"的场景里很受欢迎。

XFS 则源自 SGI 的 IRIX 系统,2001 年移植到 Linux,2014 年后随着 RHEL 7 把它设为默认文件系统而大规模普及。XFS 从一开始就是为大文件、大容量、高并发设计的:它采用 B+ 树管理空闲空间和目录,分配组(allocation group,AG)机制让多个线程可以并行操作,因此在多核、多盘、大带宽的服务器上扩展性明显更好。代价是 XFS 只能在线扩容,不能缩容——这是选型时最容易踩的一个坑。

一句话概括:ext4 是"通用、稳妥、可缩容",XFS 是"高并发、大容量、只扩不缩"。

二、核心能力对比

下表是选型时最该关注的几个维度,参数为经验值和官方文档量级,供参考而非精确基准:

对比维度 ext4 XFS
首次进入内核 2008 年(2.6.28) 2001 年稳定(2.4),2014 年起 RHEL 默认
单文件最大 16 TB 8 EB(理论值,受实际块大小限制)
单文件系统最大 1 EB(理论),实践建议 50 TB 以内 8 EB(理论),实践可轻松管理上百 TB
在线扩容 支持(resize2fs) 支持(xfs_growfs,只能增)
在线缩容 支持(需先卸载数据校对) 不支持
目录项性能 一般,海量小文件时目录检索变慢 强,B+ 树目录,百万级文件仍快
并发写入扩展性 一般,大锁粒度 强,分配组并行
元数据校验 支持(-O metadata_csum) 支持(默认开启 CRC 校验)
误删恢复工具 有 extundelete 等第三方工具 官方无成熟恢复工具,恢复更难
运维熟悉度 极高,资料最多 高,云环境主流
老内核/救援盘兼容 极好 较好,但旧工具可能不认新特性

从表里可以读出两个关键结论:一是 XFS 在"大文件 + 高并发"上更强,ext4 在"可缩容 + 恢复工具多"上更稳妥;二是如果没有特殊需求,两者在中小规模(比如 500 GB 以内的普通业务盘)上的实际差距,往往没有宣传中那么大。

三、怎么创建和查看文件系统

创建文件系统的命令是 mkfs 系列,两个发行版基本一致,主要差别在装包命令。

# RHEL/CentOS/Rocky:安装格式化工具(xfsprogs 一般已自带)
sudo yum install -y e2fsprogs xfsprogs
# Debian/Ubuntu:
sudo apt update && sudo apt install -y e2fsprogs xfsprogs

# 格式化为 ext4(假设磁盘是 /dev/vdb,分区是 /dev/vdb1)
sudo mkfs.ext4 -L data /dev/vdb1

# 格式化为 XFS,注意 -f 是强制覆盖已有文件系统
sudo mkfs.xfs -f -L data /dev/vdb1

# 查看已有文件系统的类型
lsblk -f
blkid /dev/vdb1
df -T

建议给文件系统打上标签(-L data),这样挂载时可以写 LABEL=data 而不用记 /dev/vdb1,磁盘顺序变化时更稳。

四、ext4 的创建参数与调优

ext4 常见的几个参数:

# 指定 inode 数量。默认每 16KB 一个 inode,小文件多的场景可改小
sudo mkfs.ext4 -N 2000000 /dev/vdb1        # 直接指定 inode 总数

# 指定 inode 比例(bytes-per-inode),小文件场景可用 4096 甚至 2048
sudo mkfs.ext4 -i 4096 /dev/vdb1

# 关闭日志(仅用于纯数据盘且可接受掉电丢数据,生产慎用)
sudo mkfs.ext4 -O ^has_journal /dev/vdb1

# 大目录(海量小文件)建议开启 dir_index(现代版本默认已开)
sudo mkfs.ext4 -O dir_index /dev/vdb1

创建完成后,可以通过 tune2fs 查看和调整:

# 查看文件系统详细信息,包括 inode 总数、块大小、特性
sudo tune2fs -l /dev/vdb1 | grep -E "Block count|Inode count|Block size|Filesystem features"

# 设置每 30 次挂载或每 180 天做一次 fsck(默认值,可保留)
sudo tune2fs -c 30 -i 180d /dev/vdb1

# 预留空间比例:默认 5% 仅 root 可用,纯数据盘可降到 1%
sudo tune2fs -m 1 /dev/vdb1

五、XFS 的创建参数与调优

XFS 的参数与 ext4 思路不同,它更关注"分配组数量"和"日志大小":

# 查看当前内核与 xfsprogs 支持的特性
xfs_info /dev/vdb1          # 对已挂载的文件系统查看(需先挂载)
xfs_db -r -c "info" /dev/vdb1   # 未挂载时查看

# 创建时指定块大小(默认 4K,一般不要改)
sudo mkfs.xfs -b size=4096 /dev/vdb1

# 大容量盘指定更多分配组,提升并行写入能力(经验值:AG 数量与 CPU 核数相关)
sudo mkfs.xfs -d agcount=8 /dev/vdb1

# 指定日志大小(单位 MB),日志大写入聚合更好
sudo mkfs.xfs -l size=512m /dev/vdb1

# 强制创建(覆盖已有文件系统)
sudo mkfs.xfs -f /dev/vdb1

挂载后扩容用:

# XFS 扩容:先扩块设备/分区,再扩文件系统(详见扩容专文)
sudo xfs_growfs /data

六、挂载参数:性能与安全的取舍

挂载选项直接影响性能和数据安全,是最容易被忽略的一环。/etc/fstab 里可以这样写:

# ext4 常用挂载选项
/dev/vdb1  /data  ext4  defaults,noatime,nodiratime,data=ordered  0 2

# XFS 常用挂载选项
/dev/vdb1  /data  xfs   defaults,noatime,logbufs=8,logbsize=256k  0 2

几个关键参数的含义:

  • noatime:读取时不更新文件的访问时间。这个改动对读多写少的场景能省下可观的元数据写入,是收益最明显的一个调优项。
  • nodiratime:不更新目录的访问时间,配合 noatime 使用。
  • data=ordered(ext4):数据先写入再提交元数据,兼顾性能与一致性,是默认值。
  • logbufs / logbsize(XFS):增大日志缓冲区,在写入密集场景能提升吞吐。

七、到底怎么选:按业务场景给结论

落到具体业务,可以按下面的思路决策:

  • 系统盘 / 通用业务盘(几百 GB):两者都行,跟着发行版默认走最省事。RHEL 系默认 XFS,Debian/Ubuntu 默认 ext4,没必要强行改。
  • 数据库数据盘(MySQL、PostgreSQL、MongoDB):优先 XFS。XFS 在并发读写、大文件预分配上的表现更稳,且很多数据库官方文档对 XFS 有明确调优建议。
  • 海量小文件(图片站、日志归档、代码仓库、邮件队列):优先 XFS。B+ 树目录在海量文件下的检索性能优势明显,ext4 在单目录文件数超过几十万后会变慢。
  • 需要经常缩容的虚拟机磁盘:优先 ext4。XFS 不能缩容,一旦把 1 TB 盘格式化为 XFS,之后就再也回不到 500 GB。
  • 大视频、备份文件、对象缓存盘:优先 XFS。大文件顺序读写吞吐更高。
  • 老旧硬件、需要救援盘能认的盘:优先 ext4,兼容性最稳。
  • 需要对误删文件做恢复:优先 ext4,第三方恢复工具相对成熟。

八、容易踩的坑

第一,XFS 不能缩容。这是最硬的一条限制,规划容量时就要想清楚。如果确实需要缩小,唯一办法是备份数据、重新格式化、再恢复,代价极高。

第二,ext4 的 inode 数量在格式化时就固定了。如果一开始按默认比例创建,之后小文件突然暴增,inode 会先于容量耗尽,届时只能重建文件系统。小文件业务建议格式化时就把 inode 给足。

第三,不要把 XFS 当 ext4 用。比如习惯性执行 resize2fs 去缩 XFS,会直接报错甚至损伤数据;XFS 对应的是 xfs_growfs。

第四,在线操作前一定确认已挂载干净。用 df -h、mount | grep vdb 确认挂载点,用 lsof +D /data 看有没有进程占用。

风险提示:本文涉及 mkfs、tune2fs、xfs_growfs 等操作。mkfs 会彻底清空目标设备上的所有数据且不可恢复。执行前务必用 lsblk -f 确认设备名,不要把系统盘 /dev/vda 或 /dev/sda 当成新数据盘。生产环境操作前先做快照或备份。如需回滚,唯一方式是恢复备份。

常见问题

Q1:我的云主机默认是 XFS,能改成 ext4 吗?
可以,但需要重新格式化,会清空数据。如果只是想新建一块数据盘,直接 mkfs.ext4 即可,无需改动系统盘。

Q2:XFS 真的完全不能缩容吗?
是的,官方不支持在线缩容,也没有安全的离线缩容工具。网上有些"偏方"风险极高,不建议在生产使用。

Q3:ext4 单目录能放多少文件?
默认情况下单目录几十万文件后性能明显下降。如果确实需要单目录海量文件,两个方案:一是改选 XFS,二是 ext4 开启 dir_index 并按哈希目录结构自行分片。

Q4:文件系统块大小(4K/8K)要不要改?
一般不要改。4K 是与主流磁盘、系统页大小最匹配的值。只有明确的大文件顺序读写场景(如视频存储)才考虑更大块,但会牺牲空间利用率。

Q5:怎么快速查看当前磁盘用的什么文件系统?
lsblk -f 一眼看全,或 df -T 看已挂载的,blkid 看设备的。

总结

  • ext4 和 XFS 没有绝对优劣:ext4 稳妥、可缩容、恢复工具多;XFS 并发强、大文件强、只扩不缩。
  • 数据库盘、海量小文件盘、大文件存储盘优先考虑 XFS;需要缩容的虚拟机盘、老硬件、要恢复误删的盘优先 ext4。
  • 系统盘跟着发行版默认走即可,真正需要花心思的是数据盘。
  • 格式化前想清楚两件事:XFS 不缩容;ext4 的 inode 数一旦定死不能改。
  • 挂载加 noatime 是收益最高、风险最低的调优,建议默认加上。
  • 所有 mkfs 操作前用 lsblk -f 二次确认设备名,这是保护数据的最后一道防线。