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映像文件中。
在安装过程中击键[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映像文件中。
- 上一篇:菜鸟必看(3分钟)教你判断出网络故障
- 下一篇:没有了
- 最近发表
- 赞助商链接