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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM