1. 程式人生 > >轉--linux啟動流程

轉--linux啟動流程

[摘至鳥哥的linux私房菜] 今天看了linux啟動相關的內容,把主要的部分記錄如下。
linux的基礎啟動流程
1. 載入BIOS的硬體資訊,並獲取第一個啟動裝置的代號。
2. 讀取第一個啟動裝置的MBR的引導載入程式(即lilo、grub、spfdisk等)的啟動資訊。
3. 載入作業系統的核心資訊,核心開始解壓,並嘗試驅動所有的硬體裝置。
4. 核心執行init程式並獲得執行資訊。
5. init執行/etc/rc.d/rc.sysinit檔案。
6. 啟動核心的外掛模組(/etc/modprobe.conf)。
7. init執行執行的各個批處理檔案(Script)
8. init執行/etc/rc.d/rc.local檔案。


9. 執行/bin/login程式,等待使用者登入。
10. 登入之後開始以shell控制主機。

1. linux核心的引導
作業系統的核心是放在檔案系統中的,要想正確載入核心就必須提前識別檔案系統。系統剛啟動的時候,就需要通過引導載入程式(即lilo、grub、spfdisk等)來識別檔案系統,引導核心。要想載入linux的核心就必須能識別linux的檔案系統,要載入windows核心就必須能識別windows檔案系統。而grub是同時支援linux和windows的。但windows的載入程式並不支援linux檔案系統,所以在多重啟動設定的時候,總是要先裝windows而後裝Linux。
核心檔案在哪裡呢?一般來說,它會放在/boot裡,並且取名為/boot/vmlinuz。

在載入核心的過程中,必須知道,系統只會“載入根目錄”,並且是以只讀方式載入的。有時為了讓某些功能可以用檔案的方法來讀取,有的系統在啟動的時,會建立虛擬盤(ramdisk),這就需要使用initrd以及linuxrc了。在載入核心的時候,一起載入initrd的映像檔案(boot/initrd-xxxx.img),並利用linuxrc(在initrd的映像檔案內)程式來載入模組。在核心驅動外部硬體的工作完成之後,initrd所建立的虛擬盤就會被刪除。

2. 第一個程式init的載入和runlevel設定

在核心載入完成之後,系統就準備好了,等待程式的執行。整個linux系統中,第一個執行的程式就是“/sbin/init”。init程式做的工作相當多,除了利用設定檔案“/etc/inittab”來獲取執行等級之外,還會通過執行等級的設定值啟動不同的服務專案。執行等級是指linux通過設定不同等級來規定系統用不同的服務來啟動,讓linux的使用環境不同。

"/etc/inittab"中有這麼一句"si::sysinit:/etc/rc.d/rc.sysinit",表明系統需要主動使用"rc.sysinit"這個shell指令碼來設定系統環境。但這個檔案的檔名在各個版本中是不一樣的,需要自行檢視確認。

3. init處理系統的初始化流程(/etc/rc.d/rc.sysinit)

(1)獲取網路環境與主機型別。首先會讀取網路環境設定檔案"/etc/sysconfig/network",獲取主機名稱與預設閘道器等網路環境。
(2)測試與載入記憶體裝置/proc及usb裝置/sys。除了/proc外,系統會主動檢測是否有usb裝置,並主動載入usb驅動,嘗試載入usb檔案系統。
(3)決定是否啟動SELinux。
(4)介面裝置的檢測與即插即用(pnp)引數的測試。
(5)使用者自定義模組的載入。使用者可以再"/etc/sysconfig/modules/*.modules"加入自定義的模組,此時會載入到系統中。
(6)載入核心的相關設定。又一個檔案"/etc/sysctl.conf",按這個檔案的設定值配置功能。
(7)設定系統時間(clock)。
(8)設定終端的控制檯的字形。
(9)設定raid及LVM等硬碟功能。
(10)以方式檢視檢驗磁碟檔案系統。
(11)進行磁碟配額quota的轉換。
(12)重新以讀取模式載入系統磁碟。
(13)啟動quota功能。
(14)啟動系統隨機數裝置(產生隨機數功能)。
(15)清楚啟動過程中的臨時檔案。
(16)將啟動資訊載入到"/var/log/dmesg"檔案中。
如果想知道啟動過程中發生了什麼事可以檢視dmesg檔案。

4. 啟動系統服務"/etc/rc.d/rc*.d"與啟動設定檔案"/etc/sysconfig"
之前結束了inittab中的rc.sysinit之後,系統可以順利工作了,只是還需要啟動系統所需要的各種服務,這樣主機才可以提供相關的網路和主機功能。因此根據之前設定的執行等級,會啟動不同的服務專案。如果當時我們在inittab中選擇了等級3,系統則會在"/etc/rc.d/rc3.d"目錄中執行相應的服務內容,選擇等級5,就在"/etc/rc.d/rc5.d"目錄內。

該目錄下的內容全部都是以 S 或 K 開頭的連結檔案,都連結到"/etc/rc.d/init.d"目錄下的各種shell指令碼。S表示的是啟動時需要start的服務內容,K表示關機時需要關閉的服務內容。如果我們需要自己增加啟動的內容,可以再init.d目錄中增加相關的shell指令碼,然後在rc*.d目錄中建立連結檔案指向該shell指令碼。這些shell指令碼的啟動或結束順序是由S或K字母后面的數字決定,例如S01sysstat表示第一個執行sysstat指令碼,S99local表示排在第99位執行rc.local指令碼。

5. 使用者自定義載入程式(/etc/rc.d/rc.local)
一般來說,自定義的程式不需要執行上面所說的繁瑣的建立shell增加連結檔案的步驟,只需要將命令放在rc.local裡面就可以了,這個shell指令碼就是保留給使用者自定義啟動內容的。

6. 啟動終端和X-Window介面
完成了系統所有的啟動任務後,linux會啟動終端或X-Window來等待使用者登入。
tty1,tty2,tty3...這表示在執行等級1,2,3,4的時候,都會執行"/sbin/mingetty",而且執行了6個,所以linux會有6個純文字終端,mingetty就是啟動終端的命令。
除了這6個之外還會執行"/etc/X11/prefdm -nodaemon"這個主要啟動X-Window

7. 有關變換執行等級
當linux已經登入之後,有時候還希望更換執行等級,一種方法是改變"/etc/inittab"內的設定內容,將"id:3:initdefault:"中的數字改成相應等級,然後重啟即可。


如果只是想暫時地改變執行等級,下次啟動還是按原等級登入,可以直接使用init [0-6]命令來改變執行等級。一般來說,執行等級的不同只是相關的啟動服務內容的不同而已,因此使用命令改變等級會比較兩個改變等級之間的服務內容,關閉一些新等級中不需要的服務專案,啟動新等級需要的服務,而保量新等級和原等級中共有的服務內容。查詢目前等級的命令也很簡單,只需要輸入runlevel即可。如:[[email protected] ~]# runlevel 結果顯示:N 3

相關推薦

--linux啟動流程

[摘至鳥哥的linux私房菜] 今天看了linux啟動相關的內容,把主要的部分記錄如下。linux的基礎啟動流程1. 載入BIOS的硬體資訊,並獲取第一個啟動裝置的代號。2. 讀取第一個啟動裝置的MBR的引導載入程式(即lilo、grub、spfdisk等)的啟動資訊。

Linux啟動流程詳解

linux 詳解 啟動流程 grub mbr 內核 linux啟動流程第一部分 Linux啟動基礎知識1.1 linux centos6.8啟動流程圖 BIOS加電自檢à加載MBRà加載啟動grubà加載內核à啟動/sbin/i

linux啟動流程簡介

機器 配置文件 互聯網 local 相關信息 ade 通過 在操作 mbr 我們都知道,由於linux的穩定性,通常被作為服務器系統,要想稱為一個PHP的高手,linux是必修之課。那麽linux系統從開機到啟動,中間到底都發生了什麽?本文來簡單探討一下中間的神秘過程。 1

-Linux啟動過程詳解(inittab、rc.sysinit、rcX.d、rc.local)

dha mage 模塊 都是 交換 如何配置 mas 完全 打開 http://blog.chinaunix.net/space.php?uid=10167808&do=blog&id=26042 1)BIOS自檢2)啟動Grub/Lilo3)加載內

Linux 啟動流程

grub 指定 建立 cal wap module log images byte 面試遇到過兩家公司問這個問題,問的難一點的問題都答上來了,偏偏這個簡單的反而翻船了,這兩家都沒要我,痛定思痛,一定要把這個給記下來。 本次環境基於 RHEL 6 。RHEL

Linux 啟動流程學習

基礎知識Linux 啟動流程學習 開機自檢(加載BIOS) 無論什麽機器,在開機後都要進行通電自檢(硬件),如果硬件有問題,則無法繼續下去。 (例如當內存條松動時或者損壞,就會發出嘀嘀嘀警報聲)。接著開始加載BIOS(Basic Input Output System BIOS是一個寫入到主板上的一個軟件程序

Linux啟動流程和腳本服務-6

查看 lin 歡迎頁 restart 主機名 please 虛擬內存 linux系統啟動 inux 授課筆記:----------------------------------- linux系統啟動流程:一.初始化階段:1.grub引導界面2.識別硬件3.初始化驅動 二.

Linux 啟動流程及制作光盤鏡像

目的 清理 詳解 vml ESS initramfs load 裝載 歡迎信息 1、 簡述linux操作系統啟動流程 POST (加電自檢):自檢主要硬件設備如:CPU、內存、硬盤是否正常,以及輸入輸出設備是否存在問題等。BootSequence(BIOS)

zynqMP LINUX 啟動流程和移植

最近花了幾天時間完成了zynqMP linux的移植工作,這裡記錄一下工作的流程。 zynqMP linux 啟動過程 U-BOOT製作 ATF編譯 BOOTBIN製作 L

Linux啟動流程及錯誤修復

系統啟動流程                                     

Linux啟動流程_LK流程_recovery/normal_boot(2.2)

深入,並且廣泛 -沉默犀牛 此篇部落格原部落格來自freebuf,原作者SetRet。原文連結:https://www.freebuf.com/news/135084.html 寫在前面的話 寫這篇文章之前,我只好假定你所知道的跟我一樣淺薄

Linux啟動流程_LK流程_aboot_init(不包含recovery boot)(2.1)

深入,並且廣泛 -沉默犀牛 此篇部落格原部落格來自freebuf,原作者SetRet。原文連結:https://www.freebuf.com/news/135084.html 寫在前面的話 寫這篇文章之前,我只好假定你所知道的跟我一樣淺薄

Linux啟動流程_LK流程_bootstrap2(1)

深入,並且廣泛 -沉默犀牛 此篇部落格原部落格來自freebuf,原作者SetRet。原文連結:https://www.freebuf.com/news/135084.html 寫在前面的話 寫這篇文章之前,我只好假定你所知道的跟我一樣淺薄(針對本文這一方

Linux啟動流程_LK流程_Kmain(0)

深入,並且廣泛 -沉默犀牛 此篇部落格原部落格來自freebuf,原作者SetRet。原文連結:https://www.freebuf.com/news/135084.html 寫在前面的話 寫這篇文章之前,我只好假定你所知道的跟我一樣淺薄(針對本文這一方

Linux啟動流程與模組管理(15)

系統的啟動其實是一項非常複雜的過程,因為核心得要檢測硬體並載入適當的驅動程式,接下來則必須要呼叫程式來準備好系統執行的環境,以讓使用者能夠順利的操作整臺主機系統,如果你能夠理解系統啟動的原理,那麼將有助於你在系統出問題時能夠很快速的修復系統,而且還能夠順利的配置多重作業系統的多重啟動問題,為了多重啟動的問題,

Linux 啟動流程 粗解(二)

另一個重要函式 在 start_kernel中最後呼叫的函式 0# 1#程序都是在這裡啟動的 static noinline void __init_refok rest_init(void) __releases(kernel_lock) {     int pid;

Linux啟動流程-bootloader至kernel的過程--android系統啟動流程

1 Bootloader 對於一般的ARM處理器,CPU上電或復位執行第一條指令所在地址,即第一段程式Bootloader的開始地址,Bootloader一般存於Nor-flash(XIP),支援晶片內執行。 Bootloader的功能可總結為:1)初始化CPU時鐘,記憶體

LINUX啟動流程簡析(以Debian為例)

半年前,我寫了《計算機是如何啟動的?》,探討BIOS和主引導記錄的作用。 那篇文章不涉及作業系統,只與主機板的板載程式有關。今天,我想接著往下寫,探討作業系統接管硬體以後發生的事情,也就是作業系統的啟動流程。 這個部分比較有意思。因為在BIOS階段,計算機的行為基本上被寫死了,程式

linux啟動流程的理解

1.bios 2.grub 選擇 3.核心自解壓vmlinux 4.核心引導的模式與變數(引導期記憶體分頁對映)設定           #彙編級 5.核心記憶體再分頁(記憶體空間對映),巨集定義與設定,初始化consol,啟動init   6.啟動設定的init= ,或者  

[]linux shell 流程控制(條件if,迴圈【for,while】,選擇【case】語句例項

linux shell有一套自己的流程控制語句,其中包括條件語句(if),迴圈語句(for,while),選擇語句(case)。下面我將通過例子介紹下,各個語句使用方法。 一、shell條件語句(if用法) if語句結構[if/then/elif/else/fi] if 條件測試語句