linux内核编译(2)2.4-->2.6

本文分享了作者在暑假期间成功编译Linux内核的经历,详细介绍了编译过程中的关键步骤,包括下载内核源码、配置内核选项、解决依赖问题及最终的内核编译与安装。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在暑假放假的时候,准备编译内核,并在网上找了些资料试了一下。因为时间的关系,这学期从头开始编译。结果,在今天凌晨3点终于成功了。到现在还是有点激动。^_^。
这里总结一下。


简单地说一下步骤。
1.下载内核到/usr/src,解压。得到dir/linux-2.6.14-1,cd linux-2.6.14-1
2.update modules_init_tools,mkinitrd.
3.make menuconfig.
4.make (make bzImage,make modules)
5.make modules_install.
6.make install.

关于第一步,就不用多说了。
关于第二步,
        首先是下载,以前找了很多地方没有找到可下载的。终于在阅读了源码里面/Documents/Changes后,才发现里面有给出下载的地址。
下载module-init-tools-3.1.tar.bz2
    ./configure --prefix=/
    make moveold
    make all install
    ./generate-modprobe.conf /etc/modprobe.conf
  命令"make moveold"将把系统原来的modutils工具程序改名为"*.old"(比如,lsmod.old等等).   这将使得你可以继续使用原有的linux-2.4.x系统, 因为在2.4.x系统下, 新的module-init- tools工具包实际上是倚赖原来"*.old"程序来加载内核模块. 如果忘记了这一步也不要紧张, 可 以先下载并安装原来的modutils程序包, 然后按照上面的步骤重来一遍就可以了. 新的module-init-tools工具包不再使用原来的/etc/modules.conf配置文件了, 而是使用新的配 置文件/etc/modprobe.conf. 因此必需用命令"./generate-modprobe.conf   /etc/modprobe.conf"来生成新的配置文件/etc/modprobe.conf.

下载新的mkinitrd
    mkinitrd-4.1.18-2.i386.rpm
    它需要依赖lvm2-2.00.25-1.01.i386.rpm  device-mapper-1.00.19-2.i386.rpm 分别下载他们。
    在安装的时候,注意他们的顺序。如果在原来的系统的中已经安装有lvm和mkinitrd,那么安装的时候加上--force选项,如rpm -ivh --nodeps --force package name.(反正我是这样的,现在还不知道会有什么后果。)
如果不更新这个包在make install时会提示以下错误: 

        No module mptbase found for kernel 2.6.10-bk4, aborting.
        mkinitrd failed
        make[1]: *** [install] Error 1
        make: *** [install] Error 2

 其实,编译内核这么多的步骤。我觉得最重要的就是第三步make menuconfig。我在这个阶段试了n次吧。

也记不得了。因为我的是在vmware上的,所以默认的是scsi硬盘,在选择的时候,选上对他的支持。还有

,在格式化硬盘的时候,用的是ext3的fs,所以,也得选上对ext3的支持。这些都是参考
http://h4001.blog.hexun.com/4517056_d.html中,
(2)进入解压后的目录,$make menuconfig(基于X11的图形内核配置工具)。注意,在Vmware下以下选

项必须选上,否则编译要出问题:

      Device Drivers  --->SCSI device support  ---><*> SCSI disk support

Device Drivers  --->SCSI device support  --->SCSI low-level drivers  ---> <*> BusLogic SCSI

support

Device Drivers  ---> Fusion MPT device support  ---><M> Fusion MPT (base + ScsiHost) drivers

和<M> Fusion MPT misc device (ioctl) driver(这个不确定)

Device Drivers  ---> USB support  ---><*> USB Mass Storage support

Device Drivers  ---> Networking support --->Ethernet (10 or 100Mbit)  ---> <*> AMD PCnet32

PCI support

最好把ext3文件系统支持也编译进内核(我这个版本默认是模块形式)

     <*> Ext3 journalling file system support
<*>Ext3 extended attributes
<*>Ext3 POSIX Access Control Lists
<*>Ext3 Security Labels
<*>JBB (ext3) debugging support


其实,我觉得只要支持scsi和ext3就行了,其他的不加也行。什么时候试试。对于文件系统,如果是

exit2的话,也将对ext2的支持加上吧。

好,保存推出。这样,会在目录下生成一个.config的文件,他记录了该不骤中的选项,并定义了一些变

量。这些变量将会在后面的make中用到。如果下次还想用同样的配置的话,用make oldconfig,然后选择

这个.config文件就可以了

使用make dep命令 建立依赖关系(在2。6中已经不需要了)。

.使用make bzImage 命令建立内核。
如设置正确将在arch/i386/boot/目录下生成内核bzImage文件
make bzImage的流程简单说明
当我们使用make命令时,make程序将首先找到当前目录下的Makefile文件。根据Makefile文件的语法进行

处理。
在主Makefile文件中包含了arch/i386/Makefile我们make的目标bzImage即在该文件中定:
bzImage: vmlinux
@$(MAKEBOOT) bzImage #此命令将解释为:make -C arch/i386/boot bzImage
现在make需要先去建立目标 vmlinux 然后再执行 arch/i386/boot/ 目录下的 make bzImae。我们现在假

设vmlinux目标已生成,则 arch/i386/boot目录下的make程序将执行如下操作:
tools/build -b bbootsect bsetup compressed/bvmlinux.out ./ bzImage
即将vmlinux 用 tools/build工具压缩成目标文件 bzImage(在此过程中,还会构建build 程序,将

vmlinux转换成bvmlinux.out等,可参考tools 和 compressed目录下的Makefile文件)。

生成vmlinux目标:
在主目录下Makefile文件中vmlinux生成规则如下:
vmlinux: $(CONFIGURATION) init/main.o init/version.o linuxsubdirs
$(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o /
--start-group /
$(CORE_FILES) /
$(DRIVERS) /
$(NETWORKS) /
$(LIBS) /
--end-group /
-o vmlinux #生成vmlinux
$(NM) vmlinux |grep

然后,make modules_install,安装编译好的模块。可以运行命令depmod -a,这样将把编译好的模块移

动到合适的位置。一般是/lib/modules/中。这样,以后用命令modprobe就能安装模块了。

最后的一步,make install.系统将做的事有:
: (1)把压缩内核映象拷贝到/boot目录下, 并创建相应的System.map符号链接; (2)修改bootloader的配

置文件; (3)调用mkinitrd程序创建内核的initrd映象. 对于GRUB而言, 将在/boot/grub/grub.conf配置

文件增加如下类似的配置行:

    title Red Hat Linux (2.6.14)
    root(hd0, 0)
    kernel /boot/vmlinuz-2.6.14 ro root=LABEL=/
    initrd /boot/initrd-2.6.14.img

这些其实可以手工完成,
cp /usr/src/linux2.6.14/arch/i386/boot/bzImage /boot/vmlinuz-2.6.14

cp /usr/src/linux-2.6.14/System.map /boot/System.map-2.6.14

至于上面的mkinitrd,他可建立映像文件,以供Linux开机时载入ramdisk。而
initrd是“initial ramdisk”的简写。initrd一般被用来临时的引导硬件,到实际内核vmlinuz能够接管

并继续引导的状态。initrd-2.6.14-10.img主要是用于加载ext3等文件系统及scsi设备的驱动。

  比如,使用的是scsi硬盘,而内核vmlinuz中并没有这个scsi硬件的驱动,那么在装入scsi模块之前

,内核不能加载根文件系统,但scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以

引导一个能够读实际内核的initrd内核并用initrd修正scsi引导问题。initrd-2.6.14.img是用gzip压缩

的文件,initrd实现加载一些模块和安装文件系统等功能。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值