定义
kpartx是一个Linux命令行程序,作用是从分区表中创建设备映射,即根据磁盘上的分区表信息,在设备映射器中为每个分区生成对应的块设备节点[1]。它的调用形式为kpartx加上若干选项和一个整体磁盘(wholedisk)参数,选项包括添加映射的-a、删除映射的-d、更新映射的-u以及仅列出而不创建映射的-l[4]。
kpartx由util-linux中的partx衍生而来,并被改写为可在klibc环境下编译,因此该工具通常由系统的热插拔机制在设备映射创建和删除时调用。添加映射后,生成的分区设备一般位于/dev/mapper下,命名如loop0p1、loop0p2,可直接用于挂载或文件系统检查[2]。
原理
kpartx的工作基础是Linux的设备映射器(device-mapper)与循环设备(loop device)机制。它先读取目标设备或镜像文件上的分区表,解析出各分区的起始偏移与长度,再为每个分区建立一条linear目标映射,把落在父设备某段扇区范围上的分区表现为一个独立的映射设备[5]。例如对磁盘镜像执行kpartx -av disk.img后,输出形如add map loop1p1 (254:4): 0 409597 linear 7:1 3,其中数字依次表示映射的扇区数、映射类型父设备及偏移[1]。
分区设备被创建后即可作为普通块设备处理:在/dev/mapper/loop1p1之类的节点上可以运行文件系统检查,也可以把它挂载到目录中以访问其中的文件[5]。任务结束后,需要使用kpartx -d删除映射,再分离底层的循环设备[2]。
工具提供同步与异步两种模式:-s模式为默认行为,会等待分区创建完成后再返回;-n模式则在分区尚未创建时即返回[3]。此外,-p用于指定设备名与分区编号之间的分隔字符串,-g可强制按GUID分区表解析,-f则强制创建映射以覆盖no_partitions特性的限制[4]。
用Mermaid表示其处理流程大致如下:读取分区表后判断分区类型,对普通分区生成linear映射,对扩展分区本身不建立映射,最后把映射名称与设备编号写入设备映射表。
发展历程
kpartx最初是作为multipath-tools项目的一部分出现的,该项目由Christophe Varoqui开发并维护,最初的目的是为多路径存储设备自动配置设备映射[1]。在2004年3月的一次内核邮件列表讨论中,Varoqui提到其早期相关工作已经演变成为kpartx,因为他把编译环境移植到了klibc[6]。
2004年10月发布的multipath-tools 0.3.1版本被作者描述为集中整理kpartx的版本,其变更记录包括重新采用getopt、不再映射扩展分区、新增-p选项以允许管理员指定磁盘名与分区号之间的分隔符,以及把分区起始与长度字段由uint改为ulong[7]。同年11月的0.3.7版本中,kpartx增加了在设备映射前置条件不满足时提前退出的处理,并由Patrick Caulfield补充了手册页[8]。
此后kpartx随multipath-tools一同进入各大发行版的软件包,在Debian、Ubuntu、Arch等系统的multipath-tools或独立kpartx包中提供[1][3]。
应用
kpartx最常见的用途是处理磁盘镜像与安装镜像。以Oracle Linux的说明为例,系统管理员可以先用kpartx -l列出镜像中检测到的分区,再用kpartx -a创建对应设备节点,随后挂载其中的分区以查看或修改镜像内容,使用完毕后再用kpartx -d清理映射[5]。
在多路径存储场景中,kpartx与multipath、multipathd配合使用,用于为多路径聚合后的设备提供分区级别的访问入口,也常被initramfs构建过程引用,以便在启动早期处理位于多路径设备上的根文件系统分区。Linux培训材料也把它与losetup并列介绍,指出分区位于循环设备之上时可用kpartx使其可被访问[9]。
该工具需要在具有root权限的条件下运行,并且内核必须启用设备映射器与循环设备支持;在分离循环设备之前应先删除由kpartx建立的映射[2]。
局限
kpartx依赖内核对设备映射的支持,因此需要root权限,并要求内核启用设备映射器和循环设备;若底层设备或镜像的尺寸小于分区表所声明的范围,创建映射会因目标超出设备末尾而失败,内核日志中会出现设备过小无法容纳目标的提示[10][2]。
对扩展分区的处理长期存在限制。早期版本明确选择不映射扩展分区本身,而位于扩展分区内部的逻辑分区需要以相对于扩展分区起点的偏移来建立映射;若仍沿用整盘偏移,则后面的逻辑分区会落在设备范围之外而创建失败[7][11]。这一问题曾在2010年被报告并修复,但在部分发行版的旧版本中仍然存在[12]。
删除映射时的判断也曾带来误删风险。2017年的补丁讨论指出,早期实现会把任何以linear目标映射到某设备上的映射都视为该设备的分区,而LVM逻辑卷等由多段linear映射拼合而成的映射并非单一目标;若按旧逻辑处理,这类映射可能被错误删除,相关修改要求只有单一目标的linear映射才被当作分区[13][14]。此外,分区映射的名称并不总是可靠依据,因为映射名称可以被改动,合法的分区映射也可能不遵循默认的命名形式[14]。
当镜像同时含有无效的GUID分区表和有效的MBR分区表时,工具会按GUID分区表进行映射,可能导致与预期不符的结果[15]。
参见
-
设备映射器 —— kpartx建立分区映射所依赖的内核子系统。
-
multipath-tools —— kpartx所属的软件包。
-
partx —— kpartx所衍生的util-linux工具。
-
循环设备 —— 让镜像文件作为块设备使用,常与kpartx配合。
-
多路径I/O —— kpartx在存储多路径场景中的主要应用方向。
参考资料
- kpartx(8) — kpartx — Debian unstable [引用日期2026-10-14]
- kpartx man | Linux Command Library [引用日期2026-10-14]
- kpartx.8 [引用日期2026-10-14]
- kpartx [引用日期2026-10-14]
- Oracle Linux 6: Administrator's Guide [引用日期2026-10-14]
- iu.edu 上的网页 [引用日期2026-10-14]
- multipath-tools-0.3.1 [引用日期2026-10-14]
- multipath-tools-0.3.7 [引用日期2026-10-14]
- lxk1-en-manual(PDF) [引用日期2026-10-14]
- ubuntu.com 上的网页 [引用日期2026-10-14]
- Bug#586104: fails to map extended partitions [引用日期2026-10-14]
- launchpad.net 上的网页 [引用日期2026-10-14]
- redhat.com 上的网页 [引用日期2026-10-14]
- [dm-devel] [PATCH v2 00/12] fixes for kpartx -d [引用日期2026-10-14]
- viewtopic [引用日期2026-10-14]