我說(shuō)的不一定是正確的,卻是這樣理解的
內(nèi)核的基本功能
- 進(jìn)程管理
- 內(nèi)存管理
- 文件系統(tǒng)
- 網(wǎng)絡(luò)管理
- 安全管理
- 驅(qū)動(dòng)程序
- ……
計(jì)算機(jī)的啟動(dòng)流程
POST
--> BIOS
--> MBR
--> kernel
--> initrd
--> (ROOTFS)/sbin/init
詳解啟動(dòng)過(guò)程
硬件自檢(POST)
計(jì)算機(jī)通電后自檢硬件是否滿足運(yùn)行的基本條件(有沒(méi)有短路或者設(shè)備故障等錯(cuò)誤),這叫做“硬件自檢(Power-On Self-Test),縮寫為POST”究恤,如硬件出現(xiàn)問(wèn)題會(huì)發(fā)出滴滴聲叶雹,如果沒(méi)有問(wèn)題將顯示主板或硬件廠商信息BIOS 引導(dǎo)
自檢完成后POST將控制權(quán)交由BIOS,BIOS讀取固化在主板上ROM芯片上的程序乍迄,它可以從CMOS中讀寫系統(tǒng)的設(shè)置和用戶自定義的啟動(dòng)信息啟動(dòng)有一項(xiàng)就是啟動(dòng)順序(Boot Sequence)MBR(bootloader)
BIOS根據(jù)啟動(dòng)次序加載第一個(gè)啟動(dòng)項(xiàng)(如果第一個(gè)啟動(dòng)項(xiàng)啟動(dòng)失敗不會(huì)自動(dòng)啟動(dòng)第二個(gè))弧呐,接著加載一個(gè)硬盤的MBR上的bootloader闸迷,每個(gè)硬盤的前514個(gè)字節(jié)是MBR信息(第一個(gè)扇區(qū)),前446個(gè)字節(jié)是主引導(dǎo)記錄俘枫,后64個(gè)字節(jié)是分區(qū)表信息kernel & initrd(加載內(nèi)核)
MBR 根據(jù)主引導(dǎo)記錄引導(dǎo)分區(qū)后加載內(nèi)核腥沽,內(nèi)核在加載的時(shí)候可能需要加載當(dāng)前硬盤的驅(qū)動(dòng),不過(guò)驅(qū)動(dòng)卻在文件系統(tǒng)中存放鸠蚪,如果要加載文件系統(tǒng)又要先掛載驅(qū)動(dòng)(有點(diǎn)繞)今阳,就是在轉(zhuǎn)圈圈。這個(gè)時(shí)候就需要initrd了茅信,他是一個(gè)運(yùn)行在內(nèi)存中的文件系統(tǒng)(這種不要驅(qū)動(dòng)吧)盾舌,系統(tǒng)在安裝完成后必定知道當(dāng)前文件系統(tǒng)類型,之后生成initrd蘸鲸,內(nèi)核啟動(dòng)妖谴,硬件探測(cè)完畢,內(nèi)核參數(shù)隱射文件完成酌摇,加載驅(qū)動(dòng)膝舅,切換到真正的文件系統(tǒng)執(zhí)行init 程序
內(nèi)核初始化完畢嗡载,執(zhí)行系統(tǒng)服務(wù),用戶自定義腳本仍稀,配置環(huán)境變量鼻疮,自此操作系統(tǒng)啟動(dòng)完畢
Linux 內(nèi)核
內(nèi)核的設(shè)計(jì)風(fēng)格
- 單內(nèi)核:將眾多模塊服務(wù)作用于內(nèi)核中,內(nèi)核大(自行搜索特性)
linux屬于單內(nèi)核琳轿,不過(guò)他卻又有微內(nèi)核的特性,他將需要編譯的模塊功能編譯進(jìn)內(nèi)核耿芹,將非必須要的模塊啟動(dòng)后動(dòng)態(tài)加載進(jìn)內(nèi)核
內(nèi)核模塊位置:/lib/modules/"內(nèi)核版本號(hào)命名的目錄"
-
linux 單內(nèi)核(多線程支持較差)
- 核心 +
ko(kernel object)
內(nèi)核模塊
- 核心 +
-
微內(nèi)核:各種服務(wù)動(dòng)態(tài)加載插入崭篡,內(nèi)核小
- windows是微內(nèi)核
- solaris 微內(nèi)核
內(nèi)核的組成
- 核心:
/boot/vmlinuz-version
- 內(nèi)核模塊(
ko;kernel object
):/lib/modules/version
Kernel初始的過(guò)程
- 設(shè)備探測(cè)
- 驅(qū)動(dòng)初始化(可能會(huì)用initrd(initramfs)文件中裝載驅(qū)動(dòng)模塊)
- 以只讀方式掛載根文件系統(tǒng)
- 裝載第一個(gè)進(jìn)程(PID:1)
init程序(/etc/inittab
配置文件)
Redhat6:init程序只有一行,其他的文件以
*.conf在/etc/init
目錄下存放
centos6.jpg
Redhat5:init配置都存放這一文件中吧秕,啟動(dòng)腳本
centos5.jpg
init文件及配置文件
/sbin/init:(/etc/inittab)只是一個(gè)程序琉闪,多個(gè)組織設(shè)計(jì)開發(fā)
- upstart:有ubuntu開發(fā),d-bus砸彬,event-driven
- systemd:多道并行啟動(dòng)
upstart啟動(dòng)init程序配置文件格式
:
冒號(hào)隔開的4個(gè)段
id
:runlevels
:action
:process
- id:標(biāo)識(shí)符颠毙,只要不跟別的行一樣就行
- runlevels:在哪個(gè)級(jí)別運(yùn)行
- action:在什么情況下執(zhí)行
- initdefault:設(shè)置默認(rèn)運(yùn)行級(jí)別
- sysinit:系統(tǒng)初始化
- wait:等待級(jí)別切換至此級(jí)別時(shí)執(zhí)行
- powerfail:斷電時(shí)執(zhí)行
- powerokwait:來(lái)電時(shí)執(zhí)行
- respawn:一旦程序終止重新啟動(dòng)
- process: 要運(yùn)行的程序
系統(tǒng)初始化腳本/etc/rc.d/rc.sysinit
大概
- 激活udev和selinux
- 根據(jù)
/etc/sysctl.conf
文件,來(lái)設(shè)定內(nèi)核參數(shù) - 設(shè)定系統(tǒng)時(shí)鐘
- 裝載鍵盤映射
- 啟動(dòng)交換分區(qū)
- 設(shè)置主機(jī)名
- 根文件系統(tǒng)檢測(cè)砂碉,并以讀寫方式重新掛載
- 激活RAID和LVM設(shè)備
- 啟動(dòng)磁盤配額
- 根據(jù)
/etc/fstab
蛀蜜,檢查并掛載其文件系統(tǒng) - 清理過(guò)期的鎖和PID文件
運(yùn)行級(jí)別(0-6)
啟動(dòng)服務(wù)不同
- 0:halt
關(guān)機(jī) - 1:single user mode
直接以管理員身份切入犹菇,類似windows安全模式(單用戶模式) - 2:multi user mode
不加載 NFS殴玛,類似 windows不加載網(wǎng)絡(luò)映射 - 3:multi user mode
text mode CLI怯邪,文本字符界面 - 4:reseved
保留級(jí)別 - 5:multi user mode
graphic mode X windows圖形 - 6:reboot
重啟
查看運(yùn)行級(jí)別
runlevel
who -r
查看內(nèi)核release號(hào)
uname -r
引導(dǎo)程序
bootloader(MBR) 引導(dǎo)程序:
- LILO:LInux LOader (自行百度)
- GRUB:GRand Unified Bootloader
- Stage1: MBR
將第一部分安裝日MBR中 主要為了引導(dǎo)第二階段 - Stage1_5: 識(shí)別文件系統(tǒng)
主要識(shí)別操作系統(tǒng)安裝完成后文件系統(tǒng)類型 - Stage2: /boot/grub/
執(zhí)行init程序偽根初始化港柜,內(nèi)核參數(shù)映射悬而,我上面說(shuō)到的initrd程序
- Stage1: MBR
腳本
Linux 服務(wù)類腳本
linux服務(wù)類腳本都遵循SysV風(fēng)格材义,服務(wù)腳本位于/etc/rc.d/init.d
目錄中腳本支持參數(shù)start|stop|restart|status
一定支持參數(shù)
服務(wù)類腳本特性
每個(gè)腳本文本開頭部分都有
chkconfig: runlevels SS KK
當(dāng)chkconfig命令來(lái)為此腳本在rcN.d目錄創(chuàng)建鏈接時(shí)蠕蚜,runlevels表示默認(rèn)創(chuàng)建S開頭的鏈接梢灭,除此之外的級(jí)別默認(rèn)創(chuàng)建為K開頭的鏈接S后面的啟動(dòng)優(yōu)先級(jí)SS所表示的數(shù)字饼灿;K后面的關(guān)閉有限次序?yàn)镵K所表示的數(shù)字
description
:用戶說(shuō)明此腳本的簡(jiǎn)單功能\
表示續(xù)行
chkconfig 命令
--list: 查看所有獨(dú)立守護(hù)服務(wù)啟動(dòng)設(shè)定幕侠;獨(dú)立守護(hù)進(jìn)程
--add SERVICE_NAME: 以SysV風(fēng)格創(chuàng)建鏈接文件
--del SERVICE_NAME: 刪除鏈接
[--level RUNLEVELS] SERVICE_NAME {on|off} : 設(shè)置級(jí)別(如果省略級(jí)別指定,默認(rèn)為2345級(jí)別)
Linux 啟動(dòng)最后執(zhí)行腳本
/etc/rc.d/rc.local: 系統(tǒng)最后啟動(dòng)的一個(gè)服務(wù)碍彭,準(zhǔn)確說(shuō)晤硕,應(yīng)該執(zhí)行的一個(gè)腳本
inittab定義功能概述
- 設(shè)定默認(rèn)運(yùn)行級(jí)別
- 運(yùn)行系統(tǒng)初始化腳本
- 運(yùn)行指定運(yùn)行級(jí)別對(duì)應(yīng)的目錄下的腳本
- 設(shè)定ctrl+alt+del組合鍵的操作
- 定義ups電源在電源故障/恢復(fù)時(shí)執(zhí)行的操作
- 啟動(dòng)虛擬終端(2345級(jí)別)
- 啟動(dòng)圖形終端(5級(jí)別)
內(nèi)核參數(shù)映射
用戶控件訪問(wèn),監(jiān)控內(nèi)核的方式
查看/proc硕旗,/sys
/proc/sys: 此目錄中的文件很多是可以讀寫的窗骑,/proc下其他文件為只讀的
/sys/:某些文件是可寫的
設(shè)定內(nèi)核參數(shù)的方法
echo VALUE > /proc/sys/TO/SOMEFILE
sysctl -w PROPERTY.PROPERTY=VALUE ==>/proc/sys目錄下文件
-p:通知內(nèi)核重讀配置文件
-a:顯示所有內(nèi)核參數(shù)及其值
內(nèi)核、模塊
內(nèi)核模塊一般放于/lib/modules/LINUX_VERSION/
目錄下
這種辦法能立即有效漆枚,但無(wú)法永久有效
永久有效,但不能永久有效: /etc/sysctl.conf
配置使之永久有效
內(nèi)核模塊管理
lsmod:裝載模塊
modprobe MOD_NAME:裝載模塊
modprobe -r MOD_NAME:卸載模塊
modinfo MOD_NAME:查看模塊具體信息
insmod /PATH/TO/MODULES_NAME:裝載模塊
rmmod MOD_NAME:卸載模塊
depmod /PATH/TO/MODULES_DIR: 自動(dòng)顯示一欄
- 內(nèi)核中的功能除了核心功能以外创译,在編譯時(shí),大多功能都有三種選擇
- 不適用此功能(不編譯進(jìn)內(nèi)核或動(dòng)態(tài)模塊)
- 編譯成內(nèi)核模塊
- 編輯進(jìn)內(nèi)核
手動(dòng)編譯內(nèi)核
- make gconfig:Gnome桌面環(huán)境使用墙基,需要安裝圖形開發(fā)庫(kù)
- make kconfig:KDE桌面環(huán)境使用软族,需要安裝圖形開發(fā)庫(kù)
- make menuconfig: 文本打開
- make
- make modules_install: 先編譯模塊
- make install:再編譯內(nèi)核
screen命令: 直接打開一個(gè)新:
-ls: 顯示已經(jīng)建立的屏幕
-r ID:還原回某屏幕
ctrl+a松開后按d: 拆除屏幕
exit:退出
二次編譯時(shí)清理刷喜,清理前,如果有需要立砸,請(qǐng)備份配置文件.config
make clean
make mrproper:連帶清理配置文件
mkinitrd initrd文件路徑 內(nèi)核版本號(hào)
mkinitrd /boot/initrd-uname -r
.imguname -r
chroot: chroot /path/to/temproot 切換根
ldd /path/to/binary_file:顯示一個(gè)二進(jìn)制文件依賴的共享庫(kù)