先确认有基本的编译环境,否则执行:
$ sudo apt-get install build-essential
注:此命令将会安装 glibc、glibc++等等相关的库及头文件。
环境说明
OS: Ubuntu 9.04 (jaunty)
kernel: linux-2.6.28-12-generic
gcc: 4.3.3
注:Ubuntu 9.04 默认使用的内核是 linux-2.6.28-11-generic,由于我安装过更新包,所以是 linux-2.6.28-12-generic
开始
1. 下载内核源代码,这里我下载的内核是 linux-2.6.29.3
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.29.3.tar.bz2
注: linux-2.6.29.3 发布于 2009-05-08,在写这篇文章时它是最新的内核,不过由于linux内核更新很频繁,每2~3周就会发布一个新版本,所以很快这个就会过时;如果你总是需要最新的版本,最好还是到 kernel.org 看看。
2. 解压
$ tar xjvf linux-2.6.29.3.tar.bz2
3. 配置内核
Ubuntu 的内核配置文件保存在 /boot 目录下,如 9.04 的配置文件是 /boot/config-2.6.28-11-generic,为了通用性,可以使用以下命令:
$ cd linux-2.6.29.3
$ sudo cp /boot/config-`uname -r`-generic ./.config
为了遵循 Ubuntu 对其内核的命名方式,需要修改 Makefile 的 EXTRAVERSION,打开Makefile,找到该行(一般就在前几行中)并修改为:
EXTRAVERSION = -3-generic
注:其中3是内核版本号2.6.29.3的最后一位,generic是 Ubuntu 的命名习惯。
4. 编译内核
$ make mrproper
注:清理内核代码树,基本上编译内核之前最好都要进行这一步。
$ make menuconfig
![](https://i-blog.csdnimg.cn/blog_migrate/7c5d4507428a7099004b92f08199a190.jpeg)
选择 'Load an Alternate Configuration File'
![](https://i-blog.csdnimg.cn/blog_migrate/3eb7345d0d4fb4be8c8a9a6f96b916bc.jpeg)
OK即可。
注:make menuconfig 是一个文本形式的图形界面配置环境,如果你喜欢更高级的图形界面配置环境,GNOME用户可以输入 make gconfig,KDE用户可以输入 make kconfig
附:(make gconfig)
![](https://i-blog.csdnimg.cn/blog_migrate/b0046f7fa4617788476aeeed7538bb0b.jpeg)
这样就加载了默认的内核配置,然后可以在此基础上自己定制。
注:如果你对自己不那么有信心,建议你使用默认的配置;否则,根据自己计算机的硬件和自己的需求定制内核是最好的方式。
定制完后保存:
![](https://i-blog.csdnimg.cn/blog_migrate/c94778f02248e165e99fa09040d20e32.jpeg)
退出配置界面后回到命令行,执行:
$ make
$ sudo make modules_install
5. 生成initrd.img
$ sudo mkinitramfs -o /boot/initrd.img-2.6.29-3-generic
6. 安装内核
$ sudo cp arch/x86/boot/bzImage /boot/vmlinuz-2.6.29-3-generic
7. 其他
$ sudo cp System.map /boot/System.map-2.6.29-3-generic
$ sudo cp .config /boot/config-2.6.29-3-generic
$ cd /
$ sudo rm vmlinuz initrd.img
$ sudo ln -s boot/vmlinuz-2.6.29-3-generic vmlinuz
$ sudo ln -s boot/initrd.img-2.6.29-3-generic initrd.img
8. 修改 GRUB 菜单
用喜欢的文本编辑器打开 /grub/menu.lst,添加对应的菜单项(这个应该很简单,可以参考旧的菜单项)
9. 重启(使用新内核)
如果你决定不再使用旧的内核,可以考虑删除旧的内核模块(因为它们很占磁盘空间),这些模块位于 /lib/modules 下,如删除 2.6.28-12-generic 模块:
注:不建议进行这一步,毕竟新编译的内核没有与发行版相关的 linux-headers,如果你想做一些开发的话则不能够缺少这些头文件!(目前我还不知道怎么做,不过可以肯定的是绝对不是 make headers_install 这么简单)
$ sudo rm -rvf /lib/modules/2.6.28-12-generic
注:如果系统上安装了 VirtualBox,还要重新编译VirtualBox的内核模块,执行:
$ sudo /etc/init.d/vboxdrv setup
未解决问题
生成特定于发行版(Ubuntu)的内核头文件。
附:(系统监视器截图)
![](https://i-blog.csdnimg.cn/blog_migrate/5df76957befcfab672fcb892f3d7819a.jpeg)