编译内核

Kernel
node

先介绍下Kernel是什么,Kernel为操做系统的核心,提供多种功能,例如操做系统上的进程管理,文件系统,硬件驱动,网络功能,安全功能...都是由Kernel控制的.linux

Kernel的设计流派:安全

单内核设计:全部的功能融为一个进程,各类功能以线程的方式运做,优势在于集中管理,效率高;缺点为某一线程故障,整个Kernel故障,典型应用为Linux.网络

微内核设计:全部的功能单独运转,效率低,单功能故障不会影响全局.典型应用Windows,Solaris.ide

 

Kernel的特色:模块化

① 支持模块化,虽然Linux为单内核设计,可是Linux支持将各类功能作成模块,例如核心文件(基本功能),网络功能,硬件驱动...spa

模块文件存放位置为:  /lib/modules/2.6.18-194.el5/kernel/*.ko操作系统

支持模块的动态装载功能,各类功能模块能够等用到时再装载,极为高效.线程

Kernel的组成部分:debug

核心文件: /boot/vmlinuz - Kernel_Verion - RPM_version

[root@el5 kernel]# ls /boot/vmlinuz-2.6.18-194.el5 

模块文件:  /lib/modules/Kernel_Version - RPM_Version.OS/

[root@el5 kernel]# ls /lib/modules/2.6.18-194.el5/

③RAMDISK: 辅助文件,Kernel加载rootfs(用户空间)时须要识别分区,文件系统,使用此文件虚拟成硬盘或者文件系统,Kernel能正常加载rootfs

CentOS5: /boot/initrd-*

CentOS6,7:/boot/initramfs-*

 

 

ramdisk文件生成,此文件必需要匹配内核版本:

为当前系统内核版本生产ramdisk文件:

]# dracut ~/ramdisk   $(uname -r)

 

内核模块管理:

lsmod    //查看当前运行内核已加载的模块

[root@EL6 linux]# lsmod

Module        Size  Used by         #分别为模块名   模块大小  模块被引用数  被谁引用

rt3290sta            1251347  0 

ppdev                   8537  0 

parport_pc             22690  0 

lp                      9242  0 

 

modinfo  module_name           //查看模块信息

modinfo  -n   module_name   //查看模块位置

modinfo  -k  kernel_version  module_name  //查看指定内核版本的信息

 

[root@EL6 linux]# modinfo  xfs

filename:       /lib/modules/2.6.32-431.el6.x86_64/kernel/fs/xfs/xfs.ko

license:        GPL

description:    SGI XFS with ACLs, security attributes, large block/inode numbers, no debug enabled

author:         Silicon Graphics, Inc.

srcversion:     6AF9EC31B1CDA34E78FB85F

depends:        exportfs

vermagic:       2.6.32-431.el6.x86_64 SMP mod_unload modversions 

 

modprobe   [-r]  module_name      //装载或卸载模块

[root@EL6 src]# modprobe -r xfs                 //卸载模块

[root@EL6 src]# modprobe xfs                    //装载模块

 

 

insmod /path/to/module_name //强制装载内核,insinsert的缩写

rmod /path/to/module_name         //强制卸载内核

 

特殊目录: /proc  /sys

/proc 伪文件系统,该目录存放内核在运行中的信息与一部分可控制参数,经过此目录可调整内核的一些可修改参数(大部分在/proc/sys目录下).

修改内核参数的两种方式:

1) 使用echo命令将值重定向到/proc目录(伪文件系统不可直接编辑)

echo “EL6” >/proc/sys/kernel/hostname

2) 使用sysctl命令控制:

由于/proc目录可修改的参数大概都在sys目录下,因此sysctl命令把sys目录做为根.前面的/proc/sys目录省略,”/””.”代替例如:

修改/proc/sys/kernel/hostname的值为 “EL6”

sysctl kernel.hostname = EL6  

sysctl  -a   查看全部内核选项

sysctl   -p    根据配置文件重读一遍(/etc/sysctl.conf),修改配置文件永久生效

 

 

/sys 伪文件系统,该目录用于存放内核设备的硬件信息,udev经过此目录中的信息为设备在/dev/目录下动态建立设备文件.

 

 

编译内核:

准备工做:

1) 准备好编译环境

Centos6 安装包组:  “Server Platform Development “ ,“ Development Tools ”

2) 获取目标主机上的硬件设备相关信息

3) 获取目标系统须要的内核功能信息

4) 获取内核源码包, (www.kernel.org)

比较方便的方法就是找个配置模板进行编译安装,Centos6/boot目录提供模板config文件.

~]# tar  -Jxvf linux-4.16.1.tar.xz   -C /usr/src/linux                  #将源码包解压

 

 ~]# cd  /usr/src/linux

 

linux]# make  mrproper                     #删除全部以前编译的内容

linux]# make menuconfig                  #选定内核功能,若是报错,根据提示安装提示包

根据需求勾选功能便可, [*] 把功能内建到Kernel   [M]把功能编译成模块  <>不启用


 

 

linux]# make -j  10      #开始编译,-j 10  表示启用10线程,根据cpu决定使用线程数

linux]# make install_modules              #安装模块,建立相应位置的连接文件(,模块)

linux]# make install                               #安装内核,initramfs,grub

 

 

选择内核功能的方式:

现有模板,以更新方式选择内核功能:

make config      以文本方式遍历内核的全部功能

make menuconfig    基于curses的文本窗口界面显示

make gconfig     基于gtk图形开发环境的图形界面显示(gnome)

make xconfig      基于QT图形开发环境的图形界面显示(KDE)

make oldconfig  基于旧的config文件进行编译

make localmodconfig 基于现操做系统已装载的内核模块进行编译

 

基于新配置进行编译

make defconfig  内核根据目标平台提供默认配置

make allnoconfig 全部功能都不选

 

如何只编译一部分功能:

cd  /usr/src/linux    #进入源码树

make dir/file.ko #只编译一个模块

make dir/ #编译一个目录

make install_modules #若是只是一个模块,复制到(/lib/modules/version/,使用modprobe装载)

make install #安装

 

例如: make net/  #编译网卡功能,编译net目录下全部模块

 

如何夸平台编译(目标平台与当前平台不一样):

make ARCH=ARCH_NAME

 

如何再次编译,主要工做在于清理以前的编译结果:

make  clean  #删除目标编译结果,保存配置文件与本身打的补丁

make    mrproper #删除全部编译结果+config+various backup 

make    disclean #mrproper + 编译器备份

相关文章
相关标签/搜索