心宇

FDF24DCED8C6738F8313A6D3B073C3F4

首页 管理

Linux 文件系统原理与常见文件系统对比

一、什么是文件系统?

计算机中的磁盘本质上只提供:

Block(块)级别的数据存储能力。

例如一块 SSD:

Block 0
Block 1
Block 2
Block 3
...
Block N

磁盘本身并不知道:

什么是文件
什么是目录
什么是文件名
什么是权限
什么是 /etc/passwd
什么是 /home/user

这些概念主要由:

File System(文件系统)

组织和管理。

因此可以简单理解:

文件系统是一套规定“数据如何在存储设备上组织、命名、定位、读取、修改和管理”的数据结构与规则。


二、文件系统解决什么问题?

假设磁盘有:

1 TB

如果没有文件系统,操作系统面对的基本只是:

Block 0
Block 1
Block 2
...

现在创建:

/home/user/test.txt

文件系统必须解决:

test.txt 在哪里?

它属于哪个目录?

它多大?

属于哪个 UID?

属于哪个 GID?

权限是什么?

什么时候创建?

什么时候修改?

数据存在哪些 Block?

哪些 Block 已使用?

哪些 Block 还是空闲的?

如果突然断电怎么办?

因此文件系统至少要管理两大类东西:

Metadata
+
File Data

即:

元数据
+
真正的数据

三、Metadata 是什么?

Metadata:

元数据

可以理解为:

描述数据的数据。

例如文件:

hello.txt

真正内容可能是:

Hello Linux

这是:

File Data

而:

文件大小
UID
GID
权限
时间戳
数据块位置
文件类型
扩展属性

属于:

Metadata

所以:

File
├── Metadata
└── Data

四、Linux 文件系统的整体结构

Linux 中应用程序不会直接操作 ext4、XFS、Btrfs 的磁盘结构。

中间存在一个非常重要的抽象层:

VFS

即:

Virtual File System

可以理解:

Application
    │
    │ open/read/write
    ▼
System Call
    │
    ▼
VFS
    │
    ├── ext4
    ├── XFS
    ├── Btrfs
    ├── tmpfs
    ├── NFS
    └── ...
         │
         ▼
Block Layer
         │
         ▼
Device Driver
         │
         ▼
SSD / HDD / NVMe

因此应用程序调用:

open()
read()
write()
close()

时,不需要知道底层到底是:

ext4
XFS
Btrfs
NFS
tmpfs

VFS 为它们提供统一接口。


五、VFS 的核心对象

理解 Linux 文件系统,建议掌握几个非常重要的概念:

Superblock

Inode

Dentry

File

可以建立:

File System
    │
    ├── Superblock
    │
    ├── Inode
    │
    ├── Dentry
    │
    └── File

六、Superblock

Superblock:

超级块

描述整个文件系统的总体信息。

例如:

文件系统类型
Block Size
文件系统大小
状态
挂载信息
特性标志
文件系统 UUID
内部管理结构位置

可以理解:

Superblock
=
整个文件系统的“总说明书”

例如:

ext4 filesystem

Superblock
├── Block Size = 4096
├── UUID = ...
├── Feature Flags
├── Block Count
└── ...

七、Inode

Inode:

Index Node

是 Unix/Linux 文件系统中非常核心的概念。

一个 inode 描述一个文件对象的主要元数据。

例如:

inode
├── File Type
├── Permission
├── UID
├── GID
├── Size
├── Timestamp
├── Link Count
├── Extended Attributes
└── Data Location Information

但有一个特别重要的知识:

传统 Unix/Linux inode 本身通常不保存普通文件名。

文件名主要存在于:

Directory Entry

中。


八、文件名与 inode

例如:

/home/user/hello.txt

目录中可以概念化保存:

hello.txt
    ↓
inode 12345

然后:

inode 12345
    ↓
Metadata
    ↓
Data Blocks / Extents

所以:

File Name
   ↓
Directory Entry
   ↓
Inode
   ↓
Data

这是理解 Linux 文件系统非常重要的一条链。


九、Dentry

Dentry:

Directory Entry

VFS 中的 dentry 用于表示:

目录项 / 路径组件与文件对象之间的关系

例如路径:

/home/user/test.txt

可以拆成:

/
↓
home
↓
user
↓
test.txt

Linux 在解析路径时,需要逐级查找这些路径组件。

因此:

Path
 ↓
Dentry
 ↓
Inode

Linux 还会维护:

Dentry Cache

提高路径查找效率。


十、目录本质是什么?

初学者经常认为:

目录就是“装文件的盒子”。

从 Unix 文件系统角度,更准确地说:

目录本身也是一种特殊文件。

它保存目录项,用于建立:

File Name
    ↓
Inode

之间的映射关系。

例如:

Directory /home/user

.
..
hello.txt → inode 100
test.c    → inode 101
a.out     → inode 102

十一、Linux 中“文件”是一个非常广泛的概念

Unix 有一个著名设计思想:

Everything is a file.

虽然不能机械地把所有内核对象都理解成普通磁盘文件,但 Linux 确实通过文件描述符统一操作很多对象。

例如:

Regular File
Directory
Device
Pipe
Socket
Terminal
procfs object
sysfs object

很多都可以通过:

FD

进行访问。

这就和前面的“进程”章节连接起来了:

Process
   ↓
FD Table
   ↓
struct file
   ↓
VFS
   ↓
Filesystem / Kernel Object

十二、从 open() 到文件系统发生了什么?

例如:

int fd = open("/home/user/test.txt", O_RDONLY);

可以概念化理解:

Application
    ↓
open()
    ↓
System Call
    ↓
VFS
    ↓
解析路径 /
    ↓
home
    ↓
user
    ↓
test.txt
    ↓
找到 Dentry
    ↓
找到 Inode
    ↓
检查权限
    ↓
建立 Open File State
    ↓
分配 File Descriptor
    ↓
返回 fd

例如:

fd = 3

于是:

Process

FD Table
├── 0 → stdin
├── 1 → stdout
├── 2 → stderr
└── 3 → test.txt

十三、read() 的工作过程

执行:

read(fd, buf, 4096);

可以简化:

Process
   ↓
FD
   ↓
Open File
   ↓
VFS
   ↓
Filesystem
   ↓
Page Cache
   ↓
数据存在?
 ┌────┴────┐
 YES       NO
 │          │
 │          ▼
 │      Block I/O
 │          ↓
 │       SSD/HDD
 │          ↓
 │      Page Cache
 │          │
 └──────────┘
       ↓
复制给用户空间
       ↓
Application Buffer

因此:

read() 并不意味着每次都真正访问物理磁盘。

如果数据已经存在:

Page Cache

中,就可以直接从内存获得。


十四、write() 的工作过程

例如:

write(fd, buf, 4096);

很多情况下不是:

Application
↓
立刻写 SSD

而更接近:

Application
    ↓
write()
    ↓
Kernel
    ↓
Page Cache
    ↓
Dirty Page
    ↓
稍后 Writeback
    ↓
Filesystem
    ↓
Block Layer
    ↓
SSD / HDD

因此:

write() 返回成功

并不在所有情况下都等价于:

数据已经永久落盘。


十五、fsync()

如果应用程序需要要求内核将相关修改同步到持久存储,需要考虑:

fsync(fd);

例如数据库:

Transaction
    ↓
write()
    ↓
fsync()
    ↓
确认关键数据持久化

当然实际持久性还会受到:

文件系统
设备写缓存
SSD Firmware
硬件
挂载参数

等因素影响。


十六、Mount:挂载

Linux 没有:

C:
D:
E:

这样的盘符模型。

Linux 使用:

单一目录树。

例如:

/
├── boot
├── etc
├── home
├── usr
├── var
└── mnt

不同文件系统通过:

mount

加入这棵目录树。

例如:

mount /dev/sdb1 /data

表示:

/dev/sdb1
中的文件系统
       ↓
挂载到
       ↓
/data

于是:

/data/file.txt

实际数据可能位于:

/dev/sdb1

十七、磁盘、分区和文件系统不是同一个概念

例如:

NVMe SSD
/dev/nvme0n1

这是:

Block Device

可以建立:

GPT Partition Table

然后:

/dev/nvme0n1p1
/dev/nvme0n1p2
/dev/nvme0n1p3

再格式化:

p1 → FAT32 / ESP
p2 → ext4
p3 → XFS

所以:

Disk
 ↓
Partition Table
 ↓
Partition
 ↓
Filesystem
 ↓
Mount Point
 ↓
Directory Tree

这些概念一定要分开。


十八、Block 与 Extent

传统文件系统可以把文件的数据位置理解成:

Block

例如一个文件:

File A

占用:

Block 100
Block 101
Block 102
Block 103

如果每个 Block 都单独记录,管理大型文件会很麻烦。

现代文件系统经常大量使用:

Extent

即:

一段连续的数据块范围。

例如:

Start Block = 100
Length = 1000 Blocks

就可以描述:

Block 100
~
Block 1099

这比记录 1000 个独立 Block 更高效。

ext4、XFS 等都大量使用 Extent。


十九、什么是碎片?

如果文件数据原本:

100 101 102 103 104

连续存储,顺序读取非常方便。

但随着不断:

Create
Delete
Extend
Rewrite

可能变成:

100
 ↓
500
 ↓
901
 ↓
1300

这叫:

Fragmentation(碎片化)

现代文件系统会通过:

Extent
Delayed Allocation
Allocation Groups
Copy-on-Write 策略
Defragmentation

等机制控制或处理碎片。


二十、Crash Consistency:突然断电怎么办?

假设创建:

hello.txt

可能需要修改:

Directory Entry
Inode
Free Space Metadata
Data Block

如果:

修改到一半
↓
突然断电

可能导致文件系统元数据不一致。

因此现代文件系统必须考虑:

Crash Consistency


二十一、Journaling:日志文件系统

ext3、ext4、XFS 都是典型的:

Journaling File System

基本思想:

准备修改文件系统
       ↓
先记录 Journal / Transaction
       ↓
执行实际修改
       ↓
Commit

发生断电:

Reboot
  ↓
读取 Journal
  ↓
恢复到一致状态

因此 Journal 的主要目的不是:

“备份用户文件。”

而是:

提高文件系统在崩溃后的元数据/事务一致性恢复能力。


二十二、Journaling 与 Copy-on-Write

现代文件系统大致存在两种很重要的设计思路:

Journaling

和:

Copy-on-Write

传统 Journaling 思路:

记录即将发生的修改
        ↓
Journal
        ↓
更新原来的文件系统位置

Copy-on-Write:

不直接覆盖旧数据
       ↓
写到新的位置
       ↓
更新引用
       ↓
旧版本暂时仍然存在

例如:

Old Block
   │
   │ 修改
   ▼
New Block
   ↓
更新 Metadata Pointer

ZFS、Btrfs、APFS 都大量采用:

Copy-on-Write(CoW)

设计。


二十三、为什么 CoW 很适合 Snapshot?

假设原始文件:

A → Block 100
B → Block 200
C → Block 300

创建 Snapshot:

Snapshot

不需要立刻复制全部数据。

可以:

Live FS        Snapshot

A ─────────┐
           ├→ Block 100

B ─────────┼→ Block 200

C ─────────┘→ Block 300

修改 A 时:

Live A
 ↓
New Block 500

Snapshot 继续引用:

Old Block 100

所以:

Snapshot

可以非常快速。


二十四、文件系统完整工作过程

把前面知识串起来:

Application
    ↓
open("/data/test")
    ↓
System Call
    ↓
VFS
    ↓
Path Lookup
    ↓
Dentry
    ↓
Inode
    ↓
Filesystem
    ↓
ext4 / XFS / Btrfs / ...
    ↓
Page Cache
    ↓
Block Layer
    ↓
Device Driver
    ↓
NVMe / SSD / HDD

读取:

read()
 ↓
FD
 ↓
VFS
 ↓
Page Cache
 ↓
Filesystem
 ↓
Storage

写入:

write()
 ↓
Page Cache
 ↓
Dirty Pages
 ↓
Filesystem
 ↓
Journal / CoW Transaction
 ↓
Block Layer
 ↓
Storage

二十五、ext2 → ext3 → ext4

Linux 中非常经典的一条发展路线:

ext2
 ↓
ext3
 ↓
ext4

其中:

ext2
→ 没有 Journaling

ext3
→ 在 ext2 基础上引入 Journaling

ext4
→ 大幅改进扩展性、性能和数据结构

二十六、ext3

ext3:

Third Extended Filesystem

是 Linux 历史上非常重要的 Journaling 文件系统。

核心特点:

ext2 架构基础
+
Journal

可以概念化:

ext3
│
├── Superblock
├── Block Groups
│
├── Inode Bitmap
├── Block Bitmap
├── Inode Table
├── Data Blocks
│
└── Journal

二十七、ext3 的 Block Group

ext 系列并不是把整个磁盘所有 metadata 全部堆在一起。

而是划分:

Block Group 0
Block Group 1
Block Group 2
...

一个 Block Group 可以概念化:

Block Group
│
├── Superblock Backup / Metadata
├── Block Bitmap
├── Inode Bitmap
├── Inode Table
└── Data Blocks

这样可以:

提高局部性
降低管理巨大磁盘的复杂度
提供一定冗余

二十八、ext3 工作原理

例如修改文件:

test.txt

ext3 会根据 journaling 模式处理相关事务。

基本思想:

Application
   ↓
write()
   ↓
Page Cache
   ↓
ext3
   ↓
Journal Transaction
   ↓
更新 Filesystem
   ↓
Commit

发生崩溃:

Boot
 ↓
检查 Journal
 ↓
Replay
 ↓
恢复文件系统一致性

二十九、ext3 的优缺点

优点:

成熟
稳定
历史兼容性好
结构简单
比 ext2 有更好的崩溃恢复能力

缺点:

设计年代较早
扩展能力有限
大文件/大文件系统能力落后于现代文件系统
传统 block mapping 效率有限
性能和并发扩展性不如 ext4/XFS
缺少现代 CoW/Snapshot/Checksum 等高级能力

因此今天新部署 Linux 系统通常不会优先选择 ext3。


三十、ext4

ext4:

Fourth Extended Filesystem

可以理解成:

ext 系列传统设计的现代化版本。

它仍然属于:

Journaling Filesystem

但相比 ext3 有大量改进。


三十一、ext4 的核心结构

概念上:

ext4
│
├── Superblock
│
├── Block Groups
│   ├── Block Bitmap
│   ├── Inode Bitmap
│   ├── Inode Table
│   └── Data Blocks
│
├── Extents
│
├── Directory Index
│
└── Journal

ext4 仍然保留:

inode
block group
journal

等 ext 家族核心思想。


三十二、ext4 的 Extent

ext4 相比传统 ext3 一个非常重要的变化是:

Extent

例如一个 400 MiB 文件的数据连续存在:

Block 10000
~
Block 112399

不需要记录:

10000
10001
10002
10003
...

而可以记录类似:

Start = 10000
Length = N

大幅降低大型文件的映射开销。


三十三、ext4 Delayed Allocation

ext4 还大量使用:

Delayed Allocation

即:

Application write()
       ↓
Page Cache
       ↓
暂时不立即决定最终磁盘 Block
       ↓
等待更多数据
       ↓
一次性选择更连续的空间

好处:

减少碎片
提高顺序写性能
更合理地分配 Extent

三十四、ext4 Journal

ext4 默认仍使用 Journal 保证重要文件系统状态的一致性。

可以概念化:

Transaction
   ↓
Journal
   ↓
Commit
   ↓
Filesystem Metadata

ext4 支持不同的数据日志策略。

常见默认模式:

data=ordered

主要目标是在性能和一致性之间取得平衡。


三十五、ext4 的特点

ext4 的优势:

成熟
稳定
兼容性广
维护工具成熟
性能均衡
恢复工具成熟
Linux 支持非常普遍

所以:

ext4 是通用 Linux 系统非常常见的默认选择之一。

它并不追求所有高级功能,而强调:

稳定
简单
成熟
通用

三十六、XFS

XFS 最早由:

Silicon Graphics(SGI)

开发,后来成为 Linux 中非常重要的高性能文件系统。

XFS 的设计目标非常强调:

大文件
大文件系统
高吞吐
并行 I/O
可扩展性

它同样属于:

Journaling Filesystem


三十七、XFS 的核心思想:Allocation Group

XFS 会把文件系统划分成多个:

Allocation Group(AG)

概念上:

XFS
│
├── AG 0
│
├── AG 1
│
├── AG 2
│
├── AG 3
│
└── ...

每个 AG 可以相对独立地管理:

Free Space
Inode
Allocation Metadata

这样多个 CPU/线程同时操作文件系统时:

CPU 0 → AG 0
CPU 1 → AG 1
CPU 2 → AG 2
CPU 3 → AG 3

可以降低全局锁竞争。

这也是 XFS:

高并发扩展性

的重要来源之一。


三十八、XFS 使用 B+Tree

XFS 大量使用:

B+Tree

管理:

Free Space
Extents
Inodes
Directories
Reverse Mapping
...

原因是 B+Tree 很适合:

大量数据
有序查找
范围查询
动态插入删除
磁盘结构管理

因此 XFS 从设计上非常强调:

Scalability


三十九、XFS 的 Extent

XFS 同样大量使用:

Extent

管理文件数据。

例如:

File
 ↓
Extent Tree
 ↓
Extent 1
Extent 2
Extent 3

因此非常适合:

大型文件
视频
数据库文件
日志
大型服务器工作负载

四十、XFS Journal

XFS 使用 Journal 主要保护:

Metadata

可以概念化:

Metadata Change
      ↓
Log / Journal
      ↓
Commit
      ↓
更新主文件系统结构

系统崩溃:

Mount
 ↓
Replay Log
 ↓
恢复一致状态

四十一、XFS 的特点

优势:

大型文件性能优秀
大型文件系统扩展性强
高并发
成熟
在线扩容能力成熟
企业 Linux 使用广泛

需要注意:

XFS 擅长 grow

但传统管理方式中:

不能像某些文件系统那样简单在线 shrink

因此容量规划时需要注意。


四十二、ext4 与 XFS 的核心区别

可以简单理解:

ext4
→ 通用、成熟、简单、均衡

XFS
→ 大规模、高吞吐、高并发

但这不是说:

小文件只能 ext4
大文件只能 XFS

实际性能高度依赖:

Kernel Version
Storage Device
Mount Options
Workload
File Size
Concurrency
Database/Application

四十三、从传统文件系统进入 CoW 文件系统

ext4/XFS 主要属于:

Journaling Filesystem

而接下来:

ZFS
Btrfs
APFS

具有非常重要的共同设计思想:

Copy-on-Write

即:

旧数据
 ↓
不直接覆盖

修改
 ↓
写新位置
 ↓
更新 Metadata

这会带来:

Snapshot
Clone
Checksum
Atomic Update

等现代能力。


四十四、ZFS

ZFS 最初由 Sun Microsystems 为 Solaris 开发。

ZFS 的设计非常特殊:

它不仅仅想做传统意义上的文件系统,还把存储池管理和文件系统深度结合。

传统 Linux 存储栈经常是:

Disk
 ↓
Partition
 ↓
RAID
 ↓
LVM
 ↓
Filesystem

而 ZFS 的思路更接近:

Physical Disks
      ↓
VDEV
      ↓
ZFS Storage Pool
      ↓
Dataset / Zvol

四十五、ZFS Storage Pool

ZFS 使用:

zpool

管理存储池。

例如:

Disk 1 ─┐
Disk 2 ─┼→ VDEV → ZPOOL
Disk 3 ─┘

然后在池中建立:

Dataset

例如:

tank
├── home
├── database
├── backup
└── vm

每个 Dataset 可以拥有自己的:

Compression
Quota
Snapshot
Record Size
Mount Point

等属性。


四十六、ZFS 的 CoW

假设:

Block A

需要修改。

ZFS 不直接:

Overwrite Block A

而是:

Block A
  ↓
保留

修改后的数据
  ↓
Block B
  ↓
更新上层 Metadata

这种机制不断向上更新,最终形成新的完整一致状态。


四十七、ZFS 的 Merkle Tree 思想

ZFS 数据结构中一个极其重要的特点是:

数据和元数据校验。

可以概念化:

Root
│ checksum
▼
Metadata Block
│ checksum
▼
Data Block

上层结构保存下层块的:

Checksum

所以读取:

Data
 ↓
Calculate Checksum
 ↓
Compare

如果不一致:

Data Corruption

就可以发现。


四十八、ZFS Self-Healing

如果 ZFS 底层拥有冗余:

Mirror
RAID-Z

发现:

Block A
Checksum Error

就可能:

读取另一个正确副本
       ↓
验证 Checksum
       ↓
获得正确数据
       ↓
修复损坏副本

这就是:

Self-Healing

的重要思想。

注意:

Checksum 能发现错误,但要自动修复通常还需要可用的冗余副本。


四十九、ZFS RAID-Z

ZFS 自己提供类似 RAID 的能力:

Mirror

RAID-Z1

RAID-Z2

RAID-Z3

大致可以理解:

RAID-Z1
→ 可容忍一个相应设备故障

RAID-Z2
→ 可容忍两个

RAID-Z3
→ 可容忍三个

因此 ZFS 不只是:

Filesystem

而更像:

Filesystem
+
Volume / Pool Management
+
RAID
+
Checksum
+
Snapshot
+
Compression

的一整套存储系统。


五十、ZFS ARC

ZFS 有自己的重要缓存体系:

ARC

即:

Adaptive Replacement Cache

主要使用 RAM 缓存文件系统数据。

还可以使用:

L2ARC

作为二级读取缓存。

此外还有与同步写相关的:

ZIL
SLOG

等概念。

因此 ZFS 的性能调优体系比 ext4 更复杂。


五十一、ZFS Snapshot

因为 CoW:

Snapshot

创建速度通常很快。

例如:

Current Dataset
      │
      ├── Snapshot 1
      │
      ├── Snapshot 2
      │
      └── Snapshot 3

Snapshot 最初不需要复制所有数据。

只有后续修改发生后,新旧版本逐渐引用不同 Block。


五十二、ZFS 的特点

优势:

端到端数据完整性设计
Checksum
Snapshot
Clone
Compression
Storage Pool
RAID-Z
Scrub
Self-Healing(有冗余时)
强大的存储管理能力

代价:

体系复杂
管理理念不同于传统 ext4
内存使用策略更积极
部署和调优需要更多知识

五十三、Btrfs

Btrfs:

B-tree File System

是 Linux 原生的现代 CoW 文件系统之一。

设计目标包括:

Copy-on-Write
Snapshot
Checksum
Subvolume
Compression
Multi-device
RAID
Online Management

可以把它理解为:

Linux 世界中试图将现代文件系统和卷管理功能结合起来的一套设计。


五十四、Btrfs 为什么叫 B-tree?

因为 Btrfs 大量使用:

B-tree

组织内部 metadata。

例如:

Btrfs
│
├── Root Tree
├── Extent Tree
├── Chunk Tree
├── Device Tree
├── Checksum Tree
└── File System Tree

这些树共同描述:

文件
目录
Extent
设备
Checksum
空间分配

等信息。


五十五、Btrfs 的 CoW

修改:

Old Extent

时:

Old Extent
   ↓
保持不变

New Data
   ↓
New Extent
   ↓
更新 B-tree

因此天然适合:

Snapshot
Clone
Reflink

五十六、Btrfs Subvolume

Btrfs 一个非常重要的概念:

Subvolume

它看起来类似目录,但不是普通目录。

例如:

Btrfs Filesystem
│
├── @
├── @home
├── @snapshots
└── @var

不同 Subvolume 可以独立:

Snapshot
Mount
管理

这也是很多 Linux 发行版使用 Btrfs 时的重要设计。


五十七、Btrfs Snapshot

例如:

@root

创建:

@snapshot1

由于 CoW:

Root
    ├── Current
    └── Snapshot
          │
          └── 初始共享大量 Extents

修改 Current 后:

Current
→ New Extent

Snapshot
→ Old Extent

所以 Snapshot 可以非常高效。


五十八、Btrfs Checksum

Btrfs 可以为:

Data
Metadata

维护 checksum。

读取时:

Read Block
   ↓
Calculate Checksum
   ↓
Compare
   ↓
Correct?

如果底层具有可用冗余副本,还可以在一定条件下:

读取正确副本
↓
修复错误数据

五十九、Btrfs Compression

Btrfs 原生支持透明压缩,例如常见:

zstd

概念:

Application
    ↓
Write Data
    ↓
Btrfs Compression
    ↓
Compressed Extent
    ↓
SSD

读取:

SSD
 ↓
Compressed Data
 ↓
Decompress
 ↓
Application

对于:

源码
文本
日志
虚拟机之外的一些普通数据

可能节省空间,并在某些场景降低实际 I/O。


六十、Btrfs 的特点

优势:

Linux Kernel 原生支持
CoW
Snapshot
Subvolume
Checksum
Compression
Reflink
多设备管理
在线管理能力丰富

需要注意:

功能复杂
CoW 对某些随机写工作负载需要调优
数据库/VM 镜像等场景需要理解 CoW 行为
不同 RAID Profile 的成熟度和限制需要具体确认

所以不能简单说:

“Btrfs 一定比 ext4 快。”

它的主要价值更多来自:

现代存储管理能力。


六十一、APFS

APFS:

Apple File System

是 Apple 为其生态设计的现代文件系统。

主要用于:

macOS
iOS
iPadOS
watchOS
tvOS

APFS 针对:

SSD / Flash Storage
Encryption
Snapshot
Clone
Space Sharing

等现代需求设计。


六十二、APFS Container

APFS 的重要概念之一:

Container

一个 APFS Container 中可以包含多个:

Volume

例如:

Physical Storage
       ↓
APFS Container
       │
       ├── Volume A
       ├── Volume B
       ├── Volume C
       └── Volume D

这些 Volume 可以:

Space Sharing

即共享 Container 的可用空间。


六十三、APFS Space Sharing

传统固定分区:

Partition A = 100 GB
Partition B = 100 GB

A 用不完:

50 GB

B 也不能随意使用。

APFS Container 中:

Container = 200 GB

Volume A
Volume B

两个 Volume 可以根据实际使用情况动态共享 Container 空间。

因此:

APFS Container
    ↓
Shared Free Space
    ↓
Multiple Volumes

六十四、APFS Copy-on-Write

APFS 同样大量使用:

Copy-on-Write

特别是 Metadata 更新。

修改时:

Old Metadata
      ↓
保留

New Metadata
      ↓
写入新位置
      ↓
切换引用

从而提高:

Crash Consistency
Snapshot
Clone

等能力。


六十五、APFS Clone

例如:

File A

复制成:

File B

APFS 可以使用:

Clone

初始:

File A ───┐
          ├→ Shared Blocks
File B ───┘

不需要马上复制全部数据。

如果 B 修改:

File B
 ↓
New Blocks

而 A:

File A
 ↓
Old Blocks

这和 CoW 思想紧密相关。


六十六、APFS Snapshot

APFS 同样支持:

Snapshot

例如 macOS 系统更新、备份和恢复机制可以利用文件系统快照能力。

其基本思想仍然是:

Snapshot
 ↓
引用某一时刻的文件系统状态
 ↓
后续修改使用 CoW

六十七、APFS Encryption

APFS 从设计上非常重视:

Encryption

尤其与 Apple 的:

Secure Enclave
FileVault
设备安全体系

结合。

因此 APFS 很明显是一套:

针对 Apple 硬件、Flash 存储和 Apple OS 生态深度优化的现代文件系统。


六十八、六种文件系统的架构分类

首先不要急着比较谁“最好”。

应该先按照设计哲学分类:

传统 Journaling Filesystem

ext3
ext4
XFS


Modern Copy-on-Write Filesystem

ZFS
Btrfs
APFS

进一步:

ext3
→ 经典 Linux Journaling

ext4
→ 通用 Linux Journaling

XFS
→ 高扩展性 Journaling

ZFS
→ CoW + Storage Pool + Data Integrity

Btrfs
→ Linux Native CoW + Subvolume

APFS
→ Apple Native CoW + Flash/Encryption

六十九、ext3 vs ext4 vs XFS vs ZFS vs Btrfs vs APFS

特性 ext3 ext4 XFS ZFS Btrfs APFS
核心年代 较老 成熟现代 成熟现代 现代存储体系 现代 Linux 现代 Apple
Linux 原生常用 是 是 是 生态方式不同 是 否
Journaling 是 是 是 非传统核心模式 非传统核心模式 CoW 事务设计
Copy-on-Write 否 否 非核心设计 是 是 是
Extent 能力较传统 是 是 自有块结构 Extent 自有结构
Snapshot 原生无 原生无 原生无通用快照体系 是 是 是
Checksum 能力有限 主要不是端到端数据校验体系 主要不是 ZFS 式数据校验体系 数据+元数据 数据+元数据 内部完整性机制
Compression 原生无透明通用压缩 原生无 原生无通用透明压缩 是 是 系统层有相关能力
Subvolume/Dataset 否 否 否 Dataset Subvolume Volume
多设备管理 依赖 RAID/LVM 依赖 RAID/LVM 依赖 RAID/LVM 原生 Pool/VDEV 原生支持 Apple Container
RAID 外部 外部 外部 Mirror/RAID-Z 多种 Profile 不是其主要定位
在线扩容 有限制 是 强 Pool 模型 是 Container 管理
在线缩容 有限/离线工具 可离线缩容 通常不支持缩小 取决于池设计 支持相关 resize Apple 自动管理
Clone/Reflink 否 非核心 支持 Reflink Clone Reflink Clone
典型定位 老 Linux 通用 Linux 企业/大规模 Linux NAS/存储服务器 Linux 桌面/服务器 Apple 设备

注意:

这张表用于理解“设计方向”,不能简单转换成性能排行榜。


七十、数据更新方式对比

ext3 / ext4 / XFS

核心思想更接近:

Old Metadata / Data
       ↓
Journal Transaction
       ↓
更新原位置
       ↓
Commit

主要依靠:

Journaling

保证 Crash Consistency。


ZFS / Btrfs / APFS

核心思想更接近:

Old Block
   ↓
保留

New Data
   ↓
New Block
   ↓
New Metadata
   ↓
Atomic Pointer / Root Update

主要大量利用:

Copy-on-Write

因此天然更容易实现:

Snapshot
Clone
Checksum Tree
Versioned State

七十一、ext4 工作过程

例如:

write("hello")

概念上:

Application
   ↓
write()
   ↓
Page Cache
   ↓
Dirty Page
   ↓
ext4
   ↓
Delayed Allocation
   ↓
Extent Allocation
   ↓
Journal Metadata Transaction
   ↓
Writeback
   ↓
Block Layer
   ↓
SSD

因此 ext4 的核心关键词:

Block Group
Inode
Extent
Delayed Allocation
Journal

七十二、XFS 工作过程

概念上:

Application
   ↓
write()
   ↓
Page Cache
   ↓
XFS
   ↓
Allocation Group
   ↓
B+Tree / Extent Allocation
   ↓
Metadata Log
   ↓
Writeback
   ↓
Storage

核心关键词:

Allocation Group
B+Tree
Extent
Journal / Log
Parallelism
Scalability

七十三、ZFS 工作过程

概念上:

Application
   ↓
write()
   ↓
ZFS
   ↓
Transaction Group
   ↓
CoW
   ↓
New Data Blocks
   ↓
Checksum
   ↓
New Metadata Blocks
   ↓
Update Tree
   ↓
Storage Pool
   ↓
VDEV
   ↓
Disk

核心关键词:

Storage Pool
VDEV
CoW
Checksum
Transaction Group
ARC
Snapshot
RAID-Z
Self-Healing

七十四、Btrfs 工作过程

概念上:

Application
   ↓
write()
   ↓
Page Cache
   ↓
Btrfs
   ↓
CoW
   ↓
New Extent
   ↓
Checksum
   ↓
Update B-tree
   ↓
Transaction Commit
   ↓
Storage

核心关键词:

B-tree
CoW
Extent
Checksum
Subvolume
Snapshot
Compression
Reflink

七十五、APFS 工作过程

概念上:

Application
   ↓
macOS VFS / Kernel
   ↓
APFS
   ↓
Container / Volume
   ↓
CoW Metadata
   ↓
Block Allocation
   ↓
Snapshot / Clone Structures
   ↓
Encryption Layer
   ↓
Apple Storage

核心关键词:

Container
Volume
Space Sharing
CoW
Snapshot
Clone
Encryption
SSD Optimization

七十六、如何选择文件系统?

不能简单问:

“哪个文件系统最好?”

应该问:

我的工作负载是什么?

需要 Snapshot 吗?

需要 Checksum 吗?

需要 RAID 吗?

是不是 NAS?

是不是数据库?

是不是 Linux RootFS?

是不是 Apple 系统?

文件是大量小文件还是大型文件?

是否需要透明压缩?

是否需要 Reflink?

是否需要在线扩容?

运维人员熟悉哪个文件系统?

七十七、普通 Linux 系统

如果目标只是:

Linux Desktop
普通 Server
Web Server
开发环境
Root Filesystem

通常首先会遇到:

ext4
XFS
Btrfs

三类选择。

其中设计思路分别可以记成:

ext4
→ 传统、成熟、均衡


XFS
→ 高扩展性、高吞吐


Btrfs
→ Snapshot、Compression、CoW、Subvolume

七十八、NAS / 数据存储服务器

如果核心目标变成:

大量磁盘
长期保存数据
数据完整性
Checksum
Snapshot
Compression
RAID
Scrub

那么:

ZFS

会成为非常重要的研究对象。

典型思想:

Disk
 ↓
VDEV
 ↓
Pool
 ↓
Dataset
 ↓
Snapshot / Compression / Checksum

七十九、Apple 系统

macOS/iPhone/iPad 等 Apple 生态:

APFS

是核心文件系统。

它和:

Apple Silicon
SSD
FileVault
Snapshot
System Volume
Container
Volume

等 Apple 系统设计紧密结合。

因此 APFS 不应该简单理解成:

“Apple 版本的 ext4。”

它们的设计时代和设计哲学差异很大。


八十、为什么 ext4 仍然大量存在?

看到 ZFS/Btrfs 拥有:

Snapshot
Checksum
Compression
CoW

以后,很容易产生一个问题:

为什么不全部换成 Btrfs/ZFS?

因为文件系统不是:

功能越多 = 一定越好

复杂功能意味着:

更多代码
更多状态
更多运维知识
不同性能特征
更多调优需求

而 ext4 最大的优势之一恰恰是:

成熟
稳定
简单
广泛
工具完善
行为容易理解

因此:

文件系统设计本质上是在可靠性、功能、性能、复杂度、兼容性之间做取舍。


八十一、为什么 XFS 在服务器中很常见?

XFS 从一开始就非常重视:

Scalability
Parallelism
Large Files
Large Filesystem
High Throughput

通过:

Allocation Groups
B+Trees
Extents
Delayed Allocation

等机制,让它非常适合大型服务器工作负载。

因此在很多企业 Linux 环境中,XFS 是重要选择。


八十二、为什么 CoW 文件系统会产生新的问题?

CoW 很强大:

Snapshot
Clone
Checksum
Crash Consistency

但是也有代价。

例如数据库不断:

随机覆盖
随机覆盖
随机覆盖

传统文件系统可能:

Overwrite

而 CoW:

Write New Block
 ↓
Update Metadata
 ↓
产生新的 Extent

长期下来可能出现:

Fragmentation
Write Amplification
Metadata Overhead

因此:

CoW 不是“无成本的高级功能”。

针对:

Database
VM Image
High Random Write

等工作负载,需要理解具体文件系统的优化方法。


八十三、Journal 与 Snapshot 不是一回事

这是非常容易混淆的地方。

Journal:

目的:
Crash Recovery
Filesystem Consistency

Snapshot:

目的:
保存某个时间点的文件系统状态

所以:

Journal
≠
Snapshot
≠
Backup

进一步:

Snapshot

通常也不能替代:

Backup

因为如果:

整块磁盘损坏

而 Snapshot 也在同一块磁盘上:

Snapshot 也可能一起消失

八十四、Checksum 与 RAID 也不是 Backup

同样:

Checksum
→ 检测数据损坏

RAID
→ 提高设备故障容忍能力

Snapshot
→ 保存历史状态

Backup
→ 独立的数据副本

四者解决的是不同问题。

可以记:

Checksum
解决:
“数据有没有悄悄损坏?”


RAID
解决:
“某块磁盘坏了怎么办?”


Snapshot
解决:
“我想回到之前状态怎么办?”


Backup
解决:
“整个存储系统没了怎么办?”

八十五、文件系统知识最终总图

整个 Linux 文件系统可以整理成:

Application
│
├── open()
├── read()
├── write()
├── mmap()
├── fsync()
└── close()
       │
       ▼
System Call
       │
       ▼
VFS
│
├── Superblock
├── Inode
├── Dentry
└── File
       │
       ▼
Concrete Filesystem
│
├── ext3
├── ext4
├── XFS
├── Btrfs
└── ...
       │
       ▼
Page Cache
       │
       ▼
Filesystem Allocation
│
├── Block
└── Extent
       │
       ▼
Block I/O Layer
       │
       ▼
Device Driver
       │
       ▼
Storage
│
├── HDD
├── SATA SSD
└── NVMe SSD

而不同文件系统的核心设计思想:

ext3
│
└── Classic Journaling


ext4
│
├── Journaling
├── Extent
└── Delayed Allocation


XFS
│
├── Allocation Group
├── B+Tree
├── Extent
└── Journaling


ZFS
│
├── Storage Pool
├── VDEV
├── CoW
├── Checksum
├── Snapshot
├── Compression
└── RAID-Z


Btrfs
│
├── B-tree
├── CoW
├── Checksum
├── Subvolume
├── Snapshot
├── Compression
└── Multi-device


APFS
│
├── Container
├── Volume
├── Space Sharing
├── CoW
├── Snapshot
├── Clone
└── Encryption

八十六、最终记忆模型

如果只记每种文件系统最核心的一句话:

ext3
=
ext2 + Journal
经典老牌 Linux 日志文件系统


ext4
=
Block Group + Inode + Extent + Journal
成熟、稳定、通用


XFS
=
Allocation Group + B+Tree + Extent + Journal
大型、高并发、高吞吐


ZFS
=
Storage Pool + CoW + Checksum + Snapshot + RAID-Z
强调数据完整性的完整存储体系


Btrfs
=
B-tree + CoW + Checksum + Subvolume + Snapshot
Linux 原生现代 CoW 文件系统


APFS
=
Container + Volume + CoW + Snapshot + Clone + Encryption
Apple 为 SSD 和自身生态设计的现代文件系统

八十七、一句话总结

文件系统的本质,是在块设备提供的原始存储空间之上建立一套数据和元数据组织规则,使操作系统能够用“目录、文件名、权限、inode、文件内容”等高级抽象管理数据。Linux 又通过 VFS 对不同文件系统提供统一的 open/read/write/mmap 接口。ext3、ext4 和 XFS 主要代表成熟的 Journaling 文件系统设计,其中 ext4 强调通用和稳定,XFS 强调大规模和并发扩展;ZFS、Btrfs 和 APFS 则大量采用 Copy-on-Write 思想,从而自然发展出 Snapshot、Clone、Checksum 等现代能力。ZFS进一步把存储池、RAID 和数据完整性整合进统一体系,Btrfs强调 Linux 原生的 Subvolume/Snapshot/Compression,APFS则围绕 Apple 的 SSD、加密和设备生态进行设计。

posted on 2026-10-01 08:31  心宇16969  阅读(20)  评论(0)    收藏  举报