2021-05-12 14:32:11
Linux系統啟動過程詳解
Linux系統啟動流程:
POST --> BIOS(Boot Sequence引導次序) --> MBR(bootloader,446byte) --> Kernel --> initrd(initramfs) --> (ROOTFS) --> /sbin/init(/etc/inittab)
核心設計風格:
單核心:
所有功能都在一個核心中。Linux採用單核心,但是採用了微核心的設計思想。LWP(輕量級進程 light weight pprocess)。
核心:
/boot/vmlinuz-verison
動態載入ko(kernel object 核心專用模組)。
核心模組(ko):/lib/modules/KERNELVERISON/
常見的裝載核心模組命令:
#insmod
#modprobe
微核心:
把其他功能做成子核心。Windows Solaris。真正意義上的多執行緒。
核心提供的功能:
檔案系統
進程管理
記憶體管理
網路管理
安全功能
驅動程式
核心初始化過程:
1.裝置探測。
2.驅動初始化
可能從initrd(initramfs(RHEL6))件中裝載驅動模組。
3.以唯讀模式掛載根檔案系統(rootfs)。
4.裝載使用者空間內第一個進程init(PID=1)
initrd:
一個中間層系統,在系統啟動是提供必要的基本驅動,生成一個臨時根,為核心提供存取真正根檔案系統所需要的基本驅動程式。待核心成功掛載根檔案系統後,會把臨時根下的 /proc、 /sys、/dev移動到真的根下。
ramdisk --> initrd RHEL5 把記憶體模擬成磁碟使用。
ramfs --> initramfs RHEL6 把記憶體模擬成磁碟使用。
#chroot TEMPROOTDIR [COMMAND] 臨時切換為根目錄
例如:
#chroot /tmp/virroot /bin/csh
#ldd FILE 顯示二進位制檔案所依賴共用庫。
init:
系統啟動的第一個進程。
bin檔案路徑:
/sbin/init
/etc/init
/bin/init
核心將會依次按以上目錄順序查詢init,若都無法找到init,則核心會執行/bin/sh。
組態檔:
/etc/inittab
每一行記錄一個要啟動或執行的服務(進程)。
設定的任務:
1.設定預設執行級別。
2.執行系統初始化指令碼。
/etc/rc.d/rc.sysinit
3.按照以下順序執行指定執行級別對應目錄下的下的服務類指令碼。
/etc/rc.d/init.d
/etc/rc.d/rcNUM.d
/etc/rc.d/rc.local
4.設定ctrlaltdel組合鍵的動作。
5.定義ups電源在電源故障或恢復是執行的操作。
6.啟動虛擬終端(level為2345)。
1:2345:respawn:/sbin/mingetty tty1
...
6:2345:respawn:/sbin/mingetty tty6
7.啟動圖形終端(level為5)。
x:5:respawn:/etc/X11/perfdm-nodaemon
每行結構如下:
id:runlevels:action:process
id:服務引數的標示,1~4個字元。
id 預設RUNLEVEL
si 系統初始化
l0~l6 指定RUNLEVEL
ca 攔截到ctrl+alt+del
pf 電源失效
pr 電源恢復
NUM 設定NUM號虛擬終端
x 啟動x服務
runlevels:在哪個級別下執行。
action:在某個事件下執行的動作。
initdefault 設定預設執行級別。
sysinit 系統初始化。
wait 級別切換至此級別時執行。
ctrlaltdel 重新啟動。
powerfail 電源失效。
powerokwait 電源失效後至關機前電源恢復。
respawn 一旦程式終止會重新啟動。
process:要執行的程式,定義使用絕對路徑。
/etc/init/*.conf
該目錄下的檔案是把inittab檔案進行切片後產生的許多.conf檔案。都是基於事件驅動編寫的。
重新啟動init:
#init q
#telinit q
#kill -HUP 1
執行級別RUNLEVEL:
各個級別區別在於啟動的服務不同。
0:halt
1:single user mode
直接怡管理員身份登入,無需驗證。
2:mulit user mode no NFS
不啟動NFS等網域功能相關的伺服器。
3:mulit user mode text mode
命令列模式
4:reseved
保留級別,暫時未定義。
5:mulit user mode graphic mode
圖形模式
6:reboot
執行級別的設定:
修改/etc/inittab
檢視執行級別:
#runlevel
LSATLEVEL CURRENTLEVEL
其中LASTLEVEL表示上一個級別,N表示沒切換過。CURRENTLEVEL表示當前級別。
切換執行級別:
#init [OPTION] LEVEL
[OPTION]
LEVEL
0 關機
1 單使用者模式
2 命令列模式(不啟用NFS)
3 命令列模式
4 保留模式
5 圖形介面
6 重新啟動
S 單使用者模式
s 單使用者模式
/etc/rc.d/rc.sysinit
設定系統的基本環境,完成以下任務:
1.啟用udev和selinux。
2.根據/etc/sysctl.conf檔案來設定核心引數。
執行sysctl -p。
3.設定系統時鐘。
4.裝載鍵盤對映。
5.啟用swap分割區。
執行swapon -a -e。
6.設定主機名,從/etc/sysconfig/network中讀取HOSTNAME引數。
7.檔案系統檢測,根據/etc/fstab,檢查並掛載其他檔案系統。並且在無錯誤以後,將根以讀寫方式重新掛載。
8.初始圍硬體裝置。
定義在/etc/modprobe.conf中的模組
ISA、PnP的裝置
USB裝置
9.啟動RAID和LVM
10.如有必要,解除安裝initrd
11.初始化序列裝置。根據/etc/rc.serial進行初始化。預設無此指令碼,需要自行建立。
12.清理過期的鎖檔案(/var/lock/subsys/*)和IPC檔案。
13.重新設定磁碟引數,根據/etc/sysconfig/harddisk DEVICE。
/etc/rc.d/init.d/*
服務類指令碼,SysV風格,存放在/etc/rc.d/init.d下。有一個連結檔案/etc/init.d --> /etc/rc.d/init.d。
組態檔:
/etc/sysconfig/服務指令碼同名
指令碼至少接受以下引數:
start|stop|restart|status|reload|condrestart(有條件重新啟動,已啟動的重新啟動,未啟動的不重新啟動。)
指令碼共有特性:
#chkconfig: RUNLEVELS SS KK
RUNLEVELS 啟動級別
RUNLEVELS可以用-表示沒有級別預設為SNUM開頭的連結,即全部都是KNUM開頭的連結。
SS 啟動的優先順序
KK 關閉的優先順序
當使用chkconfig命令為此指令碼在rcNUM.d目錄建立連結時,RUNLEVEL表示預設建立為SNUM開頭的檔案,除此之外的級別均預設建立為KNUM開頭的連結。S後邊的啟動優先順序為SS所表示的數位,K後邊的關閉優先順序次序為KK所表示的數位。一般SS+KK=99。
#description: DESCRIPTIONS
描述資訊,使用者說明此指令碼的簡單功能。可以使用進行續行。
/etc/rc.d/rc.local
/etc/rc.d/rcNUM.d/S99local --> /etc/rc.d/rc.local
/etc/rc.local --> /etc/rc.d/rc.local
在系統啟動最後執行的服務,準確說應該是指令碼。不方便定義為服務等的命令都可以在其中寫入,在使用者登入前執行。
例如命令列模式登陸式的顯示的歡迎內容等。
GRUB:GRand Unified Bootloader
grub啟動流程:
stage1:裝在MBR中。目的是為了引導stage2。
stage1.5:用來識別常見的檔案系統。
stage2:位於核心所在分割區。/boot/grub/。
/etc/grub.conf
grub組態檔。是連結檔案,指向/boot/grub/grub.conf
主要內容如下:
default=0
設定預設啟動的title編號,編號從0開始。
timeout=5
等待選擇超時時間。單位是秒。
splashimeage=(hd0,0)/grub/palash.xmp.gz
指定grub背景圖片。
hidenmenu
是否隱藏選單。
password --md5 PASSWORD
設定GRUB的編輯的密碼。可以使用grub-md5-crypt來生成加密的密碼。
title TITLENAME
核心標題或者是OS的名稱,可自由修改。
root (hdDISKNUM,PARTNUM)
指定核心檔案所在的裝置和分割區。對grub而言,所有硬碟一律顯示為為hd。DISKNUM表示磁碟序號,PARTNUM表示分割區序號。
kernel KERNEL CMDLINE
指定kernel路徑即傳遞給核心的引數。引數檔案可以在/proc/cmdline中看到。
initrd INIDRD
指定initrd路徑。
password --md5 PASSWORD 啟動核心或OS的密碼。
安裝grub:
#fdisk DEVICE
/dev/PART1 用來做boot
/dev/PART2 用來做sysroot
#mkdir /DIR/boot
#mount /dev/PART1 /DIR/boot
#grub-install --root-directory=/DIR DEVICE
此種方式要保證把核心檔案所在分割區掛載在/boot上。grub只要指定/boot所在的父目錄就能自動找到/boot。
#vim /DIR/boot/grub.conf
修復grub:
安裝grub stage1:
#grub
grub> root (hdDISKNUM,PARTNUM) 指定核心所在的磁碟和分割區。
grub> setup (hdDISKNUM) 在指定的硬碟上安裝grub。
grub> quit
grub.conf檔案丟失:
開機進入grub後操作。
grub> find (hdDISKNUM,PARTNUM)/
按tab鍵會顯示出相關檔案。
grub> root (hdDISKNUM,PARTNUM)
grub> kernel /KERNEL
grub> initrd /INITRD
grub> boot
#mingetty [OPTION] 啟動終端
[OPTION]
--loginprog=/bin/login 啟動中斷後執行的程式。預設為/bin/login。
#agetty [OPTION] PROT BAUDRATE 替代getty命令。
[OPTION]
-l LOGIN PROGRAME 指定登陸程式
-n 不需要使用者輸入使用者名稱。不需要使用者輸入登入資訊。配合-l一起使用。
例如:
#agetty -l /bin/bash 38400 登陸bash並將波特率設定為38400。
#stty [OPTION] DEVICE SETTING 改變和顯示終端裝置。
[OPTION]
-F --file=DEVICE 開啟並使用指定的裝置
SETTING:
size 顯示行(rows)列(columns)數。
speed 顯示終端速率。
例如:
#stty -F /dev/console size 物理終端
25 80 25行80列。
#stty -F /dev/console speed
38400 每秒38400個字元
#chkconfig [OPTION]
指定SysV風格指令碼,自動在/etc/rcNUM.d下建立連結。
[OPTION]
--list SERVICE 列出所有獨立守護行程的啟動設定。不加引數顯示所有設定。
--add SERVICE
自動建立連結,將SERVICE新增到chkconfig控制的服務列表中。下次系統啟動生效。
--del SERVICE
刪除SERVICE所有連結檔案。
--level [RUNLEVELS] SERVICE on|off
指定級別為RUNLEVELS,SERVICE啟動或關閉。對於瞬時守護行程不需要指定RUNLEVLES。RUNLEVELS可以省略,省略預設為2345級別。
linux常見的關機和重新啟動命令:
shutdown
halt
-p 切斷電源
需要配合exec命令使用。
reboot
poweroff
init 0
init 6
#exec 執行檔案,並以子進程替換父進程。
例如:
#exec halt -p
守護行程的型別:
獨立守護行程
瞬時守護行程
不需要關聯至運???級別。
xinetd:超級守護行程。管理所有瞬時守護行程。需要關聯執行級別。
相關文章