檔案系統是個迷人又磨人的東西~管理的好,你的系統會很穩定,管理不好,擴充容量又會產生大問題~加油吧!
基礎的檔案系統管理中,通常一個 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 來使用:
先使用 gdisk 或 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 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 比較需要注意的有三個項目:
根據上述的資料,使用 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 為實際被使用在檔案系統內的裝置,建置時需要考量的項目大概有:
同樣使用 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 這種格式的裝置檔名即可。
LVM 最重要的任務就是進行裝置的容量放大與縮小,不過,前提是在該裝置下的檔案系統能夠支援放大與縮小才行。 目前在 CentOS 8 上面主要的兩款檔案系統中, 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 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 的容量。因此,我們可以使用:
這兩種方式都可以!主要都是透過 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
假設讀者因為某些特殊需求,所以需要將 /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。
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] 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
[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
[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 暫時不要使用他,我們在下個小節來玩一些比較有趣的項目!
近年來包括自動化佈署、虛擬機器的盛行等,傳統的檔案系統容量再大,也無法持續提供大量的本地端容量,即使已經使用了 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 [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 啦!這裡單純給大家瞧瞧!
所有以 stratisd 建立的檔案系統,其裝置檔名預設都會以底下的方式存在:
如上,我們先設定一個 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 之前,因此如果沒有加上特別的注意,該掛載在開機過程當中是會失敗的! 特別留意這個問題!
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會進行壓縮等行為,也就讓你的系統可以進行更多檔案的儲存!
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 時, 裝置的容量還是大一些比較妥當。我們這裡只進行測試啦!接下來,請將這個裝置掛載使用吧。
[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%
[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 在進行檔案的處理時,主要會有三個階段 ( 3 phases ),流程如下:
大家要先有個概念,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 了!這就可以節省非常多的容量喔!
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/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 資料,可以使用 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 之類的選項來處理。
主要針對使用者與群組的 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
作業硬碟一般操作說明:
作業當中,某些部份可能為簡答題~若為簡答題時,請將答案寫入 /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