存储技术原理分析

2011年电子工业出版社出版的图书
《存储技术原理分析 》是电子工业出版社 出版的图书，作者是敖青云 ，本书通过对Linux 2.6内核源代码的分析，详细讨论存储技术的内在实现原理。
内容简介
《存储技术原理分析:基于Linux 2.6内核源代码》分为三条主线：解释PCI设备、SCSI设备以及块设备的发现过程；跟踪存储I/O路径，即用户对文件的读/写请求怎么通过中间各个层次，最终到达磁盘介质；此外，还简要介绍主机适配器、块设备驱动以及文件系统等编程框架。
书中将设计一些主要的场景，跟踪实现的各个层次，对其中的主要函数进行代码级的讲解。在分析每个模块时，会给出整体框架、主要数据结构之间的关系，并列出各个域的详细含义。
采用这种方式，我们希望读者能对存储相关概念（如RAID、快照等）的内在实现有具体的了解，也试图帮助读者理解Linux内核设计和开发的一些思想，为进一步分析其他模块（如进程管理、内存管理等）起借鉴作用。
读者对象：《存储技术原理分析:基于Linux 2.6内核源代码》适合作为高校计算机相关专业本科生和研究生学习操作系统的辅助和实践教材，也适合作为Linux爱好者学习内核的参考书籍。同时，它也是存储从业工程师深入理解存储架构，以及软件开发工程师掌握软件架构的有效工具。
编辑推荐
《存储技术原理分析:基于Linux 2.6内核源代码》通过分析Linux内核源代码，讲解存储、网络和虚拟机的相关技术，您将从中领悟到：设备发现过程了解操作系统如何发现PCI设备、SCSI设备、块设备，并和驱动绑定起来；存储l，O路径了解用户对文件的读/写请求怎么通过I/O路径，最终到达磁盘介质上；内核编程模式理解PCI-SCSIHBA驱动、块设备驱动，以及文件系统等编程框架。
目录
第一部分 存储技术
第1章 存储技术概论 2
1.1 存储系统元素 2
1.1.1磁盘驱动器2
1.1.2 存储设备 4
1.1.3 服务器部件 7
1.1.4 存储软件 9
1.2 存储相关技术 10
1.2.1 备份技术 10
1.2.2 快照技术 13
1.2.3 连续数据保护技术 21
1.2.4 RAID技术 22
1.2.5 “多路径”技术 36
1.2.6 虚拟化技术 39
1.3 网络存储结构 40
1.3.1 直接连接存储 40
1.3.2 网络连接存储 40
1.3.3 存储区域网络 41
1.4 存储I/O通道 41
1.4.1 存储I/O物理通道 42
1.4.2 存储I/O逻辑通道 43
1.4.3 虚拟机I/O逻辑通道 44
1.5 存储应用举例 45
1.5.1 同时提供文件服务和块服务 45
1.5.2 按需扩容、随需取用延缓企业投资 45
1.5.3 计算与存储分离便于故障恢复和系统升级 45
1.5.4 为高可用性集群提供共享存储46
1.5.5 利用快照技术恢复被病毒破坏的数据 47
1.5.6 基于文件的数据备份和远程镜像方案 47
1.5.7 利用PXE和iSCSI实现远程引导和映像恢复 48
1.5.8 虚拟机故障的检测及迁移 49
第二部分 设备
第2章 Linux驱动模型 52
2.1 概述 52
2.2 引用计数 53
2.3 内核对象及集合 55
2.3.1 创建或初始化内核对象 58
2.3.2 将内核对象添加到sysfs文件系统 59
2.3.3 创建、初始化、添加内核对象集 63
2.3.4 发送内核对象变化事件到用户空间 63
2.4 sysfs文件系统 69
2.4.1 构建内核对象、对象属性和对象关系的内部树 70
2.4.2 对sysfs文件的读/写转换为对属性的show和store操作 73
2.4.3 为具体内核对象定义属性的规范流程 77
2.5 kobject编程模式 80
2.6 驱动模型对象 81
2.6.1 总线类型 82
2.6.2 设备 86
2.6.3 驱动 100
2.6.4 类 105
2.6.5 接口 107
2.7 驱动模型编程模式 108
第3章 PCI子系统 110
3.1 概述 110
3.2 PCI子系统对象 115
3.2.1 pci_bus：PCI总线 116
3.2.2 pci_dev：PCI设备 117
3.3 PCI核心初始化 121
3.4 配置访问方法 124
3.4.1 机制#1方式 126
3.4.2 PCIBIOS方式 128
3.4.3 配置访问接口 133
3.5 PCI总线扫描 133
3.5.1 PCI总线编号范例 133
3.5.2 PCI总线扫描流程 137
3.6 PCI中断路由 160
3.6.1 中断路由初始化 165
3.6.2 查找中断路由表 166
3.6.3 查找中断路由驱动 167
3.6.4 分配ISA IRQ号 171
3.7 PCI资源分配 177
3.7.1 PCI资源分配范例 178
3.7.2 PCI资源分配流程 181
3.8 PCI设备驱动编程模式 193
3.8.1 定义PCI驱动结构 194
3.8.2 定义支持设备ID列表 194
3.8.3 实现probe回调方法 196
3.8.4 实现remove回调方法 198
3.8.5 实现其他回调方法 199
3.8.6 注册与注销PCI驱动 199
第4章 SCSI子系统 201
4.1 概述 201
4.2 SCSI子系统对象 202
4.2.1 scsi_host_template：SCSI主机适配器模板 203
4.2.2 Scsi_Host：SCSI主机适配器 207
4.2.3 scsi_target：SCSI目标节点 210
4.2.4 scsi_device：SCSI逻辑设备 211
4.2.5 scsi_cmnd：SCSI命令 215
4.3 SCSI子系统初始化 216
4.4 添加适配器到系统 216
4.5 SCSI设备探测 222
4.5.1 探测流程入口 224
4.5.2 探测逻辑单元 232
4.5.3 添加SCSI设备 237
4.6 SCSI磁盘驱动 241
4.6.1 同步执行部分 244
4.6.2 异步执行部分 247
4.6.3 重新校验磁盘 249
4.6.4 让磁盘转起来 251
4.7 SCSI命令执行 254
4.8 SCSI错误恢复 259
4.8.1 命令进入错误恢复 261
4.8.2 错误恢复线程执行 262
4.8.3 发送错误恢复命令 275
4.9 SCSI低层驱动编程模式 279
4.9.1 定义主机适配器模板 279
4.9.2 完善探测回调处理逻辑 279
4.9.3 实现queuecommand回调函数 279
4.9.4 实现中断处理函数 283
4.9.5 实现其他回调函数 283
4.9.6 模块加载和卸载 283
第三部分 存储I/O
第5章 块I/O子系统 286
5.1 概述 286
5.2 块I/O子系统对象 287
5.2.1 gendisk：通用磁盘 289
5.2.2 hd_struct：分区 291
5.2.3 block_device：块设备 292
5.2.4 request_queue：请求队列 293
5.2.5 request：块设备驱动层请求 296
5.2.6 bio：通用块层请求 298
5.3 添加磁盘到系统 300
5.3.1 分配通用磁盘描述符 300
5.3.2 添加到sysfs文件系统 302
5.3.3 获取磁盘块设备描述符 305
5.3.4 打开磁盘块设备描述符 306
5.3.5 重新扫描磁盘分区 310
5.3.6 设备号映射机制 314
5.4 请求处理过程 315
5.4.1 上层向块I/O子系统提交请求 315
5.4.2 构造、排序或合并请求 320
5.4.3 SCSI策略例程逐个处理请求 327
5.4.4 为请求构造SCSI命令 334
5.4.5 为SCSI命令准备聚散列表 343
5.4.6 派发SCSI命令到低层驱动 349
5.5 I/O调度算法 352
5.5.1 为请求队列建立关联的I/O调度队列 356
5.5.2 判断bio是否可以被合并到request 356
5.5.3 将请求添加到I/O调度队列或请求队列 359
5.5.4 从I/O调度队列派发请求到请求队列 362
5.6 请求处理完成 366
5.6.1 低层驱动调用完成回调函数 366
5.6.2 引发块I/O子系统的软中断 368
5.6.3 调用请求队列的软中断回调 369
5.6.4 调用上层的完成回调函数 383
5.7 屏障I/O处理 386
5.7.1 屏障I/O接口 386
5.7.2 添加屏障请求 388
5.7.3 处理屏障请求 389
5.7.4 完成屏障请求 393
5.8 完整性保护 396
5.8.1 数据完整性对象 397
5.8.2 为块设备注册完整性能力 400
5.8.3 为bio准备完整性元数据 402
5.8.4 校验完整性元数据 406
5.8.5 修正bio基准标签 408
5.9 磁盘类设备驱动编程模式 411
5.9.1 定义磁盘类设备私有数据结构 411
5.9.2 定义和实现块设备操作表 411
5.9.3 分配和初始化磁盘类设备相关结构 411
5.9.4 为磁盘类设备准备请求队列并添加通用磁盘到系统 412
第6章 Multi-Disk（MD）模块 413
6.1 概述 413
6.2 RAID模块对象 414
6.2.1 mddev_t：RAID设备 414
6.2.2 mdk_rdev_t：成员磁盘 418
6.2.3 mdk_personality：MD个性 419
6.3 MD模块初始化 420
6.4 MD设备创建 423
6.4.1 从用户空间打开MD设备 424
6.4.2 用户空间发送ioctl创建MD 428
6.4.3 自动检测和运行RAID 439
6.5 MD设备请求执行 439
6.6 MD个性化编程模式 440
6.6.1 定义私有数据结构 441
6.6.2 声明个性化结构 442
6.6.3 实现个性化方法 442
6.6.4 实现模块加载和卸载方法 445
6.7 RAID0模块 445
6.7.1 为RAID0设备构造条带区域 446
6.7.2 查找包含给定偏移的条带区域 451
6.7.3 映射到成员设备及其扇区偏移 451
6.8 RAID5模块 452
6.8.1 RAID5模块对象 452
6.8.2 请求执行过程 459
6.8.3 同步和恢复过程 507
第7章 Device Mapper模块 509
7.1 概述 509
7.2 Device Mapper对象 510
7.2.1 dm_table：映射表结构 512
7.2.2 dm_target：映射目标结构 513
7.2.3 mapped_device：映射设备结构 514
7.2.4 dm_dev：低层设备结构 515
7.2.5 target_type：映射目标类型 516
7.3 Device Mapper模块初始化 518
7.4 映射设备的创建 519
7.4.1 分配映射设备描述符 521
7.4.2 加载映射表 526
7.4.3 恢复映射设备 532
7.5 映射设备的请求执行 536
7.5.1 添加到延迟链表 537
7.5.2 分割与处理bio 539
7.6 内核复制线程 549
7.6.1 准备复制任务 551
7.6.2 任务处理流程 553
7.7 Device Mapper目标类型编程模式 556
7.7.1 定义私有数据结构 557
7.7.2 声明目标类型结构 557
7.7.3 实现目标类型方法 557
7.7.4 实现模块加载和卸载方法 558
7.8 条带映射模块 558
7.8.1 构造函数 559
7.8.2 析构函数 562
7.8.3 映射函数 562
7.8.4 end_io函数 563
7.9 快照映射模块 563
7.9.1 快照映射对象 564
7.9.2 快照源构造 569
7.9.3 快照构造 570
7.9.4 快照源读/写 577
7.9.5 快照读/写 585
7.9.6 例外仓库 588
第8章 文件系统 593
8.1 概述 593
8.2 文件系统对象 595
8.2.1 file_system_type：文件系统类型 596
8.2.2 super_block：VFS超级块 597
8.2.3 inode：VFS索引节点 602
8.2.4 dentry：VFS目录项 610
8.2.5 vfsmount：文件系统装载 612
8.3 装载文件系统 614
8.3.1 mount系统调用的处理流程 618
8.3.2 构建子文件系统装载实例 621
8.3.3 关联文件系统的超级块实例 623
8.3.4 调用回调函数填充超级块 626
8.3.5 装载到全局文件系统树 630
8.4 路径查找 632
8.4.1 路径查找入口 635
8.4.2 逐个分量解析 637
8.4.3 解析单个分量 642
8.4.4 上溯通过装载点 645
8.4.5 下溯通过装载点 646
8.4.6 处理符号链接 646
8.5 打开文件 651
8.5.1 open系统调用的处理流程 653
8.5.2 解析路径最后一个分量 658
8.5.3 填充文件描述符的内容 662
8.6 读文件 665
8.6.1 read系统调用的处理流程 670
8.6.2 基于缓冲页面构造I/O请求 683
8.6.3 直接针对页面构造I/O请求 690
8.6.4 从文件块编号推导磁盘块编号 696
8.7 写文件 700
8.7.1 write系统调用的处理流程 700
8.7.2 通知为缓冲写请求作准备 707
8.7.3 通知数据已复制到缓冲区 712
8.8 冲刷文件 715
8.8.1 BDI相关对象 715
8.8.2 注册后备设备信息 719
8.8.3 forker线程执行流程 721
8.8.4 flusher线程执行流程 723
8.8.5 同步相关系统调用 749
8.9 块设备文件 761
8.9.1 块设备的主inode和次inode 762
8.9.2 对块设备文件的操作转换为对块设备的操作 764
8.9.3 对块设备文件的读/写作用于块设备之上 767
8.10 文件系统编程模式 767
主要参考文献 769
作者简介
敖青云，博士，2001年毕业于上海交通大学计算机科学及工程系。毕业后一直从事存储及相关产品的研发工作，主要研究方向为开源技术、操作系统、存储及虚拟机技术等。现居上海。