2022年linux内核编译心得 2.pdf
linux内核编译心得2008-10-17 15:06 经过 2 周多的时间,一次又一次的对内核动刀,并反反复复的编译内核。终于我成了熟练工。对于内核的编译,我也有了一些自己的心得。内核编译是痛苦的,不可预料的困难是很多的。但是我都绕过或者解决了。我将这些经验分享给大家,希望能有帮助。内核编译第一步,先安装内核编译的必要工具(需要说明的是我使用Linux 的是Ubuntu):apt-get install build-essential(安装 gcc,make 等)apt-get install libncurses5-dev(安装 make menuconfig 时必须的库文件)apt-get install kernel-package,fakeroot(Debian 系统里生成 kernel-image 的一些配置文件和工具)kernel-package可能会出现安装不上的问题,E:无效操作 kernel-package 但是我用 aptitude search kernel后发现有这个安装包,然后将安装包的包名用复制的方式填入命令行,这样就可以安装了。apt-get install apt-get install initramfs-tools,module-init-tools (initramfs-tools好像是 2.6.17 内核以上版本用的,以下的版本用initrd)如果不安装 build-essential,就会在 make menuconfig 时出现 error:sys/types.h:No such file or directory等错误。如果不安装 libncurses,就会出现 error:curses.h:No such file or directory错误。当初我遇到这个错误时,使用这个aptitude install libncurses5-dev命令,却找不到安装包。郁闷的重新设置了源,仍然找不到,无奈之下,只好手动自己安装了。先下载一个 ncurses-5.6.tar.gz,地址是 http:/ftp.gnu.org/pub/gnu/ncurses/ncurses-5.6.tar.gz tar zxvf ncurses-5.6.tar.gz cd ncurses-5.6./configure prefix=/usr with-shared without-debug make make install clean 然后再运行 make menuconfig 就好了,呵呵。实际上,后来我才发现为什么会找不到这个安装包,居然是因为我的软件源设置的有问题。配置安装源只需要将好的 sources.list复制到/etc/apt下。然后 aptitude update 即可实现安装源的更新。然后再次去查找这些软件包,就能找到了。内核编译第二步,从网上下载新的内核源码,并解压缩。名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 4 页 -比如,将 linux-2.6.24.tar.gz复制到/usr/src中tar xzvf linux-2.6.24.tar.gz 建立一个 ln ln-s linux-2.6.24 linux cd linux make mrproper 为编译做准备。内核编译第三步,make menuconfig 来配置。这是内核编译是否成功的关键,很容易配置不好,导致无法从新内核启动。常见的错误有 Could not open/lib/modules/2.6.22.14/modules.dep.temp for writing。或者然后就在 waiting file system处死机。这些我们先按下不谈。先说说配置中需要注意什么。选择处理器Processor type and features-Processor family-386 Ram Disk 驱动(在 devices driver里)Block devices-RAM disk support(4096)Default RAM disk size(NEW)Initial RAM disk(initrd)support 文件系统File systems-*Ext3 journalling file system support *Ext3 Security Labels *JBD(ext3)debugging support BusLogic 驱动(devices driver-scsi device support里)SCSI support-SCSI low-level drivers-BusLogic SCSI support 另外,(Device drivers-ATA/ATAPI/MEM/RLL support 中)Include IDE/ATA-2 DISK support 如果你的/boot 是放在 IDE硬盘上,那么这里一定要选Y,选 M都不行。否则启动时会出现“waiting for root file system”的提示而停滞不前。SCSI device support 如果有 SATA硬盘,就选 Y SCSI disk support 如果你的/boot 放在 SATA 硬盘上,一定要选Y。PS:最主要的就是 file system 和 device 中的选择了,如果你不想麻烦,就大部分都选上吧。ext2 和 ext3 的都要选上。scsi 和 SATA,IDE 的也都选上。内核编译第四步,漫长的编译过程。make make install make modules make modules_install mkdir/lib/firmwar/2.6.24(这一步是需要的,因为如果没有这个,下一步名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 4 页 -mkinitramfs就会出错,说找不到这个目录。)/usr/src/linux#/usr/sbin/mkinitramfs-o/boot/initrd.img-2.6.24 2.6.24 大概整个编译过程需要持续40 分钟到 1 个半小时不等。内核编译第五步,修改menu.lst。gedit/boot/grub/menu.lst 复制原来的,只改一下 title。root 不改。kernel改一下/boot/vmlinuz-2.6.24即可,root 不动,后面的 ro 加上,但是把 quiet 删了,如果加上这个,就不显示启动过程了。initrd改动为/boot/initrd.img-2.6.24即可。内核编译第六步,reboot。如果你编译成功了,那么祝贺你,你太幸运了,一下就编译成功了。编译不成功才是正常的,呵呵。我说说我遇到的问题,并如何解决的吧。最开始是这个错误:Could not open/lib/modules/2.6.22.14/modules.dep.temp for writing 后来在 waiting file system处死机。后来感觉menu.lst 中的 root=/dev/sda1才对。我在 grub 中用“E”编辑启动,反复试验,发现 VMware 确实是应该是 sda1,因为原来可以启动的选项,我这样改是可以进入的。但是我新编译的内核却仍然不行,恍然大悟,很可能是新编译的内核没有选中SCSI设备。再次重新选择,并编译,还是老错误。然后就莫名的死机了,但是比刚才的结果又前进了一步。在困扰了我一天之后,我决定将虚拟机模拟出IDE硬盘,再重新编译内核。选择custom 创建虚拟机,new machine5.选择 IDE硬盘。最后成功了。呵呵。但是在我对老版本内核进行编译时,又有了新问题。编译2.6.16 内核时遇到一个小问题,make出现 undefined reference to _stack_chk_fail错误。我百度了一下,修改了Makefile文件,问题得以解决。it seems that CFLAG-fstack-protector is add by default to our CFLAGS in edgy preventing some kernel to be build.i manually edit the Makefile and add after the line:CFLAGS :=-Wall-Wundef-Wstrict-prototypes-Wno-trigraphs -fno-strict-aliasing-fno-common to:CFLAGS :=-Wall-Wundef-Wstrict-prototypes-Wno-trigraphs -fno-strict-aliasing-fno-common -ffreestanding-fno-strict-aliasing-fno-common-fno-stack-protector CFLAGS +=$(call cc-option,-fno-stack-protector-all -fno-stack-protector)后来还是没有过,可能是因为gcc 版本过高的原因,现在Ubuntu7.1 默认的是4.1 版本,我将它降为3.3.6 版本了。降的方法就是,aptitude search gcc 名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 4 页 -aptitude install gcc-3.6 然后进入/usr/bin下ln-s gcc-3.3 gcc 最后输入 gcc-version查看,发现 gcc 的版本已经倒回去了。呵呵。而且老版本里要用mkinitrd而不是 mkinitramfs。郁闷的是,不知道是什么原因,这个版本的编译总是不顺利。后来我放弃了2.6.16 内核,采用了 2.6.18 的内核,并没有出现这些问题,一次就通过了。呵呵。最后是一些 Ubuntu 下偶尔出现的问题。/无法获取权限。$su-root Password:su:Authentication failure Sorry.这时候输入$sudo passwd root Enter new UNIX password:Retype new UNIX password:passwd:password updated successfully 这时候就可以进入根目录了。然后我在鹦鹉螺中输入smb:/192.168.5.130就可以访问局域网上的服务器的共享文件夹了。将 sources.list复制到/etc/apt下。然后 aptitude update即可实现安装源的更新。然后就可以很顺利的apt 了,呵呵。名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 4 页 -