第一步:准备工作
打开终端获得root权限:sudo su
然后安装编译内核时需要的工具:
apt-get install build-essential kernel-package libncurses5-dev libqt3-headers
build-essential (基本的编程库(gcc, make等)
kernel-package (Debian 系统里生成 kernel-image 的一些配置文件和工具)
libncurses5-dev (meke menuconfig要调用的)
libqt3-headers (make xconfig要调用的)
其他工具在升级过程中可以按提示安装
第二步:下载内核源代码linux-2.6.34.tar.gz
请到www.kernel.org官网下载最新版本linux-2.6.34.tar.gz内核
假设下载在root目录,然后解压到/usr/src/linux-2.6.34目录里
cd /usr/src
tar zxvf /root/linux-2.6.34.tar.gz
解压后会在/usr/src生成新文件夹linux-2.6.34
第三步:配置
把正在使用中的内核配置文件/usr/src/linux-headers-2.6.32-22-generic/.config 拷到/usr/src/linux-2.6.34目录下
cp /usr/src/linux-headers-2.6.32-22-generic/.config /usr/src/linux-2.6.34
执行:
cd /usr/src/linux-2.6.34
make menuconfig
终端会弹出一个配置界面
注意主菜单最后有两项:load a kernel configuration...
save a kernel configuration...
先选第一项load ....,意思是,利用当前的内核配置详单来设置将要编译的内核,然后选save这一项保存,最后退出配置界面。
第四步:开如编译安装新内核
执行:sudo make mrproper (清除以前曾经编译过的旧文件,如果你是第一次编译,可不执行)
执行:sudo make (编译,可以加-j4,如果你CPU是双核心,够牛的话,因为可以提高速度)
然后:sudo make install
再:sudo make modules (编译模块)
再:sudo make modules_install (安装模块)
第五步:最后创建initrd文件:
mkinitramfs -o /boot/initrd.img-2.6.34
或者是使用initramfs-tools生成initrd.img,命令如下:
update-initramfs -c -k 2.6.35.2
之后会利用lib/modules下的文件生成initrd.img-2.6.34(位置在boot文件夹下).
第六步:更新配置GRUB引导列表(修改grub.cfg的img的路径。重新启动选择2.6.34,启动成功!)
sudo gedit /boot/grub/grub.cfg
我的grub.cfg添加如下:
menuentry 'Ubuntu 10.04,Linux 2.6.34' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod ext2
set root='(hd1,9)'
search --no-floppy --fs-uuid --set 501d3a42-1d52-4438-99bf-e679da605867
linux /boot/vmlinuz-2.6.34 root=UUID=33883099-83a5-49f3-9c12-ee6a4d90da9e ro quiet splash
initrd /boot/initrd.img-2.6.34
}
#以下是原2.6.32内核启动项
menuentry 'Ubuntu,Linux 2.6.32-22-generic' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod ext2
set root='(hd1,9)'
search --no-floppy --fs-uuid --set 501d3a42-1d52-4438-99bf-e679da605867
linux /boot/vmlinuz-2.6.32-22-generic root=UUID=33883099-83a5-49f3-9c12-ee6a4d90da9e ro quiet splash
initrd /boot/initrd.img-2.6.32-22-generic
}
在启动的过程中发现,ubuntu默认启动下是看不到grub的启动菜单的(在多系统的机器上可以看到,但虚拟机中无法看到),
因此需要修改grub.cfg中关于时间的控制即timeout,有两个地方:
if [ "${recordfail}" = 1 ]; then
set timeout=-1
else
set timeout=10
fi
和
if keystatus; then
if keystatus --shift; then
set timeout=-1
else
set timeout=0
fi
else
if sleep --interruptible 3 ; then
set timeout=0
fi
fi
fi
前者为系统失败或成功的等待时间,后者为启动时按住shift或不按shift的等待时间,在虚拟机中可以在启动时按住shift或者直接把后者的timeout全部改为10
第七步sudo update-grub
第八步.更新显卡驱动
重启后nvidia显卡驱动出错,报告ubuntu 正在运行在低画质模式,后面是各种failed to load。
通过ppa(personal package archive https://launchpad.net/ubuntu/+ppas)解决驱动更新问题
sudo sh -c "echo 'deb http://ppa.launchpad.net/nvidia-vdpau/ppa/ubuntu lucid main' >> /etc/apt/sources.list"
sudo sh -c "echo 'deb-src http://ppa.launchpad.net/nvidia-vdpau/ppa/ubuntu lucid main' >> /etc/apt/sources.list"
sudo apt-get update
sudo apt-get install nvidia-current nvidia-current-modaliases nvidia-settings
注意:这里要根据每个人电脑里原2.6.32内核启动项修改新的内核启动项,参考上面的程序,一样的参数就复制就可以了
到此为止,整个内核的编译就全部完成啦。
不过也许你重启系统时,虽然启动菜单中增加了新内核2.6.34的启动项,但极可能会启动失败,出现以下提示:
warning:can't open directory /lib/modules/2.6.34/modules.dep,no such files or directory
此时不应气馁,玩LINUX要有敢食螃蟹的勇气和毅力,哈哈。静下心,选择从旧内核启动登录系统,然后执行以下命令(为了避免输入错误,最好复制下面的命令)
修改后就能成功启动新内核了。
######################################
sudo su (保证获得root权限,否则会提示权限不够,不能成功完成任务哦)
cd /boot
cp initrd.img-2.6.34 initrd-2.6.34.old (先做一个备份以防万一,哈哈)
depmod -a
update-initramfs -k 2.6.34 -c
cd /tmp
gzip -dc /boot/initrd.img-2.6.34| cpio -id
touch lib/modules/2.6.34/modules.dep
find ./ | cpio -H newc -o > /boot/initrd.img-2.6.34.new
gzip /boot/initrd.img-2.6.34.new
cd /boot
mv initrd.img-2.6.34.new.gz initrd.img-2.6.34
######################################
完成上述操作后,重启系统,选新内核启动,会弹出一个小英文窗口,先选择grub update grub .......
(因为无法截图,记不清了,大概有这些字样)这一项来更新GRUB,然后再选最上面的一项,好象是resum字样的,
不知道有没有记错,哈哈,请细心点吧。完成后重新启动电脑,GRUB菜单会更新成有好多启动项了,
就象刚安装完UB10.04时一样,不过你可以登录系统后再修改/boot/grub/grub.cfg来简洁它。到此编译安装工作圆满成功,谢谢各位看官的支持!
备注:
1、vmlinuz是可引导的、压缩的内核
2、initrd.img的作用:initrd.img是Linux启 动过程中很重要的一个文件,如果你编译内核时将一部分功能编译为可加载模块。
如果系统的一些设备的驱动编译为可加载模,那么启动时如果没有指定 INITRD=/path_to_initrd.img,那么系统启动或者会失败,
或者启动后会有设备无法使用(像网卡或者其它设备)。如果没指定initrd.img或者指定的initrd.img中并没有包含正确的驱动模块,
则系统启动时会挂起,并报告"kernel panic: VFS: Unable to mount root fs on 08:06"的错误。
3、需提高:对于只是顺利的走完整个流程,对于各步骤的细节很不清楚,如对内核的配置(menuconfig),内核源码makefile的了解,
以及生成vmlinuz和img的过程和两个文件的作用都不清楚,还需要再对其进行深入分析和学习!