Linux啓動流程

 Linux系統的整個啓動過程是這樣的:

 1.加載 BIOS 的硬件信息,並獲取第一個啓動設備的編號;

  2.讀取第一個設備的MBR的引導加載程序 ( lilo, grub, spfdisk)開機信息; 

  3.加載核心操作系統的核心信息,核心開始解壓縮,並且嘗試驅動所有硬件設備; 

  4.核心執行init程序並取得run-level 信息; 

  5.init 執行/etc/rc.d/rc.sysinit文件; 

  6.啓動核心的外掛式模塊 (/etc/modules.conf) 

  7.init執行運行的各個批處理文件; 

  8.init 執行/etc/rc.d/rc.local文件; 

  9.執行 /bin/login 程序; 

  10.登入之後開始以Shell控制主機。

  下面對啓動流程進行詳細的說明:

一、引導加載程序與核心載入

   整個主機在啓動的時候,第一個讀取的信息就是BIOS,在BIOS裏記錄了主板的芯片集與相關的設置,如CPU與接口設備的通信頻率、啓動設備的搜索順序、系統時間等信息。機器在讀取BIOS,並且瞭解主要的主機硬件信息後,主機便會開始嘗試由存儲媒體加載操作系統。BIOS會記錄可用來啓動的設備搜索順序,系統開始在第一臺啓動設備上執行啓動程序。這裏針對硬盤而言,啓動流程讀到硬盤的過程中,第一個要讀取的就是該硬盤的主引導記錄(MBR),系統可以由主要啓動區按照的引導加載程序(boot loader)開始執行核心識別的工作。

   通過引導加載程序的管理而開始讀取核心文件(Linux系統的核心文件一般在/boot/vmlinuz),並將核心文件加載到主存儲器中,同時系統有可能通過initrd建立起虛擬盤,以協助啓動過程,最後,將讀自BIOS的主機硬件數據交由Linux核心進行檢測,並且加載適當的驅動程序。

二、第一個程序init及設置文件/etc/inittabrunlevel

    整個Linux系統中,第一個執行的程序就是/sbin/initInit程序所做的工作相當多,它除了利用設置文件“/etc/inittab”來獲取運行等級外,還會通過運行等級的設置值啓動不同的服務項目。關於各個運行等級的說明可以通過/etc/inittab文件中的說明來了解。

  下面對/etc/inittab文件以及其中所涉及到的文件進行說明:

  先對/etc/inittab文件的語法進行說明,

  [設置項目][run level][init的操作行爲][命令項目]

  a.設置項目:

     最多4個字符,表示init的主要工作項目,只是一個簡單的表示說明

   b.運行等級:

     該項目在那些運行等級下執行。

   c.init的操作項目

     主要項目的意義如下:

      initdefault:表示默認的運行等級設置值

      sysinit:表示系統初始化的操作項目

      ctrlaltdel:表示[ctrl]+[alt]+[del]三個按鍵是否可以重新啓動的設置

      wait:表示後面接的命令項目必須要執行完畢,才能繼續隨後的操作

      respawn:表示後面接的init仍會主動重啓

   d.命令項目

     應該可以執行的命令,通常是一些腳本

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

   /etc/inittab中有這一句“si::sysinit:/etc/rc.d/rc.sysinit”,這表示:開始加載各項系統服務之前,先做好整個系統環境,主要使用/etc/rc.d/rc.sysinit這個shell腳本來設置系統環境。這個文件的主要工作:

   1. 獲取網絡環境與主機類型

   2. 測試與載入內存設備/procUSB設備/sys

   3. 決定是否啓動SELinux

   4. 接口設備的檢測與即插即用(PnP)參數的測試

   5. 用戶自定義模塊的加載

   6. 加載核心的相關設置

   7. 設置系統時間

   8. 設置終端控制檯的字形

   9. 設置RAIDLVM等硬盤功能

   10.fsck檢查磁盤文件系統

   11.進行磁盤配額quota的轉換

   12.重新以可讀取模式載入系統磁盤

   13.啓動quota功能

   14.啓動系統隨機數設備

   15.清除啓動過程中的臨時文件

   16.將啓動相關信息加載到/var/log/dmesg文件中

四、啓動系統服務與相關啓動設置文件(/etc/rc.d/rc.n/etc/sysconfig)

   經過上面的步驟系統應該已經順利工作了,只是我們還要啓動系統所需要的各項服務,這樣主機才能提供相關的網絡或主機功能。這個時候,根據我們在/etc/inittab裏提到的運行等級設置值,就可以決定啓動的服務項目了。各個不同的運行等級服務啓動的各個shell腳本放置位置如下所示:

   l0:0:wait:/etc/rc.d/rc 0

   l1:1:wait:/etc/rc.d/rc 1

   l2:2:wait:/etc/rc.d/rc 2

   l3:3:wait:/etc/rc.d/rc 3

   l4:4:wait:/etc/rc.d/rc 4

   l5:5:wait:/etc/rc.d/rc 5

   l6:6:wait:/etc/rc.d/rc 6

    舉例來說,運行等級3的啓動目錄放在/etc/rc.d/rc3.d目錄中。我們來看一下,

    [root@redflag ~]# ll /etc/rc.d/rc3.d/

    總用量 448

    lrwxrwxrwx  1 root root 21 2008-01-09  K01tog-pegasus -> ../init.d/tog-pegasus

    lrwxrwxrwx  1 root root 24 2008-01-04  K02NetworkManager -> ../init.d/NetworkManager

    ……

    lrwxrwxrwx  1 root root 15 2008-01-04  K15httpd -> ../init.d/httpd

    lrwxrwxrwx  1 root root 20 2008-01-10  K15postgresql -> ../init.d/postgresql

    lrwxrwxrwx  1 root root 15 2008-01-09  K16rarpd -> ../init.d/rarpd

    lrwxrwxrwx  1 root root 20 2008-01-09  K20bootparamd -> ../init.d/bootparamd

    lrwxrwxrwx  1 root root 24 2008-01-09  K20netdump-server -> ../init.d/netdump-server

wxrwxrwx  1 root root 13 2008-01-04  S90xfs -> ../init.d/xfs

    ……

    lrwxrwxrwx  1 root root 11 2008-01-04  S99local -> ../rc.local

     這個目錄下的文件全部都是以SK爲開頭的文件,而且全部是連接文件,連接到/etc/rc.d/init.d裏的shell腳本。(/etc/rc.d/init.d目錄其實與/etc/init.d是一樣的)以K爲開頭的文件爲啓動時需要啓動,start”的服務;以K開頭的文件爲關機時需要關閉的服務。注意這裏在SK後面接的數字,表示該文件的執行順序。

     如果要在運行等級3的環境下執行某個服務,就要將該服務寫入/etc/rc.d/rc3.d裏,但需要注意該服務必須在/etc/rc.d/init.d裏建好了,使用連接的方法連接到/etc/rc.d/rc3.d目錄中。要將/etc/rc.d/init.d連接到/etc/rc.d/rc3.d的方法,除了手動建立外,其實都是以chkconfig程序來管理的。這裏補充說明一下chkconfig的用法,

    [root@redflag ~]# chkconfig --list 

    [root@redflag ~]# chkconfig [--add|--del] [service_name]

    [root@redflag ~]# chkconfig --level [0123456] [service_name] [on|off]

    範例一:

    [root@redflag ~]#  chkconfig --level 35 atd on

    範例二:自定義一個服務,運行等級35啓動,以80S開始以70K結束

    [root@redflg ~]#  vi /etc/init.d/myserver

     #!/bin/bash

     # chkconfig : 35 80 70

     echo “Nothing”

     說明一下第二行,它的語法是:

     chkconfig[runlevels] [start number] [stop number]

     其中runlevels爲不同的運行等級狀態,start numberstop number則是在/etc/rc.d/rc[35].d內建立的設置文件,文件名爲S80myserverK70myserver

     [root@redflag ~]# chkconfig -- add myserver

     [root@redflag ~]# chkconfig --list myserver 

      myserver     0:off   1:off   2:off   3:on    4:off   5:on    6:off

     [root@redflag init.d]# find /etc/rc.d/ -type l | grep 'myserver' | sort

      /etc/rc.d/rc0.d/K70myserver

      /etc/rc.d/rc1.d/K70myserver

      /etc/rc.d/rc2.d/K70myserver

      /etc/rc.d/rc3.d/S80myserver

      /etc/rc.d/rc4.d/K70myserver

      /etc/rc.d/rc5.d/S80myserver

      /etc/rc.d/rc6.d/K70myserver

     [root@redflag init.d]# chkconfig --del myserver

     [root@redflag init.d]# rm /etc/init.d/myserver

      rm: remove regular file `/etc/init.d/myserver'? y

五、用戶自定義引導啓動程序(/etc/rc.d/rc.local)

  任何想要在啓動時就執行的工作,直接寫入/etc/rc.d/rc.local,那麼該工作就會在啓動的時候自動加載,而不必等我們登錄系統去啓動

六、根據/etc/inittab設置加載終端或X-window界面

   在完成了系統所有服務的啓動後,接下來Linux就會啓動終端或X-window來等待用戶登錄。在/etc/inittab內有這麼一段。

   # Run gettys in standard runlevels

   1:2345:respawn:/sbin/mingetty tty1

   2:2345:respawn:/sbin/mingetty tty2

   3:2345:respawn:/sbin/mingetty tty3

   4:2345:respawn:/sbin/mingetty tty4

   5:2345:respawn:/sbin/mingetty tty5

   6:2345:respawn:/sbin/mingetty tty6

   # Run xdm in runlevel 5

   x:5:respawn:/etc/X11/prefdm –nodaemon

  這表示在運行等級345時,都會執行/sbin/mingetty,而且執行6(即爲什麼Linux會提供6個純文本終端)。注意respawninit表示表示後面接的init仍會主動重啓,這說明我們登錄tty1終端界面,以exit離開後,系統還是會重新顯示等待用戶輸入畫面的界面。在運行等級5時,系統還會運行x:5:respawn:/etc/X11/prefdm -nodaemon

七、其他啓動相關事項

  1.關於模塊:/etc/modprobe.conf

   雖然核心提供的默認模塊已經足夠使用,但某些條件下,我們還是要對模塊進行一些參數的設計,此時,就要使用/etc/modprobe.conf。我的主機內容如下:

      [root@redflag init.d]# cat /etc/modprobe.conf

   alias eth0 bnx2

   alias eth1 bnx2

   alias scsi_hostadapter mptbase

   alias scsi_hostadapter1 mptscsi

   alias usb-controller ehci-hcd

   意思是說:“eth0表示使用bnx2這個核心模塊,scsi_hostadapter使用mptbase這個核心模塊。如果你對系統提供的驅動程序模塊不滿意,纔會主動修改這個模塊加載的相關文件。

   這裏補充說明一下,有時在使用多網卡的時候會出現網卡設備號變動的情況,這個時候可以採用在ifcfg-ethn中通過只要通過網卡的MAC地址,在激活網卡的時候一同綁定來解決。也可以通過在modprobe.conf文件中的設置來解決。

   這裏我們可以找到eth0eth1I/OIRQ(linux系統中可以通過 lspci -vv來查看這些信息)

      如:eth0: I/O(0x300) IRQ=5

       eth1: I/O(0x320) IRQ=7

   [root@redflag ~]# vi /etc/modprobe.conf

    alias eth0 bnx2

    alias eth1 bnx2

    options eth0 is=0x300 irq=5

    options eth0 is=0x320 irq=7

   如此一來網卡就有了區分

  2./etc/sysconfig/*

   整個啓動過程中,讀取的服務相關設置文件都記錄在/etc/sysconfig目錄下。

 

 

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