【学习笔记】编译Linux内核(中)--安装内核时易出现的问题和解决方案

本文详细介绍了在安装Linux内核时可能遇到的三个问题及其解决方案,包括错误提示、解决步骤和注意事项。通过本文的学习,初学者可以避免在安装过程中遇到的常见问题,提高安装效率。

编译和安装Linux内核的方法在(上)篇中我虽然描述得很清楚,但我自己在编译和安装Linux内核的过程中也是遇到了不少问题,最后才成功的。这里把我的经验以及遇到的问题写下来,留个记录。以后如果有新菜鸟们遇到相似问题,也方便他们在这里找到解决办法。

 

 

首先,再次提示,一定要在官网下载源码,(www.kernel.org)民间网站下载的源码很多都有问题,不要因为这个浪费时间,我就深受其害。

只要是官网下载的源码,按照我在(上)篇中说的步骤进行编译一般不会出问题。对于咱们菜鸟级的初学者,在配置内核的过程中直接用系统的默认配置即可。

下面主要说下安装(升级)内核的过程中容易出现的问题。

 

我第一次安装完 2.6.34.13  的内核时,(见(上)篇中的最后一张截图),虽然在启动界面里看到了My Own Linux的选项,但是选择该选项进入系统的话会出现错误提示。我就把我遇到的三个问题及其解决方案写下来。

 

 

----------------------------------------------------------------------------------------------------------------------

 

第一个问题。

启动时,出现下面的error:

insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists

 

简单说一下,insmod 其实是Linxu加载模块的命令,而".ko"后缀的文件则是编译好的内核模块。这里的错误提示是说在加载dm-region-hash.ko这个模块时,发现此模块已经存在。就相当于C语言编程时出现的redefine错误。解决方法:

解决方法:

发现新内核不能用时,重启系统,选择原来的内核进入系统。(上)篇中我们向/boot目录下拷贝了一个initrd文件(上篇中是以initrd-2.6.15.5举例的,这里以initrd-2.6.34.13为例),找到它,将它拷贝到/tmp下,再在/tmp下建一个新目录(以newinitrd为例),并将拷贝过来的initrd文件解压到这个新目录中。

步骤如下:
# cp /boot/initrd-2.6.34.13 /tmp

# cd /tmp/
# ls
initrd-2.6.34.13
#mkdir newinitrd
# cd newinitrd/
# zcat ../initrd-2.6.34.13 |cpio -i

***** blocks

解压之后在newinitrd下可以看到如下内容
# ls
bin   dev   etc   init   lib   proc   sbin   sys   sysroot


下一步就是修改init文件,它里面有一段:

echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko

这一段在这个文件中出现了两次,删掉其中一段即可。vi init 后在命令行模式输入 /region 敲回车就可以找到这一段。

删掉重复的那段之后,保存退出。
然后重新打包initrd。命令如下:


#find .|cpio -c -o > ../initrd
***** blocks
# cd ..
# gzip -9 < initrd > initrd-2.6.34.13

# ls
initrd-2.6.34.13    initrd     newinitrd

现在用重新打包的initrd-2.6.34.13覆盖/boot下原来的initrd-2.6.34.13。然后重启即可。

 

 

 

----------------------------------------------------------------------------------------------------------------------------

 

第二个问题。

启动时,出现下面的error:

insmod: error insering '/lib/dm-mirror.ko -1 Unknow symbol in module

 

这里说系统“不认识”dm-mirror.ko这个模块,那么我们直接不要它了,对系统没发现有什么影响。解决方法跟第一个问题差不多,也是修改init文件,把其中的

echo "Loading dm-mirror.ko module"
insmod /lib/dm-mirror.ko

两行删掉,然后重新打包、覆盖、重启即可。

 

 

----------------------------------------------------------------------------------------------------------------------------

 

第三个问题。

错误提示:

mount: could not find filesystem ‘/dev/root’
setuproot: moving /dev failed: No such file or directory
setuproot: error mounting /proc: No such file or directory
setuproot: error mounting /sys: No such file or directory
switchroot: mount failed: No such file or directory
Kernel panic – not syncing: Attempted to kill init!

重点是这一行  mount: could not find filesystem ‘/dev/root’
这里说现在的内核可能不支持某个文件系统而导致无法读取到需要的文件。如果你也遇到了这个问题,那么很不幸,你也要重新编译一次你的内核了(编译一次就得一个小时啊!)。

解决方法:重新编译内核。编译前先修改.config文件中的“CONFIG_SYSFS_DEPRECATED_V2”的值,默认该选项为not set,手动将其改为y。

CONFIG_SYSFS_DEPRECATED_V2=y

修改后,再编译,重启即正常了。

 

 

 

这几篇博客对大家应该有帮助:

http://hi.baidu.com/uhkmjjxckfejoxr/item/25b7665831a2a6464eff20e3

http://hi.baidu.com/dkuhg0605/item/6fe11f974278e4df1a49dfc5

http://blog.youkuaiyun.com/do2jiang/article/details/4965967

供大家参考。

 

好了,三个问题说完了。我是点儿比较背的,三个问题全遇上了,解决完第一个问题后重启发现了第二个问题,解决完第二个问题后重启发现了第三个问题,然后我就重新编译了一遍内核并提前修改了init,第三次重启才能顺利进入系统。如此周折了三个多小时。

 

但换个角度来说,遇到问题其实是好事,在解决问题的过程中会被动的学到不少东西。如果第一次直接就成功了,那我什么时候才能有机会了解到我在这篇文章里讲到的东西呢?

 

(下)篇中将介绍Linux内核的配置系统。

 

概要:   DevCon 实用工具是一种命令行实用工具,可以替代设备管理器。使用 DevCon,您可以启用禁用、重新启动、更新、删除查询单个设备或一组设备。DevCon 提供与开发人员有关但无法在设备管理器中看到的信息。   您可以将 DevCon 用于 Windows 2000 、Windows XPWindows vista。不能将 Devcon 用于 Microsoft Windows 95、Windows 98、或 Windows Millennium Edition。   下载:http://download.microsoft.com/download/1/1/f/11f7dd10-272d-4cd2-896f-9ce67f3e0240/devcon.exe 用法及参数说明:   devcon.exe [-r] [-m:\\] [...]   -r 如果指定它,在命令完成后若需要则重新启动计算机。    是目标计算机的名称。    是将要执行的命令(如下所示)。   ... 是命令需要的一个或多个参数。   要获取关于某一特定命令的帮助,请键入:devcon.exe help   classfilter 允许修改类别筛选程序。   classes 列出所有设备安装类别。   disable 禁用与指定的硬件或实例 ID 匹配的设备。   driverfiles 列出针对设备安装的驱动程序文件。   drivernodes 列出设备的所有驱动程序节点。   enable 启用与指定的硬件或 实例 ID 匹配的设备。   find 查找与指定的硬件或 实例 ID 匹配的设备。   findall 查找设备,包括那些未显示的设备。   help 显示此信息。   hwids 列出设备的硬件 ID。   install 手动安装设备。   listclass 列出某一安装类别的所有设备。   reboot 重新启动本地计算机。   remove 删除与特定的硬件或 实例 ID 匹配的设备。   rescan 扫描以发现新的硬件。   resources 列出设备的硬件资源。   restart 重新启动与特定的硬件或 实例 ID 匹配的设备。   stack 列出预期的设备驱动程序堆栈。   status 列出设备的运行状态。   update 手动更新设备。   UpdateNI 手动更新设备,无用户提示   SetHwID 添加、删除更改根枚举设备的硬件 ID 的顺序。 示例:   devcon -m:\\test find pci\* 列出计算机 test 上的所有已知 PCI 设备。(通过使用 -m,您可以指定一个目标计算机。您必须使用“进程间通信”(IPC) 访问此计算机。)   devcon -r install Windows directory\Inf\Netloop.inf *MSLOOP 安装一个新的 Microsoft 环回适配器实例。这将创建一个新的根枚举设备节点,使用此节点您可以安装“虚拟设备”,如环回适配器。如果需要重新启动计算机,此命令还将以安静模式重启计算机。   devcon classes 列出所有已知的安装类别。输出结果包含短的未本地化的名称(例如,“USB”)描述性名称(例如,“通用串行总线控制器”)。 禁用启用网卡的步骤:   1.用devcon hwids PCI*命令得到所有以PCI开头的设备。这时会列出很多设备,那么哪个才是网卡对应的呢?   2.打开设备管理器,展开网络适配器,找到网卡的名称,然后记住到刚才得到的列表中找对应的Name,然后你会在下面看到好几个ID,随便挑一个就行   3.用devcon disable "PCI\VEN_11AB&DEV_4380&SUBSYS_301B17AA&REV_10"禁用网卡(启用的话讲disable换成enable就行了)   4.其实用PCI开头得到的几组设备中一般第一个就是网卡设备 sysdzw 16:01 2010-11-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值