菜单

设备映射器补丁

相关源文件

目的与范围

本文档介绍了 Ventoy 如何修补 Linux 设备映射器子系统,以支持直接从 ISO 文件引导 Linux 发行版。设备映射器补丁是 Ventoy 的关键组成部分,它允许 Ventoy 在引导过程中将 USB 驱动器上存储的 ISO 文件作为可引导块设备呈现给 Linux 内核。

有关 Linux 引导过程的整体信息,请参阅 Linux 引导过程

概述

设备映射器是 Linux 内核提供的框架,它提供了一种创建块设备虚拟层的一般方法。Ventoy 需要修补此子系统,因为

  1. ISO 文件作为常规文件存储在 USB 驱动器的文件系统中
  2. Linux 发行版期望从块设备(而非文件)引导
  3. 标准的设备映射器无法直接将文件访问映射到块设备操作

Ventoy 的解决方案结合了内核级补丁和用户空间工具的协同工作。

来源: DMPATCH/dmpatch.c1-31 IMG/cpio/ventoy/hook/ventoy-hook-lib.sh20-33

内核模块

设备映射器补丁的核心是一个内核模块(dm_patch.ko),它挂钩到 Linux 内核的设备映射器子系统。

模块结构

该模块旨在

  1. 查找并修补设备映射器子系统中的特定内核函数
  2. 拦截块 I/O 操作
  3. 将这些操作重定向到访问 ISO 文件中的数据
  4. 处理各种边缘情况,例如不同的扇区大小

来源: DMPATCH/dmpatch.c30-120

补丁机制

内核模块使用内存补丁技术来修改设备映射器的行为

  1. 它使用 kallsyms_lookup_name() 来查找设备映射器函数的内存地址
  2. 它修改这些函数来拦截调用
  3. 它实现了处理基于文件的设备的替代代码路径

这种方法允许 Ventoy 在不重新编译内核的情况下修改核心内核功能。

来源: DMPATCH/dmpatch.c140-250 DMPATCH/readme.txt1-29

用户空间组件

设备映射器补丁的用户空间部分由 shell 脚本和实用程序组成,它们协同工作以设置和配置修补后的设备映射器。

ventoy-hook-lib.sh

此库脚本提供了设备映射器补丁的关键功能

  • ventoy_check_dm_module():验证设备映射器模块是否已加载
  • create_ventoy_device_mapper():为 ISO 创建设备映射器设备
  • create_persistent_device_mapper():根据需要为持久化创建设备映射器

来源: IMG/cpio/ventoy/hook/ventoy-hook-lib.sh199-285

vtoydm 工具

vtoydm 实用程序负责

  1. 读取 ISO 文件在物理 USB 驱动器上的位置
  2. 生成一个设备映射器表,该表将逻辑块映射到物理位置
  3. 配置读取操作的处理方式

vtoydm 所做工作的示例

# Example Device Mapper table generated by vtoydm:
0 2097152 linear /dev/sdb 1024
2097152 4194304 linear /dev/sdb 3098176
# (format: logical_start_sector num_sectors target_type device physical_start_sector)

来源: IMG/cpio/ventoy/hook/ventoy-hook-lib.sh253-254

dmsetup 命令

dmsetup 命令(来自系统或 Ventoy 的捆绑版本)用于

  1. 应用 vtoydm 生成的映射表
  2. 创建虚拟块设备(/dev/mapper/ventoy
  3. 配置设备属性

来源: IMG/cpio/ventoy/hook/ventoy-hook-lib.sh256-261

启动流程

下图说明了设备映射器补丁如何融入 Ventoy Linux 引导过程

来源: IMG/cpio/ventoy/hook/ventoy-hook-lib.sh235-266 IMG/cpio/ventoy/hook/suse/udev_disk_hook.sh1-20

实现细节

设备映射器表创建

设备映射器表通过解析 ISO 文件在磁盘上的位置来创建

  1. vtoydm -p 生成一个映射表,该表将逻辑扇区转换为物理扇区
  2. vtoydm -r 创建一个“原始”映射,以便在需要时直接访问磁盘
  3. 这些表用于创建最终的设备映射器配置

来源: IMG/cpio/ventoy/hook/ventoy-hook-lib.sh253-254

钩子集成

不同的 Linux 发行版可能需要略有不同的钩子脚本。钩子集成遵循此模式

  1. 特定发行版的钩子在早期引导过程中被触发
  2. 钩子源自通用的 ventoy-hook-lib.sh
  3. 钩子调用 ventoy_udev_disk_common_hook 来设置设备映射器
  4. 设备映射器设置完成后,引导过程正常继续

来源: IMG/cpio/ventoy/hook/suse/udev_disk_hook.sh1-27

持久化支持

对于支持持久化的发行版,会创建额外的设备映射器

  1. 如果配置了持久化,则会调用 create_persistent_device_mapper()
  2. 会创建一个单独的设备映射器(vtoy_persistent
  3. 会在 /dev/disk/by-label/ 中创建带有适当标签的符号链接

这允许 Linux 发行版像使用物理分区一样使用持久化存储。

来源: IMG/cpio/ventoy/hook/ventoy-hook-lib.sh266-285 IMG/cpio/ventoy/hook/ventoy-hook-lib.sh491-512

故障排除

当设备映射器补丁无法正常工作时,可能会出现一些问题

  1. 引导过程可能因“缺少根设备”而失败
  2. 系统可能无法挂载 ISO 文件系统
  3. 内核模块可能无法加载

钩子库包含多个调试函数

  • vtlog:记录正常操作
  • vterr:记录错误
  • 各种检查函数,用于验证环境

来源: IMG/cpio/ventoy/hook/ventoy-hook-lib.sh42-58

安全考量

设备映射器补丁需要内核级访问权限,这会带来安全隐患

  1. 内核模块必须与正在运行的内核兼容
  2. 补丁会修改核心内核功能
  3. 实现需要仔细处理错误,以避免系统不稳定

为减轻风险,Ventoy

  • 实现了仔细的错误检查
  • 在无法加载模块时提供替代方案
  • 在卸载模块时恢复原始功能

来源: DMPATCH/dmpatch.c30-45

结论

设备映射器补丁是 Ventoy 架构中的关键组成部分,它使 Linux 发行版能够直接从 ISO 文件启动。通过修补 Linux 内核的设备映射器子系统,Ventoy 创建了一个虚拟块设备,该设备透明地映射到 ISO 文件,从而允许 Linux 发行版像在物理介质上一样启动。

这种方法在保持与广泛的 Linux 发行版的兼容性的同时,无需对这些发行版进行专门针对 Ventoy 的修改。