dmsetup

关注
义项:Linux 设备映射管理命令
dmsetup

dmsetup是Linux系统上用于管理设备映射(device-mapper)逻辑设备的命令行工具,属于LVM2项目提供的用户空间程序。它通过向内核的设备映射驱动装载映射表,按 512 字节扇区为单位描述逻辑设备每一段区域对应哪个底层设备以及采用何种映射类型,从而完成逻辑设备的创建、挂起、恢复、重命名与删除。LVM2、软件 RAID、磁盘加密与多路径等功能都以设备映射机制为基础,dmsetup则提供了直接操作这一底层接口的手段。

百科 图文
目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

dmsetup是Linux系统下管理逻辑设备的命令行工具,这些逻辑设备由内核中的设备映射(device-mapper)驱动提供支持[1]。它的名称来自 device mapper setup 的缩写,手动页面将其功能概括为“低层逻辑卷管理”,即绕开上层的卷管理套件,直接与设备映射驱动交互[2]。

调用时第一个参数是子命令,第二个参数是逻辑设备名或它的 UUID;设备并非由 dmsetup 自行维护,而是通过在内核中装载一张映射表来创建[3]。映射表把逻辑设备的地址空间逐段指派给某个目标(target),每段的描述都精确到 512 字节的扇区,因此它描述的是逻辑地址到物理地址的对应关系,而不是文件系统层面的操作。

原理

设备映射驱动的核心概念是映射设备(mapped device)、映射表和目标设备(target device)。映射设备是内核对外呈现的逻辑块设备,它靠映射表与一个或多个目标设备建立联系;目标设备则是逻辑空间实际落到的物理区段[4]。逻辑设备中的每一段由映射表的一行描述,行内依次给出逻辑起始扇区、扇区数量、目标类型与目标参数,合起来构成多元组 $\langle logical\_start\_sector, num\_sectors, target\_type, target\_args \rangle$[1]。

dmsetup的工作方式与内核分工明确:用户空间负责制定策略、构造并保存映射表,内核只提供完成映射的机制。内核按目标类型加载对应的 target 驱动插件,由插件对经过的 I/O 请求进行过滤或重定向;逻辑设备在映射表中可以指向其他映射设备,从而形成一棵可迭代的设备树[4]。

映射表支持的简单目标类型包括 linear 与 striped:前者把逻辑区段线性地接续到某个目标设备上,后者把区段按指定的条带数量与块大小交替分散到多个设备。error 目标让落在该区域的 I/O 全部返回错误,zero 目标在读取时返回全零并静默丢弃写入的数据,两者常用于测试或制作带空洞的设备[3]。更复杂的目标还包括 mirror、snapshot、thin 与 thin-pool、cache、crypt、raid、multipath、delay 和 flakey 等[1]。

设备的创建与启用分两步:create 子命令会创建指定名称的设备,若提供了表或表文件就把它装载并立即生效,否则从标准输入读取映射表,除非使用 --notable;装载成功后,活动设备会出现为 /dev/mapper/ 下的节点[1]。load 与 reload 把映射表写入设备的非活动表槽位,suspend 使设备暂停——已映射但未完成的 I/O 会被冲刷,之后到达的 I/O 则被推迟——resume 再解除暂停,此时非活动表转为活动表,被推迟的 I/O 重新排队处理[5]。

发展历程

dmsetup最初由乔·索恩伯(Joe Thornber)开发。其手动页面的最早版本记录于 2001 年 11 月 29 日,当时它已具备 create、remove、suspend、resume、reload、info 等基本子命令,映射表也只支持 linear、striped 和 io-err 三种简单目标类型[6]。

设备映射本身是 Linux 2.6 内核起引入的组件,用于支持逻辑卷管理,LVM2 与企业卷管理系统 EVMS 都依赖它[7]。较早期的 LVM 并未使用这一机制。随着机制从 LVM 中独立出来,条带、镜像、快照和多种 RAID 功能也可以用在普通磁盘分区、回环设备等其他块设备上[8]。

dmsetup 与 libdevmapper 库的用户空间源码后来并入 LVM2 源码包,与 LVM2 一同发布维护,而不再作为独立项目[7]。此后其子命令持续扩充,逐步加入 wipe_table、splitname、mangle、measure、stats 以及用于与 udev 同步的一组 udev 相关子命令[3]。

应用

dmsetup最常见的用途是直接创建和管理映射设备,例如用 linear 目标把多块磁盘首尾相接拼成一个大逻辑设备,或用 striped 目标把逻辑区段分散到多块盘上以提升吞吐[3]。它同时承担查询与诊断职能:ls 列出设备名,info 显示设备状态、活动表与非活动表是否存在、打开引用计数、事件序号、主次设备号以及活动表中的目标数量,table 则以可再次输入的格式输出当前映射表[1]。

在系统集成方面,dmsetup 提供与 udev 的同步机制。udevcreatecookie 生成用于同步的 cookie,udevreleasecookie 等待相关 udev 处理结束后清理该 cookie,udevcomplete 则唤醒等待中的进程;这些 cookie 是系统范围内、以固定字节为前缀的信号量[1]。mknodes 子命令用于校正或补齐 /dev/mapper 下的设备节点,使其与内核当前装载的映射设备一致[5]。

由于设备映射是LVM2、软件 RAID 与磁盘加密等功能的共同底座,这些上层工具最终都要通过设备映射接口创建和操作映射设备。dmsetup既是这一底层接口的直接入口,也是排查相关问题时的常用手段,脚本和自动化流程同样可以借助它完成设备的创建、查询与拆除[1]。

局限

dmsetup属于低层工具,本身不提供卷组、文件系统等高层抽象。要使用它,操作者必须自行计算起始扇区、扇区数量和目标参数,并自行保存映射信息以便日后重建;而 LVM、cryptsetup 等上层工具会把用户与这些细节隔开[8]。手动页面也提示,LVM 生成设备名的编码方式可能在不另行通知的情况下改变,因此解码应始终使用当前版本的 splitname 命令[5]。

设备的拆除存在限制:被打开的映射设备无法直接删除,只有使用 --force 才会把映射表替换为一张让所有 I/O 失败的表;--deferred 可以启用延迟删除,让设备在最后一个使用者关闭后消失,这一特性需要内核 3.13 中版本 4.27.0 的设备映射驱动支持[1]。remove_all 会尝试清除全部设备定义,等同于重置驱动,手动页面明确提醒要谨慎使用[5]。

在输出层面,crypt 与 integrity 目标的映射表默认会隐去真实密钥,只有加上 --showkeys 才会显示;以冒号开头的内核密钥引用不受该参数影响,始终会被输出[1]。此外,--inactive 这类选项依赖较新的内核驱动版本,例如报告的为非活动表而非活动表时需要 4.16.0 及以上版本的驱动[3]。

参见

  • 设备映射 —— dmsetup 所管理的逻辑设备由这一内核机制提供。

  • LVM2 —— 逻辑卷管理套件,设备映射的用户空间源码与其一同维护发布。

  • libdevmapper —— 对设备映射 ioctl 接口进行封装的用户空间库,dmsetup 建立在其之上。

  • udev —— 负责设备节点管理的系统组件,dmsetup 提供多个子命令与其同步。

  • dmstats —— 与 dmsetup stats 子命令配合使用的设备映射 I/O 统计工具。

  • dm-crypt —— 基于设备映射实现的块设备透明加密目标。

参考资料

  1. dmsetup(8) — Linux manual page [引用日期2026-10-14]
  2. dmsetup(8) - Updated: 2025/Dec/31 [引用日期2026-10-14]
  3. dmsetup [引用日期2026-10-14]
  4. Linux 内核中的 Device Mapper 机制 [引用日期2026-10-14]
  5. dmsetup.8.en [引用日期2026-10-14]
  6. dmsetup.8 [引用日期2026-10-14]
  7. Device-mapper Resource Page [引用日期2026-10-14]
  8. Device Mapper – Wikipedia [引用日期2026-10-14]
词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T18:36:09Z

历史版本

本条目引用的词条
设备映射 LVM2 libdevmapper udev dmstats dm-crypt