Linux應該這麼學第7章使用 RAID 與 LVM 磁碟陣列技術

tjjingpan發表於2018-11-02

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

7.1 RAID(獨立冗餘磁碟陣列)

近年來, CPU 的處理效能保持著高速增長,Intel 公司在 2017 年最新發布的 i9-7980XE
處理器晶片更是達到了 18 核心 36 執行緒。但與此同時,硬碟裝置的效能提升卻不是很大,因
此逐漸成為當代計算機整體效能的瓶頸。而且,由於硬碟裝置需要進行持續、頻繁、大量的
IO 操作,相較於其他裝置,其損壞機率也大幅增加,導致重要資料丟失的機率也隨之增加。
1988 年,加利福尼亞大學伯克利分校首次提出並定義了 RAID 技術的概念。RAID 技術
通過把多個硬碟裝置組合成一個容量更大、安全性更好的磁碟陣列,並把資料切割成多個區
段後分別存放在各個不同的物理硬碟裝置上,然後利用分散讀寫技術來提升磁碟陣列整體的
效能,同時把多個重要資料的副本同步到不同的物理硬碟裝置上,從而起到了非常好的資料
冗餘備份效果。
任何事物都有它的兩面性。RAID 技術確實具有非常好的資料冗餘備份功能,但是它也相
應地提高了成本支出。就像原本我們只有一個電話本,但是為了避免遺失,我們將聯絡人號
碼資訊寫成了兩份,自然要為此多買一個電話本,這也就相應地提升了成本支出。RAID 技術
的設計初衷是減少因為採購硬碟裝置帶來的費用支出,但是與資料本身的價值相比較,現代
企業更看重的則是 RAID 技術所具備的冗餘備份機制以及帶來的硬碟吞吐量的提升。也就是
說,RAID 不僅降低了硬碟裝置損壞後丟失資料的機率,還提升了硬碟裝置的讀寫速度,所以
它在絕大多數運營商或大中型企業中得以廣泛部署和應用。
出於成本和技術方面的考慮,需要針對不同的需求在資料可靠性及讀寫效能上作出權衡,
制定出滿足各自需求的不同方案。目前已有的 RAID 磁碟陣列的方案至少有十幾種,而劉遄

老師接下來會詳細講解 RAID 0、RAID 1、RAID 5 與 RAID 10 這 4 種最常見的方案。

7.1.1 RAID 0

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



7.1.2 RAID 1儘管 RAID 0 技術提升了硬碟裝置的讀寫速度,但是它是將資料依次寫入到各個物理硬
盤中,也就是說,它的資料是分開存放的,其中任何一塊硬碟發生故障都會損壞整個系統的
資料。因此,如果生產環境對硬碟裝置的讀寫速度沒有要求,而是希望增加資料的安全性時,
就需要用到 RAID 1 技術了。
在圖 7-2 所示的 RAID 1 技術示意圖中可以看到,它是把兩塊以上的硬碟裝置進行綁
定,在寫入資料時,是將資料同時寫入到多塊硬碟裝置上(可以將其視為資料的映象或備
份)。當其中某一塊硬碟發生故障後,一般會立即自動以熱交換的方式來恢復資料的正常
使用。

 RAID 1 技術雖然十分注重資料的安全性,但是因為是在多塊硬碟裝置中寫入了相同的數
據,因此硬碟裝置的利用率得以下降,從理論上來說,圖 7-2 所示的硬碟空間的真實可用率只
有 50%,由三塊硬碟裝置組成的 RAID 1 磁碟陣列的可用率只有 33%左右,以此類推。而且,
由於需要把資料同時寫入到兩塊以上的硬碟裝置,這無疑也在一定程度上增大了系統計算功
能的負載。
那麼,有沒有一種 RAID 方案既考慮到了硬碟裝置的讀寫速度和資料安全性,還兼顧了
成本問題呢?實際上,單從資料安全和成本問題上來講,就不可能在保持原有硬碟裝置的利
用率且還不增加新裝置的情況下,能大幅提升資料的安全性。劉遄老師也沒有必要忽悠各位
讀者,下面將要講解的 RAID 5 技術雖然在理論上兼顧了三者(讀寫速度、資料安全性、成
本),但實際上更像是對這三者的“相互妥協”。

7.1.3 RAID 5

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

7.1.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.1.5 部署磁碟陣列

在具備了上一章的硬碟裝置管理基礎之後,再來部署 RAID 和 LVM 就變得十分輕鬆了。首
先,需要在虛擬機器中新增 4 塊硬碟裝置來製作一個 RAID 10 磁碟陣列,如圖 7-5 所示。

這幾塊硬碟裝置是模擬出來的,不需要特意去買幾塊真實的物理硬碟插到電腦上。需要
注意的是,一定要記得在關閉系統之後,再在虛擬機器中新增硬碟裝置,否則可能會因為計算
機架構的不同而導致虛擬機器系統無法識別新增的硬碟裝置。
mdadm 命令用於管理 Linux 系統中的軟體 RAID 硬碟陣列,格式為“mdadm [模式] <RAID
裝置名稱> [選項] [成員裝置名稱]”。
當前,生產環境中用到的伺服器一般都配備 RAID 陣列卡,儘管伺服器的價格越來越便
宜,但是我們沒有必要為了做一個實驗而去單獨購買一臺伺服器,而是可以學會用 mdadm 命
令在 Linux 系統中建立和管理軟體 RAID 磁碟陣列,而且它涉及的理論知識的操作過程與生
產環境中的完全一致。mdadm 命令的常用引數以及作用如表 7-1 所示。

接下來,使用 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
磁碟陣列的名稱;-a yes 引數代表自動建立裝置檔案;-n 4 引數代表使用 4 塊硬碟來部署這個
RAID 磁碟陣列;而-l 10 引數則代表 RAID 10 方案;最後再加上 4 塊硬碟裝置的名稱就搞定
了。

[root@localhost ~]# mdadm -Cv /dev/md0 -a yes -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 20955136K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

其次,把製作好的 RAID 磁碟陣列格式化為 ext4 格式。

[root@localhost ~]# mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
檔案系統標籤=
OS type: Linux
塊大小=4096 (log=2)
分塊大小=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
2621440 inodes, 10477568 blocks
523878 blocks (5.00%) reserved for the super user
第一個資料塊=0
Maximum filesystem blocks=2157969408
320 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624

Allocating group tables: 完成                            
正在寫入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成   

再次,建立掛載點然後把硬碟裝置進行掛載操作。掛載成功後可看到可用空間為
40GB。

[root@localhost ~]# mkdir /RAID
[root@localhost ~]# mount /dev/md0 /RAID/
[root@localhost ~]# df -h
檔案系統             容量  已用  可用 已用% 掛載點
/dev/mapper/cl-root   50G  6.2G   44G   13% /
devtmpfs             897M     0  897M    0% /dev
tmpfs                912M   84K  912M    1% /dev/shm
tmpfs                912M  9.0M  903M    1% /run
tmpfs                912M     0  912M    0% /sys/fs/cgroup
/dev/sda1           1014M  174M  841M   18% /boot
/dev/mapper/cl-home   47G   37M   47G    1% /home
tmpfs                183M   12K  183M    1% /run/user/42
tmpfs                183M     0  183M    0% /run/user/0
/dev/md0              40G   49M   38G    1% /RAID

最後,檢視/dev/md0 磁碟陣列的詳細資訊,並把掛載資訊寫入到配置檔案中,使其永久
生效。

[root@localhost ~]# mdadm -D /dev/md0 
/dev/md0:
        Version : 1.2
  Creation Time : Fri Nov  2 16:51:12 2018
     Raid Level : raid10
     Array Size : 41910272 (39.97 GiB 42.92 GB)
  Used Dev Size : 20955136 (19.98 GiB 21.46 GB)
   Raid Devices : 4
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Fri Nov  2 16:55:16 2018
          State : clean 
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0

         Layout : near=2
     Chunk Size : 512K

           Name : localhost:0  (local to host localhost)
           UUID : 736b6527:5ef5d6f1:fe7b274b:46d306b9
         Events : 19

    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

7.1.6 損壞磁碟陣列及修復

之所以在生產環境中部署 RAID 10 磁碟陣列,是為了提高硬碟儲存裝置的讀寫速度及數
據的安全性,但由於我們的硬碟裝置是在虛擬機器中模擬出來的,因此對讀寫速度的改善可能
並不直觀,因此劉遄老師決定給各位讀者講解一下 RAID 磁碟陣列損壞後的處理方法,這樣
大家在步入運維崗位後遇到類似問題時,也可以輕鬆解決。
在確認有一塊物理硬碟裝置出現損壞而不能繼續正常使用後,應該使用 mdadm 命令將其
移除,然後檢視 RAID 磁碟陣列的狀態,可以發現狀態已經改變。

[root@localhost ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@localhost ~]# mdadm -D /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Fri Nov  2 16:51:12 2018
     Raid Level : raid10
     Array Size : 41910272 (39.97 GiB 42.92 GB)
  Used Dev Size : 20955136 (19.98 GiB 21.46 GB)
   Raid Devices : 4
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Fri Nov  2 16:57:36 2018
          State : clean, degraded 
 Active Devices : 3
Working Devices : 3
 Failed Devices : 1
  Spare Devices : 0

         Layout : near=2
     Chunk Size : 512K

           Name : localhost:0  (local to host localhost)
           UUID : 736b6527:5ef5d6f1:fe7b274b:46d306b9
         Events : 21

    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

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

[root@localhost ~]# mdadm /dev/md0 -f /dev/sdb 
mdadm: set /dev/sdb faulty in /dev/md0
[root@localhost ~]# mdadm -D /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Fri Nov  2 17:09:44 2018
     Raid Level : raid10
     Array Size : 41910272 (39.97 GiB 42.92 GB)
  Used Dev Size : 20955136 (19.98 GiB 21.46 GB)
   Raid Devices : 4
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Fri Nov  2 17:10:44 2018
          State : clean, degraded 
 Active Devices : 3
Working Devices : 3
 Failed Devices : 1
  Spare Devices : 0

         Layout : near=2
     Chunk Size : 512K

           Name : localhost:0  (local to host localhost)
           UUID : 190f31d6:b078b001:f5fe07cb:d191131a
         Events : 12

    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
[root@localhost ~]# mdadm -r /dev/md0 /dev/sdb
mdadm: hot removed /dev/sdb from /dev/md0
[root@localhost ~]# mdadm -D /dev/md0         
/dev/md0:
        Version : 1.2
  Creation Time : Fri Nov  2 17:09:44 2018
     Raid Level : raid10
     Array Size : 41910272 (39.97 GiB 42.92 GB)
  Used Dev Size : 20955136 (19.98 GiB 21.46 GB)
   Raid Devices : 4
  Total Devices : 3
    Persistence : Superblock is persistent

    Update Time : Fri Nov  2 17:11:13 2018
          State : clean, degraded 
 Active Devices : 3
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 0

         Layout : near=2
     Chunk Size : 512K

           Name : localhost:0  (local to host localhost)
           UUID : 190f31d6:b078b001:f5fe07cb:d191131a
         Events : 13

    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
[root@localhost ~]# mdadm /dev/md0 -a /dev/sdb
mdadm: added /dev/sdb
[root@localhost ~]# mdadm -D /dev/md0 
/dev/md0:
        Version : 1.2
  Creation Time : Fri Nov  2 17:09:44 2018
     Raid Level : raid10
     Array Size : 41910272 (39.97 GiB 42.92 GB)
  Used Dev Size : 20955136 (19.98 GiB 21.46 GB)
   Raid Devices : 4
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Fri Nov  2 17:11:58 2018
          State : clean, degraded, recovering 
 Active Devices : 3
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 1

         Layout : near=2
     Chunk Size : 512K

 Rebuild Status : 12% complete

           Name : localhost:0  (local to host localhost)
           UUID : 190f31d6:b078b001:f5fe07cb:d191131a
         Events : 16

    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.2 LVM邏輯卷管理器

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

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

第7章 使用RAID與LVM磁碟陣列技術。第7章 使用RAID與LVM磁碟陣列技術。

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

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

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

7.2.1 部署邏輯卷

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

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

表7-2                                                   常用的LVM部署命令

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

 

為了避免多個實驗之間相互發生衝突,請大家自行將虛擬機器還原到初始狀態,並在虛擬機器中新增兩塊新硬碟裝置,然後開機,如圖7-8所示。

在虛擬機器中新增兩塊新硬碟裝置的目的,是為了更好地演示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

第7ç«  使ç¨RAIDä¸LVMç£çéµåææ¯ã第7ç«  使ç¨RAIDä¸LVMç£çéµåææ¯ã

圖7-8  在虛擬機器中新增兩塊新的硬碟裝置

第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 KUeAMF-qMLh-XjQy-ArUo-LCQI-YF0o-pScxm1
………………省略部分輸出資訊………………

 第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 D09HYI-BHBl-iXGr-X2n4-HEzo-FAQH-HRcM2I
 LV Write Access read/write
 LV Creation host, time localhost.localdomain, 2017-02-01 01:22:54 -0500
 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.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
38000 inodes, 151552 blocks
7577 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=33816576
19 block groups
8192 blocks per group, 8192 fragments per group
2000 inodes per group
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

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

[root@linuxprobe ~]# df -h
 Filesystem Size Used Avail Use% Mounted on
 /dev/mapper/rhel-root 18G 3.0G 15G 17% /
 devtmpfs 905M 0 905M 0% /dev
 tmpfs 914M 140K 914M 1% /dev/shm
 tmpfs 914M 8.8M 905M 1% /run
 tmpfs 914M 0 914M 0% /sys/fs/cgroup
 /dev/sr0 3.5G 3.5G 0 100% /media/cdrom
 /dev/sda1 497M 119M 379M 24% /boot
 /dev/mapper/storage-vo 145M 7.6M 138M 6% /linuxprobe
 [root@linuxprobe ~]# echo "/dev/storage/vo /linuxprobe ext4 defaults 0 0" >> /etc/fstab

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
 Extending logical volume vo to 292.00 MiB
 Logical volume vo successfully resized

第2步:檢查硬碟完整性,並重置硬碟容量。

[root@linuxprobe ~]# e2fsck -f /dev/storage/vo
e2fsck 1.42.9 (28-Dec-2013)
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
[root@linuxprobe ~]# resize2fs /dev/storage/vo
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 299008 (1k) blocks.
The filesystem on /dev/storage/vo is now 299008 blocks long.

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

[root@linuxprobe ~]# mount -a
[root@linuxprobe ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.0G 15G 17% /
devtmpfs 985M 0 985M 0% /dev
tmpfs 994M 80K 994M 1% /dev/shm
tmpfs 994M 8.8M 986M 1% /run
tmpfs 994M 0 994M 0% /sys/fs/cgroup
/dev/sr0 3.5G 3.5G 0 100% /media/cdrom
/dev/sda1 497M 119M 379M 24% /boot
/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.42.9 (28-Dec-2013)
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.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 122880 (1k) blocks.
The filesystem on /dev/storage/vo is now 122880 blocks long.
[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 vo? [y/n]: y
 Reducing logical volume vo to 120.00 MiB
 Logical volume vo successfully resized

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

[root@linuxprobe ~]# mount -a
[root@linuxprobe ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.0G 15G 17% /
devtmpfs 985M 0 985M 0% /dev
tmpfs 994M 80K 994M 1% /dev/shm
tmpfs 994M 8.8M 986M 1% /run
tmpfs 994M 0 994M 0% /sys/fs/cgroup
/dev/sr0 3.5G 3.5G 0 100% /media/cdrom
/dev/sda1 497M 119M 379M 24% /boot
/dev/mapper/storage-vo 113M 1.6M 103M 2% /linuxprobe

7.2.4 邏輯卷快照

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

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

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

首先檢視卷組的資訊。

[root@localhost ~]# 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               Pg9H0O-CldH-vSR4-laNM-9ntB-ZFmY-ZszE4r

通過卷組的輸出資訊可以清晰看到,卷組中已經使用了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 Feb 1 07:18 lost+found
-rw-r--r--. 1 root root 26 Feb 1 07:38 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 BC7WKg-fHoK-Pc7J-yhSd-vD7d-lUnl-TihKlt
 LV Write Access read/write
 LV Creation host, time localhost.localdomain, 2017-02-01 07:42:31 -0500
 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:3
………………省略部分輸出資訊………………

第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) copied, 3.35432 s, 31.3 MB/s
[root@linuxprobe ~]# lvdisplay
 --- Logical volume ---
 LV Path /dev/storage/SNAP
 LV Name SNAP
 VG Name storage
 LV UUID BC7WKg-fHoK-Pc7J-yhSd-vD7d-lUnl-TihKlt
 LV Write Access read/write
 LV Creation host, time localhost.localdomain, 2017-02-01 07:42:31 -0500
 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:3

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

[root@linuxprobe ~]# umount /linuxprobe
[root@linuxprobe ~]# lvconvert --merge /dev/storage/SNAP
 Merging of volume SNAP started.
 vo: Merged: 21.4%
 vo: Merged: 100.0%
 Merge of snapshot into logical volume vo has finished.
 Logical volume "SNAP" successfully removed

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

[root@linuxprobe ~]# mount -a
[root@linuxprobe ~]# ls /linuxprobe/
lost+found readme.txt

7.2.5 刪除邏輯卷

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

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

[root@linuxprobe ~]# umount /linuxprobe
[root@linuxprobe ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Feb 19 22:08:59 2017
#
# 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
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=50591e35-d47a-4aeb-a0ca-1b4e8336d9b1 /boot xfs defaults 1 2
/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 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

在上述操作執行完畢之後,再執行lvdisplay、vgdisplay、pvdisplay命令來檢視LVM的資訊時就不會再看到資訊了(前提是上述步驟的操作是正確的)。

相關文章