編譯內核
先介紹下Kernel是什麽,Kernel為操作系統的核心,提供多種功能,例如操作系統上的進程管理,文件系統,硬件驅動,網絡功能,安全功能...都是由Kernel控制的.
Kernel的設計流派:
單內核設計:所有的功能融為一個進程,各種功能以線程的方式運作,優點在於集中管理,效率高;缺點為某一線程故障,整個Kernel故障,典型應用為Linux.
微內核設計:所有的功能單獨運轉,效率低,單功能故障不會影響全局.典型應用Windows,Solaris.
Kernel的特點:
① 支持模塊化,雖然Linux為單內核設計,但是Linux支持將各種功能做成模塊,例如核心文件(基本功能),網絡功能,
模塊文件存放位置為: /lib/modules/2.6.18-194.el5/kernel/*.ko
②支持模塊的動態裝載功能,各種功能模塊可以等用到時再裝載,極為高效.
Kernel的組成部分:
①核心文件: /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: 輔助文件
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 //強制裝載內核,ins為insert的縮寫
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 + 編譯器備份
編譯內核