zoukankan      html  css  js  c++  java
  • 解压vmlinuz和解压initrd(initramfs)

    有时就算只得到一个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。

  • 相关阅读:
    pycharm快捷键
    对迭代器操作的python 模块
    编译入门:传说中的编译是在做什么
    机器学习原理与算法(剧场版)机器学习中的最优化问题
    机器学习原理与算法(六) 支持向量机
    机器学习原理与算法(五) 生成学习算法
    机器学习原理与算法(四) 广义线性模型
    机器学习原理与算法(三) 监督学习之分类问题
    机器学习原理与算法(一) 机器学习概述
    Altera FPGA SoC搭建步骤
  • 原文地址:https://www.cnblogs.com/oracleloyal/p/5583396.html
Copyright © 2011-2022 走看看