1. 程式人生 > 其它 >《Linux就該這麼學》 第七章_使用RAID和LVM磁碟陣列技術

《Linux就該這麼學》 第七章_使用RAID和LVM磁碟陣列技術

《Linux就該這麼學》 讀書隨筆集

第七章

在學習了第6章講解的硬碟裝置分割槽、格式化、掛載等知識後,本章將深入講解各個常用RAID(Redundant Array of Independent Disks,獨立冗餘磁碟陣列)技術方案的特性,並通過實際部署RAID 10、RAID 5+備份盤等方案來更直觀地檢視RAID的強大效果,以便進一步滿足生產環境對硬碟裝置的IO讀寫速度和資料冗餘備份機制的需求。同時,考慮到使用者可能會動態調整儲存資源,本章還將介紹LVM(Logical Volume Manager,邏輯卷管理器)的部署、擴容、縮小、快照以及解除安裝刪除的相關知識。相信讀者在學完本章內容後,可以在企業級生產環境中靈活運用RAID和LVM來滿足對儲存資源的高階管理需求。

7.1 RAID磁碟冗餘陣列

近年來,CPU的處理效能保持著高速增長。2017年,Intel公司釋出了i9-7980XE處理器晶片,率先讓家用電腦達到了18核心36執行緒。2020年末,AMD公司又推出了“執行緒撕裂者”系統處理器3990X,家用電腦自此也可以輕鬆駕馭64核心128執行緒的處理器小怪獸了。但與此同時,硬碟裝置的效能提升卻不是很大,逐漸成為當代計算機整體效能的瓶頸。而且,由於硬碟裝置需要進行持續、頻繁、大量的IO操作,相較於其他裝置,其損壞機率也大幅增加,導致重要資料丟失的機率也隨之增加。

硬碟裝置是計算機中較容易出現故障的元器件之一,加之由於其需要儲存資料的特殊性質,不能像CPU、記憶體、電源甚至主機板那樣在出現故障後更換新的就好,所以在生產環境中一定要未雨綢繆,提前做好資料的冗餘及異地備份等工作。

1988年,美國加利福尼亞大學伯克利分校首次提出並定義了RAID技術的概念。RAID技術通過把多個硬碟裝置組合成一個容量更大、安全性更好的磁碟陣列,並把資料切割成多個區段後分別存放在各個不同的物理硬碟裝置上,然後利用分散讀寫技術來提升磁碟陣列整體的效能,同時把多個重要資料的副本同步到不同的物理硬碟裝置上,從而起到了非常好的資料冗餘備份效果。

任何事物都有它的兩面性。RAID技術確實具有非常好的資料冗餘備份功能,但是它也相應地提高了成本支出。就像原本我們只有一個電話本,但是為了避免遺失,我們把聯絡人號碼資訊寫成了兩份,自然要為此多買一個電話本,這也就相應地提升了成本支出。RAID技術的設計初衷是減少因為採購硬碟裝置帶來的費用支出,但是與資料本身的價值相比較,現代企業更看重的則是RAID技術所具備的冗餘備份機制以及帶來的硬碟吞吐量的提升。也就是說,RAID不僅降低了硬碟裝置損壞後丟失資料的機率,還提升了硬碟裝置的讀寫速度,所以它在絕大多數運營商或大中型企業中得到了廣泛部署和應用。

出於成本和技術方面的考慮,需要針對不同的需求在資料可靠性及讀寫效能上做出權衡,制定出滿足各自需求的不同方案。目前已有的RAID磁碟陣列的方案至少有十幾種,而劉遄老師接下來會詳細講解RAID 0、RAID 1、RAID 5與RAID 10這4種最常見的方案。這4種方案的對比如表7-1所示,其中n代表硬碟總數。

表7-3 RAID 0、1、5、10方案技術對比

RAID級別 最少硬碟 可用容量 讀寫效能 安全性 特點
0 2 n n 追求最大容量和速度,任何一塊盤損壞,資料全部異常。
1 2 n/2 n 追求最大安全性,只要陣列組中有一塊硬碟可用,資料不受影響。
5 3 n-1 n-1 在控制成本的前提下,追求硬碟的最大容量、速度及安全性,允許有一塊硬碟異常,資料不受影響。
10 4 n/2 n/2 綜合RAID1和RAID0的優點,追求硬碟的速度和安全性,允許有一半硬碟異常(不可同組),資料不受影響

1. RAID 0

RAID 0技術把多塊物理硬碟裝置(至少兩塊)通過硬體或軟體的方式串聯在一起,組成一個大的卷組,並將資料依次寫入各個物理硬碟中。這樣一來,在最理想的狀態下,硬碟裝置的讀寫效能會提升數倍,但是若任意一塊硬碟發生故障,將導致整個系統的資料都受到破壞。通俗來說,RAID 0技術能夠有效地提升硬碟資料的吞吐速度,但是不具備資料備份和錯誤修復能力。如圖7-1所示,資料被分別寫入到不同的硬碟裝置中,即硬碟A和硬碟B裝置會分別儲存資料資料,最終實現提升讀取、寫入速度的效果。

圖7-1 RAID 0技術示意圖

2. RAID 1

儘管RAID 0技術提升了硬碟裝置的讀寫速度,但它是將資料依次寫入到各個物理硬碟中。也就是說,它的資料是分開存放的,其中任何一塊硬碟發生故障都會損壞整個系統的資料。因此,如果生產環境對硬碟裝置的讀寫速度沒有要求,而是希望增加資料的安全性時,就需要用到RAID 1技術了。

在圖7-2所示的RAID 1技術示意圖中可以看到,它是把兩塊以上的硬碟裝置進行繫結,在寫入資料時,是將資料同時寫入到多塊硬碟裝置上(可以將其視為資料的映象或備份)。當其中某一塊硬碟發生故障後,一般會立即自動以熱交換的方式來恢復資料的正常使用。

圖7-2 RAID 1技術示意圖

考慮到在進行寫入操作時因硬碟切換帶來的開銷,因此RAID 1的速度會比RAID 0有微弱地降低。但在讀取資料的時候,作業系統可以分別從兩塊硬碟中讀取資訊,因此理論讀取速度的峰值可以是硬碟數量的倍數。另外,平時只要保證有一塊硬碟穩定執行,資料就不會出現損壞的情況,可靠性較高。

RAID 1技術雖然十分注重資料的安全性,但是因為是在多塊硬碟裝置中寫入了相同的資料,因此硬碟裝置的利用率得以下降。從理論上來說,圖7-2所示的硬碟空間的真實可用率只有50%,由3塊硬碟裝置組成的RAID 1磁碟陣列的可用率只有33%左右;以此類推。而且,由於需要把資料同時寫入到兩塊以上的硬碟裝置,這無疑也在一定程度上增大了系統計算功能的負載。

那麼,有沒有一種RAID方案既考慮到了硬碟裝置的讀寫速度和資料安全性,還兼顧了成本問題呢?實際上,單從資料安全和成本問題上來講,就不可能在保持原有硬碟裝置的利用率且還不增加新裝置的情況下,能大幅提升資料的安全性。劉遄老師也沒有必要忽悠各位讀者,下面將要講解的RAID 5技術雖然在理論上兼顧了三者(讀寫速度、資料安全性、成本),但實際上更像是對這三者的“相互妥協”。

3. RAID 5

如圖7-3所示,RAID5技術是把硬碟裝置的資料奇偶校驗資訊儲存到其他硬碟裝置中。RAID 5磁碟陣列中資料的奇偶校驗資訊並不是單獨儲存到某一塊硬碟裝置中,而是儲存到除自身以外的其他每一塊硬碟裝置上。這樣的好處是,其中任何一裝置損壞後不至於出現致命缺陷。圖7-3中Parity部分存放的就是資料的奇偶校驗資訊。換句話說,就是RAID 5技術實際上沒有備份硬碟中的真實資料資訊,而是當硬碟裝置出現問題後通過奇偶校驗資訊來嘗試重建損壞的資料。RAID這樣的技術特性“妥協”地兼顧了硬碟裝置的讀寫速度、資料安全性與儲存成本問題。

圖7-3 RAID5技術示意圖

RAID 5最少由3塊硬碟組成,使用的是硬碟切割(Disk Striping)技術。相較於RAID 1級別,好處就在於儲存的是奇偶校驗資訊而不是一模一樣的檔案內容,所以當重複寫入某個檔案時,RAID 5級別的磁碟陣列組只需要對應一個奇偶校驗資訊就可以,效率更高,儲存成本也會隨之降低。

4. RAID 10

RAID 5技術是出於硬碟裝置的成本問題對讀寫速度和資料的安全效能有了一定的妥協,但是大部分企業更在乎的是資料本身的價值而非硬碟價格,因此在生產環境中主要使用RAID 10技術。

顧名思義,RAID 10技術是RAID 1+RAID 0技術的一個“組合體”。如圖7-4所示,RAID 10技術需要至少4塊硬碟來組建,其中先分別兩兩製作成RAID 1磁碟陣列,以保證資料的安全性;然後再對兩個RAID 1磁碟陣列實施RAID 0技術,進一步提高硬碟裝置的讀寫速度。這樣從理論上來講,只要壞的不是同一陣列中的所有硬碟,那麼最多可以損壞50%的硬碟裝置而不丟失資料。由於RAID 10技術繼承了RAID 0的高讀寫速度和RAID 1的資料安全性,在不考慮成本的情況下RAID 10的效能也超過了RAID 5,因此當前成為廣泛使用的一種儲存技術。

圖7-4 RAID 10技術示意圖
Tips

由於RAID 10是由RAID 1和RAID 0組成的,因此正確的叫法是“RAID一零”,而不是“RAID十”。

仔細檢視圖7-4可以發現,RAID 10是先對資訊進行分割,然後再兩兩一組製作映象。也就是先將RAID 1作為最低級別的組合,然後再使用RAID 0技術將RAID 1磁碟陣列組合到一起,將它們視為“一整塊”硬碟。而RAID 01則相反,它是先將硬碟分為兩組,然後使用RAID 0作為最低級別的組合,再將這兩組RAID 0硬碟通過RAID 1技術組合到一起。

RAID 10技術和RAID 01技術的區別非常明顯。在RAID 10中,任何一塊硬碟損壞都不會影響到資料安全性,其餘硬碟均會正常運作。但在RAID 01中,只要有任何一塊硬碟損壞,最低級別的RAID 0磁碟陣列馬上會停止運作,這可能造成嚴重隱患。所以RAID 10遠比RAID 01常見,很多主機板甚至不支援RAID 01。

7.1.1 部署磁碟陣列

在具備了第6章的硬碟裝置管理基礎之後,再來部署RAID和LVM就變得十分輕鬆了。首先,需要在虛擬機器中新增4塊硬碟裝置來製作一個RAID 10磁碟陣列,如圖7-5所示。這裡不再詳述新增硬碟的步驟,大家自己操作就行。記得硬碟要用SCSI或SATA介面的型別,大小預設20GB就可以。

這幾塊硬碟裝置是模擬出來的,不需要特意去買幾塊真實的物理硬碟插到電腦上。需要注意的是,一定要記得在關閉系統之後,再在虛擬機器中新增硬碟裝置,否則可能會因為計算機架構的不同而導致虛擬機器系統無法識別新新增的硬碟裝置。

當前,生產環境中用到的伺服器一般都配備RAID陣列卡,儘管伺服器的價格越來越便宜,但是我們沒有必要為了做一個實驗而去單獨購買一臺伺服器,而是可以學會使用mdadm命令Linux系統中建立和管理軟體RAID磁碟陣列,而且它涉及的理論知識和操作過程與生產環境中的完全一致。

mdadm命令用於建立、調整、監控和管理RAID裝置,英文全稱為“multiple devices admin”,語法格式為“mdadm引數 硬碟名稱”。

圖7-5 新增四塊硬碟裝置

mdadm命令

中的常用引數及作用如表7-2所示。

表7-2 mdadm命令的常用引數和作用

引數 作用
-a 檢測裝置名稱
-n 指定裝置數量
-l 指定RAID級別
-C 建立
-v 顯示過程
-f 模擬裝置損壞
-r 移除裝置
-Q 檢視摘要資訊
-D 檢視詳細資訊
-S 停止RAID磁碟陣列

接下來,使用mdadm命令建立RAID 10,名稱為“/dev/md0”。

第6章中講到,udev是Linux系統核心中用來給硬體命名的服務,其命名規則也非常簡單。我們可以通過命名規則猜測到第二個SCSI儲存裝置的名稱會是/dev/sdb,然後依此類推。使用硬碟裝置來部署RAID磁碟陣列很像是將幾位同學組成一個班級,但總不能將班級命名為/dev/sdbcde吧。儘管這樣可以一眼看出它是由哪些元素組成的,但是並不利於記憶和閱讀。更何況如果使用10、50、100個硬碟來部署RAID磁碟陣列呢?

此時,就需要使用mdadm中的引數了。其中,-C引數代表建立一個RAID陣列卡;-v引數顯示建立的過程,同時在後面追加一個裝置名稱/dev/md0,這樣/dev/md0就是建立後的RAID磁碟陣列的名稱;-n 4引數代表使用4塊硬碟來部署這個RAID磁碟陣列;而-l 10引數則代表RAID 10方案;最後再加上4塊硬碟裝置的名稱就搞定了。

[root@linuxprobe ~]# mdadm -Cv /dev/md0 -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: size set to 20954112K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

初始化過程大約需要1分鐘左右,期間可以用-D引數進行檢視。也可以用-Q引數檢視簡要資訊:

[root@linuxprobe ~]# mdadm -Q /dev/md0
/dev/md0: 39.97GiB raid10 4 devices, 0 spares. Use mdadm --detail for more detail.

同學們可能會好奇,為什麼4塊20GB大小的硬碟組成的磁碟陣列組,可用空間只有39.97GB呢?

這裡不得不提到RAID 10技術的原理。它通過兩兩一組硬碟組成的RAID 1磁碟陣列保證了資料的可靠性,其中每一份資料都會被儲存兩次,因此導致硬碟存在50%的使用率和50%的冗餘率。這樣一來,80GB的硬碟容量也就只有一半了。

等兩三分鐘後,把製作好的RAID磁碟陣列格式化為Ext4格式:

[root@linuxprobe ~]# mkfs.ext4 /dev/md0
mke2fs 1.44.3 (10-July-2018)
Creating filesystem with 10477056 4k blocks and 2621440 inodes
Filesystem UUID: d1c68318-a919-4211-b4dc-c4437bcfe9da
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information: done   

隨後,建立掛載點,將硬碟裝置進行掛載操作:

[root@linuxprobe ~]# mkdir /RAID
[root@linuxprobe ~]# mount /dev/md0 /RAID
[root@linuxprobe ~]# df -h
Filesystem             Size  Used Avail Use% Mounted on
devtmpfs               969M     0  969M   0% /dev
tmpfs                  984M     0  984M   0% /dev/shm
tmpfs                  984M  9.6M  975M   1% /run
tmpfs                  984M     0  984M   0% /sys/fs/cgroup
/dev/mapper/rhel-root   17G  3.9G   14G  23% /
/dev/sr0               6.7G  6.7G     0 100% /media/cdrom
/dev/sda1             1014M  152M  863M  15% /boot
tmpfs                  197M   16K  197M   1% /run/user/42
tmpfs                  197M  3.5M  194M   2% /run/user/0
/dev/md0                40G   49M   38G   1% /RAID

再來檢視/dev/md0磁碟陣列裝置的詳細資訊,確認RAID級別(Raid Level)、陣列大小(Array Size)和總硬碟數(Total Devices)都是否正確:

[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Wed Jan 13 08:24:58 2021
        Raid Level : raid10
        Array Size : 41908224 (39.97 GiB 42.91 GB)
     Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Thu Jan 14 04:49:57 2021
             State : clean 
    Active Devices : 4
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 0

            Layout : near=2
        Chunk Size : 512K

Consistency Policy : resync

              Name : localhost.localdomain:0  (local to host linuxprobe.com)
              UUID : 289f501b:3f5f70f9:79189d77:f51ca11a
            Events : 17

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync set-A   /dev/sdb
       1       8       32        1      active sync set-B   /dev/sdc
       2       8       48        2      active sync set-A   /dev/sdd
       3       8       64        3      active sync set-B   /dev/sde

如果想讓建立好的RAID磁碟陣列能夠一直提供服務,不會因每次的重啟操作而取消,那麼一定要記得將資訊新增到/etc/fstab檔案中,這樣可以確保在每次重啟後RAID磁碟陣列都是有效的。

[root@linuxprobe ~]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
[root@linuxprobe ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Jul 21 05:03:40 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root                       /                 xfs         defaults      0 0
UUID=2db66eb4-d9c1-4522-8fab-ac074cd3ea0b   /boot             xfs         defaults      0 0
/dev/mapper/rhel-swap                       swap              swap        defaults      0 0
/dev/cdrom                                  /media/cdrom      iso9660     defaults      0 0 
/dev/md0                                    /RAID             ext4        defaults      0 0

7.1.2 損壞磁碟陣列及修復

之所以在生產環境中部署RAID 10磁碟陣列,就是為了提高儲存裝置的IO讀寫速度及資料的安全性,但因為我們的硬碟裝置是在虛擬機器中模擬出來的,所以對於讀寫速度的改善可能並不直觀。下面決定給同學們講解一下RAID磁碟陣列損壞後的處理方法,以確保大家以後在步入運維崗位後不會因為突發事件而手忙腳亂。

在確認有一塊物理硬碟裝置出現損壞而不能再繼續正常使用後,應該使用mdadm命令將其移除,然後檢視RAID磁碟陣列的狀態,可以發現狀態已經改變:

[root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Thu Jan 14 05:12:20 2021
        Raid Level : raid10
        Array Size : 41908224 (39.97 GiB 42.91 GB)
     Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Thu Jan 14 05:33:06 2021
             State : clean, degraded 
    Active Devices : 3
   Working Devices : 3
    Failed Devices : 1
     Spare Devices : 0

            Layout : near=2
        Chunk Size : 512K

Consistency Policy : resync

              Name : localhost.localdomain:0  (local to host localhost.localdomain)
              UUID : 81ee0668:7627c733:0b170c41:cd12f376
            Events : 19

    Number   Major   Minor   RaidDevice State
       -       0        0        0      removed
       1       8       32        1      active sync set-B   /dev/sdc
       2       8       48        2      active sync set-A   /dev/sdd
       3       8       64        3      active sync set-B   /dev/sde

       0       8       16        -      faulty   /dev/sdb

剛剛使用的-f引數是讓硬碟模擬損壞的效果。為了能夠徹底地將故障盤移除,還要再執行一步操作:

[root@linuxprobe ~]# mdadm /dev/md0 -r /dev/sdb
mdadm: hot removed /dev/sdb from /dev/md0

在RAID 10級別的磁碟陣列中,當RAID 1磁碟陣列中存在一個故障盤時並不影響RAID 10磁碟陣列的使用。當購買了新的硬碟裝置後再使用mdadm命令予以替換即可,在此期間可以在/RAID目錄中正常地建立或刪除檔案。由於我們是在虛擬機器中模擬硬碟,所以先重啟系統,然後再把新的硬碟新增到RAID磁碟陣列中。

更換硬碟後再次使用-a引數進行新增操作,系統預設會自動開始資料的同步工作。使用-D引數即可看到整個過程和進度(用百分比表示):

[root@linuxprobe ~]# mdadm /dev/md0 -a /dev/sdb
mdadm: added /dev/sdb
[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Thu Jan 14 05:12:20 2021
        Raid Level : raid10
        Array Size : 41908224 (39.97 GiB 42.91 GB)
     Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Thu Jan 14 05:37:32 2021
             State : clean, degraded, recovering 
    Active Devices : 3
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 1

            Layout : near=2
        Chunk Size : 512K

Consistency Policy : resync

    Rebuild Status : 77% complete

              Name : localhost.localdomain:0  (local to host localhost.localdomain)
              UUID : 81ee0668:7627c733:0b170c41:cd12f376
            Events : 34

    Number   Major   Minor   RaidDevice State
       4       8       16        0      spare rebuilding    /dev/sdb
       1       8       32        1      active sync set-B   /dev/sdc
       2       8       48        2      active sync set-A   /dev/sdd
       3       8       64        3      active sync set-B   /dev/sde

7.1.3 磁碟陣列+備份盤

RAID 10磁碟陣列中最多允許50%的硬碟裝置發生故障,但是存在這樣一種極端情況,即同一RAID 1磁碟陣列中的硬碟裝置若全部損壞,也會導致資料丟失。換句話說,在RAID 10磁碟陣列中,如果RAID 1中的某一塊硬碟出現了故障,而我們正在前往修復的路上,恰巧該RAID 1磁碟陣列中的另一塊硬碟裝置也出現故障,那麼資料就被徹底丟失了。劉遄老師可真不是烏鴉嘴,這種RAID 1磁碟陣列中的硬碟裝置同時損壞的情況還真被我的學生遇到過。

在這樣的情況下,該怎麼辦呢?其實,完全可以使用RAID備份盤技術來預防這類事故。該技術的核心理念就是準備一塊足夠大的硬碟,這塊硬碟平時處於閒置狀態,一旦RAID磁碟陣列中有硬碟出現故障後則會馬上自動頂替上去。這樣很棒吧!

為了避免多個實驗之間相互發生衝突,我們需要保證每個實驗的相對獨立性,為此需要大家自行將虛擬機器還原到初始狀態。另外,由於剛才已經演示了RAID 10磁碟陣列的部署方法,現在來看一下RAID 5的部署效果。部署RAID 5磁碟陣列時,至少需要用到3塊硬碟,還需要再加一塊備份硬碟(也叫熱備盤),所以總計需要在虛擬機器中模擬4塊硬碟裝置,如圖7-7所示。

圖7-7 重置虛擬機器後,再新增四塊硬碟裝置

現在建立一個RAID 5磁碟陣列+備份盤。在下面的命令中,引數-n 3代表建立這個RAID 5磁碟陣列所需的硬碟數,引數-l 5代表RAID的級別,而引數-x 1則代表有一塊備份盤。當檢視/dev/md0(即RAID 5磁碟陣列的名稱)磁碟陣列的時候,就能看到有一塊備份盤在等待中了。

[root@linuxprobe ~]# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: size set to 20954112K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Thu Jan 14 06:12:32 2021
        Raid Level : raid5
        Array Size : 41908224 (39.97 GiB 42.91 GB)
     Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
      Raid Devices : 3
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Thu Jan 14 06:14:16 2021
             State : clean 
    Active Devices : 3
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

              Name : localhost.localdomain:0  (local to host localhost.localdomain)
              UUID : cf0c34b6:3b08edfb:85dfa14f:e2bffc1e
            Events : 18

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd

       3       8       64        -      spare   /dev/sde

現在將部署好的RAID 5磁碟陣列格式化為Ext4檔案格式,然後掛載到目錄上,之後就能夠使用了:

[root@linuxprobe ~]# mkfs.ext4 /dev/md0
mke2fs 1.44.3 (10-July-2018)
Creating filesystem with 10477056 4k blocks and 2621440 inodes
Filesystem UUID: ff016386-1126-4799-8a5b-d716242276ec
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information: done   
[root@linuxprobe ~]# mkdir /RAID
[root@linuxprobe ~]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab

由3塊硬碟組成的RAID 5磁碟陣列,其對應的可用空間是n-1,也就是40GB。熱備盤的空間不計算進來,平時完全就是在“睡覺”,只有在意外出現時才會開始工作。

[root@linuxprobe ~]# mount -a
[root@linuxprobe ~]# df -h
Filesystem             Size  Used Avail Use% Mounted on
devtmpfs               969M     0  969M   0% /dev
tmpfs                  984M     0  984M   0% /dev/shm
tmpfs                  984M  9.6M  974M   1% /run
tmpfs                  984M     0  984M   0% /sys/fs/cgroup
/dev/mapper/rhel-root   17G  3.9G   14G  23% /
/dev/sr0               6.7G  6.7G     0 100% /media/cdrom
/dev/sda1             1014M  152M  863M  15% /boot
tmpfs                  197M   16K  197M   1% /run/user/42
tmpfs                  197M  3.5M  194M   2% /run/user/0
/dev/md0                40G   49M   38G   1% /RAID

最後是見證奇蹟的時刻!我們再次把硬碟裝置/dev/sdb移出磁碟陣列,然後迅速檢視/dev/md0磁碟陣列的狀態,就會發現備份盤已經被自動頂替上去並開始了資料同步。RAID中的這種備份盤技術非常實用,可以在保證RAID磁碟陣列資料安全性的基礎上進一步提高資料可靠性。所以,如果公司不差錢的話,還是買上一塊備份盤以防萬一吧。

[root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Thu Jan 14 06:12:32 2021
        Raid Level : raid5
        Array Size : 41908224 (39.97 GiB 42.91 GB)
     Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
      Raid Devices : 3
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Thu Jan 14 06:24:38 2021
             State : clean 
    Active Devices : 3
   Working Devices : 3
    Failed Devices : 1
     Spare Devices : 0

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

              Name : localhost.localdomain:0  (local to host localhost.localdomain)
              UUID : cf0c34b6:3b08edfb:85dfa14f:e2bffc1e
            Events : 37

    Number   Major   Minor   RaidDevice State
       3       8       64        0      active sync   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd

       0       8       16        -      faulty   /dev/sdb

7.1.4 刪除磁碟陣列

在生產環境中,RAID磁碟陣列部署後一般不會被輕易停用。但萬一趕上了,還是要知道怎麼將磁碟陣列刪除。前面那種RAID 5+熱備盤損壞的情況是比較複雜的,所以以這種情形來進行講解是再好不過了。

首先,需要將所有的磁碟都設定成停用狀態:

[root@linuxprobe ~]# umount /RAID
[root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sdc
mdadm: set /dev/sdc faulty in /dev/md0
[root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sdd
mdadm: set /dev/sdd faulty in /dev/md0
[root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sde
mdadm: set /dev/sde faulty in /dev/md0

然後再逐一移除出去:

[root@linuxprobe ~]# mdadm /dev/md0 -r /dev/sdb
mdadm: hot removed /dev/sdb from /dev/md0
[root@linuxprobe ~]# mdadm /dev/md0 -r /dev/sdc
mdadm: hot removed /dev/sdc from /dev/md0
[root@linuxprobe ~]# mdadm /dev/md0 -r /dev/sdd
mdadm: hot removed /dev/sdd from /dev/md0
[root@linuxprobe ~]# mdadm /dev/md0 -r /dev/sde
mdadm: hot removed /dev/sde from /dev/md0

如果著急,也可以用“mdadm /dev/md0 -f /dev/sdb -r /dev/sdb”這一條命令搞定。但是,在早期版本的伺服器中,這條命令中的-f和-r不能一起使用,因此保守起見,還是一步步地操作吧。

將所有的硬碟都移除後,再來檢視磁碟陣列組的狀態:

[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Fri Jan 15 08:53:41 2021
        Raid Level : raid5
        Array Size : 41908224 (39.97 GiB 42.91 GB)
     Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
      Raid Devices : 3
     Total Devices : 0
       Persistence : Superblock is persistent

       Update Time : Fri Jan 15 09:00:57 2021
             State : clean, FAILED 
    Active Devices : 0
    Failed Devices : 0
     Spare Devices : 0

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

    Number   Major   Minor   RaidDevice State
       -       0        0        0      removed
       -       0        0        1      removed
       -       0        0        2      removed

很棒!下面繼續停用整個RAID磁碟陣列,咱們的工作就徹底完成了:

[root@linuxprobe ~]# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
[root@linuxprobe ~]# ls /dev/md0
ls: cannot access '/dev/md0': No such file or directory

在有一些老版本的伺服器中,在使用--stop引數後依然會保留裝置檔案。這很明顯是沒有處理乾淨,這時再執行一下“mdadm --remove /dev/md0”命令即可。同學們可以記一下,以備不時之需。

7.2 LVM邏輯卷管理器

前面學習的硬碟裝置管理技術雖然能夠有效地提高硬碟裝置的讀寫速度以及資料的安全性,但是在硬碟分好區或者部署為RAID磁碟陣列之後,再想修改硬碟分割槽大小就不容易了。換句話說,當用戶想要隨著實際需求的變化調整硬碟分割槽的大小時,會受到硬碟“靈活性”的限制。這時就需要用到另外一項非常普及的硬碟裝置資源管理技術了—邏輯卷管理器(Logical Volume Manager,LVM)。LVM允許使用者對硬碟資源進行動態調整。

LVM是Linux系統用於對硬碟分割槽進行管理的一種機制,理論性較強,其建立初衷是為了解決硬碟裝置在建立分割槽後不易修改分割槽大小的缺陷。儘管對傳統的硬碟分割槽進行強制擴容或縮容從理論上來講是可行的,但是卻可能造成資料的丟失。而LVM技術是在硬碟分割槽和檔案系統之間添加了一個邏輯層,它提供了一個抽象的卷組,可以把多塊硬碟進行卷組合並。這樣一來,使用者不必關心物理硬碟裝置的底層架構和佈局,就可以實現對硬碟分割槽的動態調整。LVM的技術架構如圖7-8所示。

為了幫助大家理解,我們來看一個吃貨的例子。比如小明家裡想吃饅頭,但是麵粉不夠了,於是媽媽從隔壁老王家、老李家、老張家分別借來一些麵粉,準備蒸饅頭吃。首先需要把這些麵粉(物理卷[Physical Volume,PV])揉成一個大面團(卷組[Volume Group],VG),然後再把這個大面團分割成一個個小饅頭(邏輯卷[Logical Volume,LV]),而且每個小饅頭的重量必須是每勺麵粉(基本單元[Physical Extent,PE])的倍數。

在日常的使用中,如果卷組(VG)的剩餘容量不足,可以隨時將新的物理卷(PV)加入到裡面,進行不斷地擴容。由於擔心同學們還是不理解,這裡準備了一張邏輯卷管理器的使用流程示意圖,如圖7-9所示。

圖7-8 邏輯卷管理器的技術結構

圖7-9 邏輯卷管理器使用流程圖

物理卷處於LVM中的最底層,可以將其理解為物理硬碟、硬碟分割槽或者RAID磁碟陣列。卷組建立在物理卷之上,一個卷組能夠包含多個物理卷,而且在卷組建立之後也可以繼續向其中新增新的物理卷。邏輯卷是用卷組中空閒的資源建立的,並且邏輯卷在建立後可以動態地擴充套件或縮小空間。這就是LVM的核心理念。

7.2.1 部署邏輯卷

一般而言,在生產環境中無法在最初時就精確地評估每個硬碟分割槽在日後的使用情況,因此會導致原先分配的硬碟分割槽不夠用。比如,伴隨著業務量的增加,用於存放交易記錄的資料庫目錄的體積也隨之增加;因為分析並記錄使用者的行為從而導致日誌目錄的體積不斷變大,這些都會導致原有的硬碟分割槽在使用上捉襟見肘。而且,還存在對較大的硬碟分割槽進行精簡縮容的情況。

我們可以通過部署LVM來解決上述問題。部署時,需要逐個配置物理卷、卷組和邏輯卷,常用的部署命令如表7-3所示。

常用的LVM部署命令

功能/命令 物理卷管理 卷組管理 邏輯卷管理
掃描 pvscan vgscan lvscan
建立 pvcreate vgcreate lvcreate
顯示 pvdisplay vgdisplay lvdisplay
刪除 pvremove vgremove lvremove
擴充套件 vgextend lvextend
縮小 vgreduce lvreduce

在虛擬機器中新增兩塊新硬碟裝置的目的,是為了更好地演示LVM理念中使用者無須關心底層物理硬碟裝置的特性。我們先對這兩塊新硬碟進行建立物理卷的操作,可以將該操作簡單理解成讓硬碟裝置支援LVM技術,或者理解成是把硬碟裝置加入到LVM技術可用的硬體資源池中,然後對這兩塊硬碟進行卷組合並,卷組的名稱允許由使用者自定義。接下來,根據需求把合併後的卷組切割出一個約為150MB的邏輯卷裝置,最後把這個邏輯卷裝置格式化成Ext4檔案系統後掛載使用。下文將對每一個步驟做一些簡單的描述。

第1步:讓新新增的兩塊硬碟裝置支援LVM技術。

[root@linuxprobe ~]# pvcreate /dev/sdb /dev/sdc
  Physical volume "/dev/sdb" successfully created.
  Physical volume "/dev/sdc" successfully created.

第2步:把兩塊硬碟裝置加入到storage卷組中,然後檢視卷組的狀態。

[root@linuxprobe ~]# vgcreate storage /dev/sdb /dev/sdc
 Volume group "storage" successfully created
[root@linuxprobe ~]# vgdisplay
  --- Volume group ---
  VG Name               storage
  System ID             
  Format                lvm2
  Metadata Areas        2
  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                2
  Act PV                2
  VG Size               39.99 GiB
  PE Size               4.00 MiB
  Total PE              10238
  Alloc PE / Size       0 / 0   
  Free  PE / Size       10238 / 39.99 GiB
  VG UUID               HPwsm4-lOvI-8O0Q-TG54-BkyI-ONYE-owlGLd
………………省略部分輸出資訊………………

第3步:再切割出一個約為150MB的邏輯卷裝置。

這裡需要注意切割單位的問題。在對邏輯捲進行切割時有兩種計量單位。第一種是以容量為單位,所使用的引數為-L。例如,使用-L 150M生成一個大小為150MB的邏輯卷。另外一種是以基本單元的個數為單位,所使用的引數為-l。每個基本單元的大小預設為4MB。例如,使用-l 37可以生成一個大小為37×4MB=148MB的邏輯卷。

[root@linuxprobe ~]# lvcreate -n vo -l 37 storage
 Logical volume "vo" created.
[root@linuxprobe ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo
  LV Name                vo
  VG Name                storage
  LV UUID                AsDGJj-G6Uo-HG4q-auD6-lmyn-aLY0-o36HEj
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2021-01-15 00:47:35 +0800
  LV Status              available
  # open                 0
  LV Size                148.00 MiB
  Current LE             37
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
………………省略部分輸出資訊………………

第4步:把生成好的邏輯捲進行格式化,然後掛載使用。

Linux系統會把LVM中的邏輯卷裝置存放在/dev裝置目錄中(實際上就是個快捷方式),同時會以卷組的名稱來建立一個目錄,其中儲存了邏輯卷的裝置對映檔案(即/dev/卷組名稱/邏輯卷名稱)。

[root@linuxprobe ~]# mkfs.ext4 /dev/storage/vo 
mke2fs 1.44.3 (10-July-2018)
Creating filesystem with 151552 1k blocks and 38000 inodes
Filesystem UUID: 429cbc28-4463-4a1b-b601-02a7cf81a1b2
Superblock backups stored on blocks: 
	8193, 24577, 40961, 57345, 73729

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done 
[root@linuxprobe ~]# mkdir /linuxprobe
[root@linuxprobe ~]# mount /dev/storage/vo /linuxprobe

對了,如果使用了邏輯卷管理器,則不建議用XFS檔案系統,因為XFS檔案系統自身就可以使用xfs_growfs命令進行磁碟擴容。這雖然不比LVM靈活,但起碼也夠用。在實測階段我們發現,在有一些伺服器上,XFS與LVM的相容性並不好。

第5步:檢視掛載狀態,並寫入配置檔案,使其永久生效。

[root@linuxprobe ~]# df -h
Filesystem              Size  Used Avail Use% Mounted on
devtmpfs                969M     0  969M   0% /dev
tmpfs                   984M     0  984M   0% /dev/shm
tmpfs                   984M  9.6M  974M   1% /run
tmpfs                   984M     0  984M   0% /sys/fs/cgroup
/dev/mapper/rhel-root    17G  3.9G   14G  23% /
/dev/sr0                6.7G  6.7G     0 100% /media/cdrom
/dev/sda1              1014M  152M  863M  15% /boot
tmpfs                   197M   16K  197M   1% /run/user/42
tmpfs                   197M  3.4M  194M   2% /run/user/0
/dev/mapper/storage-vo  140M  1.6M  128M   2% /linuxprobe
[root@linuxprobe ~]# echo "/dev/storage/vo /linuxprobe ext4 defaults 0 0" >> /etc/fstab
[root@linuxprobe ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Jul 21 05:03:40 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root                       /                       xfs      defaults        0 0
UUID=2db66eb4-d9c1-4522-8fab-ac074cd3ea0b   /boot                   xfs      defaults        0 0
/dev/mapper/rhel-swap                       swap                    swap     defaults        0 0
/dev/cdrom                                  /media/cdrom            iso9660  defaults        0 0 
/dev/storage/vo                             /linuxprobe             ext4     defaults        0 0

7.2.2 擴容邏輯卷

在前面的實驗中,卷組是由兩塊硬碟裝置共同組成的。使用者在使用儲存裝置時感知不到裝置底層的架構和佈局,更不用關心底層是由多少塊硬碟組成的,只要卷組中有足夠的資源,就可以一直為邏輯卷擴容。擴容前請一定要記得解除安裝裝置和掛載點的關聯。

[root@linuxprobe ~]# umount /linuxprobe

第1步:把上一個實驗中的邏輯卷vo擴充套件至290MB。

[root@linuxprobe ~]# lvextend -L 290M /dev/storage/vo
Rounding size to boundary between physical extents: 292.00 MiB.
Size of logical volume storage/vo changed from 148 MiB (37 extents) to 292 MiB (73 extents).
Logical volume storage/vo successfully resized.

第2步:檢查硬碟的完整性,確認目錄結構、內容和檔案內容沒有丟失。一般情況下沒有報錯,均為正常情況。

[root@linuxprobe ~]# e2fsck -f /dev/storage/vo
e2fsck 1.44.3 (10-July-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/storage/vo: 11/38000 files (0.0% non-contiguous), 10453/151552 blocks

第3步:重置裝置在系統中的容量。剛剛是對LV(邏輯卷)裝置進行了擴容操作,但系統核心還沒有同步到這部分新修改的資訊,需要手動進行同步。

[root@linuxprobe ~]# resize2fs /dev/storage/vo
resize2fs 1.44.3 (10-July-2018)
Resizing the filesystem on /dev/storage/vo to 299008 (1k) blocks.
The filesystem on /dev/storage/vo is now 299008 (1k) blocks long.

第4步:重新掛載硬碟裝置並檢視掛載狀態。

[root@linuxprobe ~]# mount -a
[root@linuxprobe ~]# df -h
Filesystem              Size  Used Avail Use% Mounted on
devtmpfs                969M     0  969M   0% /dev
tmpfs                   984M     0  984M   0% /dev/shm
tmpfs                   984M  9.6M  974M   1% /run
tmpfs                   984M     0  984M   0% /sys/fs/cgroup
/dev/mapper/rhel-root    17G  3.9G   14G  23% /
/dev/sr0                6.7G  6.7G     0 100% /media/cdrom
/dev/sda1              1014M  152M  863M  15% /boot
tmpfs                   197M   16K  197M   1% /run/user/42
tmpfs                   197M  3.4M  194M   2% /run/user/0
/dev/mapper/storage-vo  279M  2.1M  259M   1% /linuxprobe

7.2.3 縮小邏輯卷

相較於擴容邏輯卷,在對邏輯捲進行縮容操作時,資料丟失的風險更大。所以在生產環境中執行相應操作時,一定要提前備份好資料。另外,Linux系統規定,在對LVM邏輯捲進行縮容操作之前,要先檢查檔案系統的完整性(當然這也是為了保證資料的安全)。在執行縮容操作前記得先把檔案系統解除安裝掉。

[root@linuxprobe ~]# umount /linuxprobe

第1步:檢查檔案系統的完整性。

[root@linuxprobe ~]# e2fsck -f /dev/storage/vo
e2fsck 1.44.3 (10-July-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/storage/vo: 11/74000 files (0.0% non-contiguous), 15507/299008 blocks

第2步:通知系統核心將邏輯卷vo的容量減小到120MB。

[root@linuxprobe ~]# resize2fs /dev/storage/vo 120M
resize2fs 1.44.3 (10-July-2018)
Resizing the filesystem on /dev/storage/vo to 122880 (1k) blocks.
The filesystem on /dev/storage/vo is now 122880 (1k) blocks long.

第3步:將LV邏輯卷的容量修改為120M。

[root@linuxprobe ~]# lvreduce -L 120M /dev/storage/vo
  WARNING: Reducing active logical volume to 120.00 MiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce storage/vo? [y/n]: y
  Size of logical volume storage/vo changed from 292 MiB (73 extents) to 120 MiB (30 extents).
  Logical volume storage/vo successfully resized.

咦?縮容的步驟跟擴容的步驟不一樣啊。縮容操作為什麼是先通知系統核心裝置的容量要改變成120MB,然後再正式進行縮容操作呢?舉個例子大家就明白了。小強是一名初中生,開學後看到班裡有位同學紋了身,他感覺很酷,自己也想紋但又怕家裡責罵,於是他回家後就說:“媽媽,我紋身了。”如果媽媽的反應很平和,那麼他就可以放心大膽地去紋身了。如果媽媽強烈不同意,他馬上就可以哈哈一笑,說:“逗著玩呢。”這樣也就不會捱打了。

縮容操作也是同樣的道理,先通知系統核心自己想縮小邏輯卷,如果在執行resize2fs命令後系統沒有報錯,再正式操作。

第4步:重新掛載檔案系統並檢視系統狀態。

[root@linuxprobe ~]# mount -a
[root@linuxprobe ~]# df -h
Filesystem              Size  Used Avail Use% Mounted on
devtmpfs                969M     0  969M   0% /dev
tmpfs                   984M     0  984M   0% /dev/shm
tmpfs                   984M  9.6M  974M   1% /run
tmpfs                   984M     0  984M   0% /sys/fs/cgroup
/dev/mapper/rhel-root    17G  3.9G   14G  23% /
/dev/sr0                6.7G  6.7G     0 100% /media/cdrom
/dev/sda1              1014M  152M  863M  15% /boot
tmpfs                   197M   16K  197M   1% /run/user/42
tmpfs                   197M  3.4M  194M   2% /run/user/0
/dev/mapper/storage-vo  113M  1.6M  103M   2% /linuxprobe

7.2.4 邏輯卷快照

LVM還具備有“快照卷”功能,該功能類似於虛擬機器軟體的還原時間點功能。例如,對某一個邏輯卷裝置做一次快照,如果日後發現數據被改錯了,就可以利用之前做好的快照捲進行覆蓋還原。LVM的快照卷功能有兩個特點:

快照卷的容量必須等同於邏輯卷的容量;

快照卷僅一次有效,一旦執行還原操作後則會被立即自動刪除。

在正式操作前,先看看VG(卷組)中的容量是否夠用:

[root@linuxprobe ~]# vgdisplay
  --- Volume group ---
  VG Name               storage
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               39.99 GiB
  PE Size               4.00 MiB
  Total PE              10238
  Alloc PE / Size       30 / 120.00 MiB
  Free  PE / Size       10208 / <39.88 GiB
  VG UUID               k3ZnaP-wGPr-TQJ5-PCtA-0RgO-jvsi-9elZ5M
………………省略部分輸出資訊………………

通過卷組的輸出資訊可以清晰看到,卷組中已經使用了120MB的容量,空閒容量還有39.88GB。接下來用重定向往邏輯卷裝置所掛載的目錄中寫入一個檔案。

[root@linuxprobe ~]# echo "Welcome to Linuxprobe.com" > /linuxprobe/readme.txt
[root@linuxprobe ~]# ls -l /linuxprobe
total 14
drwx------. 2 root root 12288 Jan 15 01:11 lost+found
-rw-r--r--. 1 root root    26 Jan 15 07:01 readme.txt

第1步:使使用-s引數生成一個快照卷,使用-L引數指定切割的大小,需要與要做快照的裝置容量保持一致。另外,還需要在命令後面寫上是針對哪個邏輯卷執行的快照操作,稍後資料也會還原到這個相應的裝置上。

[root@linuxprobe ~]# lvcreate -L 120M -s -n SNAP /dev/storage/vo
 Logical volume "SNAP" created
[root@linuxprobe ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/storage/SNAP
  LV Name                SNAP
  VG Name                storage
  LV UUID                qd7l6w-3Iv1-6E3X-RGkC-t5xl-170r-rDZSEf
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2021-01-15 07:02:44 +0800
  LV snapshot status     active destination for vo
  LV Status              available
  # open                 0
  LV Size                120.00 MiB
  Current LE             30
  COW-table size         120.00 MiB
  COW-table LE           30
  Allocated to snapshot  0.01%
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:5
………………省略部分輸出資訊………………

第2步:在邏輯卷所掛載的目錄中建立一個100MB的垃圾檔案,然後再檢視快照卷的狀態。可以發現儲存空間的佔用量上升了。

[root@linuxprobe ~]# dd if=/dev/zero of=/linuxprobe/files count=1 bs=100M
1+0 records in
1+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.312057 s, 336 MB/s
[root@linuxprobe ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/storage/SNAP
  LV Name                SNAP
  VG Name                storage
  LV UUID                qd7l6w-3Iv1-6E3X-RGkC-t5xl-170r-rDZSEf
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2021-01-15 07:02:44 +0800
  LV snapshot status     active destination for vo
  LV Status              available
  # open                 0
  LV Size                120.00 MiB
  Current LE             30
  COW-table size         120.00 MiB
  COW-table LE           30
  Allocated to snapshot  83.71%
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:5
………………省略部分輸出資訊………………

第3步:為了校驗快照卷的效果,需要對邏輯捲進行快照還原操作。在此之前記得先解除安裝掉邏輯卷裝置與目錄的掛載。

lvconvert命令

用於管理邏輯卷的快照,語法格式為“lvconvert [引數]快照卷名稱”。

使用lvconvert命令能自動回覆邏輯卷的快照,在早期的RHEL/CentOS 5版本中要寫全格式:“--mergesnapshot”,而從RHEL 6到RHEL 8,已經允許使用者只輸入--merge引數進行操作了,系統會自動分辨裝置的型別。

[root@linuxprobe ~]# umount /linuxprobe
[root@linuxprobe ~]# lvconvert --merge /dev/storage/SNAP
  Merging of volume storage/SNAP started.
  storage/vo: Merged: 36.41%
  storage/vo: Merged: 100.00%

第4步:快照卷會被自動刪除掉,並且剛剛在邏輯卷裝置被執行快照操作後再創建出來的100MB的垃圾檔案也被清除了。

[root@linuxprobe ~]# mount -a
[root@linuxprobe ~]# cd /linuxprobe/
[root@linuxprobe linuxprobe]# ls
lost+found readme.txt
[root@linuxprobe linuxprobe]# cat readme.txt 
Welcome to Linuxprobe.com

7.2.5 刪除邏輯卷

當生產環境中想要重新部署LVM或者不再需要使用LVM時,則需要執行LVM的刪除操作。為此,需要提前備份好重要的資料資訊,然後依次刪除邏輯卷、卷組、物理卷裝置,這個順序不可顛倒。

第1步:取消邏輯卷與目錄的掛載關聯,刪除配置檔案中永久生效的裝置引數。

[root@linuxprobe ~]# umount /linuxprobe
[root@linuxprobe ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Jul 21 05:03:40 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root                       /                       xfs      defaults        0 0
UUID=2db66eb4-d9c1-4522-8fab-ac074cd3ea0b   /boot                   xfs      defaults        0 0
/dev/mapper/rhel-swap                       swap                    swap     defaults        0 0
/dev/cdrom                                  /media/cdrom            iso9660  defaults        0 0 
/dev/storage/vo                             /linuxprobe             ext4     defaults        0 0

第2步:刪除邏輯卷裝置,需要輸入y來確認操作。

[root@linuxprobe ~]# lvremove /dev/storage/vo 
Do you really want to remove active logical volume storage/vo? [y/n]: y
  Logical volume "vo" successfully removed

第3步:刪除卷組,此處只寫卷組名稱即可,不需要裝置的絕對路徑。

[root@linuxprobe ~]# vgremove storage
  Volume group "storage" successfully removed

第4步:刪除物理卷裝置。

[root@linuxprobe ~]# pvremove /dev/sdb /dev/sdc
  Labels on physical volume "/dev/sdb" successfully wiped.
  Labels on physical volume "/dev/sdc" successfully wiped.