在ULK(Understanding Linux Kernel)一书中,作者说每个块设备都有自己的驱动程序。问题是,这里的块设备代表的是物理磁盘还是仅仅代表磁盘的一个分区?
书中写到struct block_device可以是分区,也可以是磁盘(用“bd_contains”属性表示)。然而,struct gendisk 也可以代表磁盘。我很困惑,“磁盘”这两个结构指的是同一个东西吗?
答案1
在基础层面上,块设备代表一组 N 个数据块,具有固定的块大小。这些块连续编号为 0 .. (N-1)。
这可以是一个物理磁盘、一个分区、一个 RAID 阵列,其中包括多种的物理磁盘,一个 LVM 逻辑卷,包括一个或多个磁盘的一部分,或通过加密层实现上述任何内容的虚拟视图。
文件系统驱动程序通常不关心物理细节:它只处理将该范围的块表示为功能文件系统。底层驱动程序可以以任何他们认为必要的方式转换块编号,只要每个块都可以通过其编号进行唯一寻址。
- 分区驱动程序只是将偏移量应用于块号并引用底层的整个磁盘设备。
- LVM 逻辑卷驱动程序具有逻辑块编号范围和相应(底层设备 + 偏移量)对的表。
- RAID 驱动程序可以有许多底层设备,并且对单个块的请求可以映射到不同设备上的多个底层块,以实现冗余。单个读取请求可以在具有相同内容的多个底层设备之间拆分以提高性能,或者如果其中一个底层设备发生故障,则可以从其他底层设备恢复;写入请求可能需要在每个底层设备上重复(对于 RAID1)和/或为其计算校验和(对于 RAID5/6)。
- 多路径驱动程序有一些所有连接到的底层(路径)设备相同的路径远端的存储设备。它不会更改块号,但如有必要,可能会在多个路径上重试相同的操作。
- 磁盘加密驱动程序可能会也可能不会映射块号(以混淆真实的磁盘访问模式),但它肯定会修改通过它的数据:任何要写入的块在将请求传递到底层设备之前都会被加密,并且从底层设备读取的任何数据都会被解密。
由于块设备无论是物理磁盘、分区、LVM LV、RAID 设备还是其他设备都具有基本相同的接口,因此所有这些映射驱动程序都是可堆叠:您可以自由地将这些映射图层放置在彼此之上。当然,并非所有组合都保证是合理的,甚至是有用的。