Linux基础知识 ·

initramfs说明与创建

initramfs 说明

initramfs 的目的在于提供开机过程中所需要的最重要内核模块,以让系统开机过程可以顺利完成。会需要initramfs的原因,是因为内核模块放置于 /lib/modules/$(uname -r)/kernel/ 当中,这些模块必须要根目录 (/) 被挂载时才能够被读取。但是如果核心本身不具备磁盘的驱动程序时,当然无法挂载根目录,也就没有办法取得驱动程序,因此造成两难的地步。

initramfs 可以将 /lib/modules/.... 内的『开机过程当中一定需要的模块』包成一个文件 (文件名就是initramfs),然后在开机时通过主机的 INT 13 硬件功能将该文件读出来解压缩,并且 initramfs 在记内存中会模拟成为根目录,由于此虚拟文件系统 (Initial RAM Disk) 主要包含磁盘与文件系统的模块,因此我们的内核最后就能够认识实际的磁盘,那就能够进行实际的根目录的挂载了!

所以:『initramfs 内所包含的模块大多是与开机过程有关,而主要以文件系统及磁盘模块 (如usb, SCSI等) 为主』的!

一般来说,需要 initramfs 的时刻为:

  • 根目录所在磁盘为 SATA、USB 或SCSI 等接口;
  • 根目录所在文件系统为 LVM, RAID 等特殊格式;
  • 根目录所在文件系统为非传统 Linux 认识的文件系统时;
  • 其他必须要在内核载入时提供的模块。

创建 initramfs 文件

一般来说,各 distribution 提供的内核都会附上initramfs 文件,但如果有特殊需要所以想重制 initramfs 文件的话, 可以使用 dracut / mkinitrd 来处理的。这个文件的处理方式很简单, man dracut 或 man mkinitrd 就知道了!

CentOS 7 应该要使用 dracut ,不过 mkinitrd 还是有保留下来,两者都可以用!

mkinitrd [-v] [--with=模块名称] initrd文件名 内核版本

常用选项:

-v :显示 mkinitrd 的运行过程

--with=模块名称:模块名称指的是模块的名字而已,不需要填写文件名。举例来说,目前内核版本的 ext3 文件系统模块为底下的文件名:/lib/modules/$(uname -r)/kernel/fs/ext3/ext3.ko

那你应该要写成: --with=ext3 就好了 (省略 .ko)

initrd文件名:你所要创建的 initrd 文件名,尽量取有意义又好记的名字。

内核版本 :某一个核心的版本,如果是目前的核心则是『 $(uname -r) 』

范例:以 mkinitrd 的默认功能创建一个 initrd 虚拟磁盘文件

 


dracut [-fv] [--add-drivers列表] initramfs文件名内核版本

常用选项:

-f :强迫编译出initramfs ,如果initramfs 文件已经存在,则覆盖掉旧文件

-f :显示dracut 的运作过程

--add-drivers 列表:在原本的预设内核模块中,增加某些你想要的模块!模块位于内核所在目录/lib/modules/$(uname -r)/kernel/*

initramfs 文件名:就是你需要的文件名!开头最好就是 initramfs,后面接版本与功能便于识别。

内核版本:预设当然是目前运作中的内核版本,不过你也可以手动输入其他不同版本!

--modules :将 dracut 所提供的开机所需模块(内核核心模块) 载入,可用模块在此目录内 /usr/lib/dracut/modules.d/

--gzip|--bzip2|--xz:尝试使用哪一种压缩方式来进行 initramfs 压缩。预设使用gzip !

--filesystems :加入某些额外的文件系统支持!

范例:以 dracut 的预设功能建立一个 initramfs 虚拟磁盘文件

范例:额外加入 e1000e 网卡驱动与 ext4/nfs 文件系统支持在新的 initramfs 内

initramfs 建立完成之后,同时内核也处理完毕后,我们就可以使用 grub2 来建立选单了!

参与评论