Linux 基礎學習訓練教材 - CentOS 8.x

第 14 堂課:進階檔案系統管理

檔案系統是個迷人又磨人的東西~管理的好,你的系統會很穩定,管理不好,擴充容量又會產生大問題~加油吧!

最近更新時間: 2020/06/11

基礎的檔案系統管理中,通常一個 partition 只能作為一個 filesystem。但實際上,我們可以透過 RAID 的技術以及 LVM 的技術將不同的 partition/disk 整合成為一個大的檔案系統,而這些檔案系統又能具有硬體容錯的功能在,對於關注儲存設備物理安全性的管理員來說,這些技術相當的重要!

14.1:軟體磁碟陣列 (Software RAID)

陣列 (RAID) 的目的主要在『加大磁碟容量』、『具有磁碟容錯』、『增加讀寫效能』等方面,而根據你著重的面向就得要使用不同的磁碟陣列等級了。

14.1.1:什麼是 RAID

磁碟陣列全名是『 Redundant Arrays of Independent Disks, RAID 』,英翻中的意思為:獨立容錯式磁碟陣列,舊稱為容錯式廉價磁碟陣列, 反正就稱為磁碟陣列即可!RAID 可以透過一個技術(軟體或硬體),將多個較小的磁碟整合成為一個較大的磁碟裝置; 而這個較大的磁碟功能可不止是儲存而已,他還具有資料保護的功能。 整個 RAID 由於選擇的等級 (level) 不同,而使得整合後的磁碟具有不同的功能,基本常見的 level 有這幾種:

  • RAID-0 (等量模式, stripe, 效能最佳):兩顆以上的磁碟組成 RAID-0 時,當有 100MB 的資料要寫入,則會將該資料以固定的 chunk 拆解後, 分散寫入到兩顆磁碟,因此每顆磁碟只要負責 50MB 的容量讀寫而已。如果有 8 顆組成時,則每顆僅須寫入 12.5MB ,速度會更快。此種磁碟陣列效能最佳, 容量為所有磁碟的總和,但是不具容錯功能。
  • RAID-1 (映射模式, mirror, 完整備份):大多為 2 的倍數所組成的磁碟陣列等級。若有兩顆磁碟組成 RAID-1 時,當有 100MB 的資料要寫入, 每顆均會寫入 100MB,兩顆寫入的資料一模一樣 (磁碟映射 mirror 功能),因此被稱為最完整備份的磁碟陣列等級。但因為每顆磁碟均須寫入完整的資料, 因此寫入效能不會有明顯的提昇,但讀取的效能會有進步。同時容錯能力最佳,但總體容量會少一半。
  • RAID 1+0:此種模式至少需要 4 顆磁碟組成,先兩兩組成 RAID1,因此會有兩組 RAID1,再將兩組 RAID1 組成最後一組 RAID0,整體資料有點像底下的圖示:
    圖 14.1.1-1、RAID-1+0 的磁碟寫入示意圖
    圖 14.1.1-1、RAID-1+0 的磁碟寫入示意圖
    因此效能會有提昇,同時具備容錯,雖然容量會少一半。
  • RAID 5, RAID 6 (效能與資料備份的均衡考量):RAID 5 至少需要 3 顆磁碟組成,在每一層的 chunk 當中,選擇一個進行備份, 將備份的資料平均分散在每顆磁碟上,因此任何一顆磁碟損毀時,都能夠重建出原本的磁碟資料,原理圖示有點像底下這樣:
    圖 14.1.1-2、RAID-5 的磁碟寫入示意圖
    圖 14.1.1-2、RAID-5 的磁碟寫入示意圖
    因為有一顆容量會用在備份上,因此總體容量少一顆,而為了計算備份的同位檢查碼 (partity),因此效能較難評估,原則上,效能比起單顆磁碟還是會稍微提昇。 不過還是具備有容錯功能,在越多顆磁碟組成時,比 RAID-1 要節省很多的容量。不過為了擔心單顆備份還是不太足夠,因此有 RAID 6 可以使用兩個 partity 來備份, 因此會佔用兩顆容量就是了。
例題:嘗試完成底下的表格
項目RAID0RAID1RAID10RAID5RAID6
最少磁碟數2
最大容錯磁碟數(1)n-1
資料安全性(1)完全沒有
理論寫入效能(2)n1n/2<n-1<n-2
理論讀出效能(2)nnn<n-1<n-2
可用容量(3)n1
一般應用強調效能但資料不重要的環境資料與備份伺服器、雲系統常用資料與備份資料與備份

而達成磁碟陣列功能的,主要有硬體 RAID 與軟體 RAID。

  • 硬體磁碟陣列:中高階硬體 RAID 為獨立的 RAID 晶片,內含 CPU 運算功能,可以運算類似 RAID 5/6 的 parity 資料,據以寫入磁碟當中。 越高階的 RAID 還具有更多的快取 (cache memory),可以加速讀/寫的性能。由於是硬體磁碟陣列組成的『大容量磁碟』,因此 Linux 會將他視為一顆獨立的物理磁碟,檔名通常就是 /dev/sd[abcd..]。
  • 軟體磁碟陣列:由作業系統提供模擬,透過 CPU 與 mdadm 軟體模擬出中高階磁碟陣列卡的功能,以達到磁碟陣列所需要的效能、容錯、容量增大的功能。 因為是作業系統模擬的,因此檔名會是 /dev/md[0123..]。這種作法很常見於 NAS 檔案伺服器環境中。
例題 14.1.1-1:
根據上述的內容,簡易說明磁碟陣列對於伺服器的重要性在哪裡?

14.1.2:Software RAID 的使用

Software RAID 主要透過 mdadm 這個軟體的協助,因此需要先確認 mdadm 是否安裝妥當。而 mdadm 的指令也相當簡單,範例如下:

  • 建立磁碟陣列
[root@localhost ~]# mdadm --create /dev/md[0-9] --auto=yes --level=[015] --chunk=NK \
> --raid-devices=N --spare-devices=N /dev/sdx 

--create          :為建立 RAID 的選項;
--auto=yes        :決定建立後面接的軟體磁碟陣列裝置,亦即 /dev/md0, /dev/md1...
--level=[015]     :設定這組磁碟陣列的等級。支援很多,不過建議只要用 0, 1, 5 即可
--chunk=Nk        :決定這個裝置的 chunk 大小,也可以當成 stripe 大小,一般是 64K 或 512K。
--raid-devices=N  :使用幾個磁碟 (partition) 作為磁碟陣列的裝置
--spare-devices=N :使用幾個磁碟作為備用 (spare) 裝置
例題 14.1.2-1:使用 mdadm 建立軟體磁碟陣列,預設用到 5 個完全一樣的分割槽來測試!
  1. 先檢查 mdadm 是否存在於你的系統內?一般來說是存在的,若不存在,請自行安裝。
  2. 進行磁碟分割,需要用到 5 個容量皆為 300M 的分割槽,注意 partition ID 喔!
  3. 使用底下的資料來建立好你的磁碟陣列:
    • 建立的磁碟陣列先使用 /dev/md0 作為裝置的檔名 (這個裝置檔名系統可能會自己調整)
    • 利用 4 個 partition 組成 RAID 5;
    • 利用 1 個 partition 設定為 spare disk
    • chunk 設定為 256K 這麼大即可!
  4. 使用最佳化參數處理 XFS 檔案系統格式化:
    • su 為指定 stripe 寬度,所以可以指定為 256K
    • sw 為指定多少個 stripe,因為 4 個組成 RAID5,所以只有提供 (4-1)=3 個資料,因此 sw 為 3 才對。
    • 格式化 mkfs.xfs 要帶入上述參數才好
  5. 將此 RAID 5 裝置掛載到 /srv/raid 目錄下
  • 觀察磁碟陣列

磁碟陣列建置妥當後,應該觀察一下運作的狀況比較妥當。主要的觀察方式為:

[root@localhost ~]# mdadm --detail /dev/md[0-9]
[root@localhost ~]# cat /proc/mdstat

需要注意到是否有磁碟在損毀的狀況才行。

  • 磁碟陣列的救援功能

假設 (1)磁碟陣列有某顆磁碟損毀了,或 (2)磁碟使用壽命也差不多,預計要整批換掉時,使用抽換的方式一顆一顆替換,如此則不用重新建立磁碟陣列。

在此情況下,管理員應該要將磁碟陣列設定為損毀,然後將之抽離後,換插新的硬碟才可以。基本的指令需求如下:

[root@localhost ~]# mdadm --manage /dev/md[0-9] [--add 裝置] [--remove 裝置] [--fail 裝置] 

--add    :會將後面的裝置加入到這個 md 中!
--remove :會將後面的裝置由這個 md 中移除
--fail   :會將後面的裝置設定成為出錯的狀態
例題 14.1.2-2: 練習將壞掉裝置抽換的行為
  1. 先觀察剛剛建立的磁碟陣列是否正常運作,同時觀察檔案系統是否正常 (/srv/raid 是否可讀寫)
  2. 將某顆運作中的磁碟 (例如 /dev/vda7) 設定為錯誤 (--fail),再觀察磁碟陣列與檔案系統
  3. 將錯誤的磁碟抽離 (--remove) 之後,假設修理完畢,再加入該磁碟陣列 (--add),然後再次觀察磁碟陣列與檔案系統

14.2:邏輯捲軸管理員 (Logical Volume Manager)

雖然 RAID 可以將檔案系統容量增加,也有效能增加與容錯的機制,但是就是沒有辦法在既有的檔案系統架構下,直接將容量放大的機制。 此時,可以彈性放大與縮小的 LVM 輔助,就很有幫助了。不過 LVM 主要是在彈性的管理檔案系統,不在於效能與容錯上。 因此,若需要容錯與效能,可以將 LVM 放置到 RAID 裝置上即可。

14.2.1:LVM 基礎: PV, PE, VG, LV 的意義

LVM 的全名是 Logical Volume Manager,中文可以翻譯作邏輯捲軸管理員。之所以稱為『捲軸』可能是因為可以將 filesystem 像捲軸一樣伸長或縮短之故!LVM 的作法是將幾個實體的 partitions (或 disk) 透過軟體組合成為一塊看起來是獨立的大磁碟 (VG) , 然後將這塊大磁碟再經過分割成為可使用分割槽 (LV), 最終就能夠掛載使用了。

  • Physical Volume, PV, 實體捲軸:作為 LVM 最基礎的物理捲軸,可以是 partition 也可以是整顆 disk。
  • Volume Group, VG, 捲軸群組:將許多的 PV 整合成為一個捲軸群組 (VG),這就是所謂的最大的主要大磁碟。 讀者應該知道磁碟的最小儲存單位為 sector,目前主流 sector 為 512bytes 或 4K。而 LVM 也有最小儲存單位, 那就是 Physical Extent (PE),所有的資料都是透過 PE 在 VG 當中進行交換的。
  • Physical Extent, PE, 實體範圍區塊:PE 是整個 LVM 最小的儲存區塊,系統的檔案資料都是藉由寫入 PE 來處理的。 簡單的說,這個 PE 就有點像檔案系統裡面的 block 。PE 預設需要是 2 的次方量,且最小為 4M 才行。
  • Logical Volume, LV, 邏輯捲軸:最終將 VG 再切割出類似 partition 的 LV 即是可使用的裝置了。 LV 是藉由『分配數個 PE 所組成的裝置』,因此 LV 的容量與 PE 的容量大小有關。

上述談到的資料,可使用下圖來解釋彼此的關係:

圖 14.2.1-1、LVM 各元件的實現流程圖示
圖 14.2.1-1、LVM 各元件的實現流程圖示
例題 14.2.1-1: 查閱 LVM 的 Systemid
使用 gdisk 或 fdisk 指令查詢一下,若需要將 partition 指定為 LVM 時,其 system ID (檔案系統識別碼) 應該指定為什麼?

14.2.2:LVM 實做流程

如前一小節所述,管理員若想要處理 LVM 的功能,應該從 partition --> PV --> VG --> LV --> filesystem 的角度來處理。 請讀者以底下的設定來實做出一組 LVM 來使用:

  • 使用 4 個 partition ,每個 partition 的容量均為 300MB 左右,且 system ID 需要為 8e;
  • 全部的 partition 整合成為一個 VG,VG 名稱設定為 myvg ;且 PE 的大小為 16MB;
  • 建立一個名為 mylv 的 LV,容量大約設定為 500MB 左右
  • 最終這個 LV 格式化為 xfs 的檔案系統,且掛載在 /srv/lvm 中

先使用 gdisk 或 fdisk 分割出本案例所需要的 4 個分割,假設分割完成的磁碟檔名為 /dev/vda{9,10,11,12} 四個。 接下來即可使用 LVM 提供的指令來處理後續工作。一般來說, LVM 的三個階段 (PV/VG/LV) 均可分為『建立』、『掃描』與『詳細查閱』等步驟, 其相關指令可以彙整如下表:

任務PV 階段VG 階段LV 階段filesystem
(XFS / EXT4)
搜尋(scan)pvscanvgscanlvscanlsblk, blkid
建立(create)pvcreatevgcreatelvcreatemkfs.xfsmkfs.ext4
列出(display)pvdisplayvgdisplaylvdisplaydf, mount
增加(extend) vgextendlvextend (lvresize)xfs_growfsresize2fs
減少(reduce) vgreducelvreduce (lvresize)不支援resize2fs
刪除(remove)pvremovevgremovelvremoveumount, 重新格式化
改變容量(resize)  lvresizexfs_growfsresize2fs
改變屬性(attribute)pvchangevgchangelvchange/etc/fstab, remount
例題 14.2.2-1: 如上說明,請建立 4 個 300M 的分割槽喔!
  • PV 階段

所有的 partition 或 disk 均需要做成 LVM 最底層的實體捲軸,直接使用 pvcreate /device/name 即可。實做完成後,記得使用 pvscan 查閱是否成功。

[root@localhost ~]# pvcreate /dev/vda{9,10,11,12}
[root@localhost ~]# pvscan
  PV /dev/vda3    VG centos   lvm2 [20.00 GiB / 5.00 GiB free]
  PV /dev/vda12               lvm2 [300.00 MiB]
  PV /dev/vda11               lvm2 [300.00 MiB]
  PV /dev/vda10               lvm2 [300.00 MiB]
  PV /dev/vda9                lvm2 [300.00 MiB]
  Total: 5 [21.17 GiB] / in use: 1 [20.00 GiB] / in no VG: 4 [1.17 GiB]
  • VG 階段

VG 比較需要注意的有三個項目:

  • VG 內的 PE 數值需要是 2 的倍數,如果沒有設定,預設會是 4MB
  • VG 需要給名字
  • 需要指定哪幾個 PV 加入這個 VG 中。

根據上述的資料,使用 vgcreate --help 可以找到相對應的選項與參數,於是使用如下的指令來完成 VG 的任務:

[root@localhost ~]# vgcreate -s 16M myvg /dev/vda{9,10,11,12}
[root@localhost ~]# vgdisplay myvg
  --- Volume group ---
  VG Name               myvg
  System ID
  Format                lvm2
  Metadata Areas        4
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                4
  Act PV                4
  VG Size               1.12 GiB
  PE Size               16.00 MiB
  Total PE              72
  Alloc PE / Size       0 / 0
  Free  PE / Size       72 / 1.12 GiB
  VG UUID               R8lCNk-H71V-g0XW-OtZe-pCFk-3H0d-OHZQ5p
  • LV 階段

LV 為實際被使用在檔案系統內的裝置,建置時需要考量的項目大概有:

  • 使用哪一個 VG 來進行 LV 的建置
  • 使用多大的容量或多少個 PE 來建置
  • 亦需要有 LV 的名字

同樣使用 lvcreate --help 查閱,之後可以得到如下的選項與參數之設定:

[root@localhost ~]# lvcreate -n mylv -L 500M myvg
  Rounding up size to full physical extent 512.00 MiB
  Logical volume "mylv" created.

[root@localhost ~]# lvdisplay /dev/myvg/mylv
  --- Logical volume ---
  LV Path                /dev/myvg/mylv
  LV Name                mylv
  VG Name                myvg
  LV UUID                ySi50J-pLoN-fjAq-tJmI-hNts-cwkT-fGxuBe
  LV Write Access        read/write
  LV Creation host, time station200.centos, 2020-06-08 16:57:44 +0800
  LV Status              available
  # open                 0
  LV Size                512.00 MiB
  Current LE             32
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:3

由於實際建立的 LV 大小是由 PE 的數量來決定,因為本案例中使用 16MB 的 PE,因此不會剛好等於 500MB,故 LV 自動選擇接近 500MB 的數值來建立, 因此上表中會得到使用 512MB 的容量。

另外,最終實際可用的 LV 裝置名稱為 /dev/myvg/mylv ,而因為 LVM 又是由 device mapper 的服務所管理的, 因此最終的名稱也會指向到 /dev/mapper/myvg-mylv 當中。無論如何,讀者僅需要記憶 /dev/myvg/mylv 這種格式的裝置檔名即可。

例題 14.2.2-2: LVM 的檔案系統建置與掛載
  1. 請將上述的 /dev/myvg/mylv 實際格式化為 xfs 檔案系統,且此 fileysytem 可以開機後自動掛載於 /srv/lvm 目錄下。
  2. 再建立一個名為 /dev/myvg/mylvm2 的 LV 裝置,容量約為 300MB 左右,格式化為 ext4 檔案系統,開機後自動掛載於 /srv/lvm2 目錄下。

14.2.3:彈性化處理 LVM 檔案系統

LVM 最重要的任務就是進行裝置的容量放大與縮小,不過,前提是在該裝置下的檔案系統能夠支援放大與縮小才行。 目前在 CentOS 8 上面主要的兩款檔案系統中, ext4 可以放大與縮小,但是 xfs 檔案系統則僅能放大而已。因此使用上需要特別注意。

  • 將 myvg 所有剩餘容量分配給 /dev/myvg/mylvm2

從上面的案例中,讀者可以知道 myvg 這個 VG 的總容量 1.1G 當中,有 500M 給 /dev/myvg/mylv 而 300M 給 /dev/myvg/mylvm2, 因此剩下大約 300MB 左右,讀者可以使用『 vgdisplay myvg 』來查詢剩餘的容量。若需要將檔案系統放大,則需要進行:

  • 先將 mylvm2 放大
  • 再將上面的檔案系統放大

上述兩個步驟的順序不可錯亂。將 mylvm2 放大的方式為:

[root@localhost ~]# vgdisplay myvg
  --- Volume group ---
  VG Name               myvg
  System ID
  Format                lvm2
  Metadata Areas        4
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                4
  Act PV                4
  VG Size               1.12 GiB
  PE Size               16.00 MiB
  Total PE              72
  Alloc PE / Size       51 / 816.00 MiB
  Free  PE / Size       21 / 336.00 MiB
  VG UUID               R8lCNk-H71V-g0XW-OtZe-pCFk-3H0d-OHZQ5p

[root@localhost ~]# lvscan
  ACTIVE            '/dev/myvg/mylv' [512.00 MiB] inherit
  ACTIVE            '/dev/myvg/mylvm2' [304.00 MiB] inherit
  ACTIVE            '/dev/centos/root' [10.00 GiB] inherit
  ACTIVE            '/dev/centos/home' [3.00 GiB] inherit
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit

如上所示,讀者可以發現剩餘 21 個 PE,而目前 mylvm2 擁有 304MB 的容量。因此,我們可以使用:

  • 不考慮原本的,額外加上 21 個 PE 在 mylvm2 上面,或;
  • 原有的 304MB + 336MB 最終給予 640MB 的容量。

這兩種方式都可以!主要都是透過 lvresize 這個指令來達成。要額外增加時,使用『 lvresize -l +21 ... 』的方式, 若要給予固定的容量,則使用『 lvresize -L 640M ... 』的方式,底下為額外增加容量的範例。

[root@localhost ~]# lvresize -l +21 /dev/myvg/mylvm2
  Size of logical volume myvg/mylvm2 changed from 304.00 MiB (19 extents) to 640.00 MiB (40 extents).
  Logical volume myvg/mylvm2 successfully resized.

[root@localhost ~]# lvscan
  ACTIVE            '/dev/myvg/mylv' [512.00 MiB] inherit
  ACTIVE            '/dev/myvg/mylvm2' [640.00 MiB] inherit
  ACTIVE            '/dev/centos/root' [10.00 GiB] inherit
  ACTIVE            '/dev/centos/home' [3.00 GiB] inherit
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit

完成了 LV 容量的增加,再來將檔案系統放大。EXT 家族的檔案系統透過 resize2fs 這個指令來完成檔案系統的放大與縮小。

[root@localhost ~]# df -T /srv/lvm2
檔案系統                類型 1K-區段  已用   可用 已用% 掛載點
/dev/mapper/myvg-mylvm2 ext4  293267  2062 271545    1% /srv/lvm2

[root@localhost ~]# resize2fs /dev/myvg/mylvm2
resize2fs 1.44.6 (5-Mar-2019)
Filesystem at /dev/myvg/mylvm2 is mounted on /srv/lvm2; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 5
The filesystem on /dev/myvg/mylvm2 is now 655360 (1k) blocks long.

[root@localhost ~]# df -T /srv/lvm2
檔案系統                類型 1K-區段  已用   可用 已用% 掛載點
/dev/mapper/myvg-mylvm2 ext4  626473  2300 590753    1% /srv/lvm2
  • VG 的容量不足,可增加額外磁碟的方式

假設讀者因為某些特殊需求,所以需要將 /dev/myvg/mylv 檔案系統放大一倍,亦即再加 500MB 時,該如何處理?此時 myvg 已經沒有剩餘容量了。 此時可以透過額外給予磁碟的方式來增加。此案例也是最常見到的情況,亦即在原有的檔案系統當中已無容量可用,所以管理員需要額外加入新購置的磁碟的手段。 假設管理員已經透過 gdisk /dev/vda 新增一個 /dev/vda13 的 500MB 分割槽,此時可以這樣做:

[root@localhost ~]# gdisk /dev/vda
......
Command (? for help): n
Partition number (13-128, default 13):
First sector (34-62914526, default = 51681280) or {+-}size{KMGTP}:
Last sector (51681280-62914526, default = 62914526) or {+-}size{KMGTP}: +500M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8e00
Changed type of partition to 'Linux LVM'

Command (? for help): w
Do you want to proceed? (Y/N): y

[root@localhost ~]# partprobe

[root@localhost ~]# lsblk
NAME               MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
vda                252:0    0    40G  0 disk
├─vda9           252:9    0   300M  0 part
│ └─myvg-mylv   253:2    0   512M  0 lvm   /srv/lvm
├─vda10          252:10   0   300M  0 part
│ ├─myvg-mylv   253:2    0   512M  0 lvm   /srv/lvm
│ └─myvg-mylvm2 253:4    0   640M  0 lvm   /srv/lvm2
├─vda11          252:11   0   300M  0 part
│ └─myvg-mylvm2 253:4    0   640M  0 lvm   /srv/lvm2
├─vda12          252:12   0   300M  0 part
│ └─myvg-mylvm2 253:4    0   640M  0 lvm   /srv/lvm2
└─vda13          252:13   0   500M  0 part <==剛剛管理員新增的部份

[root@localhost ~]# pvcreate /dev/vda13
  Physical volume "/dev/vda13" successfully created

[root@localhost ~]# vgextend myvg /dev/vda13
  Volume group "myvg" successfully extended

[root@localhost ~]# vgdisplay myvg
  --- Volume group ---
  VG Name               myvg
  System ID
  Format                lvm2
  Metadata Areas        5
  Metadata Sequence No  5
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                5
  Act PV                5
  VG Size               <1.61 GiB
  PE Size               16.00 MiB
  Total PE              103
  Alloc PE / Size       72 / 1.12 GiB
  Free  PE / Size       31 / 496.00 MiB
  VG UUID               R8lCNk-H71V-g0XW-OtZe-pCFk-3H0d-OHZQ5p

此時系統即可多出將近 500MB 的容量給 myvg。

例題 14.2.3-1:
  1. 請將 myvg 的所有剩餘的容量分配給 /dev/myvg/mylv
  2. 透過 xfs_growfs 來放大 /dev/myvg/mylv 這個檔案系統 (請自行 man xfs_growfs)
  3. 你目前的系統中,根目錄所在 filesystem 能否放大加入額外的 2GB 容量?若可以,請實做,若不行,請說明原因。

14.3:Software RAID 與 LVM 綜合管理

RAID 主要的目的在效能與容錯 (容量只是附加的),而 LVM 重點在彈性管理檔案系統 (最好不要考量 LVM 內建的容錯機制)。 若需要兩者的優點,則可以在 RAID 上面建置 LVM。但以目前管理員的測試機而言,建議先關閉原有的測試流程,然後再重新建立為宜。

14.3.1:關閉與取消 software RAID 與 LVM 的方式

在本練習冊中,我們並沒有給予 RAID 的設定檔,因此刪除掉分割槽後,系統應該會自動捨棄 software RAID (/dev/md0)。 不過,如果沒有將每個分割槽的檔頭資料刪除,那未來重新開機時, mdadm 還是會嘗試抓取 /dev/md0,這將造成些許困擾。 因此,建議刪除掉 software RAID 的手段如下:

  1. 先將 /etc/fstab 當中,關於 /dev/md0 的紀錄刪除或註解;
  2. 將 /dev/md0 完整的卸載
  3. 使用 mdadm --stop /dev/md0 將 md0 停止使用
  4. 使用 dd if=/dev/zero of=/dev/vda4 bs=1M count=10 強制刪除掉每個 partition 前面的 software RAID 標記
  5. 重複前一個步驟,將其他的 /dev/vda{5,6,7,8} 通通刪除標記
例題 14.3.1-1: 將 software raid 取消:
  1. 將 /dev/md0 卸載,並且停止使用
  2. 將 /dev/vda{4,5,6,7,8} 這幾個裝置的表頭資料 (有點類似 superblock) 刪除
  3. 將這 5 個 partition 刪除

LVM 的管理是很嚴格的,因此管理員不可在 LVM 活動中的情況下刪除掉任何一個屬於 LVM 的 partition/disk 才對。 例如目前 /dev/vda{9,10,11,12,13} 屬於 myvg 這個 VG,因此如果 myvg 沒有停止,那麼管理員不應該也盡量避免更動到上述的分割槽。 若需要停止與回收這個 VG 的分割槽,應該要這樣處理。

  1. 先將 /etc/fstab 當中與 myvg 有關的項目刪除或註解
  2. 將 myvg 有關的檔案系統卸載 (本案例中為 /srv/lvm 與 /srv/lvm2)
  3. 使用 vgchange -a n myvg 將此 VG 停用
  4. 使用 lvscan 確認一下 myvg 所屬的所有 LV 是否已經停用 (inactive)
  5. 使用 vgremove myvg 移除掉 myvg 這個 VG 的所有內容
  6. 使用 pvremove /dev/vda{9,10,11,12,13} 移除這些 PV
  7. 最終使用 pvscan 偵測是否順利移除
例題 14.3.1-2:刪除 LVM 的方法
  1. 卸載所有與 /dev/myvg/mylv, /dev/myvg/mylvm2 的裝置,並將 myvg 設定為停用
  2. 移除 myvg
  3. 移除 /dev/vda{9,10,11,12,13} 這幾個 PV
  4. 將上述的 partition 刪除

14.3.2:在 Software RAID 上面建置 LVM

我們現在的練習機上面,還沒有分割的容量應該有 8G 才對。現在,請以 1.5G (1500M) 為單位,切割出 5 個分割槽, 分割完畢之後,就假設有 5 顆磁碟的意思。將這五顆磁碟彙整成為一個軟體磁碟陣列,名稱就為 /dev/md0,使用 raid 5,且沒有 spare disk。 然後將整個 /dev/md0 製作成為一個 PV,然後建立名為 raidvg 的 VG 以及 raidlv 的 LV。 最終這個 LV 應該會有 6G 左右的容量才對喔 ( 1.5G * (5-1) = 6G )

例題 14.3.2-1:建立 5 個 1500MB 的分割槽,用於 software raid 之用,最後一個剩下大約 600M 的分割同樣建立起來,但使用 8300 system id 即可。

完成基礎分割以建立假想的 5 顆實際不同的磁碟後,再來組成磁碟陣列才會有意義!然後開始處理軟體磁碟陣列與 LVM 吧!

實際練習:處理 RAID 上面的 LVM 流程:
  1. 建立 RAID 5 的軟體磁碟陣列,使用到全部的 5 顆分割槽:
    [root@localhost ~]# mdadm --create /dev/md0 --level=5 --raid-devices=5 --chunk=256K /dev/vda{4..8}
    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md0 started.
    
    [root@localhost ~]# cat /proc/mdstat
    Personalities : [raid6] [raid5] [raid4]
    md0 : active raid5 vda8[5] vda7[3] vda6[2] vda5[1] vda4[0]
          6135808 blocks super 1.2 level 5, 256k chunk, algorithm 2 [5/4] [UUUU_]
          [=================>...]  recovery = 88.2% (1354368/1533952) finish=0.0min speed=52091K/sec
    
    [root@localhost ~]# mdadm --detail /dev/md0
    /dev/md0:
               Version : 1.2
         Creation Time : Mon Jun  8 21:25:41 2020
            Raid Level : raid5
            Array Size : 6135808 (5.85 GiB 6.28 GB)
         Used Dev Size : 1533952 (1498.00 MiB 1570.77 MB)
          Raid Devices : 5
         Total Devices : 5
           Persistence : Superblock is persistent
    
           Update Time : Mon Jun  8 21:26:11 2020
                 State : clean
        Active Devices : 5
       Working Devices : 5
        Failed Devices : 0
         Spare Devices : 0
    
                Layout : left-symmetric
            Chunk Size : 256K
    
    Consistency Policy : resync
    
                  Name : station200.centos:0  (local to host station200.centos)
                  UUID : 7de522d6:77da5653:2dfe5d51:e0f345b8
                Events : 18
    
        Number   Major   Minor   RaidDevice State
           0     252        4        0      active sync   /dev/vda4
           1     252        5        1      active sync   /dev/vda5
           2     252        6        2      active sync   /dev/vda6
           3     252        7        3      active sync   /dev/vda7
           5     252        8        4      active sync   /dev/vda8
    
  2. 建立 PV 以及建立 raidvg 的流程:
    [root@localhost ~]# pvcreate /dev/md0
      Physical volume "/dev/md0" successfully created.
    
    [root@localhost ~]# vgcreate raidvg /dev/md0
      Volume group "raidvg" successfully created
    
    [root@localhost ~]# vgdisplay raidvg
      --- Volume group ---
      VG Name               raidvg
      System ID
      Format                lvm2
      Metadata Areas        1
      Metadata Sequence No  1
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                0
      Open LV               0
      Max PV                0
      Cur PV                1
      Act PV                1
      VG Size               <5.85 GiB
      PE Size               4.00 MiB
      Total PE              1497
      Alloc PE / Size       0 / 0
      Free  PE / Size       1497 / <5.85 GiB
      VG UUID               8Q3LIH-ids8-23FL-TyLq-8EYZ-FXoB-9xV3wd
    
  3. 最終建立需要的 /dev/raidvg/raidlv 裝置
    [root@localhost ~]# lvcreate -l 1497 -n raidlv raidvg
    [root@localhost ~]# lvscan
      ACTIVE            '/dev/centos/root' [12.00 GiB] inherit
      ACTIVE            '/dev/centos/home' [3.00 GiB] inherit
      ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit
      ACTIVE            '/dev/raidvg/raidlv' [<5.85 GiB] inherit
    
    [root@localhost ~]# lvdisplay /dev/raidvg/raidlv
      --- Logical volume ---
      LV Path                /dev/raidvg/raidlv
      LV Name                raidlv
      VG Name                raidvg
      LV UUID                VvS80P-Gfuj-jJQo-5Kgg-oxUI-tVGL-RFStap
      LV Write Access        read/write
      LV Creation host, time station200.centos, 2020-06-08 21:30:41 +0800
      LV Status              available
      # open                 0
      LV Size                <5.85 GiB
      Current LE             1497
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     4096
      Block device           253:3
    

這樣就完成了在 RAID 上面建立 LVM 的功能了!這個 LVM 暫時不要使用他,我們在下個小節來玩一些比較有趣的項目!

14.4:特殊的檔案系統處理模式

近年來包括自動化佈署、虛擬機器的盛行等,傳統的檔案系統容量再大,也無法持續提供大量的本地端容量,即使已經使用了 LVM。 因此,就有很多計畫在處理磁碟與檔案系統對應的機制,其中兩個很有趣的計畫,一個是 Stratis ,另一個則是 VDO 機制, 這兩個東西都可以仔細瞧瞧,挺有趣的!

14.4.1:使用 stratis 捲軸管理檔案系統 (VMF)

目前的本地端儲存設備與檔案系統的應用中,包括了 device mapper (dm), LVM, RAID, Multipath, XFS 等等機制, 這些機制各有各的好處。不過,還是經常需要進行檔案系統分割、格式化等行為。為了方便使用者的應用,於是有了 stratis 這個機制的產生。

Stratis 透過捲軸管理檔案系統的概念 (volume managing filesystem, VMF) ,簡單的將整個裝置、檔案系統分為幾個小階層,有點類似底下的圖示:

圖 14.4.1-1、 Stratis 分層的示意圖 (圖示來源請參考文末參考資料)
圖 14.4.1-1、 Stratis 分層的示意圖 (圖示來源請參考文末參考資料)

簡單的來說,可以簡化為底下的樣式:

圖 14.4.1-2、 Stratis 分層的示意圖 (圖示來源請參考文末參考資料)
圖 14.4.1-2、 Stratis 分層的示意圖 (圖示來源請參考文末參考資料)
  • blockdev: 區塊裝置,除了磁碟之外,也可以是 LVM 喔!
  • pool: 儲存池,可以自由配置裝置與檔案系統,是一個很抽象的管理層
  • filesystem: 檔案系統,可以直接丟給系統使用於檔案管理!

簡單的來說,stratis 大致應用了目前的 LVM 與 XFS 機制,stratis 提供了一個名為儲存池 (pool) 的概念,其實就有點類似 LVM 裡面的 VG 的概念, 然後,你可以簡單的將任何的區塊裝置 (傳統磁碟、SSD、插卡式磁碟、iSCSI、LVM等) 加入這個儲存池,然後在直接掛載到目錄樹底下, 就可以直接應用了。此外,由於掛載時的檔案系統是在使用者層,因此,可以隨便你設定容量為多少,即使該容量目前並不存在這麼大。

  • stratis 的管理:透過 stratisd 服務

要達成 stratis 的功能,你的系統得要安裝 stratisd 服務才行。同時,如果想要管理 stratisd 的話,就得要安裝 stratis-cli 軟體才行! 先來安裝軟體後,啟動該項目吧:

[root@localhost ~]# yum install stratisd stratis-cli
[root@localhost ~]# systemctl start stratisd
[root@localhost ~]# systemctl enable stratisd

簡單的依據『安裝』、『啟動』、『開機啟動』的口訣來處理即可!不過因為 stratis 並不是網路服務,而是本機的儲存系統, 因此不需要防火牆囉!很快速的就處理好 stratisd 服務。

  • 建立觀察儲存池: 透過 stratis 指令處理

服務啟動之後,接下來就可以直接建立儲存池 (pool) 與裝置 (blockdev) 之間的關係!我們在之前的練習裡面, 建立過 /dev/raidvg/raidlv 與 /dev/vda9 這兩個剩餘的裝置,現在,先將 raidlv 加入到名為 vbirdpool 的儲存池去, 看看情況會如何。記得,我們先使用 stratis [tab][tab] 看看有什麼選項可以利用喔!

[root@localhost ~]# stratis [tab][tab]
blockdev    daemon      filesystem  --help      pool        --version

很明顯的看到了 blockdev, filesystem, pool 這三個關鍵字!所以,想要建立儲存池的話,當然就使用 pool 這個指令即可!

[root@localhost ~]# stratis pool create vbirdpool /dev/raidvg/raidlv
[root@localhost ~]# stratis pool list
Name       Total Physical Size  Total Physical Used
vbirdpool             5.85 GiB               52 MiB
# 所以有個 vbirdpool 的儲存池,裡面實際有 5.8G,用掉了 52M 容量了。

[root@localhost ~]# stratis blockdev list
Pool Name  Device Node         Physical Size  State  Tier
vbirdpool  /dev/raidvg/raidlv       5.85 GiB  InUse  Data
# 所有 vbirdpool 實際上用到 /dev/raidvg/raidlv 這個裝置,且用於資料儲存 (Data)

stratis 比較特別的地方是,我們可以持續加進 blockdev 裝置,不過無法移出 blockdev!希望未來可以提供移除 blockdev 的功能。 那加入的 block 裝置有什麼限制呢?讓我們將不到 1G 的 /dev/vda9 丟進去 vbirdpool 看看就知道了:

[root@localhost ~]# stratis pool add-data vbirdpool /dev/vda9
Execution failure caused by:
ERROR: /dev/vda9 too small, minimum 1073741824 bytes

因為我們的練習機檔案容量較小,所以 /dev/vda9 不夠大於 1G 以上,導致增加失敗!由錯誤訊息就能知道, stratis 的限制就是需要大於 1G 以上的區塊裝置, 才能夠加入到我們的儲存池喔!那怎麼練習加入額外的裝置呢?沒關係,我們還有個 centos 的 VG 可以使用! 現在讓我們建立 /dev/centos/lvm 這個 1.5G 的裝置,然後再加入 vbirdpool 一下!

[root@localhost ~]# lvcreate -L 1.5G -n lvm centos
[root@localhost ~]# lvscan
  ACTIVE            '/dev/centos/root' [12.00 GiB] inherit
  ACTIVE            '/dev/centos/home' [3.00 GiB] inherit
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit
  ACTIVE            '/dev/centos/lvm' [1.50 GiB] inherit
  ACTIVE            '/dev/raidvg/raidlv' [<5.85 GiB] inherit

[root@localhost ~]# stratis pool add-data vbirdpool /dev/centos/lvm
[root@localhost ~]# stratis pool list
Name       Total Physical Size  Total Physical Used
vbirdpool             7.35 GiB               56 MiB

[root@localhost ~]# stratis blockdev list
Pool Name  Device Node         Physical Size  State  Tier
vbirdpool  /dev/centos/lvm          1.50 GiB  InUse  Data
vbirdpool  /dev/raidvg/raidlv       5.85 GiB  InUse  Data

你會發現到 Tier 這個地方,這裡很有趣喔!基本上 Tier 大致上有兩種情境,一個是用於傳統資料存放,就是『 Data 』的效果, 如果你有比較快速、較小的 SSD / NVMe 等裝置,可以將他設定為快取 (cache) 喔!如此一來,你甚至可能會有好幾個 T 的快取! 而且不用任何奇怪的設定,直接加入成為快取即可!相當有趣吧!底下為練習機不存在的指令,看看就好:

# 假設 /dev/vdc 為 SSD,可加入成為快取的功能為:
[root@localhost ~]# stratis pool add-cache vbirdpool /dev/vdc
# 因為系統不存在 /dev/vdc 啦!這裡單純給大家瞧瞧!
  • 建立觀察與掛載檔案系統: 透過 stratis 指令處理

所有以 stratisd 建立的檔案系統,其裝置檔名預設都會以底下的方式存在:

  • 說明:/stratis/儲存池名稱/檔案系統名稱
  • 範例:/stratis/vbirdpool/fs1

如上,我們先設定一個 fs1 的檔案系統來使用看看:

[root@localhost ~]# stratis filesystem create vbirdpool fs1
[root@localhost ~]# stratis filesystem list
Pool Name  Name  Used     Created            Device                  UUID
vbirdpool  fs1   545 MiB  Jun 09 2020 12:00  /stratis/vbirdpool/fs1  7430f67c671e4c5c9e98a77ccbbc8574

這時裝置名稱就建立起來了!你可以很明顯的看到該裝置!只是,建議不要使用裝置來進行掛載,如果需要掛載, 就用 UUID 吧!查詢 UUID 的方法可以這樣做:

[root@localhost ~]# blkid /stratis/vbirdpool/*
/stratis/vbirdpool/fs1: UUID="7430f67c-671e-4c5c-9e98-a77ccbbc8574" TYPE="xfs"

[root@localhost ~]# mkdir /srv/pool1
[root@localhost ~]# mount UUID="7430f67c-671e-4c5c-9e98-a77ccbbc8574" /srv/pool1
[root@localhost ~]# df -Th /srv/pool1
檔案系統                   ....        類型  容量  已用  可用 已用% 掛載點
/dev/mapper/stratis-1-6e6ad....bbc8574 xfs   1.0T  7.2G 1017G    1% /srv/pool1

這樣就可以掛載使用了!不過要注意的是,使用 df 去顯示時,檔案容量會顯示為 1TB,那個是錯誤的顯示容量! 略過不要理會!要查閱時,請使用『 stratis filesystem list 』去查看才是對的!

  • 開機就掛載的方式

雖然 stratis 的檔案系統可以直接將掛載項目寫入到 /etc/fstab 裡面,不過要注意的是,這些檔案系統畢竟是經由 stratisd 管理的, 但是本機檔案系統的掛載其實是在啟動 stratisd 之前,因此如果沒有加上特別的注意,該掛載在開機過程當中是會失敗的! 特別留意這個問題!

實際練習:讓剛剛建立的 stratis 檔案系統於開機時掛載:
  1. 編輯 /etc/fstab,加入底下這一行:
    UUID="7430f67c-671e-4c5c-9e98-a77ccbbc8574" /srv/pool1 xfs defaults,x-systemd.requires=stratisd.service 0 0
    
  2. 卸載既有的掛載後, mount -a 測試,測試成功之後,記得 reboot 看看有沒有生效!
    [root@localhost ~]# umount /srv/pool1
    [root@localhost ~]# mount -a
    [root@localhost ~]# reboot
    
  • 移除 stratis 的方法

要移除 stratis 的話,就跟移除一般檔案系統類似,從 /etc/fstab 的編輯以及卸載後,再以 stratis 刪除掉檔案系統與儲存池即可。

實際練習:取消 stratis 的使用
  1. 將 /etc/fstab 新增那一行刪除或註解:
  2. 將掛載於 /srv/pool1 的裝置卸載
  3. 開始刪除 fs1
  4. 開始刪除 vbirdpool
  5. 停止 stratisd 服務
[root@localhost ~]# vim /etc/fstab
#UUID="7430f67c-671e-4c5c-9e98-a77ccbbc8574" /srv/pool1 xfs defaults,x-systemd.requires=stratisd.service 0 0

[root@localhost ~]# umount /srv/pool1
[root@localhost ~]# stratis filesystem destroy vbirdpool fs1
[root@localhost ~]# stratis pool destroy vbirdpool
[root@localhost ~]# systemctl stop stratisd.service
[root@localhost ~]# systemctl disable stratisd.service

14.4.2:使用於虛擬機器磁碟應用的 VDO 機制

身為現代人,你應該、絕對聽過所謂的虛擬化,我們現在上課使用的系統就是虛擬機器啊!使用到虛擬機器的原因,當然是由於硬體資源大幅提昇的緣故, 因此一部主機可以做成虛擬機器的本機 (host),然後再將資源如 CPU、記憶體、磁碟、網路等分享給虛擬機器 (VM) 使用, 最後在 VM 上面安裝好作業系統 (guest) 之後,就可以提供給客戶進行操作了。

許多硬體資源都可以透過共享。如 4 核 8 緒的主機,可以提供給 8 台 2 核心的虛擬機器(VM),虛擬機器的總 CPU 個數(16)超出實體 CPU(4), 也是沒問題的!所有的虛擬機器可以輪流共用實體CPU核心。同理,記憶體也一樣,甚至如果具有相同內容的VM群,其共有的記憶資源還能僅保留共有的一份。

不過虛擬機器的磁碟怎麼來?一般來說,虛擬機器的磁碟大多使用大型檔案來提供,當然也能使用 LVM!不過,當 VM 的量很大的時候, 使用大型檔案並透過快照複製的效果,會比較好一些,不用透過持續的 device mapper (dm) 去管理,耗用的資源較少。 只是,你得要自己手動進行快照、自己進行壓縮與各項系統處置,管理方面比較不方便。

虛擬資料優化系統 (Virtual Data Optimizer, VOD) 就是為了處理虛擬機器的磁碟裝置而設計的!VDO可以讓你的資料直接在VDO的掛載點裡面, 直接透過VDO系統的管理,自己進行資料同步、資料壓縮。此外,你的1TB實體磁碟,也能透過VDO的功能,假裝成為5TB的容量, 因為VDO會進行壓縮等行為,也就讓你的系統可以進行更多檔案的儲存!

圖 14.4.2-1、 VDO 的用途示意 (圖示來源請參考文末參考資料)
圖 14.4.2-1、 VDO 的用途示意 (圖示來源請參考文末參考資料)
  • VDO 的元件與使用

VDO 的使用需要透過 vdo 服務以及 kmod-kvdo 模組的支援,因此得要安裝這兩個軟體才行,同時得要啟動 vdo 服務喔!

[root@localhost ~]# yum install vdo kmod-kvdo
[root@localhost ~]# systemctl restart vdo
[root@localhost ~]# systemctl enable vdo

接下來 vdo 的使用跟 LVM 真的很有點類似~透過 vdo 指令來建立起 vdo 的捲軸裝置,這些裝置都會以 /dev/mapper/XXX 的裝置名稱存在, 現在,我們將剛剛釋出的 /dev/raidvg/raidlv 這個裝置丟給 VDO 使用 (記得一下,VDO 使用的區塊裝置,其容量至少要大於 5G 才好!), 並且建立名為 myvdo 的裝置,同時該磁碟容量假設為原本兩倍的 10G 容量,可以這樣做:

[root@localhost ~]# vdo create --name=myvdo --vdoLogicalSize=10G  \
> --device=/dev/raidvg/raidlv --deduplication enabled --compression enabled
[root@localhost ~]# vdo status --name myvdo
VDO status:
  Date: '2020-06-09 14:07:06+08:00'
  Node: station200.centos
Kernel module:
  Loaded: true
  Name: kvdo
  Version information:
    kvdo version: 6.2.1.138
Configuration:
  File: /etc/vdoconf.yml
  Last modified: '2020-06-09 14:05:38'
VDOs:
  myvdo:
    Acknowledgement threads: 1
    Activate: enabled
    Bio rotation interval: 64
    Bio submission threads: 4
    Block map cache size: 128M
    Block map period: 16380
    Block size: 4096
    CPU-work threads: 2
    Compression: enabled
    Configured write policy: auto
    Deduplication: enabled
    Device mapper status: 0 20971520 vdo /dev/dm-4 normal - online online 1008994 1532928
......

[root@localhost ~]# vdostats --human-readable
Device                    Size      Used Available Use% Space saving%
/dev/mapper/myvdo         5.8G      3.8G      2.0G  65%           N/A

因為 VDO 會進行許多的動作,因此一開始就會花費 3.8G 的容量,剩餘的容量可能只剩下 2G 而已!因此,要使用 VDO 時, 裝置的容量還是大一些比較妥當。我們這裡只進行測試啦!接下來,請將這個裝置掛載使用吧。

實際練習:將 /dev/mapper/myvdo 格式化為 xfs 檔案系統,掛載到 /srv/vdo 目錄下,並且開機自動掛載
  1. 開始格式化:
    [root@localhost ~]# mkfs.xfs /dev/mapper/myvdo
    
    [root@localhost ~]# vdostats --human-readable
    Device                    Size      Used Available Use% Space saving%
    /dev/mapper/myvdo         5.8G      3.8G      2.0G  65%           99%
    
  2. 開始測試掛載
    [root@localhost ~]# vim /etc/fstab
    /dev/mapper/myvdo /srv/vdo xfs defaults,x-systemd.requires=vdo.service 0 0
    
    [root@localhost ~]# mkdir /srv/vdo
    [root@localhost ~]# mount -a
    [root@localhost ~]# mount  | grep vdo
    /dev/mapper/myvdo on /srv/vdo type xfs (rw,....x-systemd.requires=vdo.service)
    
    [root@localhost ~]# reboot
    

建置完畢之後,建議立刻 reboot 測試一下 /etc/fstab 裡面的設定是否為正常喔!

  • VDO 檔案運作的三個階段

VDO 在進行檔案的處理時,主要會有三個階段 ( 3 phases ),流程如下:

  1. 暫存階段 (zero-block elimination):一開始進行類似複製的行為時, VDO 會依據檔案的內容,先佔用一個不存在的容量, 只是先處理中介資料 (metadata) 的寫入,有點類似只寫入 super block 資訊而已的概念。 讓系統以為確實存在該檔案,但事實上,該檔案並沒有完全寫入,甚至可能不用寫入! 資料是否寫入到實際的檔案系統中,得要看下個階段的結果而定。
  2. 重複性資料測試階段 (deduplication elimination):VDO 會分析要寫入的這個檔案的特性與內容,當 VDO 發現到這個檔案已經存在系統中, 那麼該資料就不會實際寫入到檔案系統,而是透過一個『指向 (point) 』的方式,以類似快照的模式來建立該檔案,因此同一個檔案複製多個備份時, 其實只有第一個建立的檔案才會實際存在,其他的備份都是透過連結到第一個檔案去的方式來處理的。
  3. 壓縮階段 (compression):最終 VDO 透過 LZ4 這個壓縮機制以 4KB 區塊大小的形式來進行壓縮,讓檔案容量可以降低到更小。

大家要先有個概念,VDO 的重點在於使用於虛擬機器中,虛擬機器通常使用大型檔案作為虛擬機器裡面的磁碟系統,所以,丟進 VDO 管理的檔案系統內的資料, 不應該是一般的檔案,而是作為虛擬磁碟的檔案才對!不要搞錯使用的方向了。所以,我們得要先來製作虛擬磁碟機的檔案才行!如下所示, 我們先來建立一個大型的檔案 (雖然不是專門用來進行磁碟系統的)。

[root@localhost ~]# df -Th /
檔案系統                類型  容量  已用  可用 已用% 掛載點
/dev/mapper/centos-root xfs    12G  6.2G  5.9G   51% /

[root@localhost ~]# tar -cf /vmdisk.img /etc /home /root
[root@localhost ~]# ll -h /vmdisk.img
-rw-r--r--. 1 root root 346M  6月  9 15:14 /vmdisk.img

這樣就有一個沒有壓縮的,大約 346M 的大型檔案!開始進行複製的舉動,將這個檔案複製到 /srv/vdo 目錄去:

[root@localhost ~]# vdostats --human-readable
Device                    Size      Used Available Use% Space saving%
/dev/mapper/myvdo         5.8G      3.8G      2.0G  65%           98%

[root@localhost ~]# cp /vmdisk.img /srv/vdo
[root@localhost ~]# vdostats --human-readable
Device                    Size      Used Available Use% Space saving%
/dev/mapper/myvdo         5.8G      4.1G      1.7G  70%           71%

[root@localhost ~]# cp /vmdisk.img /srv/vdo/vmdisk2.img
[root@localhost ~]# vdostats --human-readable
Device                    Size      Used Available Use% Space saving%
/dev/mapper/myvdo         5.8G      4.1G      1.7G  70%           71%

[root@localhost ~]# cp /vmdisk.img /srv/vdo/vmdisk3.img
[root@localhost ~]# cp /vmdisk.img /srv/vdo/vmdisk4.img
[root@localhost ~]# vdostats --human-readable
Device                    Size      Used Available Use% Space saving%
/dev/mapper/myvdo         5.8G      4.1G      1.7G  70%           78%

[root@localhost ~]# df -Th /srv/vdo
檔案系統          類型  容量  已用  可用 已用% 掛載點
/dev/mapper/myvdo xfs    10G  1.5G  8.6G   15% /srv/vdo

你可以發現,雖然單一檔案有 3xx MB 的容量,但是整體 VDO 還是只有消耗 (4.1G-3.8G = 0.3G) 左右的容量, 使用傳統檔案系統的 df 來看,卻已經使用掉 1.5G 了!這就可以節省非常多的容量喔!

14.5:簡易磁碟配額 (Quota)

Filesystem Quota 可以使用於『公平的』使用檔案系統。雖然現今磁碟容量越來越大,但是在某些特別的情境中,為了管制使用者亂用檔案系統, 還是有必要管理一下 quota 用量的。

14.5.1:Quota 的管理與限制

基本上,要能使用 Quota ,你需要有底下的支援:

  • Linux 核心支援:除非你自己編譯核心,又不小心取消,否則目前預設核心都有支援 Quota 的
  • 啟用檔案系統支援:雖然 EXT 家族與 XFS 檔案系統均支援 Quota ,但是你還是得要在掛載時啟用支援才行。

而一般 Quota 針對的管理對象是:

  • 可針對使用者 (但不包含 root)
  • 可針對群組
  • EXT家族僅可針對整個檔案系統,XFS可以針對某個目錄進行 Quota 管理

那可以限制的檔案系統資料是:

  • 可限制檔案容量,其實就是針對 Filesystem 的 block 做限制
  • 可限制檔案數量,其實就是針對 Filesystem 的 inode 做限制 (一個檔案會佔用 1 個 inode 之故)

至於限制的數值與資料,又可以分為底下幾個:

  • Soft 限制值:僅為軟性限制,可以突破該限制值,但超過 soft 數值後,就會產生『寬限時間 (grace time)』
  • Hard 限制值:就是嚴格限制,一定無法超過此數值
  • Grace time:寬限時間,通常為 7 天或 14 天,只有在用量超過 soft 數值後才會產生,若使用者無任何動作,則 grace time 倒數完畢後, soft 數值會成為 hard 數值,因此檔案系統就會被鎖死。

所謂的『檔案系統鎖死』的意思,指的是使用者將無法新增/刪除檔案系統的任何資料,所以就得要藉由系統管理員來處理了!

由於 Quota 需要檔案系統的支援,因此管理員請務必在 fstab 檔案中增加底下的設定值:

  • uquota/usrquota/quota:啟動使用者帳號 quota 管理
  • gquota/grpquota:啟動群組 quota 管理
  • pquota/prjquota:啟用單一目錄管理,但不可與 gquota 共用(本章不實做)

在 xfs 檔案系統中,由於 quota 是『檔案系統內部紀錄管理』的,不像 EXT 家族是透過外部管理檔案處理, 因此設定好參數後,一定要卸載再掛載 (umount --> mount),不可以使用 remount 來處理。

例題 14.5.1-1: 啟動檔案系統支援 quota 的參數
  1. 在測試機的系統中, /home 為 xfs 檔案系統,請在設定檔中加入 usrquota, grpquota 的掛載參數;
  2. 能否直接卸載 /home 再掛載?為什麼?如何進行卸載再掛載的動作?
  3. 如何觀察已經掛載的檔案系統參數?

14.5.2:xfs 檔案系統的 quota 實做

一般來說,Quota 的實做大多就是觀察、設定、報告等項目,底下依序說明:

  • XFS 檔案系統的 Quota 狀態檢查

xfs 檔案系統的 quota 實做都是透過 xfs_quota 這個指令,這個指令在觀察方面的語法如下:

[root@www ~]# xfs_quota -x -c "指令" [掛載點]
選項與參數:
-x  :專家模式,後續才能夠加入 -c 的指令參數喔!
-c  :後面加的就是指令,這個小節我們先來談談數據回報的指令
指令:
      print :單純的列出目前主機內的檔案系統參數等資料
      df    :與原本的 df 一樣的功能,可以加上 -b (block) -i (inode) -h (加上單位) 等
      report:列出目前的 quota 項目,有 -ugr (user/group/project) 及 -bi 等資料
      state :說明目前支援 quota 的檔案系統的資訊,有沒有起動相關項目等

例如列出目前支援 quota 的檔案系統觀察可以使用:

[root@localhost ~]# xfs_quota -x -c "print"
Filesystem          Pathname
/                   /dev/mapper/centos-root
/srv/vdo            /dev/mapper/myvdo
/home               /dev/mapper/centos-home (uquota, gquota)

如上表,系統就列出了有支援 quota 的載點,之後即可觀察 quota 的啟動狀態:

[root@localhost ~]# xfs_quota -x -c "state"
User quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #1921 (4 blocks, 4 extents)
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #1975 (4 blocks, 3 extents)
Project quota state on /home (/dev/mapper/centos-home)
  Accounting: OFF
  Enforcement: OFF
  Inode: N/A
Blocks grace time: [7 days]
Inodes grace time: [7 days]
Realtime Blocks grace time: [7 days]

上表顯示的狀況為:

  • 針對用戶的設定已經開啟 quota
  • 針對群組的設定已經開啟 quota
  • 針對 Project 的設定並沒有開啟
  • Block 與 Inode 的寬限時間均為 7 天
  • XFS 檔案系統的 Quota 帳號/群組使用與設定值報告

若需要詳細的列出在該載點底下的所有帳號的 quota 資料,可以使用 report 這個指令項目:

[root@localhost ~]# xfs_quota -x -c "report /home"
User quota on /home (/dev/mapper/centos-home)
                               Blocks
User ID          Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
root                0          0          0     00 [--------]
student        311776          0          0     00 [--------]

Group quota on /home (/dev/mapper/centos-home)
                               Blocks
Group ID         Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
root                0          0          0     00 [--------]
student        311776          0          0     00 [--------]

[root@localhost ~]# xfs_quota -x -c "report -ubih /home"
User quota on /home (/dev/mapper/centos-home)
                        Blocks                            Inodes
User ID      Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root           8K      0      0  00 [------]      5      0      0  00 [------]
student    304.5M      0      0  00 [------]   1.1k      0      0  00 [------]

單純輸入 report 時,系統會列出 user/group 的 block 使用狀態,亦即是帳號/群組的容量使用情況,但預設不會輸出 inode 的使用狀態。 若額外需要 inode 的狀態,就可以在 report 後面加上 -i 之類的選項來處理。

  • XFS 檔案系統的 Quota 帳號/群組實際設定方式

主要針對使用者與群組的 Quota 設定方式如下:

[root@localhost ~]# xfs_quota -x -c "limit [-ug] b[soft|hard]=N i[soft|hard]=N name" mount_point
[root@localhost ~]# xfs_quota -x -c "timer [-ug] [-bir] Ndays"
選項與參數:
limit :實際限制的項目,可以針對 user/group 來限制,限制的項目有
        bsoft/bhard : block 的 soft/hard 限制值,可以加單位
        isoft/ihard : inode 的 soft/hard 限制值
        name        : 就是用戶/群組的名稱啊!
timer :用來設定 grace time 的項目喔,也是可以針對 user/group 以及 block/inode 設定

假設管理員要針對 student 這個帳號設定:可以使用的 /home 容量實際限制為 2G 但超過 1.8G 就予以警告, 簡易的設定方式如下:

[root@localhost ~]# xfs_quota -x -c "limit -u bsoft=1800M bhard=2G student" /home
[root@localhost ~]# xfs_quota -x -c "report -ubh" /home
User quota on /home (/dev/mapper/centos-home)
                        Blocks
User ID      Used   Soft   Hard Warn/Grace
---------- ---------------------------------
root           8K      0      0  00 [------]
sysuser1      20K      0      0  00 [------]
student    304.5M   1.8G     2G  00 [------]

若需要取消 student 設定值,直接將數值設定為 0 即可!

[root@localhost ~]# xfs_quota -x -c "limit -u bsoft=0 bhard=0 student" /home
例題 14.5.2-1: 實際設定與觀察 XFS 檔案系統的 Quota 設定值
  1. 建立一個名為 "quotaman" 的用戶,該用戶的密碼設定為 "myPassWord"
  2. 觀察 quotaman 剛剛建立好帳號後的 quota 數值
  3. 讓 quotaman 的實際容量限制為 200M 而寬限容量限制為 150M 左右,設定完畢請觀察是否正確
  4. 前往 tty5 終端機,並實際以 quotaman 的身份登入,同時執行『 dd if=/dev/zero of=test.img bs=1M count=160 』這個指令, 檢查 quotaman 家目錄是否有大型檔案?且該指令執行是否會出錯?
  5. 回歸 root 的身份,再次觀察 quotaman 的 quota 報告,是否有出現 grace time 的資料?為什麼?
  6. 再次來到 quotaman 的 tty2 終端機,再次使用『 dd if=/dev/zero of=test.img bs=1M count=260 』這個指令, 檢查 quotaman 家目錄是否有大型檔案?且該指令執行是否會出錯?
  7. quotaman 需要如何處理資料後,才能夠正常的繼續操作系統?

14.6:課後練習操作

  • 上課的課後練習,非作業:
  1. 關閉 VDO 這個虛擬機器的磁碟優化模組,卸載 /srv/vdo
  2. 關閉 raidvg 這個 LVM 的 VG,也關閉 /dev/md0 這個軟體磁碟陣列,同時恢復原本的磁碟分割,讓系統只剩下 /dev/vda{1,2,3}
  3. 建立具有 cache 的 stratis 服務:
    1. 分割出 /dev/vda4, /dev/vda5 各 1G 與 1.5G 的容量
    2. 讓 /dev/vda5 成為名為 mydata 的 stratis 儲存池
    3. 讓 /dev/vda4 成為 mydata 的快取 (模擬的,不具備加速功能)
    4. 最終建立 myfs1 檔案系統
    5. 啟動 quota 而掛載到 /srv/myfilesystem 目錄內。
  4. 建立 VDO 裝置
    1. 將所有其他容量分割給 /dev/vda6
    2. 讓 /dev/vda6 加入成為名為 myvdo 且邏輯容量具有 10G。
    3. 讓 myvdo 格式化為 ext4 檔案系統,並且啟動 quota 及掛載於 /srv/myvdo 目錄中
  5. student 在上述兩個載點內,都具有 800M/1000M 的 quota 使用限制。
  6. 全部設定完畢後,重新開機,看看所有的資料能不能順利運作!
  • 作業 (不提供學生答案,僅提供教師參考答案)

作業硬碟一般操作說明:

  • 開啟雲端虛擬機器前,請務必確認你開啟的硬碟是『unit14』,否則就會做錯題目
  • 若要使用圖形界面,請務必使用 student 身份登入,若需要切換身份,再啟用終端機處理。
  • 若有簡答題需要使用中文,請自行以第一堂課的動作自行處理輸入法安裝。
  • 每部虛擬機器均有獨特的網卡位址,請勿使用他人硬碟上傳,否則計分為 0 分。
  • 每位同學均有自己的 IP 尾數,請先向老師詢問您的 IP 尾數,才可以進行作業上傳。
  • 最終上傳作業結果,請務必使用 root 身份上傳。
  • 進入作業硬碟後,先用 root 身份執行 vbird_book_setup_ip , 執行流程請參考:vbird_book_setup_ip

作業當中,某些部份可能為簡答題~若為簡答題時,請將答案寫入 /home/student/ans.txt 當中,並寫好正確題號,方便老師訂正答案。 請注意,檔名寫錯將無法上傳!

請使用 root 的身份進行如下實做的任務。直接在系統上面操作,操作成功即可,上傳結果的程式會主動找到你的實做結果。 並請注意,題目是有相依性的,因此請依序進行底下的題目為宜

  1. (20%)請回答下列問題,並將答案寫在 /root/ans14.txt 檔案內:
    1. RAID0, RAID1, RAID6, RAID10 中 (1)哪一個等級效能最佳 (2)哪些等級才會有容錯
    2. 承上,若以 8 顆磁碟為例,且都沒有 spare disk 的環境下,上述等級各有幾顆磁碟容量可用?
    3. 承上,以具有容錯的磁碟陣列而言,當有一顆磁碟損壞而需更換重建時, 哪些磁碟陣列的重建效能最佳 (資料可直接複製,無須透過重新計算而言)
    4. 軟體磁碟陣列的 (1)操作指令為何? (2)磁碟陣列檔名為何 (3)設定檔檔名為何
    5. LVM 的管理中,主要的組成有 PV, VG, LV 等,請問在 LVM 中,資料儲存、搬移的最小單位是甚麼 (寫下英文縮寫與全名)
    6. 進行分割 (partition) 時,在 (1)GPT 與 (2)MSDOS 的分割表情靜下,(a)Linux LVM 與 (b)Linux software RAID 的 system ID 各為何? (註:可以使用 fdisk /dev/vda 去查詢 system ID 列表,不要寫入分割表即可測試)
    7. 進行磁碟配額 (filesystem quota) 時,掛載參數要加上哪兩個檔案系統參數 (以 XFS 檔案系統為例) 才能夠支援 quota
    8. 承上,磁碟配額限制【磁碟使用容量】與【可用檔案數量】時,分別是限制甚麼項目?
    9. 若需要可以彈性的且不用配置容量的方式來管理檔案系統,可以使用 stratisd 或 vdo 服務呢?寫下服務名稱。
    10. VDO 可針對虛擬機器的虛擬磁碟機進行優化,VDO 對寫入的資料會進行三個階段的運作,分別是那三個階段?
  2. (20%)彈性化管理檔案系統:
    1. (15%)在目前的系統中,找到一個名為 hehe 的 LV ,將此 LV 的容量設定改成 1GB,且:
      • 且在這個 LV (1)會用完 VG 的所有剩餘容量,也就是說,該 LV 所在的 VG 不要有剩下的容量在,若容量不足, 也請自行設法處理(自己想辦法再切出需要的容量,且容量範圍誤差不要超過 10% 即可,亦即 900M~1100M 之間均可接受!)
      • 在這個 LV 上面的檔案系統須同步處理容量。
    2. (5%)請讓 /home 目錄所在的檔案系統具有 quota 的 user/group 磁碟容量配額限制的功能。 請注意,這一個項目與最後一題腳本建立有關,處理前,最好先登出圖形界面,在 tty2 使用 root 直接登入,否則 /home 可能無法卸載。
  3. (15%)綜合管理檔案系統
    1. 請建立 7 個 1GB 的分割槽,且 system ID 請設定為 RAID 的樣式
    2. 將上列磁碟分割槽用來建立 /dev/md0 為名的磁碟陣列,等級為 RAID6,無須 spare disk,chunk size 請指定為 1M
    3. 以 /dev/md0 為磁碟來源,並依據底下的說明,重新建立一個 LVM 的裝置 (無須進行格式化與掛載)
      • VG 名稱請取為 govg 容量請自訂,但是 PE 需要具有 8MB 的大小 (參考底下的說明來指定喔)
      • LV 名稱請取為 golv,將全部的容量都給這個 LV。
  4. (15%)建立 stratis 的 thin pool 管理機制:
    1. 找到名為 centos 的 VG,將其所有剩餘容量建立一個名為 stratis 的 LV,亦即最終會有 /dev/centos/stratis 的裝置檔名存在。
    2. 將上述的 LV 裝置,加入 stratis 的名為 mypool 的儲存池
    3. 建立名為 myfilesystem 的檔案系統名稱,然後開機後自動掛載到 /data/goodfile/ 目錄下。
  5. (15%)建立 VDO 管理虛擬化磁碟系統的機制:
    1. 將 /dev/govg/golv 加入 VDO 的管理機制下,且建立名為 myvm 的 vdo volume name,同時給予 15G 的邏輯容量。 (由於涉及核心模組,所以可能需要全系統更新一次,或者安裝了 vdo 相關軟體後,必需要重新開機使用新核心才可以繼續。
    2. 格式化成為 xfs 檔案系統,並且開機後會自動掛載到 /data/goodvm/ 目錄下
  6. (15%)建立一個名為 /root/myaccount.sh 的大量建立帳號的腳本,這個腳本執行後,可以完成底下的事件
    1. 會建立一個名為 mygroup 的群組
    2. 會依據預設環境建立 30 個帳號,帳號名稱為 myuser01 ~ myuser30 共 30 個帳號,且這些帳號會支援 mygroup 為次要群組
    3. 每個人的密碼會使用【 openssl rand -base64 6 】隨機取得一個 8 個字元的密碼, 並且這個密碼會被記錄到 /root/account.password 檔案中,每一行一個,且每一行的格式有點像【myuser01:AABBCCDD】
    4. 每個帳號預設都會有 200MB/250MB 的 soft/hard 磁碟配額限制。

作業結果傳輸:請以 root 的身分執行 vbird_book_check_unit 指令上傳作業結果。 正常執行完畢的結果應會出現【XXXXXX_aa:bb:cc:dd:ee:ff_unitNN】字樣。若需要查閱自己上傳資料的時間, 請在作業系統上面使用瀏覽器查詢: http://192.168.251.254 檢查相對應的課程檔案。 相關流程請參考: vbird_book_check_unit

修改歷史:
  • 2016/11/17:上次整理這篇是 2016/05/30 左右,還缺 Quota 的實做而已!所以補上來!
  • 2017/04/04:加入習題囉!可以來玩玩看
  • 2017/04/05:因應 EXT4 家族的 Quota,將題目做個小幅度的修訂~否則大家不會知道 EXT4 的相關處理動作!
  • 2020/06/11:增加了 stratis 以及 VDO 的設計說明,相當有趣的兩個進階檔案系統功能!
2020/06/11 以來統計人數
計數器
伺服器篇文件
各版本彙整說明
CentOS 6.x