修复:RHEL Linux中cpio归档的过早结束,列表(lsinitrd)和提取initramfs

时间:2020-01-09 10:38:19  来源:igfitidea点击:

如何在RHEL7和RHEL8上提取/解压缩/解压缩initramfs镜像的内容?
如何列出initramfs图像文件内容?
如何修改initrd或者initramfs的内容?
如何查看initrd或者initramfs?
如何修复cpio归档过早结束错误。
如何使用lsinitrd在RHEL 7和RHEL 8中列出initramfs内容。

尝试"提取initramfs"时,我们可能会看到cpio归档过早终止错误。
我在尝试在Red Hat Enterprise Linux 7主机上提取initramfs时遇到此错误,但是在RHEL 8中也可能出现相同的问题,因为initramfs均以ASCII格式提供,这与RHEL 5和6中initramfs所在的旧initramfs不同。
不同的格式。

使用RHEL 7,initramfs文件现在将CPU微代码和初始引导镜像都存储在一个"组合"镜像文件中。
CPU微代码以CPIO压缩方式存储,然后引导镜像以其自己的单独压缩方式存储。

在本文中,我将共享不同的方法来提取Red Hat Enterprise Linux的不同变体中的initramfs镜像文件,并修复cpio归档错误的过早终止。
如果initramfs的文件格式与RHEL相同,则这些命令也可以在其他Linux发行版中使用。

识别图像的压缩格式

在提取initramfs之前,重要的是要确定图像的压缩格式,以便我们可以相应地提取initramfs图像。
使用initramfs/initrd上的file命令来确定压缩格式:

# file /boot/initramfs-($uname -r).img

$(uname -r)将使用当前内核版本的文件。
如果我们希望标识其他initramfs镜像的压缩格式,则还可以提供完整的文件名

# file /boot/initramfs-3.10.0-957.el7.x86_64.img

可能的initramfs压缩格式

以下是各种Red Hat版本中可用的一些initramfs镜像文件格式。

# file /boot/initramfs-($uname -r).img
/boot/initramfs-3.10.0-327.el7.x86_64.img: gzip compressed data, from Unix, last modified: Fri Oct 7 03:36:28 2015, max compression

可能还会有xz/LZMA格式的图像显示为:

# file /boot/initramfs-($uname -r).img
/boot/initramfs-2.6.32-754.el6.x86_64.img: LZMA compressed data

或者ASCII格式的图像,显示为:

# file /boot/initramfs-$(uname -r).img
/boot/initramfs-4.18.0-80.el8.x86_64.img: ASCII cpio archive (SVR4 with no CRC)

用Gzip格式解压缩initramfs

在我们要提取initramfs的位置创建一个临时目录

# mkdir /tmp/initrd
# cd /tmp/initrd

确保在安装程序中安装了gzip,或者我们可以使用yum进行安装

# yum install gzip

说明:

在RHEL系统上,我们必须具有RHN的活动订阅,或者我们可以配置本地脱机存储库," yum"程序包管理器可以使用该本地存储库安装所提供的rpm及其依赖项。

接下来执行以下命令以提取initramfs

# zcat /boot/initramfs-3.10.0-327.el7.x86_64.img | cpio -i --no-absolute-filenames
88386 blocks

用xz/LZMA格式解压缩initramfs

同样,我们可以创建一个临时目录,在该目录中,我们可以提取initramfs的内容

# mkdir /tmp/initrd
# cd /tmp/initrd

要解压缩initramfs,请执行以下命令

# xz -dc < /boot/initrd-$(uname -r).img | cpio -idmv

修复" cpio归档提前结束"错误

在RHEL6及更低版本中,可以使用cpio提取initramfs或者initrd镜像的内容,如下所示:

# zcat initramfs-2.6.32-431.el6.x86_64.img | cpio -idmv

但是,当我尝试在RHEL7上提取initramfs镜像的内容时,它不起作用,如下所示:

# zcat /boot/initrd-$(uname -r).img | cpio -idmv
gzip: /boot/initrd-4.18.0-80.el8.x86_64.img.gz: No such file or directory
cpio: premature end of archive

因此,我们得到了cpio,归档错误过早结束,initramfs的文件格式为ASCII

# file /boot/initramfs-$(uname -r).img
/boot/initramfs-4.18.0-80.el8.x86_64.img: ASCII cpio archive (SVR4 with no CRC)

要修复cpio存档过早终止错误并提取initramfs,我们必须使用单独的命令来提取initramfs内容首先,创建一个临时工作目录并切换到该目录。
这将是查看initramfs内容的位置:

# mkdir /tmp/initramfs
# cd /tmp/initramfs

解压缩并解压缩/boot /目录中的镜像内容:

# /usr/lib/dracut/skipcpio /boot/initramfs-$(uname -r).img | gunzip -c | cpio -idmv

查看initramfs的内容

# ls -l
total 44
lrwxrwxrwx.  1 root root    7 May 14 09:48 bin -> usr/bin
drwxr-xr-x.  2 root root 4096 May 14 09:48 dev
drwxr-xr-x. 12 root root 4096 May 14 09:48 etc
lrwxrwxrwx.  1 root root   23 May 14 09:48 init -> usr/lib/systemd/systemd
lrwxrwxrwx.  1 root root    7 May 14 09:48 lib -> usr/lib
lrwxrwxrwx.  1 root root    9 May 14 09:48 lib64 -> usr/lib64
drwxr-xr-x.  2 root root 4096 Jan 15 22:19 proc
drwxr-xr-x.  2 root root 4096 Jan 15 22:19 root
drwxr-xr-x.  2 root root 4096 Jan 15 22:19 run
lrwxrwxrwx.  1 root root    8 May 14 09:48 sbin -> usr/sbin
-rwxr-xr-x.  1 root root 3126 Oct  8  2016 shutdown
drwxr-xr-x.  2 root root 4096 Jan 15 22:19 sys
drwxr-xr-x.  2 root root 4096 Jan 15 22:19 sysroot
drwxr-xr-x.  2 root root 4096 Jan 15 22:19 tmp
drwxr-xr-x.  7 root root 4096 May 14 09:48 usr
drwxr-xr-x.  3 root root 4096 May 14 09:48 var

在引导的系统上查看此组合镜像文件时,有必要使用skipcpio来"跳过" CPIO压缩的CPU微代码以访问引导镜像。

列出initramfs内容

我们还可以列出initramfs内容而无需实际提取它,前提是我们只需要查看initramfs图像文件的内容。
可以使用lsinitrd来实现,如下所示:

# lsinitrd /boot/initramfs-4.18.0-80.el8.x86_64.img