红联Linux门户
Linux帮助

Ubuntu14.04更换内核重启出现:Missing Modules

发布时间:2016-10-08 09:59:31来源:linux网站作者:M0zi
1、前言
最近由于实验的需要,需要更换Linux系统的内核。我的系统是Ubuntu14.04,内核版本时3.19。
由于实验的平台需要内核版本3.14.0,只好将Ubuntu14.04的内核从3.19降级到3.14.0。在编译安装之后,运行命令:update-grub,重启之后发现没有出现Grub程序菜单。接下来就是一系列问题。
 
2、问题
2.1、重启之后没有出现Grub菜单
由于Ubuntu14.04使用的是Grub2.0,在有些地方的配置与以前的Grub有所不同。重启之后没有出现Grub菜单,是由于Grub菜单被隐藏,并且是按照默认启动。
解决方法:
将/etc/default/grub文档中的GRUB_HIDDEN_TIMEOUT=0注释掉
2.2、出现菜单之后,进入新内核,出现如下提示:
Gave up waiting for root device. Common problems:
-Boot args (cat /proc/cmdline)
-Check rootdelay= (did the system wait long enough?)
-Check root= (did the system wait for the right device?)
-Missing modules (cat /proc/modules; ls /dev)
ALERT! /dev/sda does not exist ...
或者
ALERT!  /dev/disk/by-uuid/34e5c1 ... does not exist ...
如果Grub.cfg没有出现什么重要的改动(直接运行update-grub之后),出现问题就是 Missing modules。
由于Linux启动时,initramfs需要从initrd.img中读取系统中一些基本的驱动程序。而如果在编译内核的过程中,没有操作好,initrd.img会被破坏,最直接的表现是initrd.img文件大小比正常的小很多。
可以使用如下命令比较各个initrd.img的大小:ls -l initrd*
解决方法:
重新创建对应内核的initrd.img:
备份以前编译的initrd.img,以免出错:
# cp /boot/initrd.img.$(编译内核的版本) /root
在管理员权限下创建新的initrd.img
# mkinitramfs -o /boot/initrd.img.$(编译内核的版本) $(编译内核的版本)
# ls -l /boot/initrd.img.$(编译内核的版本)
重新更新下Grub.cfg(之前已经更新过,最好还是更新一下),重启
# update-grub
# reboot
 
3、小结
最终以上问题可以解决,编译Linux内核的时候,一定要仔细。一般编译内核快的要半个小时,有时可能需要1小时或以上,有时候一个小的失误可能会导致前面的工作白费。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/24835.html