修复:RHEL Linux中cpio归档的过早结束,列表(lsinitrd)和提取initramfs
如何在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