首頁 > 軟體

Linux系統啟動過程詳解

2020-06-16 18:05:08

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:超級守護行程。管理所有瞬時守護行程。需要關聯執行級別。


IT145.com E-mail:sddin#qq.com