[转]如何将驱动封装到Linux ISO

原文来自:https://mp.weixin.qq.com/s/DEsMN_OnTF5SGPLsRtP5gQ

前面我们讲了很多在ThinkSystem系列服务器安装Centos6.5等非常规(老旧)操作系统的方式,重点就在于如何安装RAID卡驱动和网卡驱动,经常会有同仁或者用户觉得比较繁琐,那如何才能一劳永逸?

答案:定制Linux安装镜像,将驱动封装到ISO中

其中Kernel步骤,也就是我们之前碰到驱动问题的关键点,我们可以通过系统内的kernel引导文件内容略知一二,以下截取部分作为说明:


Label linux
    menu label ^Install or upgrage
    menu default
    kernel vmlinuz
    append initrd=initrd.img

从上面的文字可以看出,先会加载kernel文件,然后再加载Ramdisk(initrd.img),由于kernel文件非常小,只还有系统启动基本的模块,并不包含大部分驱动文件,所以很多设备的驱动模块都会在initrd.img(Centos6.5等比较旧的系统中initrd.img可能不包含新的RAID卡和网卡驱动)中进行加载;

PS:initrd.img只会加载进内存(重启驱动后就丢失),所以本文后还有安装驱动到盘体的操作;

基本概念介绍就到此,那我们开始正文

本文内容:

Linux 内核文件initrd加入RAID驱动重新编译封装和光盘、U盘Kickstart自动安装方法

适用场景:

由于引导内核文件RAID驱动老旧在安装Linux系统时发现找不到硬盘,需更新RAID驱动到内核文件并用Kickstart方式封装ISO,实现系统自动完成安装。

1.RAID驱动文件为自编译 .ko和RPM方式,更新RAID驱动到内核并重新打包内核。

2.RAID驱动文件为官方标准DD方式,更新RAID驱动到内核并重新打包内核。

3.RAID驱动文件为官方标准DD方式,利用Kickstart方式通过网络路径加载RAID驱动。

注意事项:

拷贝光盘文件时最好是带目录一起,这样会把所有的隐藏文件一起复置过来,不然在引导过程中会有问题。

挂载iso到指定目录并拷贝到相应目录:

mount –o loop Redhat.iso  /media/cd
cp –arf  /media/cd  /cd   

一、RAID驱动文件为自编译 .ko和RPM方式打包驱动

准备工作:

∙对内核重新编译和封装最好是相应版本的系统里操作,这里使用虚拟机方式完成。

∙准备新RAID驱动

∙本次验证为Redhat6.5,KS自行准备

1、内核文件加入新RAID驱动并重新封装

在mount iso 目录中取得内核文件initrd.img并解开、删除原内核文件如下图例:

在解开内核文件目录中查找RAID存放路径,如下图例:

如下图例:查看内核文件中运行RAID驱动模块的版本,发现比较老旧。同理拷贝的新RAID驱动也可以用此命令查看。

驱动路径:

modules/2.6.32-431.el6.x86_64/kernel/drivers/scsi/megaraid/

如下图例:拷贝新RAID驱动文件到内核目录tmp/ 下和RAID驱动加载路径下

注:把RAID驱动文件放内核tmp/ 下是为了当内核加载起来时KS  %POS中可以指定到此处安装RAID驱动和网卡驱动,相当于把文件上传到了引导内核中。

cp /home/radi-lom/* tmp/
cp tmp/megaraid_sas.ko ./modules/2.6.32-431.el6.x86_64/
cd ./modules/2.6.32-431.el6.x86_64/kernel/drivers/scsi/

如下图例:备份并更新RAID驱动文件名为原驱动名


mkdir back
mv megaraid_mbox.ko.gz back/
mv megaraid_mm.ko.gz back/
mv megaraid_sas.ko.gz back/

如下图例: (重要),进入内核目录,使上述操作生效

cd /work/initrd/
chroot .
depmod -a
exit

如下图例:更改内核目录下所有文件权限并重新打包内核文件。至此内核文件中加载RAID驱动和重新打包内核文件完成。


chmod 777 ./* -R
find . |cpio -c -o |xz -9 --formate=lzma >/home/initrd.img

2、ISO传统方式和UEFI方式安装配置

注:系统安装一般可以选择UEFI或传统(Legacy Mode)方式两种,其在光盘里要分别修改。

2.1传统方式配置修改:

传统方式配置只修改isolinux/isolinux.cfg文件,在文件里加入KS路径

cat isolinux/isolinux.cfg
在append initrd=initrd.img后增加:ks=cdrom:/isolinux/ks.cfg

2.2适用于U盘安装配置方式:

在append initrd=initrd.img后增加:method=hd:LABLE=Upan ks=hd:LABEL=Upan:/isolinux/ks.cfg

2.3 UEFI方式配置:

UEFI方式配置只修改EFI/BOOT/BOOTX64.conf文件,在文件里加入KS路径

cat EFI/BOOT/BOOTX64.conf
在kernel /images/pxeboot/vmlinuz 后添加:ks=cdrom:/ioslinux/ks.cfg

3.Kickstart配置:

注:加如下选项原因为,前面内核文件封装进去的RAID驱动只用于内核引导当前使用,这时系统是装上了,当你重启系统时,硬盘上的系统引导内核并没有更新RAID驱动,这时是无法正常引导到系统的(也就是识别不到RAID卡)

加入内容:

在内核引导当前创建后继要使用的目录并拷贝前面在内核里加入的RAID驱动和LOM网卡文件到指定目录。


%post –nochroot      
mkdir /mnt/sysimage/raidlom
cp /tmp/* /mnt/sysimage/raidlom/
%end
%post
chmod 777 /raidlom/*
rpm -Uvh /raidlom/kmod-megaraid_sas-07.702.06.00-1.x86_64.rpm
rpm -Uvh /raidlom/i40e-2.0.23-1.x86_64.rpm
%end

适用于U盘安装配置方式:

4.重新封装ISO

注:进入要重新封装的ISO目录,用新封装好的initrd.img覆盖原来的initrd.img,重做引导生树,重新封装ISO。

4.1 将重新封好的initrd.img拷贝到下面目录并覆盖


find ./ |grep initrd
cp /home/initrd.img isolinux/  #注意按 "y" 同意覆盖
cp /home/initrd.img images/pxeboot/  #注意按 "y" 同意覆盖

4.2 重新生成引导树

如下图例操作

因前期我们在ISO改变内容,我们需重新生成repodata下引导树

ls repodata
cp repodata/6221039e7e3dabf7d538c76571d8aaf42b6292b8f6fe6cf56b8fcf1c*****.xml /home/   #注*号为替代字符,文件名参考实际情况
rm repodata/* -f
createrepo -g /home/6221039e7e3dabf7d538c76571d8aaf42b6292b8f6fe6cf56b8fcf1c*****.xml ./

4.3 ISO重新封装:

注意:封装时-A,-V,-volset 后面””内容为识别盘符,请跟isolinux/isolinux.cfg配置内容一致如下图例

Cdrom方式:

U盘方式:

封装命令如下:

mkisofs -U -A "cdrom" -V "cdrom" -volset "cdrom" -J -joliet-long -r -v -T -o /home/rh6.5test.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e images/efiboot.img -no-emul-boot .

ISO封装好后,如需要生成到U盘安装需执行isohybrid,如用ISO安装不需要此步骤。

Yum 安装syslinux* 包,因需要用到isohybrid

二.RAID驱动文件为官方标准DD方式打包驱动

注:适用于RAID驱动已为官方编译标准DD方式

准备工作:

∙对内核重新编译和封装最好是相应版本的系统里操作,这里使用虚拟机方式完成。

∙准备新RAID驱动

∙本次验证为Centos7.2

1.把RAID DD文件重新进内核文件

Mount iso 到指定目录并拷贝内核文件到指定目录,如下图例操作

mount -o loop CYG_OS7.6-190702.iso /media/
cp -r /media/*  /work/centos/
cd work
cp centos/isolinux/initrd.img ./
mkdir initrd
mv initrd.img initrd
cd initrd  #后续操作很多都在此目录下进行,请各位注意目录与图片对应

解开内核文件initrd.img


xz -dc initrd.img |cpio –id

删除原内核文件initrd.img

rm initrd.img -rf

查找当前目录内核raid驱动和查看版本,发现比较老旧,无法驱动新的RAID卡

find ./ |grep -i meg
modinfo ./usr/lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/scsi/megaraid/megaraid_sas.ko

查看我们准备的新RAID驱动版本是较新且是你所要的,如下图例:

提示:这个RAID驱动解开DD.iso可以得到。

拷贝新的RAID驱动到指定目录并覆盖,如下图例:

cp /home/megaraid_sas.ko ./usr/lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/scsi/megaraid/

用modinfo 再次确认你已替换成功

modinfo ./usr/lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/scsi/megaraid/megaraid_sas.ko

加入dd驱动文件到解开内核指定目录,后续将会使用到,如下图例:

前面我们对内核文件做了操作,需重新depmod –a后更改权限并重新打包内核文件,

如下图例:

至此内核文件重新封装完成。

chroot ./
depmod -a
exit
chmod 777 ./* -R
find . |cpio -c -o |xz -9 --format=lzma >initrd.img

2. 更改配置文件调用RAID dd.iso文件

注:验证为用U盘安装方式,当采用官方标准DD方式RAID驱动加载,会在安装过程中自动完成后继RAID驱动的所有加载安装,不用像自己编译的驱动要后继手动加载。

传统方式安装更改isolinux/isolinux.cfg 配置文件调用RAID dd.iso文件

UEFI方式安装更改EFI/BOOT/grub.cfg 配置文件调用RAID dd.iso文件,如下图例:

dd=path:/tmp/dd.iso  #加入路径

3.重新封装ISO

注:进入要重新封装的ISO目录,用新封装好的initrd.img覆盖原来的initrd.img,重做引导生树,重新封装ISO。

3.1 将重新封好的initrd.img拷贝到下应目录并覆盖


find /work/centos/ |grep initrd.img
cp initrd.img /work/centos/imgages/pxeboot/ #注意按"y"确认替换
cp initrd.img /work/centos/isolinux   #注意按"y"确认替换

3.2 重新生成引导树

如下图例操作

因前期我们在ISO改变内容,我们需重新生成repodata下引导树


cp centos/repodata/613cfa892e8bf6**************-comps.xml ./
rm /work/centos/repodata/* -rf
create -g /work/613cfa892e8bf6**************-comps.xml /work/centos

3.3 ISO重新封装

注意:封装时-A,-V,-volset 后面””内容为识别盘符,请跟isolinux/isolinux.cfg配置内容一致如下图例

封装命令如下:

mkisofs -U -A " CYG_CentOS " -V " CYG_CentOS " -volset " CYG_CentOS " -J -joliet-long -r -v -T -o /work/ CYG_CentOS-new1.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e images/efiboot.img -no-emul-boot .

ISO封装好后,如需要生成到U盘安装需执行isohybrid,如用ISO安装不需要此步骤

Yum 安装syslinux* 包,因需要用到isohybrid

注意当ISO要写用U盘时写放方式为DD

三、RAID驱动文件为官方标准DD方式网路加载驱动

注:当你采用PXE DHCP服务器利用Kickstart方式网络安装系统且你也遇到要安装系统版本较低,系统引导内核里的RAID驱动无法驱动新RAID卡找不到硬盘时,只需在KS文件中加入指定RAID 驱动DD.iso存放处即可。

Kickstart配置文件修改如下图例:


driverdisk --source=http://192.168.0.1/dd.iso #增加该行命令

本文介绍到此,希望各位有兴趣的同仁可以一同探讨,共同进步。

版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《[转]如何将驱动封装到Linux ISO》
文章链接:https://wrlog.cn/2022/09/1242/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。