新型的initrd的解压方法

本文详细介绍了如何解压Ubuntu的initrd文件以查看其内部结构和文件,包括使用binwalk定位压缩格式,dd和zcat或lzcat进行解压,以及如何重新压缩initrd文件。

最近在解决一个问题,需要解压ubuntu的initrd来查看启动脚本。

$ file /boot/initrd.img-4.15.0-32-generic

/boot/initrd.img-4.15.0-32-generic: ASCII cpio archive (SVR4 with no CRC)

$mkdir rootfs

$cd rootfs

$cpio -idvm < /boot/initrd.img-4.15.0-32-generic

$ tree

.

└── kernel

    └── x86

        └── microcode

            └── AuthenticAMD.bin

 

3 directories, 1 file

奇怪,没有根文件的目录和文件,只有一个微码的文件。通过Google了解,目前的initrd方式有了变化。通过反复的验证,正确的步骤如下:

步骤一:可以通过lsinitramfs命名来查看initrd含有的文件

$lsinitramfs /boot/initrd.img-4.15.0-32-generic

lib/modules/4.15.0-32-generic/kernel/drivers/gpu/drm/amd/amdgpu

lib/modules/4.15.0-32-generic/kernel/drivers/gpu/drm/amd/amdgpu/amdgpu.ko

lib/modules/4.15.0-32-generic/kernel/drivers/gpu/drm/amd/lib

lib/modules/4.15.0-32-generic/kernel/drivers/gpu/drm/amd/lib/chash.ko

lib/modules/4.15.0-32-generic/kernel/drivers/gpu/drm/ast

lib/modules/4.15.0-32-generic/kernel/drivers/gpu/drm/ast/ast.ko

lib/modules/4.15.0-32-generic/kernel/drivers/gpu/drm/i915

lib/modules/4.15.0-32-generic/kernel/drivers/gpu/drm/i915/i915.ko

^C

…..

 

$ binwalk /boot/initrd.img-4.15.0-32-generic

 

DECIMAL       HEXADECIMAL     DESCRIPTION

--------------------------------------------------------------------------------

0             0x0             ASCII cpio archive (SVR4 with no CRC), file name: ".", file name length: "0x00000002", file size: "0x00000000"

112           0x70            ASCII cpio archive (SVR4 with no CRC), file name: "kernel", file name length: "0x00000007", file size: "0x00000000"

232           0xE8            ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86", file name length: "0x0000000B", file size: "0x00000000"

356           0x164           ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode", file name length: "0x00000015", file size: "0x00000000"

488           0x1E8           ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/AuthenticAMD.bin", file name length: "0x00000026", file size: "0x00006B2A"

28072         0x6DA8          ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"

28672         0x7000          ASCII cpio archive (SVR4 with no CRC), file name: "kernel", file name length: "0x00000007", file size: "0x00000000"

28792         0x7078          ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86", file name length: "0x0000000B", file size: "0x00000000"

28916         0x70F4          ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode", file name length: "0x00000015", file size: "0x00000000"

29048         0x7178          ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/.enuineIntel.align.0123456789abc", file name length: "0x00000036", file size: "0x00000000"

29212         0x721C          ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/GenuineIntel.bin", file name length: "0x00000026", file size: "0x00170C00"

1539760       0x177EB0        ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"

1540096       0x178000        gzip compressed data, from Unix, last modified: 2018-08-21 22:23:29

 

通过binwalk能够看到“ gzip compressed data,”的字段,说明从1540096   字节段开始是gzip压缩的格式。从这开始是根文件系统。之前的microcode的文件。说明是microcode文件和根文件是压缩到一起的文件

 

$ binwalk -y gzip /boot/initrd.img-4.15.0-32-generic

 

DECIMAL       HEXADECIMAL     DESCRIPTION

--------------------------------------------------------------------------------

1540096       0x178000        gzip compressed data, from Unix, last modified: 2018-08-21 22:23:29

 

这里有个数字“1540096 ”,下面开始解压文件

$dd if=/boot/initrd.img-4.15.0-32-generic bs=1540096 skip=1 | zcat | cpio -id --no-absolute-filenames -v

$ls

bin  conf  etc  init  kernel  lib  lib64  run  sbin  scripts  usr  var

 

这里有个注意的地方,如果binwalk显示不都是gzip格式的。比如:

$ binwalk /mnt/casper/initrd

(binwalk工具https://github.com/ReFirmLabs/binwalk

DECIMAL       HEXADECIMAL     DESCRIPTION

--------------------------------------------------------------------------------

0             0x0             ASCII cpio archive (SVR4 with no CRC), file name: ".", file name length: "0x00000002", file size: "0x00000000"

112           0x70            ASCII cpio archive (SVR4 with no CRC), file name: "kernel", file name length: "0x00000007", file size: "0x00000000"

232           0xE8            ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86", file name length: "0x0000000B", file size: "0x00000000"

356           0x164           ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode", file name length: "0x00000015", file size: "0x00000000"

488           0x1E8           ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/AuthenticAMD.bin", file name length: "0x00000026", file size: "0x00006B2A"

28072         0x6DA8          ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"

28672         0x7000          ASCII cpio archive (SVR4 with no CRC), file name: "kernel", file name length: "0x00000007", file size: "0x00000000"

28792         0x7078          ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86", file name length: "0x0000000B", file size: "0x00000000"

28916         0x70F4          ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode", file name length: "0x00000015", file size: "0x00000000"

29048         0x7178          ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/GenuineIntel.bin", file name length: "0x0000002A", file size: "0x00170C00"

1539600       0x177E10        ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"

1540096       0x178000        LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: -1 bytes

 

这个initrd使用lzma压缩的。那么解压时候就不能用zcat命令了。应该使用如下命令:

dd if=/mnt/casper/initrd bs=1540096 skip=1 | lzcat | cpio -id --no-absolute-filenames -v

lzcat=xz --format=lzma --decompress --stdout(参见https://www.computerhope.com/unix/xz.htm

至此,解压结束。

如何重新压缩回去呢?参见:https://askubuntu.com/questions/777260/how-to-repack-initrd-img

find kernel/ | cpio -o -H newc > new_initrd.img

cd rootfs

find . | cpio -o | gzip -9 >> ../new_initrd.img

<think>好的,我需要帮助用户解压最新版的initrd文件。首先,我得回忆一下initrd文件的常见处理方式。用户提到之前的解压方法可能不完全,比如使用cp加.gz后缀再用gunzip和cpio解压,但结果不完整。这可能是因为较新的initrd文件使用了不同的压缩方式,比如xz或者lz4,而不仅仅是gzip。 根据引用[2]中的信息,旧的initrd.img是用gzip压缩的,但新版本可能有所变化。我需要确认最新的initrd文件使用的压缩格式。通常,可以通过file命令来检测文件类型,例如`file initrd.img`,这会显示具体的压缩方式。比如,如果是xz压缩,输出会显示XZ compressed data。 接下来,解压步骤会根据压缩方式不同而不同。如果是xz压缩,可能需要使用unxz命令,或者结合cat和xz工具。然后使用cpio提取文件。例如,`xz -dc initrd.img | cpio -idmv`。如果用户没有安装xz工具,可能需要安装相应的软件包。 另外,用户可能遇到权限问题,解压后的文件需要适当的权限,可能需要使用sudo。还要注意解压后的目录结构是否正确,是否包含所有必要的文件,比如引用[3]提到的驱动和depmod相关文件的重建步骤,这可能涉及解压后的修改和重新打包。 用户的问题还涉及如何重新打包initrd文件,这在修改后是必要的步骤。例如,使用mkinitramfs工具(引用[4])或者find和cpio命令重新创建initrd映像,并指定正确的压缩格式。 此外,引用[5]提到使用PXE服务器时涉及initrd文件的处理,可能用户的环境是PXE引导,需要确保解压和重新打包后的文件与内核兼容。 总结步骤应该是:检测压缩格式,选择合适的解压命令,解压后用cpio提取,修改后重新打包。需要确保工具支持最新压缩算法,并指导用户如何验证解压是否完整。</think>### 如何解压最新版 initrd 文件 #### 1. **确认文件压缩格式** 最新版 initrd 文件可能采用不同压缩算法(如 `gzip`、`xz`、`lz4` 等)。首先通过 `file` 命令检测文件类型: ```bash file initrd.img ``` 示例输出: - `initrd.img: XZ compressed data`(XZ 压缩) - `initrd.img: gzip compressed data`(GZIP 压缩)[^2] #### 2. **解压步骤** 根据检测结果选择解压工具: - **若为 XZ 压缩**: ```bash mv initrd.img initrd.img.xz # 添加后缀 xz -d initrd.img.xz # 解压为未压缩的 initrd 文件 mkdir initrd && cd initrd cpio -idmv < ../initrd.img # 使用 cpio 解包 ``` 或单行命令: ```bash xz -dc initrd.img | cpio -idmv ``` - **若为 GZIP 压缩**(传统方法): ```bash zcat initrd.img | cpio -idmv ``` 若 `zcat` 不支持,可改用: ```bash gunzip -c initrd.img | cpio -idmv ``` - **若为其他格式**(如 `lz4`): ```bash lz4 -d initrd.img initrd.img.uncompressed cpio -idmv < initrd.img.uncompressed ``` #### 3. **验证解压完整性** 解压后检查目录是否包含完整文件结构: - `/lib`(驱动模块) - `/bin`、`/sbin`(基础命令) - `/etc`(配置文件) 若文件缺失,可能是压缩格式判断错误或解压工具版本过低[^1][^3]。 #### 4. **重新打包 initrd 文件** 修改文件后重新打包(以 XZ 压缩为例): ```bash find . | cpio -H newc -o | xz -9 --check=crc32 > ../new_initrd.img ``` 或使用 `mkinitramfs` 工具(需 root 权限): ```bash mkinitramfs -o new_initrd.img [内核版本号] [^4] ``` #### 常见问题解决 - **权限不足**:解压/打包时添加 `sudo` - **工具缺失**:安装 `xz-utils`、`lz4` 等包 - **文件损坏**:确保下载的 initrd 文件完整(可通过校验和验证)
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值