編譯內核

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 + 編譯器備份

相關文章
相關標籤/搜索