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

1. 解压vmlinuz:

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

[root@jay-rhel boot]# file vmlinuz-2.6.32-372.el6_jay.x86_64
vmlinuz-2.6.32-372.el6_jay.x86_64: Linux kernel x86 boot executable bzImage, version 2.6.32-372.el6.bz635846_jay.x86, RO-rootFS, root_dev 0x802, swap_dev 0x3, Normal VGA
 
# 查找gzip压缩内容的开始头部,通过“1f 8b 08”这个签名来查找
[root@jay-rhel boot]# od -t x1 -A d vmlinuz-2.6.32-372.el6_jay.x86_64 | grep "1f 8b 08"
0014432 48 8d 83 70 81 3d 00 ff e0 1f 8b 08 00 c4 01 9c
# 计算bizip压缩内容开始处的offset,为:14432 + 9 = 14441 (9是从0014431起到"if 8b 08"之间的字节数)
# 解压出被压缩的kernel中的内容
[root@jay-rhel boot]# dd if=vmlinuz-2.6.32-372.el6_jay.x86_64 bs=1 skip=14441 | zcat > vmlinux-jay
 
gzip: stdin: decompression OK, trailing garbage ignored
[root@jay-rhel boot]# file vmlinux-jay
vmlinux-jay: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped
 
[root@jay-rhel boot]# strings vmlinux-jay | grep 'Linux version'
Linux version 2.6.32-372.el6.bz635846_jay.x86_64 (n0ano@sobek.n0ano.com) (gcc version 4.4.4 20100726 (Red Hat 4.4.4-13) (GCC) ) #1 SMP Tue May 21 17:21:56 MDT 2013
[root@jay-rhel boot]# strings vmlinux-jay | grep '/sbin/'
/sbin/init
/sbin/request-key
/sbin/poweroff
/sbin/modprobe

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

[root@jay-linux temp]# cp /boot/initramfs-3.9.0-rc3+.img initramfs-3.9.0-rc3+.img.gz
[root@jay-linux temp]# gunzip -d initramfs-3.9.0-rc3+.img.gz
[root@jay-linux temp]# ls
initramfs-3.9.0-rc3+.img
 
# 现在较新的initrd一般是cpio文档格式,而很老的initrd(如Linux 2.4 kernel的年代)则直接就是普通image
# #### mount -o loop initrd-kernel-2.4.img /mnt/ ##基本很少见了
[root@jay-linux temp]# cpio -idmv < initramfs-3.9.0-rc3+.img
.
sbin
sbin/rmmod
sbin/blkid
sbin/cryptsetup
sbin/insmodpost.sh
......
mount/99mount-root.sh
proc
49757 blocks
[root@jay-linux temp]# ls
bin dracut-004-283.el6 init initqueue-settled lib pre-pivot proc sysroot var
cmdline emergency initqueue initqueue-timeout lib64 pre-trigger sbin tmp
dev etc initqueue-finished initramfs-3.9.0-rc3+.img mount pre-udev sys usr

简单记录一下以前写过的一段笔记(主要来自网上资料,加上了自己一点理解和注释):

通常在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,lsofps 等软件需要一个正确的 System.map。

解压vmlinuz和解压initrd(initramfs)的更多相关文章

  1. VB6进行GZIP解压&C#进行GZIP压缩和解压

    VB进行GZIP解压的,DLL是系统的,如果没有 [点击下载] Option Explicit 'GZIP API '----------------------------------------- ...

  2. linux学习之路第七天(压缩和解压类指令详解)

    压缩和解压类 1.gzip/gunzip 指令 gzip 指令用于压缩文件, gunzip用于解压的 基本语法 gzip 文件 (功能描述:压缩文件,指令将文件压缩成*.gz文件) gunzip 文件 ...

  3. 【C#公共帮助类】WinRarHelper帮助类,实现文件或文件夹压缩和解压,实战干货

    关于本文档的说明 本文档使用WinRAR方式来进行简单的压缩和解压动作,纯干货,实际项目这种压缩方式用的少一点,一般我会使用第三方的压缩dll来实现,就如同我上一个压缩类博客,压缩的是zip文件htt ...

  4. C#文件或文件夹压缩和解压方法(通过ICSharpCode.SharpZipLib.dll)

    我在网上收集一下文件的压缩和解压的方法,是通过ICSharpCode.SharpZipLib.dll 来实现的 一.介绍的目录 第一步:下载压缩和解压的 ICSharpCode.SharpZipLib ...

  5. Linux压缩和解压汇总

    各种后缀的压缩包压缩方法和解压方法 压缩包 压缩 解压 .tar.gz和.tgz tar -czf jpg.tar.gz *.jpg tar -xzvf filename -C path .tar.b ...

  6. java 文件压缩和解压(ZipInputStream, ZipOutputStream)

    最近在看java se 的IO 部分 , 看到 java 的文件的压缩和解压比较有意思,主要用到了两个IO流-ZipInputStream, ZipOutputStream,不仅可以对文件进行压缩,还 ...

  7. Linux下打包压缩war和解压war包

    Linux下打包压缩war和解压war包 unzip是一种方法,如果不行则采用下面的方法 把当前目录下的所有文件打包成game.war jar -cvfM0 game.war ./ -c   创建wa ...

  8. linux常用命令:4文件压缩和解压命令

    文件压缩和解压命令 压缩命令:gzip.tar[-czf].zip.bzip2 解压缩命令:gunzip.tar[-xzf].unzip.bunzip2 1. 命令名称:gzip 命令英文原意:GNU ...

  9. .net文件压缩和解压及中文文件夹名称乱码问题

    /**************************注释区域内为引用http://www.cnblogs.com/zhaozhan/archive/2012/05/28/2520701.html的博 ...

随机推荐

  1. Duilib学习笔记《02》— 界面布局

    1. 界面描述XML文件 Duilib主要是通过XML来进行界面的布局配置,程序通过读取并解析XML文件来创建对应的窗体.DuiLib的页面布局分为三类:窗体(Window).容器(Contain)和 ...

  2. 公司内部openStack环境信息

    公司内部openStack环境信息 yrzl内部openStack云平台平台访问地址,openStack云平台版本为Juno版本内网地址:  http://192.168.3.5:9090/horiz ...

  3. java jdbc 封装。。

    JDBC工具类...package it.cast.jdbcutils; import java.io.InputStream; import java.sql.Connection; import ...

  4. C# (GDI+相关) 图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果) (转)

    C#图像处理   (各种旋转.改变大小.柔化.锐化.雾化.底片.浮雕.黑白.滤镜效果)     一.各种旋转.改变大小   注意:先要添加画图相关的using引用.   //向右旋转图像90°代码如下 ...

  5. linux 下安装 搭建 svn服务器

    1.下载svn http://subversion.apache.org/download 下载完成后解压,执行 ./configure --prefix=/usr/svn 提示 configure: ...

  6. c++ builder TreeView控件节点遍历

    void __fastcall TForm1::GetRootNodes(TTreeView *DestTreeView)//得到所有根节点 { TTreeNode *vNode = NULL; vN ...

  7. 中间人攻击破解HTTPS传输内容

    最近App安全受到不小的關注,有人問我,說某某App不安全,究竟是真的還假的啊...所謂有被攻擊的風險,是不是危言聳聽,只是為了嚇人來著的? 現在就來為各位說明一下,是怎麼個不安全法.就來說說攻擊是怎 ...

  8. su:认证失败

    使用命令[su - root]切换用户,提示[su:认证失败] 原因:Ubuntu安装之后,root用户默认是被锁定的,不允许登录,也不允许su到root. 解决:重新设置密码 在终端输入命令:sud ...

  9. wpf依赖属性、绑定实现原理、附加属性学习

    依赖属性和普通属性相比节省内存的原因:对于普通属性,每个对象有需要存储一个普通属性的值,即便是默认值.而依赖属性的默认值是静态的存储在类中的,所有对象都使用同一默认值,所以对于拥有大量属性的控件来说这 ...

  10. C#中如何将combox中的下拉项和一个枚举中的各项进行绑定

    实现一个combobox,将其各个下拉项与枚举进行绑定 效果图如下: 代码详解如下: 枚举: public enum StoreSite { /// <summary> /// 未知 // ...