当前位置: 首页 > news >正文

Device Mapper 机制

Device Mapper 机制详解

Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的 mermaid 框图说明。


一、Device Mapper 原理

Device Mapper 主要作用是将虚拟块设备(/dev/mapper/xxx)映射到一个或多个物理块设备(如 /dev/sda、/dev/sdb),并允许在中间层进行各种功能扩展,例如快照、加密、条带化等。

应用层 IO 请求
虚拟块设备 /dev/mapper/xxx
Device Mapper 内核模块
映射表
底层物理块设备 /dev/sdX

二、Device Mapper 实现与架构

2.1 核心组件

  • dm-mod:Device Mapper 的主内核模块
  • dm-ioctl:用户空间与内核空间通信接口
  • 映射表(Table):描述虚拟设备与物理设备的映射关系
  • Target:具体的功能实现,如 linear、striped、crypt、snapshot 等
Target 驱动
ioctl
读表
Target 驱动
linear
striped
crypt
snapshot
用户空间工具 dmsetup lvm2
Device Mapper 内核模块 dm-mod
映射表
物理块设备

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,内核需打开以下选项:

Device Drivers
Multiple devices driver support RAID and LVM
Device mapper support CONFIG_DM
Device mapper target modules
Linear target CONFIG_DM_LINEAR
Striped target CONFIG_DM_STRIPED
Crypt target CONFIG_DM_CRYPT
Snapshot target CONFIG_DM_SNAPSHOT

配置方法(以 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 的加密工具
管理/创建
创建
管理
创建加密映射
dmsetup
dm-mod
/dev/mapper/xxx
lvm2
cryptsetup

五、操作与测试流程

5.1 创建线性映射设备

  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
    
  2. 创建映射表文件:

    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

  3. 加载映射表并创建映射设备:

    sudo dmsetup create mytest --table "$(cat mytable.txt)"
    # mytest 为虚拟设备名,可自定义。无输出表示成功。
    
  4. 验证:

    sudo dmsetup ls
    sudo dmsetup info mytest
    sudo dmsetup table mytest
    
  5. 格式化、挂载测试:

    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
    
  6. 卸载与删除映射:

    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 69 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 69 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:流程总结框图
准备 /dev/sdb1 和 /dev/sdb2
清空数据
生成映射表 mytable.txt
dmsetup create mytest
mkfs.ext4 格式化
挂载到 /mnt/dmtest
dd 写入 10M 随机数据
ls/df 验证
umount 卸载
dmsetup remove mytest

六、常见问题与调试

  • 查看内核模块是否加载:
    lsmod | grep dm_
  • 查看所有映射设备信息:
    sudo dmsetup ls --tree
  • 查看映射表详情:
    sudo dmsetup table <name>

七、总结

Device Mapper 是 Linux 块设备虚拟化的基石,具有高扩展性和灵活性。通过 dmsetup 等工具可以方便地对存储进行抽象和管理。掌握其原理和操作流程,对理解 LVM、磁盘加密等高级存储功能非常有帮助。


参考链接:

  • Device Mapper 官方文档
  • dmsetup man page

相关文章:

  • 统计学(第8版)——统计抽样学习笔记(考试用)
  • 如何用AI写论文、做科研,AMiner沉思一站式辅助
  • Python 中的加密库:守护数据安全的利刃
  • @Transactional 什么情况下会失效
  • 用HTML5+CSS3+JavaScript实现找不同游戏
  • RocketMQ 重试机制详解及最佳实践
  • 【DAY44】预训练模型
  • 网格三面角,散射过程推导
  • Origin图像数字化工具——如何复制其他人的图表作为对比数据
  • nacos开启鉴权密码登录
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
  • 回溯算法学习
  • [25-cv-61102]SMG律所代理Fanatics 体育用品商标维权案
  • CppCon 2015 学习:The Birth of Study Group 14
  • Rougamo.Fody 实现一个AOP日志
  • 简单介绍C++中 string与wstring
  • EZDML:一款国产免费的数据库建模工具
  • 十一(3) 类,加深对拷贝构造函数的理解
  • 【求出100~500之间所有每位数的乘积大于每位数的和的数。】2022-4-16
  • C语言中提供的第三方库之哈希表实现
  • 单位建网站的优势/重庆seo网站系统
  • 唐山高端网站建设/护肤品营销策划方案
  • 新网站如何做测试/免费优化网站
  • 个人网站备案后做游戏/北京seo排名优化网站
  • jwplayer wordpress/石家庄seo关键词
  • dedecms 网站根目录/seo优化sem推广