Published at 2024-12-15 | Last Update 2024-12-15
记录一些平时接触到的存储知识。由于是笔记而非教程,因此内容不求连贯,有基础的同学可作查漏补缺之用。

Fig. LVM concepts, and how userspace file operations traverse the Linux storage stack.
水平及维护精力所限,文中不免存在错误或过时之处,请酌情参考。 传播知识,尊重劳动,年满十八周岁,转载请注明出处。
物理块设备 -> 虚拟块设备Device mapper(设备映射器) 是 Linux 内核提供的一个框架,用于将物理块设备(physical block devices) 映射到更上层的虚拟块设备(virtual block devices)。
LVM)、software RAID 和 dm-crypt 磁盘加密技术的基础,
Fig. Device Mapper 在 Linux 存储栈中的位置(图中间部分)
dm-cache:组合使用 SSD 和 HDD 的混合卷(hybrid volume)
A hybrid volume
is any volume that intentionally and opaquely makes use of two separate
physical volumes. For instance, a workload may consist of random seeks so
an SSD may be used to permanently store frequently used or recently written
data, while using higher-capacity rotational magnetic media for long-term
storage of rarely needed data. On Linux, bcache or dm-cache may be used for
this purpose.
Docker – 基于 device mapper 给容器创建 copy-on-write 存储;LVM2 – 内核最常用的一种逻辑卷管理器(logical volume manager)Logical Volume Manager (LVM,逻辑卷管理器)1998 年引入内核,是一个基于 device mapper 的框架, 为内核提供逻辑卷管理能力。
LVM 可以认为是物理磁盘和分区之上的一个很薄的软件层, 能方便换盘、重新分区和备份等等管理工作。

Fig. LVM concepts, and how userspace file operations traverse the Linux storage stack.
LVM 使用场景:
常规的文件系统,例如 XFS、EXT4 等等,都不能跨多个块设备(device)。
也就是说,创建一个文件系统时,只能指定一个特定的 device,比如 /dev/sda。
要跨多个盘,只能通过 RAID、JBOD、LVM 等等技术将这些块设备合并成一个逻辑卷, 然后在这个逻辑卷上初始化文件系统。
更高级一些的文件系统,是能够跨多个块设备的,包括,
ZFSBTRFS上一节已经介绍到,在块设备上初始化文件系统,就可以创建文件和目录了。 这里所说的块设备 —— 不管是物理设备,还是逻辑设备 —— 穿透之后终归是一个插在本机上硬件设备。
有了虚拟化之后,情况就不一样了。 比如有一类特殊的 Linux 设备,它们对操作系统呈现的确实是一个块设备, 但其实底层对接的远端存储系统,而不是本机硬件设备。
在云计算中,这种存储类型称为“块存储”。
块存储(Block Storage),也称为 block-level storage,是公有云和私有云上都非常常见的一种存储。 各家的叫法或产品名字可能不同,例如,
块存储工作在块级别(device-level),可以直接访问数据并实现高性能I/O。 因此它提供高性能、低延迟和快速数据传输。
使用场景:
使用方式:
将这个块挂载到想使用的机器上,这时呈现给这台机器的操作系统的是一个块设备(/dev/xxx),

Storage Decision. Image Source
ext4 文件系统),然后就可以像普通硬盘一样使用了。AWS 对文件存储、对象存储和块存储有一个不错的介绍文档。 其中提到的块存储的设计:
logical partitions used to store objects),有独立的 resilience/placement-groups/CRUSH-rules/snaphots 管理能力;Image: 一个块,类似 LVM 中的一个 logical volume创建一个 RBD 块设备的大致步骤:
$ ceph osd pool create {pool-name} [{pg-num} [{pgp-num}]] [replicated] \
[crush-rule-name] [expected-num-objects]
$ rbd pool init {pool-name}
$ rbd create --size {size MB} {pool-name}/{image-name}
Ceph 的设计比较特殊,同时支持三种存储类型:
块存储(block storage),类似 AWS EBS。
背后,每个块存储中的 “block”(4.4 节中介绍的 block 概念),
实际上最后是一个 Ceph 对象存储中的 object。
也就是 Ceph 的块存储是基于 Ceph 的对象存储。

Fig. Ceph RBD IO. Each object is fix-sized, e.g. 4MB by default. Image Source
两种使用方式,二选一:

Fig. Ceph RBD workflow. Image Source
/dev/rbd{N} 的设备,