织梦CMS - 轻松建站从此开始!

罗索

Linux基础篇 十五 (Linux核心编译与管理)

jackyhwei 发布于 2010-04-10 00:20 点击:次 
kernel定义,patch升级kernel,kernel的编译与安装,修改grub开机设定档案menu.lst,单一模块的安装管理与更新lsmod/modinfo/modprobe/insmod/depmod,kernel版本的查询uname
TAG:

标签: kernel定义,patch升级kernel,kernel的编译与安装,修改grub开机设定档案menu.lst,单一模块的安装管理与更新lsmod/modinfo/modprobe/insmod/depmod,kernel版本的查询uname

1.   什么是核心(Kernel)
       核心其实是通过编译原始码生成的一个档案文件,该文件必须要能被你的系统所认识。Kernel档案中包含硬件侦测与驱动模块,但不可能是
包含系统全部的驱动。核心档案通常被放置成 /boot/vmlinuz,但一部主机上面可以拥有多个核心档案,只是开机的时候只能选择一个来加载。而从核心独立出来已经模块化的驱动放置在/lib/modules/`uname -r`/ 当中。核心的编译重点在于你要你的 Linux 作什么?非必要的工作,就不要加到核心当中去编译,以保证Linux跑的顺畅。

2. 利用 patch 升级核心原始码
       每一次核心释出时,除了释出完整的核心压缩档之外,也会释出『该版本与前一版本的差异性 patch 档案』,若想要由 2.6.10 升级到
2.6.14 的话,那么就得要下载 2.6.11, 2.6.12, 2.6.13 及 2.6.14 的 patch file ,然后『依次』一个一个的去进行 patch , 才能够升级到 2.6.14!这个重要!不要忘记了。

3. 当前distributions 提供的 kernel source ---->原始码在 /usr/src/kernels目录下
[root@linux ~]# rpm -qa | grep kernel 即可找到

4. 如果通过上法查询已经安装了核心的原始码,则它的预设核心原始码放在/usr/src/kernels/底下。---->这个做什么用呢,进去看了,里面每个驱动下就一个Makefile和一个类似设置文件的东东Kconfig. (实际上原始.c .h文件都是在此的,只是被删掉了)

5. 设定核心的编译设定 (Makefile)
       核心的 Makefile 没有办法像一些软件一样, 简单的使用 ./configure 就能够自动的侦测主机生成,但可以透过核心提供的功能,就是那
个make menuconfig 来达成。(我下载了个最新版本的内核源码,解压后使用make menuconfig,不知为何没有出现内核参数配置选择画面。但各参数的意义在配置时可以参考详细pdf).

6. 核心的编译与安装

>整个编译的过程

[root@linux src]# tar -jxvf /root/linux-2.6.14.2.tar.bz2 ---->下载核心后,在/usr/src/目录下解压,会生成一个source code的文件夹

[root@linux src]# cd linux-2.6.14.2
[root@linux linux-2.6.14.2]# make mrproper
---->必须执行这步,删除以前留下来的.o文件,以免产生旧的数据.

[root@linux linux-2.6.14.2]# make menuconfig // make xconfig // make gconfig ---->进入kernel编译参数设置界面(决定核心功能!!!)

[root@linux linux-2.6.14.2]# make clean    ---->将以前曾经进行过的*.o 档案删除掉,这样不会产生新旧版本的误差!
[root@linux linux-2.6.14.2]# make bzImage ---->制作出核心档案!这个重要!过程很长啊!而且那个是大写的 I !
Root device is (3, 2)
Boot sector 512 bytes.
Setup is 7016 bytes.
System is 1721 kB
Kernel: arch/i386/boot/bzImage is ready (#1) ---->这里就是我的核心!
[root@linux linux-2.6.14.2]# make modules       ---->制作出模块相关的档案!

       至此,核心与模块就通通编译制作出来了!不过,制作出来的数据还是被放置在 /usr/src/linux-2.6.14.2 这个目录下,并没有被放到系统的相关路径中,还得安装模块与核心。

[root@linux linux-2.6.14.2]# make modules_install ---->制作出来的模块就自动从当前的/usr/src/linux-**安装到 /lib/modules 里面去了,目录名称会是/lib/modules/2.6.14-2之类的,这里面专门放的"这个"核心的模块!

[root@linux ~]# cp /usr/src/linux-2.6.14.2/arch/i386/boot/bzImage \
> /boot/vmlinuz-2.6.14-2
               ---->开始安装新核心。移动新核心到 /boot里面,通常设定成以vmlinuz为首的名称
[root@linux ~]# cp /usr/src/linux-2.6.14.2/System.map \
> /boot/System.map-2.6.14-2

[root@linux ~]# vi   /boot/grub/menu.lst ---->修改grub开机设定档案
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
......

至此整个核心的编译与安装完成,reboot 测试

7. 单一模块的编译

       由上可知核心所支持的功能当中,有直接编译到核心内部的,也有使用外挂模块的,外挂模块可以简单的想成就是驱动程序,这些核心模块依据不同的版本,被分别放置到 /lib/modules/`uname -r`/ 目录中,各个硬件的驱动程序则是放置到 /lib/modules/`uname -r`/kernel/drivers/ 当中,而这些模块与装置代号的对应,就必须要被写入 /etc/modprobe.conf 档案当中.
       2.6 版以后,核心使用比较有趣的方法来设计他的原始码放置目录,那就是以 /lib/modules/`uname -r`/build 及 /lib/modules/`uname
-r`/source 这两个连结档来指向正确的核心原始码放置目录。以免同一系统下有多个核心的时候,核心原始码出现混淆。

       单一模块有两种,一是核心本来就有,但编译时没有添加;二是核心没有,需要由硬件提供商提供,不管那种情况,都是去取得原始码后,重新编译成为系统可以加载的模块,只是两者编译行为不太一样,不过都需要make,gcc以及核心所提供的include头文件和函数库等。

>外部提供源码的模块安装大致流程如下:
[root@linux src]# tar -zxvf /root/e100-3.4.14.tar.gz ---->/usr/local/src下解压
[root@linux e100-3.4.14]# vi README                   ---->注意查一下该档案内容
[root@linux e100-3.4.14]# cd src
[root@linux src]# make
# make[1]: Entering directory `/usr/src/kernels/2.6.13-1.1532_FC4-i686'
---->出现这行表示驱动编译时去读它的核心原始码

[root@linux src]# cp e100.ko /lib/modules/`uname -r`/kernel/drivers/net ---->编译完成后将模块移到核心外挂模块所在目录
[root@linux src]# cd /lib/modules/`uname -r`
[root@linux 2.6.13-1.1532_FC4]# depmod -a
      ---->进入核心模块主目录并更新模块相依属性!

>利用原有核心原始码编译安装模块的大致流程如下: (以NTFS模块为例)
>>到目前的核心原始码所在目录下达 make menuconfig ,然后将 NTFS 的选项设定成为模块,之后直接下达: make fs/ntfs/
>>但有时核心内并没有提供源码,只提供了编译该源码的Makefile文件,这时我们只能下载该核心原始码,释放到如上的/usr/src/linux-**
目录,并在这个目录执行: make fs/ntfs,生成ntfs.ko,然后将该模块复制到/lib/modules/`uname -r`/kernel/fs/ntfs/目录下.
>>再到 /lib/modules/2.6.**底下执行 depmod -a更新模块相依性。

8. 核心模块管理:lsmod, modinfo, modprobe, insmod, rmmod..
       了解核心、核心模块、驱动程序模块、核心原始码与头文件档案的相关性,然后才有办法了解到为何编译驱动程序的时候老是需要找到核心
的原始码才能够顺利编译!然后也才会知道,为何当核心更新之后,自己之前所编译的核心模块会失效。与核心模块有相关的,还有那个很常被使用的 modprobe 指令,以及开机的时候会读取到的模块定义数据文件 /etc/modprobe.conf ,这些数据也必须要了解才行,开机流程中已经对此做过详细介绍了。

BT:

1. 核心版本的查询:uname -a; uname -r

(shmily_soc)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201004/9058.html]
本文出处:百度博客 作者:shmily_soc
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容