Linux內核基礎:
Linux Kernel:
Linux內核的體積結構是單內核的,但充分借鑑了微內核設計體系的優勢,爲內核引入模塊化機制,使得雖然是單內核,但工做在模塊化的方式下,而且模塊能夠動態裝載或卸載;Linux內核負責管理系統的進程、內存、設備驅動程序、文件和網絡系統,決定着系統的性能和穩定性。如是咱們在瞭解Linux內核的基礎上根據本身的須要量身定製一個更高效更穩定的內核,就須要咱們手動去編譯和配置內核裏的各項相關的參數和信息。
內核的組成部分:
一、Kernel:內核核心,通常爲bzimage,一般位於/boot目錄,名稱爲vmlinuz-VERSION-release
二、Kernel object:內核對象,即內核模塊,通常放置於/lib/modules/VERSION-release/;內核模塊與內核核心版本必定要嚴格匹配
選擇編譯內核選項標記解釋:
[]:N,不編譯進內核
[M]:Module,編譯成內核模塊
[*]:Y,直接編譯進內核核心(kernel核心文件中)
注意:有些功能要麼編譯進內核,要麼不編譯
三、ramdisk:輔助性文件,並不是必須,這取決於內核是否能直接驅動rootfs所在的設備;是一個簡裝版的根文件系統;藉助ramdisk可以加載的內容:
目標設備驅動,例如SCCI設備的驅動;
邏輯設備驅動,例如LVM設備的驅動;
文件系統,例如xfs文件的系統;linux
內核信息獲取:
uname命令:uname- print system information
格式:uname [OPTION]...
-a 顯示全部信息
-n 顯示主機名
-r 顯示內核release號
-v 顯示內核version號緩存
內核模塊信息獲取和管理:
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 顯示指定內核版本對應的模塊信息app
modprobe命令:
modprobe- Add and remove modules from the Linux Kernel 裝載和卸載內核模塊
格式:modprobe[ -C confile-file] [modulename] [moduleparame-ters…]
配置文件:/etc/modprobe.conf /etc/modprobe.d/*.conf
模塊的動態裝載:modprobe module_name
模塊的動態卸載:modprobe -r module_name
注意:對正在使用的模塊不要輕易卸載;此命令能夠自動解決模塊間的依賴關係;模塊化
depmod命令:
depmod- program to generate modules.dep and map files. 內核模塊依賴關係及系統信息映射文件的生成工具;
若是模塊間的依賴關係文件被損壞(/lib/modules/3.10.0-514.el7.x86_64/modules.dep),能夠經過該命令去生成新的模塊依賴關係文件,可是該文件不會真正被使用而是將其編譯爲*.dep.bin的二進制文件方便查詢和使用;該命令還會生成/boot/Sys.map-Version-Release文件,該文件是對應版本內核所支持庫文件的映射關係
格式: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文件的製做:
一、mkinitrd命令:爲當前使用中的內核從新制做ramdisk文件
格式:mkinitrd [OPTION...][<initrd-image>] <kernel-version>
--with=<module> 除了默認的模塊以外額外需裝載到initramfs中的模塊(添加某個模塊到initrd中)
--preload=<module> initramfs所提供的模塊須要預先裝載的模塊
示例:mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)測試
二、dracut命令:
dracut- low-level tool forgenerating an initramfs image
格式:dracut [OPTION...][<image> [<kernel version>]]
示例:dracut /boot/initramfs-$(uname -r).img $(uname-r) 用法和mkinitrd同樣ui
/proc目錄:
內核狀態和統計信息的輸出接口,以及可配置參數配置接口(/proc/sys/)
只讀:內核狀態和統計信息的輸出
只寫:可接受用戶指定一個「新值」來實現對內核某功能或特性的配置(/proc/sys/)spa
sysctl命令:用於查看或設定/proc/sys/目錄中諸多參數
格式:sysctl [options] [variable[=value]]
查看:
sysctl -a 顯示全部參數設置的值
sysctl Variable 顯示指定參數名的值
修改:
sysctl -w Variable=value
示例:sysctl -w kernel.hostname=mail.magedu.com
說明:紅色部分指定的參數名與/proc/sys/目錄下文件同名,以點號隔開表示下一級目錄
修改查看還能夠經過如下方式實現:
查看:
cat /proc/sys/kernel/hostname
修改:
echo "mail.magedu.com" > /proc/sys/kernel/hostname
sysctl的配置文件:/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目錄:
輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的可設置參數;對某些參數的修改,用來設置調整硬件設備的工做特性
udev就是經過讀取/sys目錄下的硬件設備信息按需爲各硬件設備建立設備文件;udev是用戶空間程序;專用工具:devadmin,hotplug;udev爲設備建立文件時,會讀取其事先定義好的規則文件,通常在/etc/udev/rules.d/和/usr/lib/udev/rules.d/目錄下
screen命令:
一個終端下打開多個屏幕,並剝離屏幕與終端的關係,終端關閉也不會影響屏幕下的進程
打開screen:screen
拆除screen:Ctrl+a,d
列出screen:screen -ls
鏈接指定screen:screen -r SCREEN_ID
關閉screen: exit
編譯內核:
一、準備好開發環境
二、獲取目標主機上的硬件設備的相關信息
三、獲取到目標主機系統的功能的相關信息,例如要啓用的文件系統
四、獲取內核源代碼包: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 詳細顯示pci信息
-vv
lsusb
-v 詳細顯示usb信息
-vv
lsblk
hal-device 顯示所有硬件設備信息
示例1:Centos 6上linux-3.10內核編譯過程:
一、準備好開發環境,安裝好「Development Tools」「Server Platform Development」組件;
yum groupinstall "Development Tools"
yum groupinstall "Server Platform Development"
二、從kernel官網上下載內核源代碼;
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v3.0/linux-3.10.tar.xz
三、下載好內核以後將文件解壓縮至/usr/src目錄;
tar -Jxvf linux-3.10.tar.xz -C /usr/src/
四、建立連接文件; (默認內核源碼/usr/src/linux,全部要建立linux軟連接文件連接到真實文件夾)
cd /usr/src/
ln -s linux-3.10 linux
五、準備.config配置文件;
cp /boot/config-2.6.32-431.el6.x86_64 /usr/src/linux/.config
六、配置內核選項;
cd /usr/src/linux
make menuconfig
給內核加一個名稱,依次選中Generalsetup-->Local version – append to kernel release;
此處填寫的名字不能有空格
選擇啓動的內核模塊,在打開這個配置的第一個界面依次選擇File systems -->DOS/FAT/NT file systems-->NTFS file systemssupport,如圖所示,利用空格鍵選中,[]表示不編譯,[M]表示編譯至模塊中,[*]表示編譯至內核中。本次測試選中NTFS模塊;
退出保存,比較配置先後區別;
七、安裝編譯;
編譯內核,可以使用make –j #指定編譯線程數量,由於遠程編譯可能終端斷開就前功盡棄了,因此 使用screen命令就能夠不用擔憂編譯中斷了;
make -j 4
安裝內核模塊
make modules_install
安裝內核;最後一步在虛擬機裏出現報錯,爲can’tfind modules…可忽略
make install
八、編輯grub配置文件,將default=1改成default=0,隨後重啓系統