详解initramfs、mkinitrd 和 dracut

1,915 阅读4分钟

在Linux系统中,initramfsmkinitrddracut 都是与系统启动过程密切相关的工具。它们用于生成引导系统时所需的初始环境,用于加载必要的驱动程序和挂载根文件系统。在启动过程中,它们帮助系统完成从引导加载程序到完全加载操作系统的过渡。

1. initramfs(初始内存文件系统)

概述:

initramfs 是一种被引导加载程序加载到内存中的 cpio 压缩包,它作为系统启动过程中临时使用的根文件系统,包含启动所需的基本驱动程序和脚本。

  • 它在系统启动的早期阶段使用,主要任务是加载必要的内核模块、挂载根文件系统,并将控制权交给实际的操作系统。
  • initramfs 是一个 存储在内存中的文件系统映像,在启动时解压缩到RAM中。

主要特性:

  • 嵌入内核:有时,initramfs 直接内嵌在内核中。
  • 替代 initrd:initramfs 是 initrd 的现代替代,因其更灵活且效率更高。
  • CPIO 压缩包格式:与 initrd 不同,initramfs 不是文件系统映像,而是 cpio 格式的压缩包。
  • 直接执行:内核可以直接执行 initramfs 中的内容,无需挂载。

使用场景:

大多数现代 Linux 发行版默认使用 initramfs

2. mkinitrd

概述:

mkinitrd 是一个较旧的工具,用于生成 initrd(初始内存磁盘)initramfs 映像。它主要用于在系统启动时创建一个内存磁盘映像,其中包含用于挂载根文件系统所需的驱动模块。

  • 它生成一个小型的可引导内存磁盘映像,包含启动时加载驱动程序所需的内核模块和脚本。
  • initrd 是引导加载程序在启动时加载到内存中的文件。

主要特性:

  • 旧工具:mkinitrd 主要用于较早的 Linux 发行版,创建 initrd 或 initramfs。
  • 可定制:mkinitrd 允许用户将自定义驱动程序和文件包含在初始内存磁盘中。
  • 模块化:它允许用户选择性地包含特定的内核模块,用于系统启动。

使用场景:

现代 Linux 系统已大部分用 dracutinitramfs-tools 替代 mkinitrd,但它在某些老旧系统中仍可使用。

命令示例:

mkinitrd /boot/initrd-$(uname -r).img $(uname -r)

3. dracut

概述:

dracut 是一个现代化的工具,用于生成 Linux 内核启动时使用的 initramfs。与旧工具相比,dracut 更加灵活和模块化。

  • 不同于 mkinitrd 仅创建一个包含启动所需驱动程序的最小环境,dracut 会生成一个完整的、模块化的 initramfs 映像,包含多种内核模块和脚本,以支持几乎所有系统配置。
  • dracut 动态生成 initramfs,根据当前系统的需求来构建 initramfs,使其比 mkinitrd 更加灵活。

主要特性:

  • 模块化系统:不同的 dracut 模块会根据系统需求被包含或排除。
  • 动态生成:initramfs 会根据系统配置动态生成。
  • 广泛支持:支持多种复杂的配置,例如 LVM、加密文件系统、网络启动等。
  • 处理复杂启动设置:可以处理 RAID、LVM、加密分区、网络启动等复杂场景。

使用场景:

dracut 是现代 Linux 发行版的默认工具,包括 Fedora、Red Hat、SUSE 和 OpenSUSE 等。

命令示例:

dracut --force /boot/initramfs-$(uname -r).img $(uname -r)

关键区别

特性initramfsmkinitrddracut
目的提供一个初始的RAM文件系统(有时嵌入到内核中)。创建用于启动系统的 initrdinitramfs根据系统需求动态生成 initramfs
灵活性静态,通常需要手动包含模块。旧系统中使用,手动包含驱动程序。高度模块化,自动包含所需模块。
模块化模块化有限。模块化有限,需要更多手动操作。高度模块化,使用系统需求动态加载模块。
使用场景现代 Linux 发行版中的默认文件系统。旧版 Linux 系统中使用。现代 Linux 系统中的默认工具。
文件系统使用 cpio 压缩包格式。传统上使用压缩文件系统(initrd)。使用 cpio 压缩包格式,并自动加载所需驱动。
内核版本用于较新版本的 Linux 内核。用于旧版 Linux 系统。现代 Linux 发行版的默认工具。
高级功能用于基本的系统启动。基本支持挂载文件系统和加载驱动。支持 LVM、RAID、加密分区和网络启动等复杂配置。

实际使用

  1. 使用 Dracut 创建 Initramfs

    dracut --force /boot/initramfs-$(uname -r).img $(uname -r)
    
  2. 使用 mkinitrd(旧工具)创建 Initrd

    mkinitrd /boot/initrd-$(uname -r).img $(uname -r)
    

总结:

  • initramfs:在启动时使用的实际初始文件系统,加载到内存中,是 initrd 的现代替代品。
  • mkinitrd:旧工具,用于生成初始内存磁盘(initrd)或 initramfs,大多数已被 dracut 取代。
  • dracut:现代的、灵活的工具,动态生成 initramfs,是现代 Linux 系统中的默认工具。