工作原因,最近在看如何自定义initramfs的脚本,稍微了解了一下相关的知识。

首先,维基百科的介绍:
Initrd ramdisk或者initrd是指一个临时文件系统,它在启动阶段被Linux内核调用。initrd主要用于当“根”文件系统被挂载之前,进行准备工作。
所以我简单的认为,这东西就是个在真正的硬盘上的文件系统被挂载之前,装载到内存里的临时文件系统。

那它,可以用来做啥呢?
initramfs可以用来在真正启动硬盘上的Linux系统之前,趁着硬盘的文件系统还没有挂载到根的时候,做一些苟且的事情。

关于具体用途,这里有一篇很好的文章:
debian系发行版initramfs调试方法

其中详细描述了修改方法,我这里简单摘要一下:

  1. 可以通过debian自带的initramfs-tools工具来修改制作initramfs
  2. 大部分修改是对 hooks、modules 和 scripts 目录下的文件进行操作

    • hooks下的脚本,在mkinitramfs命令执行时会被自动调用
    • scripts 目录下的脚本,是在 initramfs 挂载之后的不同阶段执行的
    • modules 文件中定义了在构建 initramfs 时将会被包含的内核模块
  3. 写完脚本,配置完文件后,用 sudo update-initramfs -u 命令,来更新initramfs文件系统

update-initramfs和mkinitramfs是两个脚本,如果你编译过内核应该有印象。update-initramfs会调用mkinitramfs,做了些往临时initrd目录copy文件的繁琐过程,具体如下:

  1. 在临时initrd目录下构建FHS规定的文件系统
  2. 按/etc/initramfs-tools/module和/etc/modules文件的配置,往lib/modules/目录拷贝模块,同时生成模块依赖文件modules.dep,以后内核启动后会从initramfs中(initrd.img被解压到内存中)按模块依赖关系modprobe模块
  3. 拷贝/etc/initramfs-tools/scripts和/usr/share/initramfs-tools/scripts下的配置文件到conf/目录下,以后内核启动,创建第一个进程init(initrd.img根目录下init.sh文件)会从conf/*读取配置,按一定的顺序加载模块/执行程序
  4. 模块的加载离不开modprobe工具集,因此需要拷贝modprobe工具集及其他工具到initrd目录结构下,同时解决这些工具的依赖关系(依赖的so文件的路径)
  5. 所有步骤完成,调用cpio和gzip工具打包压缩临时initrd目录结构

以上关于update-initramfs的描述,抄袭自:
制作initrd

讲完,收工

标签: none

添加新评论