原文来自: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 #增加该行命令
本文介绍到此,希望各位有兴趣的同仁可以一同探讨,共同进步。