转载:
http://blog.163.com/libo_5/blog/static/156968520101016102051580/
http://hi.baidu.com/wg_wang/item/f9375c2f00ca75c0ee10f1db
debian内核编译
1、到www.kernel.org/pub/liunux/kernel所需要编译的内核源代码
2、安装必要的包,其中kernel-package是debian用以编译内核的工具;fakeroot是一个在系统中创建假root的工具;为dpkg在编译内核中所需
udev 是管理/dev和hotplug的守护进程;build-essential是创建deb包所需的信息列表;yaird是用来创建内核初始引导镜像的工 具,注意笔者编译的时刻,lenny(testing)版本的debian下是没有这个包的,需要在etch(stable)或 sid(unstable)下才有。
apt-get install kernel-package libncurses5-dev fakeroot
apt-get install build-essential udev
apt-get install libhtml-template-perl libparse-recdescent-perl
apt-get install yaird
3、把源代码放到kernel目录下并解压并进入该文件夹,如cd linux-2.6.24.3。
4、配置内核选项,选项内容巨多,笔者把reiserfs文件系统编译成内建的了,还增加了smp和超线程支持,并去掉无线,蓝牙,1394等不会用到的模块等等。
make clean && make mrproper
make menuconfig
5、创建内核的deb包,这个过程花费一定的时间,结果会在kernel目录下得到一个deb包,如linux-2.6.24.3_2.6.24.3_i386.deb。
make-kpkg clean
fakeroot make deb-pkg
6、安装内核的deb包
dpkg -i *.deb
7、创建Ramdisk
mkinitrd.yaird -o /boot/initrd.img-版本号
8、配置grub引导选项,如果不是grub引导的,请使用其他命令。
update-grub
9、如果不想要卸载就得内核的话,跳过(建议不要卸载,否则出了问题的话就惨了)。版本号可以在/boot下面看到。
dpkg --purge --force-remove-essential 内核软件包名称,包括完整版本号
10、重启,启动时选择新的版本号的那个选项就可以了。
最 近反复编译内核十余次,其间得到了d00m3d兄、simon22543兄、waq兄、聚焦深空兄等人的很多帮助,大量参考了金步国兄 ([email protected])的作品( http://lamp.linux.gov.cn/Linux/kernel_options.html )十分感激,一并致谢!现在把自己的些许心得与大家分享。
一、为什么要编译内核
第一,可以支持一些现有内核不支持的硬件。如我的无线网卡。第二,可以加快运行速度。使用新内核启动,感觉splashy的进度条很快,明显超
过Debian自带的内核。究其原因,是因为一个发行版,为了普遍适应各种用户的需求,不得不支持很多的硬件,其中,可能你一辈子也用不上。 通过重新编译内核,可以大幅缩小内核尺寸,提高运行速度。第三,可以学会如何定制、裁减、编译自己的内核。
第二、编译内核前的准备
主要是安装几个必须的文件,通常可以这样:
sudo aptitude install gcc g++ make kernel-package libncurses5-dev
第三、Debian中编译内核的步骤
首先,sudo vi /etc/apt/source.list,把所有源的类型替换为sid。通常使用sid,可以体验更好的运行速度和内核的新特性。
其 次,sudo aptitude update && sudo aptitude install linux-source-2..6.32。这时会在/usr/src里多出一个名为linux-source-2.6.32.tar.bz2的文件。我 们把它解压缩 sudo tar xvfj linux-source-2.6.32.tar.bz2,然后进入新产生的目录,cd linux-source-2.6.32。现在,在linux-source-2.6.32目录里依次执行下面几条命令:
sudo make menuconfig 这里可以针对自己的硬件进行调整。
sudo make-kpkg clean 这个命令的作用是清理环境,为下面的编译打基础。
sudo make-kpkg --append-to-version -dacheng --revision 1.0.custum kernel_image 这个命令用来编译内核,如果你在内核选项里使用了initram,可以增加一个选项 --initrd。建议大家使用man make-kpkg看看相关的选项,因为有些必须以数字开始,有些不可以使用大写字母。我的
CPU是P4m 2.2,编译一次大约要使用65分钟。编译完毕后,会在/usr/src里多出一个名为linux-image-2.6.32-dacheng_1.0.custum_i386.deb的> 文件。
sudo dpkg -i /usr/src/linux-image-2.6.32-dacheng_1.0.custum_i386.deb 这当然是安装新内核了,呵呵~
第四、编译内核的技巧
1、make menuconfig的作用是产生一个.config文件。通常我们可以先cp /boot/config-2.6.xx /usr/src/linux-source-2.6.32/.config,然后
sudo make menuconfig,在出现的菜单中,首先执行倒数第二项load an alternate configuration file,系统会自动读取.config文件。然后配
置各选项会方便一些。
2、 新人编译内核,往往要编译多次才能成功。为了下次编译方便,在make menuconfig结束后,sudo cp .config /root/.config,下次在make menuconfig前,先把/root下的.config文件复制过去。sudo cp /root/.config /usr/src/linux-source-2.6.32。如果新内核可以启动系统,sudo cp /root/.config /root/config。总之,/root/.config是一个实验性的配置文件,/root/config是一个相对正确的配置文件,每次编译可在 上
次配置文件基础上编译,用来减少BUG。一旦新内核BUG减少,马上备份为/root/config。
3、掌握几个必要的单词:
experimental 实验的,实验性的
deprecated 不赞成的,反对的
unsafe 不安全的
obsolete 废弃的
4、认识几个符号
[ ]:可以编入内核,也可以不编入内核,视自己的硬件而定
< >:可以编入内核、编为模块、也可以不编入内核
{ }:本功能被其它功能所依赖,因而被自动选定,此时可以编入内核、也可以编为模块
5、五种基本操作
输入y:把本功能编入内核
输入n:内核中没有此功能
输入m:把本功能编为一个模块,运行时可以动态插入或卸载
输入?:查看帮助
输入/:进行搜索
6、建议选中General setup===>Prompt for develpment and/or incoming code/drivers,因为部分功能需要该选项,例如pppoe。
7、内核的很多功能存在相互依赖的关系,如果你需要的一个功能总找不到,可以用/搜索,然后检查依赖关系是否满足。下面通过一个例子说明 。
Symbol: ATH_COMMON [=y]
Prompt: Atheros Wireless Cards
Defined at drivers/net/wireless/ath/Kconfig:1
Depends on: NETDEVICES [=y] && WLAN [=y] && WLAN_80211 [=y] && CFG80211 [=y]
Location:
-> Device Drivers
-> Network device support (NETDEVICES [=y])
-> Wireless LAN (WLAN [=y])
-> Wireless LAN (IEEE 802.11) (WLAN_80211 [=y])
上述例子中,ATH_COMMON是无线网卡的驱动。第四行说明只有NETDEVICES、WLAN、WAN-80211、CFG80211都被编进内核时,本项驱动才可以被选中。
7、 为了缩小内核的尺寸,建议大家把kernel compression mode设置为LZMA,同时尽量把一些功能编译为模块,如对FAT、FAT32、NTFS文件系统>的支持,声卡、显卡、网卡、USB设备等。但 有些功能必须编入内核,否则新内核不能启动。如system v ipc、对IDE硬盘的支持(当然,如果使>用SATA硬盘就无所谓了)、对ext2文件系统的支持、 Virtual terminal等。
现在,我的新内核仅为1.4M,所有模块仅为11M。截图如下,并附上我的config文件(大家可以把该文件解压到/usr/src/linux-2.6.xx下,命名为.config直接使用)。
1. As a rule of thumb, it is always a good practice to run "make mrproper" in the kernel source tree upon unpacked.
2. If you always test or switch between kernels, this trick may be useful:
http://www.linuxsir.org/bbs/thread335331.html
3. Bare in mind, display driver is also kernel modules. Therefore, if a new kernel is installed, it is necessary to re-compile the display driver. It is true for both A-cards or N-cards.
4. To compile kernel modules, such as display drivers, it is necessary to have the same compiler version as the running kernel.
另外其他/usr /var 目录可以瘦身吗
/var,好像只可以aptitude clean了。如果很在意,Debian了有两个包可以删除本机上用不到的软件,论坛里有介绍的,可以搜索试试。
作者: dacheng
.....
/var,好像只可以aptitude clean了。如果很在意,Debian了有两个包可以删除本机上用不到的软件,论坛里有介绍的,可以搜索试试。 |
我这边单是nvidia的驱动就占12M,而lz所有的模块加起来才11M。
作者: dacheng
要控制内核大小,主要有三点。一是按d00m3d兄的指点,对内核采用LZMA压缩,二是对自己需要的功能,如驱动等尽量编译为模块,第三,不需要的东西,尽量不支持,如业余无线电什么的。如果需要也尽量编译为模块。
/var,好像只可以aptitude clean了。如果很在意,Debian了有两个包可以删除本机上用不到的软件,论坛里有介绍的,可以搜索试试。 |
我安装 Debian 的时候最后有个提示安装本机还是全部的驱动(target or genric),这个安装不是在内核中进行吗?
作者: fender010
lz安装显卡驱动了吗?
我这边单是nvidia的驱动就占12M,而lz所有的模块加起来才11M。 |
ATI 开源,可是兼容性屡屡出问题,还不支持硬件解压
作者: archenemy
LZ 你怎么做到比原版小那么多的内核和模块,裁减掉了很多东西?还是压缩了?
另外其他/usr /var 目录可以瘦身吗 |
/usr/share/zoneinfo 之內不合用的也可刪之