## 7.3 磁盤的分區、格式化、檢驗與掛載
對于一個系統管理者( root )而言,磁盤的的管理是相當重要的一環,尤其近來磁盤已經漸漸的被當成是消耗品了 ..... 如果我們想要在系統里面新增一顆磁盤時,應該有哪些動作需要做的呢:
1. 對磁盤進行分區,以創建可用的 partition ;
2. 對該 partition 進行格式化 (format),以創建系統可用的 filesystem;
3. 若想要仔細一點,則可對剛剛創建好的 filesystem 進行檢驗;
4. 在 Linux 系統上,需要創建掛載點 (亦即是目錄),并將他掛載上來;
當然啰,在上述的過程當中,還有很多需要考慮的,例如磁盤分區 (partition) 需要定多大? 是否需要加入 journal 的功能?inode 與 block 的數量應該如何規劃等等的問題。但是這些問題的決定, 都需要與你的主機用途來加以考慮的~所以,在這個小節里面,鳥哥僅會介紹幾個動作而已, 更詳細的設置值,則需要以你未來的經驗來參考啰!
### 7.3.1 觀察磁盤分區狀態
由于目前磁盤分區主要有 MBR 以及 GPT 兩種格式,這兩種格式所使用的分區工具不太一樣!你當然可以使用本章預計最后才介紹的 [parted](../Text/index.html#parted) 這個通通有支持的工具來處理,不過,我們還是比較習慣使用 fdisk 或者是 gdisk 來處理分區啊!因此,我們自然就得要去找一下目前系統有的磁盤有哪些? 這些磁盤是 MBR 還是 GPT 等等的!這樣才能處理啦!
* lsblk 列出系統上的所有磁盤列表
lsblk 可以看成“ list block device ”的縮寫,就是列出所有儲存設備的意思!這個工具軟件真的很好用喔!來瞧一瞧!
```
[root@study ~]# lsblk [-dfimpt] [device]
選項與參數:
-d :僅列出磁盤本身,并不會列出該磁盤的分區數據
-f :同時列出該磁盤內的文件系統名稱
-i :使用 ASCII 的線段輸出,不要使用復雜的編碼 (再某些環境下很有用)
-m :同時輸出該設備在 /dev 下面的權限數據 (rwx 的數據)
-p :列出該設備的完整文件名!而不是僅列出最后的名字而已。
-t :列出該磁盤設備的詳細數據,包括磁盤佇列機制、預讀寫的數據量大小等
范例一:列出本系統下的所有磁盤與磁盤內的分區信息
[root@study ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 40G 0 disk # 一整顆磁盤
|-vda1 252:1 0 2M 0 part
|-vda2 252:2 0 1G 0 part /boot
`-vda3 252:3 0 30G 0 part
|-centos-root 253:0 0 10G 0 lvm / # 在 vda3 內的其他文件系統
|-centos-swap 253:1 0 1G 0 lvm [SWAP]
`-centos-home 253:2 0 5G 0 lvm /home
```
從上面的輸出我們可以很清楚的看到,目前的系統主要有個 sr0 以及一個 vda 的設備,而 vda 的設備下面又有三個分區, 其中 vda3 甚至還有因為 LVM 產生的文件系統!相當的完整吧!從范例一我們來談談默認輸出的信息有哪些。
* NAME:就是設備的文件名啰!會省略 /dev 等前導目錄!
* MAJ:MIN:其實核心認識的設備都是通過這兩個代碼來熟悉的!分別是主要:次要設備代碼!
* RM:是否為可卸載設備 (removable device),如光盤、USB 磁盤等等
* SIZE:當然就是容量啰!
* RO:是否為只讀設備的意思
* TYPE:是磁盤 (disk)、分區 (partition) 還是只讀存儲器 (rom) 等輸出
* MOUTPOINT:就是前一章談到的掛載點!
```
范例二:僅列出 /dev/vda 設備內的所有數據的完整文件名
[root@study ~]# lsblk -ip /dev/vda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/vda 252:0 0 40G 0 disk
|-/dev/vda1 252:1 0 2M 0 part
|-/dev/vda2 252:2 0 1G 0 part /boot
`-/dev/vda3 252:3 0 30G 0 part
|-/dev/mapper/centos-root 253:0 0 10G 0 lvm /
|-/dev/mapper/centos-swap 253:1 0 1G 0 lvm [SWAP]
`-/dev/mapper/centos-home 253:2 0 5G 0 lvm /home # 完整的文件名,由 / 開始寫
```
* blkid 列出設備的 UUID 等參數
雖然 lsblk 已經可以使用 -f 來列出文件系統與設備的 UUID 數據,不過,鳥哥還是比較習慣直接使用 blkid 來找出設備的 UUID 喔! 什么是 UUID 呢?UUID 是全域單一識別碼 (universally unique identifier),Linux 會將系統內所有的設備都給予一個獨一無二的識別碼, 這個識別碼就可以拿來作為掛載或者是使用這個設備/文件系統之用了。
```
[root@study ~]# blkid
/dev/vda2: UUID="94ac5f77-cb8a-495e-a65b-2ef7442b837c" TYPE="xfs"
/dev/vda3: UUID="WStYq1-P93d-oShM-JNe3-KeDl-bBf6-RSmfae" TYPE="LVM2_member"
/dev/sda1: UUID="35BC-6D6B" TYPE="vfat"
/dev/mapper/centos-root: UUID="299bdc5b-de6d-486a-a0d2-375402aaab27" TYPE="xfs"
/dev/mapper/centos-swap: UUID="905dc471-6c10-4108-b376-a802edbd862d" TYPE="swap"
/dev/mapper/centos-home: UUID="29979bf1-4a28-48e0-be4a-66329bf727d9" TYPE="xfs"
```
如上所示,每一行代表一個文件系統,主要列出設備名稱、UUID 名稱以及文件系統的類型 (TYPE)!這對于管理員來說,相當有幫助! 對于系統上面的文件系統觀察來說,真是一目了然!
* parted 列出磁盤的分區表類型與分區信息
雖然我們已經知道了系統上面的所有設備,并且通過 blkid 也知道了所有的文件系統!不過,還是不清楚磁盤的分區類型。 這時我們可以通過簡單的 parted 來輸出喔!我們這里僅簡單的利用他的輸出而已~本章最后才會詳細介紹這個指令的用法的!
```
[root@study ~]# parted device_name print
范例一:列出 /dev/vda 磁盤的相關數據
[root@study ~]# parted /dev/vda print
Model: Virtio Block Device (virtblk) # 磁盤的模塊名稱(廠商)
Disk /dev/vda: 42.9GB # 磁盤的總容量
Sector size (logical/physical): 512B/512B # 磁盤的每個邏輯/物理扇區容量
Partition Table: gpt # 分區表的格式 (MBR/GPT)
Disk Flags: pmbr_boot
Number Start End Size File system Name Flags # 下面才是分區數據
1 1049kB 3146kB 2097kB bios_grub
2 3146kB 1077MB 1074MB xfs
3 1077MB 33.3GB 32.2GB lvm
```
看到上表的說明,你就知道啦!我們用的就是 GPT 的分區格式喔!這樣會觀察磁盤分區了嗎?接下來要來操作磁盤分區了喔!
### 7.3.2 磁盤分區: gdisk/fdisk
接下來我們想要進行磁盤分區啰!要注意的是:“MBR 分區表請使用 fdisk 分區, GPT 分區表請使用 gdisk 分區!” 這個不要搞錯~否則會分區失敗的!另外,這兩個工具軟件的操作很類似,執行了該軟件后,可以通過該軟件內部的說明數據來操作, 因此不需要硬背!只要知道方法即可。剛剛從上面 [parted](../Text/index.html#parted1) 的輸出結果,我們也知道鳥哥這個測試機使用的是 GPT 分區, 因此下面通通得要使用 gdisk 來分區才行!
* gdisk
```
[root@study ~]# gdisk 設備名稱
范例:由前一小節的 lsblk 輸出,我們知道系統有個 /dev/vda,請觀察該磁盤的分區與相關數據
[root@study ~]# gdisk /dev/vda <==仔細看,不要加上數字喔!
GPT fdisk (gdisk) version 0.8.6
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT. <==找到了 GPT 的分區表!
Command (? for help): <==這里可以讓你輸入指令動作,可以按問號 (?) 來查看可用指令
Command (? for help): ?
b back up GPT data to a file
c change a partition's name
d delete a partition # 刪除一個分區
i show detailed information on a partition
l list known partition types
n add a new partition # 增加一個分區
o create a new empty GUID partition table (GPT)
p print the partition table # 印出分區表 (常用)
q quit without saving changes # 不儲存分區就直接離開 gdisk
r recovery and transformation options (experts only)
s sort partitions
t change a partition's type code
v verify disk
w write table to disk and exit # 儲存分區操作后離開 gdisk
x extra functionality (experts only)
? print this menu
Command (? for help):
```
你應該要通過 lsblk 或 blkid 先找到磁盤,再用 parted /dev/xxx print 來找出內部的分區表類型,之后才用 gdisk 或 fdisk 來操作系統。 上表中可以發現 gdisk 會掃描 MBR 與 GPT 分區表,不過這個軟件還是單純使用在 GPT 分區表比較好啦!
老實說,使用 gdisk 這支程序是完全不需要背指令的!如同上面的表格中,你只要按下 ? 就能夠看到所有的動作! 比較重要的動作在上面已經用底線畫出來了,你可以參考看看。其中比較不一樣的是“q 與 w”這兩個玩意兒! 不管你進行了什么動作,只要離開 gdisk 時按下“q”,那么所有的動作“都不會生效!”相反的, 按下“w”就是動作生效的意思。所以,你可以隨便玩 gdisk ,只要離開時按下的是“q”即可。 ^_^! 好了,先來看看分區表信息吧!
```
Command (? for help): p <== 這里可以輸出目前磁盤的狀態
Disk /dev/vda: 83886080 sectors, 40.0 GiB # 磁盤文件名/扇區數與總容量
Logical sector size: 512 Bytes # 單一扇區大小為 512 Bytes
Disk identifier (GUID): A4C3C813-62AF-4BFE-BAC9-112EBD87A483 # 磁盤的 GPT 識別碼
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 83886046
Partitions will be aligned on 2048-sector boundaries
Total free space is 18862013 sectors (9.0 GiB)
Number Start (sector) End (sector) Size Code Name # 下面為完整的分區信息了!
1 2048 6143 2.0 MiB EF02 # 第一個分區數據
2 6144 2103295 1024.0 MiB 0700
3 2103296 65026047 30.0 GiB 8E00
# 分區編號 開始扇區號碼 結束扇區號碼 容量大小
Command (? for help): q
# 想要不儲存離開嗎?按下 q 就對了!不要隨便按 w 啊!
```
使用“ p ”可以列出目前這顆磁盤的分區表信息,這個信息的上半部在顯示整體磁盤的狀態。 以鳥哥這顆磁盤為例,這個磁盤共有 40GB 左右的容量,共有 83886080 個扇區,每個扇區的容量為 512Bytes。 要注意的是,現在的分區主要是以扇區為最小的單位喔!
下半部的分區表信息主要在列出每個分區的個別信息項目。每個項目的意義為:
* Number:分區編號,1 號指的是 /dev/vda1 這樣計算。
* Start (sector):每一個分區的開始扇區號碼位置
* End (sector):每一個分區的結束扇區號碼位置,與 start 之間可以算出分區的總容量
* Size:就是分區的容量了
* Code:在分區內的可能的文件系統類型。Linux 為 8300,swap 為 8200。不過這個項目只是一個提示而已,不見得真的代表此分區內的文件系統喔!
* Name:文件系統的名稱等等。
從上表我們可以發現幾件事情:
* 整部磁盤還可以進行額外的分區,因為最大扇區為 83886080,但只使用到 65026047 號而已;
* 分區的設計中,新分區通常選用上一個分區的結束扇區號碼數加 1 作為起始扇區號碼!
這個 gdisk 只有 root 才能執行,此外,請注意,使用的“設備文件名”請不要加上數字,因為 partition 是針對“整個磁盤設備”而不是某個 partition 呢!所以執行“ gdisk /dev/vda1 ” 就會發生錯誤啦!要使用 gdisk /dev/vda 才對!

**Tips** 再次強調,你可以使用 gdisk 在您的磁盤上面胡搞瞎搞的進行實際操作,都不打緊,但是請“千萬記住,不要按下 w 即可!”離開的時候按下 q 就萬事無妨啰! 此外,不要在 MBR 分區上面使用 gdisk,因為如果指令按錯,恐怕你的分區紀錄會全部死光光!也不要在 GPT 上面使用 fdisk 啦!切記切記!
* 用 gdisk 新增分區
如果你是按照鳥哥建議的方式去安裝你的 CentOS 7,那么你的磁盤應該會預留一塊容量來做練習的。如果沒有的話, 那么你可能需要找另外一顆磁盤來讓你練習才行呦!而經過上面的觀察,我們也確認系統還有剩下的容量可以來操作練習分區! 假設我需要有如下的分區需求:
* 1GB 的 xfs 文件系統 (Linux)
* 1GB 的 vfat 文件系統 (Windows)
* 0.5GB 的 swap (Linux swap)(這個分區等一下會被刪除喔!)
那就來處理處理!
```
[root@study ~]# gdisk /dev/vda
Command (? for help): p
Number Start (sector) End (sector) Size Code Name
1 2048 6143 2.0 MiB EF02
2 6144 2103295 1024.0 MiB 0700
3 2103296 65026047 30.0 GiB 8E00
# 找出最后一個 sector 的號碼是很重要的!
Command (? for help): ? # 查一下增加分區的指令為何
Command (? for help): n # 就是這個!所以開始新增的行為!
Partition number (4-128, default 4): 4 # 默認就是 4 號,所以也能 enter 即可!
First sector (34-83886046, default = 65026048) or {+-}size{KMGTP}: 65026048 # 也能 enter
Last sector (65026048-83886046, default = 83886046) or {+-}size{KMGTP}: +1G # 決不要 enter
# 這個地方可有趣了!我們不需要自己去計算扇區號碼,通過 +容量 的這個方式,
# 就可以讓 gdisk 主動去幫你算出最接近你需要的容量的扇區號碼喔!
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): # 使用默認值即可~直接 enter 下去!
# 這里在讓你選擇未來這個分區預計使用的文件系統!默認都是 Linux 文件系統的 8300 啰!
Command (? for help): p
Number Start (sector) End (sector) Size Code Name
1 2048 6143 2.0 MiB EF02
2 6144 2103295 1024.0 MiB 0700
3 2103296 65026047 30.0 GiB 8E00
4 65026048 67123199 1024.0 MiB 8300 Linux filesystem
```
重點在“ Last sector ”那一行,那行絕對不要使用默認值!因為默認值會將所有的容量用光!因此它默認選擇最大的扇區號碼! 因為我們僅要 1GB 而已,所以你得要加上 +1G 這樣即可!不需要計算 sector 的數量,gdisk 會根據你填寫的數值, 直接計算出最接近該容量的扇區數!每次新增完畢后,請立即“ p ”查看一下結果喔!請繼續處理后續的兩個分區! 最終出現的畫面會有點像下面這樣才對!
```
Command (? for help): p
Number Start (sector) End (sector) Size Code Name
1 2048 6143 2.0 MiB EF02
2 6144 2103295 1024.0 MiB 0700
3 2103296 65026047 30.0 GiB 8E00
4 65026048 67123199 1024.0 MiB 8300 Linux filesystem
5 67123200 69220351 1024.0 MiB 0700 Microsoft basic data
6 69220352 70244351 500.0 MiB 8200 Linux swap
```
基本上,幾乎都用默認值,然后通過 +1G, +500M 來創建所需要的另外兩個分區!比較有趣的是文件系統的 ID 啦!一般來說, Linux 大概都是 8200/8300/8e00 等三種格式, Windows 幾乎都用 0700 這樣,如果忘記這些數字,可以在 gdisk 內按下:“ L ”來顯示喔! 如果一切的分區狀態都正常的話,那么就直接寫入磁盤分區表吧!
```
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/vda.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
# gdisk 會先警告你可能的問題,我們確定分區是對的,這時才按下 y !不過怎么還有警告?
# 這是因為這顆磁盤目前正在使用當中,因此系統無法立即載入新的分區表~
[root@study ~]# cat /proc/partitions
major minor #blocks name
252 0 41943040 vda
252 1 2048 vda1
252 2 1048576 vda2
252 3 31461376 vda3
253 0 10485760 dm-0
253 1 1048576 dm-1
253 2 5242880 dm-2
# 你可以發現,并沒有 vda4, vda5, vda6 喔!因為核心還沒有更新!
```
因為 Linux 此時還在使用這顆磁盤,為了擔心系統出問題,所以分區表并沒有被更新喔!這個時候我們有兩個方式可以來處理! 其中一個是重新開機,不過很討厭!另外一個則是通過 partprobe 這個指令來處理即可!
* partprobe 更新 Linux 核心的分區表信息
```
[root@study ~]# partprobe [-s] # 你可以不要加 -s !那么屏幕不會出現訊息!
[root@study ~]# partprobe -s # 不過還是建議加上 -s 比較清晰!
/dev/vda: gpt partitions 1 2 3 4 5 6
[root@study ~]# lsblk /dev/vda # 實際的磁盤分區狀態
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 40G 0 disk
|-vda1 252:1 0 2M 0 part
|-vda2 252:2 0 1G 0 part /boot
|-vda3 252:3 0 30G 0 part
| |-centos-root 253:0 0 10G 0 lvm /
| |-centos-swap 253:1 0 1G 0 lvm [SWAP]
| `-centos-home 253:2 0 5G 0 lvm /home
|-vda4 252:4 0 1G 0 part
|-vda5 252:5 0 1G 0 part
`-vda6 252:6 0 500M 0 part
[root@study ~]# cat /proc/partitions # 核心的分區紀錄
major minor #blocks name
252 0 41943040 vda
252 1 2048 vda1
252 2 1048576 vda2
252 3 31461376 vda3
252 4 1048576 vda4
252 5 1048576 vda5
252 6 512000 vda6
# 現在核心也正確的抓到了分區參數了!
```
* 用 gdisk 刪除一個分區
已經學會了新增分區,那么刪除分區呢?好!現在讓我們將剛剛創建的 /dev/vda6 刪除!你該如何進行呢?鳥哥下面很快的處理一遍, 大家趕緊來瞧一瞧先!
```
[root@study ~]# gdisk /dev/vda
Command (? for help): p
Number Start (sector) End (sector) Size Code Name
1 2048 6143 2.0 MiB EF02
2 6144 2103295 1024.0 MiB 0700
3 2103296 65026047 30.0 GiB 8E00
4 65026048 67123199 1024.0 MiB 8300 Linux filesystem
5 67123200 69220351 1024.0 MiB 0700 Microsoft basic data
6 69220352 70244351 500.0 MiB 8200 Linux swap
Command (? for help): d
Partition number (1-6): 6
Command (? for help): p
# 你會發現 /dev/vda6 不見了!非常棒!沒問題就寫入吧!
Command (? for help): w
# 同樣會有一堆訊息!鳥哥就不重復輸出了!自己選擇 y 來處理吧!
[root@study ~]# lsblk
# 你會發現!怪了!怎么還是有 /dev/vda6 呢?沒辦法!還沒有更新核心的分區表啊!所以當然有錯!
[root@study ~]# partprobe -s
[root@study ~]# lsblk
# 這個時候,那個 /dev/vda6 才真的消失不見了!了解吧!
```

**Tips** 萬分注意!不要去處理一個正在使用中的分區!例如,我們的系統現在已經使用了 /dev/vda2 ,那如果你要刪除 /dev/vda2 的話, 必須要先將 /dev/vda2 卸載,否則直接刪除該分區的話,雖然磁盤還是慧寫入正確的分區信息,但是核心會無法更新分區表的信息的! 另外,文件系統與 Linux 系統的穩定性,恐怕也會變得怪怪的!反正!千萬不要處理正在使用中的文件系統就對了!
* fdisk
雖然 MBR 分區表在未來應該會慢慢的被淘汰,畢竟現在磁盤容量隨便都大于 2T 以上了。而對于在 CentOS 7.x 中還無法完整支持 GPT 的 fdisk 來說, 這家伙真的英雄無用武之地了啦!不過依舊有些舊的系統,以及虛擬機的使用上面,還是有小磁盤存在的空間!這時處理 MBR 分區表, 就得要使用 fdisk 啰!
因為 fdisk 跟 gdisk 使用的方式幾乎一樣!只是一個使用 ? 作為指令提示數據,一個使用 m 作為提示這樣而已。 此外,fdisk 有時會使用柱面 (cylinder) 作為分區的最小單位,與 gdisk 默認使用 sector 不太一樣!大致上只是這點差別! 另外, MBR 分區是有限制的 (Primary, Extended, Logical...)!不要忘記了!鳥哥這里不使用范例了,畢竟示范機上面也沒有 MBR 分區表... 這里僅列出相關的指令給大家對照參考啰!
```
[root@study ~]# fdisk /dev/sda
Command (m for help): m <== 輸入 m 后,就會看到下面這些指令介紹
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition <==刪除一個partition
l list known partition types
m print this menu
n add a new partition <==新增一個partition
o create a new empty DOS partition table
p print the partition table <==在屏幕上顯示分區表
q quit without saving changes <==不儲存離開fdisk程序
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit <==將剛剛的動作寫入分區表
x extra functionality (experts only)
```
### 7.3.3 磁盤格式化(創建文件系統)
分區完畢后自然就是要進行文件系統的格式化啰!格式化的指令非常的簡單,那就是“make filesystem, mkfs” 這個指令啦!這個指令其實是個綜合的指令,他會去調用正確的文件系統格式化工具軟件!因為 CentOS 7 使用 xfs 作為默認文件系統, 下面我們會先介紹 mkfs.xfs ,之后介紹新一代的 EXT 家族成員 mkfs.ext4,最后再聊一聊 mkfs 這個綜合指令吧!
* XFS 文件系統 mkfs.xfs
我們常聽到的“格式化”其實應該稱為“創建文件系統 (make filesystem)”才對啦!所以使用的指令是 mkfs 喔!那我們要創建的其實是 xfs 文件系統, 因此使用的是 mkfs.xfs 這個指令才對。這個指令是這樣使用的:
```
[root@study ~]# mkfs.xfs [-b bsize] [-d parms] [-i parms] [-l parms] [-L label] [-f] \
[-r parms] 設備名稱
選項與參數:
關於單位:下面只要談到“數值”時,沒有加單位則為 Bytes 值,可以用 k,m,g,t,p (小寫)等來解釋
比較特殊的是 s 這個單位,它指的是 sector 的“個數”喔!
-b :后面接的是 block 容量,可由 512 到 64k,不過最大容量限制為 Linux 的 4k 喔!
-d :后面接的是重要的 data section 的相關參數值,主要的值有:
agcount=數值 :設置需要幾個儲存群組的意思(AG),通常與 CPU 有關
agsize=數值 :每個 AG 設置為多少容量的意思,通常 agcount/agsize 只選一個設置即可
file :指的是“格式化的設備是個文件而不是個設備”的意思!(例如虛擬磁盤)
size=數值 :data section 的容量,亦即你可以不將全部的設備容量用完的意思
su=數值 :當有 RAID 時,那個 stripe 數值的意思,與下面的 sw 搭配使用
sw=數值 :當有 RAID 時,用于儲存數據的磁盤數量(須扣除備份碟與備用碟)
sunit=數值 :與 su 相當,不過單位使用的是“幾個 sector(512Bytes大小)”的意思
swidth=數值 :就是 su*sw 的數值,但是以“幾個 sector(512Bytes大小)”來設置
-f :如果設備內已經有文件系統,則需要使用這個 -f 來強制格式化才行!
-i :與 inode 有較相關的設置,主要的設置值有:
size=數值 :最小是 256Bytes 最大是 2k,一般保留 256 就足夠使用了!
internal=[0|1]:log 設備是否為內置?默認為 1 內置,如果要用外部設備,使用下面設置
logdev=device :log 設備為后面接的那個設備上頭的意思,需設置 internal=0 才可!
size=數值 :指定這塊登錄區的容量,通常最小得要有 512 個 block,大約 2M 以上才行!
-L :后面接這個文件系統的標頭名稱 Label name 的意思!
-r :指定 realtime section 的相關設置值,常見的有:
extsize=數值 :就是那個重要的 extent 數值,一般不須設置,但有 RAID 時,
最好設置與 swidth 的數值相同較佳!最小為 4K 最大為 1G 。
范例:將前一小節分區出來的 /dev/vda4 格式化為 xfs 文件系統
[root@study ~]# mkfs.xfs /dev/vda4
meta-data=/dev/vda4 isize=256 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
# 很快格是化完畢!都用默認值!較重要的是 inode 與 block 的數值
[root@study ~]# blkid /dev/vda4
/dev/vda4: UUID="39293f4f-627b-4dfd-a015-08340537709c" TYPE="xfs"
# 確定創建好 xfs 文件系統了!
```
使用默認的 xfs 文件系統參數來創建系統即可!速度非常快!如果我們有其他額外想要處理的項目,才需要加上一堆設置值!舉例來說,因為 xfs 可以使用多個數據流來讀寫系統,以增加速度,因此那個 agcount 可以跟 CPU 的核心數來做搭配!舉例來說,如果我的服務器僅有一顆 4 核心,但是有啟動 Intel 超線程功能,則系統會仿真出 8 顆 CPU 時,那個 agcount 就可以設置為 8 喔!舉個例子來瞧瞧:
```
范例:找出你系統的 CPU 數,并據以設置你的 agcount 數值
[root@study ~]# grep 'processor' /proc/cpuinfo
processor : 0
processor : 1
# 所以就是有兩顆 CPU 的意思,那就來設置設置我們的 xfs 文件系統格式化參數吧!!
[root@study ~]# mkfs.xfs -f -d agcount=2 /dev/vda4
meta-data=/dev/vda4 isize=256 agcount=2, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
.....(下面省略).....
# 可以跟前一個范例對照看看,可以發現 agcount 變成 2 了喔!
# 此外,因為已經格式化過一次,因此 mkfs.xfs 可能會出現不給你格式化的警告!因此需要使用 -f
```
* XFS 文件系統 for RAID 性能優化 (Optional)
我們在第14章會持續談到進階文件系統的設置,其中就有磁盤陣列這個東西!磁盤陣列是多顆磁盤組成一顆大磁盤的意思, 利用同步寫入到這些磁盤的技術,不但可以加快讀寫速度,還可以讓某一顆磁盤壞掉時,整個文件系統還是可以持續運行的狀態!那就是所謂的容錯。
基本上,磁盤陣列 (RAID) 就是通過將文件先細分為數個小型的分區區塊 (stripe) 之后,然后將眾多的 stripes 分別放到磁盤陣列里面的所有磁盤, 所以一個文件是被同時寫入到多個磁盤去,當然性能會好一些。為了文件的保全性,所以在這些磁盤里面,會保留數個 (與磁盤陣列的規劃有關) 備份磁盤 (parity disk), 以及可能會保留一個以上的備用磁盤 (spare disk),這些區塊基本上會占用掉磁盤陣列的總容量,不過對于數據的保全會比較有保障!
那個分區區塊 stripe 的數值大多介于 4K 到 1M 之間,這與你的磁盤陣列卡支持的項目有關。stripe 與你的文件數據容量以及性能相關性較高。 當你的系統大多是大型文件時,一般建議 stripe 可以設置大一些,這樣磁盤陣列讀/寫的頻率會降低,性能會提升。如果是用于系統, 那么小文件比較多的情況下, stripe 建議大約在 64K 左右可能會有較佳的性能。不過,還是都須要經過測試啦!完全是 case by case 的情況。 更多詳細的磁盤陣列我們在第 14 章再來談,這里先有個大概的認識即可。14 章看完之后,再回來這個小節瞧瞧啰!
文件系統的讀寫要能夠有最優化,最好能夠搭配磁盤陣列的參數來設計,這樣性能才能夠起來!也就是說,你可以先在文件系統就將 stripe 規劃好, 那交給 RAID 去存取時,它就無須重復進行文件的 stripe 過程,性能當然會更好!那格式化時,最優化性能與什么咚咚有關呢?我們來假設個環境好了:
* 我有兩個線程的 CPU 數量,所以 agcount 最好指定為 2
* 當初設置 RAID 的 stripe 指定為 256K 這么大,因此 su 最好設置為 256k
* 設置的磁盤陣列有 8 顆,因為是 RAID5 的設置,所以有一個 parity (備份碟),因此指定 sw 為 7
* 由上述的數據中,我們可以發現數據寬度 (swidth) 應該就是 256K*7 得到 1792K,可以指定 extsize 為 1792k
相關數據的來源可以參考文末[[7]](#ps7)的說明,這里僅快速的使用 mkfs.xfs 的參數來處理格式化的動作喔!
```
[root@study ~]# mkfs.xfs -f -d agcount=2,su=256k,sw=7 -r extsize=1792k /dev/vda4
meta-data=/dev/vda4 isize=256 agcount=2, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=64 swidth=448 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=64 blks, lazy-count=1
realtime =none extsz=1835008 blocks=0, rtextents=0
```
從輸出的結果來看, agcount 沒啥問題, sunit 結果是 64 個 block,因為每個 block 為 4K,所以算出來容量就是 256K 也沒錯! 那個 swidth 也相同!使用 448 * 4K 得到 1792K!那個 extsz 則是算成 Bytes 的單位,換算結果也沒錯啦!上面是個方式,那如果使用 sunit 與 swidth 直接套用在 mkfs.xfs 當中呢?那你得小心了!因為指令中的這兩個參數用的是“幾個 512Bytes 的 sector 數量”的意思! 是“數量”單位而不是“容量”單位!因此先計算為:
* sunit = 256K/512Byte*1024(Bytes/K) = 512 個 sector
* swidth = 7 個磁盤 * sunit = 7 * 512 = 3584 個 sector
所以指令就得要變成如下模樣:
```
[root@study ~]# mkfs.xfs -f -d agcount=2,sunit=512,swidth=3584 -r extsize=1792k /dev/vda4
```
再說一次,這邊你大概先有個概念即可,看不懂也沒關系!等到 14 章看完后,未來回到這里,應該就能夠看得懂了! 多看幾次!多做幾次~操作系統的練習就是這樣才能學的會!看得懂! ^_^
* EXT4 文件系統 mkfs.ext4
如果想要格式化為 ext4 的傳統 Linux 文件系統的話,可以使用 mkfs.ext4 這個指令即可!這個指令的參數快速的介紹一下!
```
[root@study ~]# mkfs.ext4 [-b size] [-L label] 設備名稱
選項與參數:
-b :設置 block 的大小,有 1K, 2K, 4K 的容量,
-L :后面接這個設備的標頭名稱。
范例:將 /dev/vda5 格式化為 ext4 文件系統
[root@study ~]# mkfs.ext4 /dev/vda5
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label= # 顯示 Label name
OS type: Linux
Block size=4096 (log=2) # 每一個 block 的大小
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks # 跟 RAID 相關性較高
65536 inodes, 262144 blocks # 總計 inode/block 的數量
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups # 共有 8 個 block groups 喔!
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
[root@study ~]# dumpe2fs -h /dev/vda5
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: 3fd5cc6f-a47d-46c0-98c0-d43b072e0e12
....(中間省略)....
Inode count: 65536
Block count: 262144
Block size: 4096
Blocks per group: 32768
Inode size: 256
Journal size: 32M
```
由于數據量較大,因此鳥哥僅列出比較重要的項目而已,提供給你參考。另外,本章稍早之前介紹的 dumpe2fs 現在也可以測試練習了!查閱一下相關的數據吧! 因為 ext4 的默認值已經相當適合我們系統使用,大部分的默認值寫入于我們系統的 /etc/mke2fs.conf 這個文件中,有興趣可以自行前往查閱。 也因此,我們無須額外指定 inode 的容量,系統都幫我們做好默認值啰!只需要得到 uuid 這個咚咚即可啦!
* 其他文件系統 mkfs
mkfs 其實是個綜合指令而已,當我們使用 mkfs -t xfs 時,它就會跑去找 mkfs.xfs 相關的參數給我們使用! 如果想要知道系統還支持哪種文件系統的格式化功能,直接按 [tabl] 就很清楚了!
```
[root@study ~]# mkfs[tab][tab]
mkfs mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4
mkfs.fat mkfs.minix mkfs.msdos mkfs.vfat mkfs.xfs
```
所以系統還有支持 ext2/ext3/vfat 等等多種常用的文件系統喔!那如果要將剛剛的 /dev/vda5 重新格式化為 VFAT 文件系統呢?
```
[root@study ~]# mkfs -t vfat /dev/vda5
[root@study ~]# blkid /dev/vda5
/dev/vda5: UUID="7130-6012" TYPE="vfat" PARTLABEL="Microsoft basic data"
[root@study ~]# mkfs.ext4 /dev/vda5
[root@study ~]# blkid /dev/vda4 /dev/vda5
/dev/vda4: UUID="e0a6af55-26e7-4cb7-a515-826a8bd29e90" TYPE="xfs"
/dev/vda5: UUID="899b755b-1da4-4d1d-9b1c-f762adb798e1" TYPE="ext4"
```
上面就是我們這個章節最后的結果了! /dev/vda4 是 xfs 文件系統,而 /dev/vda5 是 ext4 文件系統喔!都有練習妥當了嘛?

**Tips** 越來越多同學上課都不聽講,只是很單純的將鳥哥在屏幕操作的過程“拍照”下來而已~當鳥哥說“開始操作!等一下要檢查喔!” 大家就拼命的從手機里面將剛剛的照片抓出來,一個一個指令照著打~
不過,屏幕并不能告訴你“ [tab] 按鈕其實不是按下 enter”的結果, 如上所示,同學拼命的按下 mkfs 之后,卻沒有辦法得到下面出現的眾多指令,就開始舉手...老師!我沒辦法作到你講的畫面...
拜托讀者們,請注意:“我們是要練習 Linux 系統,不是要練習 "英文打字"”啦!英文打字回家練就好了! @_@
### 7.3.4 文件系統檢驗
由于系統在運行時誰也說不準啥時硬件或者是電源會有問題,所以“死機”可能是難免的情況(不管是硬件還是軟件)。 現在我們知道文件系統運行時會有磁盤與內存數據非同步的狀況發生,因此莫名其妙的死機非常可能導致文件系統的錯亂。 問題來啦,如果文件系統真的發生錯亂的話,那該如何是好?就...挽救啊!不同的文件系統救援的指令不太一樣,我們主要針對 xfs 及 ext4 這兩個主流來說明而已喔!
* xfs_repair 處理 XFS 文件系統
當有 xfs 文件系統錯亂才需要使用這個指令!所以,這個指令最好是不要用到啦!但有問題發生時,這個指令卻又很重要...
```
[root@study ~]# xfs_repair [-fnd] 設備名稱
選項與參數:
-f :后面的設備其實是個文件而不是實體設備
-n :單純檢查并不修改文件系統的任何數據 (檢查而已)
-d :通常用在單人維護模式下面,針對根目錄 (/) 進行檢查與修復的動作!很危險!不要隨便使用
范例:檢查一下剛剛創建的 /dev/vda4 文件系統
[root@study ~]# xfs_repair /dev/vda4
Phase 1 - find and verify superblock...
Phase 2 - using internal log
Phase 3 - for each AG...
Phase 4 - check for duplicate blocks...
Phase 5 - rebuild AG headers and trees...
Phase 6 - check inode connectivity...
Phase 7 - verify and correct link counts...
done
# 共有 7 個重要的檢查流程!詳細的流程介紹可以 man xfs_repair 即可!
范例:檢查一下系統原本就有的 /dev/centos/home 文件系統
[root@study ~]# xfs_repair /dev/centos/home
xfs_repair: /dev/centos/home contains a mounted filesystem
xfs_repair: /dev/centos/home contains a mounted and writable filesystem
fatal error -- couldn't initialize XFS library
```
xfs_repair 可以檢查/修復文件系統,不過,因為修復文件系統是個很龐大的任務!因此,修復時該文件系統不能被掛載! 所以,檢查與修復 /dev/vda4 沒啥問題,但是修復 /dev/centos/home 這個已經掛載的文件系統時,嘿嘿!就出現上述的問題了! 沒關系,若可以卸載,卸載后再處理即可。
Linux 系統有個設備無法被卸載,那就是根目錄啊!如果你的根目錄有問題怎辦?這時得要進入單人維護或救援模式,然后通過 -d 這個選項來處理! 加入 -d 這個選項后,系統會強制檢驗該設備,檢驗完畢后就會自動重新開機啰!不過,鳥哥完全不打算要進行這個指令的實做... 永遠都不希望實做這東西...
* fsck.ext4 處理 EXT4 文件系統
fsck 是個綜合指令,如果是針對 ext4 的話,建議直接使用 fsck.ext4 來檢測比較妥當!那 fsck.ext4 的選項有下面幾個常見的項目:
```
[root@study ~]# fsck.ext4 [-pf] [-b superblock] 設備名稱
選項與參數:
-p :當文件系統在修復時,若有需要回復 y 的動作時,自動回復 y 來繼續進行修復動作。
-f :強制檢查!一般來說,如果 fsck 沒有發現任何 unclean 的旗標,不會主動進入
細部檢查的,如果您想要強制 fsck 進入細部檢查,就得加上 -f 旗標啰!
-D :針對文件系統下的目錄進行最優化配置。
-b :后面接 superblock 的位置!一般來說這個選項用不到。但是如果你的 superblock 因故損毀時,
通過這個參數即可利用文件系統內備份的 superblock 來嘗試救援。一般來說,superblock 備份在:
1K block 放在 8193, 2K block 放在 16384, 4K block 放在 32768
范例:找出剛剛創建的 /dev/vda5 的另一塊 superblock,并據以檢測系統
[root@study ~]# dumpe2fs -h /dev/vda5 | grep 'Blocks per group'
Blocks per group: 32768
# 看起來每個 block 群組會有 32768 個 block,因此第二個 superblock 應該就在 32768 上!
# 因為 block 號碼為 0 號開始編的!
[root@study ~]# fsck.ext4 -b 32768 /dev/vda5
e2fsck 1.42.9 (28-Dec-2013)
/dev/vda5 was not cleanly unmounted, check forced.
Pass 1: Checking inodes, blocks, and sizes
Deleted inode 1577 has zero dtime. Fix<y>? yes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vda5: ***** FILE SYSTEM WAS MODIFIED ***** # 文件系統被改過,所以這里會有警告!
/dev/vda5: 11/65536 files (0.0% non-contiguous), 12955/262144 blocks
# 好巧合!鳥哥使用這個方式來檢驗系統,恰好遇到文件系統出問題!于是可以有比較多的解釋方向!
# 當文件系統出問題,它就會要你選擇是否修復~如果修復如上所示,按下 y 即可!
# 最終系統會告訴你,文件系統已經被更改過,要注意該項目的意思!
范例:已默認設置強制檢查一次 /dev/vda5
[root@study ~]# fsck.ext4 /dev/vda5
e2fsck 1.42.9 (28-Dec-2013)
/dev/vda5: clean, 11/65536 files, 12955/262144 blocks
# 文件系統狀態正常,它并不會進入強制檢查!會告訴你文件系統沒問題 (clean)
[root@study ~]# fsck.ext4 -f /dev/vda5
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
....(下面省略)....
```
無論是 xfs_repair 或 fsck.ext4,這都是用來檢查與修正文件系統錯誤的指令。注意:通常只有身為 root 且你的文件系統有問題的時候才使用這個指令,否則在正常狀況下使用此一指令, 可能會造成對系統的危害!通常使用這個指令的場合都是在系統出現極大的問題,導致你在 Linux 開機的時候得進入單人單機模式下進行維護的行為時,才必須使用此一指令!
另外,如果你懷疑剛剛格式化成功的磁盤有問題的時后,也可以使用 xfs_repair/fsck.ext4 來檢查一磁盤呦!其實就有點像是 Windows 的 scandisk 啦!此外,由于 xfs_repair/fsck.ext4 在掃瞄磁盤的時候,可能會造成部分 filesystem 的修訂,所以“執行 xfs_repair/fsck.ext4 時, 被檢查的 partition 務必不可掛載到系統上!亦即是需要在卸載的狀態喔!”
### 7.3.5 文件系統掛載與卸載
我們在本章一開始時的[掛載點的意義](../Text/index.html#harddisk-mount)當中提過掛載點是目錄, 而這個目錄是進入磁盤分區(其實是文件系統啦!)的入口就是了。不過要進行掛載前,你最好先確定幾件事:
* 單一文件系統不應該被重復掛載在不同的掛載點(目錄)中;
* 單一目錄不應該重復掛載多個文件系統;
* 要作為掛載點的目錄,理論上應該都是空目錄才是。
尤其是上述的后兩點!如果你要用來掛載的目錄里面并不是空的,那么掛載了文件系統之后,原目錄下的東西就會暫時的消失。 舉個例子來說,假設你的 /home 原本與根目錄 (/) 在同一個文件系統中,下面原本就有 /home/test 與 /home/vbird 兩個目錄。然后你想要加入新的磁盤,并且直接掛載 /home 下面,那么當你掛載上新的分區時,則 /home 目錄顯示的是新分區內的數據,至于原先的 test 與 vbird 這兩個目錄就會暫時的被隱藏掉了!注意喔!并不是被覆蓋掉, 而是暫時的隱藏了起來,等到新分區被卸載之后,則 /home 原本的內容就會再次的跑出來啦!
而要將文件系統掛載到我們的 Linux 系統上,就要使用 mount 這個指令啦! 不過,這個指令真的是博大精深~粉難啦!我們學簡單一點啊~ ^_^
```
[root@study ~]# mount -a
[root@study ~]# mount [-l]
[root@study ~]# mount [-t 文件系統] LABEL='' 掛載點
[root@study ~]# mount [-t 文件系統] UUID='' 掛載點 # 鳥哥近期建議用這種方式喔!
[root@study ~]# mount [-t 文件系統] 設備文件名 掛載點
選項與參數:
-a :依照配置文件 [/etc/fstab](../Text/index.html#fstab) 的數據將所有未掛載的磁盤都掛載上來
-l :單純的輸入 mount 會顯示目前掛載的信息。加上 -l 可增列 Label 名稱!
-t :可以加上文件系統種類來指定欲掛載的類型。常見的 Linux 支持類型有:xfs, ext3, ext4,
reiserfs, vfat, iso9660(光盤格式), nfs, cifs, smbfs (后三種為網絡文件系統類型)
-n :在默認的情況下,系統會將實際掛載的情況實時寫入 /etc/mtab 中,以利其他程序的運行。
但在某些情況下(例如單人維護模式)為了避免問題會刻意不寫入。此時就得要使用 -n 選項。
-o :后面可以接一些掛載時額外加上的參數!比方說帳號、密碼、讀寫權限等:
async, sync: 此文件系統是否使用同步寫入 (sync) 或非同步 (async) 的
內存機制,請參考[文件系統運行方式](../Text/index.html#harddisk-filerun)。默認為 async。
atime,noatime: 是否修訂文件的讀取時間(atime)。為了性能,某些時刻可使用 noatime
ro, rw: 掛載文件系統成為只讀(ro) 或可讀寫(rw)
auto, noauto: 允許此 filesystem 被以 mount -a 自動掛載(auto)
dev, nodev: 是否允許此 filesystem 上,可創建設備文件? dev 為可允許
suid, nosuid: 是否允許此 filesystem 含有 suid/sgid 的文件格式?
exec, noexec: 是否允許此 filesystem 上擁有可執行 binary 文件?
user, nouser: 是否允許此 filesystem 讓任何使用者執行 mount ?一般來說,
mount 僅有 root 可以進行,但下達 user 參數,則可讓
一般 user 也能夠對此 partition 進行 mount 。
defaults: 默認值為:rw, suid, dev, exec, auto, nouser, and async
remount: 重新掛載,這在系統出錯,或重新更新參數時,很有用!
```
基本上,CentOS 7 已經太聰明了,因此你不需要加上 -t 這個選項,系統會自動的分析最恰當的文件系統來嘗試掛載你需要的設備! 這也是使用 blkid 就能夠顯示正確的文件系統的緣故!那 CentOS 是怎么找出文件系統類型的呢? 由于文件系統幾乎都有 superblock ,我們的 Linux 可以通過分析 superblock 搭配 Linux 自己的驅動程序去測試掛載, 如果成功的套和了,就立刻自動的使用該類型的文件系統掛載起來啊!那么系統有沒有指定哪些類型的 filesystem 才需要進行上述的掛載測試呢? 主要是參考下面這兩個文件:
* /etc/filesystems:系統指定的測試掛載文件系統類型的優先順序;
* /proc/filesystems:Linux系統已經載入的文件系統類型。
那我怎么知道我的 Linux 有沒有相關文件系統類型的驅動程序呢?我們 Linux 支持的文件系統之驅動程序都寫在如下的目錄中:
* /lib/modules/$(uname -r)/kernel/fs/
例如 ext4 的驅動程序就寫在“/lib/modules/$(uname -r)/kernel/fs/ext4/”這個目錄下啦!
另外,過去我們都習慣使用設備文件名然后直接用該文件名掛載, 不過近期以來鳥哥比較建議使用 UUID 來識別文件系統,會比設備名稱與標頭名稱還要更可靠!因為是獨一無二的啊!
* 掛載 xfs/ext4/vfat 等文件系統
```
范例:找出 /dev/vda4 的 UUID 后,用該 UUID 來掛載文件系統到 /data/xfs 內
[root@study ~]# blkid /dev/vda4
/dev/vda4: UUID="e0a6af55-26e7-4cb7-a515-826a8bd29e90" TYPE="xfs"
[root@study ~]# mount UUID="e0a6af55-26e7-4cb7-a515-826a8bd29e90" /data/xfs
mount: mount point /data/xfs does not exist # 非正規目錄!所以手動創建它!
[root@study ~]# mkdir -p /data/xfs
[root@study ~]# mount UUID="e0a6af55-26e7-4cb7-a515-826a8bd29e90" /data/xfs
[root@study ~]# df /data/xfs
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda4 1038336 32864 1005472 4% /data/xfs
# 順利掛載,且容量約為 1G 左右沒問題!
范例:使用相同的方式,將 /dev/vda5 掛載于 /data/ext4
[root@study ~]# blkid /dev/vda5
/dev/vda5: UUID="899b755b-1da4-4d1d-9b1c-f762adb798e1" TYPE="ext4"
[root@study ~]# mkdir /data/ext4
[root@study ~]# mount UUID="899b755b-1da4-4d1d-9b1c-f762adb798e1" /data/ext4
[root@study ~]# df /data/ext4
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda5 999320 2564 927944 1% /data/ext4
```
* 掛載 CD 或 DVD 光盤
請拿出你的 CentOS 7 原版光盤出來,然后放入到光驅當中,我們來測試一下這個玩意兒啰!
```
范例:將你用來安裝 Linux 的 CentOS 原版光盤拿出來掛載到 /data/cdrom!
[root@study ~]# blkid
.....(前面省略).....
/dev/sr0: UUID="2015-04-01-00-21-36-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"
[root@study ~]# mkdir /data/cdrom
[root@study ~]# mount /dev/sr0 /data/cdrom
mount: /dev/sr0 is write-protected, mounting read-only
[root@study ~]# df /data/cdrom
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sr0 7413478 7413478 0 100% /data/cdrom
# 怎么會使用掉 100% 呢?是啊!因為是 DVD 啊!所以無法再寫入了啊!
```
光驅一掛載之后就無法退出光盤片了!除非你將他卸載才能夠退出! 從上面的數據你也可以發現,因為是光盤嘛!所以磁盤使用率達到 100% ,因為你無法直接寫入任何數據到光盤當中! 此外,如果你使用的是圖形界面,那么系統會自動的幫你掛載這個光盤到 /media/ 里面去喔!也可以不卸載就直接退出! 但是文字界面沒有這個福利就是了! ^_^

**Tips** 話說當時年紀小 (其實是剛接觸 Linux 的那一年, 1999 年前后),摸 Linux 到處碰壁!連將 CDROM 掛載后, 光驅竟然都不讓我退片!那個時候難過的要死!還用回紋針插入光驅讓光盤退片耶!不過如此一來光盤就無法被使用了! 若要再次使用光驅,當時的解決的方法竟然是“重新開機!”囧的可以啊!
* 掛載 vfat 中文U盤 (USB磁盤)
請拿出你的U盤并插入 Linux 主機的 USB接口中!注意,你的這個U盤不能夠是 NTFS 的文件系統喔!接下來讓我們測試測試吧!
```
范例:找出你的U盤設備的 UUID,并掛載到 /data/usb 目錄中
[root@study ~]# blkid
/dev/sda1: UUID="35BC-6D6B" TYPE="vfat"
[root@study ~]# mkdir /data/usb
[root@study ~]# mount -o codepage=950,iocharset=utf8 UUID="35BC-6D6B" /data/usb
[root@study ~]# # mount -o codepage=950,iocharset=big5 UUID="35BC-6D6B" /data/usb
[root@study ~]# df /data/usb
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 2092344 4 2092340 1% /data/usb
```
如果帶有中文文件名的數據,那么可以在掛載時指定一下掛載文件系統所使用的語系數據。 在 man mount 找到 vfat 文件格式當中可以使用 codepage 來處理!中文語系的代碼為 950 喔!另外,如果想要指定中文是萬國碼還是大五碼, 就得要使用 iocharset 為 utf8 還是 big5 兩者擇一了!因為鳥哥的U盤使用 utf8 編碼,因此將上述的 big5 前面加上 # 符號, 代表注解該行的意思啰!
萬一你使用的 USB 磁盤被格式化為 NTFS 時,那可能就得要動點手腳,因為默認的 CentOS 7 并沒有支持 NTFS 文件系統格式! 所以你得要安裝 NTFS 文件系統的驅動程序后,才有辦法處理的!這部份我們留待 22 章講到 yum 服務器時再來談吧! 因為目前我們也還沒有網絡、也沒有講軟件安裝啊! ^_^
* 重新掛載根目錄與掛載不特定目錄
整個目錄樹最重要的地方就是根目錄了,所以根目錄根本就不能夠被卸載的!問題是,如果你的掛載參數要改變, 或者是根目錄出現“只讀”狀態時,如何重新掛載呢?最可能的處理方式就是重新開機 (reboot)! 不過你也可以這樣做:
```
范例:將 / 重新掛載,并加入參數為 rw 與 auto
[root@study ~]# mount -o remount,rw,auto /
```
重點是那個“ -o remount,xx ”的選項與參數!請注意,要重新掛載 (remount) 時, 這是個非常重要的機制!尤其是當你進入單人維護模式時,你的根目錄常會被系統掛載為只讀,這個時候這個指令就太重要了!
另外,我們也可以利用 mount 來將某個目錄掛載到另外一個目錄去喔!這并不是掛載文件系統,而是額外掛載某個目錄的方法! 雖然下面的方法也可以使用 symbolic link 來鏈接,不過在某些不支持符號鏈接的程序運行中,還是得要通過這樣的方法才行。
```
范例:將 /var 這個目錄暫時掛載到 /data/var 下面:
[root@study ~]# mkdir /data/var
[root@study ~]# mount --bind /var /data/var
[root@study ~]# ls -lid /var /data/var
16777346 drwxr-xr-x. 22 root root 4096 Jun 15 23:43 /data/var
16777346 drwxr-xr-x. 22 root root 4096 Jun 15 23:43 /var
# 內容完全一模一樣啊!因為掛載目錄的緣故!
[root@study ~]# mount | grep var
/dev/mapper/centos-root on /data/var type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
```
看起來,其實兩者鏈接到同一個 inode 嘛! ^_^ 沒錯啦!通過這個 mount --bind 的功能, 您可以將某個目錄掛載到其他目錄去喔!而并不是整塊 filesystem 的啦!所以從此進入 /data/var 就是進入 /var 的意思喔!
* umount (將設備文件卸載)
```
[root@study ~]# umount [-fn] 設備文件名或掛載點
選項與參數:
-f :強制卸載!可用在類似網絡文件系統 (NFS) 無法讀取到的情況下;
-l :立刻卸載文件系統,比 -f 還強!
-n :不更新 /etc/mtab 情況下卸載。
```
就是直接將已掛載的文件系統給他卸載即是!卸載之后,可以使用 df 或 mount 看看是否還存在目錄樹中? 卸載的方式,可以下達設備文件名或掛載點,均可接受啦!下面的范例做看看吧!
```
范例:將本章之前自行掛載的文件系統全部卸載:
[root@study ~]# mount
.....(前面省略).....
/dev/vda4 on /data/xfs type xfs (rw,relatime,seclabel,attr2,inode64,logbsize=256k,sunit=512,..)
/dev/vda5 on /data/ext4 type ext4 (rw,relatime,seclabel,data=ordered)
/dev/sr0 on /data/cdrom type iso9660 (ro,relatime)
/dev/sda1 on /data/usb type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=950,iocharset=...)
/dev/mapper/centos-root on /data/var type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
# 先找一下已經掛載的文件系統,如上所示,特殊字體即為剛剛掛載的設備啰!
# 基本上,卸載后面接設備或掛載點都可以!不過最后一個 centos-root 由于有其他掛載,
# 因此,該項目一定要使用掛載點來卸載才行!
[root@study ~]# umount /dev/vda4 <==用設備文件名來卸載
[root@study ~]# umount /data/ext4 <==用掛載點來卸載
[root@study ~]# umount /data/cdrom <==因為掛載點比較好記憶!
[root@study ~]# umount /data/usb
[root@study ~]# umount /data/var <==一定要用掛載點!因為設備有被其他方式掛載
```
由于通通卸載了,此時你才可以退出光盤片、軟盤片、U盤等設備喔!如果你遇到這樣的情況:
```
[root@study ~]# mount /dev/sr0 /data/cdrom
[root@study ~]# cd /data/cdrom
[root@study cdrom]# umount /data/cdrom
umount: /data/cdrom: target is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
[root@study cdrom]# cd /
[root@study /]# umount /data/cdrom
```
由于你目前正在 /data/cdrom/ 的目錄內,也就是說其實“你正在使用該文件系統”的意思!所以自然無法卸載這個設備!那該如何是好?就“離開該文件系統的掛載點”即可。以上述的案例來說, 你可以使用“ cd / ”回到根目錄,就能夠卸載 /data/cdrom 啰!簡單吧!
### 7.3.6 磁盤/文件系統參數修訂
某些時刻,你可能會希望修改一下目前文件系統的一些相關信息,舉例來說,你可能要修改 Label name , 或者是 journal 的參數,或者是其他磁盤/文件系統運行時的相關參數 (例如 DMA 啟動與否~)。 這個時候,就得需要下面這些相關的指令功能啰~
* mknod
還記得我們說過,在 Linux 下面所有的設備都以文件來代表吧!但是那個文件如何代表該設備呢? 很簡單!就是通過文件的 major 與 minor 數值來替代的~所以,那個 major 與 minor 數值是有特殊意義的,不是隨意設置的喔!我們在 lsblk 指令的用法里面也談過這兩個數值呢!舉例來說,在鳥哥的這個測試機當中, 那個用到的磁盤 /dev/vda 的相關設備代碼如下:
```
[root@study ~]# ll /dev/vda*
brw-rw----. 1 root disk 252, 0 Jun 24 02:30 /dev/vda
brw-rw----. 1 root disk 252, 1 Jun 24 02:30 /dev/vda1
brw-rw----. 1 root disk 252, 2 Jun 15 23:43 /dev/vda2
brw-rw----. 1 root disk 252, 3 Jun 15 23:43 /dev/vda3
brw-rw----. 1 root disk 252, 4 Jun 24 20:00 /dev/vda4
brw-rw----. 1 root disk 252, 5 Jun 24 21:15 /dev/vda5
```
上表當中 252 為主要設備代碼 (Major) 而 0~5 則為次要設備代碼 (Minor)。 我們的 Linux 核心認識的設備數據就是通過這兩個數值來決定的!舉例來說,常見的磁盤文件名 /dev/sda 與 /dev/loop0 設備代碼如下所示:
| 磁盤文件名 | Major | Minor |
| --- | --- | --- |
| /dev/sda | 8 | 0-15 |
| /dev/sdb | 8 | 16-31 |
| /dev/loop0 | 7 | 0 |
| /dev/loop1 | 7 | 1 |
如果你想要知道更多核心支持的硬件設備代碼 (major, minor) 請參考核心官網的鏈接[[8]](#ps8)。 基本上,Linux 核心 2.6 版以后,硬件文件名已經都可以被系統自動的實時產生了,我們根本不需要手動創建設備文件。 不過某些情況下面我們可能還是得要手動處理設備文件的,例如在某些服務被關到特定目錄下時(chroot), 就需要這樣做了。此時這個 mknod 就得要知道如何操作才行!
```
[root@study ~]# mknod 設備文件名 [bcp] [Major] [Minor]
選項與參數:
設備種類:
b :設置設備名稱成為一個周邊儲存設備文件,例如磁盤等;
c :設置設備名稱成為一個周邊輸入設備文件,例如鼠標/鍵盤等;
p :設置設備名稱成為一個 FIFO 文件;
Major :主要設備代碼;
Minor :次要設備代碼;
范例:由上述的介紹我們知道 /dev/vda10 設備代碼 252, 10,請創建并查閱此設備
[root@study ~]# mknod /dev/vda10 b 252 10
[root@study ~]# ll /dev/vda10
brw-r--r--. 1 root root 252, 10 Jun 24 23:40 /dev/vda10
# 上面那個 252 與 10 是有意義的,不要隨意設置啊!
范例:創建一個 FIFO 文件,文件名為 /tmp/testpipe
[root@study ~]# mknod /tmp/testpipe p
[root@study ~]# ll /tmp/testpipe
prw-r--r--. 1 root root 0 Jun 24 23:44 /tmp/testpipe
# 注意啊!這個文件可不是一般文件,不可以隨便就放在這里!
# 測試完畢之后請刪除這個文件吧!看一下這個文件的類型!是 p 喔!^_^
[root@study ~]# rm /dev/vda10 /tmp/testpipe
rm: remove block special file '/dev/vda10' ? y
rm: remove fifo '/tmp/testpipe' ? y
```
* xfs_admin 修改 XFS 文件系統的 UUID 與 Label name
如果你當初格式化的時候忘記加上標頭名稱,后來想要再次加入時,不需要重復格式化!直接使用這個 xfs_admin 即可。 這個指令直接拿來處理 LABEL name 以及 UUID 即可啰!
```
[root@study ~]# xfs_admin [-lu] [-L label] [-U uuid] 設備文件名
選項與參數:
-l :列出這個設備的 label name
-u :列出這個設備的 UUID
-L :設置這個設備的 Label name
-U :設置這個設備的 UUID 喔!
范例:設置 /dev/vda4 的 label name 為 vbird_xfs,并測試掛載
[root@study ~]# xfs_admin -L vbird_xfs /dev/vda4
writing all SBs
new label = "vbird_xfs" # 產生新的 LABEL 名稱啰!
[root@study ~]# xfs_admin -l /dev/vda4
label = "vbird_xfs"
[root@study ~]# mount LABEL=vbird_xfs /data/xfs/
范例:利用 uuidgen 產生新 UUID 來設置 /dev/vda4,并測試掛載
[root@study ~]# umount /dev/vda4 # 使用前,請先卸載!
[root@study ~]# uuidgen
e0fa7252-b374-4a06-987a-3cb14f415488 # 很有趣的指令!可以產生新的 UUID 喔!
[root@study ~]# xfs_admin -u /dev/vda4
UUID = e0a6af55-26e7-4cb7-a515-826a8bd29e90
[root@study ~]# xfs_admin -U e0fa7252-b374-4a06-987a-3cb14f415488 /dev/vda4
Clearing log and setting UUID
writing all SBs
new UUID = e0fa7252-b374-4a06-987a-3cb14f415488
[root@study ~]# mount UUID=e0fa7252-b374-4a06-987a-3cb14f415488 /data/xfs
```
不知道你會不會有這樣的疑問:“鳥哥啊,既然 mount 后面使用設備文件名 (/dev/vda4) 也可以掛載成功,那你為什么要用很討厭的很長一串的 UUID 來作為你的掛載時寫入的設備名稱啊?”問的好!原因是這樣的:“因為你沒有辦法指定這個磁盤在所有的 Linux 系統中,文件名一定都會是 /dev/vda !”
舉例來說,我們剛剛使用的U盤在鳥哥這個測試系統當中查詢到的文件名是 /dev/sda,但是當這個U盤放到其他的已經有 /dev/sda 文件名的 Linux 系統下,它的文件名就會被指定成為 /dev/sdb 或 /dev/sdc 等等。反正,不會是 /dev/sda 了!那我怎么用同一個指令去掛載這只U盤呢? 當然有問題吧!但是 UUID 可是很難重復的!看看上面 uuidgen 產生的結果你就知道了!所以你可以確定該名稱不會被重復! 這對系統管理上可是相當有幫助的!它也比 LABEL name 要更精準的多呢! ^_^
* tune2fs 修改 ext4 的 label name 與 UUID
```
[root@study ~]# tune2fs [-l] [-L Label] [-U uuid] 設備文件名
選項與參數:
-l :類似 dumpe2fs -h 的功能~將 superblock 內的數據讀出來~
-L :修改 LABEL name
-U :修改 UUID 啰!
范例:列出 /dev/vda5 的 label name 之后,將它改成 vbird_ext4
[root@study ~]# dumpe2fs -h /dev/vda5 | grep name
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none> # 果然是沒有設置的!
[root@study ~]# tune2fs -L vbird_ext4 /dev/vda5
[root@study ~]# dumpe2fs -h /dev/vda5 | grep name
Filesystem volume name: vbird_ext4
[root@study ~]# mount LABEL=vbird_ext4 /data/ext4
```
這個指令的功能其實很廣泛啦~上面鳥哥僅列出很簡單的一些參數而已,更多的用法請自行參考 man tune2fs 。
- 鳥哥的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 參考資料與延伸閱讀