附录 A. 设备映射器


设备映射器是提供卷管理的框架的内核驱动程序。它提供了一种创建映射设备的通用方法,它可用作逻辑卷。它没有特别了解卷组或元数据格式。
设备映射器为多个更高级别的技术提供基础。除了 LVM, Device-Mapper multipath 和 dmraid 命令外,使用设备映射器。设备映射器的应用程序接口是 ioctl 系统调用。用户界面是 dmsetup 命令。
使用设备映射器激活 LVM 逻辑卷。每个逻辑卷都被转换为映射的设备。每个片段都转化为描述该设备的映射表中的一行。设备映射器支持各种映射目标,包括线性映射、条带映射和错误映射。例如,两个磁盘可以使用一对线性映射连接到一个逻辑卷中,每个磁盘一个。当 LVM 创建卷时,它会创建一个底层设备映射器设备,可以使用 dmsetup 命令查询。有关映射表中设备格式的详情,请参考 第 A.1 节 “设备表映射”。有关使用 dmsetup 命令查询设备的详情,请参考 第 A.2 节 “dmsetup 命令”

A.1. 设备表映射

映射的设备由表定义,该表指明了如何使用受支持的 Device Table 映射来映射设备的每个逻辑扇区范围。映射的设备的表由表单的行列表构建:
start length mapping [mapping_parameters...]
在设备映射器表的第一行中,start 参数必须等于 0。一行中的 start + length 参数必须与下一行中的 start 相同。在映射表的行中指定哪个映射参数取决于行中指定 mapping 类型。
设备映射器中的大小总是以扇区(512 字节)指定。
当设备被指定为设备映射器中的映射参数时,可以在文件系统(例如 /dev/hda)或格式为 major minor 中的设备名称引用它。首选使用 main:minor 格式,因为它可以避免路径名称查找。
下面显示了一个设备映射表示例。这个表中有四个线性目标:
0 35258368 linear 8:48 65920
35258368 35258368 linear 8:32 65920
70516736 17694720 linear 8:16 17694976
88211456 17694720 linear 8:16 256
每行的前 2 参数是片段起始块和片段的长度。next 关键字是映射目标,本例中的所有情况下都是 线性 的。行的其余部分由 线性 目标的参数组成。
以下小节描述了以下映射的格式:
  • 线性
  • 条带的
  • mirror
  • snapshot 和 snapshot-origin
  • 错误
  • zero
  • multipath
  • crypt

A.1.1. 线性映射目标

线性映射目标将持续的块范围映射到另一个块设备。线性目标的格式如下:
start length linear device offset
start
在虚拟设备中启动块
length
这个片段的长度
device
块设备,由文件系统中的设备名称引用,或者由主号和次号引用 majorminor
offset
在该设备中开始映射的偏移
以下示例显示了在虚拟设备 0 的起始块(一个片段长度为 1638400)、主要数量为 8:2,以及 41146992 设备的起始偏移量。
0 16384000 linear 8:2 41156992
以下示例显示了一个线性目标,其 device 参数指定为设备 /dev/hda
0 20971520 linear /dev/hda 384

A.1.2. 条带映射目标

条带映射目标支持在物理设备间分条。它取条带的数目和条带的块数量,后跟设备名称和扇区对列表。条带目标的格式如下:
start length striped #stripes chunk_size device1 offset1 ... deviceN offsetN
每个条带都有一组 deviceoffset 参数。
start
在虚拟设备中启动块
length
这个片段的长度
#stripes
虚拟设备的条带数
chunk_size
在切换到下一个数据前写入每个条带的扇区数 ; 必须为 2 的电源,至少与内核页面大小相同
device
块设备,由文件系统中的设备名称引用,或者由主号和次号引用,格式为 major:minor
offset
在该设备中开始映射的偏移
以下示例显示了三个条带的条带目标,块大小为 128:
0 73728 striped 3 128 8:9 384 8:8 384 8:7 9789824
0
在虚拟设备中启动块
73728
这个片段的长度
条带 3 128
在 3 个大小为 128 块的设备间条带
8:9
主:第一个设备的次号码
384
在第一个设备中启动映射的偏移
8:8
主:第二个设备的次号码
384
在第二个设备中启动映射的偏移
8:7
主:第三个设备的次号码
9789824
在第三个设备中启动映射的偏移
以下示例显示了 2 条带的条带化目标,包含 256 KiB 块,设备名称在文件系统中,而不是由主号码和副号码指定的设备名称。
0 65536 striped 2 512 /dev/hda 0 /dev/hdb 0

A.1.3. 镜像映射目标

镜像映射目标支持镜像逻辑设备的映射。镜像目标的格式如下:
start length mirror log_type #logargs logarg1 ... logargN #devs device1 offset1 ... deviceN offsetN
start
在虚拟设备中启动块
length
这个片段的长度
log_type
可能的日志类型及其参数如下:
core
镜像功能是本地的,镜像日志保存在内核内存中。此日志类型采用 1 - 3 参数:
regionsize [[no]sync] [block_on_error]
disk
镜像是本地的,镜像日志保存在磁盘上。此日志类型采用 2 - 4 参数:
logdevice regionsize [[no]sync] [block_on_error]
clustered_core
镜像集群是集群的,镜像日志保存在内核内存中。此日志类型采用 2 - 4 参数:
regionsize UUID [[no]sync] [block_on_error]
clustered_disk
镜像集群是集群的,镜像日志保存在磁盘上。此日志类型采用 3 - 5 参数:
logdevice regionsize UUID [[no]sync] [block_on_error]
LVM 维护一个小日志,它用于跟踪哪些区域与镜像或镜像处于同步。regionsize 参数指定这些地区的大小。
在集群环境中,UUID 参数是与镜像日志设备关联的唯一标识符,以便可以在整个集群中维护日志状态。
可选的 [no]sync 参数可以用来将镜像指定为 "in-sync" 或 "out-of-sync"。block_on_error 参数用于告知镜像响应错误,而不是忽略它们。
#log_args
在映射中指定的日志参数数
logargs
mirror 的日志参数 ; 提供的日志参数由 #log-args 参数指定,有效的日志参数由 log_type 参数指定。
#devs
镜像中的分支数 ; 为每个分支指定设备和偏移量
device
每个镜像 leg 的块设备,由文件系统中的设备名称或主号和次号引用,格式为 major:minor。为每个镜像 leg 指定块设备和偏移,如 #devs 参数所示。
offset
启动设备上映射的偏移。为每个镜像 leg 指定块设备和偏移,如 #devs 参数所示。
以下示例显示了集群镜像的镜像映射目标,其镜像日志保存在磁盘上。
0 52428800 mirror clustered_disk 4 253:2 1024 UUID block_on_error 3 253:3 0 253:4 0 253:5 0
0
在虚拟设备中启动块
52428800
这个片段的长度
mirror cluster_disk
带有日志类型的镜像目标,指定该镜像已集群,镜像日志会在磁盘上维护
4
4 个镜像日志参数将遵循
253:2
主:日志设备的次编号
1024
镜像日志用来跟踪同步情况的区域大小
UUID
镜像日志设备的 UUID,用于维护整个集群中的日志信息
block_on_error
镜像应响应错误
3
镜像中的分支数
253:3 0 253:4 0 253:5 0
main:设备代表每个镜像分支的次编号和偏移量

A.1.4. snapshot 和 snapshot-origin Mapping 目标

当您创建卷的第一个 LVM 快照时,会使用四个设备映射器设备:
  1. 具有 线性映射的设备,其中包含源卷的原始映射表。
  2. 具有 线性映射的设备 用作源卷的写时复制(COW)设备;对于每个写入,原始数据保存在每个快照的 COW 设备中,以便其可见的内容保持不变(忽略 COW 设备填满)。
  3. 具有组合了 #1 和 #2 的快照 映射的设备,这是可见的快照卷。
  4. "original"卷(使用原始源卷使用的设备号),其表替换为设备 #1 的 "snapshot-origin" 映射。
固定命名方案用于创建这些设备,例如,您可以使用以下命令创建名为 base 的 LVM 卷,以及基于该卷的名为 snap 的快照卷。
# lvcreate -L 1G -n base volumeGroup
# lvcreate -L 100M --snapshot -n snap volumeGroup/base
这会产生四个设备,您可以使用以下命令查看:
# dmsetup table|grep volumeGroup
volumeGroup-base-real: 0 2097152 linear 8:19 384
volumeGroup-snap-cow: 0 204800 linear 8:19 2097536
volumeGroup-snap: 0 2097152 snapshot 254:11 254:12 P 16
volumeGroup-base: 0 2097152 snapshot-origin 254:11

# ls -lL /dev/mapper/volumeGroup-*
brw-------  1 root root 254, 11 29 ago 18:15 /dev/mapper/volumeGroup-base-real
brw-------  1 root root 254, 12 29 ago 18:15 /dev/mapper/volumeGroup-snap-cow
brw-------  1 root root 254, 13 29 ago 18:15 /dev/mapper/volumeGroup-snap
brw-------  1 root root 254, 10 29 ago 18:14 /dev/mapper/volumeGroup-base
snapshot-origin 目标的格式如下:
start length snapshot-origin origin
start
在虚拟设备中启动块
length
这个片段的长度
origin
快照卷
snapshot-origin 通常会基于它有一个或多个快照。读取将直接映射到后备设备。对于每个写入,原始数据将保存在每个快照的 COW 设备中,以便其可见的内容保持不变,直到 COW 设备填满为止。
快照 目标的格式如下:
start length snapshot origin COW-device P|N chunksize
start
在虚拟设备中启动块
length
这个片段的长度
origin
快照卷
COW-device
保存数据块的设备
P|N
P(Persistent)或 N(非持久性); 表示快照在重新引导后是否保留下来。对于临时快照(N)较少的元数据必须在磁盘上保存;它们可以被内核保存在内存中。
chunksize
将存储在 COW 设备上的已更改数据块的扇区大小
以下示例显示了一个 original 目标,原始设备 为 254:11。
0 2097152 snapshot-origin 254:11
以下示例显示了一个 快照 目标,原始设备为 254:11,而 COW 设备为 254:12。此快照设备在重启后保留,且 COW 设备中存储的数据的块大小是 16 个扇区。
0 2097152 snapshot 254:11 254:12 P 16

A.1.5. 错误映射目标

如果映射目标有错误,则所有到映射扇区的 I/O 操作都会失败。
可以使用错误映射目标进行测试。要测试设备的行为方式,您可以创建一个设备映射,在设备中间使用 bad 扇区,或者您可以交换出镜像分支,并替换为错误目标。
可以使用错误目标代替失败设备,作为避免超时并在实际设备中重试的方法。在 LVM 元数据失败时,它可以用作中间目标。
错误 映射目标除了 startlength 参数之外不需要额外的参数。
以下示例显示了 错误 目标。
0 65536 error

A.1.6. 零映射目标

映射目标是等同于 /dev/zero 的块设备。此映射的读取操作将返回零块。写入此映射的数据将被丢弃,但写入会成功。 映射目标不使用 开始长度 参数之外的其他参数。
以下示例显示了 16Tb 设备的 目标。
0 65536 zero

A.1.7. 多路径映射目标

多路径映射目标支持多路径设备的映射。多路径 目标的格式如下:
start length  multipath  #features [feature1 ... featureN] #handlerargs [handlerarg1 ... handlerargN] #pathgroups pathgroup pathgroupargs1 ... pathgroupargsN
每个路径组都有一组 pathgroupargs 参数。
start
在虚拟设备中启动块
length
这个片段的长度
#features
多路径功能数量,后跟这些功能。如果此参数为零,则没有 feature 参数,下一个设备映射参数为 #handlerargs。目前,可以使用 multipath.conf 文件中的 features 属性 queue_if_no_path 设置支持的功能。这表示这个多路径设备当前设置为队列 I/O 操作(如果没有可用的路径)。
在以下示例中,multipath.conf 文件中的 no_path_retry 属性被设置为队列 I/O 操作,直到所有路径在一组尝试被使用路径后都被标记为失败。在这种情况下,映射显示如下,直到所有路径检查器都失败了指定数量的检查。
0 71014400 multipath 1 queue_if_no_path 0 2 1 round-robin 0 2 1 66:128 \
1000 65:64 1000 round-robin 0 2 1 8:0 1000 67:192 1000
当所有路径检查器都失败了指定数量的检查后,映射会显示如下。
0 71014400 multipath 0 0 2 1 round-robin 0 2 1 66:128 1000 65:64 1000 \
round-robin 0 2 1 8:0 1000 67:192 1000
#handlerargs
硬件处理程序参数的数量,后跟这些参数。硬件处理器指定在切换路径组或处理 I/O 错误时用于执行硬件特定操作的模块。如果将其设置为 0,则下一个参数为 #pathgroups
#pathgroups
路径组的数量。路径组是多路径设备将负载均衡的路径集合。每个路径组都有一组 pathgroupargs 参数。
pathgroup
要尝试的下一个路径组。
pathgroupsargs
每个路径组由以下参数组成:
pathselector #selectorargs #paths #pathargs device1 ioreqs1 ... deviceN ioreqsN 
路径组中每个路径均有一组 path 参数。
pathselector
指定用于决定此路径组中用于下一 I/O 操作的算法。
#selectorargs
在多路径映射中跟随这个参数的路径选择器参数数量。目前,这个参数的值始终为 0。
#paths
这个路径组中的路径数量。
#pathargs
为此组中每个路径指定的路径参数的数目。目前,这个数字始终为 1,即 ioreqs 参数。
device
路径的块设备号,由主号和次号引用,格式为 majorminor
ioreqs
在切换到当前组中下一个路径前,要路由到此路径的 I/O 请求数量。
图 A.1 “多路径映射目标” 显示带有两个路径组的多路径目标格式。

图 A.1. 多路径映射目标

多路径映射目标
以下示例显示了同一多路径设备的纯故障转移目标定义。在这个目标中有四个路径组,每个路径组只有一个打开路径,以便多路径设备一次只使用一个路径。
0 71014400 multipath 0 0 4 1 round-robin 0 1 1 66:112 1000 \
round-robin 0 1 1 67:176 1000 round-robin 0 1 1 68:240 1000 \
round-robin 0 1 1 65:48 1000
以下示例显示了同一多路径设备的完整分散(多线程)目标定义。在这个目标中只有一个路径组,其中包括所有路径。在这个设置中,多路径会将负载均匀分发到所有路径。
0 71014400 multipath 0 0 1 1 round-robin 0 4 1 66:112 1000 \
 67:176 1000 68:240 1000 65:48 1000
有关多路径的详情,请参考 DM 多路径 手动。

A.1.8. crypt Mapping 目标

crypt 目标加密通过指定设备传递的数据。它使用内核 Crypto API。
crypt 目标的格式如下:
start length crypt cipher key IV-offset device offset
start
在虚拟设备中启动块
length
这个片段的长度
cipher
密码由 cipher[-chainmode]-ivmode[:iv options] 组成。
cipher
可用的密码列在 /proc/crypto 中( 例如)。
chainmode
始终使用 cbc。不要使用 ebc,它不使用初始向量(IV)。
ivmode[:iv options]
IV 是一个初始向量,用于不同的加密。IV 模式是 plainessiv:hashivmode of -plain 使用扇区号(加 IV 偏移)作为 IV。ivmode-essiv 是一个避免水位线弱点的增强。
key
加密密钥,以 hex 提供
IV-offset
初始向量(IV)偏移
device
块设备,由文件系统中的设备名称引用,或者由主号和次号引用 majorminor
offset
在该设备中开始映射的偏移
以下是 crypt 目标的示例。
0 2097152 crypt aes-plain 0123456789abcdef0123456789abcdef 0 /dev/hda 0
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.