编译和安装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,第三次重启才能顺利进入系统。如此周折了三个多小时。
但换个角度来说,遇到问题其实是好事,在解决问题的过程中会被动的学到不少东西。如果第一次直接就成功了,那我什么时候才能有机会了解到我在这篇文章里讲到的东西呢?
转载:https://blog.youkuaiyun.com/newthinker_wei/article/details/8018804