Linux 啟動流程學習
阿新 • • 發佈:2018-03-24
基礎知識Linux 啟動流程學習
根目錄會在開機之後再次掛載 也就是開機之後我們能看到的/dev/sda2分區
這個分區有一個比較有意思的情況 這時我們沒有加載文件系統加載模塊 也就是不能夠掛載 那麽我們為什麽能夠訪問到 /boot分區呢
hexdump -C -n 5120 /dev/sda 這條命令可以看到裏面有grub信息 表明了他的掛載載不需要模塊的幫助
(ps:這裏說掛載不太準確 ,說成 可以直接訪問更貼切)
開機自檢(加載BIOS)
無論什麽機器,在開機後都要進行通電自檢(硬件),如果硬件有問題,則無法繼續下去。
(例如當內存條松動時或者損壞,就會發出嘀嘀嘀警報聲)。接著開始加載BIOS(Basic Input Output System
BIOS是一個寫入到主板上的一個軟件程序。BIOS會去分析計算機裏面有哪些存儲設備,
從默認的第一啟動項開始啟動。
MBR與boot loader
接下來BIOS將程序啟動的下一步交給了MBR,他會去讀取第一個扇區的MBR位置。 由於不同的操作系統的文件系統格式不相同,因此我們必須要一個引導裝載程序來處理文件加載的問題, 也就是BootLoader,而這個BootLoader就安裝在啟動設備的第一個扇區,也就是MBR(主引導分區)
step1:boot loader
boot loader 有如下功能:
提供菜單:用戶可以選擇不同的啟動選項
加載內核文件:直接指向可啟動的程序區段來開始操作系統
轉交其他loader:將引導裝載功能轉交給其他loader負責
boot loader程序 有多個版本
在linux中有 早期的LILO 和現在使用較多的 grub
在windows中有 ntloader
step1.5:/dev/sda1
/dev/sda1 通常是開機後的/boot 操作系統起來之後作用很小 可能我們很少註意到這個分區
但其實這個分區是開機時的根目錄 裏面存放著很多重要的開機所需要的文件 grub vmlinuz 內核等
這個分區有一個比較有意思的情況 這時我們沒有加載文件系統加載模塊 也就是不能夠掛載 那麽我們為什麽能夠訪問到 /boot分區呢
hexdump -C -n 5120 /dev/sda 這條命令可以看到裏面有grub信息 表明了他的掛載載不需要模塊的幫助
(ps:這裏說掛載不太準確 ,說成 可以直接訪問更貼切)
step2: initramfs-.*.img
包含有各種可執行程序和驅動程序,這些驅動程序中包括 即將加載的真正的文件系統的存儲介質的驅動
到了這一步 有了ext4模塊就可以加載文件系統了
/boot下有一個grub. conf配置文件
default 0 表示默認啟動第一個選項 也就是可以有多個內核可供選擇
timeout 表示等待多長時間以後系統自動選擇默認選項啟動
splashiamge 是定義了一個開機啟動時的背景圖 可以自定義
title 分隔開了每一個內核:
root (hd0,0) 表示當前根為 第一個磁盤的第一個分區
kernel 表示當前內核 rhgb表示系統默認啟動以圖形化界面開啟 quiet 只顯示重要信息 安靜模式
initrd 表示啟動系統映像文件名稱
這裏還有一個執行順序問題需要註意:
是先執行initrd 有了文件系統加載模塊 再去交給kernel的 因為你可以看到在配置文件裏有了
/dev的產生 如果沒有文件系統的加載 是無法掛載和有這個名稱的
關於 initrd 和 initramfs 的區別
Kernel
關於kernel我了解的較少 ,只是知道他的作用就是加載一些硬件驅動程序,最終釋放虛擬文件系統
,並掛載實際的目錄文件系統,從而開始後續的正常啟動流程。
init
init程序的類型:
SysV:init CentOS5 之前
配置文件:/etc/inittab
Upstart:init, CentOS6
配置文件:/etc/inittab /etc/init/*.conf
Systemd: systemd CentOS 7
配置文件:/usr/lib/systemd/system
/etc/systemd/system
以CentOS 5為例:
/etc/initab
每一行的定義方式:
id:runlevel:action:process
action :
wait :切換至次級別運行一次
respawn:此進程終止 就重新啟動
initdefault:設定默認運行級別
sysinit:設定系統初始化方式
切換到對應的運行等級時如果為K開頭的進程 就關閉掉對應的服務 如果為S開頭的 就開啟對應的服務
啟動流程總結
step1:加載BIOS的硬件信息和自檢 根據設置啟動所選設備
step2:讀取並執行所選設備內MBR裏的boot loader
step3:根據boot loader加載kernel kernel 檢測硬件預加載驅動程序
step4:kernel調用init init會取得run-level信息
step5:執行/etc/rc.d/rc.sysinit文件來準備軟件執行的操作環境
step6:執行run-lebvel的各個服務啟動
step7:執行/etc/rc.d/rc.local文件
step8:執行終端機模擬程序來啟動login進程 最後等待用戶登錄
Linux 啟動流程學習