Linux 自學筆記——內核管理初步及編譯
Linux Kernel:
內核設計體系:單內核、微內核;
內核的組成部分:
1.Kernel:內核核心,一般為bzimage,通常位於/boot目錄,名稱為vmlinuz-VERSION-release;
2.Kernel object:內核對象,即內核模塊,一般放置於/lib/modules/VERSION-release/,maninfo命令通過讀取此文件的信息以顯示相關信息;
內核模塊與內核核心版本一定要嚴格匹配;
[]:N;
[M]:Module,編譯進模塊中;
[*]:Y,編譯進內核核心;
內核特性:動態裝載和卸載;
Note:有些功能要麽編譯進內核,要麽不編譯
3.ramdisk:輔助性文件,並非必須,這取決於內核是否能直接驅動rootfs所在的設備;
目標設備驅動,例如SCCI設備的驅動;
邏輯設備驅動,例如LVM設備的驅動;
文件系統,例如
ramdisk:是一個簡裝版的根文件系統;
ldd命令:
ldd- print shared library dependencies 打印二進制應用程序所依賴的庫文件;
ldd[OPTION]... FILE...
顯示:1.所依賴庫文件名稱=>所依賴庫文件路徑(對應內存載入符號鏈接映射指向)
2.整個系統調用庫的入口
內核信息獲取:
uname命令:
uname- print system information
格式: uname [OPTION]...
-a:顯示所有信息
-n:顯示主機名;
-r:顯示內核的release號;
-v:顯示內核版本號;
文件:/boot/vmlinuz-VERSION-release
模塊信息獲取和管理:
lsmod命令:
lsmod- program to show the status of modules in the Linux Kernel 顯示由內核已經裝載的內核模塊;
顯示的內容來自於/proc/modules
modinfo命令:
modinfo- program to show information about a Linux Kernel module顯示內核模塊的詳細信息
modinfo[-F field] [-k kernel] [modulename|filename...]
-F field:僅顯示指定字段的信息;
-n:顯示文件路徑;
-a:author
-d:description
-l:license
-k:顯示指定的內核版本模塊
modprobe命令:
-Add and remove modules from the Linux Kernel
modprobe[ -C confile-file] [modulename] [moduleparame-ters…]
配置文件:/etc/modprobe.conf,/etc/modprobe.d/*.conf
格式:modprobe [-r] module_name
模塊的動態裝載:modprobe module_name
動態卸載:modprobe -r module_name
Note:對正在使用的模塊不要輕易卸載;此命令自動解決依賴關系;
depmod命令:
depmod- program to generate modules.dep and map files.
內核模塊依賴關系的生成工具;
depmod[-Anea]
-A:只分析比modules.dep記錄還新的內核模塊,才會更新
-n:不寫入modules.dep只輸出到屏幕;
-e:顯示目前已經加載的不可執行的模塊名稱;
-a:分許所有模塊;
模塊裝載卸載的另外一種方式:
insmod命令:
insmod - simple program to insert a moduleinto the Linux Kernel
insmod[ filename ] [ module options... ]
filename:模塊文件的文件路徑;(內核模塊的絕對路徑,一般以.ko文件結尾)
rmmod命令:
rmmod- simple program to remove a module from the Linux Kernel
rmmod [module_name]
ramdisk文件的制作:
(1)mkinitrd命令
為當前使用中的內核重新制作ramdisk文件
# mkinitrd [OPTION...][<initrd-image>] <kernel-version>
--with=<module>:除了默認的模塊之外需要裝載至initramfs中的模塊;
--preload=<module>:initramfs所提供的模塊需要預先裝載的模塊;
~]#mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
(2)dracut命令:
- low-level tool forgenerating an initramfs image
# dracut [OPTION...][<image> [<kernel version>]]
示例: ~]# dracut/boot/initramfs-$(uname -r).img $(uname-r) 用法和mkinitrd一樣;
內核信息輸出的偽文件系統:
/proc:內核狀態和統計信息的輸出接口,同時,還提供一個配置接口,/proc/sys
參數:
只讀:信息輸出,例如/proc/#/*
只寫:可接受用戶指定一個“新值”來實現對內核某功能或特性的配置:/proc/sys/
/proc/sys:
net/ipv4/ip_forward 相當於 net.ipv4.ip_forward
1) sysctl命令:
專用於查看或設定/proc/sys目錄下參數的值;
sysctl [options] [variable[=value]]
查看:
#sysctl -a
#sysctl variable
修改其值:
#sysctl -w variable=value
2) 文件系統命令(cat,echo)
查看:
#cat/proc/sys/PATH/TO/SOME_KERNEL_FILE
設定:
#echo“VALUE” > /proc/sys/PATH/TO/SOME_KERNEL_FILE
3) 配置文件:/etc/sysctl.conf,/etc/sysctl.d/*.conf;
立即生效的方式:sysctl -p [/PATH/TO/CONFIG_FILE]
內核參數:
net.ipv4.ip_forward:核心轉發;
vm.drop_caches:
kernel.hostname:主機名;
net.ipv4.icmp_echo_ignore_all:忽略所有ping操作;
/sys目錄;
sysfs:輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的可設置參數;對此些參數的修改,即可定制硬件設備工作特性;
udev;通過讀取/sys目錄下的硬件設備信息按需為各硬件設備創建設備文件;udev是用戶空間程序;專用工具:devadmin,hotplug;
udev為設備創建文件時,會讀取其事先定義好的規則文件,一般在/etc/udev/rules.d/目錄下,以及/usr/lib/udev/rules.d目錄下;
編譯內核:
程序包的編譯安裝:
./configure, make,make install
前提:開發環境(開發工具,開發庫),頭文件:/usr/include
開源:源代碼—>可執行格式
發行版:以“通用”的目標;
前提:
1) 準備好開發環境;
2) 獲取目標主機上的硬件設備的相關信息;
3) 獲取到目標主機系統的功能的相關信息,例如要啟用的文件系統;
4) 獲取內核源代碼包:www.kernel.org
準備開發環境:
Centos6.6:
包組:
Development Tools
Server Platform Development
Centos 7:
包組:
Development Tools
Server Platform Development
包:
ncures-devel
獲取目標主機上硬件設備的相關信息:
CPU:
~]#cat /proc/cpuinfo
~]#lscpu
~]#x86info –a x86info需要先手動安裝才能使用
PCI設備:
~]#lspci
-v:詳細顯示信息
-vv
~]#lsusb
-v:詳細顯示usb信息
-vv
~]#lsblk
了解全部硬件設備信息:
~]#hal-device
內核編譯過程:
1. 準備好開發環境,安裝好“DevelopmentTools”“Server Platform Development”組件;
2. 從kernel官網上下在內核;
3. 下載好內核之後將文件解壓縮歸檔至/usr/src目錄;
4. 創建鏈接文件;
5. 準備配置文件;
6. 配置內核選項;
1)給內核加一個名稱,依次選中Generalsetup-->Local version – append to kernel release;
2)選擇啟動的內核模塊,在打開這個配置的第一個界面依次選擇File systems -->DOS/FAT/NT file systems-->NTFS file systemssupport,如圖所示,利用空格鍵選中,[]表示不編譯,[M]表示編譯至模塊中,[*]表示編譯至內核中。本次測試選中NTFS模塊;
3)退出保存,比較配置前後區別;
7. 安裝編譯;
1) 編譯內核,可使用make –j #指定編譯線程數量,因為遠程編譯可能終端斷開就前功盡棄了,所以 使用screen命令就可以不用擔心編譯中斷了;
2) 安裝內核模塊;
3) 安裝內核;最後一步在虛擬機裏出現報錯,為can’tfind modules…可忽略
#make install;
8. 編輯grub配置文件,將default=1改為default=0,隨後重啟系統;
screen命令:
打開screen:~]# screen
拆除screen: Ctrl+a, d
列出screen: ~]# screen -ls
連接至screen: ~]# screen -r SCREEN_ID
關閉screen: ~]# exit
編譯安裝內核的詳細說明:
1. 大概安裝步驟:
1) 安裝開發包組
2) 下載源碼文件
3) .config:準備文本配置文件
4) makemenuconfig:配置內核選項
5) make[-j #]
6) makemodules_install:安裝模塊
7) makeinstall :安裝內核相關文件
安裝bzImage為/boot/vmlinuz-VERSION-RELEASE(去boot目錄下查看)
生成initramfs文件
8) 編輯grub的配置文件
2. 配置內核選項
支持“更新”模式進行配置:在已有的.config文件的基礎之上進行修改配置;
a) make config:基於命令行以遍歷的方式去配置內核中可配置的每個選項;
b) make menuconfig:基於cureses的文本配置窗口;
c) make gconfig:基於GTK開發環境的窗口界面;
包組“桌面平臺開發”
d) make xonfig;基於QT開發環境窗口界面;
支持“全新配置”模式進行配置:
a) make defconfig:基於內核為目標平臺提供的“默認”配置為模板進行配置;
b) make allnoconfig:所有選項均為“no”
3. 編譯
a) 多線程編譯:make [-j #]
b) 編譯內核中的一部分代碼:
i只編譯某子目錄中的相關代碼:
# cd /usr/src/linux
# make path/to/dir/
ii只編譯一個特定的模塊:
# cd /usr/src/linux
# make path/to/dir/file.ko
例如:只為e1000編譯驅動:
#make drivers/net/ethernet/intel/e1000/e1000.ko
c) 如何交叉編譯:
目標平臺與當前編譯操作所在的平臺不同;
# make ARCH=arch_name
要獲取特定目標平臺的使用幫助:
# make ARCH=arch_name help
4. 如何在執行過編譯操作的內核源碼樹上做重新編譯:
事先清理操作:
# make clean:清理編譯生成的絕大多數文件,但會保留config,及編譯外部模塊所需要的文件;
# make mrproper:清理編譯生成的所有文件,包括配置生成的config文件及某些備份文件;
# make distclean:相當於mrproper,額外清理各種patches以及編輯器備份文件;
Linux 自學筆記——內核管理初步及編譯