kernel build

原创
2010/08/02 02:45
阅读数 1.3K

######################正常编译步骤:

make mrproper

make clean

cp /usr/src/linux-version/.config   .config

cp /boot/config-`uname -r`  .oldconfig

make menuconfig

make bzImage

make modules

make modules_install

make install

######################Default basic build

 

wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.tar.bz2
   tar xjf linux-2.6.24.tar.bz2
   cd linux-2.6.24
   make defconfig
   make all
   su -c "make modules_install install"

#######################Configure the Kernel

cp /boot/config-`uname -r` .config
make oldconfig

 

######################

 

核心:其实就是系统上的一个通过源码source code编译而成的文件,包含了驱动主机各项

硬件的检测程序于驱动模块。

这个文件读入主存储器的时机:

1.       BIOS (加载BIOS信息,获取第一个启动设备的代号)

2.       MBR(读取第一个启动设备的MBR的引导加载程序的启动信息,

载入加载程序:Grub/ Lilo / SPFdisk

3.       kernel(通过Grub的辅助加载核心操作系统的核心信息到RAM中,此时核心文件解压

缩后,会开始检测硬件的各项配置,加载适当驱动模块来让硬件生效,并尝试驱

动所有硬件)

4.       Init (在硬件准备好之后,核心执行NO1第一个守护程序INITINIT被加载进RAM

a)          并通过/etc/inittab的设置来获取默认运行等级

b)         Init执行/etc/rc.d/rc.sysinit文件

c)          启动核心的外挂模块/etc/modprobe.conf

d)         Init执行运行的各个批处理文件(scripts运行的脚本由运行等级来决定)

e)          Init执行/etc/rc.d/rc.local文件

f)          Init执行/bin/login,等待用户登陆,登陆之后开始以SHELL来控制主机

注意: 

 

AS4默认的核心源码的放在 /usr/src/kernels/2.6.9-42.EL-smp-i686/ 目录下

Drivers目录下就有netsoundusbpcivedio许多子目录,这些目录下含有相关的硬件驱动模块。想完整了解很难啊。不过解压缩最新的核心文件之后会有个Documentation目录可以进去查看各个相关说明。

Kernel核心文件通常放在 /boot目录下面的以vmlinuz开头的文件名中

外挂模块则放在/lib/modules/`uname –r`下面(如:/lib/modules/2.6.9-42.Elsmp,这里uname-r得到的其实就是kernel版本号)

之所以将驱动程序模块化的原因:

Old kernel could not support the new hardware.

1.       硬件更新速度太快。

2.       拿一个新 kernel重新complie太麻烦

所以将驱动程序模块化将意味着每次有厂商退出新版本的硬件时,我们不必重新编译内核。只要新硬件可以推出搭配核心的驱动模块,我们将该模块挂在到核心,核心就可以支持该硬件。

之所以更新核心的原因:

1.       新需求

2.       高稳定性

3.       kernel大小

所以说核心编译的重点在于“您要LINUX做什么”。没有必要的工作就干脆不要加在核心中,这样才能让Linux运行得更稳、跟顺畅。这是我们编译核心最主要的原因。

 

“一定要在安装好了LINUX之后iu赶紧给它编译核心”?

不需要。

由于系统已经将核心编译得适合一般用户使用,原来的版本已经为我们考虑好如何使用核心了,那么我们就不需要重新编译核心。尤其是经常发布新版的核心RPM,所以实在没有必要自己重新编译。

当然要是有特殊需求就另当别论了。

 

 

发布版本与修订版本的区别?

发布版本release build/ release version :将一些经过稳定测试之后的功能放到和心内

修订版本 revision / revise version : 功能没有变,只是把一些Bug解决了

 

既然重新编译,那么干嘛还要使用原版发布的源码呢?

因为原版本发布的源码中,还有默认设置值,所以可以轻松的了解到当初是如何徐泽于核心模块有关的各项设置项目的参数值。利用这新参数子配合LINUX系统的默认参数来进行修改,“这样我们可以将核心修改为我们自己喜欢的样子”

 

有时候我们之所以还是得去获取最新的核心的原因?

虽然使用源码重新编译比较方便,但是这是得新硬件所需要的新驱动程序无法通过原来的核心源码编译,所以更新行驱动程序,就必须使用最新的核心。

 

如何利用补丁升级核心源码?

如果只是想更新到最新版本的核心,原来的参数设置并不进行大幅度修改,可以这么做:

每一次核心发布是,除了发布完整的核心压缩文件之外,也会发布“该版本以前一版本的差异性补丁文件”,而且每个核心的补丁进针对前一版本的核心。(19章有关于补丁的制作)

例如:2.6.10升级到2.6.14,就要下载2.6.112.6.122.6.132.6.14的补丁文件,然后依次进行补丁,才能升级到2.6.14.  This is important.!!!

比如:从2.4.xx低版本版本就可以直接升级到2.4.xx最新版本,但不要从2.4.xx直接升级到2.6.xx版本,否则倒是可能欲哭无泪。(其实也不是说2.4.xx升级到2.6.xx不可能,只是过程复杂)

 

之所以在进行核心设置之前务必执行“make mrproper”的原因?p401

编译过程会有*.o的目标文件,这些*.o的文件必须要先删除,再次编译的时候就不会编译该文件,可能我们已经修改了部分参数,因此该文件的编译结果应该有所不同。为了避免旧的*.o文件的存在而导致更新没有生效的严重后果。(make clean=make mrproper

 

 

核心的编译与安装:

编译之前确认一下:1.  gcc  2.   automake   3.  kernel-devel  4.   kernel-headers

这四个系统已经有了

1.         kernel (从http://www.kernel.org核心官方网站下载最新的核心版本,默认放在/root下)

2.         tar   (在/usr/src目录下解压缩核心文件)

l         #cd  /usr/src;

l         #tar –jxvf /root/linux-2.6.26-5

l         #cd linux-2.6.26-5

l         #make mrproper     (如果以前编译过需要,删除以前留下的一些*.o文件;第一次                              编译可免)

3.         Makefile生成文件在整个编译过程中占有举足轻重的地位,这是因为make采用的参

数数据都是记录在生成文件中。核心的生成文件没有办法像一些软件那样只

是使用./configure就能自动检测主机,这是因为每个人对核心的要求都不一

样。难道要手动编辑生成文件吗?不需要。用make menuconfig来实现。)

当然还有两种方式来实现:make xconfig  /  make gconfig

详细配置:p541-p558

注意最后将项目储存成其它文件。最后一项。

--------------------------------------------------------------

#cp /boot/config-2.6.9-42.EL  .config

#make oldconfig  (不推荐,简单升级,所以选择原来的oldconfig

#mak menuconfig (推荐,可以对内核进一步进行配置,拷贝.configload)

接下来编译和安装:

 

4.         make  

(编译核心

l         # cd linux-2.6.26-5

l         # make clean   (删除以前生成的*.o文件)

l         # make bzImage  (制作核心文件)

l         # make modules   (制作出模块的相关文件)

这三个步骤核心和模块都创建出来了。这些数据还是放在 /usr/src/linux-2.6.26-5目录下还是没有放到系统的相关路径中。在上面的过程中如果发生错误,很可能是核心项目选择不好,可能需要重新以make menuconfig再次检查相关设置。若还是失败,将原核心数据内的.config文件复制到核心原始文件目录,然后修改应该可以顺利便一处核心。

特别注意 make bzImage 后的最后结果是否正常。

Kernel: arch/i386/boot/bzImage is ready (#1)

 

----------------------------------------------------------------------------------------------------------------------

(安装模块)

l         # cd /lib/modules

l         # mv 2.6.9-42.Elsmp   2.6.9-42.Elsmp.old (这步骤很重要,将/lib/modules/里面的版          

本核心先移开,避免万一失败还要编译第

二次)

l         # cd linux-2.6.26-5

l         # make modules_install  (这样整个模块就要安装到 /lib/modules里,一般来说目录名称会是 /lib/modules/2.6.26-5,如果在make  menuconfig过程中填写核心附版本的话,就会出现类似2.6.26-5.RHAS4之类的名称)

----------------------------------------------------------------------------------------------------------------------

(安装核心)

l         # cp /usr/src/linux-2.6.26-5/arch/i386/boot/bzImage  /boot/vmlinuz-2.6.26-5

l         # cp /usr/src/linux-2.6.26-5/System.map  /boot/System.map-2.6.26-5

l         # vi /boot/grub/menu.lst

 

这样才算成功完成了整个核心的编译与安装操作。

 

 

Fedora Core 3 之前,initrd 是使用 loop 设备 来构建的。

Fedora Core 3 开始,默认的 initrd 映像变成了一个经过压缩的 cpio 归档文件。

[root@localhost linux-2.6.27]# vi /etc/modprobe.conf

添加如下一行

options scsi_mod max_scsi_luns=128

[root@localhost linux-2.6.27]# cd /boot

[root@localhost boot]# ll

total 5356

-rw-r--r-- 1 root root   65406 Jun 11 07:14 config-2.6.18-92.el5

drwxr-xr-x 2 root root    1024 Oct 25 13:18 grub

-rw------- 1 root root 2476468 Oct 11 20:30 initrd-2.6.18-92.el5.img

drwx------ 2 root root   12288 Oct 11 20:08 lost+found

-rw-r--r-- 1 root root   80032 Nov 23  2007 message

-rw-r--r-- 1 root root   91734 Jun 11 07:14 symvers-2.6.18-92.el5.gz

-rw-r--r-- 1 root root  912686 Jun 11 07:14 System.map-2.6.18-92.el5

-rw-r--r-- 1 root root 1806388 Jun 11 07:14 vmlinuz-2.6.18-92.el5

[root@localhost boot]# mkinitrd -f initrd-2.6.18-92.el5.img 2.6.18-92

No modules available for kernel "2.6.18-92".

重构报错

[root@localhost boot]# mkinitrd -f initrd-2.6.18-92.el5.img 2.6.18-92.el5

[root@localhost boot]#

创建初始化RAM磁盘镜像文件成功。

重构成功。

 

请问如果要是用镜像文件的方式,怎么做呢. 
以前用 dd if=/dev/zero of=/tmp/ramdisk.img bs=1024 count= 2
mke2fs -F -m 0 -b 1024 /tmp/ramdisk.img 2
mount /tmp/ramdisk.img /mnt/initrd -t ext2 -o loop=/dev/loop0
2.6.20之后就不能用了.奇怪. 

用 mkinitrid -v --preload mptspi --preload dm-mod -f initrd-2.6.20.4 2.6.20.4时说mkinitrid命令没有找到,
我改为

mkinitrd -v --preload mptspi --preload dm-mod -f initrd-2.6.20.4 2.6.20.4,就是mkinitrid多了一个字母i,去掉之后出现如下:
Creating initramfs
Looking for deps of module mptspi

/boot目录下,执行以下命令:
# new-kernel-pkg --mkinitrd --depmod --install 2.6.18 (这时候你的/boot下生成一个initrd-2.4.12.img,并且你的grub.conf也作了相应更改)

此文是在翻阅大量相关文档分析mkinitrdinitrd文件后,得出的结论.相关分析命令.

1)老版的initramfs,用以下方法

mv initrd-2.6.20.4 initrd-2.6.20.4.gz

gunzip initrd-2.6.20.4.gz

losetup /dev/loop0 initrd-2.6.20.4

mount /dev/loop0 /mnt/temp

 2)使用cpio生成的initrd-2.6.20.4

zcat initrd-2.6.20.4 | cpio -i

zcat initrd-2.6.20.4 | cpio -t | sort
3)gentoo
initramfs
zcat /boot/initramfs-genkernel-x86-2.6.22.6 | (while true; do cpio -t -H newc --no-absolute-filenames || exit; done)

 zcat /boot/initramfs-genkernel-x86-2.6.22.6 | (while true; do cpio -i -H newc --no-absolute-filenames || exit; done)

对于新的内核使用的是cpio -H newc -o 方式生成的initrd,而非cpio -c -o要注意,否则无法正常使用.

mkinitrd是一个脚本(cat /sbin/mkinitrd | more),用以制作启动映象,可以自动加载模块以及初始化系统。
它需要内核对loopback回送设备,ramdisk,initrd,tmpfs的支持,这些条件在编译内核时要注意。
另外,内核2.6.x的安装脚本会调用fedorainstallkernel脚本自动生成initrd(如果你在编译内核时选上了initrd),无需自己手工制作。

 

今天编译内核,在最后一步mkinitrd的时候提示:

error can not found ata_piix.o , mkinitrd fail

后来经过查找资料发现,原来在/etc/modules.conf中指定了

alias scsi_hostadapter ata_piix

所以在mkinitrd的时候需要找到这个模块,但是我没有编译进去,所以出错,我在

scsi surpport->scsi low level drivers–>serial ATA(SATA) surpport –>Intel PIIX/ICH SATA support选项

然后再重新编译,make bzImage, make modules, make modules_install, make install 之后,一切正常。

 

----------------------------------------------------------------------------------------------------------------------

l         # shutdown –r now (重启机器测试一下核心是否可以顺利的启动系统)

 

 

 

 

 

#######驱动问题######

 

make install 

sh /usr/src/linux-2.6.35.4/arch/x86/boot/install.sh 2.6.35.4 arch/x86/boot/bzImage \

System.map "/boot"

 

Kernel image:   /boot/vmlinuz-2.6.35.4

Initrd image:   /boot/initrd-2.6.35.4

Root device: /dev/sda1 (mounted on / as reiserfs)

FATAL: Module mptsas not found.

WARNING: no dependencies for kernel module 'mptsas' found.

FATAL: Module processor not found.

WARNING: no dependencies for kernel module 'processor' found.

FATAL: Module thermal not found.

WARNING: no dependencies for kernel module 'thermal' found.

FATAL: Module ata_piix not found.

WARNING: no dependencies for kernel module 'ata_piix' found.

FATAL: Module ata_generic not found.

WARNING: no dependencies for kernel module 'ata_generic' found.

FATAL: Module ide_pci_generic not found.

WARNING: no dependencies for kernel module 'ide_pci_generic' found.

FATAL: Module fan not found.

WARNING: no dependencies for kernel module 'fan' found.

FATAL: Module reiserfs not found.

WARNING: no dependencies for kernel module 'reiserfs' found.

FATAL: Module edd not found.

WARNING: no dependencies for kernel module 'edd' found.

FATAL: Module sd_mod not found.

WARNING: no dependencies for kernel module 'sd_mod' found.

FATAL: Module usbcore not found.

WARNING: no dependencies for kernel module 'usbcore' found.

FATAL: Module ohci_hcd not found.

WARNING: no dependencies for kernel module 'ohci_hcd' found.

FATAL: Module uhci_hcd not found.

WARNING: no dependencies for kernel module 'uhci-hcd' found.

FATAL: Module ehci_hcd not found.

WARNING: no dependencies for kernel module 'ehci_hcd' found.

FATAL: Module usbhid not found.

WARNING: no dependencies for kernel module 'usbhid' found.

Features:       block usb resume.userspace resume.kernel

Bootsplash: SLES (1280x1024)

22169 blocks

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部