1. 程式人生 > 實用技巧 >淺析Linux啟動流程

淺析Linux啟動流程

Linux系統啟動流程

Linux 系統的啟動,從計算機開機通電自檢開始,一直到登陸系統,需要經歷多個過程。瞭解 Linux 的啟動過程,有助於瞭解 Linux 系統的結構,也對系統的排錯有很大的幫助。

CentOS 6.x 系統啟動過程發生了較大的變化,使用 Upstart 啟動服務取代了原先的 System Vinit(英文)、(中文) 啟動服務。Upstart 啟動服務的效率更高,啟動速度更快。

Linux 系統啟動過程比較複雜,我們先整理一下基本的啟動過程,有一個整體的印象,然後再進一步說明。

目前,CentOS 6.x 的啟動流程經歷以下幾步:

  1. 伺服器加電,載入 BIOS 資訊,BIOS 進行系統檢測。依照 BIOS 設定,找到第一個可以啟動的裝置(一般是硬碟);
  2. 讀取第一個啟動裝置的 MBR (主引導記錄),載入 MBR 中的 Boot Loader(啟動載入程式,最為常見的是 GRUB)。
  3. 依據 Boot Loader 的設定載入核心,核心會再進行一遍系統檢測。系統一般會採用核心檢測硬體的資訊,而不一定採用 Bios 的自檢資訊。核心在檢測硬體的同時,還會通過載入動態模組的形式載入硬體的驅動。
  4. 核心啟動系統的第一個程序,也就是 /sbin/init。
  5. 由 /sbin/init 程序呼叫 /etc/init/rcS.conf 配置檔案,通過這個配置檔案呼叫 /etc/rc.d/rc.sysinit 配置檔案。而 /etc/rc.d/rc.sysinit 配置檔案是用來進行系統初始化的,主要用於配置計算機的初始環境。
  6. 還是通過 /etc/init/rcS.conf 配置檔案呼叫 /etc/inittab 配置檔案。通過 /etc/inittab 配置檔案來確定系統的預設執行級別。
  7. 確定預設執行級別後,呼叫 /etc/init/rc.conf 配置檔案。
  8. 通過 /etc/init/rc.conf 配置檔案呼叫並執行 /etc/rc.d/rc 指令碼,並傳入執行級別引數。
  9. /etc/rc.d/rc 確定傳入的執行級別,然後執行相應的執行級別目錄 /etc/rc[0-6].d/ 中的指令碼。
  10. /etc/rc[0-6].d/ 目錄中的指令碼依據設定好的優先順序依次啟動和關閉。
  11. 最後執行 /etc/rc.d/rc.local 中的程式。
  12. 如果是字元介面啟動,就可以看到登入介面了。如果是圖形介面啟動,就會呼叫相應的 X Window 介面。

總的來說,Linux 系統的啟動,要經歷BIOS自檢 -> 啟動 GRUB -> 載入核心 -> 執行第一個程序 -> 配置系統初始環境。當然,本節僅是簡單地看啟動過程,接下來分別詳解介紹每步啟動過程。下面分別介紹:

Linux BIOS開機自檢

伺服器通電後,會直接進入 BIOS,BIOS 全稱 Basic Input/Output System,中文可譯為基本輸入/輸出系統。

簡單地理解 BIOS,它就是固化在主機板上一個 ROM(只讀儲存器)晶片上的程式,主要儲存計算機的基本輸入/輸出資訊、系統設定資訊、開機自檢程和系統自啟動程式,用來為 計算機提供最底層和最直接的硬體設定與控制。

也就是說,BIOS 是硬體與軟體之間的介面,而且是非常基本的介面,BIOS 提供了一組基本的作業系統使用的指令,系統啟動的成功與否,依賴於 BIOS。

BIOS 的初始化主要完成以下 3 項工作:

  1. 第一次檢查計算機硬體和外圍裝置(第二次自檢由核心完後,後續會講),例如 CPU、記憶體、風扇燈。當 BIOS 一啟動,就會做一個自我檢測的工作,整個自檢過程也被稱為 POST(Power On Self Test)自檢。

  2. 如果自檢沒有問題,BIOS 開始對硬體進行初始化,並規定當前可啟動裝置的先後順序,選擇由那個裝置來開機。

  3. 選擇好開啟裝置後,就會從該裝置的 MBR(主引導目錄)中讀取 Boot Loader(啟動載入程式)並執行。啟動載入程式用於引導作業系統啟動,Linux 系統中預設使用的啟動載入程式是 GRUB。

    當 MBR 被載入到 RAM 之後,BIOS 就會將控制權交給 MBR,進入系統引導的第二階段。

Linux核心(核心模組)的載入過程

GRUB 載入了核心之後,核心首先會再進行二次系統的自檢,而不一定使用 BIOS 檢測的硬體資訊。這時核心終於開始替代 BIOS 接管 Linux 的啟動過程了。

核心完成再次系統自檢之後,開始採用動態的方式載入每個硬體的模組,這個動態模組大家可以想象成硬體的驅動(預設 Linux 硬體的驅動是不需要手工安裝的,如果是重要的功能,則會直接編譯到核心當中;如果是非重要的功能,比如硬體驅動會編譯為模組,則在需要時由核心呼叫。不過,如果沒有被核心硬體,要想驅動,就需要手工安裝個硬體的硬塊了。具體的安裝方法會在後續章節中介紹)。

那麼,Linux 的核心到底放在了哪裡呢?當然是 /boot 的啟動目錄中了,我們來看看這個目錄下的內容吧。

[root@localhost ~]#ls /boot/
config-2.6.32-279.el6.i686
\#核心的配置檔案,核心編譯時選擇的功能與模組
efi
\#可擴充套件韌體介面,為英特爾為全新PC韌體的體系結構、介面和服務提出的建議標準
grub
\#啟動引導程GTUB的資料目錄
initramfe-2.6.32-279.el6.i686.img
\#虛擬檔案系統(CentOS 6.x 中用initramfs替代了initrd,但功能是一樣的)
lost+found
故boot分割槽的備份目錄
symvers-2_6.32-279.el6.i686.gz
\#模組符號資訊
System.map-2.6.32-279.el6.i686
\#核心功能和記憶體地址的對應列表
vmlinuz-2.6.32-279.el6.i686
\#用於啟動的Linux核心。這個檔案是一個壓縮的核心映象

我們已經知道,Linux 會把不重要的功能編譯成核心模組,在需要時再呼叫,從而保證了核心不會過大。在多數 Linux 中,都會把硬體的驅動程式編譯為模組, 這些模組儲存在 /lib/modules 目錄中。常見的 USB、SATA 和 SCSI 等硬碟裝置的驅動,還有一些特殊的檔案系統(如 LVM、RAID 等)的驅動,都是以模組的方式來儲存的。

如果 Linux 安裝在 IDE 硬碟之上,並且採用的是預設的 ext3/4 檔案系統,那麼核心啟動後加載根分割槽和模組的載入都沒有什麼問題,系統會順利啟動。但是,如果 Linux 安裝在 SCSI 硬碟之上,或者採用的是 LVM 檔案系統,那麼核心(核心載入記憶體是啟動載入程式 GRUB 呼叫的,並不存在硬碟驅動不識別的問題)在載入根目錄之前是需要載入 SCSI 硬碟或 LVM 檔案系統的驅動的。

SCSI 硬碟和 LVM 檔案系統的驅動都放在硬碟的 /lib/modules 目錄中,既然核心沒有辦法識別 SCSI 硬碟或 LVM 檔案系統,那怎麼可能讀取 /lib/modules 目錄中的驅動呢?Linux 給出的解決辦法是使用 initramfs 這個虛擬檔案系統來處理這個問題。

initramfe虛擬檔案系統

CentOS 6.x 中使用 initramfs 虛擬檔案系統取代了 CentOS 5.x 中的 initrd RAM Disk。它們的作用類似,可以通過啟動載入程式載入到記憶體中,然後會解壓縮並在記憶體中模擬成一個根目錄,並且這個模擬的檔案系統能夠提供一個可執行程式,通過該程式來載入啟動過程中所需的核心模組,比如 USB、SATA. SCSI 硬碟的驅動和 LVM、RAID 檔案系統的驅動。

也就是說,通過 initramfs 虛擬檔案系統在記憶體中模擬出一個根目錄,然後在這個模擬根目錄中載入 SCSI 等硬體的驅動,就可以載入真正的根目錄了,之後才能呼叫 Linux 的第一個程序 /sbin/init。

Initramfs 虛擬檔案系統主要有以下優點:

  • initramfs 隨著其中資料的増減自動増減容量。
  • 在 initramfs 和頁面快取之間沒有重複資料。
  • initramfs 重複利用了 Linux caching 的程式碼,因此幾乎沒有増加核心尺寸,而 caching 的程式碼已經經過良好測試,所以 initramfs 的程式碼質量也有保證。
  • 不需要額外的檔案系統驅動。

其實大家只需要知道 initramfs 是為了在核心中建立一個模擬根目錄,這個模擬根目錄是為了可以呼叫 USB、SATA、SCSI、LVM、RAID 等硬碟介面或檔案系統的驅動模組,載入了驅動模組後才可以載入真正的系統根目錄。我們可以通過示意圖 1 來表示這個過程。

圖 1 核心啟動流程

那麼既然 initramfs 是一個模擬根目錄,那麼我們是否可以看看這個模擬根目錄中到底是什麼樣子的呢?當然可以,命令如下:

[root@localhost ~]# mkdir /tmp/initramfs
\#建立測試目錄
[root@localhost ~]# cp/boot/
initramfs-2.6.32-279.el6.i686.img/tmp/initramfs/
\#複製initramfs檔案
[root@localhost ~]# cd /tmp/initramfs/
[root@localhost initramfs]# file
initramfs-2.6.32-279.el6.i686.img
initramfe-2.6.32-279.el6.i686.img:gzip compressed
data,from Unix,last modified:
Wed Apr 10 21:49:34 2013, max compression
\#檢視檔案型別,發現這個檔案是一個使用gzip命令打包的壓縮包
[root@localhost initramfs]# mv initramfs-2.6.32-279.el6.i686.imginitramfs-2.6.32-279.el6.i686.img.gz
\#修改檔案的副檔名為.gz
[root@localhost initramfs]# gunzip
initramfs-2.6.32-279.el6.i686.img.gz
\#解壓縮
[root@localhost initramfs]# ls
initramfs-2.6.32-279.el6.i686.img
[root@localhost initramfs]# file
initramfs-2.6.32-279.el6.i686.img
initramfe-2.6.32-279.el6.i686.img: ASCII cpio archive (SVR4withnoCRC)
\#檢視檔案型別,使用cpio命令的壓縮檔案
[root@localhost initramfs]# cpio -ivcdu <initramfs-2.6.32-279.el6.i686.img
\#解壓縮
[root@localhost initramfs]#ll
總用量34512
drwxr-xr-x. 2 root root 4096 4月 2412:10 bin
drwxr-xr-x. 2 root root 4096 4 月 24 12:10 cmdline
drwxr-xr-x. 3 root root 4096 4月 24 12:10 dev
-rw-r--r--. 1 root root 19 4 月 24 12:10 dracut-004-283.el6
drwxr-xr-x. 2 root root 4096 4 月 24 12:10 emergency
drwxr-xr-x. 7 root root 4096 4月 24 12:10 etc
-rwxr-xr-x. 1 root root 8962 4月 24 12:10 init
drwxr-xr-x. 2 root root 4096 4 月 24 12:10 initqueue
drwxr-xr-x. 2 root root 4096 4 月 24 12:10 initqueue-finished
drwxr-xr-x. 2 root root 4096 4 月 24 12:10 initqueue-settled
drwxr-xr-x. 2 root root 4096 4 月 24 12:10
initqueue-timeout
-rw-r--r--. 1 root root 35235328 4 月 24 12:09 initramfs-2.6.32-279.el6.i686.img
drwxr-xr-x. 9 root root 4096 4月 2412:10 lib
…省略部分輸出…
\#這就是initramfs虛擬檔案系統中的內容,和根目錄是不是很像

Linux /sbin/init初始化系統環境

在核心載入完畢,並完成硬體檢測與驅動程式載入後,此時主機硬體已經準備完畢,核心會主動呼叫第一個程序,也就是 /sbin/init,此配置檔案最主要的功能就是準備軟體執行的環境,包括系統的主機名、網路設定、語言、檔案系統格式及其他服務的啟動等。

這裡和 CentOS 5.x 系統相比也有較大變化。在 CentOS 5.x 系統中,主要通過 init 程序的配置檔案 /etc/inittab 來設定系統,並啟動 Linux。但是在 CentOS 6.x 系統中,由於用 Upstart 啟動服務來替換以前的 init,所以在 /etc/inittab 配置檔案中只能定義系統的預設執行級別,而其他的功能是靠 /etc/init/ 目錄中的其他配置檔案實現的。

大家可以把 /etc/init/ 目錄中的配置檔案看成以前 /etc/inittab 這個檔案功能的分拆。

本章開頭提到,由 /sbin/init 程序可通過 /etc/init/rcS.conf 配置檔案,分別找到 /etc/rc.d/rc.sysinit 配置檔案和 /etc/inittab 配置檔案,前者用於初始化系統,配置計算機的初始環境;後者用於確定系統的預設執行級別。

接下來,先介紹 /etc/rc.d/rc.sysinit 配置檔案。如果我們使用 Vim 檢視 /etc/rc.d/rc.sysinit 配置檔案,就會發現這個這個配置檔案主要進行了以下幾項工作:

  • 獲得網路環境和主機型別;
  • 測試裝置:除了掛載記憶體裝置 /proc 之外,還會主動偵測系統上是否具有 usb 裝置,如果有,則會主動載入 usb 的驅動程式,並嘗試掛載 usb 檔案系統;
  • 開機啟動畫面 Plymouth(代替了以往的 RHGB);
  • 判斷是否啟用 SELinux;
  • 顯示開機過程中的歡迎畫面;
  • 初始化硬體;
  • 使用者自定義模組的載入,使用者可以在 /etc/sysconfig/modules/*.modules 加入自訂的模組,則此時會被載入到系統當中;
  • 配置核心的引數,系統會主動去讀取 /etc/sysctl.conf 這個檔案的配置引數,使核心的功能成為我們想要的樣子。
  • 設定主機名。
  • 同步儲存器。
  • 裝置對映器及相關的初始化。
  • 初始化軟體磁碟陣列 (RAID)。
  • 初始化 LVM 的檔案系統功能。
  • 檢驗磁碟檔案系統 (fsck)。
  • 設定磁碟配額 (quota)。
  • 重新以可讀寫模式掛載系統磁碟。
  • 更新 quota (非必要)。
  • 啟動系統虛擬隨機數生成器。
  • 配置機器(非必要)。
  • 清除開機過程中的臨時檔案。
  • 建立 ICE 目錄。
  • 啟動交換分割槽(swap)。
  • 將開機資訊寫入 /var/log/dmesg 檔案中。

在以上過程中,比較值得注意的是自定模組的載入。在 CentOS 中,如果我們想要載入核心模組的話,就可以將整個模組寫入到 /etc/sysconfig/modules/*.modules 中。當然,此過程並不是必須的,通常我們的預設模組已經夠用,除非對硬體太新,不得不自己載入模組,否則無需刻意新增任何模組。

可以看到,/etc/rc.d/rc.sysinit 配置檔案已經將基本的系統配置資料都寫好了,我們可以查詢 /var/log/dmesg 檔案或使用 dmesg 命令檢視系統在啟動時到底發生了什麼。當然,我們也可以通過這個命令來看看 Linux 伺服器的硬體資訊。

Linux /etc/inittab:設定(修改)系統預設執行級別

在 CentOS 6.x 中,/etc/inittab 配置檔案只能用來設定系統的預設執行級別。

那麼,什麼是執行級別呢?其實 Linux 是通過執行級別來確定系統啟動時到底啟動哪些服務的。Linux 預設有 7 個執行級別,具體如表 1 所示。

執行級別 含 義
0 關機
1 單使用者模式,可以想象為 Windows 的安全模式,主要用於系統修復
2 不完全的命令列模式,不含 NFS 服務
3 完全的命令列模式,就是標準字元介面
4 系統保留
5 圖形模式
6 重新啟動

在 Linux 系統中可以使用 runlevel 命令來檢視系統的執行級別,命令如下:

[root@localhost ~]# runlevel
N 3
\#N代表在進入這個級別前,上一個級別是什麼;3代表當前級別

在這個命令的結果中,"N 3"中的N代表在進入這個級別前,上一個級別是什麼;3 代表當前級別。"N" 就是 None 的意思,也就是說,系統是開機直接進入 3 執行級別的,沒有上一個執行級別。那如果從圖形介面切換到字元介面,再檢視執行級別,就應該是這樣的:

[root@localhost ~]# runlevel
5 3
\#代表由5級別進入3級別

那麼,可以手工改變當前的執行級別嗎?當然可以了,只需使用 init 命令(注意這不是 init 程序)即可,命令如下:

[root@localhost ~]# init 5
\#進入圖形介面,當然要已經安裝了圖形介面才可以
[root@localhost ~]# init 0
\#關機
[root@localhost ~]# init 6
\#重新啟動

不過要注意,使用 init 命令關機和重啟並不是太安全,容易造成資料丟失。所以推薦大家使用 shutdown 命令進行關機和重啟。

系統預設執行級別

知道了執行級別的作用,我們回到系統啟動過程中來。/etc/inittab 配置檔案的功能就是確定系統的預設執行級別,也就是系統開機後會進入那個執行級別。此檔案的內容如下:

[root@localhost ~]#vim /etc/inittab
\# inittab is only used by upstart for the default runlevel.
\#
\# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
\#
\# System initialization is started by /etc/init/rcS.conf
\#系統會先呼叫/etc/init/rcS.conf
\# Individual runlevels are started by /etc/init/rc.conf
\#在呼叫/etc/init/rc.conf,在不同的執行級別啟動不同的服務
\# Ctrl-Alt-Delete is handled by/etc/init/control-alt-delete.conf
\#通過這個配置檔案判斷Ctri+Alt+Delete熱啟動鍵是否可用
\# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
\# with configuration in /etc/sysconfig/init.
\#判斷系統可以啟動的本地終端數量及終端的基本設定(如顏色)
\# For information on how to write upstart event handlers, or how
\# upstart works, see init(5), init(8), and initctl(8).
\#
\# Default runlevel. The runlevels used are:
\# 0 - halt (Do NOT set initdefault to this)
\# 1 - Single user mode
\# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
\# 3 - Full multiuser mode
\# 4 - unused
\# 5-X11
\# 6 - reboot (Do NOT set initdefault to this)
\#很眼熟吧,就是剛剛的 0~6執行級別的說明
id:3:initdefault:
\#這就是系統的預設執行級別,也就是系統開機後直接進入哪個執行級別

注意,這裡的預設執行級別只能寫 3 或 5,其他的級別要麼是關機重啟,要麼是保留或單使用者,都不能作為系統預設執行級別。

Linux /etc/rc.d/rc.local配置檔案用法

在 /etc/rc[06].d/ 目錄中的程式啟動之後,系統的啟動就已經完成。不過,我們總有一些程式是需要在系統啟動之後隨著系統一起啟動的。這時我們並不需要自己把需要啟動的服務連結到 /etc/rc3.d/ 目錄中,因為系統給我們準備了 /etc/rc.d/rc.local 配置檔案。

這個配置檔案會在使用者登陸之前讀取,這個檔案中寫入了什麼命令,在每次系統啟動時都會執行一次。也就是說,如果有任何需要在系統啟動時執行的工作,則只需寫入 /etc/rc.d/rc.local 配置檔案即可。這個檔案的內容如下:

[root@localhost ~]# ll /etc/rc.local
Irwxrwxrwx. 1 root root 13 4月10 21:46 /etc/rc.local -> rc.d/rc.local
\#有一個連結檔案,兩個檔案修改哪一個都可以
[root@localhost ~]#vi /etc/rc.d/rc.local
\#!/bin/sh
\#
\#This script will be executed *after* all the other init scripts.
\#You can put your own initialization stuff in here if you don't
\#want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
\#預設會touch這個檔案,每次系統啟動時都會touch這個檔案,這個檔案的修改時間就是系統的啟動時間
/etc/rc.d/init.d/httpd start
\#如果寫入RPM包安裝的apache服務的啟動命令,apache服務就會在開機時自動啟動

Linux 的啟動過程基本上就是這樣的,我們把啟動流程圖補充完整,如圖 1 所示。

圖 2 Linux啟動流程

系統的啟動過程就是這樣的,最終我們就能登入字元介面的 Linux 了。不過,如果需要啟動圖形介面的 Linux,則還需要呼叫 X Window 介面。

在啟動過程中還有一個配置檔案會生效,就是 /etc/init/start-ttys.conf,這個檔案主要定義了 Linux 支援的 1~6 個本地終端(tty[1-6])。如果在本機,則可以使用快捷鍵 Alt+F1~F6 來切換這 6 個本地終端;如果安裝並啟動了圖形介面,則可以使用快捷鍵 Ctrl+Alt+F7 來切換圖形終端。

至此,字元介面的啟動過程就介紹完了。是不是非常複雜?如果你是初學者,則只需瞭解,不需要徹底掌握。但是掌握了 Linux 系統的啟動過程,會更加了解 Linux 的結構。當然,如果你非常自信,則可以嘗試安裝 gentoo Linux 這個版本,因為這個 Linux 版本到目前為止還是純原始碼安裝的,如果能夠安裝成功,就會對 Linux 系統的結構及啟動過程有更深入的理解。

Linux啟動載入程式(GRUB)載入核心的過程

在剛剛的啟動過程中,我們已經知道啟動載入程式(Boot Loader,也就是 GRUB)會在啟動過程中載入核心,之後核心才能取代 BIOS 接管啟動過程。如果沒有啟動引導程,那麼核心是不能被載入的。

本節,我們就來看看啟動載入程式載入核心的過程,當然 initramfs 這個虛擬檔案系統也是要靠啟動載入程式呼叫的。在 CentOS 6.x 中,啟動載入程式預設是 GRUB,GRUB 是現在最為流行的啟動載入程式,我們也用 GRUB 來說明啟動載入程式的作用。

早期的 LILO 載入程式已經不是很常見了,GRUB 相比來講有很多優勢,主要有:

  • 支援更多的檔案系統。
  • GRUB 的主程式可以直接在檔案系統中查詢核心檔案。
  • 在系統啟動時,可以利用 GRUB 的互動介面編輯和修改啟動選項。
  • 可以動態修改 GRUB 的配置檔案,這樣在修改配置檔案之後不需要重新安裝 GRUB,而只需重新啟動就可以生效。

GRUB載入核心的過程

GRUB 的作用有以下幾個:

  • 載入作業系統的核心;
  • 擁有一個可以讓使用者選擇的的選單,來選擇到底啟動哪個系統;
  • 可以呼叫其他的啟動載入程式,來實現多系統引導。

按照啟動流程,BIOS 在自檢完成後,會到第一個啟動裝置的 MBR 中讀取 GRUB。在 MBR 中用來放置啟動載入程式的空間只有 446 Byte,那麼 GRUB 可以放到這裡嗎?答案是空間不夠,GRUB 的功能非常強大,MBRM 空間是不夠使用的。那麼 Linux 的解決辦法是把 GRUB 的程式分成了三個階段來執行。

Stage 1:執行GRUB主程式

第一階段是用來執行 GRUB 主程式的,這個主程式必須放在啟動區中(也就是 MBR 或者引導扇區中)。但是 MBR 太小了,所以只能安裝 GRUB 的最小的主程式,而不能安裝 GRUB 的相關配置檔案。這個主程式主要是用來啟動 Stage 1.5 和 Stage 2 的。

Stage 1.5:識別不同的檔案系統

Stage 2 比較大,只能放在檔案系統中(分割槽),但是 Stage 1 不能識別不同的檔案系統,所以不能直接載入 Stage 2。這時需要先載入 Stage 1.5,由 Stage 1.5 來載入不同檔案系統中的 Stage 2。

還有一個問題,難道 Stage 1.5 不是放在檔案系統中的嗎?如果是,那麼 Stage 1 同樣不能找到 Stage 1.5。其實,Stage 1.5 還真沒有放在檔案系統中,而是在安裝 GRUB 時,直接安裝到緊跟 MBR 之後的 32KB 的空間中,這段硬碟空間是空白無用的,而且是沒有檔案系統的,所以 Stage 1 可以直接讀取 Stage 1.5。讀取了 Stage 1.5 就能識別不同的檔案系統,才能載入 Stage 2。

Stage 2:載入GRUB的配置檔案

Stage 2 階段主要就是載入 GRUB 的配置檔案 /boot/grub/grub.conf,然後根據配置檔案中的定義,載入核心和虛擬檔案系統。接下來核心就可以接管啟動過程,繼續自檢與載入硬體模組了。

Linux /boot/grub/目錄分析

本章第一節就已經講過,BIOS 在進行完成系統檢測之後,就會找到第一個可以啟動的裝置,並讀取該裝置的 MBR(主引導記錄)以及載入 MBR 中的 boot loader(啟動載入程式),這個啟動載入程式可以具有選單功能、直接載入核心檔案以及控制權移交的功能等。

另外我們還知道,系統必須要藉助啟動載入程式,才能載入核心,那麼問題來了,MBR 只是佔據整個裝置的第一個扇區中,其大小也就只有 446 位元組而已,但啟動載入程式功能這麼強大,光程式程式碼即配置資料就肯定不止 446 位元組,是怎麼安裝的嗎?

是這樣的,Linux 系統將啟動載入程式的程式程式碼執行與配置資料載入分為以下 2 個階段:

  1. 第一個階段負責執行啟動引導的主程式,該主程式必須要被安裝在啟動區,或者是 MBR,或者是引導扇區,但我們說過,MBR 的容量實在太小啦,因此,MBR 或引導扇區通常只安裝啟動載入程式的最小主程式,並不安裝相關的配置資料;
  2. 第二個階段是為主程式載入配置檔案,包括相關的環境引數檔案(檔案系統定義以及主要配置檔案 menu.1st);

其中,與 GRUB(啟動載入程式)相關的配置檔案,都放置在 /boot/grub 目錄中。我們來看看這個目錄下到底有哪些檔案。

[root@localhost ~]# cd /boot/grub/
[root@localhost grub]# ll -h
總用量274K
-rw-r--r--. 1 root root 63 4月 10 21:49 device.map
\#GRUB中硬碟的裝置檔名與系統的裝置檔名的對應檔案
-rw-r--r--. 1 root root 14K 4月 10 21:49 e2fs_stage1_5 #ext2/ext3檔案系統的Stage 1.5檔案
-rw-r--r--. 1 root root 13K 4月 10 21:49 fat_stage1_5
\#FAT檔案系統的Stage 1檔案
-rw-r--r--. 1 root root 12K 4月 10 21:49 ffs_stage1_5
\#FFS檔案系統的Stage 1.5檔案
-rw-------.1 root root 737 4月 10 21:49 grub.conf
\#GRUB的配置檔案
-rw-r--r--. 1 root root 12K 4 月 10 21:49 iso9660_stage1_5
\#iso9660檔案系統的Stage 1.5檔案
-rw-r--r--. 1 root root 13K 4月 10 21:49 jfs_stage1_5
\#JFS檔案系統的Stage 1.5檔案
Irwxrwxrwx. 1 root root 11 4月 10 21:49 menu.lst ->./grub.conf
\#GRUB的配置檔案。和grub.conf是軟連結,所以兩個檔案修改哪一個都可以
-rw-r--r--. 1 root root 12K 4 月 10 21:49 minix_stage1_5
\#MINIX檔案系統的Stage 1.5檔案
-rw-r--r--. 1 root root 15K 4 月 10 21:49 reiserfs_stage1_5
\#ReiserFS檔案系統的Stage 1.5檔案
-rw-r--r--. 1 root root 1.4K 11 月 15 2010 splash.xpm.gz
\#系統啟動時,GRUB程式的背景影象
-rw-r--r--. 1 root root 512 4月 10 21:49 stage1
\#安裝到引導扇區中的Stage 1的備份檔案
-rw-r--r--. 1 raot root 124K 4月 10 21:49 stage2 #Stage2的備份檔案
-rw-r--r--. 1 root root 12K 4月 10 21:49 ufs2_stage1_5
\#UFS檔案系統的Stage 1.
-rw-r--r--. 1 root root 12K 4 月 10 21:49 vstafs_stage1_5
\#vstafs檔案系統的Stage 1.5檔案
-rw-r--r--. 1 root root 14K 4月 10 21:49 xfs_stage1_5
\#XFS檔案系統的Stage 1.5檔案

可以看到,這個目錄中主要就是 GRUB 的配置檔案和各種檔案系統的 Stage1.5 檔案。不過 GRUB 的配置檔案有兩個:/boot/grub/grub.conf 和 /boot/grub/menu.lst,這兩個配置檔案是軟連結,所以修改哪一個都可以。

Linux GRUB磁碟分割槽表示法

我們已經知道 Linux 系統分割槽的裝置檔名的命名是有嚴格規範的,類似於 /dev/sda1 代表第一塊 SCSI 硬碟的第一個主分割槽。但是在 GRUB 中分割槽的表示方法卻完全不同,採用了類似 hd(0,0) 的方式來表示分割槽。

其實也很好理解,其中:

  • hd 代表硬碟,不再區分是 SCSI 介面硬碟,還是 IDE 介面硬碟,都用 hd 代表;
  • 第一個 0 代表 Linux 系統查詢到的第一塊硬碟,第二塊硬碟為 2,以此類推;
  • 第二個 0 代表這塊硬碟的第一個分割槽,以此類推;

也就是說,hd(0,0) 代表的是第一塊硬碟的第一個分割槽,和 Linux 系統中 /dev/sda1 的含義類似,只是不再區分是 SCSI 硬碟還是 IDE 硬碟。我們用表 1 來說明一下 Linux 系統對分割槽的描述和 GRUB 中對硬碟的描述。

硬 盤 分 區 Linux中的裝置檔名 GRUB中的裝置檔名
第一塊 SCSI 硬碟 第一個主分割槽 /dev/sdal hd(0,0)
第二個主分割槽 /dev/sda2 hd(0,1)
擴充套件分割槽 /dev/sda3 hd(0,2)
第一個邏輯分割槽 /dev/sda5 hd(0,4)
第二塊 SCSI 硬碟 第一個主分割槽 /dev/sdb1 hd(1,0)
第二個主分割槽 /dev/sdb2 hd(1,1)
擴充套件分割槽 /dev/sdb3 hd(1,2)
第一個邏輯分割槽 /dev/sdb5 hd(1,4)

在這張表中要注意,邏輯分割槽不能佔用主分割槽與擴充套件分割槽的分割槽號,所以第一個邏輯分割槽在 Linux 系統中應該用 /dev/sda5 表示,在 GRUB 中應該用 hd(0,4) 表示,還要注意 GRUB 的表示方式只在 GRUB 的配置檔案中生效,一旦離開了 GRUB 的配置檔案,就要使用 Linux 中的裝置檔名來表示分割槽了。

Linux /boot/grub/grub.conf(GRUB配置檔案)內容詳解

本節,我們就來看看 GRUB 的配置檔案 /boot/gmb/grub.conf 中到底寫了什麼。命令如下:

[rootdlocalhost ~]# vi /boot/grub/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
\#以上為GRUB的整體設定
title CentOS (2.6.32-279.el6.i686)
root (hdO,0)
kernel /vmlinuz-2.6.32-279.el6.i686 ro root=OOID=b9a7ala8-767f-4a87-8a2b-a535edb362c9 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel= auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-279.el6.i686.img

這個檔案的內容可以分成兩部分:前 4 行為 GRUB 的整體設定;title 以下 4 行為要啟動的 CentOS 系統的具體配置。這裡只安裝了一個系統,如果多系統並存,那麼每個系統都會有類似的 title 行存在(不一定都是 4 行)。

我們先看整體設定:

  • default=0:預設啟動第一個系統。也就是說,如果在等待時間結束後,使用者沒有選擇進入哪個系統,那麼系統會預設進入第一個系統。如果有多系統並存,那麼每個系統都會有自己的 title 欄位,如果想要預設進入第二個系統,這裡就可以設為 default=1。
  • timeout=5:等待時間,預設是 5 秒。也就是在進入系統時,如果 5 秒內使用者沒有按下任意鍵,那麼系統會進入 default 欄位定義的系統。當然,也可以手工修改這個等待時間,如果timeout=0,則不會等待直接進入系統;如果 timeout=-1,則會一直等待使用者輸入,而不會自動進入系統。
  • splashimage=(hd0,0)/gnjb/splash.xpm.gz:用來指定 GRUB 啟動時的背景影象的儲存位置。記得 CentOS 6.x 啟動時後臺的藍色影象吧,就是這個檔案的作用。不過這個檔案具體在哪裡呢?我們已經說過,hd(0,0) 代表第一塊硬碟的第一個分割槽,而筆者的系統在安裝時 /boot 分割槽就是第一個分割槽,所以這個背景影象的實際位置就是 /boot/gmb/splash.xpm.gz。
  • hiddenmenu:隱藏選單。啟動時預設只能看到讀秒,而不能看到選單。如果想要看到選單,則需要按任意鍵。如果註釋了這句話,那麼啟動時就能直接看到選單了。

再來介紹 CentOS 系統的具體配置:

  1. title CentOS(2.6.32-279.d6.i686):title 就是標題的意思,也就是說,在 title 後面寫入的是什麼,系統啟動時在 GRUB 的啟動選單中看到的就是什麼。
  2. root(hd0,0):是指啟動程式的儲存分割槽。這裡要注意,這個 root 並不是管理員。在我的系統中,/boot 分割槽是獨立劃分的,而且裝置檔名為 /dev/sda1,所以在 GRUB 中就被描述為 hd(0,0)。
  3. kernel /vmlinuz-2.6.32-279.el6.i686 ro root=UUID=b9a7a1a8-767f-4a87-8a2b-a535edb362c9 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet。其中:
    • /vmlinuz-2.6.32-279.el6.i686:指定了核心檔案的位置,這裡的 / 是指 boot 分割槽。
    • ro:啟動時以只讀方式掛載根檔案系統,這是為了不讓啟動過程影響磁碟內的檔案系統。
    • root=UUID=b9a7a1 a8-767f-4a87-8a2b-a535edb362c9:指定根檔案系統的所在位置。這裡和以前的Linux版本不太一樣了,不再通過分割槽的裝置檔名或卷標號來指定,而是通過分割槽的 UUID 來指定的。

那麼,如何査詢分割槽的 UUID 呢?方法有很多種,最簡單的辦法就查詢 /ec/fstab 檔案。命令如下:

[root@localhost ~]# cat /etc/fetab | grep"/ "
UUID=b9a7a1a8-767f-4a87-8a2b-a535edb362c9 / ext4 defaults 1 1

可以看到"/"分割槽的 UUID 和 kernel 行中的 UUID 是匹配的。注意一下 grep 後的"/",在"/"後是有空格的。

以下禁用都只是在啟動過程中禁用,是為了加速系統啟動的:

  1. rd_NO_LUKS:禁用 LUKS,LUKS 用於給磁碟加密。
  2. rd_NO_MD:禁用軟 RAID。
  3. rd_NO_DM:禁用硬 RAID。
  4. rd_NO_LVM:禁用 LVM。

除了以上這樣,命令輸出資訊中還包含以下內容:

  1. KEYBOARDTYPE=pc KEYTABLE=us:鍵盤型別。
  2. crashkernel=auto:自動為crashkernel預留記憶體。
  3. LANG=zh_CN.UTF-8:語言環境。
  4. rhgb:(redhatgraphics boot)用圖片來代替啟動過程中的文字資訊。啟動完成之後可以使用dmesg命令來檢視這些文字資訊。
  5. quiet:隱藏啟動資訊,只顯示重要資訊。
  6. initrd/initramfs-2.6.32-279.el6.i686.img:指定了initramfs虛擬檔案系統映象檔案的所在位置。

GRUB的配置檔案的內容就是這樣的,主要是 kernel 行較為複雜。不過,在這個 /boot/gmb/grub.conf 配置檔案中,只啟動了一個 Linux 系統。如果在 Linux 伺服器中 既安裝了 Linux 系統,又安裝了 Windows 系統,那麼 GRUB 的配置檔案又是什麼樣子的呢?

Linux多系統並存的GRUB配置檔案內容分析

其實每個系統都是用 title 欄位來表示的,如果在伺服器中又多了一個 Windows 系統,那麼在 GRUB 的配置檔案中只不過就是多了一個 title 欄位而已。不過要注意,我們一般建議先安裝 Windows 系統,後安裝 Linux 系統。

原因是 Windows 系統的啟動載入程式無法把啟動過程轉交到 Linux 系統的 GRUB 中,自然就不能啟動 Linux 系統了。如果我們後安裝 Linux 系統,GRUB 就會安裝到 MBR 中,覆蓋 Windows 系統的啟動載入程式。而 GRUB 是可以把啟動過程轉交到 Windows 系統的啟動載入程式中的,所以 Windows 系統和 Linux 系統都可以順利啟動。

當然,如果真的是後安裝 Windows 系統,則也可以通過手工再安裝一次 GRUB 來覆蓋 MBR 中的 Windows 系統的啟動載入程式,具體方法後續章節會講。

那麼我們就來看看 Windows 和 Linux 雙系統並存的 GRUB 的配置檔案是什麼樣子的。命令如下:

[root@localhost ~]#vi /boot/gmb/gmb.conf
default:0
timeout=-1
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title WinXp
rootnoverify (hd0,0)
\#指定Windows XP的啟動分割槽。是第一塊硬碟的第一個分割槽
\#rootnoverify是不檢測此分割槽的意思
makeactive
\#設定分割槽為啟用狀態
chainloader +1
\#把啟動過程轉交給此分割槽的第一個扇區
title CentOS (2.6.32-279.el6.i686)
root (hd0,5)
\#Linux系統的/boot分割槽安裝到了第一塊硬碟的第六個分割槽中
kemel/vmlinuz-2.6.32-279.el6.i686 ro
root=UUID=23e5c9d6-77a8-403a-8c0e2bfeffcab5ef rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd/initramfs-2.6.32-279.el6.i686.img

配置檔案的變化主要是多了 WinXP 這一段。rootnoverify(hd0,0) 欄位說明這個分割槽不檢測,同時標稱了 Windows 系統的啟動分割槽在第一塊硬碟的第一個分割槽中。也就是 Windows 系統的 C: 盤在第一塊硬碟的第一個分割槽中。chainloader+1 的意思是,GRUB 會把啟動過程轉交到位於這個分割槽的第一個扇區(啟動扇區)中的載入程式中。

我們已經知道,為了實現多系統啟動,除 MBR 中可以安裝啟動載入程式外,每個分割槽的第一個扇區也可以安裝啟動載入程式。在這個例子中,Windows 系統的啟動載入程式就被安裝到了 C: 盤所在分割槽的啟動扇區中,chainloader+1 就是 GRU 把啟動過程交給了 Windows 系統的啟動載入程式,所以可以啟動 Windows 系統。

Linux GRUB手動安裝方法詳解

需要手工安裝 GRUB 主要有兩種情況:

  1. Linux 系統原先不是使用 GRUB 作為載入程式而現在想要使用 GRUB 來作為載入程式;
  2. MBR 中的載入程式被覆蓋,需要在 MBR 中重新安裝 GRUB,如先安裝了 Linux 系統,後安裝了 Windows 系統。

下面,我們分別介紹這兩種情況如何手工安裝 GRUB 載入程式。

系統中沒有GRUB,需要手工安裝

我們先來講第一種情況,就是 Linux 系統中沒有安裝 GRUB,我們需要重新安裝 GRUB;或者打算把不是啟動分割槽的某個分割槽變成啟動分割槽。比如我的系統中新建了一個分割槽 /dev/sdb1,並掛載到了 /tdisk/ 目錄上,我們檢視一下新建立的分割槽,命令如下:

[root@localhost ~]# df
檔案系統 1K-塊 已用 可用 已用% 掛載點
/dev/sda3 19923216 1787736 17123412 10% /
tmpfs 312672 0 312672 0% /dev/shm
/dev/sda1 198337 26359 161738 15% /boot
/dev/sdb1 2071384 68632 1897528 4% /tdisk

這個分割槽是我手工建立的,當然不是系統的預設啟動分割槽(系統預設啟動分割槽是 /boot 分割槽)。我們用這個分割槽模擬一個不是採用 GRUB 作為預設載入程式的 Linux 硬碟,在這個分割槽中手工安裝 GRUB 載入程式。也就是說,這個實驗成功後,/boot 分割槽可以啟動系統,/tdisk 分割槽也可以啟動系統。

具體安裝步驟如下:

1) 使用 grul-install 命令在要啟動的分割槽中安裝 GRUB 相關檔案

在 /boot 分割槽中有一個 /boot/grub/ 目錄,這個目錄中儲存的就是 GRUB 的相關檔案(如檔案系統的 Stage 1.5 檔案)。我們檢視一下 /boot 分割槽中的這個目錄,如下:

[root@localhost ~]#ls /boot/grub/
device.map ffs_stage1_5 jfs_stage1_5 reiserfs_stage1_5 stage2
xfs_stage1_5 e2fs_stage1_5 grub.conf menu.lst splash.xpm.gz
ufs2_stage1_5 fat_stage1_5 iso9660_stage1_5 minix_stage1_5 stage1
vstafs_stage1_5

但是在 /tdisk 目錄中並不存在這些檔案,所以第一步就是要在 /tdisk 目錄中安裝這些 GRUB 相關檔案,具體採用 grub-install 命令。這個命令的格式如下:

[root@localhost ~]# grub-install [選項] 裝置檔名

選項:

  • -root-directory=DIR:DIR 為實際目錄,也就是手工指定 GRUB 相關檔案的安裝目錄;

【例 1】命令標準格式。

[root@localhost ~]# gmb-install /dev/sda
#因為預設 GRUB 就是安裝到 /dev/sda 中的,所以不需要指定 --root-directory 選項

我們需要把 GRUB 安裝到 /tdisk 分割槽,所以需要執行以下命令:

[root@localhost ~]# grub-install --root-directory=/tdisk/dev/sdb1
\#把GRUB安裝至/tdisk分割槽
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map/tdisk/boot/ grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-rnn the script 'grub-install'.
(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
\#說明安裝的裝置檔名

檢視一下:

[root@localhost ~]# ll /tdisk/boot/grub/
總用量272
-rw-r--r--. 1 root root 45 5 月 22 23:51 device.map
-rw-r--r--. 1 root root 13392 5 月 22 23:51 e2fs_stage1_5
-rw-r--r--. 1 root root 12632 5 月 22 23:51 fat_stage1_5
-rw-r--r--. 1 root root 11760 5 月 22 23:51 ffs_stage1_5
-rw-r--r--. 1 root root 11768 5 月 22 23:51 iso9660_stage1_5
-rw-r--r--. 1 root root 13280 5 月 22 23:51 jfs_stage1_5
-rw-r--r--. 1 root root 11968 5 月 22 23:51 minix_stage1_5
-rw-r--r--. 1 root root 14424 5 月 22 23:51 reiserfs_stage1_5
-rw-r--r--. 1 root root 512 5月 22 23:51 stage1
-rw-r--r--. 1 root root 125984 5月 22 23:51 stage2
-rw-r--r--. 1 root root 12036 5 月 22 23:51 ufs2_stage1_5
-rw-r--r--. 1 root root 11376 5 月 22 23:51 vstafs_stage1_5
-rw-r--r--. 1 root root 13976 5 月 22 23:51 xfs_stage1_5

GRUB 的相關檔案已經安裝到 /tdisk/boot/grub/ 目錄中。當然,這些檔案還是需要 GRUB 的配置檔案來讀取的。大家注意到了嗎? /tdisk/boot/grub/ 目錄中沒有 grub.conf 或 menu.lst 配置檔案,這些配置檔案還是需要依賴 /boot/grub/ 目錄的。

注意,如果系統中沒有 grul-install 命令,則說明沒有 GRUB 軟體,這時可以原始碼包安裝,也可以 RPM 包安裝。RPM 包的安裝命令如下:

[root@localhost ~]# rpm -ivh /mnt/cdrom/Packages/ grub-0.97-77.el6.i686.rpm

2) 修改GRUB的配置檔案

在我們的實驗中,GRUB 是已經安裝好的,所以可以直接修改 /boot/grub/gmb.conf 配置檔案。但如果是沒有安裝過 GRUB 的 Linux 系統手工安裝 GURB,就需要自己建立 GRUB 配置檔案了。那麼我們修改 /boot/grub/grub.conf 配置檔案如下:

[root@localhost ~]# vi /boot/gmb/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-279.el6.i686)
root(hd0,0)
kemel/vmlinuz-2.6.32-279.el6.i686 ro
root=UUID=b9a7a1 a8-767f-4a87-8a2ba535edb362c9 rd_NO_LUKS
KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkemel=auto
LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd/initramfs-2.6.32-279.el6.i686.img title CentOS tdisk #給自己這個啟動分割槽起個名字吧
root(hd1,0)
\#注意啟動分割槽的位置是/dev/sdb1,也就是/tdisk目錄
chainloader +1
\#使用當前分割槽所在的啟動扇區啟動系統

在 title CentOS tdisk 段中不能指定核心映象和 initramfs 虛擬檔案系統,因為在 /tdisk/boot/ 目錄中只有 grub 目錄,而沒有核心映象檔案和 initramfs 虛擬檔案系統的映象檔案,所以需要通過 chainloader 來呼叫啟動扇區。

3) 安裝GRUB到/dev/sdb1分割槽的啟動扇區中

剛剛通過 GRUB 配置檔案中的 chainloader 來呼叫啟動扇區,但是 /dev/sdb1 這個分割槽是新建立的,它的啟動扇區中並沒有 GRUB 程式。所以最後一步就是要在 /dev/sdb1 分割槽的啟動扇區中安裝 GRUB。這時就要利用 GRUB 互動模式了,如下:

[root@localhost boot]# grub
\#啟動進入GRUB互動模式
grub> root (hd0,0)
root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
\#設定GRUB的主目錄,這裡只能是(hd0,0),因為核心和虛擬檔案系統安裝在/dev/sdal中,也就是/boot分割槽中
grub> find /boot/gnab/stagel
find /boot/grub/stagel (hd1,0)
\#查詢一下Stage 1安裝的分割槽
\#好像有一點問題,我們在/boot和/tdisk分割槽中都安裝了GRUB,只看到了/tdisk分割槽
grub> find /gcub/stagel
find /grub/stagel (hd0,0)
\#只有這樣才能看到/boot分割槽中的Stage 1。因為/boot分割槽是一個單獨分割槽。上面能看到是因為/tdisk才是分割槽,而/boot/grub/只是/tdisk分割槽中的目錄
grub> find /vmlinuz-2.6.32-279.el6.1686
find /vmlinuz-2.6.32-279.el6.i686 (hd0,0)
\#能夠查到核心位置。注意不能通過/boot/vmlinuz-2.6.32-279.el6.i686查詢,還是因為/boot是單獨分割槽。但是這次/tdisk分割槽中沒有核心
grub> setup (hd1,0)
setup (hd1,0)
Checking if "/boot/grub/stagel" exists... no
Checking if "/grub/stagel" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd1,0)"... failed (this is not fatal)
Running "embed /grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal)
Running "install /grub/stagel d (hd1,0) /grub/stage2 p /grub/grub.conf "...
succeeded
Done
\#在/tdisk分割槽的啟動扇區中安裝GRUB吧。雖然有兩個failed,但這只是兩個檔案系統的Stage 1.5檔案沒有安裝,並不影響
grub> quit
\#退出GRUB互動介面

這時 GRUB 安裝完成了,可以重新啟動試驗一下了。重啟後可以看到圖 1 所示的介面。

圖 3 GRUB介面

當然 /tdisk 分割槽中並沒有真正的核心,所以最終還是要靠 /boot 分割槽啟動。如果是多核心並存的,就可以真正啟動了。

總結一下,在 Linux 系統中安裝 GRUB,或者在新分割槽中安裝 GRUB 的步驟如下:

  • 需要在 Linux 系統的指定分割槽中安裝 GRUB 的相關檔案。這是通過 grub-stall 命令實現的。
  • 需要按照要求修改 GRUB 的配置檔案,也就是 /boot/gmb/grub.conf。
  • 需要在分割槽的啟動扇區中安裝 GRUB,這是通過 grub 命令的互動模式實現的。

MBR中的GRUB被覆蓋,需要重新安裝GRUB

這種情況最常見的就是先安裝了 Linux 系統,後安裝了 Windows 系統,導致 MBR 中的 GRUB 被覆蓋。而 Windows 系統的啟動載入程式又不能識別 Linux 系統,從而導致 Linux 系統不能正常啟動。

這種情況解決起來比第一種要簡單得多,因為不需要安裝 GRUB 的相關檔案和修改 GRUB 的配置檔案,也就是第一種情況的第一步和第二步不需要執行,因為這是已經安裝和修改好的。只需要執行第三步,覆蓋 MBR 中的啟動載入程式即可。

但是這裡的問題是,應該在什麼地方啟動 GRUB 的互動模式呢?第一種情況是,我們是在 Linux 的命令列中執行 grub 命令,來啟動 GRUB 互動模式。第二種情況是已經不能正常啟動 Linux 系統了,當然也就沒有 Linux 的命令行了。在這種情況下,我們需要先利用 Linux 的光碟修復模式,使用光碟來啟動 Linux,進入 Linux 的命令列,再指定 grub 命令。Linux 的光碟修復模式將在後續章節中介紹。

我們先假設已經進入了光碟修復模式中的 Linux 命令列,那麼只需執行如下命令即可:


重啟系統之後,就可以發現熟悉的 GRUB 介面又回來了。這種安裝 GRUB 的方式要比第一種情況簡單,因為這並不是全裝,僅僅是覆蓋安裝而已。

# Linux GRUB加密方法詳解(2種加密方式)

Linux 在啟動時,在 GRUB 管理介面中是可以通過按"e"鍵進入編輯模式,修改啟動選項的。
![](https://img2020.cnblogs.com/blog/2002319/202101/2002319-20210121141412627-1619316330.jpg)
圖 4 GRUB介面


如圖 1 所示,每個啟動選項都支援按"e"鍵進入編輯模式。在編輯模式中可以修改啟動模式,比如進入單使用者模式(單使用者模式主要用於破解密碼,我們將在後續章節中講 解)。

但是有時候,我們不想讓使用者進入編輯模式,就需要給 GRUB 選單加密。那麼,如何生成加密的密碼串呢?可以通過命令 grub-md5-crypt 來實現。命令如下:

```shell
[root@localhost ~]# grub-md5-crypt
Password:
Retype password:
\#輸入兩次密碼
$1$Y84LB1$8tMY2PibScmuOCc8z8U35/
\#生成加密的密碼串

這樣就可以生成加密的密碼串,這個字串是採用 MD5 加密的,我們會利用這個加密的密碼串來加密 GRUB 配置檔案。

GRUB 的加密有兩種模式:

  • 給每個啟動選單加密,如果不輸入正確的密碼,則系統不能正常啟動;
  • 給 GRUB 選單整體加密,如果想進入編輯模式,則必須輸入正確的密碼;

給每個啟動選單加密

如果給每個啟動選單加密,那麼系統在啟動時進入相應的啟動選單,必須輸入正確的密碼,否則系統不能啟動。具體的方法如下:

[root@localhost ~]# vi /boot/grub/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-279.el6.i686)
password --md5 $l$Y84LBl$8tHY2PibScmuOCc8z8D35/
\#加入password選項,密碼串是通過grub-md5-crypt命令生成的
root(hd0,0)
kernel /vmlinuz-2.6.32-279.el6•i686 ro root=UUID=b9a7ala8-767f-4a87-8a2b-a535edb362c9 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_N0_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_N0_LVM rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-279.el6.i686.img

這樣就能加密 CentOS 啟動選單了,在啟動時如果不輸入正確的密碼,是不能啟動系統的。需要注意的是,password 選項一定要在 title 下面第一行。

給GRUB選單整體加密

如果只是加密單個啟動選單,那麼 GRUB 的編輯模式是不能被鎖定的,仍然可以按"e"鍵進入編輯模式。而且在進入編輯模式後,是可以刪除 password 欄位的,再按"b"(boot啟動)鍵就可以不用密碼直接進入系統。這時就需要給 GRUB 選單整體加密。在整體加密後,如果想進入 GRUB 編輯介面,則必須輸入正確的密碼。加密方法其實只是把 password 欄位換一個位置而已,具體方法如下:

[root@localhost ~]# vi /boot/grub/grub.conf
default=0
timeout=5
password --md5 $l$Y84LBl$8tMY2PibScmuOCc8z8U35/
\#將password選項放在整體設定處
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-279.el6.i686)
root (hd0,0)
kernel /vmlinuz-2.6.32-279.el6.i686 ro root=UUID=b9a7ala8-767f-4a87-8a2b-a535edb362c9 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-279.el6.i686.img

這樣就會把 GRUB 介面整體加密,要想進入 GRUB 的編輯介面,必須先輸入正確的密碼,如圖 2 所示。


圖 6 GRUB 整體加密

注意到了嗎?在 GRUB 介面中已經看不到"e"鍵了,必須輸入"p"鍵,並輸入正確的密碼才能進入編輯介面。但是這樣加密,在啟動 CentOS 時,是不需要密碼就能正常啟動的。如果既需要 GRUB 的整體加密,又需要系統啟動時輸入正確的密碼,應該怎麼做呢?

很簡單,方法如下:

default=0
timeout=5
password --md5 $l$Y84LBl$8tHY2PibScmuOCc8z8U35/
splashimage=(hdO,0)/grub/splash.xpm.gz hiddenmenu
title CentOS (2.6.32-279.el6.i686) lock
\#在title欄位下加入lock選項,代表鎖死,如果不輸入正確的GRUB密碼,則不能啟動root(hd0,0)
kernel /vmlinuz-2.6.32-279.el6.i686 ro root=UUID=b9a7ala8-767f-4a87-8a2b-a535edb362c9 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd / initramf s-2.6.32-27.9 .el6.i686. img

只要在 GRUB 整體配置中加入 password 選項,在 title 中加入 lock 選項,就可以既加密 GRUB 編輯介面,又加密系統啟動過程了。是不是很簡單?

Linux字元介面調整解析度的方法

如果安裝了 Linux 的圖形介面,則使用圖形介面修改分辨非常方便也很簡單。但是如果只安裝了字元介面,難道就不能修改解析度了嗎?

當然是可以的,只要利用 GRUB 的配置檔案就可以完成。當然需要確定核心是否支援 CONFIG_FRAMEBUFFER_CONSOLE 功能,如果沒有開啟這項功能,則需要重新編譯核心。査詢方法如下:

[root@localhost ~]# grep "CONFIG_FRAMEBUFFER_CONSOLE" /boot/ config-2.6.32-279.el6.i686
\#還記得/boot/config*2.6.32-279.el6.i686檔案嗎?這個檔案中儲存的是核心編譯時選擇的功能和模組。我們在這個檔案中査找
CONFIG_FRAMEBUFFER_CONSOLE=y
\#出現了=y,當然是支援了

在字元介面界支援的解析度列表如表 1 所示。

色 深 640畫素x480畫素 800畫素x600畫素 1024畫素x768畫素 1280畫素x1024畫素
8位 769 771 773 775
15位 784 787 790 793
16位 785 788 791 794
32位 786 789 792 795

如果想把字元介面的解析度設定為 1024 畫素x 768 畫素,色深為 16 位,則只需要修改 GRUB 的配置檔案,在 kernel 行最後加入下面的內容:

[root@localhost ~]#vi /boot/grub/gmb.conf
default:0
timeout=5
splashimage=(hd0,0)/gmb/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-279.el6.i686)
root (hd0,0)
kemel/vmlinuz-2.6.32-279.el6.i686 ro
root=UUID=b9a7a1 a8-767f-4a87-8a2ba535edb362c9 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet vga=791
initrd/initramfs-2.6.32-279.el6.i686.img

然後重新啟動系統,就會發現解析度已經改變了。有些 Linux 的版本需要將 vga 的值寫成十六進位制的,可以先試試表 1 中的數字,如果不行則可以嘗試十六進位制數。

Linux核心模組管理(檢視、新增和刪除)

Linux 的核心會在啟動過程中自動檢驗和載入硬體與檔案系統的驅動。一般這些驅動都是用模組的形式載入的,使用模組的形式儲存驅動,可以不直接把驅動放入核心,有利於控制核心大小。

模組的全稱是動態可載入核心模組,它是具有獨立功能的程式,可以被單獨編譯,但不能獨立執行。模組是為核心或其他模組提供功能的程式碼集合。這些模組可以是 Linux 原始碼中自帶的,也可以是由硬體廠商開發的(可以想象成驅動)。不過核心因為釋出時間較長,所以自帶的模組可能版本較低,還有一些新硬體可能就不自帶模組了,只能由硬體廠商在釋出硬體的同時釋出新模組。

也就是說,安裝模組一般有兩種方法:

  • 第一種方法在編譯核心時,手工調整核心模組功能,加入所需的模組。這種方法有一個問題,就是核心必須支援這個硬體或功能才可以通過編譯核心加入模組。如果硬體比核心新,核心本身並不支援硬體,就不能通過重新編譯核心來加入新的硬體的支援。
  • 第二種方法就是下載廠商釋出的新硬體的驅動模組,或下載驅動程式,再編譯成驅動模組,然後手工安裝。

本節我們主要來學習第二種方法,也就是如果我已經得到了一個模組,該如何手工安裝?這個模組該如何得到呢?

如果是新硬體的驅動,則可以到硬體官方網站下載核心驅動或核心模組。如果下載的是核心模組,則直接安裝即可;如果下載的是核心驅動原始碼,則只需要編譯原始碼包,就會生成模組(具體編譯過程和原始碼包安裝非常類似,可以檢視驅動的說明)。如果需要加入的模組不是硬體的驅動,而只是核心中的某項功能,那麼,只要部分重新編譯核心,就可以生成新功能的模組(我們會通過 NTFS 檔案系統支援來學習這種方法),然後安裝這個模組即可。

核心模組儲存位置與模組儲存檔案

核心模組的儲存位置在什麼地方?其實在 /lib/modules/ 核心版本 /kernel/ 目錄中,在 CentOS 6.x 中這個目錄就是:

[root@localhost ~]# cd /lib/modules/2.6.32-279.el6. i686/kemel/
檢視一下目錄內容:
[root@localhost kernel]#ls
arch
與硬體相關的模組
crypto
\#核心支援的加密技術的相關模組
drivers
\#硬體的驅動程式模組,如顯示卡、網絡卡等
fs
\#檔案系統模組,如 fat、vfat、nfs等
lib
\#函式庫
net
\#網路協議相關模組
sound
\#音效相關模組

Linux 中所有的模組都存放在 /lib/modules/2.6.32-279.el6.i686/modules.dep 檔案中,在安裝模組時,依賴這個檔案査找所有的模組,所以不需要指定模組所在位置的絕對路徑,而且也依靠這個檔案來解決模組的依賴性。如果這個檔案丟失了怎麼辦?不用擔心,使用 depmod 命令會自動掃描系統中已有的模組,並生成 modules.dep 檔案。命令格式如下:

[root@localhost ~]# depmod [選項]
#不加選項,depmod命令會掃描系統中的核心模組,並寫入modules.dep檔案

選項:

  • -a:掃描所有模組;
  • -A:掃描新模組,只有有新模組時,才會更新modules.dep檔案;
  • -n:把掃描結果不寫入modules.dep檔案,而是輸出到螢幕上;

我們把 modules.dep 檔案刪除,看看使用 depmod 命令是否可以重新生成這個檔案。命令如下:

[root@localhost ~]# cd /lib/modules/2.6.32-279.el6.i686/
\#進入模組目錄
[root@localhost 2.6.32-279.el6.i686]# rm -rf modules.dep
\#刪除 modules.dep檔案
[raot@localhost 2.6.32-279.el6.i686]# depmod
\#重新掃描模組
[root@localhost 2.6.32-279.el6.i686]# ls -l modules.dep
-rw-r--r--. 1 root root 191899 5 月 23 07:09 modules.dep
\#再檢視一下,modules.dep檔案又生成了

depmod 命令會掃描系統中所有的核心模組,然後把掃描結果放入 modules.dep 檔案。後續的模組安裝或刪除就依賴這個檔案中的內容。也就是說,如果我們要手工安裝一個模組,則需要先把模組複製到指定位置,一般複製至 /lib/modules/2.6.32-279.el6.i686/kernel/ 目錄中,使用 depmod 命令掃描之後,才能繼續安裝。

核心模組的檢視

使用 lsmod 命令可以檢視系統中到底安裝了哪些核心模組。命令如下:

[root@localhost ~]# lsmod
Module Size Used by
autofs4 20981 3
sunrpc 215000 1
ipt_REJECT 1867 2
nf_conntrack_ipv4 7694 2
nf_defrag_ipv4 1039 1 nf_conntrack_ipv4
…省略部分輸出…

lsmod命令的指定結果共有三列。

  • Module:模組名。
  • Size:模組大小。
  • Used by:模組是否被其他模組呼叫。

我們還可以使用 modinfo 命令來檢視這些模組的說明,命令格式如下:

[root@localhost ~]# modinfo 模組名 例如:
[root@localhost ~]# modinfo autofs4
filename:/lib/modules/2.6.32-279.el6.i686/kernel/fs/autofs4/autofs4.ko
license: GPL
srcversion: 4F798AD1AD66D2CBBB5D953
depends:
vermagic:2.6.32-279.el6.i686 SMP mod_unload modversions 686
\#能夠看到模組名,來源和簡易說明

核心模組的新增與刪除

其實,如果模組已經下載到本機了,那麼安裝模組的方法非常簡單。首先需要把模組複製到指定位置,一般複製到 /lib/modules/2.6.32-279.el6.i686/kemel/ 目錄中,模組的副檔名一般是 *.ko;然後需要執行 depmod 命令掃描這些新模組,並寫入 modules.dep 檔案;最後就可以利用 modprobe 命令安裝這些模組了。命令格式如下:

[root@localhost ~]# modprobe [選項] 模組名

選項:

  • -I:列出所有模組的檔名,依賴 modules.dep 檔案;
  • -f:強制載入模組;
  • -r:刪除模組;

舉個例子,我們需要安裝 vfat 模組(fat32 檔案系統的模組),那麼需要執行如下命令即可:

[root@localhost ~]# modprobe vfat
\#安裝vfat模組
[root@localhost ~]# Ismod | grep vfat
vfat 8575 0
fat 47049 1 vfat

vfat 模組是系統中的預設模組,所以不需要執行 depmod 命令進行掃描。如果是外來模組,則必須執行 depmod 命令。因為已經把模組的完整檔名寫入了 modules.dep 檔案,所以安裝模組的命令不需要寫絕對路徑。

那麼,如何刪除這個模組呢?命令如下:

[root@localhost ~]# modprobe -r vfat
[root@localhost ~]# lsmod | grep vfat
\#查詢為空

Linux NTFS檔案系統安裝教程

在 CentOS 6.x 中,預設 NTFS 檔案系統是沒有安裝的,也就是說在 CentOS 6.x 中是不能直接掛載 NTFS 分割槽的。但是目前 Windows 的分割槽絕大多數是 NTFS 分割槽,這就需要在 CentOS 6.x 中安裝 NTFS 檔案系統的模組之後,才能使用 NTFS 分割槽。

安裝 NTFS 檔案系統模組的方法有三種:

  • 第一種方法是完整地重新編譯核心,然後在核心中選擇 NTFS 功能,但這種方法過於麻煩,如果只是為了加入 NTFS 支援,則不建議採用這麼複雜的方法;
  • 第二種方法是得到 NTFS 檔案系統模組(可以到網際網路上下載,也可以利用本機的核心部分編譯之後產生,不用完整地編譯核心,要簡單方便得多),然後使用 modprobe 命令安裝,本小節就來介紹這種方法;
  • 第三種方法是安裝 NTFS 檔案系統的第三方外掛,如 NTFS-3G,這種外掛安裝簡單、功能完整,我們也會講講這種方法;

得到NTFS檔案系統模組後,手工安裝

如果使用這種方法,則首先需要得到 NTFS 檔案系統模組,這些模組一般是用 *ko 作為副檔名的。我們可以直接在網際網路上找到 ntfs.ko 的模組檔案下載之後安裝;也可以下載完整的核心原始碼,自己編譯生成 ntfs.ko 模組,然後安裝。

我們採用第二種方法。具體步驟如下。

1) 下載核心

我們可以到核心的官方網站下載和本機安裝的核心版本相同的核心原始碼。本機核心的版本可以使用 uname -r 命令檢視,命令如下:

[root@localhost ~]# uname -r
2.6.32-279.el6.i686

這裡下載的是 linux-2.6.32.tar.bz2 這個核心原始碼。我們可能會發現,在核心官網上找到的核心原始碼的版本可能和本機核心的版本不完全相同,這不會有太大影響,只需找到和本機版本差不多的核心原始碼即可。

另外,在 2.4.x 核心版本中,我們可以通過 RPM 包安裝完整的核心原始碼到本機,而不用去官網下載。但是在 2.6.x 核心版本之後,如果採用 RPM 包的方式安裝核心原始碼,則只會安裝部分原始碼檔案,而不會安裝完整的核心原始碼檔案。RPM 包安裝的核心原始碼是不能進行正常編譯和安裝的,所以只能到核心的官方網站上下載完整的核心原始碼。

2) 解壓核心

下載的核心是壓縮包,需要解壓。解壓命令如下:

[root@localhost ~]# tar -jxvf linux-2.6.32.tar.bz2
[root@localhost ~]# cp -r linux-2.6.32 /usr/src/kernels/
\#複製核心原始碼到預設核心原始碼儲存位置

3) 生成核心編譯所需的 .config 檔案

在進行核心編譯時,是需要依賴 .config 配置檔案來配置核心功能的,這個檔案是通過 make menuconfig 命令生成的。

不過,我們在這裡不講解完整的核心編譯過程,只是為了生成 ntfs.ko 檔案,那麼我們就不需要執行復雜的 make menuconfig 命令了。我們可以安裝 RPM 包的核心,雖然 RPM 包安裝的核心原始碼並不完整(早期 Linux 版本會安裝完整的核心原始碼),但是有 .config 配置檔案,我們可以直接利用這個配置檔案,而不需要使用 make menuconfig 命令自己生成 .config 配置檔案(在進行真正的核心編譯時,是需要使用 make menuconfig 命令來配置自己需要的功能,並生成 .config 配置檔案的)。 命令如下:

[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/
[root@localhost ~]# rpm -ivh /mnt/cdrom/Packages/ kemel-devel-2.6.32-279.el6.i686.rpm
\#安裝RPM包的不完整的核心原始碼
[root@localhost ~]# cp /usr/src/kemels/2.6.32-279.el6.i686/.config/usr/src/
kemels/linux-2.6.32/
\#從RPM包的核心原始碼中複製.config配置檔案到原始碼包的核心原始碼中

這樣我們就有了 .config 配置檔案,當然也可以通過 make menuconfig 命令生成這個配置檔案。不過我們現在還沒有學習核心的編譯過程,所以採用了這種簡單的辦法。當然,還要修改一下 .config 配置檔案,讓它支援 NTFS 檔案系統。需要把 #CONFIG_NTFS_FS is not set 這行程式碼改為 CONFIG_NTFS_FS=m,意思是用模組形式載入 NTFS 檔案系統。命令如下:

[root@localhost ~]# vi /usr/src/kernels/ linux-2.6.32/.config
…省略部分輸出…
\# CONFIG_NTFS_FS is not set
\#改為
CONFIG_NTFS_FS=m
…省略部分輸出…

4) 編譯模組

使用 make modules 命令來編譯所有的模組,因為我們開啟了 NTFS 檔案系統模組,所以會生成 ntfs.ko 檔案。當然,編譯要想正確進行,gcc 編譯器是必須安裝的。命令如下:

[root@localhost ~]# cd /usr/src/kernels/linux-2.6.32/
#編譯命令一定要進入核心目錄才能執行,因為編譯命令編譯的是模組當前所在目錄
[root@localhost linux-2.6.32]# make modules
#在命令執行過程中,需要選擇安裝哪些模組,這時只選擇NTFS相關模組,其他模組都不安裝,這樣能加快安裝速度。注意:需要選擇的選項較多,不要漏選
…省略部分輸出…
NTFS file system support (NTFS_FS) [M/n/y/?] m
NTFS debugging support (NTFS_DEBUG) [N/y/?] (NEW)y
NTFS write support (NTFS_RW) [N/y/?] (NEW)y
#只有這幾個功能選擇y(安裝)或m(安裝成模組),其他功能都不需要安裝
…省略部分輸出…

接下來需要等待編譯過程結束,就能看到 ntfs.ko 模組了。命令如下:

[root@localhost linux-2.6.32]# ll /usr/src/kemels/ linux-2.6.32/fe/ntfs/ntfs.ko
-rw-r--r--. 1 root root 3175255 6 月 4 18:57 /usr/src/ kemels/linux-2.6.32/
fs/ntfs/ntfs.ko

5) 模組安裝

我們有了 ntfs.ko 模組,接下來的安裝過程就比較簡單了。先把 ntfs.ko 複製到指定位置,命令如下:

[root@localhost linux-2.6.32]# cp fs/ntfs/ntfe.ko/lib/ modules/2.6.32-279.el6.i686/kemel/fs/

然後開始模組安裝,命令如下:

[root@localhost linux-2.6.32]# depmod -a
\#掃描所有模組
[root@localhost linux-2.6.32]# modprobe ntfs
\#安裝ntfs模組
如果 modprobe ntfs 命令報錯,那是因為版本不符。這個問題很好解決,只要執行如下命令:
[root@localhost linux-2.6.32]# modprobe -f ntfs
\#-f:強制
強制安裝 ntfs 模組即可。然後查詢一下:
[root@localhost linux-2.6.32]#lsmod | grep ntfs
ntfs 93874 0 [permanent]

這樣 ntfs 模組就安裝成功了,我們就可以嘗試掛載和使用 NTFS 的分割槽或行動硬碟了。

注意,雖然我們使用了部分核心編譯命令,但是我們的目的不是編譯核心,而只是生成 ntfs.ko 模組,所以不需要完成核心的完整編譯與安裝過程。而且,如果執行了 make install 命令,那麼安裝的新核心有 ntfs 功能,其他功能都不存在,新核心是不能正確使用的。

利用 NTFS-3G 外掛安裝 NTFS 檔案系統模組

我們已經學習了利用 ntfs.ko 模組安裝 NTFS 檔案系統,這種方法生成 ntfs.ko 模組比較麻煩。如果採用安裝 NTFS-3G 外掛的方式安裝 NTFS 檔案系統,則更加簡單和方便。具體步驟如下。

1) 下載 NTFS-3G 外掛

首先,下載 NTFS-3G 外掛到 Linux 伺服器上。

2)安裝 NTFS-3G 外掛

在編譯安裝 NTFS-3G 外掛之前,要保證 gcc 編譯器已經安裝。具體安裝命令如下:

[root@localhost ~]# tar -zxvf
ntfs-3g_ntfsprogs-2013.1,13.tgz
\#解壓
[root@localhost ~]#cd ntfs-3g_ntfeprogs-2013.1.13
\#進入解壓目錄
[root@localhost ntfs-3g_ntfsprogs-2013.1.13]#./ configure
\#編譯器準備。沒有指定安裝目錄,安裝到預設位置
[root@localhost ntfs-3g_ntfsprogs-2013.1.13]# make
\#編譯
[root@localhost ntfs-3g_ntfsprogs-2013.1.13]# make install
\#編譯安裝

這樣安裝就完成了,可以掛載和使用 Windows 的 NTFS 分割槽了。不過需要注意,掛載分割槽時的檔案系統不是 NTFS,而是 NTFS-3G。掛載命令如下:

[root@localhost ~]# mount -t ntfs-3g 分割槽裝置檔名 掛載點

例如:

[root@localhost ~]# mount -t ntfe-3g /dev/sdb1 /mnt/win

這樣看來,使用安裝 NTFS-3G 外掛的方式比安裝 NTFS 檔案系統更加簡便方便。