CentOS 7 ISO镜像定制内核版本

在一些场景下需要在业务安装之前升级操作系统内核版本,既如此,直接定制内核版本,当操作系统灌装完成时自带高版本内核,效率会更高。

安装依赖

1
yum install -y createrepo genisoimage syslinux isomd5sum ncurses-devel bc flex

挂载官方Minimal镜像

这里我们先采用Minimal镜像进行实验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost opt]# cd /opt
[root@localhost opt]# curl -O "https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso"
[root@localhost opt]# mkdir -p /mnt/cdrom

[root@localhost opt]# mount -o loop /opt/CentOS-7-x86_64-Minimal-2009.iso /mnt/cdrom
mount: /dev/loop0 is write-protected, mounting read-only

[root@localhost opt]# ls -lrt /mnt/cdrom/
total 696
-rw-rw-r-- 21 root root 1690 Dec 10 2015 RPM-GPG-KEY-CentOS-Testing-7
-rw-rw-r-- 21 root root 1690 Dec 10 2015 RPM-GPG-KEY-CentOS-7
-rw-rw-r-- 21 root root 18009 Dec 10 2015 GPL
-rw-rw-r-- 21 root root 227 Aug 30 2017 EULA
drwxr-xr-x 2 root root 2048 Oct 27 2020 LiveOS
drwxr-xr-x 3 root root 2048 Oct 27 2020 EFI
drwxr-xr-x 3 root root 2048 Oct 27 2020 images
-rw-r--r-- 3 root root 14 Oct 30 2020 CentOS_BuildTag
drwxr-xr-x 2 root root 2048 Nov 3 2020 isolinux
drwxr-xr-x 2 root root 673792 Nov 4 2020 Packages
drwxr-xr-x 2 root root 4096 Nov 4 2020 repodata
-r--r--r-- 1 root root 2883 Nov 4 2020 TRANS.TBL

拷贝镜像内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost opt]# mkdir /ISO
[root@localhost opt]# cp -raf /mnt/cdrom/* /ISO
[root@localhost opt]# ls -lrt /ISO
total 328
-rw-rw-r-- 1 root root 1690 Dec 10 2015 RPM-GPG-KEY-CentOS-Testing-7
-rw-rw-r-- 1 root root 1690 Dec 10 2015 RPM-GPG-KEY-CentOS-7
-rw-rw-r-- 1 root root 18009 Dec 10 2015 GPL
-rw-rw-r-- 1 root root 227 Aug 30 2017 EULA
drwxr-xr-x 2 root root 43 Oct 27 2020 LiveOS
drwxr-xr-x 3 root root 35 Oct 27 2020 EFI
drwxr-xr-x 3 root root 57 Oct 27 2020 images
-rw-r--r-- 1 root root 14 Oct 30 2020 CentOS_BuildTag
drwxr-xr-x 2 root root 198 Nov 3 2020 isolinux
drwxr-xr-x 2 root root 225280 Nov 4 2020 Packages
drwxr-xr-x 2 root root 4096 Nov 4 2020 repodata
-r--r--r-- 1 root root 2883 Nov 4 2020 TRANS.TBL

替换5.15内核包

此前在在CentOS 7上编译和升级Linux内核一文中,介绍了如何编译和升级5.15内核,这里我们就复用。

先看下Minimal镜像中自带的内核相关包

1
2
3
4
5
[root@localhost opt]# cd /ISO/Packages/
[root@localhost Packages]# ls -lrt kernel-*.rpm
-rw-rw-r-- 1 root root 52709940 Oct 20 2020 kernel-3.10.0-1160.el7.x86_64.rpm
-rw-rw-r-- 1 root root 8514900 Oct 20 2020 kernel-tools-3.10.0-1160.el7.x86_64.rpm
-rw-rw-r-- 1 root root 8405528 Oct 20 2020 kernel-tools-libs-3.10.0-1160.el7.x86_64.rpm

删除3.10内核包:

1
rm -f kernel-3.10.0-1160.el7.x86_64.rpm

将5.15.145版本内核放入/ISO/Packages/

1
2
3
4
[root@localhost Packages]# ls -lrt kernel-*.rpm
-rw-rw-r-- 1 root root 8514900 Oct 20 2020 kernel-tools-3.10.0-1160.el7.x86_64.rpm
-rw-rw-r-- 1 root root 8405528 Oct 20 2020 kernel-tools-libs-3.10.0-1160.el7.x86_64.rpm
-rw-r--r-- 1 root root 59958256 Dec 23 20:33 kernel-ml-5.15.145-1.el7.x86_64.rpm

编辑引导文件

BIOS引导

编辑isolinux/isolinux.cfg文件,需要修改label linux部分,其中label部分menu default唯一,设置镜像默认进入模式

1
2
3
4
5
6
7
8
9
10
11
12
label linux
menu label ^Install CentOS 7.9 (Kernel-5.15.145-1)
menu default
kernel vmlinuz
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS7

label check
menu label Test this ^media & install CentOS 7
kernel vmlinuz
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet

menu separator # insert an empty line

EFI引导

编辑EFI/BOOT/grub.cfg文件,修改menuentry ‘Install CentOS 7’部分

1
2
3
4
5
6
7
search --no-floppy --set=root -l 'CentOS 7 x86_64'

### BEGIN /etc/grub.d/10_linux ###
menuentry 'Install CentOS 7.9 (Kernel-5.15.145-1)' --class fedora --class gnu-linux --class gnu --class os {
linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS7 quiet
initrdefi /images/pxeboot/initrd.img
}

准备comps.xml

在生成安装盘之前,需要注意对comps.xml文件进行修改。这个文件用来告知安装程序anaconda,用户选择了某个组是应该有哪些包需要安装,定义了在安装过程中,包是如何被捆绑在一起的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ISO]# ls -lrt /mnt/cdrom/repodata/
total 3055
-rw-r--r-- 2 root root 811 Oct 27 2020 repomd.xml.asc
-rw-r--r-- 2 root root 744670 Oct 30 2020 cca56f3cffa18f1e52302dbfcf2f0250a94c8a37acd8347ed6317cb52c8369dc-c7-x86_64-comps.xml
-rw-r--r-- 2 root root 156763 Oct 30 2020 a4e2b46586aa556c3b6f814dad5b16db5a669984d66b68e873586cd7c7253301-c7-x86_64-comps.xml.gz
-rw-r--r-- 1 root root 232765 Nov 3 2020 95e7738c1060314a439e6970aeebe54ee6a729cc66351fc02edc057a524b0ea3-filelists.xml.gz
-rw-r--r-- 1 root root 312426 Nov 3 2020 91cceb5edd8689502596ad298ec64bad45991dd758a8180bfe18a6d8a3281c28-filelists.sqlite.bz2
-rw-r--r-- 1 root root 205995 Nov 3 2020 6da4a53c1231b84985efc60f9ccac32e6c33c0831d7f352d003fd4bfc39c373a-other.sqlite.bz2
-rw-r--r-- 1 root root 183471 Nov 3 2020 57ae40f3495cc6e04d91b0eb504e740f901c3b48ec2179e3736256db08fa755c-other.xml.gz
-rw-r--r-- 1 root root 409248 Nov 3 2020 136912ae46ca9ed27661ea6528fd544962d83095e3cdbc6149a37ddedf3a153c-primary.xml.gz
-rw-r--r-- 1 root root 3734 Nov 3 2020 repomd.xml
-rw-r--r-- 1 root root 3539 Nov 3 2020 d4de4d1e2d2597c177bb095da8f1ad794d69f76e8ac7ab1ba6340fdd0969e936-c7-minimal-x86_64-comps.xml.gz
-rw-r--r-- 1 root root 851584 Nov 3 2020 b6404d2de68763bab0d9fa3f8e1d6f5bc057b2c4a1919a89cc083d5dbc6efb19-primary.sqlite.bz2
-rw-r--r-- 1 root root 15455 Nov 3 2020 83b61f9495b5f728989499479e928e09851199a8846ea37ce008a3eb79ad84a0-c7-minimal-x86_64-comps.xml
-r--r--r-- 1 root root 3412 Nov 3 2020 TRANS.TBL

拷贝comps.xml,用于二次编辑使用

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ISO]# cp /mnt/cdrom/repodata/*-c7-minimal-x86_64-comps.xml /ISO/comps.xml
[root@localhost ISO]# cat /ISO/comps.xml
<group>
<id>core</id>
<name>Core</name>
<packagereq type="default">iwl6050-firmware</packagereq>
<packagereq type="default">iwl7260-firmware</packagereq>
<packagereq type="default">iwl7265-firmware</packagereq>
<packagereq type="default">kernel-tools</packagereq>
<packagereq type="default">libertas-sd8686-firmware</packagereq>
<packagereq type="default">libertas-sd8787-firmware</packagereq>
<packagereq type="default">libertas-usb8388-firmware</packagereq>

在kernel-tools处,添加新内核kernel-ml

1
2
3
4
5
6
7
<packagereq type="default">iwl7260-firmware</packagereq>
<packagereq type="default">iwl7265-firmware</packagereq>
<packagereq type="default">kernel-ml</packagereq>
<packagereq type="default">kernel-tools</packagereq>
<packagereq type="default">libertas-sd8686-firmware</packagereq>
<packagereq type="default">libertas-sd8787-firmware</packagereq>
<packagereq type="default">libertas-usb8388-firmware</packagereq>

生成repodata

删除旧有的repodata,并通过刚才编辑的comps.xml文件重新生成新的repodata

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ISO]# rm -rf /ISO/repodata/
[root@localhost ISO]# cd /ISO
[root@localhost ISO]# createrepo -g comps.xml .
Spawning worker 0 with 510 pkgs
Spawning worker 1 with 510 pkgs
Spawning worker 2 with 510 pkgs
Spawning worker 3 with 510 pkgs
Spawning worker 4 with 509 pkgs
Spawning worker 5 with 509 pkgs
Spawning worker 6 with 509 pkgs
Spawning worker 7 with 509 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

生成ISO镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[root@localhost ISO]# genisoimage -joliet-long -V CentOS7 -o CentOS-7.9-minimal-kernel-5.15.145.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -cache-inodes -T -eltorito-alt-boot -e images/efiboot.img -no-emul-boot /ISO/
I: -input-charset not specified, using utf-8 (detected in locale settings)
genisoimage 1.1.11 (Linux)
Scanning /ISO/
Scanning /ISO/EFI
Scanning /ISO/EFI/BOOT
Scanning /ISO/EFI/BOOT/fonts
Excluded: /ISO/EFI/BOOT/fonts/TRANS.TBL
Excluded: /ISO/EFI/BOOT/TRANS.TBL
Excluded: /ISO/EFI/TRANS.TBL
Scanning /ISO/images
Scanning /ISO/images/pxeboot
Excluded: /ISO/images/pxeboot/TRANS.TBL
Excluded: /ISO/images/TRANS.TBL
Scanning /ISO/isolinux
Excluded by match: /ISO/isolinux/boot.cat
Excluded: /ISO/isolinux/TRANS.TBL
Scanning /ISO/LiveOS
Excluded: /ISO/LiveOS/TRANS.TBL
Scanning /ISO/Packages
Excluded: /ISO/Packages/TRANS.TBL
Excluded: /ISO/TRANS.TBL
Scanning /ISO/repodata
Using RPM_G000.;1 for /RPM-GPG-KEY-CentOS-Testing-7 (RPM-GPG-KEY-CentOS-7)
...
...
96.54% done, estimate finish Sat Dec 30 20:43:01 2023
97.47% done, estimate finish Sat Dec 30 20:43:01 2023
98.40% done, estimate finish Sat Dec 30 20:43:01 2023
99.32% done, estimate finish Sat Dec 30 20:43:01 2023
Total translation table size: 123610
Total rockridge attributes bytes: 54615
Total directory bytes: 92160
Path table size(bytes): 140
Done with: The File(s) Block(s) 538383
Writing: Ending Padblock Start Block 538493
Done with: Ending Padblock Block(s) 150
Max brk space used a3000
538643 extents written (1052 MB)

查看生成的镜像

1
2
[root@localhost ISO]# ls -lrt *.iso
-rw-r--r-- 1 root root 1103140864 Dec 30 20:43 CentOS-7.9-minimal-kernel-5.15.145.iso

isohybrid则是syslinux的一个组件,可以将ISO镜像转换为可在BIOS和UEFI两种模式下启动的混合镜像。

1
2
3
[root@localhost ISO]# isohybrid CentOS-7.9-minimal-kernel-5.15.145.iso
isohybrid: Warning: more than 1024 cylinders: 1053
isohybrid: Not all BIOSes will be able to boot this device

使用implantisomd5校验并写入md5值

1
2
3
4
5
6
7
[root@localhost ISO]# implantisomd5 CentOS-7.9-minimal-kernel-5.15.145.iso
Inserting md5sum into iso image...
md5 = 25fdb7ee106de8b70c21100818b3d17a
Inserting fragment md5sums into iso image...
fragmd5 = 3a2efaa40d6c802865f4e1cdbb9e61b2737baa1815ab83dd2238fb77e335
frags = 20
Setting supported flag to 0

版本验证

1
2
[root@192 develop]# uname -a
Linux 192.168.126.141 5.15.145-1.el7.x86_64 #1 SMP Sat Dec 23 12:17:11 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

DVD版本镜像处理

上面Minimal镜像的处理,如果使用DVD版本,则处理时略有部分不同,首先看一下DVD版本相关的kernel包

1
2
3
4
5
6
7
8
[root@localhost Packages]# ls -lrt kernel-*.rpm
-rw-rw-r-- 1 root root 52709940 Oct 20 2020 kernel-3.10.0-1160.el7.x86_64.rpm
-rw-rw-r-- 1 root root 18858740 Oct 20 2020 kernel-debug-devel-3.10.0-1160.el7.x86_64.rpm
-rw-rw-r-- 1 root root 18787608 Oct 20 2020 kernel-devel-3.10.0-1160.el7.x86_64.rpm
-rw-rw-r-- 1 root root 9449344 Oct 20 2020 kernel-headers-3.10.0-1160.el7.x86_64.rpm
-rw-rw-r-- 1 root root 8514900 Oct 20 2020 kernel-tools-3.10.0-1160.el7.x86_64.rpm
-rw-rw-r-- 1 root root 8405528 Oct 20 2020 kernel-tools-libs-3.10.0-1160.el7.x86_64.rpm
-rw-rw-r-- 1 root root 8413796 Oct 20 2020 kernel-abi-whitelists-3.10.0-1160.el7.noarch.rpm

相比Minimal镜像多出不少,因此需要将kernel-devel也做处理

1
[root@localhost Packages]# rm -f kernel-3.10.0-1160.el7.x86_64.rpm kernel-devel-3.10.0-1160.el7.x86_64.rpm

将5.15.145版本内核和devel包放入/ISO/Packages/

1
2
3
4
5
6
7
8
[root@localhost Packages]# ls -lrt kernel-*.rpm
-rw-rw-r-- 1 root root 18858740 Oct 20 2020 kernel-debug-devel-3.10.0-1160.el7.x86_64.rpm
-rw-rw-r-- 1 root root 9449344 Oct 20 2020 kernel-headers-3.10.0-1160.el7.x86_64.rpm
-rw-rw-r-- 1 root root 8514900 Oct 20 2020 kernel-tools-3.10.0-1160.el7.x86_64.rpm
-rw-rw-r-- 1 root root 8405528 Oct 20 2020 kernel-tools-libs-3.10.0-1160.el7.x86_64.rpm
-rw-rw-r-- 1 root root 8413796 Oct 20 2020 kernel-abi-whitelists-3.10.0-1160.el7.noarch.rpm
-rw-r--r-- 1 root root 59958256 Dec 23 20:33 kernel-ml-5.15.145-1.el7.x86_64.rpm
-rw-r--r-- 1 root root 14438184 Dec 23 20:33 kernel-ml-devel-5.15.145-1.el7.x86_64.rpm

在编辑comps.xml文件时也有不同,需要在kernel-tools处同时添加kernel-ml、kernel-ml-devel

1
2
3
4
5
6
7
8
9
[root@localhost Packages]# cp /mnt/cdrom/repodata/*-c7-x86_64-comps.xml /ISO/comps.xml

<packagereq type="default">iwl6050-firmware</packagereq>
<packagereq type="default">iwl7260-firmware</packagereq>
<packagereq type="default">kernel-ml</packagereq>
<packagereq type="default">kernel-ml-devel</packagereq>
<packagereq type="default">kernel-tools</packagereq>
<packagereq type="default">libsysfs</packagereq>
<packagereq type="default">linux-firmware</packagereq>

另外DVD版本中携带了vdo相关包,其中vdo-6.1.3.23和kmod-kvdo-6.1.3.23依赖内核kernel-3.10.0-1160

1
2
3
4
5
6
Running transaction
Installing : kernel-3.10.0-1160.105.1.el7.x86_64 1/5
Installing : kmod-kvdo-6.1.3.23-5.el7.x86_64 2/5
Installing : libyaml-0.1.4-11.el7_0.x86_64 3/5
Installing : PyYAML-3.10-11.el7.x86_64 4/5
Installing : vdo-6.1.3.23-5.el7.x86_64 5/5

因此需要将comps.xml中如下两行删除

1
2
<packagereq type="default">kmod-kvdo</packagereq>
<packagereq type="default">vdo</packagereq>

否则在DVD版本采用Gnome Desktop或者Server with GUI时会出现Error checking software selection

其他步骤则与Minimal镜像一样,制作完毕后安装即可。

参考

1、https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/storage_administration_guide/vdo-integration
2、https://wiki.syslinux.org/wiki/index.php?title=Isohybrid
3、https://linux.die.net/man/1/implantisomd5
4、https://fedoraproject.org/wiki/How_to_use_and_edit_comps.xml_for_package_groups

0%