## 2.2 磁盤分區
這一章在規劃的重點是為了要安裝Linux,那Linux系統是安裝在計算機元件的那個部分呢?就是磁盤啦!所以我們當然要來認識一下磁盤先。 我們知道一塊磁盤是可以被分區成多個分區的(partition),以舊有的Windows觀點來看,你可能會有一顆磁盤并且將他分區成為C:, D:, E:盤對吧!那個C, D, E就是分區(partition)啰。但是Linux的設備都是以文件的型態存在,那分區的文件名又是什么? 如何進行磁盤分區?磁盤分區有哪些限制?目前的 BIOS 與 UEFI 分別是啥?MSDOS 與 GPT 又是啥? 都是我們這個小節所要探討的內容啰。
### 2.2.1 磁盤連接的方式與設備文件名的關系
由[第零章](../Text/index.html#pc_hd)提到的磁盤說明,我們知道個人計算機常見的磁盤接口有兩種, 分別是SATA與SAS接口,目前(2015)的主流是SATA接口。不過更老舊的計算機則有可能是已經不再流行的IDE界面喔! 以前的IDE界面與SATA界面在Linux的磁盤代號并不相同,不過近年來為了統一處理,大部分Linux distribution已經將IDE界面的磁盤文件名也仿真成跟SATA一樣了! 所以你大概不用太擔心磁盤設備文件名的問題了!
時代在改變啊~既然IDE界面都可以消失了,那磁盤文件名還有什么可談的呢?嘿嘿!有啊!如同上一小節談到的,虛擬化是目前很常見的一項技術, 因此你在使用的機器很可能就是虛擬機,這些虛擬機使用的“虛擬磁盤”并不是正規的磁盤界面!這種情況下面,你的磁盤文件名就不一樣了! 正常的實體機器大概使用的都是 /dev/sd[a-] 的磁盤文件名,至于虛擬機環境下面,為了加速,可能就會使用 /dev/vd[a-p] 這種設備文件名喔! 因此在實際處理你的系統時,可能得要了解為啥會有兩種不同磁盤文件名的原因才好!
例題:假設你的主機為虛擬機,里面僅有一顆VirtIO接口的磁盤,請問他在Linux操作系統里面的設備文件名為何?答:參考 2.1.3 小節的介紹,虛擬機使用 VirtIO 界面時,磁盤文件名應該是 /dev/vda 才對!
再以SATA接口來說,由于SATA/USB/SAS等磁盤接口都是使用SCSI模塊來驅動的, 因此這些接口的磁盤設備文件名都是/dev/sd[a-p]的格式。 所以SATA/USB接口的磁盤根本就沒有一定的順序,那如何決定他的設備文件名呢? 這個時候就得要根據Linux核心偵測到磁盤的順序了!這里以下面的例子來讓你了解啰。
例題:如果你的PC上面有兩個SATA磁盤以及一個USB磁盤,而主板上面有六個SATA的插槽。這兩個SATA磁盤分別安插在主板上的SATA1, SATA5插槽上, 請問這三個磁盤在Linux中的設備文件名為何?答:由于是使用偵測到的順序來決定設備文件名,并非與實際插槽代號有關,因此設備的文件名如下:
1. SATA1插槽上的文件名:/dev/sda
2. SATA5插槽上的文件名:/dev/sdb
3. USB磁盤(開機完成后才被系統捉到):/dev/sdc
通過上面的介紹后,你應該知道了在Linux系統下的各種不同接口的磁盤的設備文件名了。 OK!好像沒問題了呦!才不是呢~問題很大呦! 因為如果你的磁盤被分區成兩個分區,那么每個分區的設備文件名又是什么?在了解這個問題之前,我們先來復習一下磁盤的組成, 因為現今磁盤的分區與他物理的組成很有關系!
我們在[計算機概論](../Text/index.html)談過磁盤的組成主要有盤片、機械手臂、磁頭與主軸馬達所組成, 而數據的寫入其實是在盤片上面。盤片上面又可細分出扇區(Sector)與磁道(Track)兩種單位, 其中扇區的物理量設計有兩種大小,分別是 512Bytes 與 4KBytes。假設磁盤只有一個盤片,那么盤片有點像下面這樣:
圖2.2.1、盤片組成示意圖
那么是否每個扇區都一樣重要呢?其實整顆磁盤的第一個扇區特別的重要,因為他記錄了整顆磁盤的重要信息! 早期磁盤第一個扇區里面含有的重要信息我們稱為MBR (Master Boot Record) 格式,但是由于近年來磁盤的容量不斷擴大,造成讀寫上的一些困擾, 甚至有些大于 2TB 以上的磁盤分區已經讓某些操作系統無法存取。因此后來又多了一個新的磁盤分區格式,稱為 GPT (GUID partition table)! 這兩種分區格式與限制不太相同啦!
那么分區表又是啥?其實你剛剛拿到的整顆硬盤就像一根原木,你必須要在這根原木上面切割出你想要的區段, 這個區段才能夠再制作成為你想要的家具!如果沒有進行切割,那么原木就不能被有效的使用。 同樣的道理,你必須要針對你的硬盤進行分區,這樣硬盤才可以被你使用的!
### 2.2.2 MSDOS(MBR) 與 GPT 磁盤分區表(partition table)
但是硬盤總不能真的拿鋸子來切切割割吧?那硬盤還真的是會壞掉去!那怎辦?在前一小節的圖示中, 我們有看到“開始與結束磁道”吧?而通常磁盤可能有多個盤片,所有盤片的同一個磁道我們稱為柱面 (Cylinder), 通常那是文件系統的最小單位,也就是分區的最小單位啦!為什么說“通常”呢?因為近來有 GPT 這個可達到 64bit 紀錄功能的分區表, 現在我們甚至可以使用扇區 (sector) 號碼來作為分區單位哩!厲害了! 所以說,我們就是利用參考對照柱面或扇區號碼的方式來處理啦!
也就是說,分區表其實目前有兩種格式喔!我們就依序來談談這兩種分區表格式吧。
* MSDOS (MBR) 分區表格式與限制
早期的 Linux 系統為了相容于 Windows 的磁盤,因此使用的是支持 Windows 的 MBR(Master Boot Record, 主要開機紀錄區) 的方式來處理開機管理程序與分區表!而開機管理程序紀錄區與分區表則通通放在磁盤的第一個扇區, 這個扇區通常是 512Bytes 的大小 (舊的磁盤扇區都是 512Bytes 喔!),所以說,第一個扇區 512Bytes 會有這兩個數據:
* 主要開機記錄區(Master Boot Record, MBR):可以安裝開機管理程序的地方,有446 Bytes
* 分區表(partition table):記錄整顆硬盤分區的狀態,有64 Bytes
由于分區表所在區塊僅有64 Bytes容量,因此最多僅能有四組記錄區,每組記錄區記錄了該區段的啟始與結束的柱面號碼。 若將硬盤以長條形來看,然后將柱面以直條圖來看,那么那64 Bytes的記錄區段有點像下面的圖示:
圖2.2.2、磁盤分區表的作用示意圖
假設上面的硬盤設備文件名為/dev/sda時,那么這四個分區在Linux系統中的設備文件名如下所示, 重點在于文件名后面會再接一個數字,這個數字與該分區所在的位置有關喔!
* P1:/dev/sda1
* P2:/dev/sda2
* P3:/dev/sda3
* P4:/dev/sda4
上圖中我們假設硬盤只有400個柱面,共分區成為四個分區,第四個分區所在為第301到400號柱面的范圍。 當你的操作系統為Windows時,那么第一到第四個分區的代號應該就是C, D, E, F。當你有數據要寫入F盤時, 你的數據會被寫入這顆磁盤的301~400號柱面之間的意思。
由于分區表就只有64 Bytes而已,最多只能容納四筆分區的記錄, 這四個分區的記錄被稱為主要(Primary)或延伸(Extended)分區。 根據上面的圖示與說明,我們可以得到幾個重點信息:
* 其實所謂的“分區”只是針對那個64 Bytes的分區表進行設置而已!
* 硬盤默認的分區表僅能寫入四組分區信息
* 這四組分區信息我們稱為主要(Primary)或延伸(Extended)分區
* 分區的最小單位“通常”為柱面(cylinder)
* 當系統要寫入磁盤時,一定會參考磁盤分區表,才能針對某個分區進行數據的處理
咦!你會不會突然想到,為啥要分區啊?基本上你可以這樣思考分區的角度:
1. 數據的安全性:
因為每個分區的數據是分開的!所以,當你需要將某個分區的數據重整時,例如你要將計算機中Windows的C 盤重新安裝一次系統時, 可以將其他重要數據移動到其他分區,例如將郵件、桌面數據移動到D 盤去,那么C 盤重灌系統并不會影響到D 盤! 所以善用分區,可以讓你的數據更安全。
2. 系統的性能考慮:
由于分區將數據集中在某個柱面的區段,例如上圖當中第一個分區位于柱面號碼1~100號,如此一來當有數據要讀取自該分區時, 磁盤只會搜尋前面1~100的柱面范圍,由于數據集中了,將有助于數據讀取的速度與性能!所以說,分區是很重要的!
既然分區表只有記錄四組數據的空間,那么是否代表我一顆硬盤最多只能分區出四個分區?當然不是啦!有經驗的朋友都知道, 你可以將一顆硬盤分區成十個以上的分區的!那又是如何達到的呢?在Windows/Linux系統中, 我們是通過剛剛談到的延伸分區(Extended)的方式來處理的啦!延伸分區的想法是: 既然第一個扇區所在的分區表只能記錄四筆數據, 那我可否利用額外的扇區來記錄更多的分區信息?實際上圖示有點像下面這樣:
圖2.2.3、磁盤分區表的作用示意圖
**Tips** 實際上延伸分區并不是只占一個區塊,而是會分佈在每個分區的最前面幾個扇區來記載分區信息的!只是為了方便讀者記憶, 鳥哥在上圖就將他簡化了!有興趣的讀者可以到下面的鏈接瞧一瞧實際延伸分區的紀錄方式:
[http://en.wikipedia.org/wiki/Extended_boot_record](http://en.wikipedia.org/wiki/Extended_boot_record)
在上圖當中,我們知道硬盤的四個分區記錄區僅使用到兩個,P1為主要分區,而P2則為延伸分區。請注意, 延伸分區的目的是使用額外的扇區來記錄分區信息,延伸分區本身并不能被拿來格式化。 然后我們可以通過延伸分區所指向的那個區塊繼續作分區的記錄。
如上圖右下方那個區塊有繼續分區出五個分區, 這五個由延伸分區繼續切出來的分區,就被稱為邏輯分區(logical partition)。 同時注意一下,由于邏輯分區是由延伸分區繼續分區出來的,所以他可以使用的柱面范圍就是延伸分區所設置的范圍喔! 也就是圖中的101~400啦!
同樣的,上述的分區在Linux系統中的設備文件名分別如下:
* P1:/dev/sda1
* P2:/dev/sda2
* L1:/dev/sda5
* L2:/dev/sda6
* L3:/dev/sda7
* L4:/dev/sda8
* L5:/dev/sda9
仔細看看,怎么設備文件名沒有/dev/sda3與/dev/sda4呢?因為前面四個號碼都是保留給Primary或Extended用的嘛! 所以邏輯分區的設備名稱號碼就由5號開始了!這在 MBR 方式的分區表中是個很重要的特性,不能忘記喔!
MBR 主要分區、延伸分區與邏輯分區的特性我們作個簡單的定義啰:
* 主要分區與延伸分區最多可以有四筆(硬盤的限制)
* 延伸分區最多只能有一個(操作系統的限制)
* 邏輯分區是由延伸分區持續切割出來的分區;
* 能夠被格式化后,作為數據存取的分區為主要分區與邏輯分區。延伸分區無法格式化;
* 邏輯分區的數量依操作系統而不同,在Linux系統中SATA硬盤已經可以突破63個以上的分區限制;
事實上,分區是個很麻煩的東西,因為他是以柱面為單位的“連續”磁盤空間, 且延伸分區又是個類似獨立的磁盤空間,所以在分區的時候得要特別注意。我們舉下面的例子來解釋一下好了:
例題:在Windows操作系統當中,如果你想要將D與E盤整合成為一個新的分區,而如果有兩種分區的情況如下圖所示, 圖中的特殊顏色區塊為D與E盤的示意,請問這兩種方式是否均可將D與E整合成為一個新的分區?
圖2.2.4、磁盤空間整合示意圖答:
* 上圖可以整合:因為上圖的D與E同屬于延伸分區內的邏輯分區,因此只要將兩個分區刪除,然后再重新創建一個新的分區, 就能夠在不影響其他分區的情況下,將兩個分區的容量整合成為一個。
* 下圖不可整合:因為D與E分屬主分區與邏輯分區,兩者不能夠整合在一起。除非將延伸分區破壞掉后再重新分區。 但如此一來會影響到所有的邏輯分區,要注意的是:如果延伸分區被破壞,所有邏輯分區將會被刪除。 因為邏輯分區的信息都記錄在延伸分區里面嘛!
由于第一個扇區所記錄的分區表與MBR是這么的重要,幾乎只要讀取硬盤都會先由這個扇區先讀起。 因此,如果整顆硬盤的第一個扇區(就是MBR與partition table所在的扇區)物理實體壞掉了,那這個硬盤大概就沒有用了! 因為系統如果找不到分區表,怎么知道如何讀取柱面區間呢?您說是吧!下面還有一些例題您可以思考看看:
例題:如果我想將一顆大硬盤“暫時”分區成為四個partitions,同時還有其他的剩余容量可以讓我在未來的時候進行規劃, 我能不能分區出四個Primary?若不行,那么你建議該如何分區?答:
* 由于Primary+Extended最多只能有四個,其中Extended最多只能有一個,這個例題想要分區出四個分區且還要預留剩余容量, 因此P+P+P+P的分區方式是不適合的。因為如果使用到四個P,則即使硬盤還有剩余容量, 因為無法再繼續分區,所以剩余容量就被浪費掉了。
* 假設你想要將所有的四筆記錄都花光,那么P+P+P+E是比較適合的。所以可以用的四個partitions有3個主要及一個邏輯分區, 剩余的容量在延伸分區中。
* 如果你要分區超過4個以上時,一定要有Extended分區,而且必須將所有剩下的空間都分配給Extended, 然后再以logical的分區來規劃Extended的空間。 另外,考慮到磁盤的連續性,一般建議將Extended的柱面號碼分配在最后面的柱面內。
例題:假如我的PC有兩顆SATA硬盤,我想在第二顆硬盤分區出6個可用的分區(可以被格式化來存取數據之用), 那每個分區在Linux系統下的設備文件名為何?且分區類型各為何?至少寫出兩種不同的分區方式。答:由于P(primary)+E(extended)最多只能有四個,其中E最多只能有一個。現在題目要求6個可用的分區,因此不可能分出四個P。 下面我們假設兩種環境,一種是將前四號全部用完,一種是僅花費一個P及一個E的情況:
* P+P+P+E的環境:
圖2.2.5、分區示意圖實際可用的是/dev/sdb1, /dev/sdb2, /dev/sdb3, /dev/sdb5, /dev/sdb6, /dev/sdb7這六個,至于/dev/sdb4這個延伸分區本身僅是提供來給邏輯分區創建之用。
* P+E的環境:
圖2.2.6、分區示意圖注意到了嗎?因為1~4號是保留給主要/延伸分區的,因此第一個邏輯分區一定是由5號開始的!再次強調啊! 所以/dev/sdb3, /dev/sdb4就會被保留下來沒有用到了!
MBR 分區表除了上述的主分區、延伸分區、邏輯分區需要注意之外,由于每組分區表僅有 16Bytes 而已,因此可紀錄的信息真的是相當有限的! 所以,在過去 MBR 分區表的限制中經常可以發現如下的問題:
* 操作系統無法抓取到 2.2T 以上的磁盤容量!
* MBR 僅有一個區塊,若被破壞后,經常無法或很難救援。
* MBR 內的存放開機管理程序的區塊僅 446Bytes,無法容納較多的程序碼。
這個 2.2TB 限制的現象在早期并不會很嚴重。但是,近年來硬盤廠商動不對推出的磁盤容量就高達好幾個 TB 的容量!目前 (2015) 單一磁盤最大容量甚至高達 8TB 了! 如果使用磁盤陣列的系統,像鳥哥的一組系統中,用了 24 顆 4TB 磁盤搭建出磁盤陣列,那在 Linux 下面就會看到有一顆 70TB 左右的磁盤! 如果使用 MBR 的話...那得要 2TB/2TB 的割下去,雖然 Linux kernel 現在已經可以通過某些機制讓磁盤分區高過 63 個以上,但是這樣就得要割出將近 40 個分區~ 真要命... 為了解決這個問題,所以后來就有 GPT 這個磁盤分區的格式出現了!
* GUID partition table, GPT 磁盤分區表[[1]](#ps1)
因為過去一個扇區大小就是 512Bytes 而已,不過目前已經有 4K 的扇區設計出現!為了相容于所有的磁盤,因此在扇區的定義上面, 大多會使用所謂的邏輯區塊位址(Logical Block Address, LBA)來處理。GPT 將磁盤所有區塊以此 LBA(默認為 512Bytes 喔!) 來規劃,而第一個 LBA 稱為 LBA0 (從 0 開始編號)。
與 MBR 僅使用第一個 512Bytes 區塊來紀錄不同, GPT 使用了 34 個 LBA 區塊來紀錄分區信息!同時與過去 MBR 僅有一的區塊,被干掉就死光光的情況不同, GPT 除了前面 34 個 LBA 之外,整個磁盤的最后 33 個 LBA 也拿來作為另一個備份!這樣或許會比較安全些吧!詳細的結構有點像下面的模樣:
圖2.2.7、GPT 分區表的結構示意圖
上述圖示的解釋說明如下:
* LBA0 (MBR 相容區塊)
與 MBR 模式相似的,這個相容區塊也分為兩個部份,一個就是跟之前 446 Bytes 相似的區塊,儲存了第一階段的開機管理程序! 而在原本的分區表的紀錄區內,這個相容模式僅放入一個特殊標志的分區,用來表示此磁盤為 GPT 格式之意。而不懂 GPT 分區表的磁盤管理程序, 就不會認識這顆磁盤,除非用戶有特別要求要處理這顆磁盤,否則該管理軟件不能修改此分區信息,進一步保護了此磁盤喔!
* LBA1 (GPT 表頭紀錄)
這個部份紀錄了分區表本身的位置與大小,同時紀錄了備份用的 GPT 分區 (就是前面談到的在最后 34 個 LBA 區塊) 放置的位置, 同時放置了分區表的檢驗機制碼 (CRC32),操作系統可以根據這個檢驗碼來判斷 GPT 是否正確。若有錯誤,還可以通過這個紀錄區來取得備份的 GPT(磁盤最后的那個備份區塊) 來恢復 GPT 的正常運行!
* LBA2-33 (實際紀錄分區信息處)
從 LBA2 區塊開始,每個 LBA 都可以紀錄 4 筆分區紀錄,所以在默認的情況下,總共可以有 4*32 = 128 筆分區紀錄喔!因為每個 LBA 有 512Bytes,因此每筆紀錄用到 128 Bytes 的空間,除了每筆紀錄所需要的識別碼與相關的紀錄之外,GPT 在每筆紀錄中分別提供了 64bits 來記載開始/結束的扇區號碼,因此,GPT 分區表對於單一分區來說, 他的最大容量限制就會在“ 264 * 512Bytes = 263 * 1KBytes = 233*TB = 8 ZB ”,要注意 1ZB = 230TB 啦! 你說有沒有夠大了?
現在 GPT 分區默認可以提供多達 128 筆紀錄,而在 Linux 本身的核心設備紀錄中,針對單一磁盤來說,雖然過去最多只能到達 15 個分區,不過由于 Linux kernel 通過 udev 等方式的處理,現在 Linux 也已經沒有這個限制在了! 此外,GPT 分區已經沒有所謂的主、延伸、邏輯分區的概念,既然每筆紀錄都可以獨立存在, 當然每個都可以視為是主分區!每一個分區都可以拿來格式化使用喔!

**Tips** 鳥哥一直以為核心認識的設備主要/次要號碼就一定是連續的,因此一直沒有注意到由于新的機制的關系,分區已經可以突破核心限制的狀況! 感謝大陸網友微博代號“學習日記博客”的提醒!此外,為了查詢正確性,鳥哥還真的有注意到網絡上有朋友實際拿一顆磁盤分區出 130 個以上的分區, 結果他發現 120 個以前的分區均可以格式化使用,但是 130 之后的似乎不太能夠使用了!或許跟默認的 GPT 共 128 個號碼有關!
雖然新版的 Linux 大多認識了 GPT 分區表,沒辦法,我們 server 常常需要比較大容量的磁盤嘛!不過,在磁盤管理工具上面, fdisk 這個老牌的軟件并不認識 GPT 喔!要使用 GPT 的話,得要操作類似 gdisk 或者是 parted 指令才行!這部份我們會在第二篇再來談一談。 另外,開機管理程序方面, grub 第一版并不認識 GPT 喔!得要 grub2 以后才會認識的!開機管理程序這部份則第五篇再來談喔!
并不是所有的操作系統都可以讀取到 GPT 的磁盤分區格式喔!同時,也不是所有的硬件都可以支持 GPT 格式喔!是否能夠讀寫 GPT 格式又與開機的檢測程序有關! 那開機的檢測程序又分成啥鬼東西呢?就是 BIOS 與 UEFI 啦!那這兩個又是啥東西?就讓我們來聊一聊!
### 2.2.3 開機流程中的 BIOS 與 UEFI 開機檢測程序
我們在[計算機概論](../Text/index.html)里面談到了,沒有執行軟件的硬件是沒有用的,除了會電人之外..., 而為了計算機硬件系統的資源合理分配,因此有了操作系統這個系統軟件的產生。由于操作系統會控制所有的硬件并且提供核心功能, 因此我們的計算機就能夠認識硬盤內的文件系統,并且進一步的讀取硬盤內的軟件文件與執行該軟件來達成各項軟件的執行目的。
問題是,你有沒有發現,既然操作系統也是軟件,那么我的計算機又是如何認識這個操作系統軟件并且執行他的? 明明開機時我的計算機還沒有任何軟件系統,那他要如何讀取硬盤內的操作系統文件啊?嘿嘿!這就得要牽涉到計算機的開機程序了! 下面就讓我們來談一談這個開機程序吧!
基本上,目前的主機系統在載入硬件驅動方面的程序,主要有早期的 BIOS 與新的 UEFI 兩種機制,我們分別來談談啰!
* BIOS 搭配 MBR/GPT 的開機流程
在[計算機概論](../Text/index.html)里面我們有談到那個可愛的BIOS與CMOS兩個東西, CMOS是記錄各項硬件參數且嵌入在主板上面的儲存器,BIOS則是一個寫入到主板上的一個固件(再次說明, 固件就是寫入到硬件上的一個軟件程序)。這個BIOS就是在開機的時候,計算機系統會主動執行的第一個程序了!
接下來BIOS會去分析計算機里面有哪些儲存設備,我們以硬盤為例,BIOS會依據使用者的設置去取得能夠開機的硬盤, 并且到該硬盤里面去讀取第一個扇區的MBR位置。 MBR這個僅有446 Bytes的硬盤容量里面會放置最基本的開機管理程序, 此時BIOS就功成圓滿,而接下來就是MBR內的開機管理程序的工作了。
這個開機管理程序的目的是在載入(load)核心文件, 由于開機管理程序是操作系統在安裝的時候所提供的,所以他會認識硬盤內的文件系統格式,因此就能夠讀取核心文件, 然后接下來就是核心文件的工作,開機管理程序與 BIOS 也功成圓滿,將之后的工作就交給大家所知道的操作系統啦!
簡單的說,整個開機流程到操作系統之前的動作應該是這樣的:
1. BIOS:開機主動執行的固件,會認識第一個可開機的設備;
2. MBR:第一個可開機設備的第一個扇區內的主要開機記錄區塊,內含開機管理程序;
3. 開機管理程序(boot loader):一支可讀取核心文件來執行的軟件;
4. 核心文件:開始操作系統的功能...
第二點要注意,如果你的分區表為 GPT 格式的話,那么 BIOS 也能夠從 LBA0 的 MBR 相容區塊讀取第一階段的開機管理程序碼, 如果你的開機管理程序能夠認識 GPT 的話,那么使用 BIOS 同樣可以讀取到正確的操作系統核心喔!換句話說, 如果開機管理程序不懂 GPT ,例如 Windows XP 的環境,那自然就無法讀取核心文件,開機就失敗了!

**Tips** 由于 LBA0 僅提供第一階段的開機管理程序碼,因此如果你使用類似 grub 的開機管理程序的話,那么就得要額外分區出一個“ BIOS boot ”的分區, 這個分區才能夠放置其他開機過程所需的程序碼!在 CentOS 當中,這個分區通常占用 2MB 左右而已。
由上面的說明我們會知道,BIOS與MBR都是硬件本身會支持的功能,至于Boot loader則是操作系統安裝在MBR上面的一套軟件了。由于MBR僅有446 Bytes而已,因此這個開機管理程序是非常小而美的。 這個boot loader的主要任務有下面這些項目:
* 提供菜單:使用者可以選擇不同的開機項目,這也是多重開機的重要功能!
* 載入核心文件:直接指向可開機的程序區段來開始操作系統;
* 轉交其他loader:將開機管理功能轉交給其他loader負責。
上面前兩點還容易理解,但是第三點很有趣喔!那表示你的計算機系統里面可能具有兩個以上的開機管理程序呢! 有可能嗎?我們的硬盤不是只有一個MBR而已?是沒錯啦!但是開機管理程序除了可以安裝在MBR之外, 還可以安裝在每個分區的開機扇區(boot sector)喔!瞎密?分區還有各別的開機扇區喔? 沒錯啊!這個特色才能造就“多重開機”的功能啊!
我們舉一個例子來說,假設你的個人計算機只有一個硬盤,里面切成四個分區,其中第一、二分區分別安裝了Windows及Linux, 你要如何在開機的時候選擇用Windows還是Linux開機呢?假設MBR內安裝的是可同時認識Windows/Linux操作系統的開機管理程序, 那么整個流程可以圖示如下:
圖2.2.8、開機管理程序的工作執行示意圖
在上圖中我們可以發現,MBR的開機管理程序提供兩個菜單,菜單一(M1)可以直接載入Windows的核心文件來開機; 菜單二(M2)則是將開機管理工作交給第二個分區的開機扇區(boot sector)。當使用者在開機的時候選擇菜單二時, 那么整個開機管理工作就會交給第二分區的開機管理程序了。 當第二個開機管理程序啟動后,該開機管理程序內(上圖中)僅有一個開機菜單,因此就能夠使用Linux的核心文件來開機啰。 這就是多重開機的工作情況啦!我們將上圖作個總結:
* 每個分區都擁有自己的開機扇區(boot sector)
* 圖中的系統盤為第一及第二分區,
* 實際可開機的核心文件是放置到各分區內的!
* loader只會認識自己的系統盤內的可開機核心文件,以及其他loader而已;
* loader可直接指向或者是間接將管理權轉交給另一個管理程序。
那現在請你想一想,為什么人家常常說:“如果要安裝多重開機, 最好先安裝Windows再安裝Linux”呢?這是因為:
* Linux在安裝的時候,你可以選擇將開機管理程序安裝在MBR或各別分區的開機扇區, 而且Linux的loader可以手動設置菜單(就是上圖的M1, M2...),所以你可以在Linux的boot loader里面加入Windows開機的選項;
* Windows在安裝的時候,他的安裝程序會主動的覆蓋掉MBR以及自己所在分區的開機扇區,你沒有選擇的機會, 而且他沒有讓我們自己選擇菜單的功能。
因此,如果先安裝Linux再安裝Windows的話,那MBR的開機管理程序就只會有Windows的項目,而不會有Linux的項目 (因為原本在MBR內的Linux的開機管理程序就會被覆蓋掉)。 那需要重新安裝Linux一次嗎?當然不需要,你只要用盡各種方法來處理MBR的內容即可。 例如利用Linux的救援模式來挽救MBR啊!

**Tips** 開機管理程序與Boot sector的觀念是非常重要的,我們會在[第十九章](../Text/index.html)分別介紹,您在這里只要先對于(1)開機需要開機管理程序, 而(2)開機管理程序可以安裝在MBR及Boot Sector兩處這兩個觀念有基本的認識即可, 一開始就背太多東西會很混亂啦!
* UEFI BIOS 搭配 GPT 開機的流程 [[2]](#ps2)
我們現在知道 GPT 可以提供到 64bit 的尋址,然后也能夠使用較大的區塊來處理開機管理程序。但是 BIOS 其實不懂 GPT 耶!還得要通過 GPT 提供相容模式才能夠讀寫這個磁盤設備~而且 BIOS 僅為 16 位的程序,在與現階段新的操作系統接軌方面有點弱掉了! 為了解決這個問題,因此就有了 UEFI (Unified Extensible Firmware Interface) 這個統一可延伸固件界面的產生。
UEFI 主要是想要取代 BIOS 這個固件界面,因此我們也稱 UEFI 為 UEFI BIOS 就是了。UEFI 使用 C 程序語言,比起使用組合語言的傳統 BIOS 要更容易開發!也因為使用 C 語言來撰寫,因此如果開發者夠厲害,甚至可以在 UEFI 開機階段就讓該系統了解 TCP/IP 而直接上網! 根本不需要進入操作系統耶!這讓小型系統的開發充滿各式各樣的可能性!
基本上,傳統 BIOS 與 UEFI 的差異可以用T客幫雜志匯整的表格來說明:
| 比較項目 | 傳統 BIOS | UEFI |
| --- | --- | --- |
| 使用程序語言 | 組合語言 | C 語言 |
| 硬件資源控制 | 使用中斷 (IRQ) 管理 不可變的內存存取 不可變得輸入/輸出存取 | 使用驅動程序與協定 |
| 處理器運行環境 | 16 位 | CPU 保護模式 |
| 擴充方式 | 通過 IRQ 鏈接 | 直接載入驅動程序 |
| 第三方廠商支持 | 較差 | 較佳且可支持多平臺 |
| 圖形化能力 | 較差 | 較佳 |
| 內置簡化操作系統前環境 | 不支持 | 支持 |
從上頭我們可以發現,與傳統的 BIOS 不同,UEFI 簡直就像是一個低階的操作系統~甚至于連主板上面的硬件資源的管理, 也跟操作系統相當類似,只需要載入驅動程序即可控制操作。同時由于程控得宜,一般來說,使用 UEFI 接口的主機,在開機的速度上要比 BIOS 來的快上許多! 因此很多人都覺得 UEFI 似乎可以發展成為一個很有用的操作系統耶~不過,關于這個,你無須擔心未來除了 Linux 之外,還得要增加學一個 UEFI 的操作系統啦!為啥呢?
UEFI 當初在發展的時候,就制定一些控制在里頭,包括硬件資源的管理使用輪詢 (polling) 的方式來管理,與 BIOS 直接了解 CPU 以中斷的方式來管理比較, 這種 polling 的效率是稍微慢一些的,另外,UEFI 并不能提供完整的高速緩存功能,因此執行效率也沒有辦法提升。不過由于載入所有的 UEFI 驅動程序之后, 系統會打開一個類似操作系統的 shell 環境,使用者可以此環境中執行任意的 UEFI 應用程序,而且效果比 MSDOS 更好哩。
所以啰,因為效果華麗但性能不佳,因此這個 UEFI 大多用來作為啟動操作系統之前的硬件檢測、開機管理、軟件設置等目的,基本上是比較難的。 同時,當載入操作系統后,一般來說,UEFI 就會停止工作,并將系統交給操作系統,這與早期的 BIOS 差異不大。比較特別的是,某些特定的環境下, 這些 UEFI 程序是可以部份繼續執行的,以協助某些操作系統無法找到特定設備時,該設備還是可以持續運行。
此外,由于過去 cracker 經常借由 BIOS 開機階段來破壞系統,并取得系統的控制權,因此 UEFI 加入了一個所謂的安全啟動 (secure boot) 機制, 這個機制代表著即將開機的操作系統必須要被 UEFI 所驗證,否則就無法順利開機!微軟用了很多這樣的機制來管理硬件。 不過加入這個機制后,許多的操作系統,包括 Linux ,就很有可能無法順利開機喔!所以,某些時刻,你可能得要將 UEFI 的 secure boot 功能關閉, 才能夠順利的進入 Linux 哩! (這一點讓自由軟件工作者相當感冒啦!)
另外,與 BIOS 模式相比,雖然 UEFI 可以直接取得 GPT 的分區表,不過最好依舊擁有 BIOS boot 的分區支持, 同時,為了與 windows 相容,并且提供其他第三方廠商所使用的 UEFI 應用程序儲存的空間,你必須要格式化一個 vfat 的文件系統, 大約提供 512MB 到 1G 左右的容量,以讓其他 UEFI 執行較為方便。

**Tips** 由于 UEFI 已經克服了 BIOS 的 1024 柱面的問題,因此你的開機管理程序與核心可以放置在磁盤開始的前 2TB 位置內即可!加上之前提到的 BIOS boot 以及 UEFI 支持的分區,基本上你的 /boot 目錄幾乎都是 /dev/sda3 之后的號碼了!這樣開機還是沒有問題的!所以要注意喔!與以前熟悉的分區狀況已經不同, /boot 不再是 /dev/sda1 啰!很有趣吧!
### 2.2.4 Linux安裝模式下,磁盤分區的選擇(極重要)
在 windows 系統重灌之前,你可能都會事先考慮,到底系統盤 C 盤要有多少容量?而數據碟 D 盤又要給多大容量等等, 然后實際安裝的時候,你會發現到其實 C 盤之前會有個 100MB 的分區被獨立出來~所以實際上你就會有三個分區就是了。那 Linux 下面又該如何設計類似的東西呢?
* 目錄樹結構 (directory tree)
我們前面有談過Linux內的所有數據都是以文件的形態來呈現的,所以啰,整個Linux系統最重要的地方就是在于目錄樹架構。 所謂的目錄樹架構(directory tree)就是以根目錄為主,然后向下呈現分支狀的目錄結構的一種文件架構。 所以,整個目錄樹架構最重要的就是那個根目錄(root directory),這個根目錄的表示方法為一條斜線“**/**”, 所有的文件都與目錄樹有關。目錄樹的呈現方式如下圖所示:
圖2.2.9、目錄樹相關性示意圖
如上圖所示,所有的文件都是由根目錄(/)衍生來的,而次目錄之下還能夠有其他的數據存在。上圖中長方形為目錄, 波浪形則為文件。那當我們想要取得mydata那個文件時,系統就得由根目錄開始找,然后找到home接下來找到dmtsai, 最終的文件名為:/home/dmtsai/mydata的意思。
我們現在知道整個Linux系統使用的是目錄樹架構,但是我們的文件數據其實是放置在磁盤分區當中的, 現在的問題是“如何結合目錄樹的架構與磁盤內的數據”呢? 這個時候就牽扯到“掛載(mount)”的問題啦!
* 文件系統與目錄樹的關系(掛載)
所謂的“掛載”就是利用一個目錄當成進入點,將磁盤分區的數據放置在該目錄下; 也就是說,進入該目錄就可以讀取該分區的意思。這個動作我們稱為“掛載”,那個進入點的目錄我們稱為“掛載點”。 由于整個Linux系統最重要的是根目錄,因此根目錄一定需要掛載到某個分區的。 至于其他的目錄則可依使用者自己的需求來給予掛載到不同的分區。我們以下圖來作為一個說明:
圖2.2.10、目錄樹與分區之間的相關性
上圖中假設我的硬盤分為兩個分區,partition 1是掛載到根目錄,至于partition 2則是掛載到/home這個目錄。 這也就是說,當我的數據放置在/home內的各次目錄時,數據是放置到partition 2的,如果不是放在/home下面的目錄, 那么數據就會被放置到partition 1了!

**Tips** windows 也是用掛載的觀念啊!鳥哥上課經常談到的范例就是,當你拿 USB 磁盤放置到你的 windows 時,系統會偵測到一個 F 盤好了, 那你想要讀取 USB 的數據,要去哪里啊?當然就去 F 啰!同樣的這顆 USB,當你拿到學校的 windows 時,卻顯示的是 H 盤好了, 那你要讀取 USB 的數據還是去 F 盤嗎?當然不是,你會去 H 盤啊!這個“設備與磁盤分區對應的關系,就是 windows 概念下的掛載”啦! 這樣說,有沒有比較好理解?
其實判斷某個文件在那個partition下面是很簡單的,通過反向追蹤即可。以上圖來說, 當我想要知道/home/vbird/test這個文件在哪個partition時,由test --> vbird --> home --> /,看那個“進入點”先被查到那就是使用的進入點了。 所以test使用的是/home這個進入點而不是/喔!
例題:現在讓我們來想一想,我的計算機系統如何讀取光盤內的數據呢?在Windows里面使用的是“光驅”的代號方式處理(假設為E盤時), 但在Linux下面我們依舊使用目錄樹喔!在默認的情況下,Linux是將光驅的數據放置到/media/cdrom里頭去的。 如果光盤片里面有個文件文件名為“我的文件”時,那么這個文件是在哪里?答:這個文件最終會在如下的完整文件名中:
* Windows: 桌面\我的計算機\E:\我的文件
* Linux: /media/cdrom/我的文件
如果光驅并非被掛載到/media/cdrom,而是掛載到/mnt這個目錄時,剛剛讀取的這個文件的文件名會變成:
* /mnt/我的文件
如果你了解這個文件名,這表示你已經知道掛載的意義了!初次接觸Linux時,這里最容易搞混,因為他與Windows的分區代號完全不一樣!
* distributions安裝時,掛載點與磁盤分區的規劃:
既然我們在Linux系統下使用的是目錄樹系統,所以安裝的時候自然就得要規劃磁盤分區與目錄樹的掛載了。 實際上,在Linux安裝的時候已經提供了相當多的默認模式讓你選擇分區的方式了, 不過,無論如何,分區的結果可能都不是很能符合自己主機的樣子!因為畢竟每個人的“想法”都不太一樣! 因此,強烈建議使用“自訂安裝, Custom ”這個安裝模式!在某些Linux distribution中,會將這個模式寫的很厲害,叫做是“Expert, 專家模式”,這個就厲害了, 請相信您自己,了解上面的說明后,就請自稱為專家了吧!沒有問題!
* 自訂安裝“Custom”:
* A:初次接觸Linux:只要分區“ / ”及“swap”即可:
通常初次安裝Linux系統的朋友們,我們都會建議他直接以一個最大的分區“ / ”來安裝系統。 這樣作有個好處,就是不怕分區錯誤造成無法安裝的困境!例如/usr是Linux的可執行程序及相關的文件擺放的目錄, 所以他的容量需求蠻大的,萬一你分區了一塊分區給/usr,但是卻給的不夠大,那么就傷腦筋了! 因為會造成無法將數據完全寫入的問題,就有可能會無法安裝啦!因此如果你是初次安裝的話, 那么可以僅分區成兩個分區“ / 與 Swap ”即可。
* B:建議分區的方法:預留一個備用的剩余磁盤容量!
在想要學習Linux的朋友中,最麻煩的可能就是得要常常處理分區的問題,因為分區是系統管理員很重要的一個任務。 但如果你將整個硬盤的容量都用光了,那么你要如何練習分區呢?^_^。所以鳥哥在后續的練習中也會這樣做, 就是請你特別預留一塊不分區的磁盤容量,作為后續練習時可以用來分區之用!
此外,預留的分區也可以拿來做為備份之用。因為我們在實際操作Linux系統的過程中, 可能會發現某些script或者是重要的文件很值得備份時,就可以使用這個剩余的容量分區出新的分區, 并使用來備份重要的配置文件或者是script。這有個最大的好處, 就是當我的Linux重新安裝的時候,我的一些軟件或工具程序馬上就可以直接在硬盤當中找到!呵呵!重新安裝比較便利啦。 為什么要重新安裝?因為沒有安裝過Linux十次以上,不要說你學會了Linux了啦!慢慢體會這句話吧! ^_^
* 選擇Linux安裝程序提供的默認硬盤分區方式:
對于首次接觸Linux的朋友們,鳥哥通常不建議使用各個distribution所提供默認的Server安裝方式, 因為會讓你無法得知Linux在搞什么鬼,而且也不見得可以符合你的需求!而且要注意的是, 選擇Server的時候,請“確定”你的硬盤數據是不再需要!因為Linux會自動的把你的硬盤里面舊有的數據全部殺掉!
現在你知道Linux為什么不好學了吧?因為很多基礎知識都得要先了解!否則連安裝都不知道怎么安裝~ 現在你知道Linux的可愛了吧!因為如果你學會了,嘿嘿!很多計算機系統/操作系統的概念都很清晰, 轉換到不同的信息跑道是比較容易的喔!^_^
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀