linux虚拟文件系统initrd.img的解压

867 阅读2分钟

最近在工作中遇到了一个问题: 虚拟系统在运行时识别不到网卡驱动,需要在其运行的虚拟文件系统里面加入网卡驱动模块,于是就涉及到了initrd.img文件的编辑。 编辑他之前首先得解压文件,我将live里面的initrd.img文件复制出来解压,我用的是再升龙测试版镜像clonezilla-live-20220620-jammy-amd64(基于ubuntu的,内核版本5-15.0-39-generic),用file命令查看其文件类型为cpio类型,见下图:

image.png 于是我用cpio命令解压,结果如下:

image.png 只有一个kennel文件夹?其他最基本文件都没有,一看文件大小就知道没这么简单, 只有17,于是我用binwalk分析了一下这个文件,结果如下:

image.png 这个文件嵌入了三种文件,cpio(0-5046271)、xz(5046272-6522154)、gzip(6522154-7060511)。所以刚刚用cpio解压出来的文件只是这个文件的0-5046271字节部分,要想得到完整的文件啊信息,需要给initrd.img做个手术,将他们分离。这里我用dd命令将他们分成了三份,见下图: cpio_file: image.png

xz_file: image.png

gz_file: image.png 这里cpio_file刚才解压过了的是kernel文件夹,而gzip里面都是null data 说明里面没有数据(不知道为啥要嵌入进去),所有虚拟文件系统有很多大可能在xz_file里面,解压出来看一下: image.png 解压的时候报了Unexpected end of input错误,不知道为啥,但是不影响解压,这里可以看出解压出来的文件是cpio类型,因此还需要再解压。 image.png 解压的时候也报错:“文件非正常终止”不懂,还是不影响,我们继续看,这时候这个虚拟文件系统就完整了,各种目录和初始化脚本init都有。我们可以查看其启动方式和流程了。 回归我们一开始的主题---添加网卡驱动,这里以模块的方式加载进运行内核。有两种方式,一直接insmod,将你要加载的模块放到解压文件的目录(如:lib),然后再编辑init文件 写入insmod /lib/xxx.ko即可(具体路径视实际情况而定)。 二是用modprobe安装驱动,将你要加载的模块放到指定目录(/usr/lib/module/uname -r/kernel/drivers/)下,然后编辑init文件,插入depmod 和 modprobe xxx(xxx为驱动文件名不加后缀,方法不唯一)。 准备好后,还原虚拟文件系统(find . | cpio -o -c | xz -9 --format-lzma > xz_file)。再用dd命令将他与刚才的cpio_file和gz_file拼接在一起还原成initrd.img文件就ok了。