檔案系統是個迷人又磨人的東西~管理的好,你的系統會很穩定,管理不好,擴充容量又會產生大問題~加油吧!
基礎的檔案系統管理中,通常一個 partition 只能作為一個 filesystem。但實際上,我們可以透過 RAID 的技術以及 LVM 的技術將不同的 partition/disk 整合成為一個大的檔案系統,而這些檔案系統又能具有硬體容錯的功能在,對於關注儲存設備物理安全性的管理員來說,這些技術相當的重要!
陣列 (RAID) 的目的主要在『加大磁碟容量』、『具有磁碟容錯』、『增加讀寫效能』等方面,而根據你著重的面向就得要使用不同的磁碟陣列等級了。
磁碟陣列全名是『 Redundant Arrays of Independent Disks, RAID 』,英翻中的意思為:獨立容錯式磁碟陣列,舊稱為容錯式廉價磁碟陣列, 反正就稱為磁碟陣列即可!RAID 可以透過一個技術(軟體或硬體),將多個較小的磁碟整合成為一個較大的磁碟裝置; 而這個較大的磁碟功能可不止是儲存而已,他還具有資料保護的功能。 整個 RAID 由於選擇的等級 (level) 不同,而使得整合後的磁碟具有不同的功能,基本常見的 level 有這幾種:
項目 | RAID0 | RAID1 | RAID10 | RAID5 | RAID6 |
最少磁碟數 | 2 | ||||
最大容錯磁碟數(1) | 無 | n-1 | |||
資料安全性(1) | 完全沒有 | ||||
理論寫入效能(2) | n | 1 | n/2 | <n-1 | <n-2 |
理論讀出效能(2) | n | n | n | <n-1 | <n-2 |
可用容量(3) | n | 1 | |||
一般應用 | 強調效能但資料不重要的環境 | 資料與備份 | 伺服器、雲系統常用 | 資料與備份 | 資料與備份 |
而達成磁碟陣列功能的,主要有硬體 RAID 與軟體 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) 裝置
磁碟陣列建置妥當後,應該觀察一下運作的狀況比較妥當。主要的觀察方式為:
[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 :會將後面的裝置設定成為出錯的狀態
雖然 RAID 可以將檔案系統容量增加,也有效能增加與容錯的機制,但是就是沒有辦法在既有的檔案系統架構下,直接將容量放大的機制。 此時,可以彈性放大與縮小的 LVM 輔助,就很有幫助了。不過 LVM 主要是在彈性的管理檔案系統,不在於效能與容錯上。 因此,若需要容錯與效能,可以將 LVM 放置到 RAID 裝置上即可。
LVM 的全名是 Logical Volume Manager,中文可以翻譯作邏輯捲軸管理員。之所以稱為『捲軸』可能是因為可以將 filesystem 像捲軸一樣伸長或縮短之故!LVM 的作法是將幾個實體的 partitions (或 disk) 透過軟體組合成為一塊看起來是獨立的大磁碟 (VG) , 然後將這塊大磁碟再經過分割成為可使用分割槽 (LV), 最終就能夠掛載使用了。
上述談到的資料,可使用下圖來解釋彼此的關係:
如前一小節所述,管理員若想要處理 LVM 的功能,應該從 partition --> PV --> VG --> LV --> filesystem 的角度來處理。 請讀者以底下的設定來實做出一組 LVM 來使用:
先使用 fdisk 分割出本案例所需要的 4 個分割,假設分割完成的磁碟檔名為 /dev/vda{9,10,11,12} 四個。 接下來即可使用 LVM 提供的指令來處理後續工作。一般來說, LVM 的三個階段 (PV/VG/LV) 均可分為『建立』、『掃描』與『詳細查閱』等步驟, 其相關指令可以彙整如下表:
任務 | PV 階段 | VG 階段 | LV 階段 | filesystem (XFS / EXT4) | |
搜尋(scan) | pvscan | vgscan | lvscan | lsblk, blkid | |
建立(create) | pvcreate | vgcreate | lvcreate | mkfs.xfs | mkfs.ext4 |
列出(display) | pvdisplay | vgdisplay | lvdisplay | df, mount | |
增加(extend) | vgextend | lvextend (lvresize) | xfs_growfs | resize2fs | |
減少(reduce) | vgreduce | lvreduce (lvresize) | 不支援 | resize2fs | |
刪除(remove) | pvremove | vgremove | lvremove | umount, 重新格式化 | |
改變容量(resize) | lvresize | xfs_growfs | resize2fs | ||
改變屬性(attribute) | pvchange | vgchange | lvchange | /etc/fstab, remount |
所有的 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 比較需要注意的有三個項目:
根據上述的資料,使用 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 為實際被使用在檔案系統內的裝置,建置時需要考量的項目大概有:
同樣使用 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 這種格式的裝置檔名即可。
LVM 最重要的任務就是進行裝置的容量放大與縮小,不過,前提是在該裝置下的檔案系統能夠支援放大與縮小才行。 目前在 RockyLinux 9 上面主要的兩款檔案系統中, ext4 可以放大與縮小,但是 xfs 檔案系統則僅能放大而已。因此使用上需要特別注意。
從上面的案例中,讀者可以知道 myvg 這個 VG 的總容量 1.1G 當中,有 500M 給 /dev/myvg/mylv 而 300M 給 /dev/myvg/mylvm2, 因此剩下大約 300MB 左右,讀者可以使用『 vgdisplay myvg 』來查詢剩餘的容量。若需要將檔案系統放大,則需要進行:
上述兩個步驟的順序不可錯亂。將 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 的容量。因此,我們可以使用:
這兩種方式都可以!主要都是透過 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
假設讀者因為某些特殊需求,所以需要將 /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。
RAID 主要的目的在效能與容錯 (容量只是附加的),而 LVM 重點在彈性管理檔案系統 (最好不要考量 LVM 內建的容錯機制)。 若需要兩者的優點,則可以在 RAID 上面建置 LVM。但以目前管理員的測試機而言,建議先關閉原有的測試流程,然後再重新建立為宜。
在本練習冊中,我們並沒有給予 RAID 的設定檔,因此刪除掉分割槽後,系統應該會自動捨棄 software RAID (/dev/md0)。 不過,如果沒有將每個分割槽的檔頭資料刪除,那未來重新開機時, mdadm 還是會嘗試抓取 /dev/md0,這將造成些許困擾。 因此,建議刪除掉 software RAID 的手段如下:
LVM 的管理是很嚴格的,因此管理員不可在 LVM 活動中的情況下刪除掉任何一個屬於 LVM 的 partition/disk 才對。 例如目前 /dev/vda{9,10,11,12,13} 屬於 myvg 這個 VG,因此如果 myvg 沒有停止,那麼管理員不應該也盡量避免更動到上述的分割槽。 若需要停止與回收這個 VG 的分割槽,應該要這樣處理。
我們現在的練習機上面,還沒有分割的容量應該有 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 )
完成基礎分割以建立假想的 5 顆實際不同的磁碟後,再來組成磁碟陣列才會有意義!然後開始處理軟體磁碟陣列與 LVM 吧!
[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
[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
[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 暫時不要使用他,我們在下個小節來玩一些比較有趣的項目!
近年來包括自動化佈署、虛擬機器的盛行等,傳統的檔案系統容量再大,也無法持續提供大量的本地端容量,即使已經使用了 LVM。 因此,就有很多計畫在處理磁碟與檔案系統對應的機制,其中兩個很有趣的計畫,一個是 Stratis ,另一個則是 VDO 機制, 這兩個東西都可以仔細瞧瞧,挺有趣的!
目前的本地端儲存設備與檔案系統的應用中,包括了 device mapper (dm), LVM, RAID, Multipath, XFS 等等機制, 這些機制各有各的好處。不過,還是經常需要進行檔案系統分割、格式化等行為。為了方便使用者的應用,於是有了 stratis 這個機制的產生。
Stratis 透過捲軸管理檔案系統的概念 (volume managing filesystem, VMF) ,簡單的將整個裝置、檔案系統分為幾個小階層,有點類似底下的圖示:
簡單的來說,可以簡化為底下的樣式:
簡單的來說,stratis 大致應用了目前的 LVM 與 XFS 機制,stratis 提供了一個名為儲存池 (pool) 的概念,其實就有點類似 LVM 裡面的 VG 的概念, 然後,你可以簡單的將任何的區塊裝置 (傳統磁碟、SSD、插卡式磁碟、iSCSI、LVM等) 加入這個儲存池,然後在直接掛載到目錄樹底下, 就可以直接應用了。此外,由於掛載時的檔案系統是在使用者層,因此,可以隨便你設定容量為多少,即使該容量目前並不存在這麼大。
要達成 stratis 的功能,你的系統得要安裝 stratisd 服務才行。同時,如果想要管理 stratisd 的話,就得要安裝 stratis-cli 軟體才行! 先來安裝軟體後,啟動該項目吧:
[root@localhost ~]# yum install stratisd stratis-cli [root@localhost ~]# systemctl start stratisd [root@localhost ~]# systemctl enable stratisd
簡單的依據『安裝』、『啟動』、『開機啟動』的口訣來處理即可!不過因為 stratis 並不是網路服務,而是本機的儲存系統, 因此不需要防火牆囉!很快速的就處理好 stratisd 服務。
服務啟動之後,接下來就可以直接建立儲存池 (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 啦!這裡單純給大家瞧瞧!
所有以 stratisd 建立的檔案系統,其裝置檔名預設都會以底下的方式存在:
如上,我們先設定一個 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 之前,因此如果沒有加上特別的注意,該掛載在開機過程當中是會失敗的! 特別留意這個問題!
UUID="7430f67c-671e-4c5c-9e98-a77ccbbc8574" /srv/pool1 xfs defaults,x-systemd.requires=stratisd.service 0 0
[root@localhost ~]# umount /srv/pool1 [root@localhost ~]# mount -a [root@localhost ~]# reboot
要移除 stratis 的話,就跟移除一般檔案系統類似,從 /etc/fstab 的編輯以及卸載後,再以 stratis 刪除掉檔案系統與儲存池即可。
[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
身為現代人,你應該、絕對聽過所謂的虛擬化,我們現在上課使用的系統就是虛擬機器啊!使用到虛擬機器的原因,當然是由於硬體資源大幅提昇的緣故, 因此一部主機可以做成虛擬機器的本機 (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 的示意圖,如下所示:
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 時, 裝置的容量還是大一些比較妥當。我們這裡只進行測試啦!接下來,請將這個裝置掛載使用吧。
[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%
[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 在進行檔案的處理時,主要會有三個階段 ( 3 phases ),流程如下:
大家要先有個概念,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 了!這就可以節省非常多的容量喔!而且你不用自己做快照!
Filesystem Quota 可以使用於『公平的』使用檔案系統。雖然現今磁碟容量越來越大,但是在某些特別的情境中,為了管制使用者亂用檔案系統, 還是有必要管理一下 quota 用量的。
基本上,要能使用 Quota ,你需要有底下的支援:
而一般 Quota 針對的管理對象是:
那可以限制的檔案系統資料是:
至於限制的數值與資料,又可以分為底下幾個:
所謂的『檔案系統鎖死』的意思,指的是使用者將無法新增/刪除檔案系統的任何資料,所以就得要藉由系統管理員來處理了!
由於 Quota 需要檔案系統的支援,因此管理員請務必在 fstab 檔案中增加底下的設定值:
在 xfs 檔案系統中,由於 quota 是『檔案系統內部紀錄管理』的,不像 EXT 家族是透過外部管理檔案處理, 因此設定好參數後,一定要卸載再掛載 (umount --> mount),不可以使用 remount 來處理。
一般來說,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 資料,可以使用 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 之類的選項來處理。
主要針對使用者與群組的 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
作業硬碟一般操作說明:
作業當中,某些部份可能為簡答題~若為簡答題時,請將答案寫入 /home/student/ans.txt 當中,並寫好正確題號,方便老師訂正答案。 請注意,檔名寫錯將無法上傳!
請使用 root 的身份進行如下實做的任務。直接在系統上面操作,操作成功即可,上傳結果的程式會主動找到你的實做結果。 並請注意,題目是有相依性的,因此請依序進行底下的題目為宜
作業結果傳輸:請以 root 的身分執行 vbird_book_check_unit 指令上傳作業結果。 正常執行完畢的結果應會出現【XXXXXX_aa:bb:cc:dd:ee:ff_unitNN】字樣。若需要查閱自己上傳資料的時間, 請在作業系統上面使用瀏覽器查詢: http://192.168.251.254 檢查相對應的課程檔案。 相關流程請參考: vbird_book_check_unit