Device Mapper 机制

news2025/12/14 13:11:33

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)

sequenceDiagram
    participant User
    participant /dev/mapper/test
    participant dm-mod
    participant /dev/sdb1

    User->>/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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2407428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…