Linux系統啓動流程詳解

POST(加電自檢)-->bootsequence(引導次序,BIOS)-->Boot Loader(MBR)-->Kernel+ramdisk(臨時根,initrd,initramfs)-->mount rootfs(根切換)-->/sbin/init(配置文件,CentOS 5:/etc/inittab, CentOS6 /etc/init/*.conf)

設置默認運行級別-->指定系統初始化腳本-->初始化額外的硬件設備並加載驅動程序-->啓動(關閉)服務(/etc/rc.d/rc#.d,/etc/rc.d/init.d/)-->/etc/rc.d/rc.local-->設置CtrlAltDel組合的功能-->啓動終端(mingetty),並在終端附加登錄程序(login)-->如果級別爲5,則要啓動X server;

一、POST加電自檢:

當我們打開計算機電源,計算機首先會讀取BIOS信息,BIOS中記錄了CPU、內存、設備啓動序列、硬盤等信息;然後對系統啓動關鍵硬件設備進行檢測,如果出現嚴重故障則停機;如果是一般故障,會發出報警提示,等待故障清楚;如果沒有故障,加電自檢完成。

BIOS(Basic Input Output System)是保存於主板CMOS芯片中的程序代碼;

CMOS(ComplementaryMetal Oxide Semiconductor):是主板上的ROM芯片;

二、獲取引導次序,讀取MBR:

加電自檢完成之後:CPU會讀取BIOS信息中的設備啓動序列,按照次序引導,按次序找引導設備,第一個有引導程序(MBR)的設備即爲啓動PC server所用到的設備;

可作爲啓動設備:光驅,便攜式移動設備,硬盤,網卡(系統引導,PXE)

PXE實現系統引導:DHCP,tftp(kernel+ramdisk)

MBR(主引導記錄,Master BootRecord):

MBR位於磁盤的0磁道0扇區,佔用512個字節:

446bytes:Boot Loader,主程序;
64bytes:PartitionTable,硬盤分區表,每16bytes標記一個分區,一共4分區;3個主分區,1個擴展分區,擴展分區還可以劃分爲若干個邏輯分區;
2bytes:MBR有效性標記;

三、Boot Loader:

操作系統內核運行之前的一段小程序,選擇要啓動的內核(在當前磁盤的某或某些分區上);

1、Boot Loader比較常見的有GRUB和LILO:

LILO:LInux Loader
0-1023範圍內的柱面構成的分區的內核文件,通常應用與嵌入式計算機;
GRUB:GRand Unified Bootloader
CentOS 5&6:Grub 0.97
CentOS7:Grub2 1.96

2、GRUB:GRand Unified Bootloader

1)、grub程序由兩段組成:

stage1:位於MBR中(0柱面 0磁道 1扇區);
stage1_5:位於MBR隨後的扇區;
stagr2:讀取grub.conf配置文件,並實現引導功能的擴展;

grub目錄和配置文件位置:

Linux系統啓動流程

2)、grub的功能:

1、提供菜單,並提供交互式接口;
e:進入編輯模式;
a:直接修改內核參數;
c:進入grub命令行模式;
2、允許用戶選擇要啓動的內核或系統;
允許傳遞引導參數給內核;
選擇界面可隱藏;
3、爲編輯功能提供保護機制;
啓用內核文件:選擇運行制定的內核需要先輸入密碼;
傳遞參數:使用e命令需要先輸入密碼;

在菜單選擇倒計時界面按任意鍵進入grub菜單:

Linux系統啓動流程

按e鍵進入編輯菜單可以看到kernel和initrd:

Linux系統啓動流程

3)、grub命令行接口:

>root(DEVICE):指定哪個分區爲接下來要啓動的系統或內核文件所在的分區;
所有硬盤都識別爲hd;
不同的硬盤基於數字標識:如hd0,hd1等;
同一個硬盤上的不同分區,也使用數字標識,如hd0,0 hd1,5;

>find(DEVICE)/path/to/file:查找文件

>kernel:指定要運行的內核文件;
>initrd:爲要運行的內核指定其可用的ramdisk文件;

>boot:啓動此前配置好的內核或系統;

按c鍵進入grub命令行接口:

Linux系統啓動流程

4)、配置文件grub.conf:

文件位置:/boot/grub/grub.conf

Linux系統啓動流程

參數:

default=:選擇第幾個title配置的內核或系統,各title從0開始編號;
timeout=#:菜單顯示的超時時長;
splashp_w_picpath=/path/to/some_p_w_picpath_file:指定菜單的背景圖片;此圖片只能爲14bits色,xpm格式,gzip壓縮;
hiddenmenu:隱藏菜單
titleTILTE STRING:顯示於菜單中的標題;
root:指定引導分區;
kernel:指定kernel位置;
initrd:指定initramfs位置;

在grub菜單按a鍵可在內核加載前編輯內核參數:

Linux系統啓動流程

常用參數:

single:單用戶模式啓動;

5)、grub保護機制:

1、生成密碼:
#grub-md5-crypt
2、保護編輯功能,則需要title之外的添加:
#password--md5 密碼串
3、保護使用某內核,則需要內核對應的title之下添加:
#password--md5 密碼串

6)、安裝grub的方式:

使用grub-install命令:
#grub-install [--root-directory=/path/to/somewhere] DEVICE
--root-directory=/path/to/somewhere

/path/to/somewhere:內核及initrd文件所在的分區的掛載點的父目錄,且此掛載點必須叫boot;

例如:/dev/sdb1:/mnt/boot
#grub-install --root-directory=/mnt /dev/sdb

四、kernel+ramdisk:

根據grub設定的內核映像所在路徑,系統讀取內核文件,並進行解壓縮操作;系統將解壓縮後的內核放在內存中,完成內核自身初始化;探測所能識別的硬件設備,並加載驅動程序,完成核心環境建立;

Linux系統啓動流程

要讀取內核文件必須訪問根文件系統要加載根文件系統所在的設備,而此時根文件系統沒有掛載,要掛載根文件系統需要根文件系統所在設備的驅動程序。爲解決這個問題,grub在加載內核同時,也把ramdisk加載到內存中並運行;

展開ramdisk鏡像文件:

Linux系統啓動流程

ramdisk在內存中表現爲一個虛擬根文件系統initfs,裏面有如同Linux根目錄下的bin、sbin、dev、etc、lib、proc、usr、var、tmp等目錄;initfs將內核與真實根建立聯繫,內核通過initfs加載驅動程序,然後進行根切換,掛載真實根目錄;至此內核加載完成;

1、kernel:

內核的功能:進程管理、文件系統、硬件驅動(在內核模式下運行)、內存管理、安全功能(SELinux)、網絡子系統;

1)、內核設計流派:

單內核體系結構:
linux:支持模塊化,模塊可以動態裝卸載
linux內核:核心+外圍模塊
核心:/boot/vmlinux-VERSION-release
模塊:/lib/modules/VERSION-release
.ko:kernel object
ramdisk:/boot/initramfs-VERSION-release.img
在內核啓動過程中裝載根文件系統時有用;模塊間有可能存在依賴關係;
微內核體系結構:
windows、solaris

2)、內核的某些功能:

編譯進內核本體 [*]
編譯成內核模塊 [M]
不選擇使用 [ ]

3)、內核模塊管理:

#lsmod:顯示內核已裝載模塊

動態裝卸載模塊:
#modprobe -rMOD_NAME:卸載;
#modprobe MOD_NAME:裝載;

#insmod/path/to/module_file:裝載;
#rmmod MOD_NAME:卸載;

查看某模塊的詳細信息:
#modinfo MOD_NAME

檢查並生成模塊間依賴關係的命令:
#depmod

2、ramdisk:

CentOS 5:SysV,init;/etc/inittab--> /etc/rc.d/rc.sysinit;
CentOS 6:upstart,init;/etc/init/*.conf(/etc/inittab) --> /etc/rc.d/rc.sysinit
#chkconfig

CentOS 7:systemd, init;/usr/lib/systemd/system/;借鑑MAC OS X;
#systemctl

五、/sbin/init:

內核加載完成之後,第一個運行的程序就是/sbin/init,該文件會先讀取/etc/init/rcS.conf文件:

Linux系統啓動流程

設定系統運行級別:

0-6:7個運行級別:
0:關機;
1:single usermode,single,s,S,不啓動網絡功能,不啓動用戶認證,單用戶模式(維護模式);
2:multi usermode,不支持NFS功能;
3:完全多用戶模式,文本接口,不啓動圖形界面;
4:未使用;預留級別;
5:完全多用戶模式,圖形接口;
6:重啓;

#init:切換運行級別;

六、/etc/rc.d/rc.sysinit:系統初始化腳本

查看/etc/rc.d/rc.sysinit文件部分內容:

Linux系統啓動流程

初始化設置流程:

設定主機名:讀取/etc/sysconfig/network文件中的HOSTNAME參數,並以之設定主機名;
打印文本歡迎信息:
激活SELinux和udev;
掛載/etc/fstab文件中定義的其他文件系統;
激活swap;
檢測根文件系統,並以讀寫方式重新掛載;
設置系統時鐘;
根據/etc/sysctl.conf設置內核參數;
激活LVM和RAID設備;
加載額外設備的驅動程序;
清理操作;

七、啓動內核模塊:

依據/etc/modprobe.d/*.conf文件裝載內核模塊:

Linux系統啓動流程

八、執行指定運行級別的腳本程序:

/etc/rc.d/rc#.d/:啓動指定的默認級別的默認爲啓動的服務,停止指定的級別下默認爲關閉的服務;

查看/etc/rc.d/rc3.d/目錄:

Linux系統啓動流程

1、目錄中爲鏈接文件指向服務腳本:

S##:默認啓動的服務;
K##:默認停止的服務;
##:01-99,數字越小,越優先啓動或關閉;
先啓動的後關閉(自動解決依賴關係);

2、chkconfig:創建或改變連接文件;

#chkconfig --add SRV_SCRIPT:創建;
#chkconfig --del SRV_SCRIPT:刪除;
#chkconfig SRV_SCRIPT {on|off}:開機自動{啓動|關閉};
默認爲2345級別;
--level######

腳本如果期望能夠被chkconfig命令使用,要在腳本中添加如下行:
#chkconfig:- 85 15
-:當此腳本由chkconfig控制時,默認哪些級別就是開啓的;
85:啓動優先級;
15:關閉優先級;

九、/etc/rc.d/rc.local:

是一個腳本,通常爲系統啓動完成的最後運行一個腳本;

定義一些組合鍵的功能:通常是Ctrl+Alt+Delete;

初始化字符終端;

如果有需要,啓動圖形終端;

十、/bin/logon:

登陸程序:顯示登陸提示符,等待用戶輸入username和passwd;


原文:

http://www.lxway.com/400826.htm


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章