initrd

目录·基本原理
·initramfs 与 initrd
·End-user implementation





Initrd ramdisk或者""initrd""是指一个临时文件系统,它在启动阶段被 Linux 内核调用。initrd主要用于当 “根”文件系统被挂载之前,进行准备工作。



基本原理

同其他Unix系统一样,Linux操作系统首先要将内核引导入内存。内核驻留于操作系统与应用程序的整个活动周期,其中应用程序(软件)在“用户空间”内运行,位于内核控制之下。
为了使加载内存最小化,一些核心 Linux 程式转化成模组形式,可以动态加载系统中。
initrd 系统中的档案在开机阶段可以被核心存取,里面的内容会被挂载成一个 loop 型态的档案,早期是将 initrd 放在小的软碟片内。initrd 通常被压缩成 gzip 类型,在开机的时候由 bootloader(LILO, GRUB) 来告知核心 initrd 的位置。


initramfs 与 initrd


End-user implementation

核心与 initrd 必须储存在 bootloader 可以存取的位置,通常是在:

root 档案系统内
一个小的 ext2 或 FAT 格式的分割区 (通常挂载到/boot)
TFTP server 内 (系统必须使用网络开机)

bootloader 会将核心与 initrd 加载内存中并将 initrd 的位址传给核心,在开机的最后核心会试着去决定 initrd 的格式
如果 initrd 是档案系统的映像档,则将会被当一个特殊的区块档案(/dev/ram),会被挂载当成 initial root file system, 这个档案系统格式的驱动程式会被静态连结到核心内,许多发行版使用 ext2 格式的 initrd 档案系统,也有些发行版(Debian 3.1)使用 cramfs 格式在一些内存受限的系统上,因为 cramfs 格式被挂载并不需要解压缩。一但 initial root file system 建立,则核心会用 /sbin/init 去执行 /linuxrc 当成第一个程序。在 initramfs 中,核心执行 /init s cript 当成第一个程序。
有一些 Linux 发行版将会建立客制化只包含必要元件的的 initrd 映像档,例如只包含 ATA, SCSI以及档案系统核心模组。
有一些 Linux 发行版(例如 Fefora 或 Ubuntu) 会建立较一般化的 initrd,他们会用装置档来启动档案系统(或是使用 UUID),大部分的装置都在开机阶段来做寻找,如此,开机会造成较复杂的开机挂载档案系统过程:

任何硬件驱动程式的加载与否是在开机时期来决定,一般的作法是将常见的储存装置的核心模组放在 initrd,接着呼叫 hotplug 来决定加载侦测到的硬件所对应的驱动程式。


若是档案系统采用 NFS 方式:

启动主要的网络接口
启动 DHCP 客户端,取得 DHCP lease
取得 NFS server 的位址
挂载 NFS 档案系统




大部分的根档案系统会有 /linuxrc 或 /init 的 s cript 以及包含最小的 shell (通常是 /bin/ash)与一些必要的 user-space 工具程式(通常是 BusyBox 工具),所使用的一些空间用量较小的的函式库(例如用 gcc -Os 选项编译的函式库),例如一些 c 函式库, dietlibc 或 klibc。



Copyright © 1999-2024 C114 All Rights Reserved | 联系我们 | 沪ICP备12002291号-4