红联Linux门户
Linux帮助

ubunut下编译内核

发布时间:2007-10-04 00:09:40来源:红联作者:yfengsde
Step 1:
下载最新的(或你想要的Linux内核源码)

下载地址:www.kernel.org

可以通过uname -a命令查看当前系统内核的版本好及编译时间

得到源码后,将其解压到某个目录下

推荐解压到~/linux/ 目录下,至于为什么,等我明白了再告诉你


Step 2:
打开终端,进入源代码目录下,比如:

cd ~/linux/linux-2.6.20.1/

进入后,安全起见,先 make mrproper 一下,

以清除目录下所有配置文件和先前生成内核时产生的中间文件

接下来将要进行内核配置,这是最难也是最关键的一步

有四种方法可完成这件事情:

#make config

#make menuconfig

#make xconfig

#make oldconfig

我用的是第二种,但这时问题来了,运行命令后发生错误,而且一堆

最关键的错误信息是少一个库

原来,Ubuntu安装时缺少很多东西,尤其是编程方面的,需要自己通过“源”来安装

所谓“源”,不清楚,大概就相当于Windows的在线升级程序吧

Ubuntu自己带的源不全,速度慢不说,有的还连不上,所以要自己添加一些源

把源设置好之后,就可以在线安装所需要的东西了

在这提醒一下使用Ubuntu的朋友:

使用源第一次进行自动更新的时候,Ubuntu里带的输入法也会更新

但这次的更新与上个版本不兼容,因此会导致输入法无法使用

我为这个问题郁闷半天,上网查很久才找到解决方法:

sudo apt-get remove fcitx
rm -R ~/.fcitx
sudo apt-get install fcitx

就是把原来的fcitx输入法卸掉,移除它在根目录下的配置文件(?好像是),然后重装

ok,言归正传,编译内核需要下面一些东西:

apt-get install libncurses5-dev (meke menuconfig要调用的)

apt-get install libqt3-headers (make xconfig要调用的)

上面列的不全,但你安装的时候,源会提示你,哪些包是推荐安装的

都装上就是了

如果连基本的编程库(gcc, make等)也没有的话

apt-get install build-essential

如果上面的东西都装完了,恭喜你,终于可以make menuconfig了

但先别急,相信你现在的系统正用得很爽

上网,声音,显示???什么问题都没有

但等你重新编译内核后,可能你就少些东西了,比如上不了网,声音没了等等

严重的连系统都进不了

为此,你最好把现在内核用的.config文件拷贝过来,当作模版

当你make menuconfig后,选倒数第二项:load config(好像是这个名字,记不清了)

把.config加载进来,这样你就能在原来内核的基础之上修改了

这时相信你只要别随便减去什么东西

编好内核后一样用得很爽

至于menuconfig里面数不清的选项都是什么意思

相信你即使很懂英文也看不太明白

我从网上找了一个解释其中一些选项的,发到了论坛上

后来发现黄诚那有更全的,真太有才了

但有一个选项,一般很少提到,就是如果你发现编译完之后

重启时进度条没有了

多半是因为你在Device-drivers==>Graphic ???==>Console???(路径记不清了)下有个

CONFIG_FRAMEBUFFER_CONSOLE,不能是M(动态加载),而是要×(编译进内核)

就是顺便提一下,如果你有这个问题,去找一找,呵呵



配置好后,强烈建议你把生成的.config文件备份一下

这样将来一旦有什么问题

你可以马上copy过来,在原来的基础上继续


Step 3:
接下来就简单了

如果你人品够好,下面四个命令之后就ok了:

make clean

make -j4 (-j4是让处理器分成四个线程来编译内核,速度快,推荐CPU好的使用)

make modules_install

make install

结束后重启,就可以在启动菜单上看到新内核了

我人品不够,或者说Ubuntu太另类

居然不给我生成initrd文件

上网查,原来要用下面的命令:

make-kpkg clean (kpkg具体什么作用不懂)

make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers

其中--initrd必需要,不然生成不了initrd文件

--append生成多重镜像,也就是在启动菜单里看到的选项

Wing1是你自己取的镜像的名字

编号内核后,就会显示linux-2.6.20.1-custom最后两项是生成镜像包和头文件包

make完之后,会在上一层目录看到两个deb包

用dpkg -i命令安装这两个包就好了

安装内核及头文件包
sudo dpkg -i linux-image-2.6.22.1-2.6.22.1_2.6.22.1-2.6.22.1-10.00.Custom_i386.deb
sudo dpkg -i linux-headers-2.6.22.1-2.6.22.1_2.6.22.1-2.6.22.1-10.00.Custom_i386.deb
这个过程结束后,/boot/grub/menu.lst中会自动添加新的启动项,不用再手动更改,非常方便。
重新启动即可进入新内核,这中方式应用在debian中,ubuntu同样适用,并且比传统的方式简便许多

这个时候,一切都弄好了

可以去/boot目录下看看Vmlinuz、initrd、System.map文件是否都在

然后看看/boot/Grub/menulist文件中的内容是否已经加上你新编译的内核

如果是,恭喜你,放心大胆的重启吧

重启后,就可以进入你自己编译的内核了




常规方式编译内核:




1.安装必要的工具包

包有:libncurses5-dev(menuconfig需要的)和essential

sudo aptitude install build-essential bin86 kernel-package
sudo aptitude install libqt3-headers libqt3-mt-dev
sudo aptitude install make
sudo aptitude install gcc //即使已经安装了gcc最好也更新一下
另外,在终端输入 sudo mki 然后连按两次“Tab”键看一下终端是否显示
mkinitramfs mkisofs
这两个工具在编译内核时用来生成 *.img文件的,没有的话安装一下



第二步 下载内核

www.kernel.org下载新内核,当前最新的是linux-2.6.21.1.tar.bz2(原系统的内核是2.6.20-15-generic,如果你使用Nvadia的加速驱动的话,请用源里的Source,否则可能启动不了X)

第三步 编译前的准备

察看当前内核的版本
uname -a
2.6.15-26-server
如果下载的内核版本和当前的内核版本一样的话:
cd /lib/modules
将其下的文件夹改名
同时将/boot下一些东西也要改,改了以后还要修改/boot/grub/menu.lst
比较麻烦,建议最好下载比当前已安装版本高的内核

解压linux-2.6.21.1.tar.bz2得到的linux-2.6.16.2文件夹放到/usr/src下
sudo ln -s linux-2.6.21.1 linux //如果该文件夹下已经有名为linux的链接请先把它改为linux.old




第四步 开始编译

cd /usr/src/linux //以下所有的工作都在/usr/src/linux下完成
sudo make mrproper //去除.o的已编译文件
sudo make menuconfig //用menuconfig的话还需要另外两个工具包支持,叫什么名字我忘了,Ncurses?或者用
sudo make xconfig

接下来你就慢慢配置吧,配置完以后保存(系统中保存的一份内核配置文件是在/usr/src/linux 下名为.config,你也可以自己在别的地方另存一份)

sudo make dep //也许系统会提示现在不必要进行make dep,那就下一步
sudo make clean //清除旧数据
sudo make bzImage //编译内核,bzImage是你给该新内核起的名字,将保存到/usr/src/linux/arch/i386/boot/下
sudo make modules //编译模块
sudo make bzImage install //安装内核
sudo make modules_install //安装模块
sudo mkinitramfs -o /boot/initrd.img-2.6.21.1 2.6.21.1

安装完后/boot下将增加以下几个文件(用ls -l 查看)
lrwxrwxrwx 1 root root 15 2007-05-17 21:31 config -> config-2.6.21.1
-rw-r--r-- 1 root root 71023 2007-05-17 21:31 config-2.6.21.1
-rw-r--r-- 1 root root 39445347 2007-05-17 21:48 initrd.img-2.6.21.1
lrwxrwxrwx 1 root root 19 2007-05-17 21:31 System.map -> System.map-2.6.21.1
-rw-r--r-- 1 root root 795827 2007-05-17 21:31 System.map-2.6.21.1
lrwxrwxrwx 1 root root 16 2007-05-17 21:31 vmlinuz -> vmlinuz-2.6.21.1
-rw-r--r-- 1 root root 1703296 2007-05-17 21:31 vmlinuz-2.6.21.1


添加一个新的启动项 :
sudo vim /boot/grub/menu.lst

title Ubuntu, kernel 2.6.21.1
root (hd1,0) //注意分区名称
kernel /boot/vmlinuz-2.6.21.1 root=/dev/sdb1 ro
initrd /boot/initrd.img-2.6.21.1
boot
文章评论

共有 1 条评论

  1. 奶茶dsk 于 2007-10-04 13:12:09发表:

    有的是F7,还是支持下。。:0L