土法炼钢兴趣小组的算法知识备份

【操作系统百科】initramfs

文章导航

分类入口
os
标签入口
#initramfs#dracut#switch-root#uki#early-userspace

目录

内核不可能编译进所有存储驱动——NVMe、RAID 控制器、LUKS 加密、LVM 的驱动从哪来?答案是 initramfs:一个临时的根文件系统,提供启动必需的模块和工具。

一、先看图

flowchart LR
    BL[Bootloader] -->|加载| KERNEL[vmlinuz]
    BL -->|加载| INITRD[initramfs.img<br/>cpio 归档]
    KERNEL --> UNPACK[解包 initramfs<br/>到 rootfs]
    UNPACK --> INIT_E[/init 脚本<br/>加载驱动/解密]
    INIT_E --> MOUNT[mount 真正 rootfs]
    MOUNT --> SWITCH[switch_root<br/>切换到真 root]
    SWITCH --> PID1[PID 1<br/>systemd]

    classDef early fill:#f0883e22,stroke:#f0883e,color:#adbac7;
    classDef final fill:#3fb95022,stroke:#3fb950,color:#adbac7;
    class BL,KERNEL,INITRD early
    class UNPACK,INIT_E,MOUNT,SWITCH early
    class PID1 final

二、为什么需要 initramfs

内核 vmlinuz 不能包含所有驱动 → root 文件系统可能在:

initramfs 提供这些模块 + 必要的用户态工具。

三、格式

initramfs 是 cpio 归档(可能 gzip/xz/zstd 压缩):

# 查看内容
lsinitramfs /boot/initramfs-$(uname -r).img

# 手动解包
mkdir /tmp/initrd && cd /tmp/initrd
zcat /boot/initramfs-$(uname -r).img | cpio -idmv

四、/init 脚本

initramfs 中的 /init(或 systemd):

  1. 加载必要的内核模块
  2. 检测并激活 RAID/LVM
  3. 解密 LUKS
  4. mount 真正的 root 文件系统
  5. switch_root 切换

五、dracut

Fedora/RHEL/SUSE 使用 dracut 生成 initramfs:

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

5.1 模块化

dracut --list-modules
# base, bash, dm, lvm, luks, network, nfs, ...

每个 dracut 模块提供特定功能的脚本和工具。

5.2 配置

# /etc/dracut.conf.d/custom.conf
add_dracutmodules+=" lvm dm "
compress="zstd"

六、mkinitramfs / mkinitcpio

Debian 用 mkinitramfs,Arch 用 mkinitcpio——功能类似,生态不同。

七、Unified Kernel Image(UKI)

UKI = UEFI stub + 内核 + initramfs + 命令行 + 签名

一个文件 → UEFI 直接启动 → Secure Boot 签名覆盖全部。

# systemd-ukify 构建
ukify build \
  --linux /boot/vmlinuz \
  --initrd /boot/initrd.img \
  --cmdline "root=/dev/sda2" \
  --output /boot/efi/EFI/Linux/linux.efi

八、switch_root

// util-linux: switch_root
mount(new_root, "/", NULL, MS_MOVE, NULL);
chroot(".");
chdir("/");
// exec real init
execv("/sbin/init", argv);

关键:switch_root 删除 initramfs 中的所有文件 → 释放内存 → exec PID 1。

九、观察

# 当前 initramfs
ls -lh /boot/initramfs-$(uname -r).img

# 内容
lsinitramfs /boot/initramfs-$(uname -r).img | head -20

# 启动日志中的 initramfs 阶段
dmesg | grep -i "initramfs\|switch_root\|Trying to unpack"

# dracut 重新生成
dracut --force --verbose

十、小结


参考文献

工具


上一篇启动流程 下一篇ELF 加载

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-05-06 · os

【操作系统百科】内核内存调试

内核内存 bug 是最难追的:UAF、OOB、double free、leak 都可能沉默数月。本文讲 KASAN 三种模式、KFENCE 生产采样、kmemleak、SLUB_DEBUG、UBSAN/KCSAN 联动。

2026-05-08 · os

【操作系统百科】VFS 四层抽象

Linux 的一切皆文件靠 VFS 实现——superblock、inode、dentry、file 四层抽象加 ops 表。本文讲 VFS 核心数据结构、dcache、inode cache、RCU lookup,以及文件系统如何插入 VFS。

2026-04-22 · os

操作系统百科

Linux 6.x 视角下的操作系统系列索引:110 篇覆盖调度、虚拟内存、文件系统与 I/O、并发、隔离、可观测性,按主题、阅读路径与关键问题三种入口组织。

2026-05-27 · os

【操作系统百科】用户态分配器:jemalloc vs tcmalloc

jemalloc 与 tcmalloc 都想解决多线程分配器的老问题:锁争抢、碎片、RSS 膨胀与回收抖动。但两者把优化重点放在了不同位置:tcmalloc 更激进地把热路径推到 per-CPU,jemalloc 则把 arena、extent、decay 和 profiling 做成了一套更完整的内存治理工具箱。


By .