持久化数据

引言

更复杂的设备映射器目标需要复杂的元数据,这些元数据在内核中进行管理。 在 2010 年末,我们看到各种不同的目标都在推出自己的数据结构,例如

  • Mikulas Patocka 的 multisnap 实现

  • 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 位,尽管嵌套允许您使用多个键。