歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux操作系統學習筆記(44)

Linux操作系統學習筆記(44)

日期:2017/2/25 10:34:36   编辑:Linux教程

系統啟動和引導過程

當打開 Linux 計算機時會發生什麼?

在幾乎每種 Linux 配置中,引導過程都可以分為 9 個步驟:

  1. 硬件和固件:BIOS 或固件系統讀取硬盤或者其他引導設備(例如,光盤、軟盤、網絡引導等等)上的主引導記錄。
  2. 引導裝載程序運行。x86 系統上的 Linux 系統通常使用 LILO 或者 GRUB。某些老式系統可能使用 loadlin 通過一個中間 DOS 分區進行引導。在 Power PC® 系統上,這可能是 BootX 或者 yaboot。一般來說,引導裝載程序 是一種簡單的程序,它知道到哪裡尋找 Linux 內核,可能在幾個版本之間進行選擇,甚至可以選擇同一計算機上的其他操作系統。
  3. 內核裝載。
  4. 安裝根文件系統。在某些情況下,裝載一個臨時 ramdisk 映像,然後再安裝真正的根文件系統,這樣可以啟用真實根文件系統所需的特殊驅動程序或模塊。

安裝好根文件系統之後,就可以開始初始化了。

  1. 啟動進程 init 是所有其他 Linux 進程的父進程。
  2. 讀取 /etc/inittab 的內容,對余下的引導步驟進行配置。特別重要的是,/etc/inittab 中的命令行控制將系統引導到哪個運行級別,從而決定初始化期間還要執行哪些步驟。

實際上,此後的所有引導過程完全由文件 /etc/inittab 的內容控制。具體來說,腳本和工具一般按照某些約定運行,但是理論上完全可以通過修改 /etc/inittab 來運行不同的腳本。

/etc/inittab 中的一個特定設置特別關鍵。這一行像下面這樣:

id:5:initdefault:

這一行一般出現在接近文件頂部的地方,它設置運行級別。運行級別控制 /etc/inittab 腳本其余部分中采取的操作。

在處理 /etc/inittab 腳本時發生了什麼?具體來說,在這個過程中涉及哪些文件和目錄?

  1. 與運行級別無關的系統初始化。一般情況下,無論運行級別如何,都要執行某些初始化操作。這些步驟在 /etc/inittab 中用下面這樣的設置表示:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

在某些 Linux 系統上(大多數基於 Debian 的系統),還會看到:

si::sysinit:/etc/init.d/rcS

如果是後一種情況,/etc/init.d/rcS 是一個腳本,它只運行每個匹配 /etc/rcS.d/[Ss]??* 的腳本。另一方面,如果系統使用 /etc/rc.d/rc.sysinit,那麼這個文件包含一個長腳本,用於執行所有 初始化過程。

  1. 特定於運行級別的系統初始化。實際上,可以把任意數量的操作與運行級別聯系起來,而且一個操作可以與一個或多個運行級別相關聯。/etc/inittab 包含的代碼像下面這樣:

l0:0:wait:/etc/rc.d/rc 0
# ...
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

腳本 /etc/rc.d/rc 將運行所有匹配 /etc/rc$1.d/[KkSs]??* 模式的文件。例如,在以運行級別 5 啟動的示例系統上,會依次運行以下文件:

/etc/rc5.d/K15postgresql
/etc/rc5.d/S01switchprofile
/etc/rc5.d/S05harddrake
...
/etc/rc5.d/S55sshd
...
/etc/rc5.d/S99linuxconf
/etc/rc5.d/S99local

以 “K”或“k” 開頭的文件是殺死腳本,它們結束進程或者清除進程的操作。以“S”或“s”開頭的文件是啟動腳本,它們一般啟動新進程或者使系統准備在此運行級別上運行。這些文件大多數是 shell 腳本,而且大多數是鏈接(常常鏈接到 /etc/init.d/ 中的文件)。

在大多數情況下,當 Linux 系統在一個運行級別上運行之後,您希望作為用戶登錄進系統。為此,運行一個稱為 getty 的程序來處理登錄過程。發行版創建者們使用基本 getty 的許多變體,比如 agetty、mgetty 和 mingetty。這些程序基本上都做同樣的工作。

  1. 在提示符下登錄。/etc/inittab 常常在一個或多個虛擬終端中啟動 getty 程序,並且為幾個不同運行級別這樣做。這是用下面這樣的代碼配置的:

# 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

第一個數字是運行 getty 的虛擬終端,後面的一組數字是采用此操作的幾個運行級別(例如,在運行級別 2、3、4 和 5 上都啟動 mingetty)。

接下來的步驟可能涉及啟動更多服務、登錄進一種圖形化環境、恢復 UI 設置或者其他更個性化的細節,這超出了本教程的討論范圍。

Copyright © Linux教程網 All Rights Reserved