1. 程式人生 > >Linux 自學筆記——內核管理初步及編譯

Linux 自學筆記——內核管理初步及編譯

linux kernel 內核管理 編譯內核


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設備的驅動;

文件系統,例如

xfs文件的系統;

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:顯示文件路徑;

-aauthor

-ddescription

-llicense

-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) 文件系統命令(catecho

查看:

#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是用戶空間程序;專用工具:devadminhotplug

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 自學筆記——內核管理初步及編譯