持久化数据¶
引言¶
更复杂的设备映射器目标需要由内核管理的复杂元数据。在2010年末,我们看到各种不同的目标都在开发自己的数据结构,例如
Mikulas Patocka 的多快照实现
Heinz Mauelshagen 的精简配置目标
另一个发布到 dm-devel 的基于 btree 的缓存目标
另一个基于 Daniel Phillips 设计的多快照目标
维护这些数据结构需要大量工作,因此如果可能的话,我们希望减少它们的数量。
持久化数据库旨在为希望在设备映射器目标中存储元数据的人员提供可重用的框架。它目前被精简配置目标和即将推出的分层存储目标所使用。
概述¶
主要文档都在头文件中,所有这些文件都可以在 drivers/md/persistent-data 下找到。
块管理器¶
dm-block-manager.[hc]
它提供对磁盘上固定大小块中数据的访问。有一个读/写锁定接口,用于防止并发访问,并将正在使用的数据保留在缓存中。
持久化数据的客户端不太可能直接使用它。
事务管理器¶
dm-transaction-manager.[hc]
它限制对块的访问并强制执行写时复制语义。通过事务管理器获取可写块的唯一方法是影子复制现有块(即执行写时复制)或分配一个新块。在同一事务中会省略影子复制,因此性能合理。提交方法确保在写入超级块之前刷新所有数据。发生电源故障时,您的元数据将保持最后一次提交时的状态。
空间映射¶
dm-space-map.h dm-space-map-metadata.[hc] dm-space-map-disk.[hc]
用于跟踪块引用计数的磁盘数据结构。也充当新块的分配器。目前有两种实现:一种更简单的用于管理不同设备上的块(例如,精简配置的数据块);另一种用于管理元数据空间。后者因为需要在其管理的同一个空间内存储自己的数据而变得复杂。
数据结构¶
dm-btree.[hc] dm-btree-remove.c dm-btree-spine.c dm-btree-internal.h
目前只有一种数据结构,即分层 btree。计划添加更多。例如,具有类似数组接口的数据结构将得到广泛应用。
这种 btree 是“分层”的,因为您可以将其定义为由嵌套 btree 组成,并接受多个键。例如,精简配置目标使用两层嵌套的 btree。第一层将设备 ID 映射到映射树,而映射树又将虚拟块映射到物理块。
存储在 btree 中的值可以具有任意大小。键始终为 64 位,尽管嵌套允许您使用多个键。