发新话题
打印

[转载]内核编译(一)

[转载]内核编译(一)

原始出处:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://twentyfour.blog.51cto.com/945260/403002
信息来源:邪恶八进制信息安全团队(www.eviloctal.com




【前言:当这篇博文发出去的时候,我......!应该算下来差不多花了10多个小时,我坦言这篇博文是目前我整个复习过程最吃力的,最投入的;从Linux组件到命令到内核编译准备,我尽可能详细列出了。我到内核官网down的是前几天刚刚发布的新内核2.6.35,也许是最新的缘故,我编译不成功,结果因为硬盘空间不足重新装一个Linux,再编译,出问题,找解决方案,又编译,到最后编译成功,我就感觉丝丝疲倦。reboot系统报错,找解决方案,解决,测试,重启,编译成功......昨晚4点半累倒了,今早10点半醒,继续,才搞定下来,于是此博文诞生,(*^__^*) 】

一、linux内核组件
Linux内核是Linux操作系统的核心,主要包括文件系统模块、内存管理模块、进程管理模块、
进程间通信模块和网络接口模块5大模块。
文件系统模块:主要负责文件系统的管理,在Linux2.6内核支持ext2、ext3、ext4、gfs、及
网络文件系统nfs、cifs等。
内存管理模块:主要负责无聊内存和虚拟内存的资源分配。
进程管理模块:主要负责进程的资源分配协调管理。
进程间通信模块:主要负责协调进程之间的资源分配关系和进程资源的竞争分配。
网络接口模块:主要负责对系统进行远程管理。

二、/boot目录下文件
vmlinuz内核文件
Linux内核引导文件是指/boot/vmlinuz-*文件,是一个可进行系统引导的压缩级内核文件,而
/boot/vmlinux则是一个非压缩文件。如下通过“file”查看:
[root@51cto ~]# file /boot/vmlinuz-2.6.18-128.el5
/boot/vmlinuz-2.6.18-128.el5: ELF 32-bit LSB shared object, Intel 80386, version 1, stripped
vmlinuz是一个可执行的Linux内核,在内核编译过程中创建。
initrd.img映像文件
initrd.img文件主要用于系统初始化操作,比如加载内核模块、挂载根文件系统等
如下通过“file”查看:
[root@51cto ~]# file /boot/initrd-2.6.18-128.el5.img
/boot/initrd-2.6.18-128.el5.img: gzip compressed data, from Unix, last modified:
Sat Sep 25 04:51:45 2010, max compression
那么如何查看该版本的initrd.img映像文件的内容:
[root@51cto ~]# cd /tmp/
[root@51cto tmp]# mkdir /tmp/test
[root@51cto tmp]# cp /boot/initrd-2.6.18-128.el5.img /tmp/test/
[root@51cto tmp]# cd /tmp/test/
[root@51cto test]# ls
initrd-2.6.18-128.el5.img
[root@51cto test]# mv initrd-2.6.18-128.el5.img initrd-2.6.18-128.el5.img.gz
[root@51cto test]# file initrd-2.6.18-128.el5.img.gz
initrd-2.6.18-128.el5.img.gz: gzip compressed data, from Unix, last modified:
Sat Sep 25 04:51:45 2010, max compression
[root@51cto test]# ls
initrd-2.6.18-128.el5.img.gz
[root@51cto test]# gzip -d initrd-2.6.18-128.el5.img.gz   //解压文件
[root@51cto test]# ls
initrd-2.6.18-128.el5.img
[root@51cto test]# file initrd-2.6.18-128.el5.img    //可以看到映像文件类型为cpio归档文件
initrd-2.6.18-128.el5.img: ASCII cpio archive (SVR4 with no CRC)
[root@51cto test]# cpio -i < initrd-2.6.18-128.el5.img    //恢复映像文件
11745 blocks
[root@51cto test]# ls
bin  dev  etc  init  initrd-2.6.18-128.el5.img  lib  proc  sbin  sys  sysroot
[root@51cto test]# ls -R    //查看具体内容
.:
bin  dev  etc  init  initrd-2.6.18-128.el5.img  lib  proc  sbin  sys  sysroot
./bin:
dmraid  insmod  kpartx  modprobe  nash
./dev:
console  ptmx  ram1    tty   tty10  tty2  tty5  tty8   ttyS1  zero
mapper   ram   rtc     tty0  tty11  tty3  tty6  tty9   ttyS2
null     ram0  systty  tty1  tty12  tty4  tty7  ttyS0  ttyS3
./dev/mapper:
./etc:
./lib:
ata_piix.ko      dm-region_hash.ko  mptbase.ko   scsi_transport_spi.ko
dm-log.ko        ehci-hcd.ko        mptscsih.ko  sd_mod.ko
dm-mem-cache.ko  ext3.ko            mptspi.ko    uhci-hcd.ko
dm-message.ko    firmware           ohci-hcd.ko  vmxnet3.ko
dm-mod.ko        jbd.ko             pvscsi.ko    vmxnet.ko
dm-raid45.ko     libata.ko          scsi_mod.ko
./lib/firmware:
./proc:
./sys:
./sysroot:
Linux内核模块配置文件
/boot/configure-*为当前Linux内核的模块配置文件,即系统启用了哪些模块,哪些内容已编译
到Linux内核,如查看Linux内核是否支持ntfs:
[root@51cto test]# cat /boot/config-2.6.18-128.el5 |grep -i ntfs
# CONFIG_NTFS_FS is not set     //看出ntfs文件系统在当前内核没有设置
在编译内核时可以使用make menuconfig/xconfig/gconfig命令生成,生成的配置文件为“.config”
文件,等系统编译完成后,就把.config文件copy到/boot目录下,改名为config-2.6.18-128.el5
查看/boot/config-2.6.18-128.el5的时候,凡是“y”表示编译到内核,“m”表示编译为一个
模块,“not set”表示没有设置也没有编译到模块。
Linux内核符号列表文件
/boot/system.map-*是Linux内核符号列表文件,如下:
[root@51cto boot]# pwd
/boot
[root@51cto boot]# cat System.map-2.6.18-128.el5 |more
00000400 A __kernel_vsyscall
00000410 A SYSENTER_RETURN
00000420 A __kernel_sigreturn
……
c0401308 t try_name
c0401485 T name_to_dev_t
c04016cc T calibrate_delay
--More--
Linux内核参数配置文件
在Linux2.6,使用/etc/modprobe.conf配置Linux内核参数,同时可以设置内核模块的黑名单、
黑名单依赖及内核模块依赖映像文件等。
[root@51cto ~]# cat /etc/modprobe.conf
alias eth0 vmnics
alias scsi_hostadapter mptbase
alias scsi_hostadapter1 mptspi
alias scsi_hostadapter2 ata_piix
alias snd-card-0 snd-ens1371
options snd-card-0 index=0
options snd-ens1371 index=0
remove snd-ens1371 { /usr/sbin/alsactl store 0 >/dev/null 2>&1 || : ; }; /sbin/modprobe -r
--ignore-remove snd-ens1371
# Added by VMware Tools
install pciehp /sbin/modprobe -q --ignore-install acpiphp; /bin/true
install pcnet32 (/sbin/modprobe -q --ignore-install vmxnet || /sbin/modprobe -q
--ignore-install pcnet32 $CMDLINE_OPTS);/bin/true

三、内核操作命令
lsmod命令
该命令用于显示当前Linux系统中已加载的内核模块:
[root@51cto ~]# lsmod |more
Module                  Size  Used by
nfsd                       202097   17
exportfs                9665        1 nfsd
lockd                     61257      2 nfsd
nfs_acl                  7617         1 nfsd
auth_rpcgss         43105       1 nfsd
sunrpc                 144765     14 nfsd,lockd,nfs_acl,auth_rpcgss
ipv6                      261473    16
……
dm_mirror           23109      0
dm_multipat       24013       0
scsi_dh                11713      1 dm_multipath
video                  21193      0
--More--
这里那其中一个已经加载的模块说明:
scsi_dh                11713   1  dm_multipath
scsi_dh表示模块的名称
11713表示该模块的大小,单位是字节
1表示依赖模块的个数,有1个模块依赖scsi_dh
dm_multipath表示依赖模块的内容
通常只用该命令时,采用 lsmod |grep -i  xx  查看当前系统是否加载了某些模块
modprobe命令
该命令用于在Linux2.6内核中加载和删除Linux内核模块,并且Linux内核会自动解决内核模块
之间的依赖关系,将相互依赖的模块自动加载,如:
[root@51cto ~]# modprobe raid1     //加载raid1阵列级别模块
[root@51cto ~]# lsmod |grep raid1    //显示已经加载的raid1阵列级别模块
raid1                  25409  0
[root@51cto ~]# modprobe -r raid1      //删除raid1阵列级别模块
[root@51cto ~]# lsmod |grep raid1    //再次查看,发现已经删除
由于insmod命令加载模块不会自动解决依赖模块问题,该命令就不说明了
[root@51cto ~]# modprobe raid1    //重新加载该模块
[root@51cto ~]# modprobe -l |grep raid1    //显示该模块的绝对路径
/lib/modules/2.6.18-128.el5/kernel/drivers/md/raid1.ko
/lib/modules/2.6.18-128.el5/kernel/drivers/md/raid10.ko
[root@51cto ~]# modprobe -c |grep raid1   //显示/etc/modprobe.conf配置文件的参数
alias md-level-1 raid1
alias md-raid1 raid1
alias md-personality-3 raid1
alias md-level-10 raid10
alias md-raid10 raid10
alias md-personality-9 raid10
rmmod命令
该命令用于删除正在使用的Linux内核模块,跟modprobe -r命令类似:
[root@51cto ~]# lsmod |grep raid1
raid1                  25409  0
[root@51cto ~]# rmmod raid1
[root@51cto ~]# lsmod |grep raid1    //可以发现已经删除了
modinfo命令
该命令用于显示Linux内核模块的详细信息,如模块的作者、功能、开发参数、依赖关系等
[root@51cto ~]# modinfo pcnet32
filename:       /lib/modules/2.6.18-128.el5/kernel/drivers/net/pcnet32.ko
license:        GPL
description:    Driver for PCnet32 and PCnetPCI based ethercards
author:         Thomas Bogendoerfer
srcversion:     F81443556AAE169CBF80F55
alias:          pci:v00001023d00002000sv*sd*bc02sc00i*
alias:          pci:v00001022d00002000sv*sd*bc*sc*i*
alias:          pci:v00001022d00002001sv*sd*bc*sc*i*
depends:        mii
vermagic:       2.6.18-128.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
parm:           debug:pcnet32 debug level (int)
parm:           max_interrupt_work:pcnet32 maximum events handled per interrupt (int)
parm:           rx_copybreak:pcnet32 copy breakpoint for copy-only-tiny-frames (int)
parm:           tx_start_pt:pcnet32 transmit start point (0-3) (int)
parm:           pcnet32vlb:pcnet32 Vesa local bus (VLB) support (0/1) (int)
parm:           options:pcnet32 initial option setting(s) (0-15) (array of int)
parm:           full_duplex:pcnet32 full duplex setting(s) (1) (array of int)
parm:           homepna:pcnet32 mode for 79C978 cards (1 for HomePNA, 0 for Ethernet,
default Ethernet (array of int)
module_sig:     883f35049492fa431b497468cdd12cf112f0b40a09ccb4558437da1fcb024b
f5cc4defa7cb584ae6d09e34ea85d071566f38a6d68316de9c67f29f242b8
其中:
filename表示该模块的绝对路径
license表示该模块支持的序列号协议,这里是GPL协议
description表示该模块的描述信息
author表示该模块的作者
srcversion表示模块的原始版本
alias表示别名
depends表示该模块所依赖的模块
vermagic表示编译时对应的内核版本、硬件平台以及GCC版本
parm表示相对应的调试参数

四、编译内核前的准备工作(一)
新版本的内核分两种:
1、一种是full Source版本,完整的内核版本比较大,一般是 tar.gz或者是.bz2文件,
二者分别是使用g***或者b***2进行压缩的文件,使用时需要解压缩。
2、一种是patch文件,即补丁, patch文件则比较小,一般只有几十K到几百K,但是patch文件
是针对于特定的版本的,你需要找到自己对应的版本才能使用。

内核升级所需依赖包
在进行内核升级或定制内核时,Linux系统需要事先安装GCC编译工具、ID连接器和make编译器
[root@51cto ~]# rpm -aq |grep gcc
gcc-gfortran-4.1.2-44.el5
gcc-c++-4.1.2-44.el5
gcc-objc-4.1.2-44.el5
gcc-gnat-4.1.2-44.el5
gcc-java-4.1.2-44.el5
libgcc-4.1.2-44.el5
gcc-4.1.2-44.el5
gcc-objc++-4.1.2-44.el5
[root@51cto ~]# rpm -qf /usr/bin/ld
binutils-2.17.50.0.6-9.el5
[root@51cto ~]# rpm -aq |grep ^make
make-3.81-3.el5
除此之外,还需要
[root@51cto ~]# rpm -aq binutils-*
binutils-devel-2.17.50.0.6-9.el5
[root@51cto ~]# rpm -aq binutils
binutils-2.17.50.0.6-9.el5
[root@51cto ~]# rpm -aq control-center
control-center-2.16.0-16.el5
[root@51cto ~]# rpm -aq control-center-devel
control-center-devel-2.16.0-16.el5
[root@51cto ~]# rpm -aq gcc-* libstdc++-* gcc-c++-* glibc-* libstdc++-* sysstat-*
libstdc++-devel-4.1.2-44.el5
gcc-gfortran-4.1.2-44.el5
glibc-common-2.5-34
glibc-devel-2.5-34
gcc-c++-4.1.2-44.el5
gcc-objc-4.1.2-44.el5
gcc-gnat-4.1.2-44.el5
gcc-java-4.1.2-44.el5
glibc-headers-2.5-34
gcc-objc++-4.1.2-44.el5
glibc-utils-2.5-34
[root@51cto ~]# rpm -aq |grep ^make
make-3.81-3.el5
确保安装了如上的软件包。
这里说明一个就是可以通过挂载光驱到/server目录下安装,如果/server目录下没有的话可以
使用yum安装,安装yum的方法如下:
创建rpm软件包安装源
配置安装源
    mkdir /media/cdrom
    mount /dev/cdrom /media/cdrom   挂载光驱
    cd /etc/yum.repos.d/            进入安装源配置目录
    mkdir backup                    
    mv * backup                   将默认的安装源备份一下。
    vim cdrom.repo       创建光盘安装源,添加以下内容。
[Base]    标签
name=RHEL5 ISO Base   描述
baseurl=file:///media/cdrom/Server   安装源位置
enabled=1         打开安装源
gpgcheck=0        不检查pgp校验
[Cluster]
name=RHEL5 ISO Cluster
baseurl=file:///media/cdrom/Cluster  
enabled=1
gpgcheck=0
更新安装源
  yum clean all
  yum list
然后通过 yum install xx  进行安装

五、编译内核前的准备工作(二)
下载Linux2.6内核源码文件
可以通过如下网站下载源码包,这里下载linux-2.6.35.tar.gz
http://www.kernel.org/pub/linux/kernel/v2.6/
最后实现把2.6.18升级到2.6.35
解包解压缩Linux内核文件
[root@51cto /]# ls linux-2.6.35.tar.gz.filepart     //源码包从Windows中copy到Linux中
linux-2.6.35.tar.gz.filepart
[root@51cto /]# ls linux-2.6.35.tar.gz   //传好了,查看
linux-2.6.35.tar.gz
[root@51cto /]# tar -zxf linux-2.6.35.tar.gz -C /usr/src/      //解压到该目录/usr/src/
[root@51cto /]# cd /usr/src/
[root@51cto src]# ln -sf linux-2.6.35 linux-2.6   
[root@51cto src]# ls
kernels  linux-2.6  linux-2.6.35  redhat
[root@51cto src]# cd linux-2.6
[root@51cto linux-2.6]# ls -F
arch/    Documentation/  init/    MAINTAINERS  REPORTING-BUGS  tools/
block/   drivers/        ipc/     Makefile     samples/        usr/
COPYING  firmware/       Kbuild   mm/          scripts/        virt/
CREDITS  fs/             kernel/  net/         security/
crypto/  include/        lib/     README       sound/
内核源码目录分析:
arch目录:硬件体系结构源码目录,如x86、powerpc、ppc、ia64等平台的硬件体系结构
fs目录:文件系统源码目录,如ext2、ext3、nfs、cifs、xfs等文件系统
kernel目录:内核及处理器的相应源码目录,处理器的源码还存放在arch/*/kernel/目录下
…...其他目录不做具体介绍
内核编译步骤
[root@51cto linux-2.6]# cd ..
[root@51cto src]# cd linux-2.6.35/
[root@51cto linux-2.6.35]# make mrproper     //去除内核的依赖关系以及编译后的垃圾信息
接下来就是使用菜单方式配置内核make menuconfig (需要安装软件包ncurses-* dialog-*)
[root@51cto linux-2.6.35]# yum install ncurses-* dialog-*    //演示一下yum安装
Loaded plugins: rhnplugin, security
This system is not registered with RHN.
RHN support will be disabled.
Cluster                                                  | 1.3 kB     00:00
Base                                                     | 1.3 kB     00:00
Setting up Install Process
Parsing package install arguments
Package ncurses-5.5-24.20060715.i386 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package dialog.i386 0:1.0.20051107-1.2.2 set to be updated
---> Package ncurses-devel.i386 0:5.5-24.20060715 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=====================================================
Package              Arch        Version                     Repository   Size
=====================================================
Installing:
dialog               i386        1.0.20051107-1.2.2          Base        162 k
ncurses-devel        i386        5.5-24.20060715             Base        1.6 M

Transaction Summary
=====================================================
Install      2 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 1.8 M
Is this ok [y/N]: y
Downloading Packages:
--------------------------------------------------------------------------------
Total                                           503 MB/s | 1.8 MB     00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : dialog                                            [1/2]
  Installing     : ncurses-devel                                     [2/2]

Installed: dialog.i386 0:1.0.20051107-1.2.2 ncurses-devel.i386 0:5.5-24.20060715
Complete!
[root@51cto linux-2.6.35]# make menuconfig   //进入菜单方式界面配置内核


六、配置内核选项
配置内核的方法有4种,分别是:
1、字符方式配置内核,直接[root@51cto linux-2.6.35]# make config
进入后通过“Y/N”选择是否配置菜单或选项。这种方法用的少,不作介绍。
2、通过菜单方式配置内核,直接[root@51cto linux-2.6.35]# make menuconfig进入
如上的界面,这里需要安装两个软件包ncurses-* dialog-*才可以使用
如果出现如下的情况:
[root@51cto linux-2.6.35]# make menuconfig
scripts/kconfig/mconf arch/x86/Kconfig
Your display is too small to run Menuconfig!
It must be at least 19 lines by 80 columns.
make[1]: *** [menuconfig] 错误 1
make: *** [menuconfig] 错误 2
说明你的终端显示太小了,把putty之类的登陆软件拉大点就OK了
通过界面可以清楚看到按上下键选择指定菜单,通过回车键可以进入带有箭头→的下一级子目录
,通过Y键可将选项编译到内核,按N键将不选择选项,即既不把选项编译到内核也不编译成模块,
M键可将选项编译成模块,按两次Esc键可退出到上一级,按?键可查看指定选项的帮助文档,按
/键可搜索指定选项的位置以及路径,如下:




还有就是通过Y键使得显示*号表示指定选项编译到内核,空格的话不对指定选项做任何操作,M则表示把指定选项编译成模块。
3、通过QT图形方式配置内核需要安装qt,qt-devel,gcc-c++软件包,直接make xconfig进入,这里不作介绍
4、通过GTK图形方式配置内核需要安装gtk2,gtk2-devel,glib2,libglade2,libglade-devel软件包,直接make gconfig进入同样这里不作介绍,因为图形方式都需要xwindow下进行。

本文出自 “twenty_four” 博客,请务必保留此出处http://twentyfour.blog.51cto.com/945260/403002
隼选择比鹰更广阔的天空翱翔,也注定会更孤单。

TOP

发新话题