第1章 简介 1
1.1 Gnu/Linux和文件系统 2
1.2 本书的目的 3
1.2.1 本书的读者 3
1.2.2 阅读本书之前应该了解的知识 4
1.2.3 本书的内容 4
1.2.4 阅读本书的方法 4
1.3 查找更多信息的位置 4
1.3.1 建议和意见 5
1.3.2 开发源代码——一个现代操作系统的本质 5
1.4 Linux的历史 6
1.4.1 Linux目前提供的功能 7
1.4.2 内核2.4 中的新特性 8
第2章 编译内核 10
2.1 源代码的树形结构 11
2.1.1 arch/目录 16
2.1.2 drivers/目录 16
2.1.3 fs/目录 16
2.1.4 include/目录 16
2.1.8 kernel/目录 17
2.1.7 lib/目录 17
2.1.6 init/目录 17
2.1.5 ipc/目录 17
2.1.9 mm/目录 18
2.1.10 net/目录 18
2.2 编译内核 18
2.2.1 GNU gcc编译器 19
2.2.2 编码约定 19
2.2.3 体系结构相关性 20
第3章 什么是文件系统 21
3.1 文件系统的一般特征 22
3.1.1 文件结构的分层结构 23
3.1.2 文件系统中的对象 26
3.1.3 缓冲区、缓存以及内存无用信息收集 26
3.2 缓冲区缓存 27
3.3 bdflush内核监控程序 29
3.3.1 kswapd 30
3.3.2 文件系统对象 31
3.3.3 文件 32
3.3.4 文件函数 34
3.4 信息节点 38
3.5 文件系统 47
3.6 名称或dentry 49
3.6.1 dentry结构 50
3.6.2 dentry函数 53
3.7 Linux超级块 54
3.7.1 超级块结构 55
3.7.2 超级块函数 58
3.8 性能问题和优化策略 62
3.8.1 原始I/O 62
3.8.2 进程资源限制 63
3.8.3 基于盘区的分配(常规) 64
3.8.5 事务处理或安全的数据库问题 66
3.8.4 基于块的分配(常规) 66
3.8.6 日记相对于无日记的优点 67
第4章 Linux VFS 72
4.1 一般概念 73
4.1.1 VFS源代码 73
4.1.2 VFS的工作方式 75
4.1.3 include/linux/fs.h的源文件(2.4.3) 83
4.1.4 fs/ext2/super.c(2.4.3) 118
4.1.5 fs/ext2/file.c源文件(2.4.3) 139
4.1.6 fs/namei.c中open namei()函数的源代码 142
第5章 LVM(逻辑卷管理器) 148
5.1 Linux LVM简介 149
5.1.1 LVM的好处 151
5.1.2 LVM的工作方式 152
5.1.3 LVM的内部细节 153
5.1.4 include/linux/lvm.h的源代码 157
第6章 在Linux中使用RAID 178
6.1 PCI控制器 179
6.2 SCSI-SCSI控制器 180
6.3 软件RAID 181
6.3.2 配置RAID 0 183
6.3.1 分带 183
6.3.3 配置RAID 1 184
6.4 RAID的局限性 185
6.5 从RAID设备故障中恢复 186
6.5.1 情况A 187
6.5.2 情况B 188
第7章 第二扩展文件系统(ext2) 197
7.1 新特性 198
7.1.1 标准的ext2fs特性 198
7.1.2 高级ext2fs特性 198
7.1.3 目录 199
7.1.4 块 200
7.1.5 超级块 202
7.1.6 ext2fs库 204
7.1.7 ext2fs工具 204
7.1.8 ext2fs中的信息节点 207
7.1.9 ext2fs超级块 208
7.1.10 ext2组描述符 209
7.1.11 空闲块数、空闲信息节点数、使用的目录计数 210
7.1.12 更改ext2文件系统中的文件大小 210
7.1.14 位图 215
7.1.13 组描述符 215
7.1.15 信息节点 216
7.1.16 目录 218
7.1.17 分配算法 218
7.1.18 错误处理 219
7.2 include/linux/ext2_fs.h的源代码 220
第8章 IBM用于Linux的JFS日记文件系统 236
8.1 主要的JFS数据结构和算法 237
8.1.1 超级块:主要聚集超级块和次要聚集超级块 237
8.1.2 信息节点 237
8.1.3 标准的管理实用程序 238
8.1.5 块分配地图 239
8.1.4 如何在启动时设置JFS 239
8.1.6 信息节点分配地图 240
8.1.7 AG空闲信息节点列表 240
8.1.8 IAG空闲列表 241
8.1.9 文件集分配地图信息节点 241
8.1.10 区别JFS和其他文件系统的设计特性 241
8.1.11 JFS更广泛地使用B+树 243
8.1.12 叶节点 243
8.1.14 可变的块大小 244
8.1.15 目录结构 244
8.1.13 内部节点 244
8.1.16 JFS对稀疏文件和稠密文件的支持 245
8.2 聚集和文件集 245
8.2.1 文件 245
8.2.2 目录 245
8.2.3 日志 246
8.2.4 文件系统和访问控制 247
第9章 Linux的ReiserFS 248
9.1 文件系统名称空间 249
9.2 文件边界的块对齐 250
9.3 平衡树和大文件I/O 251
9.3.2 树的定义 252
9.3.1 序列化和一致性 252
9.4 缓冲和保留列表 255
9.5 使用树来优化文件布局 259
9.5.1 物理布局 260
9.5.2 节点布局 260
9.6 在Linux内核上安装和配置ReiserFS 265
9.6.1 Linux-2.2.X内核 265
9.6.2 Linux-2.4.0到Linux 2.4.2 267
第10章 XFS 269
10.1 XFS实现方式 271
10.1.2 Buffer Cache Manager 272
10.1.1 Log Manager 272
10.1.3 Lock Manager 273
10.1.4 Space Manager 273
10.1.5 Attribute Manager 274
10.1.6 Name Space Manager 274
10.1.7 XFS文件系统的管理 275
10.2 XFS的结构和方法 275
10.2.1 信息节点的数据结构 275
10.2.2 信息节点的生命周期 276
10.2.3 信息节点分配 278
10.2.4 信息节点的内嵌数据/盘区/B树根 279
10.2.5 信息节点锁定 280
10.2.6 信息节点事务和日志 281
10.2.7 信息节点刷新 281
10.2.8 信息节点回收 282
10.3 XIS超级块结构和方法 283
10.3.1 超级块缓冲区 283
10.3.2 超级块管理接口 284
10.3.3 磁盘上的结构 286
10.3.5 数据块空闲列表 287
10.3.4 分配组标题 287
10.3.6 信息节点表 288
10.3.7 数据和属性块表示 290
10.3.8 文件系统结构 291
10.3.9 缓冲与分配 291
10.3.10 XIS可用性和发布警告 291
10.4 使用XFS 292
附录A 软件RAID指南 294
附录B 参考资料 320
附录C 绕回根文件系统指南 324
附录D Linux分区指南 338