Linux啓動流程詳解

一、爲什麼要研究linux系統啓動:

    或 許有人會說,等它開機就好了,爲什麼還要研究它開機流程呢,其實如果服務器運行很好又沒有人爲的誤操作等,或許不用研究,但是爲了能在系統出問題後第一時 間的修復它,又或者你忘記了root密碼等情況時就非常有必要研究一下linux的開機流程了,因爲只有知道了它是如何運作的,才能讓它更好的服務與人 類,廢話不多說,正文開始

二、系統啓動流程:

    不同的版本的linux系統開機可能不同,但是總的來說,大同小異,下面就以centos6.8的系統爲例,介紹linux的開機過程。

post加電自檢---> MBR引導--> GRUB引導--->加載內核--->啓動init--->各種初始化腳本運行--->執行/bin/login --->開機過程結束

1111.png

1. 加電自檢:  

    加 電自檢post(power on system test):加電自檢主要是檢查各硬件是否存在並能正常運行,包括cpu,內存,硬盤,cpu風扇,有的甚至包括鍵盤鼠標的外設的檢測,這一段名叫 BIOS的程序是存放在CMOS的硬件芯片上面,加電就是給CMOS 加電,由於CMOS是rom芯片,所以還有一個單獨的ram芯片用來存放它的配置信息,這就是主板爲什麼要放一塊電池的原因了。

2. 選擇啓動順序加載MBR(master boot recoder)啓用bootloader程序加載內核:

    經 過一系列的硬件檢測完畢後,並順利通過後,就要加載MBR了,MBR存放在第一個可啓動硬盤的第一個分區內,大小爲512byte,這512個字節當中前 446byte就是bootloader,以及隨後的64字節的分區表,2byte分區結束標誌,第一部分的bootloader部分就是主引導記錄的第 一部分,因爲引導程序功能較爲強大並且會有驅動文件,是446byte字節能存放,後續將介紹它的其它部分。第一部分的bootloader程序會調用 512個字節之後的一部分扇區中的數據,這些數據包括/boot分區的驅動,因爲軟件和硬件的連接必須通過驅動的翻譯,此時通過/boot分區的驅動,加 載好了/boot,該分區中包含了grub程序的第二部分,和內核鏡像文件,還有就是initramfs文件,如果此時加載  / 分區的話,因爲 / 分區不一定和 /boot 分區是同一種文件系統,不同的文件系統需要的文件系統的驅動是不同的,所以grub會將initram文件加載至內存當中解壓,並且此時要加載內核文件, 解壓後會在該文件系統形成一個類似於 / 的文件系統 在此時的 “/” 中的lib中有系統真正的 / 的各種文件系統驅動,此時就可以加載根文件系統了

3. 啓動init以及各種啓動腳本:

    加 載好根文件系統就要啓動用戶的第一個執行程序/sbin/init*, 其中包括/etc/inittab ,/etc/init/*.conf(在centos5中是直接一個/inittab文件,順序執行,速度較慢,到了6時許多被依賴的程序服務等先執行, 並且沒有依賴關係的也同時執行,到了7時配置文件變成了/usr/lib/systemd/* 此時系統的啓動就已經非常快了,許多服務都可以同時啓動,即使是被依賴的也可以並行啓動,加快了開機速度)

  init文件主要定義了下面的幾項:

(1)開機啓動級別選擇0-6共七個:

            0:關閉所有服務關機

            1: 維護模式的單用戶模式

            2: 維護模式的多用戶模式

            3:正常級別,多用戶模式

            4:未定義

            5:正常級別,帶有圖形化的多用戶模式

            6:關閉所有服務重啓

            注:可以使用runlevel,或者who -r 命令檢查當前系統的運行級別

 

(2) 使用/etc/rc.d/rc.sysinit 進行系統初始化

            a)  根據配置文件進行設置主機名

            b)  打印文本歡迎信息

            c)   激活Selinux和udev

            d)  掛載所有定義在/etc/fstab文件的文件系統

            e)   激活swap分區

            f)   檢測根文件系統並實現以讀寫掛載根

            g)  設置系統時鐘

            h)  根據/etc/sysctl.conf文件設定內核參數

            i)   激活LVM和RAID設備

            j)   加載額外的設備驅動

            k)  清理操作

 

(3) 執行選擇了開機啓動的級別下相應的腳本/etc/rc.d/rc#.d

  /etc/rc.d/rc#.d/ 該目錄的執行需要根據/etc/init/rc 文件選擇是否啓動什麼服務,在rc文件當中執行一個for循環先執行K*的文件的服務進行stop,S開頭的服務啓動在相應的啓動級別下面都是許多個軟鏈 接文件,這些文件指向/etc/rc.d/下面的服務腳本,並且這些軟鏈接文件分別是以S開頭和K開頭的文件,S表示在該運行級別要啓動的服務,K開頭的 表示該級別不需要啓動的服務,有人會說,在開機是該服務就沒有啓動,爲什麼還要停一次呢?本來服務就沒有啓動,停它幹啥?確實是這樣,但是你有沒有想過, 假如在運行級別3已經開啓了該服務,但是你想要切換至運行級別5,而5的級別恰巧不需要啓動該服務怎麼辦?當然應該停掉了!所以,在rc腳本中for循環 裏使用了判斷如果在/var/lock/subsys/下面有該服務時,循環執行continue,跳過啓動語句執行下一次循環,知道循環結束,/var /lock/subsys/目錄中只要啓動一個服務在這個鎖文件目錄中就會產生一個文件。這樣通過執行/etc/init/init#.d/ 下面的所有服務腳本,就可以啓動所有系統的腳本了。

  如果自己想定義一個腳本想要像是系統服務那樣啓動怎樣做?

  在 /etc/init/init.d/下面有大量的服務腳本,可以參考,要想系統定義的腳本那樣包括#!/bin/bash 這一行的shell定義,chkconfig定義,以及描述相關的description:將寫好的腳本放在該目錄下面使用chkconfig --{add|del} 腳本名字添加或者刪除腳本。

附:服務腳本頭部示例:

[root@cnode6_8 init.d]# head -n 12 nfs
#!/bin/sh
#
# nfs           This shell script takes care of starting and stopping
#               the NFS services.
#
# chkconfig: - 30 60
# description: NFS is a popular protocol for file sharing across networks.
#              This service provides NFS server functionality, which is \
#              configured via the /etc/exports file.
# probe: true
# config: /etc/sysconfig/nfs

當然在也/etc/rc.local 或者/etc/rc.d/rc.local兩個文件中定義自己的腳本執行路徑,只不過在該文件中定義的文件執行優先級爲最低的,要等到所有的系統服務腳本執行完,才能執行

(4)配置ctrl+alt+del鍵的功能,建議關閉此功能防止誤操作重啓服務器。

該配置在centos5中就直接在/etc/inittab中,到了6之後可以通過/etc/inittab文件的註釋看到該配置已經轉移到了/etc/init/control-alt-delete.conf當中將該行註釋掉即可

(5)配置不斷電系統pf,pr兩種機制

這兩種機制是爲了保護系統,在系統突然斷電時,保證系統能正常關機,但是有可能是因爲電源不穩定而突然斷電,然後再很短的時間內電源再次有了電,此時就應該取消關機,默認是在2min之後關機,但是在2min之內有電後會取消關機

(6)啓動mingetty 6個終端

在6個終端中因爲有前面定義respawn關鍵字,所以這6個終端變成了打不死的小強,當你用kill將它們其中一個殺死後,系統會換一個進程號重新啓動它

(7) 如果選擇5級別,則會啓動 /etc/X11/prefdm -nodaemon啓動圖形化界面

  

至此係統已經能正常進入啓動狀態啦!




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