在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
相信有无数的人,有编译内核失败的记录, 99% 的原因就是和文件系统,硬件驱动有关,比如没有找到 SCSI 卡.但对这些问题大家都无从下手,都是乱测试. 内核常识 我们先要了解一点.一个内核有哪些东西. 比如我们: 复制代码 代码如下:rpm -ql kernel
可以见到如下的信息 复制代码 代码如下:/boot/System.map-2.6.24.4
/boot/config-2.6.24.4 /boot/vmlinuz-2.6.24.4 /lib/modules/lib/modules/2.6.24.4 /lib/modules/2.6.24.4/build /lib/modules/2.6.24.4/kernel 见到没,其实没有什么东西,主要就上面几个在 boot 下的文件 ,和在 /lib/modules 下的模块文件. 好了,由上面我们知道,这个和系统其它东西没有关系了,所以删除一个内核也就是删除这几文件. 大家可以参考一下前些日子我写的[Linux]编译一个 RHEL 定制的内核 rpm 包 . Initrd 的了解和检查 我今天要讲的是最影响启动的东西 initrd .大家会想,这是什么,内核中都没有,其它这个是内核包安装完后根据每个不同的硬件生成的.硬件不一样这个不一样.下面这个是很官方的介绍: 比 如,使用的是scsi硬盘,而内核vmlinuz中并没有这个scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但scsi模块 存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正scsi引导问 题。initrd-2.4.7-10.img是用gzip压缩的文件,initrd实现加载一些模块和安装文件系统等功能。 所以我们现在知道了,如果是一个奇怪的硬件,但是不能正常使用,就是 initrd 默认没有加载,要不就是内核没有加进去. 下面根据导致失败的原因进行一下分类处理 新内核启动失败后: 在原有老系统中使用 modprobe 和 lsmod 来确认需要加载的模块 我们知道了 initrd 影响启动,那我们要怎么样来确认是不是加载全了硬件啦. initrd 很大程度上是靠 lsmod 出来的模块,还有 /etc/modprobe 的指示来做的.当然 也可以用 lspci 之类来确认. 复制代码 代码如下:cat /etc/modprobe.conf
alias scsi_hostadapter mptbase alias scsi_hostadapter1 mptscsi alias scsi_hostadapter2 mptspi alias scsi_hostadapter3 mptsas alias scsi_hostadapter4 mptscsih alias scsi_hostadapter5 ata_piix</p> <p># lsmod Module Size Used by iptable_filter 7300 1 ip_tables 18132 1 iptable_filter xt_tcpudp 7680 1 x_tables 19204 2 ip_tables,xt_tcpudp ipv6 245092 32 我们发现,这台机器有一些别的机器上没有的硬件,就是 mpt 的相关内容.如果在上面重新编译内核,没有加载这几个模块,就一定会启动失败. 使用原因老系统中可以正常启动的 initrd 来确认新内核需要加载的模块 好了.上面还是我们看得见的,要是我们看不见,但启动失败怎么办 复制代码 代码如下:cd /boot/
mkdir tmp cp initrd*****.img tmp cd /tmp zcat intrd**img | cpio -id cat init 好了,我们主要注意下面这些内容 复制代码 代码如下:echo "Loading scsi_mod.ko module"
insmod /lib/scsi_mod.ko echo "Loading sd_mod.ko module" insmod /lib/sd_mod.ko echo "Loading mptbase.ko module" insmod /lib/mptbase.ko echo "Loading mptscsi.ko module" insmod /lib/mptscsi.ko echo "Loading mptspi.ko module" insmod /lib/mptspi.ko echo "Loading mptsas.ko module" insmod /lib/mptsas.ko echo "Loading mptscsih.ko module" insmod /lib/mptscsih.ko echo "Loading jbd.ko module" insmod /lib/jbd.ko echo "Loading ext3.ko module" insmod /lib/ext3.ko 根据上面这些,和你原来的,看看你是不是没有这些信息中提到的模块.没有,就快点加上吧,用这些方法处理后,99% 是能启动的,在不能启动我也帮不到你了 重新修改 initrd 的内核 复制代码 代码如下:gzip -cd initrd-2.6.34.2.img | cpio -imd --quiet find . | cpio -co | gzip -9 > /tmp/initrd-2.6.34.2.img
编译内核你可以知道的东西 为新核心重命名 depmod 复制代码 代码如下:depmod [-b basedir] [-e] [-F System.map] [-n] [-v] [version] [-A] depmod [-e] [-F System.map] [-n] [-v] [version] [filename...] 描述: Linux内核模块可以为其它模块提供提供服务(在代码中使用EXPORT_SYMBOL),这种服务被称作"symbols"。若第二个模块使用了这个symbol,则该模块很明显依赖于第一个模块。这些依赖关系是非常繁杂的。 depmod 读取在/lib/modules/version 目录下的所有模块,并检查每个模块导出的symbol和需要的symbol,然后创建一个依赖关系列表。默认地,该列表写入到/lib/moudules /version目录下的modules.dep文件中。若命令中的filename有指定的话,则仅检查这些指定的模块(不是很有用)。 若命令中提供了version参数,则会使用version所指定的目录生成依赖,而不是当前内核的版本(uname -r 返回的)。 mkinitrd 命令的使用 描述:mkinitrd可建立映像文件,以供Linux开机时载入ramdisk。 参数: |
请发表评论