initrd.img 解压分析

本文深入探讨了Linux内核映像vmlinuz及其与初始化根文件系统initrd.img之间的关系,详细解释了initrd的两种格式及如何通过cpio命令查看其内部内容。介绍了编译内核过程中的关键步骤,包括makemrproper、makemenuconfig、makemodules_install和makeinstall等,以及如何将内核映像和初始化根文件系统部署到系统中。

vmlinuz  是一个为内核映像, vmlinuz里面有gzip的一段代码。

 

initrd.img  是作为避免在vmlinuz里编译所有的驱动模块,所以使用了一个中间层的技术

initrd有两种格式,一种是较早的2.4.x中的 image-initrd格式,里面以 /linuxrc为主导。另一种是 cpio-initrd

 

看了网上的资料,想学着看看 initrd里是什么个样子

cp  /boot/initrd.imgxxx  initrd.img.gz
gunzip initrd.img.gz    # 这个如果不加后缀gz 就得使用 gunzip -S .img xx.img
mkdir initrd
mv initrd.img.gz  initrd
cd initrd
cpio -ivmd < initrd.img    #用cpio格式打的包,释放出来,ok,就可以看到了。

 

编译内核:

centos 6.2:

 

make mrproper   // 新内核不用,检查依赖对不对

make menuconfig   //配置选项

make modules_install       //安装modules  /lib/modules 对应的文件夹

make install       // 将 vmlinuz  和 initrd.img  放到  /boot 下,并填写对应的  /boot/grub/menu.lst 自己可以看看

 

 

### ### iPXE 引导中 `initrd.img` 的解压与加载机制 在 iPXE 引导过程中,`initrd.img` 是一个压缩的临时根文件系统,用于在内核启动早期加载必要的驱动模块和配置信息,以便挂载实际的根文件系统。该文件通常由 `dracut` 或 `mkinitramfs` 工具生成,格式为 `cpio` 压缩包,并使用 `gzip` 或 `xz` 压缩算法。 在标准的 PXE 引导流程中,`initrd.img` 会通过 TFTP 传输并由引导加载程序(如 PXELINUX 或 GRUB)自动解压后加载到内存中。但在某些 iPXE 配置中,可能需要手动指定解压方式或使用特定命令确保其正确加载。若 `initrd.img` 未被正确解压,将导致内核无法加载必要的驱动程序,从而引发 `kernel panic` [^1]。 ### ### 在 `boot.ipxe` 中添加 `initrd.img` 的解压步骤 iPXE 本身并不提供直接解压 `initrd.img` 的功能,而是依赖于内核在加载 initrd 后自行解压。然而,可以通过以下方式确保 `initrd.img` 被正确加载并解压: #### 1. 使用 `initrd` 指令加载 `initrd.img` 在 `boot.ipxe` 中,确保使用 `initrd` 指令加载 `initrd.img` 文件,并指定其压缩格式。例如: ```ipxe kernel http://<server>/vmlinuz root=nfs:<server-ip>:/path/to/rootfs ip=dhcp initrd http://<server>/initrd.img boot ``` 此方式将 `initrd.img` 作为压缩的 `cpio` 文件加载到内存中,由内核负责解压和挂载。 #### 2. 指定压缩格式以确保正确加载 若 `initrd.img` 使用 `xz` 或 `gzip` 压缩,可使用 `--compression` 参数显式指定压缩方式: ```ipxe initrd --compression=gzip http://<server>/initrd.img ``` 这样可避免因自动检测失败导致的加载错误。 #### 3. 添加调试参数进入 dracut shell 为排查 `initrd.img` 解压失败的原因,可在内核参数中添加 `rd.debug`,使系统进入 dracut 调试 shell: ```ipxe kernel http://<server>/vmlinuz root=nfs:<server-ip>:/path/to/rootfs ip=dhcp rd.debug ``` 进入调试 shell 后,可手动执行 `mount` 命令检查 NFS 挂载路径是否可达,或检查网络接口是否正常。 #### 4. 确保 initrd.img 包含必要模块 使用 `dracut` 命令重新生成 `initrd.img`,并确保包含网络驱动、NFS 支持等模块: ```bash dracut --add "nfs network" --force /boot/initrd.img-$(uname -r) ``` 该命令确保 `initrd.img` 包含必要的驱动模块,以便在引导过程中正确挂载远程 rootfs。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值