TTEP.CN > 故障 >

Linux下一些故障现象以及解决的相关资源

获得中软linux3.1服务版以及随后获得升级补丁光盘在联想万全服务器进行安装,在安装至分区界面发生“设备无法找到”的错误提示,安装程序异常退出安装进程。



在安装过程中击键[Ctrl]+[Alt]+F3查看安装进程日志以及[Ctrl]+[Alt]+[F4]查看系统相关消息,获得信息为无法寻找正确设备ID号。



分析:



中软3.1版本自带的AIC-78xx并不能很好的支持的SCSI硬盘的驱动。安装程序在引导时无法在initrd所解压的程序模块寻找到正确的驱动与设备ID相对应,因此需要修改升级安装光盘驱动程序,采用磁盘方式预先加载SCSI AIC78XX驱动。



解决办法:



从官方站点获取Adaptec AIC-78xx的SCSI驱动,并在RH7.2系统环境制作与中软3.1内核(2.4.18)一致的SCSI驱动。



从官方站点(ftp://updates.redhat.c0m/7.2/en/os/i386)下载新版本的BOOT内核程序,使用NEW_BOOT_KERNEL_RPM和NEW_BOOT_KERNEL_VERSION环境变量定义驱动盘所采用的内核版本。



export NEW_BOOT_KERNEL_RPM=”Kernel-BOOT-2.4.18-24.7.x.i386.rpm”



export NEW_BOOT_KERNEL_VERSION=”2.4.8-24.7.xBOOT”

临时性安装BOOT内核程序,由于只需要修改BOOT内核模块,因此在驱动盘制作完毕,需要删除此程序



rpm –ivh $NEW_BOOT_KERNEL_RPM


创建制作驱动模块目录



mkdir /tmp/bootdisk



cd /tmp/bootdisk


拷贝RH7.2光盘bootnet.img文件至/tmp/bootdisk目录,并挂载img文件于对应目录



mkdir /tmp/bootdisk/bootnet_image



mkdir /tmp/bootdisk/initrd_image


mount –o loop /tmp/bootdisk/bootnet.img /tmp/bootdisk/bootnet_image

cp /tmp/bootdisk/bootnet_image/initrd.img /tmp/bootdisk/initrd.gz



gunzip /tmp/bootdisk/initrd.gz



mv /tmp/bootdisk/initrd /tmp/bootdisk/initrd.img



mount –o loop /tmp/bootdisk/initrd.img /tmp/bootdisk/initrd_image

创建临时initrd映像文件用于升级和增加驱动模块。最后一个命令用于创建一个BOOT目录,其包含了initrd内部所有模块的列表。



mkdir /tmp/bootdisk/initrd_tmp



cp –a /tmp/bootdisk/initrd_image/* /tmp/bootdisk/initrd_tmp/



cd /tmp/bootdisk/initrd_tmp



zcat modules/modules.cgz | cpio -ivd

由于BOOT内核需要升级,所以驱动模块也需要升级。假如版本不一致,驱动模块将不能被装载。下面多个语句将在initrd_tmp目录创建包含升级模块的新BOOT目录。首先创建一个模块文件列表,使用文件列表找出新版本驱动模块,并把其添加到initrd_tmp的BOOT目录中。



mkdir /tmp/bootdisk/initrd_mtp/$NEW_BOOT_KERNEL_VERSION



cd /tmp/bootdisk/initrd_tmp



OldBootVersion=`zcat modules/modules.cgz | cpio –t | head –l | awk –F / ‘{print $1}’`



ModuleList=`ls $OldBootVersion`



cd /lib/modules/$NEW_BOOT_KERNEL_VERSION/kernel



for ModuleName in $ModuleList do NewModuleName=`find . -name $ModuleName`



cp $NewModuleName /tmp/bootdisk/initrd_tmp/$NEW_BOOT_KERNEL_VERSION/



$ModuleName

done

增加新SCSI驱动模块



cp /lib/modules/$NEW_BOOT_KERNEL_VERSION/kernel/drivers/scsi/aic7xxx/aic78xx.o



/tmp/bootdisk/initrd_tmp/$NEW_BOOT_KERNEL_VERSION

创建新module.cgz以包含所有升级和增加的模块



cd /tmp/bootdisk/initrd_tmp/



find $NEW_BOOT_KERNEL_VERSION | cpio -ov -H crc | gzip -c9 >



/tmp/bootdisk/initrd_tmp/modules/modules.cgz



cd /tmp/bootdisk



rm -rf /tmp/bootdisk/initrd_tmp/*BOOT

为新增加的SCSI驱动模块定义依赖关系

echo "aic78xx: scsi_aic78xx" >> /tmp/bootdisk/initrd_tmp/modules/modules.dep


为新增驱动模块定义模块信息

/tmp/bootdisk/initrd_tmp/modules/module-info :

aic78xx

{tab} sisc

“””” "Adaptec SCSI aic-78xx"

在/odules/pcitable为增加的设备驱动制作记录,可使内核根据设备号寻找正确的驱动。可使用stage2文件的记录进行增加。(使用TAB键代替空格)

cp /tmp/bootdisk/initrd_image/modules/pcitable /tmp/bootdisk/pcitable

grep ""aic78xx"" /tmp/bootdisk/stage2_image/modules/pcitable >>

/tmp/bootdisk/pcitable

排序pcitable文件并写入initrd映像文件

sort /tmp/bootdisk/pcitable > /tmp/bootdisk/initrd_tmp/modules/pcitable

创建新版initrd映像文件。必须为initrd映像文件预留足够空间以便在运行期间能成功装载驱动。这是initrd在引导期间解压所需要的文件系统空间。

INITRD_SIZE=`du -k -s /tmp/bootdisk/initrd_tmp | awk '{print $1}'`

let "NEW_INITRD_SIZE=$INITRD_SIZE + 1000"

mkdir /tmp/bootdisk/initrd_new_image

dd if=/dev/zero bs=1k count=$NEW_INITRD_SIZE of=/tmp/bootdisk/initrd_new.img

echo "y" | mke2fs /tmp/bootdisk/initrd_new.img > /dev/null

mount -o loop /tmp/bootdisk/initrd_new.img /tmp/bootdisk/initrd_new_image

cp -a /tmp/bootdisk/initrd_tmp/* /tmp/bootdisk/initrd_new_image/

sync

umount /tmp/bootdisk/initrd_new_image

umount /tmp/bootdisk/initrd_image

压缩initrd映像文件和新版本内核至bootnet映像文件中。
最近发表
赞助商链接