電腦網路與作業系統 電腦網路與作業系統

電腦網路與作業系統上課教材

電腦網路與作業系統 > 課程內容 > 第 13 章 - Linux 作業系統 - 檔案系統管理

第 13 章 - Linux 作業系統 - 檔案系統管理

上次更新日期 2020/06/01

檔案管理是直接處理檔案資料,但是這些檔案資料總是得要寫入磁碟的,而且檔案寫入時需要考慮到檔案系統,而檔案系統是在磁碟一開始建立資料時, 就需要事先處理妥當,亦即所謂的『格式化』之後,才能夠加以使用。因此,整個作業系統裡面有個非常重要的子系統,就是『檔案系統』的理解就顯的非常的重要。

學習目標

  1. 約略了解索引式檔案系統與鍊結式檔案系統
  2. 了解檔案系統的 superblock, inode, block 的用途
  3. 學會進行磁碟分割、格式化與掛載的流程
  4. 了解大型檔案的建置、格式化與使用

13.1: 檔案系統組織配置: linked, indexed

目前的作業系統當中,為了多人多工的設計,因此會有所謂的群組、權限、日期參數等相關的屬性產生,並不是只有單純的資料內容而已。 那麼這些資料 (屬性與實際資料內文) 是放哪裡呢?檔案系統通常會將這兩部份的資料分別存放在不同的區塊,權限與屬性放置到 inode 中,至於實際資料則放置到 data block 區塊中。另外,還有一個超級區塊 (superblock) 會記錄整個檔案系統的整體資訊, 包括 inode 與 block 的總量、使用量、剩餘量等。

基本上,在檔案系統一開始進行格式化 (format) 的時候,就會規範好每個 inode 與 block 的大小與位置編號,同時將檔案系統的所有總計資訊寫入到 superblock 裡面去, 所以,檔案系統的這三個區塊主要的記錄資料就會是:

  • superblock:記錄此 filesystem 的整體資訊,包括inode/block的總量、使用量、剩餘量,以及檔案系統的格式與相關資訊等;
  • inode:記錄檔案的屬性,一個檔案佔用一個inode,同時記錄此檔案的資料所在的 block 號碼;
  • block:實際記錄檔案的內容,若檔案太大時,會佔用多個 block 。
  • 索引式檔案系統 (indexed allocation)

由於每個 inode 與 block 都有編號,而每個檔案都會佔用一個 inode ,inode 內則有檔案資料放置的 block 號碼。 因此,我們可以知道的是,如果能夠找到檔案的 inode 的話,那麼自然就會知道這個檔案所放置資料的 block 號碼, 當然也就能夠讀出該檔案的實際資料了。這是個比較有效率的作法,因為如此一來我們的磁碟就能夠在短時間內讀取出全部的資料, 讀寫的效能比較好囉。

我們將 inode 與 block 區塊用圖解來說明一下,如下圖所示,檔案系統先格式化出 inode 與 block 的區塊,假設某一個檔案的屬性與權限資料是放置到 inode 4 號(下圖較小方格內),而這個 inode 記錄了檔案資料的實際放置點為 2, 7, 13, 15 這四個 block 號碼,此時我們的作業系統就能夠據此來排列磁碟的讀取順序,可以一口氣將四個 block 內容讀出來! 那麼資料的讀取就如同下圖中的箭頭所指定的模樣了。

索引式檔案系統

這種資料存取的方法我們稱為索引式檔案系統(indexed allocation)。

  • 鍊結式檔案系統 (Linked Allocation)

那有沒有其他的慣用檔案系統可以比較一下啊?有的,那就是我們慣用的隨身碟(快閃記憶體),隨身碟使用的檔案系統一般為 FAT 格式。FAT 這種格式的檔案系統並沒有 inode 存在,所以 FAT 沒有辦法將這個檔案的所有 block 在一開始就讀取出來。每個 block 號碼都記錄在前一個 block 當中,他的讀取方式有點像底下這樣:

鍊結式檔案系統

上圖中我們假設檔案的資料依序寫入1->7->4->15號這四個 block 號碼中, 但這個檔案系統沒有辦法一口氣就知道四個 block 的號碼,他得要一個一個的將 block 讀出後,才會知道下一個 block 在何處。 如果同一個檔案資料寫入的 block 分散的太過厲害時,則我們的磁碟讀取頭將無法在磁碟轉一圈就讀到所有的資料, 因此磁碟就會多轉好幾圈才能完整的讀取到這個檔案的內容!

FAT 之類的鍊結式檔案系統,由於沒有權限、屬性的概念,所以就沒有 inode 相關的資料,當然就比較沒有所謂的保密性。 同時,由於不用使用 inode 的資料記載,檔案系統格式化比較簡單。然而由於太過簡單,也就造成讀寫效能上比較不好的情境。

  • 磁碟重組的功能

常常會聽到所謂的『磁碟重組』吧? 需要磁碟重組的原因就是檔案寫入的 block 太過於離散了,此時檔案讀取的效能將會變的很差所致。 這個時候可以透過磁碟重組將同一個檔案所屬的 blocks 彙整在一起,這樣資料的讀取會比較容易啊! 想當然爾,FAT 的檔案系統需要三不五時的磁碟重組一下。不過,新的檔案系統是否需要磁碟重組呢?老實說,包括 windows 的 NTFS 以及 Linux 的大部分檔案系統, 都不需要磁碟重組。另外, SSD 或 PCI-E 的快閃記憶體格式的硬碟,都不需要磁碟重組喔!

如同之前我們開玩笑的說登入帳號是給人類看的,系統看的其實是 UID/GID 等。在檔案系統也一樣,檔名是給人類看的,事實上基本的檔案放置位置, 就是 inode 與 block 的號碼!檔案系統只是管理什麼資料放置在哪些位置這樣而已。

不過,由於每種檔案系統的讀/寫方式可能都有一些差異,因此除非安裝各自的檔案系統驅動程式,否則可能會無法讀取到其他作業系統所支援的檔案系統喔。 一般來說,Linux 支援的檔案系統主要有 ext2, ext3, ext4, xfs, reiserfs..,而 windows 支援的當然主要就是 NTFS 了。那麼為什麼隨身碟在兩個系統都可以被讀取? 那是因為小拇指碟的主要檔案系統被設計為大家都能接受,且沒有權限保護的 FAT 檔案系統之故。通常,如果你的讀寫效能要好, 可能拇指碟得要重新格式化成為各自作業系統的檔案系統格式較佳。只是,跨平台的支援度就會變得比較不好了。

另外,目錄檔案真的是很特別,目錄的內容其實就是記錄檔名!而這個檔名可以與 inode 進行連結就是了!畫圖表示有點像這樣:

目錄檔 block 內容示意圖
例題 13.1-1: 檔案系統基本概念
  1. NTFS, EXT4, XFS, FAT, VFAT 等,分別是索引式或鍊結式檔案系統?
  2. 一般來說,索引式檔案系統,在格式化時,就將檔案系統主要分成哪三個重要的項目?
  3. 以一般檔案來說,(1)時間、檔案擁有者、檔案權限、檔案容量等屬性,以及(2)檔案的內容文件,分別放置在哪兩個區塊上?
  4. 一般檔案的內容文件主要當然就是記載該檔案的資訊,包括可能是純文字檔、二進位程式檔、 資料庫檔等等。但以目錄檔案來說,目錄檔案的內容文件主要記錄的是什麼呢?
  5. 要找到一個檔案的內容,需要讀到檔案的 inode 號碼,請找出你 Linux 系統中,/etc/hosts 以及 /etc/fstab 的 inode 號碼。
參考解答:只提供 E 的解答:
  1. ll --help | less (找到 /inode); ll -i /etc/hosts /etc/fstab
  • 檔案系統與目錄樹的關係:掛載 (mount)

你的資料總是得要寫入檔案系統,但是我們過去操作檔案時,只需要記得目錄與檔名而已,也就是,實際操作系統時,最重要的部份反而是在目錄樹系統中。 那麼如何將目錄樹與檔案系統結合呢?在 Windows 底下,他透過一個很簡單的方式,就是每個檔案系統給予一個分割槽的代號,例如 C, D, E 槽, 然後將資料放進去這樣。不過想一想,如果是隨身碟呢?你的隨身碟放在 windows 底下,可能每台 windows 給予的分割槽名稱會不同喔! 因此你得要知道你的隨身碟在不同系統中的分割槽代號才行。

那 Linux 呢?Linux 只有目錄樹~然後,你進入到某個目錄時,可能就是切換到某個檔案系統囉!將『目錄』與『檔案系統』結合在一起, 這個動作就稱為『掛載 (mount)』了!事實上,windows 現在也有目錄掛載的功能!你的檔案系統無須額外放置在某個分割槽代號底下喔!

如何觀察檔案系統與掛載點呢?如下,輸入 df 即可!

[root@station200 ~]# df
檔案系統                 1K-區段    已用    可用 已用% 掛載點
devtmpfs                  918672       0  918672    0% /dev
tmpfs                     936704       0  936704    0% /dev/shm
tmpfs                     936704    9348  927356    1% /run
tmpfs                     936704       0  936704    0% /sys/fs/cgroup
/dev/mapper/centos-root 10475520 4786768 5688752   46% /
/dev/mapper/centos-home  3135488   70536 3064952    3% /home
/dev/vda2                1998672  149448 1727984    8% /boot
tmpfs                     187340      16  187324    1% /run/user/42
tmpfs                     187340       4  187336    1% /run/user/0

最左側出現 tmpfs 或 devtmpfs 的,都是記憶體模擬出來的檔案系統,用在特殊的用途,那個部份先不要理他。所以,重點就是出現 /dev 的那幾行! 那才是比較重要的裝置與檔案系統掛載的入口!

例題 13.1-2: 觀察 Linux 的檔案系統、磁碟與目錄掛載之間的關係
  1. 找出 df 的相關選項中,有沒有可以處理檔案系統類型 (filesystem type) 的顯示?
  2. 顯示出實際裝置、實際檔案系統、掛載點之間的資訊
  3. 承上,不要顯示 tmpfs 與 devtmpfs 的檔案系統,其他的則輸出檔案系統類型。
  4. /boot 與 / 分別用的是那一種檔案系統類型?
實行說明:只要透過 df --help 找到 -t -T -x 等參數的說明,即可完成上述的例題。

其實檔案系統在進行掛載的時候,是可以額外加上參數的!這些參數的觀察可以直接輸入 mount 來查看喔!

[root@station200 ~]# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=918672k,nr_inodes=229668,mode=755)
......
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
tmpfs on /run/user/42 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=187340k,mode=700,
uid=42,gid=42)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=187340k,mode=700)

是有點亂,所以,我們可以透過 egrep 的方式來抓出需要的項目即可:

[root@station200 ~]# mount | egrep ' / | /boot | /home '
/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/vda2 on /boot type ext4 (rw,relatime,seclabel)
# 括號內的資料就是掛載參數囉!
  • 磁碟容量總結與磁碟容量浪費的問題

我們知道格式化 (其實是建立檔案系統) 會有 superblock, inode, block 區塊,也知道了 inode 在記錄檔案權限與資料所在的區塊號碼, block 則是紀錄實際的資料,且通常一個 block 只能給一個檔案使用。那麼 superblock 的功能是什麼呢?基本上, superblock 是整個檔案系統資料變化最大的地方!因為所有的檔案系統操作時,幾乎都需要讀/寫 supberblock,超級區塊主要在紀錄檔案系統的總結資料,包括剩餘量、使用量、每個 block 的大小等等。所以,只要查詢 superblock,就可以知道整個檔案系統的整體容量與使用容量了。

例題 13.1-3: 由 superblock 與 du 去觀察整體系統的容量
  1. 使用『 df --block-size=M /boot /home 』看一下目前檔案系統的總使用量
  2. 使用『 du -sm /boot /home 』讓 du 這個指令實際分析檔案容量,並輸出 MB 的檔案總數量
  3. 兩個容量似乎不一致?通常 df 看到的容量會比較大,說說看為什麼?

上面的例題中,由於 (1)每個檔案或多或少都會損耗一些 block 數量。例如一個檔案使用了 10bytes 的容量,但是這個檔案所在的 block 無法再給其他檔案使用, 因此,磁碟就會計算使用掉 4Kbytes (假設每個 block 為 4K) 的容量。此外 (2)包括 inode 與 superblock 本身都會佔用一些檔案系統容量, 所以,你就會看到磁碟使用掉的檔案容量會比實際檔案容量還要多一些。

13.2: 磁碟分割

磁碟幾乎都需要先經過分割之後,才可以開始製作檔案系統 (就是俗稱的格式化)。目前在一般桌機的系統上面,或者是 x86 的伺服器系統上, 主要的開機檢測元件,大多數已經是 UEFI 了!UEFI 的開機環境,大部分都只支援 GPT 分割表,如果調整成為 BIOS 模式, 才可以支援較早的 MSDOS 分割表,也就是所謂的 MBR 分割表。

  • UEFI 的環境:大部分只支援 GPT 磁碟分割
  • BIOS 的環境:Linxu 支援 GPT 與 MSDOS (MBR) 分割表,但是 Windows 似乎僅支援 MSDOS 分割表。

早期的 MSDOS 由於只使用了整顆磁碟最前面 512bytes 的資料作為開機管理程式安裝區以及分割表紀錄區,其中作為分割表紀錄區的位置, 只有 64bytes 而已,因為如此,造成可以紀錄的最大磁碟容量,只達 2TB 左右~目前的磁碟容量都已經超過這個限制值,所以, 後來就有新的取代機制,那就是 GPT 分割表。

  • UEFI 與 BIOS 環境的差別

早期的電腦需要開機時,就得要透過主機板上面的 BIOS 軟體去載入 CMOS 的設定,然後對本機硬體進行各項自我偵測, 偵測完畢後,再從設 CMOS 保留的設定裡面去找出第一個開機裝置,然後載入該裝置的第一個磁區,也就是整顆磁碟最前面的 512bytes 部份的內容,透過載入該磁碟的 MBR 軟體後,就能夠進行作業系統核心的載入,進一步進行開機。

  • 主機開機,執行 BIOS 並載入 CMOS 設定,進行自我檢測
  • 偵測第一個開機裝置,並載入第一個 512bytes 磁區
  • 取得 boot loader 開機管理程式,並執行該程式,同時分析 partition table
  • 根據 boot loader 載入核心程式,進行作業系統開機。

如上所示,BIOS 既然設計成只會讀取第一個 512bytes 磁區的概念,也就是只能讀取 MSDOS 的 MBR partition table, 例如 windows 系統,在 BIOS 底下,基本上就不能認識 GPT 的分割表了。

那麼 Linux 的環境下,為何可以在 BIOS 底下啟動 GPT 分割表呢? 這是因為 Linux 的 GPT 分割表中,第一個區塊有個保留給 MSDOS 的 partition tables,那就是受保護的 MBR 分割表! 也因為有這個設計,所以 Linux 才可以在 BIOS 的環境下,保有 GPT 的分割表開機應用。

因為 BIOS 程式不容易修改,因此後來開發商帶入了 UEFI 的軟體,這個軟體也是在主機板開機時,透過類似 BIOS 的概念, 不過載入的是一個小型的系統程式,這個 UEFI 小系統程式有自己的存取界面,甚至可以驅動部份的硬體,也能提供圖形界面, 所以,後來開機進入 UEFI 界面時,就可以透過滑鼠來操作與設定許多開機選項。基本上,這個 UEFI 幾乎是一個小型完整的 OS 概念了! 相當有趣!

UEFI 主要支援的磁碟分割為 GPT 分割,UEFI 會根據設定,找到第一個開機裝置裡面,根據 GPT 分割表的紀錄,找到名為『 EFI system partition 』 的分割表系統代碼,也就是『 EF00 』這一個代碼,這個分割槽必須要被格式化為 FAT 的檔案系統,然後安裝 EFI 開機管理程式, 這樣才能夠開始提供系統開機!每個作業系統都必須要將它的開機管理程式安裝放置到這個分割槽,不然系統就無法開機喔!

  • 主機開機,執行 UEFI 軟體程式並載入設定,進行自我檢測
  • 檢測整體系統具有 GPT 分割表,且含有 Partition ID 為 EFI System partition 的分割槽
  • 前往該分割槽載入 EFI 開機管理軟體,取得開機選單
  • 根據 EFI 選單載入核心程式,進行作業系統開機。

整體流程與 BIOS 環境差異頗大!不過,整體來說,可以區分為:

  • BIOS 環境會讀取第一個開機裝置最前面 512bytes 處的開機軟體
  • UEFI 環境會讀取 GPT 分割內的 EFI system partition 分割槽內的開機軟體

因為上述的差異,所以,你要分割成什麼分割表的時候,務必要注意你的系統開機的時候是選擇什麼狀態的開機環境喔! BIOS 與 UEFI 並不相同的!畢竟未來 UEFI 與 GPT 分割才是主流,所以,我們雲端環境中,雖然使用了 BIOS 系統, 不過,因為 Linux 有提供 GPT 的支援,所以底下的環境,我們大致上使用的都是 GPT 分割喔!為何要使用 GPT 分割表呢?

  • MSDOS (MBR 分割表) 磁碟分割的限制

如前所示,由於 MBR 的紀錄區塊僅有 64 bytes 用在分割表,因此預設分割表僅能紀錄四筆分割資訊。 所謂的分割資訊即是紀錄開始與結束的磁區。這四筆紀錄主要為『主要分割槽 (primary)』與『延伸分割槽 (extended)』。延伸分割不能被格式化應用, 需要再從延伸分割當中割出『邏輯分割 (logical)』之後,才能夠應用。以 P 代表主要、E 代表延伸、L 代表邏輯分割槽,則相關性為:

  • 主要分割與延伸分割最多可以有四筆(硬碟的限制)
  • 延伸分割最多只能有一個(作業系統的限制)
  • 邏輯分割是由延伸分割持續切割出來的分割槽;
  • 能夠被格式化且作為資料存取的分割槽為主要分割與邏輯分割。延伸分割無法被格式化;
  • 邏輯分割的數量依作業系統而不同,在Linux系統中SATA硬碟已經可以突破63個以上的分割限制;
  • GPT 磁碟分割

常見的磁碟磁區有 512bytes 與 4K 容量,為了相容於所有的磁碟,因此在磁區的定義上面, 大多會使用所謂的邏輯區塊位址(Logical Block Address, LBA)來處理。GPT 將磁碟所有區塊以此 LBA(預設為 512bytes) 來規劃,而第一個 LBA 稱為 LBA0 (從 0 開始編號)。

與 MSDOS 僅使用第一個 512bytes 區塊來紀錄不同, GPT 使用了 34 個 LBA 區塊來紀錄分割資訊! 同時與過去 MBR 僅有一個區塊的情況不同, GPT 除了前面 34 個 LBA 之外,整個磁碟的最後 33 個 LBA 也拿來作為另一個備份! 因此,如果磁碟前面的分割紀錄不小心被惡搞而失去,可以透過分割工具,以磁碟最後方的磁區記載的分割表來復原, 對於資訊安全來說,也是相當重要的保護!

LBA2 ~ LBA33 為實際紀錄分割表的所在,每個 LBA 紀錄 4 筆資料,所以共可紀錄 32*4=128 筆以上的分割資訊。 因為每個 LBA 為 512bytes,因此每筆紀錄可佔用 512/4=128 bytes 的紀錄,因為每筆紀錄主要紀錄開始與結束兩個磁區的位置, 因此紀錄的磁區位置最多可達 64 位元,若每個磁區容量為 512bytes ,則單一分割槽的最大容量就可以限制到 8ZB, 其中 1ZB 為 2^30 TB。

此外,每筆 GPT 的分割紀錄,都是屬於 primary 的分割紀錄,可以直接拿來進行格式化應用的。

  • 磁碟分割 - 1:取得磁碟檔名與確認分割表類型

作業系統核心會主動去偵測分析硬體,並根據偵測的結果給予磁碟裝置檔名。磁碟檔名主要為 /dev/sd[a-p] 這種實體磁碟的檔名, 以及透過 virtio 模組加速的 /dev/vd[a-p] 的虛擬磁碟檔名。另外,如果使用了軟體磁碟陣列,或者是 Intel 主機板上面內建的磁碟陣列時, 磁碟檔名則會增加類似 /dev/md126 這類的名稱。

  • 實體磁碟、USB磁碟等: /dev/sda, /dev/sdb, /dev/sdc...
  • Virtio 磁碟: /dev/vda, /dev/vdb, /dev/vdc...
  • 軟體磁碟陣列: /dev/md0, /dev/md1...

那如何知道磁碟的檔名呢?可以透過 lsblk 即可。

[root@station200 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom
vda             252:0    0   30G  0 disk
├─vda1          252:1    0    2M  0 part
├─vda2          252:2    0    2G  0 part /boot
└─vda3          252:3    0   20G  0 part
  ├─centos-root 253:0    0   10G  0 lvm  /
  ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
  └─centos-home 253:2    0    3G  0 lvm  /home

看起來磁碟檔名為 /dev/vda,可能是虛擬機器的磁碟喔!而且這個磁碟總共有 30G 的容量,目前已經分割出三個分割槽, 檔名分別是 /dev/vda1, /dev/vda2, /dev/vda3 這三個分割槽。從上面就可以得到這樣的結果。 至於 /dev/vda3 是有特殊功能的,那個 20G 的分割槽又被切出三個裝置,那個東西是 LVM 系統,大二我們再來談。

那麼這個磁碟目前是使用什麼分割表類型呢?可以透過 parted 這個指令來查詢:

[root@station200 ~]# parted /dev/vda print
型號:Virtio 區塊裝置 (virtblk)
磁碟 /dev/vda:32.2GB
磁區大小 (邏輯/物理):512B/512B
分割區:gpt
磁碟旗標:pmbr_boot

編號  起始點  結束點  大小    檔案系統  名稱  旗標
 1    1049kB  3146kB  2097kB                  bios_grub
 2    3146kB  2151MB  2147MB  ext4
 3    2151MB  23.6GB  21.5GB                  lvm

看得出來,就是 GPT 分割表!另外,從上面也能知道,其實所謂的『分割』,就是提供 (1)一個起始點 (2)一個結束點,然後給予 (3)一個檔案系統識別碼, 若有其他要求,再加入其他旗標而已,否則,一般來說,就是給予上述的 3 個資料 (起點、終點、識別碼) 而已! 而為了解決終點的計算問題,所以目前終點都是以『增加多少容量』來讓系統自己計算!

  • 磁碟分割 - 2:以 fdisk 實際分割磁碟

早期的 GPT 與 MSDOS 的分割,需要使用不同的工具軟體來處理, 例如 gdisk 處理 GPT 分割表, fdisk 處理 MSDOS 分割表。不過,從 CentOS 8 以後,都可以使用 fdisk 這個指令來進行分割! fdisk 會自動判別分割表的類型,帶入正確的處理模式喔!所以,記得使用 fdisk 即可。

[root@station200 ~]# fdisk /dev/vda

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


命令 (m 以獲得說明):m

Help:

  GPT
   M   enter protective/hybrid MBR

  Generic
   d   delete a partition
   F   list free unpartitioned space
   l   list known partition types
   n   add a new partition
   p   print the partition table
   t   change a partition type
   v   verify the partition table
   i   print information about a partition

  Misc
   m   print this menu
   x   extra functionality (experts only)

  Script
   I   load disk layout from sfdisk script file
   O   dump disk layout to sfdisk script file

  Save & Exit
   w   write table to disk and exit
   q   quit without saving changes

  Create a new label
   g   create a new empty GPT partition table
   G   create a new empty SGI (IRIX) partition table
   o   create a new empty DOS partition table
   s   create a new empty Sun partition table

命令 (m 以獲得說明):

基本上, fdisk 這個指令的內部功能並不需要記憶,使用 m 去查詢用法即可!常見的用法如上面的特殊字體所示,相當簡單。 現在,先來列印一下分割表,然後查詢有沒有剩餘的容量?

命令 (m 以獲得說明):p
Disk /dev/vda: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 62CDB59E-F745-44E0-9286-FC13370D8116

所用裝置     Start     結束     磁區 Size 類型
/dev/vda1     2048     6143     4096   2M BIOS boot
/dev/vda2     6144  4200447  4194304   2G Linux filesystem
/dev/vda3  4200448 46151679 41951232  20G Linux LVM

看起來有 30G 的容量,不過目前只用掉了 22G 的容量而已,因此還有 8G 左右的容量可以用吧!另外,如果看磁區的話, 則共有 62914560 這麼多個磁區可用,不過,看到『結束』的欄位,其實只用到 46151679 號而已,所以還可以繼續分割喔! 既然如此,那就來分割出 1G 的磁碟看看:

命令 (m 以獲得說明):n
分割區編號 (4-128, default 4): <==這裡按 enter
First sector (46151680-62914526, default 46151680): <==這裡按 enter
Last sector, +sectors or +size{K,M,G,T,P} (46151680-62914526, default 62914526): +1G

Created a new partition 4 of type 'Linux filesystem' and of size 1 GiB.

命令 (m 以獲得說明):p
Disk /dev/vda: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 62CDB59E-F745-44E0-9286-FC13370D8116

所用裝置      Start     結束     磁區 Size 類型
/dev/vda1      2048     6143     4096   2M BIOS boot
/dev/vda2      6144  4200447  4194304   2G Linux filesystem
/dev/vda3   4200448 46151679 41951232  20G Linux LVM
/dev/vda4  46151680 48248831  2097152   1G Linux filesystem

重點如前面談到的,起點、終點與系統識別,預設的系統識別都會是 Linux 檔案系統,畢竟我們是在 Linux 環境下啊! 所以,根據上面的執行結果,就會出現上述有 1G 的磁碟,且磁碟檔名為 /dev/vda4 的裝置產生喔!接下來如果我們需要修改檔案系統識別碼, 就輸入 t 看看:

命令 (m 以獲得說明):t
分割區編號 (1-4, default 4): 4
Partition type (type L to list all types): L
  1 EFI System                     C12A7328-F81F-11D2-BA4B-00A0C93EC93B
  2 MBR partition scheme           024DEE41-33E7-11D3-9D69-0008C781F39F
......
 10 Microsoft reserved             E3C9E316-0B5C-4DB8-817D-F92DF00215AE   
 11 Microsoft basic data           EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 <==常用
 12 Microsoft LDM metadata         5808C8AA-7E8F-42E0-85D2-E1E90434CFB3
 13 Microsoft LDM data             AF9B60A0-1431-4F62-BC68-3311714A69AD
 14 Windows recovery environment   DE94BBA4-06D1-4D40-A16A-BFD50179D6AC
......
 19 Linux swap                     0657FD6D-A4AB-43C4-84E5-0933C84B4F4F <==常用
 20 Linux filesystem               0FC63DAF-8483-4772-8E79-3D69D8477DE4 <==常用
 21 Linux server data              3B8F8425-20E0-4F3B-907F-1A25A76F98E8
 22 Linux root (x86)               44479540-F297-41B2-9AF7-D131D5F0458A
 23 Linux root (ARM)               69DAD710-2CE4-4E3C-B16C-21A1D49ABED3
 24 Linux root (x86-64)            4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709
 25 Linux root (ARM-64)            B921B045-1DF0-41C3-AF44-4C6F280D3FAE
 26 Linux root (IA-64)             993D8D3D-F80E-4225-855A-9DAF8ED7EA97
 27 Linux reserved                 8DA63339-0007-60C0-C436-083AC8230908
 28 Linux home                     933AC7E1-2EB4-4F13-B844-0E14E2AEF915
 29 Linux RAID                     A19D880F-05FC-4D3B-A006-743F0F84911E
 30 Linux extended boot            BC13C2FF-59E6-4262-A352-B275FD6F7172
 31 Linux LVM                      E6D6D379-F507-44C2-A23C-238F2A3DF928 <==常用
.......
 87 Plan 9 partition               C91818F9-8025-47AF-89D2-F030D7000C2C

Partition type (type L to list all types): 20

Changed type of partition 'Linux filesystem' to 'Linux filesystem'.

這樣就可以改變了!如果一切都順利沒問題,接下來就可以將這個設計寫入到磁碟!

命令 (m 以獲得說明):w
The partition table has been altered.
Syncing disks.

[root@station200 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom
vda             252:0    0   30G  0 disk
├─vda1          252:1    0    2M  0 part
├─vda2          252:2    0    2G  0 part /boot
├─vda3          252:3    0   20G  0 part
│ ├─centos-root 253:0    0   10G  0 lvm  /
│ ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
│ └─centos-home 253:2    0    3G  0 lvm  /home
└─vda4          252:4    0    1G  0 part

按下 w 之後,該設定立刻寫入喔!而且直接更新核心!如果無法寫入核心,那可能就得要重新開機或使用 partprobe 來強迫更新了! 總之,這樣就建立好了 /dev/vda4 這個 1G 的磁碟了!

例題 13.2-1: 實際練習分割
  1. 嘗試回答底下的問題:
    1. 在一般 x86 桌機或伺服器環境下,由主機載入自我偵測的軟體主要有那兩種?
    2. 該兩種環境適合的磁碟分割表個別是那一種?
    3. 該兩種分割表類型的『開機管理程式』個別是放置在哪個地方?
    4. 什麼情況才會出現 /dev/vda 這種磁碟檔名?
  2. 進行磁碟檔名與分割表的確認
    1. 如何列出系統上面所有的磁碟檔名
    2. 如何列出上面磁碟的分割表類型?
  3. 實際進行分割,請刪除剛剛建立的 1G 的分割槽,並分別建立底下三個分割槽:
    1. 1500M、Linux filesystem 分割
    2. 1500M、Windows basic data 分割
    3. 1G、Linux swap 分割
參考解答:最終建立出來的分割槽應該會有點像底下這樣:
命令 (m 以獲得說明):p
Disk /dev/vda: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 62CDB59E-F745-44E0-9286-FC13370D8116

所用裝置      Start     結束     磁區  Size 類型
/dev/vda1      2048     6143     4096    2M BIOS boot
/dev/vda2      6144  4200447  4194304    2G Linux filesystem
/dev/vda3   4200448 46151679 41951232   20G Linux LVM
/dev/vda4  46151680 49223679  3072000  1.5G Linux filesystem
/dev/vda5  49223680 52295679  3072000  1.5G Microsoft basic data
/dev/vda6  52295680 54392831  2097152    1G Linux swap

事實上,最後除了 lsblk 之外,既然我們已經知道磁碟檔名,那麼可以透過 fdisk 直接列出分割表, 且不進行分割行為喔!這樣做看看:

[root@station200 ~]# fdisk -l /dev/vda
Disk /dev/vda: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 62CDB59E-F745-44E0-9286-FC13370D8116

所用裝置      Start     結束     磁區  Size 類型
/dev/vda1      2048     6143     4096    2M BIOS boot
/dev/vda2      6144  4200447  4194304    2G Linux filesystem
/dev/vda3   4200448 46151679 41951232   20G Linux LVM
/dev/vda4  46151680 49223679  3072000  1.5G Linux filesystem
/dev/vda5  49223680 52295679  3072000  1.5G Microsoft basic data
/dev/vda6  52295680 54392831  2097152    1G Linux swap

13.3: 建立檔案系統 (格式化) 與手動掛載

每種檔案系統都有其特色,Linux 當中,每種 distribution 慣用的檔案系統也不相同。最常見於 Linux 的檔案系統其實是 EXT3 這個標準型的檔案系統。後來加上一些額外的功能而有 EXT4 檔案系統。只是這種檔案系統一開始建立之後,就得要將全部的磁碟容量進行格式化 (也就是所有的 inode 與 block 號碼要全部被設定妥當),對於大容量的磁碟來說,一開始的格式化可能會佔用數分鐘到數十分鐘 (鳥哥曾經等過 30 分鐘的格式化)。為了應付這種大容量的磁碟裝置,因此後來許多的 Linux distribution 都愛用 XFS 或者是 reiserfs 這種用到才開始配置 inode 與 block 的檔案系統,至少格式化速度快非常多。

  • 建立檔案系統 (make filesystem)

Linux 的格式化使用 make filesysetm (mkfs) 來處理。不過 mkfs 只是一個綜合的指令,請使用 mkfs.<tab><tab> ,那個 <tab> 指的是鍵盤上面的 [tab] 按鈕 (通常放在大寫燈號的上方),那就會顯示出所有 mkfs 開頭的指令。出現的指令就是你的系統支援的檔案系統囉。 常見的檔案系統建置指令有:

[root@station200 ~]# mkfs[tab][tab]
mkfs         mkfs.ext2    mkfs.ext4    mkfs.minix   mkfs.vfat
mkfs.cramfs  mkfs.ext3    mkfs.fat     mkfs.msdos   mkfs.xfs

比較常用的指令與相關檔案系統關係:

  • mkfs.xfs /dev/xxx :格式化成為 XFS 檔案系統
  • mkfs.ext4 /dev/xxx :格式化成為 EXT4 檔案系統
  • mkfs.vfat /dev/xxx :格式化成為 VFAT 檔案系統

我們一般說的 FAT 檔案系統,在 Linux 底下被稱為 VFAT 喔!

例題 13.3-1:建立檔案系統
  1. 將 /dev/vda4 建立成為 XFS 檔案系統
  2. 將 /dev/vda5 建立成為 VFAT 檔案系統
參考解答
  1. mkfs.xfs /dev/vda4
  2. mkfs.vfat /dev/vda5

若想知道目前裝置與檔案系統的對應,同時取得每種檔案系統的各式單獨識別碼 (UUID),可以使用 blkid 來查閱看看即可:

[root@station200 ~]# blkid
/dev/vda2: UUID="73f13e7b-43c4-43c5-93b4-9e65b962752d" TYPE="ext4" 
           PARTUUID="37f60940-db11-4b6e-83f8-52c7b73bf820"
/dev/vda3: UUID="40OBvj-5n63-Dwml-s79y-3dHf-Aed0-3da0uF" TYPE="LVM2_member"
            PARTUUID="270edd4e-5013-44e6-aa4a-590b4d7e896e"
/dev/mapper/centos-root: UUID="6e34b71e-cb8a-4088-84b7-ec6cf0fcadd0" TYPE="xfs"
/dev/mapper/centos-swap: UUID="57dd6e82-8fb4-4433-82b5-f42216c1b0a9" TYPE="swap"
/dev/mapper/centos-home: UUID="9e161f20-b700-4126-a0c9-300a049cdc9f" TYPE="xfs"
/dev/vda1: PARTUUID="752f812a-6c0c-4390-9a03-40e976f44bb6"
/dev/vda4: UUID="28b31402-bac3-4815-84e3-be31fbfa0cca" TYPE="xfs" 
           PARTUUID="bcc2535e-dd24-9b42-89b4-6d6e0576f2b5"
/dev/vda5: UUID="6153-D6B2" TYPE="vfat" PARTUUID="4334231e-3b1b-a943-9bf7-7dab5a0d983d"
/dev/vda6: PARTUUID="3a4ed56a-f508-644c-8126-0f2ac8eee356"

跟旁邊的同學比較一下,你可以很明顯的發現,大家同樣都是 /dev/vda4 且格式化為相同的檔案系統,但是 UUID 都不會重複! 因此,識別該檔案系統時,比較建議使用 UUID 來處理較佳。這是因為裝置檔名可能會改變之故。例如,單獨一顆硬碟時,都會是 /dev/sda, 但若是有兩顆硬碟,那麼誰是 /dev/sda?誰是 /dev/sdb,且不同的連接線安裝順序,就可能會導致裝置檔名的改變。 所以,近期來,大家比較喜歡使用 UUID 作為掛載的概念!

  • 建立記憶體置換格式 (make swap)

記憶體置換指的是,當實體記憶體容量不足時,會將某些比較少使用的記憶體內的程序,移動到磁碟當中, 這個磁碟必須要先格式化成為 swap 格式,然後將實體記憶體內的程序移除,空出更多的實體記憶體給新的程序使用。 若你需要使用到 swap 內的程序時,則作業系統會再將其他的程序從實體記憶體移動到 swap,然後將你要使用的程序移入實體記憶體, 等到全部移入完全後,CPU 才能夠開始處理這個程序。

除非你的磁碟是比較快速的 SSD 或 PCI-E 界面的磁碟,否則,只要任何資料進入 swap,要再取用,就得要花費不少的時間成本。 然而 swap 又不能不要!某些時刻很少用到或者是突發性的大量超用實體記憶體時,這個 swap 就是個保命符!

建立 swap 很簡單喔:

  • mkswap /dev/xxx:格式化成為 swap 格式
例題 13.3-2: 建立 swap 格式
  1. 將 /dev/vda6 建立成為 swap 格式
  2. 找出 /dev/vda6 的 UUID 為何?
  • 手動掛載 / 安全卸載

掛載檔案系統到某個目錄,使用的指令就是 mount!

[root@localhost ~]# mount -a
[root@localhost ~]# mount [-l]
[root@localhost ~]# mount [-t 檔案系統] LABEL=''  掛載點
[root@localhost ~]# mount [-t 檔案系統] UUID=''   掛載點  # 建議用這種方式
[root@localhost ~]# mount [-t 檔案系統] 裝置檔名  掛載點
選項與參數:
-a  :依照設定檔 /etc/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) 的記憶體機制
      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:       重新掛載,這在系統出錯,或重新更新參數時,很有用!

事實上,現在的 mount 指令太聰明了!你不用加上 -t 的選項,直接『 mount /dev/xxx directory 』之後, 系統就會找出最佳的掛載檔案系統方式來處理,相當簡易!現在,請將 /dev/vda4 掛載到 /data/linux 去:

[root@station200 ~]# mount /dev/vda4 /data/linux
mount: /data/linux: mount point does not exist.
[root@station200 ~]# mkdir /data
[root@station200 ~]# mkdir /data/linux
[root@station200 ~]# mount /dev/vda4 /data/linux
[root@station200 ~]# df -T /data/linux
檔案系統       類型 1K-區段  已用    可用 已用% 掛載點
/dev/vda4      xfs  1525760 43760 1482000    3% /data/linux

掛載與目錄有關,你不能隨便將裝置掛載到系統的特定目錄去。於是,我們就掛載到 /data 目錄去。 但是 /data/ 目錄預設不存在,因此就得要一層一層去建立它,建立完畢後,才能重新掛載。 透過 df -T 就可以看到這個 1.5G 左右的檔案系統,是以 xfs 存在!

例題 13.3-3: 檔案系統的使用
  1. 先觀察 /data/linux 的 (1)檔案系統與 (2)inode 數量
  2. 將 /etc 與 /home 整個複製到 /data/linux 底下
  3. 再次觀察 (1)檔案系統與 (2)inode 數量
參考解答:
  1. df -T /data/linux; df -iT /data/linux
  2. cd /data/linux; cp -a /etc /home .
  3. df -T /data/linux; df -iT /data/linux
你可以發現 inode 數量所佔的使用百分比幾乎沒有變化!這是因為 inode 數量通常比較多,很不容易耗盡。 因此在一般的情境下,大家只要考慮檔案容量所使用的百分比例即可。

檔案系統使用完畢總是需要卸載的,卸載的方法很簡單,就是使用『 umount 掛載點 』或『 umount 裝置 』均可! 不過要注意,該裝置不能被使用中喔!例如我們要將 /data/linux 卸載,應該怎麼做?

[root@station200 linux]# cd /data/linux/home
[root@station200 home]# pwd
/data/linux/home
[root@station200 home]# df -T .
檔案系統       類型 1K-區段  已用    可用 已用% 掛載點
/dev/vda4      xfs  1525760 88812 1436948    6% /data/linux
# 看起來目前工作目錄就是在即將被卸載的裝置內喔!

[root@station200 home]# umount /data/linux
umount: /data/linux: target is busy.
[root@station200 home]# umount /dev/vda4
umount: /data/linux: target is busy.
# 因為在該裝置下,表示該裝置有人使用,因此就是『 busy 』忙碌中!不能卸載!

[root@station200 home]# cd /
[root@station200 /]# umount /data/linux
[root@station200 /]# df -T /data/linux
檔案系統                類型  1K-區段    已用    可用 已用% 掛載點
/dev/mapper/centos-root xfs  10475520 4785756 5689764   46% /
# 你可以發現掛載點變了!因為該目錄已經沒有額外的掛載,所以使用到的是 / 的資源。

檔案系統是作業系統裡面很重要的一環,因次 Linux 所有的資料都是以檔案存在!每次進行與檔案處理有關的任務時, 都會去搜尋整個檔案系統,當然就與掛載點有關系。因此,當你想要卸載某個裝置 (檔案系統) 時, 一定要確認檔案系統沒有在使用中才行! (這個問題在 USB 磁碟更顯得重要!很多同學都習慣直接將 USB 拔除, 該習慣一定要改!一定要先卸載!不論在 Linux 還是 Windows 環境中!)

例題 13.3-4: 手動掛載、操作檔案系統與卸載
  1. 使用 UUID 進行檔案系統的掛載:
    1. 使用 UUID,將 /dev/vda4 掛載到 /data/linux
    2. 使用 UUID,將 /dev/vda5 掛載到 /data/share
    3. 觀察掛載的狀態是否正常? (列出檔案系統類型與檔案系統使用量)
    4. 觀察上述掛載的 inode 目前數量
  2. 檔案系統的使用:
    1. 複製 /var/log, /var/lib 到 /data/share 內
    2. 再次觀察檔案系統容量狀態
  3. 將兩個檔案系統卸載
參考解答:
  1. 利用 UUID 掛載
    1. blkid /dev/vda4 (找到 UUID,並且複製。)
      mount UUID="28b31402-bac3-4815-84e3-be31fbfa0cca" /data/linux
    2. blkid /dev/vda5 (找到 UUID,並且複製。)
      mkdir /data/share
      mount UUID="6153-D6B2" /data/share
    3. df -T /data/linux /data/share
    4. df -Ti /data/linux /data/share (重點在,你會發現 vfat 檔案系統沒有 inode!)
  2. 開始嘗試複製
    1. cp -a /var/log /var/lib /data/share (會有部份忽略的訊息!)
    2. df -T /data/linux /data/share (容量當然有變化,但是 inode 不存在!)
  3. cd /; umount /data/linux /data/share
  • 啟用 swap 與卸載 swap

要先注意的是, swap 不是檔案系統,而是記憶體置換,因此,要啟用/觀察記憶體置換,並不是使用 df 喔! 改用的是觀察記憶體的 free 與 swapon 指令!舉例來說,要觀察整體的記憶體 (實體/記憶體置換) 容量,這樣看:

[root@station200 ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1873408      534640      673492       12636      665276     1169848
Swap:       2097148           0     2097148
[root@station200 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1829         522         657          12         649        1142
Swap:          2047           0        2047

透過 free -m 可以輸出 MBytes 容量,如果使用 free -h 也可以。從上面的資料可以看出,實體記憶體 (Mem) 共有 1829M,用掉 522M, 剩餘 657M 閒置中。用於緩衝與快取則有 649M,由於快取記憶體可以在記憶體量不足時予以釋出,因此可用 (available) 的記憶體, 就大概會是 free+cache 的量,那才是實際記憶體剩下能使用的數據。那麼這個 swap 的量來自哪裡呢?為什麼有 2047MB 的量? 可以使用 swapon 這樣看:

[root@station200 ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       2097148 0       -2

原來是來自 /dev/dm-1 這個裝置!這個 dm-1 是來自於 device mapper 服務的對應,而透過類似 LVM 的機制來對應到這個裝置的。 若有興趣,可以使用底下的方式找到對應:

[root@station200 ~]# ll /dev/mapper | grep dm-1
lrwxrwxrwx. 1 root root  7  5月 30 23:22 centos-swap -> ../dm-1

原來是 /dev/mapper/centos-swap 這個裝置的意思。那麼如何啟用 /dev/vda6 這個 swap 呢?同樣使用 swapon 即可!

[root@station200 ~]# swapon /dev/vda6
[root@station200 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1829         523         656          12         649        1141
Swap:          3071           0        3071
[root@station200 ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       2097148 0       -2
/dev/vda6                               partition       1048572 0       -3

卸載 swap 則使用 swapoff 囉!

[root@station200 ~]# swapoff /dev/vda6

13.4: 開機自動掛載 /etc/fstab

開機自動掛載的參數設定檔寫入在 /etc/fstab 當中,訓練機的 /etc/fstab 這個檔案的內容如下:

[root@localhost ~]# cat /etc/fstab
/dev/mapper/centos-root                   /         xfs     defaults    0 0
UUID=73f13e7b-43c4-43c5-93b4-9e65b962752d /boot     ext4    defaults    1 2
/dev/mapper/centos-home                   /home     xfs     defaults    0 0
/dev/mapper/centos-swap                   swap      swap    defaults    0 0

這個檔案主要有六個欄位,每個欄位的意義如下:

[裝置/UUID等]  [掛載點]  [檔案系統]  [檔案系統參數]  [dump]  [fsck]
  • 第一欄:磁碟裝置檔名/UUID/LABEL name:
    這個欄位可以填寫的資料主要有三個項目:
    • 檔案系統或磁碟的裝置檔名,如 /dev/vda2 等
    • 檔案系統的 UUID 名稱,如 UUID=xxx
    • 檔案系統的 LABEL 名稱,例如 LABEL=xxx
    管理員可以依據自己的喜好來填寫適當的裝置名稱,不過如果是實體分割槽的檔案系統,這裡建議使用 Linux 裝置內獨一無二的裝置代號, 亦即是 UUID 這個資料來替代裝置檔名較佳。建議使用 blkid 找到 UUID 之後,透過 UUID="XXX" 的方式來設定。
  • 第二欄:掛載點 (mount point):
  • 第三欄:磁碟分割槽的檔案系統:
    在手動掛載時可以讓系統自動測試掛載,但在這個檔案當中我們必須要手動寫入檔案系統才行!包括 xfs, ext4, vfat, reiserfs, nfs 等等
  • 第四欄:檔案系統參數:
    檔案系統參數有底下幾個常見的設定值,若無需要,先暫時不要更動預設的 defaults 設定值。
    參數內容意義
    async/sync
    非同步/同步
    設定磁碟是否以非同步方式運作!預設為 async(效能較佳)。所謂的非同步,意思是若有變動的檔案資料, 該資料會暫時儲存於記憶體中,而非立刻寫入磁碟之意。
    auto/noauto
    自動/非自動
    當下達 mount -a 時,此檔案系統是否會被主動測試掛載。預設為 auto。
    rw/ro
    可讀寫/唯讀
    讓該分割槽以可讀寫或者是唯讀的型態掛載上來,如果你想要分享的資料是不給使用者隨意變更的, 這裡也能夠設定為唯讀。則不論在此檔案系統的檔案是否設定 w 權限,都無法寫入喔!
    exec/noexec
    可執行/不可執行
    限制在此檔案系統內是否可以進行『執行』的工作?如果是純粹用來儲存資料的目錄, 那麼可以設定為 noexec 會比較安全。不過,這個參數也不能隨便使用,因為你不知道該目錄下是否預設會有執行檔。
    舉例來說,如果你將 noexec 設定在 /var ,當某些軟體將一些執行檔放置於 /var 下時,那就會產生很大的問題喔! 因此,建議這個 noexec 最多僅設定於你自訂或分享的一般資料目錄。
    user/nouser
    允許/不允許使用者掛載
    是否允許使用者使用 mount 指令來掛載呢?一般而言,我們當然不希望一般身份的 user 能使用 mount 囉,因為太不安全了,因此這裡應該要設定為 nouser 囉!
    suid/nosuid
    具有/不具有 suid 權限
    該檔案系統是否允許 SUID 的存在?如果不是執行檔放置目錄,也可以設定為 nosuid 來取消這個功能!
    defaults 同時具有 rw, suid, dev, exec, auto, nouser, async 等參數。 基本上,預設情況使用 defaults 設定即可!
  • 第五欄:能否被 dump 備份指令作用:
    dump 僅支援 EXT 家族,若使用 xfs 檔案系統,則不用考慮 dump 項目。因此直接輸入 0 即可。
  • 第六欄:是否以 fsck 檢驗磁區:
    早期開機的流程中,會有一段時間去檢驗本機的檔案系統,看看檔案系統是否完整 (clean)。 不過這個方式使用的主要是透過 fsck 去做的,我們現在用的 xfs 檔案系統就沒有辦法適用,因為 xfs 會自己進行檢驗,不需要額外進行這個動作!所以直接填 0 就好了。

針對我們訓練機的 /etc/fstab 的內容來說,在第 5, 6 欄位上,除了 /boot 這個 ext4 的檔案系統還有使用之外, 其餘的通通設定為 0 了!基本上,連同 ext4 也都能設定為 0 啦!避免未來改寫資料時,忘記修改這個欄位! 好了,那麼讓我們來處理一下我們的新建的檔案系統,看看能不能開機就掛載呢?

實際練習:讓 /dev/vda4, /dev/vda5 及 /dev/vda6 每次開機都能直接掛載或啟用,掛載點分別在 /data/linux, /data/share 目錄內。
  1. 透過 blkid 找到 /dev/vda4, /dev/vda5, /dev/vda6 這三個裝置的 UUID 資訊
    [root@localhost ~]# blkid /dev/vda4 /dev/vda5 /dev/vda6
    /dev/vda4: UUID="28b31402-bac3-4815-84e3-be31fbfa0cca" TYPE="xfs" .....
    /dev/vda5: UUID="6153-D6B2" TYPE="vfat" PARTUUID="4334231e-3b1b-a9.....
    /dev/vda6: UUID="22f8e646-7279-4ce2-a1ea-8f6156d65ba2" TYPE="swap".....
    
  2. 使用 vim 在 /etc/fstab 最底下新增三行資料,如下所示:
    [root@localhost ~]# vim /etc/fstab
    UUID="28b31402-bac3-4815-84e3-be31fbfa0cca" /data/linux xfs  defaults 0 0
    UUID="6153-D6B2"                            /data/share vfat defaults 0 0
    UUID="22f8e646-7279-4ce2-a1ea-8f6156d65ba2" swap        swap defaults 0 0
    
  3. 開始測試掛載以及 swap 置換有沒有成功的處理好。請注意,測試前請務必確認這三個裝置已經卸載且沒有使用中。
    [root@locahost ~]# mount -a
    [root@locahost ~]# swapon -a
    
    [root@locahost ~]# df -T /dev/vda4 /dev/vda5
    檔案系統       類型 1K-區段   已用    可用 已用% 掛載點
    /dev/vda4      xfs  1525760  88812 1436948    6% /data/linux
    /dev/vda5      vfat 1532984 152396 1380588   10% /data/share
    
    [root@locahost ~]# swapon -s
    Filename                                Type            Size    Used    Priority
    /dev/dm-1                               partition       2097148 0       -2
    /dev/vda6                               partition       1048572 0       -3
    

你得要特別注意的是,當上述的裝置或掛載點已經被使用時,那麼你的 /etc/fstab 內關於該裝置或載點的資訊,將不會被測試掛載。 所以,上面的練習中,原有的掛載點,亦即是 /, /home 等,其實不會被重新測掛載的。因此,當你要測試時,請先將要被測試的載點卸載, 這樣才能夠真的測試你的設定是否正確喔!

13.5: 其他檔案/裝置的掛載與使用

生活中,總有需要用到 USB 磁碟,或者是光碟機的時候 (當然,光碟機越來越少機會用到了)。如果你是使用 GUI 界面, 那麼系統可能會自動的幫你將裝置放置到某個目錄去,不過,或許不是你喜歡的位置...如果硬要掛載到某個目錄, 可以手動處理的。

例題 13.5-1: 嘗試放置 CentOS 8 的光碟片到雲端硬碟上,並且掛載到 /mnt 目錄內
  1. 先在 gocloud 的系統上面,在『啟動/關閉主機』的頁面上,左下角的『置換光碟』點選,然後選擇『CentOS 8.X』的光碟, 選定之後,按下『置換光碟』按鈕,接下來,你就會看到左下方的『光碟檔名』部份,切換到你剛剛點選的光碟了。
  2. 在 CentOS 8 的環境下,輸入 lsblk 可以看到原本的 sr0 這個裝置,容量長大到 7G 了。
  3. 將 /dev/sr0 掛載到 /mnt 上面,掛載完畢使用 df -T /mnt 看一下掛載的檔案系統類型為何?
  4. ll /mnt//isolinux/ 是否可以看到一些開機檔案的檔名資訊?
  5. 使用完畢後,請卸載這個裝置。

這個是光碟的概念,如果是一般的 USB 磁碟的話,可能就會看到類似 /dev/sdc1 這樣的裝置檔名,同樣可以透過剛剛上面的步驟來進行掛載使用喔! 相當簡便。那如果你今天已經下載了一個光碟映像檔 (就是所謂的 ISO 檔案),你並不想要將這個檔案燒錄成為光碟或者是 USB 時, 那能不能直接掛載這個映像檔呢?是可以的,我們以底下的案例來處理看看:

例題 13.5-2: 掛載下載的映像檔
  1. 前往根目錄,然後使用 wget 這個指令,下載名為 http://172.16.200.254/vbird/myiso.iso 的映像檔
  2. 嘗試直接掛載該映像檔到 /mnt 當中
  3. 使用 df -T /mnt 查看一下掛載的檔案系統為何?
  4. 前往查閱 /mnt 底下的檔案內容為何?
  5. 卸載該檔案系統

也就是說,其實映像檔是以 iso9660 的檔案類型存在,我們可以簡單的以 mount 的方式直接掛載檔案呢! 直接讀取裡面的檔案即可!相當有趣喔!

  • 創建巨型檔案、格式化與應用

有時候,我們想要使用大型檔案來取代檔案系統,最直覺得案例,就是透過檔案系統取代 swap, 因為似乎沒有必要為了 swap 特別分割出一個分割槽~可以學學 Windows 透過分頁檔案來處理的感覺。 那麼如何建置大型檔案來『格式化』呢?也是很簡單,可以透過 dd 這個指令來處置。

[root@station200 /]# dd if=/dev/zero of=/output/filename bs=1M count=number
if ==> input file,讀入的檔名
of ==> output file,輸出的檔名
bs ==> block size,每個 block 容量
count ==> 總共輸出多少 block 的數量之意。

處理完畢之後,再以 mkswap 或 mkfs 等指令來格式化即可!接下來也就能使用 mount 來掛載了。

例題 13.5-3: 建立大型檔案、格式化、掛載與使用
  1. 建立一個名為 /myimg.img 的大型檔案,容量約為 1G
  2. 將 /myimg.img 格式化為 ext4 檔案系統
  3. 將 /myimg.img 掛載到 /data/ext4 目錄下
  4. 觀察 /data/ext4 這個載點的掛載資訊
  5. 建立一個名為 /myswap.img 的大型檔案,容量約為 500M
  6. 將 /myswap.img 格式化為 swap
  7. 啟用 /myswap.img 的 swap 功能。
  8. 觀察 swap 的使用情況
參考解答:
  1. dd if=/dev/zero of=/myimg.img bs=1G count=1
  2. mkfs.ext4 /myimg.img
  3. mount /myimg.img /data/ext4
  4. df -T /data/ext4; mount | grep /data/ext4
  5. dd if=/dev/zero of=/myswap.img bs=500M count=1
  6. mkswap /myswap.img
  7. swapon /myswap.img
  8. free -m; swapon -s

所以,大型檔案的建立、格式化與使用,就正式開始囉!

13.6: 開機過程檔案系統出錯的救援

管理員如果修改過 /etc/fstab 卻忘記使用 mount -a 測試,則當設定錯誤,非常有可能會無法順利開機。如果是根目錄設定出錯,問題會比較嚴重, 如果是一般正規目錄設定錯誤,則依據該目錄的重要性,可能會進入單人維護模式或者是依舊可以順利開機。底下的練習中,讀者將實驗讓 /home 設定錯誤, 以嘗試進入單人維護模式救援檔案系統。

實際練習:模擬檔案系統設定 /etc/fstab 寫錯時,導致系統無法順利開機的狀況,並加以排除!
  1. 使用 vim 編輯 /etc/fstab,將 /home 的所在行從原本的設定修改成為錯誤的設定,如下所示:
    [root@localhost ~]# vim /etc/fstab
    # 先找到這一行:
    /dev/mapper/centos-home  /home xfs  defaults   0 0
    
    # 將上面的資料改成如下的模樣
    /dev/mapper/centos-home1  /home xfs  defaults   0 0
    
  2. 上述資料修改完畢儲存離開後,重新開機系統。由於檔案系統出錯 (/home 為相當重要的正規目錄),因此系統經過一段時間的探索後,會進入到單人維護模式的環境, 該環境顯示如下所示:
    檔案系統出錯進入救援模式的情況 檔案系統出錯進入救援模式的情況
  3. 在游標上輸入 root 的密碼,就可以進入終端機模式。不過此時可能從螢幕上找不到問題。請依據上圖中顯示的 journalctl -xb 這個關鍵字的提示, 直接輸入『 journalctl 』來查詢開機流程的問題。進入 journalctl 畫面後,先按大寫『 G 』,再以『 PageUp 』按鈕向前翻頁數次, 找到紅色字體請仔細觀看,應該會發現如下畫面:
    檔案系統出錯進入救援模式的情況
  4. 由上述的圖示可以發現就是 /home 的設定有問題,因此管理員可以: (1)進入 /etc/fstab 暫時註解 /home 所在行或者是 (2)自行找到正確的方案來解決。 因為本案例可以查詢到裝置設定錯誤,因此請修改正確的裝置名稱,然後透過 reboot 來重新開機。

老實說,檔案系統設定錯誤是一個很常見的情況,很多時候是因為 /etc/fstab 手滑打錯字產生的問題。所以, 了解怎麼解決問題,對於系統管理員來說,也是一個很重要的訓練!

13.7: 課後練習

作業上傳時的注意事項:

  1. 伺服器的詳細資料,以及相關傳輸軟體設定,請參考第一章的 1.5 節的內容。
  2. 可以使用 MS office 的 word 或者是 libreoffice 的 writer 等軟體來撰寫你的作業,作業檔名可以使用 .doc, .docx 或者是 .odt 或者是 pdf 等格式,均可接受。
  3. 若作業中有圖檔,請將圖檔降低水平解析度到 800 像素以下再貼到文章中,檔案容量以不超過 2Mbytes 為限。
  4. 檔名請設定為: os_4XXXCYYY_unit13.doc (4XXXCYYY 是你的學號,請填正確,有分大小寫,請確認)
  5. 請上傳到你家目錄底下的 os 目錄中 (若不存在,請自行建立該目錄)

開始本章節題目:

因為亂改系統會導致下次上課變得怪怪的!所以,請使用另一顆硬碟 (自我回家練習那一顆) 進行底下的作業實做,不要使用上課用的這顆硬碟喔!

  1. 簡答題:
    1. 常見的檔案系統依據有沒有格式化出 inode 而分為那兩種類型的檔案系統?
    2. 承上,其中那一種檔案系統,可能需要定期進行『磁碟重組』,以加快其讀寫效能?
    3. 簡單說明檔案系統格式化後,出現的 inode, block, superblock 區塊的內容都是紀錄些什麼資訊?
    4. 說明 (1)一般檔案與 (2)目錄檔案,其 block 內紀錄分別什麼東西?
    5. 假設你想要知道 /etc 與 /etc/hosts 及 /etc/crontab 的 inode 號碼,該用什麼指令配合什麼選項與參數?寫下完整的指令。
    6. 本節課程談到的內容中,那兩個指令可以列出檔案系統與掛載點間的關係?
    7. 本節課程談到的內容中,那一個指令可以列出某個目錄底下的使用容量?舉例來說,分析一下 /usr 佔用的容量?寫下完整指令與選項
    8. 常見的 PC 開機自我偵測流程,主要有那兩種軟體?
    9. 這兩種軟體各自支援那一種磁碟的分割表?
  2. 磁碟分割與檔案系統製作:
    1. 依據底下的結果,處理你的磁碟分割與檔案系統的建置,請注意,該掛載在下次開機也會生效, 亦即需要寫入到 /etc/fstab 紀錄檔當中之意。
      • /dev/vda4, 1GB, XFS, /srv/linux
      • /dev/vda5, 1500Mb, EXT4, /srv/linux2
      • /dev/vda6, 500M, VFAT, /srv/win
    2. 建置處理完畢之後,執行底下的指令,然後截圖貼上
      lsblk; df -T /dev/vda4 /dev/vda5 /dev/vda6; grep srv /etc/fstab
  3. 大型檔案的處理
    1. 建立一個名為 /srv/linux2/swap.img 檔案,容量約為 500M 即可
    2. 將上述檔案格式化成為 swap 格式
    3. 將該 swap 啟用。
    4. 執行結束後,輸入 swapon -s ,將結果截圖貼上。