麒麟操作系统iso文件中的img文件的解压与压缩

  近日考虑到要制作适用PXE的引导麒麟系统,所以需要对iso中的img文件做适当调整。本文将介绍如何解压压缩麒麟系统的img文件。

一、了解vmlinuz和initrd.img文件

  • vmlinuz:系统内核文件,编译而成。
  • initrd.img:是一个小的文件系统, 放的是和启动相关的驱动模块。通常的步骤是先启动内核,然后内核挂载initrd.img,并执行里面的脚本来进一步挂载各种各样的模块。其中最重要的就是根文件系统驱动模块,有了它才能挂载根文件系统,继而运行用户空间的第一个应用程序init或者systemd,完成系统后续的启动。

  一般如遇到系统缺少驱动模块,大部分都是修改initrd.img文件即可。本文中的initrd.img文件是解压iso文件,从中拷贝出来的,详细路径如下:
initrd.img文件路径

二、解压initrd.img文件

1、查看文件类型

file initrd.img
--initrd.img: XZ compressed data

2、修改文件后缀并解压

mv initrd.img initrd.img.xz
xz -d initrd.img.xz

3、再次查看文件类型

file initrd.img 
--initrd.img: ASCII cpio archive (SVR4 with no CRC)

4、解压此二进制文件

mkdir test
cd test
cpio -i -F ../initrd.img

 解压完后的文件系统如下,如需修改使用命令chroot:

bin  dev  etc  init  lib  lib64  opt  proc  root  run  sbin  shutdown  sys  sysroot  tmp  usr  var

三、压缩initrd.img文件

1、压缩文件系统成二进制文件

cd test
find .|cpio -o -H newc > ../initrd.img

2、压缩文件并改名

xz -zk initrd.img 
mv initrd.img.xz initrd.img

四、出现问题及解决思路

问题描述:使用改好的initrd.img文件去引导系统,发现报错了,启动失败。
启动失败报错文件使用命令对比修改前与修改后的文件内容,发现有差异。

修改前文件头:
# hexdump -C ../initrd.img | head -10
00000000  fd 37 7a 58 5a 00 00 01  69 22 de 36 02 00 21 01  |.7zXZ...i".6..!.|
00000010  10 00 00 00 a8 70 8e 86  e2 67 74 ef ff 5d 00 18  |.....p...gt..]..|
00000020  0d dd 04 62 33 37 a6 1c  b3 27 04 70 ee c0 8d 80  |...b37...'.p....|
00000030  97 3f a9 50 b2 c1 9f 15  a4 f2 b9 98 d4 e0 49 6b  |.?.P..........Ik|
00000040  d7 f9 6e 85 75 f5 2b 7d  eb 96 51 d2 fd 17 68 c1  |..n.u.+}..Q...h.|
00000050  e7 80 e5 9a 6a 5d a1 5a  5a 3b a4 87 68 e0 ac de  |....j].ZZ;..h...|
00000060  a5 91 76 65 55 24 da 9c  1b 56 2a 61 fa 96 84 86  |..veU$...V*a....|
00000070  78 3f 84 75 93 9e e5 bd  18 7a 69 62 e7 ca 7a fc  |x?.u.....zib..z.|
00000080  9e ab 1c 8a 20 65 c6 1e  6d f3 0b 83 66 4a fb d3  |.... e..m...fJ..|
00000090  75 05 52 7f 61 d4 b2 47  5f 8f 50 20 de a6 4e 50  |u.R.a..G_.P ..NP|

修改后文件头:
# hexdump -C initrd.img | head -10
00000000  fd 37 7a 58 5a 00 00 04  e6 d6 b4 46 02 00 21 01  |.7zXZ......F..!.|
00000010  16 00 00 00 74 2f e5 a3  e2 67 74 ef ff 5d 00 18  |....t/...gt..]..|
00000020  0d dd 04 62 33 37 a6 1c  b3 27 04 70 ee c0 8d 80  |...b37...'.p....|
00000030  97 3f a9 50 b2 c1 9f 15  a4 f2 b9 98 d4 e0 49 6b  |.?.P..........Ik|
00000040  d7 f9 6e 85 75 f5 2b 7d  eb 96 51 d2 fd 17 68 c1  |..n.u.+}..Q...h.|
00000050  e7 80 e5 9a 6a 5d a1 5a  5a 3b a4 87 68 e0 ac de  |....j].ZZ;..h...|
00000060  a5 91 76 65 55 24 da 9c  1b 56 2a 61 fa 96 84 86  |..veU$...V*a....|
00000070  78 3f 84 75 93 9e e5 bd  18 7a 69 62 e7 ca 7a fc  |x?.u.....zib..z.|
00000080  9e ab 1c 8a 20 65 c6 1e  6d f3 0b 83 66 4a fb d3  |.... e..m...fJ..|
00000090  75 05 52 7f 61 d4 b2 47  5f 8f 50 20 de a6 4e 50  |u.R.a..G_.P ..NP|

导致出现这种差异的原因:新的xz工具在压缩的时候自动采用了新的校验算法crc64,虽然说这个crc64要优于原本的crc32,但是linux内核用的还是crc32,而且不认识crc64。

解决方法:压缩文件时指定校验算法为crc32。

xz -zk initrd.img --check=crc32
mv initrd.img.xz initrd.img

尝试重新去启动引导系统,这次可以成功进入系统。此处需要注意一下,避免踩坑。

猜你喜欢

转载自blog.csdn.net/fish332/article/details/128655687
今日推荐