linux系統GRUB啟動流程


linux系統GRUB啟動流程


 

內核的設計風格:

內核的設計風格:

  • 單內核:把所有的功能都做到內核,例子:Linux (LWP) 
    linux雖然是單內核的,但它逐漸往微內核里面靠,采用了模塊化的設計,核心ko和共享模塊so,核心能夠動態加載各種的外圍的內核模塊,例如內核探測到一個磁盤,這個磁盤當前沒有驅動,內核探測到磁盤的特性,加載相對應得模塊,加載進來。而啟動加載進來的是只是核心本身。內核模塊放在/lib/modules/”內核版本號命名的目錄”/,內核命名:vmlinuz-版本
  • 微內核:內核很小,只有核心功能,其他功能做成子系統,當需要用到那個子系統由內核調度進來,例子:Windows, Solaris (線程)
 

虛擬文件系統:

根所在的分區叫做根文件系統rootfs,如果內核沒有磁盤的驅動,那么就訪問不了根文件系統了,所有的訪問都是要通過根目錄才可以訪問,這樣就訪問不了/lib/modules,訪問不了這個目錄,就拿不到驅動,那么就有一個先后問題,要想訪問磁盤,要先有驅動,而要想有驅動,就必須要能訪問磁盤?

解決的辦法:找一個中間人,一個文件,這個文件是動態生成的,在安裝程序在安裝完成以后,它會知道內核要訪問的根在內核中有沒有這個模塊,也會知道這個磁盤到底需要哪一個驅動,然后動態生成這個中間人的文件,這么文件是一個獨立文件系統,是一個根文件系統,這個是一個虛根,跟真正的根沒有關系,只是臨時過渡的根文件系統,可以裝載到內存中,在內存中展開,將內存當磁盤來用,這個叫做ramdisk或者ramfs當內核能夠訪問真正的根了,掛載真正根文件系統了,讓根文件系統建立起來,這個虛根就不要了,這個過程就是根切換,這個虛根的文件名initrd(ramdisk ),initramfs(ramfs)。所有這個並不一定需要的,只有當內核無法掛載根文件系統的時候才用得上

 

啟動流程:

POST-->BIOS(BootSequence)-->MBR(bootloader,446)-->Kernel-->initrd(initramfs)-->(ROOTFS)/sbin/init(/etc/inittab)
  • 加載BIOS的硬件信息與進行自我測試,並依據設置取得第一個可啟動的設備
  • 讀取並執行第一個啟動設備內的MBR的bootLoader,例如grup
  • 依據bootLoader的設置加載Kernel,kernel檢測硬件與加載驅動程序
  • 在硬件驅動成功后,Kernel會主動調用init進程,而init進程會取得run-level信息
  • init執行/etc/rc.d/rc.sysinit文件來准備軟件執行的操作環境
  • init執行run-level的各個服務的啟動
  • init執行/etc/rc.d/rc.local文件
  • init執行終端機模擬程序mingetty來啟動login進程,等待用戶登錄

內核從某個磁盤分區上識別的,在內核還沒有啟動之前是沒有文件系統的,所以由MBR中的BootLoader來識別內核所在的分區

 

bootloader

  • LILO: LInux LOader
  • GRUB: GRand Unified Bootloader,這個有三個階段:

    • Stage1:裝在MBR,主要是為引導第二階段,不是引導操作系統的
    • Stage1_5: 識別常見不同類型的文件系統,這樣才能在第二階段找到/boot/grub/
    • Stage2: 真正啟動操作系統,位於/boot/grub/

      • grup的配置文件grup.conf 

        default=0 # 設定默認啟動的title的編號,從0開始 
        timeout=5 # 等待用戶選擇的超時時長,單位是秒 
        splashimage=(hd0,0)/grub/splash.xpm.gz # grub的背景圖片 
        hiddenmenu # 隱藏菜單 
        password 明文密碼 #這里使用密碼的話,在剛開機的時候如果需要進入編輯,需要輸入密碼 
        password --md5 密文密碼 # 用grup-md5-crypt生成密文的密碼 
        title Red Hat Enterprise Linux Server(2.6.18-308.el5)#內核標題,或操作系統名稱,字符串,可自由修改 
          root (hd0,0) #內核文件所在的設備;對grub而言,所有類型硬盤一律hd,格式為(hd#,N);hd#, #表示第幾個磁盤;最后的N表示對應磁盤的分區; 
          kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/vol0/root rhgb quiet # 內核文件路徑,及傳遞給內核的參數 
          initrd /initrd-2.6.18-308.el5.img # ramdisk文件路徑 
          password --md5 密文密碼 #如果這里有密碼,那么啟動內核的時候需要輸入密碼才可以 
        title Install Red Hat Enterprise Linux 5 
          root (hd0,0) 
          kernel /vmlinuz-5 ks=xxxx ksdevice=eth0 noipv6 
          initrd /initrd-5 
          password --md5 密文密碼

       

 

Kernel的初始化過程

  • 設備探測
  • 驅動初始化(可能會從initrd(initramfs)文件中裝載驅動模塊)
  • 以只讀掛載根文件系統;
  • 裝載第一個進程init(PID:1)
 

/sbin/init:

 

配置文件/etc/inittab:

/etc/inittab的任務:

  • 1、設定默認運行級別;
  • 2、運行系統初始化腳本;
  • 3、運行指定運行級別對應的目錄下的腳本;
  • 4、設定Ctrl+Alt+Del組合鍵的操作;
  • 5、定義UPS電源在電源故障/恢復時執行的操作;
  • 6、啟動虛擬終端(2345級別);
  • 7、啟動圖形終端(5級別);

運行級別:

0:halt 
1: single user mode, 直接以管理員身份切入, 
2:multi user mode, no NFS 
3: multi user mode, text mode 
4:reserved 
5: multi user mode, graphic mode 
6: reboot 
查看運行級別的相關命令:

  • runlevel
  • who -r

init的處理流程

  • 先取得runlevel
  • 使用/etc/rc.d/rc.sysinit進行系統初始化 
    • etc/rc.d/rc.sysinit完成的任務: 
      • 1、激活udev和selinux;
      • 2、根據/etc/sysctl.conf文件,來設定內核參數;
      • 3、設定時鍾時鍾;
      • 4、裝載鍵盤映射;
      • 5、啟用交換分區;
      • 6、設置主機名;
      • 7、根文件系統檢測,並以讀寫方式重新掛載;
      • 8、激活RAID和LVM設備;
      • 9、啟用磁盤配額;
      • 10、根據/etc/fstab,檢查並掛載其它文件系統;
      • 11、清理過期的鎖和PID文件;
  • 根據runlevel進行相對應的動作,程序
  • 設置好【ctrl】+【alt】+【del】這組的組合鍵功能
  • 設置不斷電系統的pf,pr兩種機制
  • 啟動mingetty的6個終端機
  • 最終以/etc/x11/perfdm -nodaemon啟動圖形界面 
    內容: 
    id:3:initdefault:設置默認運行級別

id:runlevels:action:process 

* id: 標識符 
* unlevels: 在哪個級別運行此行; 
* action: 在什么情況下執行此行; 
  + initdefault: 設定默認運行級別 
  + sysinit: 系統初始化 
  + wait: 等待級別切換至此級別時執行 
  + respawn: 一旦程序終止,會重新啟動 
* process: 要運行程序;

 

啟動系統服務以及相關的啟動配置文件

服務類腳本: 可以使用start|stop|restart|status|reload|configtest這些參數的腳本,主要在/etc/rc.d/init.d,文件名去那邊以Sxx或Kxx開頭

每個文件都有#chkconfig和#description這兩項 
格式: 
/# chkconfig: runlevels SS KK 當chkconfig命令來為此腳本在rc#.d目錄創建鏈接時,runlevels表示默認創建為S*開頭的鏈接,-表示沒有級別默認為S*開頭的鏈接;除此之外的級別默認創建為K*開頭的鏈接; 
S后面的啟動優先級為SS所表示的數字;K后面關閉優先次序為KK所表示的數字; 
/# description: 用於說明此腳本的簡單功能; , 續行

chkconfig命令: 
chkconfig --list: 查看所有獨立守護服務的啟動設定;獨立守護進程! 
chkconfig --list SERVICE_NAME:查看某一個服務 
chkconfig --add SERVICE_NAME:為某一個服務創建S開頭,K開頭的鏈接 
chkconfig --del SERVICE_NAME:刪除某一個服務S開頭,K開頭的鏈接 
chkconfig [--level RUNLEVELS] SERVICE_NAME {on|off}:關閉或開啟某一個級別 
如果省略級別指定,默認為2345級別;

守護進程的類型: 
獨立守護進程:獨立的,不關聯運行級別 
瞬時守護進程:不需要關聯至運行級別,所有的瞬時守護進程都由xinetd獨立守護進程管理,xinetd也叫超級守護進程

 

/etc/rc.d/rc.local

> 系統最后啟動的一個服務,准確說,應該執行的一個腳本

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM