Device Mapper 机制详解
Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的 mermaid 框图说明。
一、Device Mapper 原理
Device Mapper 主要作用是将虚拟块设备(/dev/mapper/xxx)映射到一个或多个物理块设备(如 /dev/sda、/dev/sdb),并允许在中间层进行各种功能扩展,例如快照、加密、条带化等。
二、Device Mapper 实现与架构
2.1 核心组件
- dm-mod:Device Mapper 的主内核模块
- dm-ioctl:用户空间与内核空间通信接口
- 映射表(Table):描述虚拟设备与物理设备的映射关系
- Target:具体的功能实现,如 linear、striped、crypt、snapshot 等
2.2 映射原理举例(线性映射,linear mapping)
sequenceDiagramparticipant Userparticipant /dev/mapper/testparticipant dm-modparticipant /dev/sdb1User->>/dev/mapper/test: 发起读写请求/dev/mapper/test->>dm-mod: 通过 ioctl 调用转发请求dm-mod->>dm-mod: 查询映射表,确定映射区域dm-mod->>/dev/sdb1: 实际操作底层块设备
三、内核配置选项
要支持 Device Mapper,内核需打开以下选项:
配置方法(以 menuconfig 为例):
Device Drivers --->Multiple devices driver support (RAID and LVM) ---><*> Device mapper support<*> Crypt target support<*> Snapshot target support<*> Linear target support<*> Striped target support
四、常用工具
- dmsetup:Device Mapper 的通用管理工具
- lvm2:基于 DM 的逻辑卷管理工具
- cryptsetup:基于 DM-crypt 的加密工具
五、操作与测试流程
5.1 创建线性映射设备
-
准备测试数据:
# 假设有两个分区 /dev/sdb1 和 /dev/sdb2,确保未挂载 sudo dd if=/dev/zero of=/dev/sdb1 bs=1M count=100 sudo dd if=/dev/zero of=/dev/sdb2 bs=1M count=100
-
创建映射表文件:
cat > mytable.txt <<EOF 0 204800 linear /dev/sdb1 0 204800 204800 linear /dev/sdb2 0 EOF
解释:将前 100M(204800 = 100M ÷ 512 字节/扇区)映射到 /dev/sdb1,后 100M 映射到 /dev/sdb2
-
加载映射表并创建映射设备:
sudo dmsetup create mytest --table "$(cat mytable.txt)" # mytest 为虚拟设备名,可自定义。无输出表示成功。
-
验证:
sudo dmsetup ls sudo dmsetup info mytest sudo dmsetup table mytest
-
格式化、挂载测试:
sudo mkfs.ext4 /dev/mapper/mytest sudo mkdir -p /mnt/dmtest sudo mount /dev/mapper/mytest /mnt/dmtest sudo dd if=/dev/urandom of=/mnt/dmtest/testfile bs=1M count=10 ls -lh /mnt/dmtest/testfile
-
卸载与删除映射:
sudo umount /mnt/dmtest sudo dmsetup remove mytest
5.2 测试数据
下面以实际操作流程为主线,详细演示 Device Mapper 线性映射的创建、挂载、读写、验证和卸载的关键步骤,并给出每个命令的预期输出。
步骤 1:准备两个测试分区
# 查看可用磁盘
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100GB 0 disk
├─sda1 8:1 0 50GB 0 part /data1
├─sda2 8:2 0 50GB 0 part /data2
sdb 8:16 0 10G 0 disk
├─sdb1 8:17 0 1G 0 part
├─sdb2 8:18 0 1G 0 part
/dev/sdb1
和 /dev/sdb2
为测试分区。
步骤 2:清空分区内容,防止残留数据影响测试
$ sudo dd if=/dev/zero of=/dev/sdb1 bs=1M count=100 status=progress
104857600 bytes (105 MB, 100 MiB) copied, 0.115621 s, 907 MB/s$ sudo dd if=/dev/zero of=/dev/sdb2 bs=1M count=100 status=progress
104857600 bytes (105 MB, 100 MiB) copied, 0.117621 s, 892 MB/s
注意:请确保 /dev/sdb1 和 /dev/sdb2 未挂载,否则会报错。
步骤 3:创建 Device Mapper 映射表
$ cat > mytable.txt <<EOF
0 204800 linear /dev/sdb1 0
204800 204800 linear /dev/sdb2 0
EOF
(204800 = 100M ÷ 512 字节/扇区)
步骤 4:创建映射设备
$ sudo dmsetup create mytest --table "$(cat mytable.txt)"
# 没有输出表示成功
步骤 5:验证映射设备
$ sudo dmsetup ls
mytest (253:0)$ sudo dmsetup info mytest
Name: mytest
State: ACTIVE
Read Ahead: 256
Tables present: LIVE
Open count: 0
Event number: 0
Major, minor: 253, 0
Number of targets: 2$ sudo dmsetup table mytest
0 204800 linear 8:17 0
204800 204800 linear 8:18 0$ ls -l /dev/mapper/mytest
brw-rw---- 1 root disk 253, 0 6月 9 20:01 /dev/mapper/mytest
步骤 6:格式化并挂载虚拟块设备
$ sudo mkfs.ext4 /dev/mapper/mytest
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 409600 4k blocks and 102400 inodes
...
Writing superblocks and filesystem accounting information: done$ sudo mkdir -p /mnt/dmtest$ sudo mount /dev/mapper/mytest /mnt/dmtest$ df -h | grep dmtest
/dev/mapper/mytest 1.6G 6.0M 1.5G 1% /mnt/dmtest
步骤 7:写入测试数据并验证
$ sudo dd if=/dev/urandom of=/mnt/dmtest/testfile bs=1M count=10 status=progress
10485760 bytes (10 MB, 10 MiB) copied, 0.0218467 s, 480 MB/s$ ls -lh /mnt/dmtest/testfile
-rw-r--r-- 1 root root 10M 6月 9 20:05 /mnt/dmtest/testfile# 查看底层物理盘写入情况
$ sudo hdparm -t /dev/sdb1
Timing buffered disk reads: 234 MB in 3.01 seconds = 77.74 MB/sec$ sudo hdparm -t /dev/sdb2
Timing buffered disk reads: 240 MB in 3.03 seconds = 79.21 MB/sec
步骤 8:卸载并删除映射
$ sudo umount /mnt/dmtest$ sudo dmsetup remove mytest$ sudo dmsetup ls
# 没有输出,映射设备已删除
步骤 9:流程总结框图
六、常见问题与调试
- 查看内核模块是否加载:
lsmod | grep dm_
- 查看所有映射设备信息:
sudo dmsetup ls --tree
- 查看映射表详情:
sudo dmsetup table <name>
七、总结
Device Mapper 是 Linux 块设备虚拟化的基石,具有高扩展性和灵活性。通过 dmsetup 等工具可以方便地对存储进行抽象和管理。掌握其原理和操作流程,对理解 LVM、磁盘加密等高级存储功能非常有帮助。
参考链接:
- Device Mapper 官方文档
- dmsetup man page