Extent for macOS
获取
Linux 磁盘指南

ext4、ext3、ext2 详解。

Linux 文件系统是什么,它们如何在磁盘上安放文件,日志保护的是什么,如今哪些功能和限制最重要,以及如何在 Mac 或 Windows 电脑上打开 ext4 磁盘。

最近核实

什么是 ext2、ext3 和 ext4

ext2、ext3 和 ext4 是第二、第三和第四代扩展文件系统(extended file system),三十多年来 Linux 一直用它们格式化自己的磁盘。文件系统决定文件、文件夹、名称、权限和日期在磁盘上如何存放,让任何懂这种格式的计算机都能重新找到它们。

如今最常见的是 ext4。Debian、Ubuntu 和 Raspberry Pi OS 都把磁盘格式化为 ext4,Linux 服务器的数据盘也常用它,Google 在 2010 年把 Android 手机迁移到了 ext4。在 Linux 上准备的 U 盘或 SD 卡几乎总是 ext4。

三者不是互不相干的格式,而是一个家族:每一代都保留上一代的磁盘结构并加以扩展。因此当前的 Linux 内核用同一个 ext4 驱动读写这三种格式。

简史

  1. 1992

    ext,扩展文件系统

    Rémy Card 为 Linux 0.96c 编写。它取代了 Linux 最初使用的 Minix 文件系统,后者对磁盘大小和文件名的限制当时已经太小。

  2. 1993

    ext2

    1993 年 1 月为 Linux 0.99 重新设计,借鉴了 BSD Fast File System 的思路:磁盘被分成块组,并分别记录访问、更改和修改时间。整个 1990 年代它都是 Linux 的标准。

  3. 2001

    ext3 加入日志

    Stephen Tweedie 的 ext3 于 2001 年 11 月随 Linux 2.4.15 进入主线内核。它的结构与 ext2 相同,给 ext2 磁盘加上日志就成了 ext3,但崩溃后不再需要漫长地检查整个磁盘。

  4. 2006

    ext4 开始开发

    Theodore Ts’o 于 2006 年 6 月 28 日公布计划,基础是为集群文件系统 Lustre 开发的扩展。开发版 ext4dev 出现在 Linux 2.6.19 中。

  5. 2008

    ext4 稳定

    2008 年 12 月 25 日发布的 Linux 2.6.28 带来了区段、64 位块号、延迟分配和纳秒级时间戳。

  6. 2013–2021

    校验和、加密、大小写

    后来的内核陆续加入内联数据(3.8)、元数据校验和(3.18)、加密(4.1)、不区分大小写的文件夹(5.2)、verity(5.4)、fast commit(5.10)和 orphan file(5.15)。

ext4 在磁盘上的结构

块。ext4 以块为单位分配空间,通常是 4 KiB;块大小在格式化时确定,范围是 1 KiB 到 64 KiB。除非磁盘使用内联数据,否则即使只有一个字节的文件也要占用一整块。

块组。磁盘被划分为块组,4 KiB 块时每组 32,768 块,即 128 MiB。每个块组有两个位图(记录已用的块和索引节点)以及索引节点表的一部分。把文件数据放在其索引节点附近可以减少磁头移动。flex_bg 功能把多个组的位图和索引节点表集中存放,让大文件可以跨越组边界连续存放。

超级块。位于磁盘开头 1 KiB 的空隙之后,记录文件系统的大小、块大小、所用功能,以及它是否被正常卸载。多个块组中存有它的副本,损坏的超级块可以从备份恢复。

索引节点。每个文件和文件夹都有一个索引节点(inode),默认 256 字节。它保存除名称以外的一切:所有者、权限、时间戳、大小以及数据的位置。索引节点的数量在格式化时确定,因此装满大量小文件的磁盘可能在还有空闲空间时就用完索引节点。

文件夹。文件夹是一种特殊文件,把名称映射到索引节点号。名称最长 255 字节。小文件夹是一个简单的列表;大文件夹带有哈希树索引(dir_index,“htree”),即使在十万个名称中查找一个,也只需读取几个块,而不必全部扫描。

用区段代替块映射。ext2 和 ext3 逐块记录文件:索引节点中有 12 个直接指针,然后是装满指针的块、指向这些块的指针,再往上一层。ext4 记录的是范围。一个区段(extent)表示“从这里开始的这么多块”,一个条目最多覆盖 32,768 块(4 KiB 块时为 128 MiB)。四个区段直接放在索引节点里;更长、更零散的文件会得到一棵最多五层的区段树。一个大而连续的文件只需几个条目,而不是成千上万个。

小文件可以放进索引节点。启用 inline_data 功能后,文件的前 60 字节存放在索引节点本身,稍多一点则放在扩展属性空间中,完全不占用块。

日志及其保护的内容

修改文件系统从来不是一次写入就能完成的。即使只新建一个文件,也要改动位图、索引节点、文件夹以及组描述符中的计数器。如果在这些写入之间断电,磁盘就会停留在改了一半的状态。对 ext2 来说,发现这种情况的唯一办法是用 e2fsck 检查整个磁盘,大磁盘上要花很长时间。

ext3 和 ext4 有日志(journal):磁盘上的一块保留区域(通常是索引节点 8),变更在真正生效之前先写到这里。一次变更分三步:先把新的块写入日志;然后一条提交记录标记事务完成;之后这些块才被写到真正的位置,这一步叫检查点。无论何时断电,下次挂载时日志都会被重放:已提交的事务重新应用,没有提交记录的则被丢弃。文件系统几秒钟内就恢复一致。

ext3 和 ext4 日志的三种数据模式
模式经过日志的内容崩溃之后
data=ordered(默认)只有元数据,但文件数据会在指向它的元数据提交之前写入。结构一致;当时正在写入的文件可能仍是旧数据。
data=journal元数据和文件数据。最安全,也最慢;已提交的数据得以保留。
data=writeback只有元数据,不保证数据顺序。结构一致,但最近修改的文件中可能出现过时内容。

日志不是备份。它保持文件系统结构完整,并保证已提交的内容,但不能挽回正在进行的修改,也不能防止磁盘本身损坏。ext4 还可以使用 fast commit(Linux 5.10):在两次完整提交之间写入只包含变更元数据的小记录,减轻频繁调用 fsync 的开销。

从正在运行的 Raspberry Pi 上拔下的存储卡正是这种情况:日志中有已提交但尚未写到最终位置的事务,超级块标记为“needs recovery”。Linux 会在下次挂载时重放它。在其他地方读取这张卡的软件也必须重放日志,否则显示的是这些事务之前的文件。

ext2、ext3 与 ext4 对比

三代对比(4 KiB 块)
ext2ext3ext4
进入 Linux1993 年(0.99)2001 年(2.4.15)2008 年(2.6.28)
日志无有有,自 Linux 5.10 起支持 fast commit
文件块的记录方式块映射块映射区段
最大文件2 TiB2 TiB16 TiB
最大文件系统16 TiB16 TiB实际 1 EiB(64 位)
时间戳秒级,到 2038 年(128 字节索引节点)秒级,到 2038 年(128 字节索引节点)纳秒级,到 2446 年
大文件夹索引无有(dir_index)有,large_dir 可到三层
元数据校验和无无有(metadata_csum)

实际上,新建的一切都用 ext4 即可。新磁盘没有理由使用 ext3;ext2 仍存在于不需要日志的地方,比如小的引导分区或需要尽量少写入的闪存介质。ext3 磁盘可以就地转换为 ext4,但已有的文件在重写之前仍保留块映射。

实际磁盘上会遇到的功能

ext 磁盘没有版本号,而是在超级块中带有功能标志,每个标志属于三类之一。兼容功能可以被不认识它的软件忽略;只读兼容意味着这样的软件可以读取磁盘但不能写入;不兼容意味着它根本不能碰这个磁盘。正是这条规则让旧工具拒绝新磁盘,而不是把它弄坏。

常见的 ext4 功能
功能作用Linux 起始版本
extent用区段而不是块映射记录文件。2.6.28
64bit超过 32 位的块号,用于大于 16 TiB 的文件系统。2.6.28
flex_bg把多个块组的元数据集中存放。2.6.28
metadata_csum所有元数据带 CRC32C 校验和,用于发现损坏。3.18
metadata_csum_seed校验和种子存放在超级块中,从而可以更改 UUID。4.4
inline_data把极小的文件存放在索引节点中。3.8
encrypt按文件夹加密文件内容和名称。4.1
casefold名称不区分大小写的文件夹。5.2
verity用哈希树校验内容的只读文件。5.4
fast_commit两次完整提交之间的小型日志记录。5.10
orphan_file更快地处理打开期间被删除的文件。5.15

在哪里会遇到它们:当前的 mke2fs 默认启用 metadata_csum 和 64bit,e2fsprogs 1.47 又加入了 orphan_file 和 metadata_csum_seed。有些发行版会重新关闭它们,以便旧的引导加载程序也能读取磁盘。Raspberry Pi OS 镜像不带 64bit。Steam Deck 用 casefold 格式化 microSD 卡,Android 使用 encrypt。

要查看磁盘使用了哪些功能,可以在 Linux 上用 sudo dumpe2fs -h /dev/sdX1 读取超级块,查看“Filesystem features”一行。

限制

不同块大小下 ext4 的限制(Linux 内核文档)
块大小块组最大文件最大文件系统(32 位)最大文件系统(64 位)
1 KiB8 MiB4 TiB4 TiB16 ZiB
2 KiB32 MiB8 TiB8 TiB32 ZiB
4 KiB(常见)128 MiB16 TiB16 TiB64 ZiB
64 KiB32 GiB256 TiB256 TiB1 YiB

64 位的数字是格式能够寻址的范围;受区段格式和工具的限制,实际文件系统最大约为 1 EiB。更常遇到的限制是:

  • 文件或文件夹名称:255 字节。每个字符需要多个字节的文字能容纳的字符更少。
  • 一个文件的硬链接:65,000 个,因此一个文件夹最多有 64,998 个子文件夹。
  • 时间戳:纳秒精度,256 字节索引节点可用到 2446 年 5 月;128 字节索引节点在 2038 年 1 月到期。
  • 索引节点:格式化时确定,每个文件或文件夹一个,最多约 40 亿个。

检查和修复 ext4 磁盘

ext 文件系统的检查和修复由 Linux 上 e2fsprogs 中的 e2fsck 负责。它必须在未挂载的磁盘上运行;在已挂载的文件系统上运行可能会损坏它。

sudo dumpe2fs -h /dev/sdX1      # 超级块:功能、状态、上次检查
sudo e2fsck -fn /dev/sdX1        # 只读完整检查:只报告,不做任何修改
sudo e2fsck -f /dev/sdX1         # 带修复的完整检查:每项修复都会询问
sudo tune2fs -l /dev/sdX1        # 同样的超级块概要
sudo mkfs.ext4 -L DATA /dev/sdX1 # 新建 ext4 文件系统(会清除该分区)

把 /dev/sdX1 换成对应的分区,lsblk 可以列出它们。非正常关机后通常什么都不用做:下次挂载时日志会被重放。需要完整检查的情况是:Linux 在超级块中记录了错误、校验和不匹配,或者磁盘所在的设备反复死机。

ext4 与其他文件系统

各文件系统的主场,以及无需额外软件能否读取
文件系统防崩溃机制主场macOSWindows
ext4日志Linux、Android否否
Btrfs写时复制,数据也有校验和Linux(Fedora 默认)否否
XFS日志Linux 服务器否否
APFS写时复制Mac、iPhone是否
NTFS日志Windows只读是
exFAT无U 盘、SD 卡、相机是是

对于不装任何软件就要在 Linux、Mac 和 Windows 之间来回使用的磁盘,共同的选择是 exFAT。代价是失去 Linux 权限、所有者、符号链接,以及写入中途拔线时的保护。ext4 保留了这一切,但在 Mac 和 Windows 上需要额外软件。

在 Mac 或 Windows 上读取 ext4

macOS 无法读取任何 ext 文件系统。连接 Linux 磁盘后,macOS 会提示无法读取该磁盘,并提供初始化、忽略和推出。初始化会清除磁盘,请选择忽略或推出。

从 macOS 15.4 起,Apple 的 FSKit 可以让文件系统在内核之外作为普通的应用扩展运行,这也是 Apple 自己较新的文件系统所采用的方式,无需内核扩展,也无需降低安全设置。其他途径包括内核扩展、FUSE 之类的用户空间层,或者接管磁盘的 Linux 虚拟机。

在 Windows 11 上,WSL 2 可以挂载 Linux 磁盘:在管理员终端中运行 wsl --mount \\.\PHYSICALDRIVE2 --partition 1 --type ext4,文件就会出现在文件资源管理器的 \\wsl$\ 下以及发行版的 /mnt/wsl 中。这只适用于直接连接到电脑的磁盘,不适用于 U 盘或 SD 读卡器,这类设备需要先通过 USB/IP 交给 WSL。

Extent 中 FSKit 文件系统的工作方式:扩展只告诉 macOS 文件位于磁盘何处,文件数据直接在磁盘与 macOS 之间传输。

Extent 是我们为 macOS 27 打造的 ext2、ext3 和 ext4 FSKit 文件系统。Linux 磁盘会像其他磁盘一样出现在访达中。读取免费;写入 ext4 与 Linux 一样经过磁盘的日志;没有关机就从 Pi 上拔下的存储卡,它会在内存中重放日志后读取。

常见问题

ext4 比 ext3 好吗?

对新磁盘来说是的:它用区段而不是块映射记录文件,支持最大 16 TiB 的文件和大得多的文件系统,纳秒级时间戳可用到 2038 年以后,用校验和保护元数据,并以更长、更少碎片的范围分配空间。Linux 反正也是用 ext4 驱动读取 ext3 磁盘。

Mac 能读取 ext4 吗?

默认不能:macOS 无法读取任何 ext 文件系统,还会建议初始化,也就是清除 Linux 磁盘。你需要一个文件系统扩展。在 macOS 27 上,Extent 通过 Apple 的 FSKit 把 ext2、ext3 和 ext4 挂载到访达中。

Windows 能读取 ext4 吗?

单靠文件资源管理器不能。在 Windows 11 上,WSL 2 可以用 wsl --mount 挂载直接连接的 Linux 磁盘,然后在文件资源管理器的 \\wsl$\ 下打开其中的文件。U 盘和 SD 读卡器需要先通过 USB/IP 交给 WSL。

U 盘用 ext4 还是 exFAT?

如果它必须在任何电脑上无需额外软件就能使用,选 exFAT。如果主要和 Linux 或 Raspberry Pi 一起用,或者你在意权限、符号链接和日志,选 ext4;日志能在写入中途拔下 U 盘时保持文件系统一致。

不推出就拔下 ext4 磁盘会怎样?

日志会保持文件系统一致。已提交的变更会在下次挂载时重放,正在进行的变更则会丢失。在此之前,超级块会标记需要恢复。

怎么知道我的 ext4 磁盘用了哪些功能?

在 Linux 上运行 sudo dumpe2fs -h /dev/sdX1 或 sudo tune2fs -l /dev/sdX1,查看“Filesystem features”一行。在 Mac 上,Extent 会在磁盘详情中显示主要功能(日志、区段、64 位、校验和)。

能把 ext3 转换为 ext4 吗?

可以,用 tune2fs 加一次 e2fsck 检查就地转换,无需重新格式化。磁盘上已有的文件保留块映射,只有之后写入的文件才使用区段。请先备份。

ext4 上最大的文件是多少?

常见的 4 KiB 块时为 16 TiB,64 KiB 块时最多 256 TiB。启用 64bit 功能时,最大的文件系统约为 1 EiB。

在 Mac 上读取 Linux 磁盘,也能写入。

Extent 在 macOS 27 上把 ext2、ext3 和 ext4 挂载到访达中。读取免费,写入 ext4 只需一次性购买。

来源

本页的事实依据以下文档(英文)核实。