附录 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
lineardevice offset
start
- 在虚拟设备中启动块
length
- 这个片段的长度
device
- 块设备,由文件系统中的设备名称引用,或者由主号和次号引用
major
:minor
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
每个条带都有一组
device
和 offset
参数。
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
mirrorlog_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 快照时,会使用四个设备映射器设备:
- 具有
线性映射的设备
,其中包含源卷的原始映射表。 - 具有
线性映射的设备
用作源卷的写时复制(COW)设备;对于每个写入,原始数据保存在每个快照的 COW 设备中,以便其可见的内容保持不变(忽略 COW 设备填满)。 - 具有组合了 #1 和 #2
的快照
映射的设备,这是可见的快照卷。 - "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-originorigin
start
- 在虚拟设备中启动块
length
- 这个片段的长度
origin
- 快照卷
snapshot-origin
通常会基于它有一个或多个快照。读取将直接映射到后备设备。对于每个写入,原始数据将保存在每个快照的 COW 设备中,以便其可见的内容保持不变,直到 COW 设备填满为止。
快照
目标的格式如下:
start length
snapshotorigin COW-device
P|Nchunksize
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 元数据失败时,它可以用作中间目标。
错误
映射目标除了 start 和 length 参数之外不需要额外的参数。
以下示例显示了
错误
目标。
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
- 路径的块设备号,由主号和次号引用,格式为
major
:minor
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
cryptcipher 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 模式是
plain
或essiv:hash
。ivmode
of-plain
使用扇区号(加 IV 偏移)作为 IV。ivmode
的-essiv
是一个避免水位线弱点的增强。
key
- 加密密钥,以 hex 提供
IV-offset
- 初始向量(IV)偏移
device
- 块设备,由文件系统中的设备名称引用,或者由主号和次号引用
major
:minor
offset
- 在该设备中开始映射的偏移
以下是
crypt
目标的示例。
0 2097152 crypt aes-plain 0123456789abcdef0123456789abcdef 0 /dev/hda 0