linux内核编译失败的一些解决方案
本文主要介绍了Linux内核的编译失败的一些解决方案,并着重对initrd影响启动问题。我相信有数以百万计的人没有编译内核。其中99%个与文件系统和硬件驱动有关。例如,找不到SCSI卡。然而,这些问题并不是每个人都能理解的。它们都是随机测试。
因为我管理公司的所有服务器的内核定制、优化和升级。现在我将教你一些帮助你减少损失的技巧。编译一个您可以使用的新内核。
内核的常识
让我们稍微了解一下。它的核心是什么。
例如,我们:
复制代码代码如下:转- QL内核
您可以看到以下信息
复制代码代码如下: / /启动系统。map-2.6.24.4
/ / config-2.6.24.4启动
/ / vmlinuz-2.6.24.4启动
/ / / lib库模块/模块/ 2.6.24.4
/ / / lib模块2.6.24.4 /建造
/ / / lib模块2.6.24.4 /内核
不,实际上,没有什么,主要是在引导下的文件的顶部,以及模块下的文件。
System.map内核符号映射表,顾名思义,是一个列表的内核,这是符号,在内核和其地址的功能。
配置内核编译配置文件,使oldconfig需要使用这个文件。
这是真正的启动vmlinuz,压缩的内核。
从上面我们知道这与系统的其他部分无关,所以删除一个内核就是删除这些文件。
你可以参阅{ },Linux我前几天写的编译RHEL的自定义内核RPM包。
了解和检查initrd
我今天要谈论的话题是initrd,这对启动的影响最大。你会考虑这是什么,什么不是内核。另一种是在安装内核包后由不同的硬件生成的。硬件不同。这是一个非常正式的介绍。
initrd是初始ramdisk短写。Initrd一般是用来暂时启动硬件状态,实际内核vmlinuz可以接管并继续启动。initrd -图中2.4.7-10.img主要用来加载一个文件系统EXT3和SCSI设备驱动程序。
例如,SCSI硬盘的使用,以及SCSI硬件驱动程序不可用在内核vmlinuz。在加载SCSI模块,内核无法加载根文件系统,但是SCSI模块存储 / /模块库的根文件系统下。为了解决这个问题,你可以引导一个initrd内核,可以读取实际的内核和initrd.initrd-2.4.7-10.img修改SCSI启动问题是一个文件压缩gzip,和initrd实现加载一些模块和安装文件系统的功能。
所以我们现在知道,如果这是一个奇怪的硬件,但不能正常使用,这意味着initrd是默认不加载内核,或不加。
以下是根据失败原因分类的
新的内核启动失败后:使用modprobe和lsmod识别模块被加载在旧系统
我们知道,影响启动initrd。那我们如何确认是否装载了所有的硬件initrd主要是基于lsmod的模块和 / /文件的说明等。当然,它也可以通过lspci等证实。
如下
复制代码代码如下:猫 / / modprobe.conf等
别名scsi_hostadapter mptbase
别名scsi_hostadapter1 mptscsi
别名scsi_hostadapter2 mptspi
别名scsi_hostadapter3 mptsas.ko之后
别名scsi_hostadapter4 mptscsih
别名scsi_hostadapter5 ata_piix
# lsmod
所使用的模块大小
iptable_filter 73001
181321 iptable_filter ip_tables
xt_tcpudp 76801
x_tables 192042 ip_tables,xt_tcpudp
IPv6的24509232
我们发现这台机器有一些没有硬件的机器,也就是说,与MPT相关的内容。如果我们编译内核的顶部,不加载这些模块,我们将无法启动。
使用initrd可以正常启动,在旧系统确认新的内核需要加载的模块
好吧。它仍然是我们能看到的,如果我们看不到它,但是你如何开始失败呢
我们可以把initrd.img加载模块。
复制代码代码如下:
mkdir TMP
CP initrd ***** IMG的TMP。
cd/TMP
下intrd ** IMG cpio ID |
猫初始化
好的,我们会注意下面的。
复制代码代码如下:回声加载scsi_mod.ko模块
insmod / / scsi_mod.ko lib
回声加载sd_mod.ko模块
insmod / / sd_mod.ko lib
回声加载mptbase.ko模块
insmod / / mptbase.ko lib
回声加载mptscsi.ko模块
insmod / / mptscsi.ko lib
回声加载mptspi.ko模块
insmod / / mptspi.ko lib
回声加载mptsas.ko模块
insmod / / mptsas.ko lib
回声加载mptscsih.ko模块
insmod / / mptscsih.ko lib
回声加载jbd.ko模块
insmod / / jbd.ko lib
回声加载ext3.ko模块
insmod / / ext3.ko lib
基于上述,我想看看您是否有这些信息中提到的模块与您的旧的。不,请赶快加上。在处理这些方法之后,99%可以启动。如果我不能开始,我帮不了你。
修改initrd内核
复制代码如下:gzip CD initrd-2.6.34.2.img cpio - IMD --安静找到|。| cpio共| gzip 9 > / / initrd-2.6.34.2.img TMP
编译您可以了解的内核
重命名新内核
在我们编译内核,我们可以在Makefile修改版本信息和打开/ usr / / / makefile.in SRC Linux的开始部分,有一个可变的外向性,可以定义本身。修改这个变量,例如,以外向性= - chinacache之后,编译内核版本号将显示为2.6.24-chinacache。
但事实上,从2.6.8版本,你可以添加个性化的内核版本号后的字符串。所以没有必要修改Makefile文件:()的本地版本ndash;添加到内核版本。
如果你修改了外向性在makefile,和定义的本地版本。在配置中,由本地版本定义的字符串将在结尾处,后跟外向性值。
depmod
功能:分析加载模块的可靠性产生modules.dep文件和映射文件。
使用:
复制代码代码如下:depmod { B } { } { basedir - E - F系统,地图} { } { } n v {版} {一}
depmod { } { - E - F系统,地图} { } { } n v } { } {版文件名…
描述:
The Linux kernel module can provide services for other modules (using EXPORT_SYMBOL in the code), which is called symbols.If second modules use this symbol, the module is obviously dependent on the first module.These dependencies are very complicated.
depmod读 / / / lib模块版本目录的所有模块,检查所需的象征符号和各模块输出,并创建一个列表中的依存关系。默认情况下,列表被写入的modules.dep文件 / / /模具库的版本目录。如果在命令文件名指定的,只有指定的模块进行检查(不是很有用的)。
如果版本的参数是在命令提供的,依赖是使用指定的版本目录生成的,不是当前的内核版本(由uname -r返回)。
mkinitrd命令的使用
功能:创建一个加载到内存映像文件。
用法:mkinitrd { } { Fv——省略} { } SCSI模块——版{——预紧力= } {——= lt;模块名称> } { } { }图像文件的内核版本
描述:mkinitrd可以加载ramdisk Linux打开时创建图像文件。
参数:
F覆盖现有的文件,如果指定的图像问家的名字被重复与现有文件。
当v执行时显示详细信息。
省略SCSI模块不加载SCSI模块。
预加载=指定要加载的模块。
指定要加载的模块。
版本显示版本信息