菜单

Linux 启动过程

相关源文件

本页面详细介绍了 Ventoy 如何从 ISO 文件启动基于 Linux 的发行版。它解释了启动链过程、操作系统类型检测、发行版特定的钩子,以及 Ventoy 如何使用 Linux 设备映射器将 ISO 内容呈现为可启动文件系统。有关 Windows 启动过程的信息,请参阅 Windows 启动流程

概述

Ventoy 使用复杂的链式加载过程从 ISO 文件启动 Linux 发行版。与需要提取 ISO 文件的传统引导加载程序不同,Ventoy 通过其专门的 Linux 启动流程实现了直接 ISO 启动。

来源:IMG/cpio/ventoy/ventoy_chain.sh1-492

链式加载过程

当从 Ventoy 启动菜单中选择一个 Linux ISO 时,系统会启动 ventoy_chain.sh,它作为负责 Linux 启动过程的主要脚本。

启动过程步骤

  1. 内核参数解析:Ventoy 首先解析 /proc/cmdline 中的内核参数,以识别任何用户指定的启动选项。
  2. 操作系统类型检测:系统识别特定的 Linux 发行版类型。
  3. 操作系统特定钩子执行:根据检测到的操作系统,Ventoy 执行专门的钩子脚本。
  4. Live 注入:如果已配置,可以将其他文件注入到 live 环境中。
  5. 调试检查:检查可选的调试暂停点。
  6. Init 移交:将控制权转移给实际的 Linux init 进程。

来源:IMG/cpio/ventoy/ventoy_chain.sh20-491

操作系统类型检测

Ventoy Linux 启动过程的关键组成部分是操作系统检测机制,它决定了正在启动的特定 Linux 发行版。

ventoy_chain.sh 中的 ventoy_get_os_type() 函数使用了多种检测方法

  1. 来自 /proc/version 的内核版本信息
  2. 发行版特定的文件和目录
  3. /etc/os-release 中的特殊条目
  4. 内核命令行参数

此函数返回一个字符串标识符(例如,“debian”,“rhel7”,“arch”),用于确定将执行哪个钩子脚本。

来源:IMG/cpio/ventoy/ventoy_chain.sh45-394

支持的 Linux 发行版

Ventoy 可以检测并启动各种 Linux 发行版。下表显示了一些主要发行版及其检测方法

发行版检测方法钩子脚本
Debian/Ubuntu检查内核版本中是否有“debian”或“ubuntu”debian/ventoy-hook.sh
RHEL/CentOS 7/8/9检查内核版本中是否有“el7”、“el8”、“el9”rhel7/ventoy-hook.sh
Arch Linux检查内核版本中是否有“archlinux”或“ARCH”arch/ventoy-hook.sh
SUSE检查内核版本中是否有“SUSE”suse/ventoy-hook.sh
Fedora检查内核版本中是否有“.fc[0-9][0-9].”rhel7/ventoy-hook.sh
Gentoo检查内核版本中是否有“gentoo”gentoo/ventoy-hook.sh
Alpine检查内核版本中是否有“Alpine”alpine/ventoy-hook.sh
TrueNAS检查内核版本中是否有“truenas”debian/truenas-hook.sh

来源:IMG/cpio/ventoy/ventoy_chain.sh45-394 IMG/cpio/ventoy/hook/debian/ventoy-hook.sh22-121

发行版特定的钩子

在操作系统检测之后,Ventoy 会执行特定于发行版的钩子脚本,以使启动过程适应特定的 Linux 发行版。

这些钩子执行各种发行版特定的任务

  1. 引导参数修改:调整内核参数以正确识别 ISO
  2. 设备映射:为 ISO 文件设置适当的设备映射
  3. 文件系统挂载:确保正确挂载 ISO
  4. Init 脚本修补:修改 init 脚本以识别 Ventoy 环境

来源:IMG/cpio/ventoy/ventoy_chain.sh397-401 IMG/cpio/ventoy/hook/rhel7/ventoy-hook.sh1-198 IMG/cpio/ventoy/hook/debian/ventoy-hook.sh1-138

RHEL/CentOS/Fedora 钩子示例

对于基于 Red Hat 的发行版(包括 RHEL、CentOS 和 Fedora),Ventoy 的钩子脚本执行多项关键操作

  1. Kickstart 支持:处理用于自动化安装的 kickstart 文件
  2. 持久化存储:如果配置了,为持久化存储设置 overlayfs
  3. 设备识别:确保 ISO 被正确识别为安装介质
  4. 仓库设置:配置用于网络安装的安装仓库

来源:IMG/cpio/ventoy/hook/rhel7/ventoy-hook.sh1-198 IMG/cpio/ventoy/hook/rhel7/ventoy-inotifyd-hook.sh1-89

Debian/Ubuntu 钩子示例

对于 Debian 系列发行版,钩子脚本处理

  1. 子发行版检测:进一步识别特定的 Debian 派生发行版
  2. ISO 挂载:设置适当的 ISO 挂载点
  3. Debconf 集成:处理预种子安装
  4. 引导参数调整:调整引导参数以正确识别 ISO

来源:IMG/cpio/ventoy/hook/debian/ventoy-hook.sh1-138 IMG/cpio/ventoy/hook/debian/truenas-hook.sh1-27 IMG/cpio/ventoy/hook/debian/truenas-disk.sh1-53 IMG/cpio/ventoy/hook/debian/truenas-bottom.sh1-26

设备映射器集成

Ventoy Linux 启动过程的关键组成部分是设备映射器集成,它将 ISO 文件作为块设备呈现给 Linux 内核。

过程如下:

  1. Ventoy 检测包含 ISO 文件的分区
  2. 钩子脚本执行 udev_disk_hook.sh 来设置设备映射器
  3. dmsetup 创建一个映射到 ISO 文件的虚拟块设备 /dev/ventoy
  4. Linux 发行版使用此块设备启动,如同它是一个物理安装介质

这种方法允许 Linux 安装程序或 live 系统在无需先提取的情况下访问 ISO 文件内容。

来源:IMG/cpio/ventoy/hook/rhel7/ventoy-inotifyd-hook.sh28-82 IMG/cpio/ventoy/hook/ventoy-os-lib.sh1-173

基于 Inotify 的磁盘检测

对于许多发行版,Ventoy 使用 Linux 的 inotify 机制来检测 Ventoy 分区何时在系统中可用。

该过程包括

  1. 发行版的 init 系统启动 inotifyd 守护进程来监视设备创建
  2. 检测到 Ventoy 分区时,会触发钩子脚本
  3. 钩子脚本设置设备映射器并创建必要的设备节点
  4. 执行发行版特定的脚本来处理挂载的 ISO

这种方法确保 Ventoy 设备能够正确设置,而不管在启动过程中何时发生硬件检测。

来源:IMG/cpio/ventoy/hook/rhel7/ventoy-inotifyd-hook.sh1-89 IMG/cpio/ventoy/hook/mageia/ventoy-inotifyd-hook.sh1-71 IMG/cpio/ventoy/hook/gobo/ventoy-inotifyd-hook.sh1-40

特殊情况和特定发行版处理

Ventoy 为许多具有独特启动要求的 Linux 发行版提供了特殊的处理。

TrueNAS 启动过程

TrueNAS 需要对 ISO 挂载进行特殊处理

  1. 钩子脚本修补 init 进程
  2. 使用基于 FUSE 的 ISO 挂载系统
  3. ISO 挂载在 /dev/mapper/ventoy
  4. 然后将挂载提供给 TrueNAS 安装程序

来源:IMG/cpio/ventoy/hook/debian/truenas-hook.sh1-27 IMG/cpio/ventoy/hook/debian/truenas-disk.sh1-53 IMG/cpio/ventoy/hook/debian/truenas-bottom.sh1-26

嵌入式和容器化系统

对于 EWE(嵌入式工作站环境)等专业 Linux 发行版

  1. 自定义钩子脚本检测特定环境
  2. 执行特殊的磁盘链接以匹配预期的设备路径
  3. 基于 LABEL 的设备访问被正确重定向到 Ventoy 设备

来源:IMG/cpio/ventoy/hook/ewe/ventoy-hook.sh1-26 IMG/cpio/ventoy/hook/ewe/ventoy-disk.sh1-76

最终 Init 移交

在所有准备工作完成后,Ventoy 将控制权移交给 Linux 发行版的本地 init 系统。

移交过程

  1. Ventoy 卸载 /proc 并清理环境变量
  2. 它会检查持久化配置,并在需要时设置环境变量
  3. 它会在标准位置搜索有效的 init 二进制文件(/init/sbin/init/linuxrc
  4. 如果存在特定于操作系统的 pre-init 钩子,则会执行该钩子
  5. 使用 exec 将控制权转移给真正的 init 进程

这种谨慎的移交确保了 Linux 发行版正常启动,而不会意识到它是从 ISO 文件而不是物理介质运行的。

来源: IMG/cpio/ventoy/ventoy_chain.sh452-491

结论

Ventoy 的 Linux 启动过程是一个复杂的系统,它允许直接从 ISO 文件启动,而无需进行解压。通过检测 Linux 发行版类型,应用适当的钩子(hooks),并设置必要的设备映射,Ventoy 为广泛的 Linux 发行版提供了一个无缝的启动体验。

这种方法带来了几项优势:

  • 无需解压 ISO 内容即可启动
  • 支持跨重启的持久化存储
  • 能够从单个设备启动多个发行版
  • 支持通过 kickstart/preseed 进行自动化安装

操作系统检测、发行版特定的钩子以及设备映射器的集成相结合,使 Ventoy 能够支持各种 Linux 发行版,同时保持一致的用户体验。