系列文章: 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
該問題的解決方案是使用一些特殊代碼,容許用戶選擇引導哪一個操做系統。此類程序包括:服務器
很明顯,若是可以將系統控制權交給某個包含 512 字節以上代碼的程序來完成其任務,那麼支持從邏輯分區引導或從位於引導驅動器以外的分區引導應該不太難。上述解決方案都支持這些可能性,這是由於它們都能 從任意分區加載引導記錄,或者是由於它們都對啓動引導過程須要加載哪一個或哪些文件有所理解。網絡
鏈式加載jsp
當一個引導管理器得到控制權時,它能作的一件事就是加載另外一個引導管理器。這種現象稱爲鏈式加載 (chain loading), 一般發生在位於主引導記錄 (MBR) 中的引導管理器加載一個分區引導記錄中的啓動加載程序的時候。當一個 Linux 啓動加載程序被請求引導一個 Windows 或 DOS 分區時,或者當一個系統的 Linux 啓動加載程序被請求加載另外一個系統的啓動加載程序時,幾乎老是須要進行鏈式加載。例如,您可能須要使用一個分區中的 LILO 鏈式加載另外一個分區中的 GRUB,以便訪問該分區中的 GRUB 菜單。ide
接下來咱們要關注的是 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 的引導過程:
您的系統應該可以安裝兩個流行啓動加載程序的其中一個:LILO (LInux LOader) 或 GRUB (GRand Unified Boot loader)。您應該可以使用所選的啓動加載程序按前面描述的方式執行引導。若是您想回顧啓動加載程序安裝或基本引導過程,請參閱配套文章 「學習 Linux,101:引導程序」。
能夠採用如下方法影響您的系統引導過程:
GRUB 配置文件默認爲 /boot/grub/grub.conf 或 /boot/grub/menu.lst。若是兩者同時存在,那麼一個一般是另外一個的符號連接。清單 5 展現了上面用於 LILO 的系統的一個示例。注意,爲了便於閱讀,咱們已將三個內核定義語句分割爲多個行。
# 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 秒的超時。
若是您按任意鍵中斷默認啓動,將會看到一個相似於 圖 6 的選項菜單。
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 壓縮圖像。
$ 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 |
與 LILO 不一樣,GRUB 的表現形式是一個小 shell。它包含幾個命令,容許執行相似操做:在命令執行以前編輯命令、查找並加載配置文件、或者使用 cat
命令顯示文件。在菜單中的條目上按 e 鍵將編輯條目,按 c 鍵切換到 GRUB 命令行,按 b 鍵引導系統,按 p 鍵輸入密碼,按 Esc 鍵返回菜單或上一步。還有一個 grub
命令,用於建立一個模擬 shell,能夠在其中測試 GRUB 配置或您的 GRUB 命令技能。普通用戶模式提供一些基本組件,但許多命令都須要根權限。清單 7 展現如何做爲根用戶啓動 grub shell。這個 grub 命令一般位於 /sbin 或 /usr/sbin 中。
# 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
命令幫助。
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 所示。
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 進行測試會受到限制。
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 的內容。
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 鍵啓動引導進程。
Slackware 13 Windows Fedora 14 boot: Slackware13 S |
使用 GRUB,您能夠鍵入另外一組內核命令和 initrd
語句;或者,最好使用前面介紹的編輯功能編輯一個現有條目。例如,添加參數 S 啓動到單用戶模式。
內核加載完成後,一般會啓動 /sbin/init
。這個程序在系統關閉以前將一直運行。它老是被分配進程 ID 1,如 清單 13 所示。
[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
命令顯示內核環緩衝區,會在標準輸出上顯示這些消息。固然,您能夠將這個輸出重定向到一個文件以便未來分析,或者將其轉發給一個內核開發人員進行調試。清單 14 展現了一些您可能會看到的輸出。
[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 內存密匙相關的事件。
[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 |
您的系統啓動到運行 /sbin/init
的時點後,如您所見,內核仍然在內核環緩衝區中記錄事件,但進程使用 syslog 守護進程來記錄消息,日誌文件一般位於 /var/log/messages 中。與內核環緩衝區不一樣,每一個 syslog 行都有一個時間戳,日誌文件在系統可以重啓之間持久化。若是引導進程中的 init 腳本階段出現錯誤,那麼您應該首先檢查這個文件。
大多數守護進程的名稱都以字母 'd' 結尾。清單 16 展現如何在重啓後查看最後幾條守護進程狀態消息。
[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 系統的介紹就到此結束了。