vmlinux + vmlinuz + nitrd(initramfs) 的内核版本 和解压

 

 

root@pcl-01:/usr/share/kata-containers# strings  vmlinux-5.0.21-84 | grep "Linux version"
Linux version 5.0.21 (root@pcl-01) (gcc version 7.5.0 (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04)) #1 SMP Mon Nov 9 16:07:53 CST 2020 (Ubuntu 5.0.0-23.24~18.04.1-generic 5.0.15)
root@pcl-01:/usr/share/kata-containers# 

 

 

有时就算只得到一个Linux kernel的RPM包或者直接是编译后的vmlinuz和initrd的binary文件,也需要了解其中的一些细节,可能需要去查找这些binary有没有将我想要的patch编译进去。所以,就有了解压vmlinuz和initrd的需求,记录一下其方法吧。

1. 解压vmlinuz:
vmlinuz是采用 gzip 压缩的,但它不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有 gzip 解压缩代码,所以你不能用 gunzip 或 gzip -dc 命令来解压 vmlinuz。可以用如下的操作来解压vmlinuz:

 

[root@localhost cloud_images]# od -A d -t x1  vmlinuz-5.0.21-84 |grep "1f 8b 08 00"
0000000 1f 8b 08 00 00 00 00 00 02 03 ec 5c 0d 70 14 55
[root@localhost cloud_images]# ^C
[root@localhost cloud_images]# gcc -o binoffset /usr/src/linux/scripts/binoffset.c
gcc: error: /usr/src/linux/scripts/binoffset.c: No such file or directory
gcc: fatal error: no input files
compilation terminated.
[root@localhost cloud_images]# dd if=vmlinuz-5.0.21-84 bs=1 skip=0 | zcat > vmlinux-jay
9224448+0 records in
9224448+0 records out
9224448 bytes (9.2 MB) copied, 15.142 s, 609 kB/s
[root@localhost cloud_images]# strings  vmlinux-jay |grep -i  "Linux version"
Linux version 5.0.21 (root@pcl-01) (gcc version 7.5.0 (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04)) #1 SMP Mon Nov 9 16:07:53 CST 2020 (Ubuntu 5.0.0-23.24~18.04.1-generic 5.0.15)
[root@localhost cloud_images]# 

 

1. 提取vmlinux
从bzImage中提取vmlinux比较简单,有现成的工具,位于Linux源代码中 scripts/extract-vmlinux

./scripts/extract-vmlinux bzImage > vmlinux

2. 提取initrd
initrd的格式可以是cpio archive,也可以是gzip、bzip2、lzma、xz或lzo压缩的,先用binwalk扫描一遍。

binwalk vmlinux

 

2. 解压initrd(initramfs):initrd一般是一个用gzip压缩的cpio格式的image,所以可以先gunzip解压,然后用cpio命令提取里面的信息。

 

简单记录一下以前写过的一段笔记(主要来自网上资料,加上了自己一点理解和注释):
通常在Linux系统的/boot/目录下有vmlinuz、initrd、System.map等几个文件,这里对其进行一点简单的介绍。
vmlinuz 是可引导的、压缩的内核。“vm”代表“Virtual Memory”。内核编译时通过命令 make bzImage 创建,然后通过如下命令产生。bzImage 是压缩的内核映像,需要注意,bzImage 不是用 bzip2 压缩的,bzImage 中的 bz 容易引起 误解,bz 表示“big zImage”。 bzImage 中的 b 是“big”意思。 zImage(vmlinuz) 和 bzImage(vmlinuz) 都是用 gzip 压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有 gzip 解压缩代码。所以你不能用 gunzip 或 gzip -dc 解包 vmlinuz。
老的 zImage 解压缩内核到低端内存(第一个640K),bzImage 解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用 zImage 或 bzImage 之一,两种方式引导的系统运行时是相同的。大的内核采用 bzImage,不能采用 zImage。 vmlinux 是未压缩的内核,vmlinuz 是 vmlinux 的压缩文件。

initrd 是“initial ramdisk”的简写。initrd 一般被用来临时的引导硬件到实际内核 vmlinuz 能够接管并继续引导的状态。一般 initrd 主要是用于加载 ext3 等文件系统及 SCSI 设备的驱动。initrd 映象文件是使用 mkinitrd 创建的。(比较新的initrd的名称一般为这样的:initramfs-3.10.0-rc1+.img,较老一点,命名形如:initramfs-2.6.32-358.el6.x86_64.img。)关于initrd,以前转过一篇文章,“initrd详解(转)”。

System.map 是一个特定内核的内核符号表。它是你当前运行的内核的 System.map 的链接。Linux 符号表使用到2个文件: /proc/kallsyms 和 System.map。虽然内核本身并不真正使用 System.map,但其它程序比如 klogd,lsof 和 ps 等软件需要一个正确的 System.map。

posted on 2020-11-10 16:00  tycoon3  阅读(2609)  评论(0编辑  收藏  举报

导航