Linux 基礎學習訓練教材 - RockyLinux 9.x

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

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

最近更新時間: 2023/05/29

基礎的檔案系統管理中,通常一個 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
使用 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 中

先使用 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 rocky           lvm2 [20.00 GiB / 6.00 GiB free]
  PV /dev/vda9                       lvm2 [300.00 MiB]
  PV /dev/vda10                      lvm2 [300.00 MiB]
  PV /dev/vda11                      lvm2 [300.00 MiB]
  PV /dev/vda12                      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               oHncDF-aYkB-Qunj-E448-m9g1-n01H-aFnDWV
  • 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                k3sqy3-11Je-sgss-RXhJ-b331-5yTt-viUUPL
  LV Write Access        read/write
  LV Creation host, time station200.rockylinux, 2023-05-28 21:55:52 +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 最重要的任務就是進行裝置的容量放大與縮小,不過,前提是在該裝置下的檔案系統能夠支援放大與縮小才行。 目前在 RockyLinux 9 上面主要的兩款檔案系統中, 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               oHncDF-aYkB-Qunj-E448-m9g1-n01H-aFnDWV

[root@localhost ~]# lvscan
  ACTIVE            '/dev/myvg/mylv' [512.00 MiB] inherit
  ACTIVE            '/dev/myvg/mylvm2' [304.00 MiB] inherit
  ACTIVE            '/dev/rocky/home' [3.00 GiB] inherit
  ACTIVE            '/dev/rocky/root' [10.00 GiB] inherit
  ACTIVE            '/dev/rocky/swap' [1.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/rocky/home' [3.00 GiB] inherit
  ACTIVE            '/dev/rocky/root' [10.00 GiB] inherit
  ACTIVE            '/dev/rocky/swap' [1.00 GiB] inherit

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

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

[root@localhost ~]# resize2fs /dev/myvg/mylvm2
resize2fs 1.46.5 (30-Dec-2021)
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  603707    14 570273    1% /srv/lvm2
  • VG 的容量不足,可增加額外磁碟的方式

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

[root@localhost ~]# fdisk /dev/vda
......
命令 (m 以獲得說明):n
分割區編號 (13-128, default 13):
First sector (51681280-62914526, default 51681280):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (51681280-62914526, default 62914526): +500M

命令 (m 以獲得說明):t
分割區編號 (1-13, default 13):
Partition type or alias (type L to list all): 30

命令 (m 以獲得說明):p
.....
所用裝置      Start     結束     磁區  Size 類型
.....
/dev/vda13 51681280 52705279  1024000  500M Linux LVM

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

[root@localhost ~]# lsblk -i
NAME            MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS
vda             252:0    0   30G  0 disk
|-vda9          252:9    0  300M  0 part
| `-myvg-mylv   253:3    0  512M  0 lvm   /srv/lvm
|-vda10         252:10   0  300M  0 part
| |-myvg-mylv   253:3    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               oHncDF-aYkB-Qunj-E448-m9g1-n01H-aFnDWV

此時系統即可多出將近 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 之用,最後一個剩下大約 500M 的分割同樣建立起來,使用預設的 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]
          6283264 blocks super 1.2 level 5, 256k chunk, algorithm 2 [5/4] [UUUU_]
          [=======>.............]  recovery = 35.1% (552832/1570816) finish=0.3min speed=55283K/sec
    
    [root@localhost ~]# mdadm --detail /dev/md0
    /dev/md0:
               Version : 1.2
         Creation Time : Sun May 28 22:46:00 2023
            Raid Level : raid5
            Array Size : 6283264 (5.99 GiB 6.43 GB)
         Used Dev Size : 1570816 (1534.00 MiB 1608.52 MB)
          Raid Devices : 5
         Total Devices : 5
           Persistence : Superblock is persistent
    
           Update Time : Sun May 28 22:46:32 2023
                 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.rockylinux:0  (local to host station200.rockylinux)
                  UUID : 5003361e:f8f69aaf:895d6269:ae11a577
                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.99 GiB
      PE Size               4.00 MiB
      Total PE              1533
      Alloc PE / Size       0 / 0
      Free  PE / Size       1533 / <5.99 GiB
      VG UUID               P01WGp-vYzi-QVM0-zolR-UGa6-uK4M-FLS14g
    
  3. 最終建立需要的 /dev/raidvg/raidlv 裝置
    [root@localhost ~]# lvcreate -l 1533 -n raidlv raidvg
    [root@localhost ~]# lvscan
      ACTIVE            '/dev/rocky/home' [3.00 GiB] inherit
      ACTIVE            '/dev/rocky/root' [12.00 GiB] inherit
      ACTIVE            '/dev/rocky/swap' [1.00 GiB] inherit
      ACTIVE            '/dev/raidvg/raidlv' [<5.99 GiB] inherit
    
    [root@localhost ~]# lvdisplay /dev/raidvg/raidlv
      --- Logical volume ---
      LV Path                /dev/raidvg/raidlv
      LV Name                raidlv
      VG Name                raidvg
      LV UUID                4WYbOt-9peY-XaLS-rmrS-0Rdf-pJJv-csdKQL
      LV Write Access        read/write
      LV Creation host, time station200.rockylinux, 2023-05-28 22:49:01 +0800
      LV Status              available
      # open                 0
      LV Size                <5.99 GiB
      Current LE             1533
      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 --help
usage: stratis [-h] [--version] [--propagate] [--unhyphenated-uuids] \
  {pool,blockdev,filesystem,fs,report,key,debug,daemon} ...

Stratis Storage Manager

optional arguments:
  -h, --help            show this help message and exit
  --version             show program's version number and exit
  --propagate           Allow exceptions to propagate
  --unhyphenated-uuids  Display UUIDs in unhyphenated format

subcommands:
  {pool,blockdev,filesystem,fs,report,key,debug,daemon}
    pool                Perform General Pool Actions
    blockdev            Commands related to block devices that make up the pool
    filesystem (fs)     Commands related to filesystems allocated from a pool
    report              Commands related to reports of the daemon state
    key                 Commands related to key operations for encrypted pools
    debug               Commands for debugging operations.
    daemon              Stratis daemon information

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

[root@localhost ~]# stratis pool create vbirdpool /dev/raidvg/raidlv
[root@localhost ~]# stratis pool list
Name                     Total / Used / Free    Properties                                   UUID   Alerts
vbirdpool   5.99 GiB / 525.31 MiB / 5.48 GiB   ~Ca,~Cr, Op   e9d1df7a-d93e-4409-a3d8-d7a144872452   WS001
# 所以有個 vbirdpool 的儲存池,裡面實際有 5.99G,用掉了 525M 容量了。

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

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

[root@localhost ~]# stratis pool add-data vbirdpool /dev/vda9
Execution failed:
stratisd failed to perform the operation that you requested. It returned the following 
  information via the D-Bus: ERROR: At least one of the devices specified was unsuitable 
  for initialization: Device /dev/vda9 is 529513984 bytes which is smaller than the 
  minimum required size for a Stratis blockdev, 1073741824 bytes.

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

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

[root@localhost ~]# stratis pool add-data vbirdpool /dev/rocky/lvm
[root@localhost ~]# stratis pool list
Name                     Total / Used / Free    Properties                                   UUID   Alerts
vbirdpool   7.49 GiB / 530.06 MiB / 6.97 GiB   ~Ca,~Cr, Op   e9d1df7a-d93e-4409-a3d8-d7a144872452

[root@localhost ~]# stratis blockdev list
Pool Name   Device Node   Physical Size   Tier
vbirdpool   /dev/dm-3          5.99 GiB   DATA
vbirdpool   /dev/dm-9          1.50 GiB   DATA

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

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

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

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

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

[root@localhost ~]# stratis filesystem create vbirdpool fs1
[root@localhost ~]# stratis filesystem list
Pool        Filesystem   Total / Used / Free             Created             Device                       UUID
vbirdpool   fs1          1 TiB / 545 MiB / 1023.47 GiB   May 28 2023 23:01   /dev/stratis/vbirdpool/fs1   b56bab2e-e6cd-4200-b13b-44e676d6fbdd

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

[root@localhost ~]# blkid /dev/stratis/vbirdpool/*
/dev/stratis/vbirdpool/fs1: UUID="b56bab2e-e6cd-4200-b13b-44e676d6fbdd" TYPE="xfs"

[root@localhost ~]# mkdir /srv/pool1
[root@localhost ~]# mount UUID="b56bab2e-e6cd-4200-b13b-44e676d6fbdd" /srv/pool1
[root@localhost ~]# df -Th /srv/pool1
檔案系統                  ..... 類型  容量  已用  可用 已用% 掛載點
/dev/mapper/stratis-1-e9d1..... 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會進行壓縮等行為,也就讓你的系統可以進行更多檔案的儲存!

不過,從 RHEL 9 以後,VDO 支援 LVM 了,因此,要使用 VDO 的話,得要透過 LVM 的相關 lvcreate 來建立才行喔! 相關的 VDO 搭配 LVM 的示意圖,如下所示:

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

VDO 的使用需要透過 vdo 以及 kmod-kvdo 模組的支援,因此得要安裝這兩個軟體才行。由於 vdo 在 RockyLinux 9 底下是透過 LVM 支援, 因此,不需要啟動任何服務喔!

[root@localhost ~]# yum install vdo kmod-kvdo lvm2

接下來我們就可以透過 lvm 來處理 vdo 了!不過,我們得要將剛剛建立的 /dev/raidvg/raidlv 刪除並且重新建立成為 vdo 支援的樣式才行!基本上,使用的狀態就跟 lvm 沒兩樣~現在,我們將 raidvg 的所有容量都給 raidlv, 同時假裝該磁碟容量具有 10G 的容量效果,可以這樣做看看:

[root@localhost ~]# lvremove /dev/raidvg/raidlv
Do you really want to remove active logical volume raidvg/raidlv? [y/n]: y
  Logical volume "raidlv" successfully removed.

[root@localhost ~]# lvcreate --help
.....
  Create a LV that returns VDO when used.
  lvcreate --type vdo -L|--size Size[m|UNIT] VG
        [ -l|--extents Number[PERCENT] ]
        [ -i|--stripes Number ]
        [ -I|--stripesize Size[k|UNIT] ]
        [ -V|--virtualsize Size[m|UNIT] ]
        [    --vdo ]
        [    --vdopool LV_new ]
        [    --compression y|n ]
        [    --deduplication y|n ]
        [    --vdosettings String ]
        [ COMMON_OPTIONS ]
        [ PV ... ]
.....

[root@localhost ~]# lvcreate -l 1533 --vdo --name vdolv --compression y --deduplication y --virtualsize 10G raidvg
[root@localhost ~]# lvscan
  ACTIVE            '/dev/rocky/home' [3.00 GiB] inherit
  ACTIVE            '/dev/rocky/root' [12.00 GiB] inherit
  ACTIVE            '/dev/rocky/swap' [1.00 GiB] inherit
  ACTIVE            '/dev/rocky/lvm' [1.50 GiB] inherit
  inactive          '/dev/raidvg/vpool0' [<5.99 GiB] inherit
  ACTIVE            '/dev/raidvg/vdolv' [10.00 GiB] inherit

[root@localhost ~]# vdostats --human-readable
Device                   Size      Used Available Use% Space saving%
raidvg-vpool0-vpool      6.0G      4.0G      2.0G  67%            0%

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

實際練習:將 /dev/raidvg/vdolv 格式化為 xfs 檔案系統,掛載到 /srv/vdo 目錄下,並且開機自動掛載
  1. 開始格式化:
    [root@localhost ~]# mkfs.xfs /dev/raidvg/vdolv
    
    [root@localhost ~]# vdostats --human-readable
    Device                   Size      Used Available Use% Space saving%
    raidvg-vpool0-vpool      6.0G      4.0G      2.0G  67%           99%
    
  2. 開始測試掛載
    [root@localhost ~]# vim /etc/fstab
    /dev/raidvg/vdolv /srv/vdo xfs defaults 0 0
    
    [root@localhost ~]# mkdir /srv/vdo
    [root@localhost ~]# mount -a
    [root@localhost ~]# df -Th /srv/vdo
    檔案系統                 類型  容量  已用  可用 已用% 掛載點
    /dev/mapper/raidvg-vdolv xfs    10G  104M  9.9G    2% /srv/vdo
    
    [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 管理的檔案系統內的資料, 不應該是一般的檔案,而是作為虛擬磁碟的檔案才對!雖然 RHEL 9 以後的 VDO 使用具有多種功能,不過基礎應用應該還是在虛擬機器的磁碟檔案上才是。 所以,我們得要先來製作虛擬磁碟機的檔案才行!如下所示,我們先來建立一個大型的檔案 (雖然不是專門用來進行磁碟系統的)。

[root@localhost ~]# df -Th /
檔案系統               類型  容量  已用  可用 已用% 掛載點
/dev/mapper/rocky-root xfs    12G  6.0G  6.1G   50% /

[root@localhost ~]# tar -cf /vmdisk.img /etc /home /root
[root@localhost ~]# ll -h /vmdisk.img
-rw-r--r--. 1 root root 477M  5月 29 09:40 /vmdisk.img

這樣就有一個沒有壓縮的超過數百 MB 以上的大型檔案!開始進行複製的舉動,將這個檔案複製到 /srv/vdo 目錄去:

[root@localhost ~]# vdostats --human-readable
Device                   Size      Used Available Use% Space saving%
raidvg-vpool0-vpool      6.0G      4.0G      2.0G  67%           98%

[root@localhost ~]# cp /vmdisk.img /srv/vdo
[root@localhost ~]# vdostats --human-readable
Device                   Size      Used Available Use% Space saving%
raidvg-vpool0-vpool      6.0G      4.3G      1.7G  72%           36%

[root@localhost ~]# cp /vmdisk.img /srv/vdo/vmdisk2.img
[root@localhost ~]# vdostats --human-readable
Device                   Size      Used Available Use% Space saving%
raidvg-vpool0-vpool      6.0G      4.3G      1.7G  72%           68%

[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%
raidvg-vpool0-vpool      6.0G      4.3G      1.7G  72%           83%

[root@localhost ~]# df -Th /srv/vdo
檔案系統                 類型  容量  已用  可用 已用% 掛載點
/dev/mapper/raidvg-vdolv xfs    10G  2.0G  8.1G   20% /srv/vdo

你可以發現,雖然單一檔案有數百 MB 的容量,但是整體 VDO 還是只有第一次複製時有消耗容量而已, 使用傳統檔案系統的 df 來看,卻已經使用掉 2G 了!這就可以節省非常多的容量喔!而且你不用自己做快照!

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/rocky-root
/srv/vdo            /dev/mapper/raidvg-vdolv
/home               /dev/mapper/rocky-home (uquota, gquota)

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

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

上表顯示的狀況為:

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

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

[root@localhost ~]# xfs_quota -x -c "report" /home
User quota on /home (/dev/mapper/rocky-home)
                               Blocks
User ID          Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
root                4          0          0     00 [--------]
sysuser1           16          0          0     00 [--------]
student         98952          0          0     00 [--------]
.....
Group quota on /home (/dev/mapper/rocky-home)
                               Blocks
Group ID         Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
root                4          0          0     00 [--------]
users              16          0          0     00 [--------]
student         98952          0          0     00 [--------]
.....

[root@localhost ~]# xfs_quota -x -c "report -ubih" /home
User quota on /home (/dev/mapper/rocky-home)
                        Blocks                            Inodes
User ID      Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root           4K      0      0  00 [------]      4      0      0  00 [------]
sysuser1      16K      0      0  00 [------]     10      0      0  00 [------]
student     96.6M      0      0  00 [------]   2.3k      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/rocky-home)
                        Blocks
User ID      Used   Soft   Hard Warn/Grace
---------- ---------------------------------
root           4K      0      0  00 [------]
sysuser1      16K      0      0  00 [------]
student     96.6M   1.8G     2G  00 [------]
.....

# 僅查看單一用戶,就可以這樣處理:
[root@localhost ~]# xfs_quota -x -c "quota -ubh student" /home
Disk quotas for User student (1000)
Filesystem   Blocks  Quota  Limit Warn/Time    Mounted on
/dev/mapper/rocky-home
              96.6M   1.8G     2G  00 [------] /home

若需要取消 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. 建立磁碟陣列:
    1. 將原有剩餘容量,平均分割為 2 個分割槽,每個分割槽應該是在 4G 左右即可。
    2. 設定成為 raid1 的磁碟陣列,建立檔名為 /dev/md0 的軟體磁碟陣列
  4. 建立支援 XFS 的 LVM 檔案系統
    1. 將 /dev/md0 設定成為 PV 之後,建立起 testvg 的 VG 名稱,所有參數使用預設值即可
    2. 建立名為 /dev/testvg/testlv 的 LV,所有容量均給予這個裝置即可
    3. 讓 testlv 格式化為 xfs 檔案系統,並且啟動 quota 及掛載於 /srv/testlv 目錄中
  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. 進行分割 (partition) 時,在 GPT 的分割表情境下,(a)Linux LVM 與 (b)Linux software RAID 的 system ID 各為何?
    6. 進行磁碟配額 (filesystem quota) 時,掛載參數要加上哪兩個檔案系統參數 (以 XFS 檔案系統為例) 才能夠支援使用者與群組的 quota
    7. 承上,磁碟配額限制【磁碟使用容量】與【可用檔案數量】時,分別是限制甚麼項目?
  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. (20%)綜合管理檔案系統
    1. 請建立 7 個 1GB 的分割槽,且 system ID 請設定為 RAID 的樣式
    2. 將上列磁碟分割槽用來建立 /dev/md0 為名的磁碟陣列,等級為 RAID5,無須 spare disk,chunk size 請指定為 1M
    3. 以 /dev/md0 為磁碟來源,並依據底下的說明,建立一個 LVM 的裝置
      • VG 名稱請取為 govg ,PE 需要具有 8MB 的大小
      • LV 名稱請取為 golv,容量約有 500MB
      • 格式化為 ext4 檔案系統,且開機會自動掛載於 /data/golv 載點上
  4. (20%)建立 VDO 管理虛擬化磁碟系統的機制:
    1. 建立名為 /dev/govg/govdo 的 VDO 捲軸 (volumn),將 govg 的所有剩餘容量都給 govdo,該 volumn 具有自動壓縮功能, 且自動去除重複資料,最終給予 15G 的邏輯容量
    2. 格式化成為 xfs 檔案系統,並且開機後會自動掛載到 /data/govdo/ 目錄下
  5. (20%)建立一個名為 /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

修改歷史:
  • 2023/05/29:在 RHEL 9 的 stratis 以及 VDO 的設計說明,跟前一代確實有不一樣了!
  • 2023/06/05:作業硬碟終於搞定!
2023/05/29 以來統計人數
計數器
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計