近日考虑到要制作适用PXE的引导麒麟系统,所以需要对iso中的img文件做适当调整。本文将介绍如何解压压缩麒麟系统的img文件。
一、了解vmlinuz和initrd.img文件
- vmlinuz:系统内核文件,编译而成。
- initrd.img:是一个小的文件系统, 放的是和启动相关的驱动模块。通常的步骤是先启动内核,然后内核挂载initrd.img,并执行里面的脚本来进一步挂载各种各样的模块。其中最重要的就是根文件系统驱动模块,有了它才能挂载根文件系统,继而运行用户空间的第一个应用程序init或者systemd,完成系统后续的启动。
一般如遇到系统缺少驱动模块,大部分都是修改initrd.img文件即可。本文中的initrd.img文件是解压iso文件,从中拷贝出来的,详细路径如下:
二、解压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
尝试重新去启动引导系统,这次可以成功进入系统。此处需要注意一下,避免踩坑。