學習 Linux,101: 引導系統

系列文章: http://www.ibm.com/developerworks/cn/views/linux/libraryview.jsp?search_by=%E5%AD%A6%E4%B9%A0+linux+101

從 BIOS 到運行 Linux 系統html

引導順序linux

在咱們深刻了解啓動加載程序(好比 LILO 和 GRUB)以前,先來重溫一下 PC 是如何啓動或引導 的。名爲 BIOS(表示 Basic Input Output Service)的代碼存 儲在 ROM、EEPROM 或閃存等非易變 (non-volatile) 內存中。當啓動或重啓 PC 時,會執行該代碼,並執行開機自檢 (Power-On Self Test, POST) 來檢查機器。它還會肯定可用移動存儲設備或固定存儲設備中的引導驅動器,而後從該驅動器上的 Master Boot Record (MBR) 加載第一扇區。引導驅動器能夠是傳統硬盤驅動器、固態驅動器、USB 記憶棒 (stick) 或驅動器、或者帶有可移動媒介(好比磁盤、CD 或 DVD)的驅動器。本文主要關注硬盤驅動器,但其餘類型的存儲設備的引導進程均與硬盤驅動器類似。算法

正如文章 「學習 Linux,101:硬盤佈局」 所描述的,由於 MBR 還包含分區表,因此 MBR 中的可執行代碼小於 512 字節,這個代碼量不算大。注意,每一個磁盤(即便是軟盤、CD、DVD 或者 USB 記憶棒之類的固態設備) 的 MBR 中均包含一個可執行代碼,即便這個代碼只能用於顯示一條消息,好比 "Non-bootable disk in drive A:(驅動器 A 中沒有可引導磁盤:)"。這個由 BIOS 從第一扇區加載的代碼稱爲第一階段啓動加載程序階段 1 啓動加載程序shell

MS DOS、PC DOS 和 Windows® 操做系統所使用的標準硬盤驅動器 MBR 會檢查分區表,以查找主分區上標記爲 active 的引導驅動器,加載該分區的第一扇區,而後將控制權交給已加載的代碼。這個新代碼也稱爲分區引導記錄。分區引導記錄其實是階段 1 的另外一個啓動加載程序,但它只能從分區加載一組塊。該新組塊中的代碼稱爲階段 2 啓動加載程序。MS-DOS 和 PC-DOS 使用的階段 2 加載程序直接繼續加載操做系統其他部分。以上就是操做系統啓動並運行的引導進程。安全

這個引導進程對於單操做系統很適用。可是,若是您想要使用多個操做系統,好比 OS/二、Windows XP 和 3 個不一樣的 Linux 發行版,那麼會出現什麼樣的狀況呢?您能夠 使用一個程序(好比 DOS FDISK 程序)來更改活動分區並從新啓動,但這種方法比較笨拙。此外,一個磁盤只能擁有 4 個主分區,而標準 MBR 只能擁有一個主分區;系統不能從邏輯分區引導。但咱們假設的示例提到了 5 種操做系統,每一個系統都須要一個分區。bash

該問題的解決方案是使用一些特殊代碼,容許用戶選擇引導哪一個操做系統。此類程序包括:服務器

Loadlin
一個 DOS 可執行程序,能夠在一個正在運行的 DOS 系統中調用以引導一個 Linux 分區。若是多引導系統的設置過程很複雜、風險很大時,這個代碼就頗有用。
OS/2 Boot Manager
這個程序安裝在一個專用小分區上,分區被標記爲 active,標準 MBR 引導進程啓動 OS/2 Boot Manager,以後會顯示一個菜單用於選擇要引導的操做系統。
智能啓動加載程序
該程序能夠駐留在操做系統的分區上,並能夠經過一個活動分區的分區引導記錄調用,也能夠經過主引導記錄調用。此類程序包括:
  • BootMagic(Norton PartitionMagic 的一個組件)
  • LILO (LInux LOader)
  • GRUB (GRand Unified Boot loader)(如今稱爲 GRUB Legacy)
  • GRUB2(一個新型啓動加載程序,常常出如今一些常見的發行版中)

很明顯,若是可以將系統控制權交給某個包含 512 字節以上代碼的程序來完成其任務,那麼支持從邏輯分區引導或從位於引導驅動器以外的分區引導應該不太難。上述解決方案都支持這些可能性,這是由於它們都能 從任意分區加載引導記錄,或者是由於它們都對啓動引導過程須要加載哪一個或哪些文件有所理解。網絡

鏈式加載jsp

當一個引導管理器得到控制權時,它能作的一件事就是加載另外一個引導管理器。這種現象稱爲鏈式加載 (chain loading), 一般發生在位於主引導記錄 (MBR) 中的引導管理器加載一個分區引導記錄中的啓動加載程序的時候。當一個 Linux 啓動加載程序被請求引導一個 Windows 或 DOS 分區時,或者當一個系統的 Linux 啓動加載程序被請求加載另外一個系統的啓動加載程序時,幾乎老是須要進行鏈式加載。例如,您可能須要使用一個分區中的 LILO 鏈式加載另外一個分區中的 GRUB,以便訪問該分區中的 GRUB 菜單。ide

Linux 啓動加載程序

接下來咱們要關注的是 LILO 和 GRUB,由於它們是大多數 Linux 發行版包含的啓動加載程序。LILO 的歷史長一些,而 GRUB 比較新。原始 GRUB 如今已成爲 GRUB Legacy,GRUB2 正處於開發中,它是由 Free Software Foundation 贊助(請參見 參考資料 瞭解相關的詳細信息)。咱們將簡要討論 GRUB2,闡述 GRUB 和 GRUB2 之間的主要區別,以及兩者如何可以共存。對於本文餘下部分,咱們假設 GRUB 是指 GRUB Legacy,除非上下文明確表示爲 GRUB2。LILO 也有一個新版本,稱爲 ELILO(其設計意圖是用於引導使用 Intel 而非使用 BIOS 的 Extensible Firmware Interface (EFI)。請參見 參考資料 瞭解關於 GRUB2 和 ELILO 的其餘相關信息。

您的發行版的安裝過程可能支持選擇設置哪一個啓動加載程序。GRUB 和 LILO 都支持大多數小於 2TB 的現代磁盤,但有些發行版(最著名的是 Fedora)再也不包含 LILO。別忘了,磁盤技術已經飛速發展,所以您應該老是確保所選的啓動加載程序、Linux 發行版(或其餘操做系統)以及您的系統 BIOS 適用於您的新磁盤。不然,就有可能致使數據丟失。一樣,向現有系統添加新發行版時,可能須要確保您的 MBR 中擁有最新的 LILO 或 GRUB。若是您打算從 LVM 或 RAID 磁盤引導,也須要擁有比較新的 GRUB 或 LILO 版本。

LILO 和 GRUB 中使用的階段 2 加載程序容許從幾個操做系統或版本中選擇其中之一。可是,LILO 和 GRUB 差異很大:只要升級內核或對系統進行其餘更改,就須要使用一條命令從新建立 LILO 引導設置;而 GRUB 支持經過一個可編輯配置文本文件來完成這個任務。GRUB2 也須要從一個一般存儲在 /etc 中的配置文件進行一個重構。

下面小結 PCs 的引導過程:

  1. 當 PC 啓動時,BIOS (Basic Input Output Service) 會執行一個自檢。
  2. 當機器經過自檢時,BIOS 會加載 Master Boot Record(或 MBR,一般位於引導驅動器的第一個 512 字節扇區)。引動驅動器一般是系統上的第一個硬盤驅動器,但也能夠是一個磁盤、CD 或 USB 密匙。
  3. 對於硬盤驅動器,MBR 加載一個階段 1 啓動加載程序,該程序一般是 Linux 系統上的 LILO 或 GRUB 階段 1 啓動加載程序。這是另外一個 512 字節單扇區記錄。
  4. 階段 1 啓動加載程序一般加載一個記錄序列,該序列一般稱爲階段 2 啓動加載程序(有時稱爲階段 1.5 加載程序)。
  5. 階段 2 加載程序加載操做系統。對於 Linux,這是內核,也多是初始 RAM 磁盤 (initrd)。

您的系統應該可以安裝兩個流行啓動加載程序的其中一個:LILO (LInux LOader) 或 GRUB (GRand Unified Boot loader)。您應該可以使用所選的啓動加載程序按前面描述的方式執行引導。若是您想回顧啓動加載程序安裝或基本引導過程,請參閱配套文章 「學習 Linux,101:引導程序」。

能夠採用如下方法影響您的系統引導過程:

  1. 更改引導設備。您可能一般從硬盤驅動器引導,但有時可能須要從軟盤、USB 內存密匙、CD 或 DVD,或者網絡引導。要設置這類引導設備,您須要適當配置 BIOS;在引導過程當中可能還須要一個特殊鍵擊,以便顯示一些選項。個人一個系統上的選項如 圖 1 所示。設置引導設備和選擇在啓動時引導設備的方法特定於您的系統及其 BIOS。這也超出了這個 LPI 目標的要求,您能夠參考您的系統文檔。

    圖 1. 選擇引導設備
    Startup Device Menu 屏幕截圖,顯示多個引導設備選項,突出顯示 USB key - Sony Storage Media 選項

  2. 能夠與啓動加載程序交互,選擇引導哪一個配置。本文稍後將介紹如何針對 LILO 和 GRUB 完成這個任務。
  3. 您可使用 GRUB 或 LILO 來將參數傳遞到內核,控制內核被啓動加載程序加載後啓動系統的方式。

GRUB

GRUB 配置文件默認爲 /boot/grub/grub.conf 或 /boot/grub/menu.lst。若是兩者同時存在,那麼一個一般是另外一個的符號連接。清單 5 展現了上面用於 LILO 的系統的一個示例。注意,爲了便於閱讀,咱們已將三個內核定義語句分割爲多個行。


清單 5. GRUB 配置示例
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You do not have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /, eg.
#          root (hd1,12)
#          kernel /boot/vmlinuz-version ro root=/dev/sdb13
#          initrd /boot/initrd-[generic-]version.img
#boot=/dev/sdb13
default=0
timeout=5
splashimage=(hd1,12)/boot/grub/splash.xpm.gz
hiddenmenu
title Fedora (2.6.35.14-95.fc14.x86_64)
        root (hd1,12)
        kernel /boot/vmlinuz-2.6.35.14-95.fc14.x86_64 ro 
            root=UUID=5e22a2e0-5ac2-47d5-b98a-d5b25eff585a 
            rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM 
            LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 
            KEYTABLE=us rhgb quiet
        initrd /boot/initramfs-2.6.35.14-95.fc14.x86_64.img
title Fedora (2.6.35.13-92.fc14.x86_64)
        root (hd1,12)
        kernel /boot/vmlinuz-2.6.35.13-92.fc14.x86_64 ro 
            root=UUID=5e22a2e0-5ac2-47d5-b98a-d5b25eff585a 
            rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM 
            LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 
            KEYTABLE=us rhgb quiet
        initrd /boot/initramfs-2.6.35.13-92.fc14.x86_64.img
title Fedora (2.6.35.13-91.fc14.x86_64)
        root (hd1,12)
        kernel /boot/vmlinuz-2.6.35.13-91.fc14.x86_64 ro 
            root=UUID=5e22a2e0-5ac2-47d5-b98a-d5b25eff585a 
            rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM 
            LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 
            KEYTABLE=us rhgb quiet
        initrd /boot/initramfs-2.6.35.13-91.fc14.x86_64.img
title GRUB
        rootnoverify (hd0,1)
        chainloader +1
title Slackware 13
        rootnoverify (hd0,9)
        chainloader +1
title Windows
        rootnoverify (hd0,0)
        chainloader +1

GRUB 提供一個菜單界面。它還使用一個經過 MD5 算法加密的密碼,而不是 LILO 的純文本密碼。並且,也許最重要的是,對 GRUB 配置文件進行的更改不須要在 MBR 中安裝 GRUB。注意,許多發行版均能在更新到一個新的內核級別時自動更新 GRUB(或 LILO)配置文件,可是,若是您安裝一個新內核或建立一個新的初始 RAM 磁盤,那麼可能須要編輯配置文件。

要爲分區配置一個啓動條目,GRUB 不須要裝載該分區。您將看到 root (hd0,9)splashimage=(hd1,12)/boot/grub/splash.xpm.gz 這樣的條目。GRUB 將您的硬盤引用爲 hdn,其中 n 是一個整數,從 0 開始。相似地,磁盤上的分區從 0 開始編號。注意:GRUB2 已經更改了磁盤命名方式,所以在 GRUB 和 GRUB2 之間切換時要當心。

所以,在這個系統上,(hd0,0) 表明 Windows 主分區 /dev/sda1,而 (hd0,9) 表明 Slackware 邏輯分區 /dev/sda10。軟盤驅動器一般是 (fd0)。若是使用這些參數從一個 bash shell 調用 GRUB,例如,在軟盤、USB 密匙或您的 MBR 上安裝 GRUB 時,別忘了使用引號將參數引發來。

新版 GRUB 容許使用一個標籤 或一個 UUID 來指定 root 元素。要詳細瞭解標籤和 UUIDs,請參閱配套文章 學習 Linux,101:控制文件系統的安裝和卸載 中的 「標籤、UUID 和連接」 小節。

使用 GRUB 引導系統時,常常會看到一個默認選項,如 圖 5 所示。若是您不作任何操做,會在配置超時後啓動這個選項。這裏的超時值單位爲秒,所以清單 5 中的 timeout=5 表示一個 5 秒的超時。


圖 5. 引導 GRUB 到一個默認選項
使用 GRUB 進行引導的屏幕截圖,展現在配置超時後啓動的默認選項

若是您按任意鍵中斷默認啓動,將會看到一個相似於 圖 6 的選項菜單。


圖 6. GRUB 菜單選項
展現引導一個選中的操做系統的 GRUB 菜單選項的屏幕截圖

GRUB 菜單顯示時,可使用光標移動鍵在列表中上下移動,選擇一個引導映像。

自定義背景

若是您想對 GRUB 使用不一樣的啓動圖像,那麼您只能使用 14 色 X Window pixmap (.xpm) 文件,並且文件必須被 gzip 壓縮。您鍾愛的 JPEG 圖像將會減小到 14 色時看起來可能有些不一樣,所以您須要試驗試驗,看看效果。可使用諸如 GIMP 的圖形程序將圖像減小到 14 色,這時應該使用 Image->Mode->Indexed... 菜單動做並將 Maximum number of colors 字段設置爲 14。也可使用命令行工具,好比 ImageMagick。清單 6 顯示將一個 800x531 原始圖像減少到須要的 640x480 像素的一種方法:首先將其縮小到 640 像素高,而後裁剪部分圖像,減少畫布以匹配圖像。而後,咱們將顏色數量減小到 14,將圖像格式從 .jpg 轉換爲 .xpm。最後咱們 gzip 壓縮圖像。


清單 6. 構建一個自定義 GRUB 啓動圖像
$ identify woodenbong.jpg
woodenbong.jpg JPEG 800x531 800x531+0+0 8-bit DirectClass 210KB 0.000u 0:00.000
$ convert -resize "800x640" woodenbong.jpg woodenbong2.jpg
$ convert -crop "640x480+40+0" +repage  woodenbong2.jpg  grub-in.jpg
$ convert -colors 14 grub-in.jpg grub-menu.xpm
$ gzip grub-menu.xpm

GRUB shell

與 LILO 不一樣,GRUB 的表現形式是一個小 shell。它包含幾個命令,容許執行相似操做:在命令執行以前編輯命令、查找並加載配置文件、或者使用 cat 命令顯示文件。在菜單中的條目上按 e 鍵將編輯條目,按 c 鍵切換到 GRUB 命令行,按 b 鍵引導系統,按 p 鍵輸入密碼,按 Esc 鍵返回菜單或上一步。還有一個 grub 命令,用於建立一個模擬 shell,能夠在其中測試 GRUB 配置或您的 GRUB 命令技能。普通用戶模式提供一些基本組件,但許多命令都須要根權限。清單 7 展現如何做爲根用戶啓動 grub shell。這個 grub 命令一般位於 /sbin 或 /usr/sbin 中。


清單 7. 啓動 GRUB shell
# grub     GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename. ]

grub>

在 GRUB shell 中,help 命令提供一列表的命令。help commandname 提供 commandname 命令幫助。清單 8 顯示了可用命令和 rootnoverify 命令幫助。


清單 8. 使用 GRUB shell
grub> help blocklist FILE                         boot
cat FILE                               chainloader [--force] FILE
color NORMAL [HIGHLIGHT]               configfile FILE
device DRIVE DEVICE                    displayapm
displaymem                             find FILENAME
geometry DRIVE [CYLINDER HEAD SECTOR [ halt [--no-apm]
help [--all] [PATTERN ...]             hide PARTITION
initrd FILE [ARG ...]                  kernel [--no-mem-option] [--type=TYPE]
makeactive                             map TO_DRIVE FROM_DRIVE
md5crypt                               module FILE [ARG ...]
modulenounzip FILE [ARG ...]           pager [FLAG]
partnew PART TYPE START LEN            parttype PART TYPE
quit                                   reboot
root [DEVICE [HDBIAS]]                 rootnoverify [DEVICE [HDBIAS]]
serial [--unit=UNIT] [--port=PORT] [-- setkey [TO_KEY FROM_KEY]
setup [--prefix=DIR] [--stage2=STAGE2_ terminal [--dumb] [--no-echo] [--no-ed
terminfo [--name=NAME --cursor-address testvbe MODE
unhide PARTITION                       uppermem KBYTES
vbeprobe [MODE]

grub> help rootnoverify rootnoverify: rootnoverify [DEVICE [HDBIAS]]
    Similar to `root', but don't attempt to mount the partition. This
    is useful for when an OS is outside of the area of the disk that
    GRUB can read, but setting the correct root device is still
    desired. Note that the items mentioned in `root' which derived
    from attempting the mount will NOT work correctly.

grub>

做爲一個實踐示例,您能夠繼續前面的示例,使用 GRUB 的 find 命令查找配置文件。下面,您能夠從 (hd1,12)(即 /dev/sdb13) 加載配置文件,如 清單 9 所示。


清單 9. 使用 GRUB 查找並加載 GRUB 配置文件
grub> find /boot/grub/menu.lst  (hd0,1)
 (hd0,5)
 (hd1,6)
 (hd1,8)
 (hd1,9)
 (hd1,10)
 (hd1,11)
 (hd1,12)

grub> configfile (hd1,12)/boot/grub/menu.lst Press `ESC' to enter the menu... 24

加載配置文件時,可能會看到一個相似於 清單 10 的菜單。記住,這已在 GRUB shell 下完成了,該 shell 模擬真實的 GRUB 環境,不顯示啓動圖像。可是,這很是相似於真正使用 GRUB 啓動系統時啓動圖像上疊加的圖像。

注意:若是您的菜單看起來不是這樣,並且您的方向鍵回顯爲 ^[[A 這樣的符號,那麼您的 grub 命令版本可能不包含正確的菜單顯示所需的 curses 支持。聽說,這個問題影響了一些最新 Fedora 發佈。在這種狀況下,使用 grub shell 進行測試會受到限制。


清單 10. GRUB 菜單
GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 +-------------------------------------------------------------------------+
 | Fedora (2.6.35.14-95.fc14.x86_64)                                       |
 | Fedora (2.6.35.13-92.fc14.x86_64)                                       |
 | Fedora (2.6.35.13-91.fc14.x86_64)                                       |
 | GRUB                                                                    |
 | Slackware 13                                                            |
 | Windows                                                                 |
 |                                                                         |
 |                                                                         |
 +-------------------------------------------------------------------------+
      Use the ^ and v keys to select which entry is highlighted.
      Press enter to boot the selected OS, 'e' to edit the
      commands before booting, or 'c' for a command-line.

假設您突出顯示了第三個條目 Fedora (2.6.35.13-91.fc14.x86_64),而後按 e 編輯該條目。您將看到相似於 清單 11 的內容。


清單 11. 編輯一個 GRUB 配置條目
GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 +-------------------------------------------------------------------------+
 | root (hd1,13)                                                           |
 | kernel /boot/vmlinuz-2.6.35.13-91.fc14.x86_64 ro root=UUID=5e22a2e0-5>  |
 | initrd /boot/initramfs-2.6.35.13-91.fc14.x86_64.img                     |
 |                                                                         |
 |                                                                         |
 +-------------------------------------------------------------------------+
      Use the ^ and v keys to select which entry is highlighted.
      Press 'b' to boot, 'e' to edit the selected command in the
      boot sequence, 'c' for a command-line, 'o' to open a new line
      after ('O' for before) the selected line, 'd' to remove the
      selected line, or escape to go back to the main menu.

一樣,可使用方向鍵選擇要編輯的行,而後按 e 鍵編輯它。在本例中,咱們假設您在 /dev/sdb14 上安裝了 Fedora,而後刪除一個較低的分區,好比 /dev/sdb8。這將把 Fedoro 分區下放到 GRUB 標記中的 /dev/sdb13(或 hd1,12)。使用光標鍵移過 '(hd1,13)' 中的 '3',而後返回去刪除 '3',插入 '2' 代替。完成後,按 Enter 鍵接受更改,或者按 Esc 鍵取消更改。最後,若是您的確在引導系統,而不是運行 GRUB shell,按 b 鍵引導系統。

啓動到一個 GRUB shell 時,它有足夠的能力顯示您的文件系統上的文件,它好像做爲根用戶運行,所以您確實須要使用 GRUB 密碼保護您的系統。可是,請記住,若是用戶可以從可移動介質啓動,就能提供他或她本身的 GRUB 配置。請參閱 GRUB 手冊的安全性部分(參見 參考資料),瞭解關於 GRUB 安全性和其餘方面的更多信息。您也能夠經過使用 info grub 命令在您的系統上查看它。

回頁首

內核參數

內核參數(有時稱爲啓動參數)爲內核提供其可能沒法獨自肯定的硬件參數信息,其目的是覆蓋內核以其餘方式可能檢測到的值,或者避免檢測到不適當的值。例 如,您可能想啓動到單用戶模式來修復系統,以單核模式啓動一個 SMP 系統,或者指定一個替代根文件系統。有些內核級別可能須要一個參數來啓用 RAM 大於必定量的系統上的大內存支持。

有時須要向引導進程添加參數。例如,您可能想以 \single-user 模式啓動系統,這時,您須要添加 S 參數。或者,您可能須要指定一個此前工做的內核,以便可以查明您新構建的自定義內核沒法工做的緣由。按 Tab 鍵查看要引導的映像列表和原始簡略 LILO 文本提示 boot:。此時,您能夠鍵入映像名稱,或者按 Enter 選擇第一個條目。若是須要添加參數,能夠在映像名稱後面鍵入參數。清單 12 和 圖 7 顯示執行下面的操做將看到的畫面:按 Tab 鍵,鍵入 Slackware13 選擇 Slackware 13 映像,添加參數 S 以單用戶模式啓動,而後按 Enter 鍵啓動引導進程。


清單 12. 使用 LILO 指定啓動參數
Slackware 13     Windows        Fedora 14
boot: Slackware13 S


圖 7. 將 Slackware 引導到單用戶模式
屏幕截圖展現以單用戶模式啓動的 Slackware 引導進程

使用 GRUB,您能夠鍵入另外一組內核命令和 initrd 語句;或者,最好使用前面介紹的編輯功能編輯一個現有條目。例如,添加參數 S 啓動到單用戶模式。

init 進程

內核加載完成後,一般會啓動 /sbin/init。這個程序在系統關閉以前將一直運行。它老是被分配進程 ID 1,如 清單 13 所示。


清單 13. init 進程
[root@echidna ~]# ps --pid 1   PID TTY          TIME CMD
    1 ?        00:00:00 init

init 程序經過運行一系列腳本引導系統的其他部分。這些腳本一般位於 /etc/rc.d/init.d 或 /etc/init.d 中,它們執行一些服務,好比設置系統的主機名、檢查文件系統錯誤、裝載其餘文件系統、啓用網絡、啓動打印服務,等等。這些腳本執行完後,init 啓動一個名爲 getty 的程序,在控制檯上顯示登陸提示。圖形登陸屏幕經過一個圖形顯示管理器處理,好比 GDM for Gnome。

若是您的系統可以加載內核,但沒法成功運行 init,您能夠經過指定一個替代初始化程序來嘗試修復。例如,指定 init=/bin/sh 將把您的系統引導到一個擁有根權限的 shell 提示,您能夠在那裏修復系統。

要詳細瞭解可用的啓動參數,能夠參閱 bootparam 的手冊頁,也能夠瀏覽 /usr/src/linux/Documentation/ramdisk.txt,這個文件在有些系統上也稱爲 /usr/src/linux-$(uname -r)/Documentation/kernel-parameters.txt。

顯然,若是您每次引導時都必須應用同一組額外參數,那麼應該將它們添加到配置文件中。若是使用 LILO,別忘了從新運行 lilo

回頁首

引導事件

在 Linux 引導進程中,大量消息將被髮送到控制檯,描述正在引導的內核、系統硬件、以及其餘內核相關事項。這些消息一般一閃而過,您可能來不及閱讀它們,除非引導進 程因等待處理而出現延遲,好比沒法訪問某個時間服務器,或者必須檢查一個文件系統。隨着 Linux Bootsplash 項目(參見 參考資料)的出現,這些消息可能會重疊在一個圖形背景上,或者被一個簡單的狀態欄隱藏或替換。若是您的發行版支持隱藏模式,那麼您一般能夠經過按一個鍵(好比 F2)切換爲顯示引導消息。

dmesg

若是可以返回並查看內核消息,那麼應該感受不錯。因爲標準輸出與進程相關,而內核沒有進程標識符,所以系統會將內核(或模塊)輸出消息保存到內核環緩衝區 中。可使用 dmesg 命令顯示內核環緩衝區,會在標準輸出上顯示這些消息。固然,您能夠將這個輸出重定向到一個文件以便未來分析,或者將其轉發給一個內核開發人員進行調試。清單 14 展現了一些您可能會看到的輸出。


清單 14. 部分 dmesg 輸出
[root@echidna ~]# dmesg | head -n 30 [    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 2.6.35.14-95.fc14.x86_64 (mockbuild@x86-07.phx2.fedoraprojec
t.org) (gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC) ) #1 SMP Tue Aug 16 21:01:58 U
TC 2011
[    0.000000] Command line: ro root=UUID=5e22a2e0-5ac2-47d5-b98a-d5b25eff585a rd_NO_LUKS
 rd_NO_LVM rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYTABLE=us rhgb 
quiet
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  BIOS-e820: 0000000000000000 - 000000000009dc00 (usable)
[    0.000000]  BIOS-e820: 000000000009dc00 - 00000000000a0000 (reserved)
[    0.000000]  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
[    0.000000]  BIOS-e820: 0000000000100000 - 00000000bf6b0000 (usable)
[    0.000000]  BIOS-e820: 00000000bf6b0000 - 00000000bf6c8000 (ACPI data)
[    0.000000]  BIOS-e820: 00000000bf6c8000 - 00000000bf6cb000 (ACPI NVS)
[    0.000000]  BIOS-e820: 00000000bf6cb000 - 00000000c0000000 (reserved)
[    0.000000]  BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
[    0.000000]  BIOS-e820: 00000000fec00000 - 00000000fec10000 (reserved)
[    0.000000]  BIOS-e820: 00000000fed1c000 - 00000000fed20000 (reserved)
[    0.000000]  BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)
[    0.000000]  BIOS-e820: 00000000ff000000 - 0000000100000000 (reserved)
[    0.000000]  BIOS-e820: 0000000100000000 - 0000000134000000 (usable)
[    0.000000] NX (Execute Disable) protection: active
[    0.000000] DMI present.
[    0.000000] e820 update range: 0000000000000000 - 0000000000001000 (usable) ==> (reserv
ed)
[    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000 (usable)
[    0.000000] No AGP bridge found
[    0.000000] last_pfn = 0x134000 max_arch_pfn = 0x400000000
[    0.000000] MTRR default type: uncachable
[    0.000000] MTRR fixed ranges enabled:
[    0.000000]   00000-9FFFF write-back
[    0.000000]   A0000-BFFFF uncachable
[    0.000000]   C0000-C7FFF write-protect
[    0.000000]   C8000-E3FFF uncachable

在系統啓動後,內核環緩衝區也能夠用於一些事件,其中包括某些程序失敗和熱插拔事件。清單 15 展現了幾個與插入一個 USB 內存密匙相關的事件。


清單 15. 內核環緩衝區中的後續事件
[root@echidna ~]# dmesg | tail -n 19 [70259.964953] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[70259.964957] usb 1-4: Product: Storage Media
[70259.964960] usb 1-4: Manufacturer: Sony
[70259.964963] usb 1-4: SerialNumber: 0205093006441
[70260.228187] Initializing USB Mass Storage driver...
[70260.229608] scsi4 : usb-storage 1-4:1.0
[70260.229749] usbcore: registered new interface driver usb-storage
[70260.229752] USB Mass Storage support registered.
[70261.232195] scsi 4:0:0:0: Direct-Access     Sony     Storage Media    0100 PQ: 0 ANSI:
 0 CCS
[70261.233159] sd 4:0:0:0: Attached scsi generic sg3 type 0
[70261.237931] sd 4:0:0:0: [sdc] 1014784 512-byte logical blocks: (519 MB/495 MiB)
[70261.238809] sd 4:0:0:0: [sdc] Write Protect is off
[70261.238814] sd 4:0:0:0: [sdc] Mode Sense: 43 00 00 00
[70261.238818] sd 4:0:0:0: [sdc] Assuming drive cache: write through
[70261.243554] sd 4:0:0:0: [sdc] Assuming drive cache: write through
[70261.243566]  sdc:
[70261.317555] sd 4:0:0:0: [sdc] Assuming drive cache: write through
[70261.317561] sd 4:0:0:0: [sdc] Attached SCSI removable disk
[70261.616396] SELinux: initialized (dev sdc, type vfat), uses genfs_contexts

/var/log/messages

您的系統啓動到運行 /sbin/init 的時點後,如您所見,內核仍然在內核環緩衝區中記錄事件,但進程使用 syslog 守護進程來記錄消息,日誌文件一般位於 /var/log/messages 中。與內核環緩衝區不一樣,每一個 syslog 行都有一個時間戳,日誌文件在系統可以重啓之間持久化。若是引導進程中的 init 腳本階段出現錯誤,那麼您應該首先檢查這個文件。

大多數守護進程的名稱都以字母 'd' 結尾。清單 16 展現如何在重啓後查看最後幾條守護進程狀態消息。


清單 16. 來自 /var/log/messages 的守護進程消息
[root@echidna ~]# grep "^Sep.*d\:" /var/log/messages|tail -n 14 Sep  7 18:21:08 echidna acpid: waiting for events: event logging is off
Sep  7 18:21:12 echidna abrtd: Registered Analyzer plugin 'Kerneloops'
Sep  7 18:21:12 echidna abrtd: Registered Analyzer plugin 'Python'
Sep  7 18:21:12 echidna abrtd: Registered Reporter plugin 'Logger'
Sep  7 18:21:13 echidna abrtd: Registered Analyzer plugin 'CCpp'
Sep  7 18:21:13 echidna abrtd: Registered Action plugin 'KerneloopsScanner'
Sep  7 18:21:13 echidna abrtd: Registered Reporter plugin 'Bugzilla'
Sep  7 18:21:13 echidna abrtd: Registered Reporter plugin 'KerneloopsReporter'
Sep  7 18:21:13 echidna abrtd: Checking for unsaved crashes (dirs to check:5)
Sep  7 18:21:13 echidna abrtd: Registered Database plugin 'SQLite3'
Sep  7 18:21:13 echidna abrtd: Done checking for unsaved crashes
Sep  7 18:21:13 echidna abrtd: Init complete, entering main loop
Sep  7 18:21:26 echidna auditd[2032]: Started dispatcher: /sbin/audispd pid: 2034
Sep  7 18:21:26 echidna audispd: audispd initialized with q_depth=120 and 1 active plugins

您還能在 /var/log 中找到更多其餘系統程序的日誌。例如,您能看到您的 X Window 系統的啓動日誌。

咱們對經過引導進程引導 Linux 系統的介紹就到此結束了。

相關文章
相關標籤/搜索