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

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

相关文章:

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

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;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#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…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-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…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

OPENCV形态学基础之二腐蚀

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

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#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 位数字。 输…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

学校时钟系统,标准考场时钟系统,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…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

初学 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 评分计…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Mobile ALOHA全身模仿学习

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