linux啓動過程中都發生了什麼?

當你按下主機電源幾分鐘後看到Linux的登陸界面出現,這中間你知道發生了什麼事嗎?

通電->BIOS->MBR->GRUB->Kernel->/sbin/init->Runlevel

下圖顯示了典型Linux系統啓動的6個主要階段:

1. BIOS

  • BIOS: Basic Input/Output System
  • 執行系統完整性檢查
  • 從軟盤,光盤,硬盤中查找boot loader(取決與你的啓動順序)
  • BIOS的主要功能就是搜索並加載執行MBR boot loader程序

2. MBR

  • MBR: Master Boot Record.
  • MBR位於主盤的第一快扇區,如:/dev/hda或者/dev/sda.MBR共512bytes. 1-446bytes存放主要的boot loader信息,447~510bytes存放分區表信息,最後2個bytes存放mbr驗證信息。
  • MBR包含GRUB信息。(或者LILO信息)
  • MBR 的主要功能就是加載並執行GRUB boot loader.

3. GRUB

  • GRUB:Grand Unified Bootloader.
  • 如果你有多個kernel images安裝在你的系統中,你可以通過GRUB選擇那個被執行。
  • GRUB啓動的時候會有個選擇界面,幾秒鐘沒有任何輸入的話,將會加載你GRUB配置文件中指定的默認 kernel image 。
  • GRUB的配置文件:/boot/grub/grub.conf (/etc/grub.conf is a link to this).
  • 下面是CentOS的GRUB的配置文件 grub.conf .你可以看到裏面包含kernel and initrd image。
  • #boot=/dev/sda
    default=0
    timeout=5
    splashimage=(hd0,0)/boot/grub/splash.xpm.gz
    hiddenmenu
    title CentOS (2.6.18-194.el5PAE)
              root (hd0,0)
              kernel /boot/vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/
              initrd /boot/initrd-2.6.18-194.el5PAE.img
  •  
  • GRUB 的主要功能就是加載並執行Kernel and initrd images.

4. Kernel

  • 掛載 grub.conf 中指定“root=” 的根目錄
  • 執行/sbin/init 程序
  • 因爲/sbin/init 是LINUX kernel執行的第一程序,理所當然/sbin/init 的PID爲1. ‘ps -ef | grep init’ 命令可以驗證.
  • initrd: Initial RAM Disk.
  • 在kernel完全起來,root文件系統被掛載之前,initrd被kernel當做臨時root文件系統。當然initrd還包含了一些編譯好的驅動,這些驅動用來在啓動的時候訪問硬件。

5. Init

  • 查看/etc/inittab配置文件來決定Linux的運行(run level).
  • LINUX的運行級別: 
  • 0 – halt (關機)
  • 1 – Single user mode (單用戶模式)
  • 2 – Multiuser, without NFS (多用戶模式,無網絡)
  • 3 – Full multiuser mode  (多用戶模式,有網絡,無圖形界面)
  • 4 – unused (沒用,用戶自定義)
  • 5 – X11 (多用戶模式,有網絡,有圖形界面)
  • 6 – reboot (重啓)
  • Init從/etc/inittab配置文件中得到默認啓動級別,然後加載並執行相應級別的程序.
  • 執行 ‘grep initdefault /etc/inittab’ 命令可得到你係統的默認啓動級別。

6. Runlevel programs

  • 當LINUX系統啓動完成後,你會發現許多的服務進程也啓動了,例如:“starting sendmail …. OK”. 這些服務程序都放在相應LINUX系統啓動級別的文件夾下面。
  • 根據你LINUX默認啓動級別,系統將會執行以下其中一個文件架下面的服務程序:
  • Run level 0 – /etc/rc.d/rc0.d/
  • Run level 1 – /etc/rc.d/rc1.d/
  • Run level 2 – /etc/rc.d/rc2.d/
  • Run level 3 – /etc/rc.d/rc3.d/
  • Run level 4 – /etc/rc.d/rc4.d/
  • Run level 5 – /etc/rc.d/rc5.d/
  • Run level 6 – /etc/rc.d/rc6.d/
  • 請注意,在/etc下面的那些文件有些是連接文件。如etc/rc0.d 連接到/etc/rc.d/rc0.d。
  • 在/etc/rc.d/rc*.d/ 文件架下面, 你會發現服務程序名是以S 或 K開頭。.
  • 以S開頭的表示用於服務啓動。S表示startup。
  • 以K開頭的表示用於服務關閉。 K表示kill。
  • 在S或K的後面的數字,表示啓動/關閉程序的順序。例如:S12syslog is to start the syslog deamon, which has the sequence number of 12. S80sendmail is to start the sendmail daemon, which has the sequence number of 80. So, syslog program will be started before sendmail. S12syslog啓動syslog守護進程,12是啓動順序;S80sendmail 啓動sendmail守護進程,80是啓動順序,12在80的前面,所以 syslog 服務程序將在sendmail之前啓動。

這就是LINUX系統在開啓電源到完全啓動所發生的一切。

英文:http://www.thegeekstuff.com/2011/02/linux-boot-process/

轉載自:http://adonmi.com

 

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