Linux基礎之系統啓動流程

操作系統啓動過程

操作系統啓動過程簡單分爲四部分,從BIOS自檢、系統引導、啓動內核、初始化系統。其中每個部分又分爲多個自部分,操作系統的建立是一個相對比較複雜的事情。

Linux內核是從入口點開始執行的,入口點程序又稱爲初始化程序,其任務是爲Linux操作系統的運行做好必要的準備,如將內核鏡像(bzimage)在物理地址展開、獲取計算機組成部分的配置參數、建立各種管理用的數據結構、啓動各類守護進程、建立人機交互環境等。

Linux內核是一個駐留在外存中的程序,在運行前必須先將其讀入物理內存。將Linux內核讀入內存的工作成爲引導,完成引導的程序被稱爲引導程序。引導也是在外存中的程序,所以在運行之前需要將其讀入內存。講引導讀入內存的工作由BIOS(basic input output system)完成。BIOS駐留在非易失存儲器中,不需要引導。

引導程序在linux內核讀入後,將控制權交給內核頭部的實模式初始化程序(main.c),在實模式下完成初始化工作,再將處理器切換到保護模式,而後轉入解壓程序。解壓程序將內核鏡像解壓到物理地址中,然後把處理器的控制權交給內核首部程序。內核首部程序正式完成內核初始化。

每個過程都執行了自己該做的初始化部分的事情,有些過程又可分爲好幾個子過程。

CentOS 6 啓動流程

  第一步、硬件啓動階段

  簡單說一下這一步的流程:打開電源;POST自檢;BIOS逐一排查設備啓動順序;如果是硬盤啓動,讀取硬盤的MBR的BootLoader。(這裏默認MBR分區,暫不考慮GPT分區)

  這裏主要有三個需要了解的地方BIOS啓動順序、MBR和BootLoader。

(1).MBR

  MBR(Main Boot Record),是硬盤的0柱面,0磁道、1扇區(第一個扇區),稱爲主引導扇區,也稱爲主引導記錄。它由三部分組成:主引導程序(BootLoader)、硬盤分區表DPT(Disk Partition table)和硬盤有效標誌(55AA)。

  注:硬盤默認一個扇區大小爲512字節。

  第一部分,主引導程序(BootLoader)佔446個字節,負責從活動分區中裝載,並運行系統引導程序。

  第二部分,硬盤分區表DPT佔64個字節,有4個分區表項,每個分區表項佔16個字節,硬盤中分區有多少以及每一個分區的大小都記錄在其中。

  第三部分,硬盤有效標誌,佔2個字節,固定爲55AA。如果這個標誌位0xAA55,就認爲這個是MBR。

(2).BootLoader

  不同的系統有不同的主引導程序(BootLoader)。Windows使用的是NTLDR(NT Loader,Windows NT系列操作系統)、Bootmgr(Boot Manager,Windows Vista,7,8,10),Linux一般使用的是grub(也叫grub legacy)和grub2。

  CentOS6一般使用的是grub。GRUB(GRand Unified Bootloader)是一個來自GNU項目的多操作系統啓動程序。

第二步、GRUB引導階段

  簡單說一下這一步的流程:GRUB程序加載執行並引導kernel(內核)程序,其中有三個階段。

  grub引導階段的文件都在/boot/grub/目錄下

(1).Stage1階段

  這一階段其實執行的就是系統安裝時預先寫入到MBR的Bootloader程序。它的任務僅是讀取(加載)硬盤的0柱面,0磁道,2扇區的內容(/boot/grub/stage1)並執行。

  這一階段,使硬件初始化,爲Stage2準備RAM空間(內存空間),讀取Stage2到RAM空間(應該涉及到了Stage1.5階段)。就是Stage1.5階段或Stage2階段的入口,引導進入Stage1.5階段或Stage2階段。

  另外,這一階段並沒有識別文件系統的能力。  

(2).Stage1.5階段

  這一階段是Stage1階段和Stage2階段的橋樑,具有識別分區文件系統的能力,此後grub程序便有能力去訪問/boot/grub/stage2,並將其讀取到內存執行。

(3).Stage2階段

  這一階段會(初始化本階段需要用到的硬件,檢測系統的內存映像,)解析grub的配置文件/boot/grub/grub.conf,根據配置文件加載內核鏡像到內存中,通過initrd程序建立虛擬根文件系統,最後調用(轉交)內核

第三步、內核引導階段

  簡單說一下這一步的流程:通過內存中的虛擬根文件系統,加載驅動,然後切換到真正的根文件系統,並執行/sbin/init程序。

第四步、init初始化階段(又叫系統初始化階段)

  簡單說一下這一步的流程:/sbin/init程序會讀取/etc/inittab文件確認運行級別,然後執行/etc/rc.d/rc腳本,根據確認的運行級別啓動對應/etc/rc.d/rc#.d/目錄下的服務(#爲0~6),與此同時執行系統初始化腳本/etc/rc.sysinit(軟鏈接,指向/etc/rc.d/rc.sysinit),還會加載/etc/rc.local(軟鏈接,指向/etc/rc.d/rc.local文件)用戶自定義服務(腳本)。

  /etc/rc.d/目錄下的文件幾乎在上一次都有相應的軟鏈接(也就是/etc/目錄下),唯一沒有的/etc/rc.d/init.d/目錄又似乎與/etc/init.d/目錄完全相同

(1)./etc/inittab文件

  這裏的數字 3 代表啓動級別是 3 

  啓動級別:

    0  關機 

    1  單用戶模式、維護模式、急救模式

    2  沒有網絡的多用戶模式

    3  完整的多用戶模式

    4  預留級別,暫時沒用,不用考慮

    5  圖形界面,XWindows

    6  重啓

(2)./etc/rc.d/rc#.d/目錄

  在啓動時執行的/etc/rc.d/rc腳本,會調用/etc/rc.d/rc#.d/目錄下的文件

  K開頭的文件:要停止的服務(腳本),從01開始關閉,數字越小優先級越高

  S開頭的文件:要啓動的服務(腳本),從01開始啓動,數字越小優先級越高

 第五步、啓動終端

  最後一步就是用戶登錄。

Centos 7 啓動流程

第一步、硬件啓動階段

  這一步和CentOS6差不多。

第二步、GRUB2引導階段

  從這一步開始,CentOS6和CentOS7的啓動流程區別開始展現出來了。CentOS7的主引導程序使用的是grub2。

  簡單說一下這一步的流程:顯示加載兩個鏡像,再加載MOD模塊文件,把grub2程序加載執行,接着解析配置文件/boot/grub/grub.cfg,根據配置文件加載內核鏡像到內存,之後構建虛擬根文件系統,最後轉到內核。

  在這裏grub.cfg配置文件已經比較複雜了,但並不用擔心,到了CentOS7中一般是使用命令進行配置,而不直接去修改配置文件了。

  一般修改好配置後都需要使用命令grub2-mkconfig -o /boot/grub2/grub.cfg,將配置文件重新生成。這裏就涉及到/etc/default/grub文件以及/etc/grub.d/目錄。

第三步、內核引導階段

  這一步與CentOS6也差不多,加載驅動,切換到真正的根文件系統,唯一不同的是執行的初始化程序變成了/usr/lib/systemd/systemd

第四步、systemed初始化階段(又叫系統初始化階段)

  CentOS7中我們的初始化進程變爲了systemd。執行默認target配置文件/etc/systemd/system/default.target(這是一個軟鏈接,與默認運行級別有關)。然後執行sysinit.target來初始化系統和basic.target來準備操作系統。接着啓動multi-user.target下的本機與服務器服務,並檢查/etc/rc.d/rc.local文件是否有用戶自定義腳本需要啓動。最後執行multi-user下的getty.target及登錄服務,檢查default.target是否有其他的服務需要啓動。

  注意:/etc/systemd/system/default.target指向了/lib/systemd/system/目錄下的graphical.target或multiuser.target。而graphical.target依賴multiuser.target,multiuser.target依賴basic.target,basic.target依賴sysinit.target,所以倒過來執行。

  System概述(瞭解):systemd即爲system daemon,是Linux下的一種init軟件,開發目標是提供更優秀的框架以表示系統服務間的以來關係,並依此實現系統初始化時服務的並行啓動,同時達到降低Shell系統開銷的效果,最終代替現在常用的System V與BSD風格的init程序。

  與多數發行版使用的System V風格的init相比,systemd採用了以下的新技術:A.採用Socket激活式與總線激活式服務,以提高相互依賴的各服務的並行運行性能;B.用Cgroup代替PID來追蹤進程,即使是兩次fork之後生成的守護進程也不會脫離systemd的控制。

  unit對象:unit表示不同類型的systemd對象,通過配置文件進行標識和配置;文件中主要包含了系統服務、監聽socket、保存的系統快照以及其他與init相關的信息。(也就是CentOS6中的服務器啓動腳本)

(1)./etc/systemd/system/default.target

  這是一個軟鏈接,和默認運行級別相關

  我們可以到這個目錄下看看

  這裏可以看到runlevel開頭的target文件,對應着CentOS6的啓動級別,不過一樣是軟鏈接,指向了同目錄下的其他文件,也算一種向下兼容吧

 (2)./usr/lib/systemd/system/

  這個目錄存儲每個服務的腳本,類似CentOS6的/etc/init.d/。

(2)./run/systemd/system/

  系統執行過程中產生的腳本。

(3)./etc/systemd/system/

  類似於CentOS6的/etc/rc.d/rc#.d/SXX類文件的功能,管理員建立的執行腳本,大部分是軟鏈接。

 

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