1. 程式人生 > >linux入門系列13--磁碟管理之RAID、LVM技術

linux入門系列13--磁碟管理之RAID、LVM技術

前一篇文章學習了磁碟分割槽、格式化、掛載等相關知識,本文將講解RAID和LVM技術。

磁碟管理操作主要是運維人員用的較多,如果只是單純的開發人員,可以先略過本文。但是在很多小公司裡往往都是一人多用,運維、開發通常都是同一個人,因此對個人的技能要求更高。即便不是如此,多瞭解下相關概念也是有利而無害的。

本文將先講解RAID技術方案相關理論知識並通過案例演示RAID操作,然後演示LVM技術以解決儲存資源動態調整問題。

一、獨立冗餘磁碟陣列(RAID)

RAID(Redundant Array of Independent Disk)技術把多個硬碟裝置組合成一個容量更大、安全性更好的磁碟陣列,並把資料切割成多個區段後分別存放在各個不同的物理硬碟裝置上,利用分散讀寫技術提升磁碟陣列整體的效能,同時把多個重要資料的副本同步到不同的物理硬碟裝置上,從而起到了非常好的資料冗餘備份效果。

簡單說就是通過RAID技術可以提升磁碟讀寫效能,同時可以冗餘備份資料保證資料可靠性。但是效能和可靠性不可能同時滿足的非常好,因此在二者之間作出權衡就產生了不同的RAID方案。

1.1 RAID方案及特點

據說目前RAID磁碟陣列的方案至少有十幾種,然而萬變不離其宗,都是在讀寫效能和可靠性之間權衡,因此只介紹幾種比較有代表性的方案。

方案 特點
RAID0 磁碟讀寫效能高,但資料可靠性低
RAID1 磁碟裝置利用率低,但資料可靠性高
RAID5 兼顧成本、讀寫效能和資料安全的折中方案
RAID10 相對於成本,更看重資料安全可靠
1.1.1 RAID0

把多塊物理硬碟裝置通過硬體或軟體的方式串聯在一起,組成一個大的卷組,並將資料依次寫入到各個物理硬碟中。

最理想情況下,磁碟讀寫效能將提高數倍,但如果其中任意一塊磁碟損壞將導致整個系統資料被破壞。也就是說雖然RAID0有效提高磁碟資料的吞吐速度,但是不具備資料備份和錯誤修復能力。

其示意圖如下:

1.1.2 RAID1

如上所述,雖然RAID0提升了磁碟讀寫速度,但是由於它將資料依次寫入各個磁碟中,把資料分開儲存,如果其中一塊磁碟發生故障將會導致整個系統資料損壞。因此如果對資料要求性要求較高,但對磁碟讀寫速度沒有要求的話,這種方案就不合適,需要用到RAID1方案。

RAID1示意圖如下:

RAID1是把多塊硬碟繫結,資料同時寫入多塊磁碟,這樣就會有多份資料副本,當其中某一塊硬碟發生故障後,立即自動以熱交換的方式來恢復資料的正常使用。

雖然通過副本的形式保證了資料的安全性,但是磁碟裝置利用率不高,從示意圖可以看出,如果是2塊磁碟則利用率只有50%,因此增加了成本開銷。

1.1.3 RAID5

前面兩種方案分別偏向於磁碟速度和資料安全,而RAID5則是在讀寫效能、資料安全和成本之間的一個相互妥協方案。

示意圖如下:

RAID5技術是把硬碟裝置的資料奇偶校驗資訊儲存到其他硬碟裝置中。這樣的好處是其中任何一裝置損壞後不至於出現致命缺陷,圖中的parity部分存放的就是資料的奇偶校驗資訊。

簡單說就是RAID5方案實際上沒有備份硬碟中的真實資料資訊(資料只有一份),而是當硬碟裝置出現問題後通過奇偶校驗資訊來嘗試重建損壞的資料。

這種方案兼顧了了硬碟裝置的讀寫速度、資料安全性與儲存成本問題。

1.1.4 RAID10

雖然RAID5看起來在成本問題、磁碟讀寫以及資料安全性有了一個相互妥協的方案,但實際上很多企業,尤其是金融企業資料本身的價值遠比磁碟價格高,因此成本並不是第一考慮要素,在這種場景下,一般是採用RAID10技術。

RAID10方案實際就是把RAID0和RAID1兩種方案進行組合而來,示意圖如下:

如圖所示,需要至少4塊硬碟來組建RAID10,先兩兩組合製作為RAID1確保資料有副本來保證安全性,然後在將組合後的兩個RAID1採用RAID0進行組合,進一步提高裝置的讀寫速度。

從理論上講,只要同一組中的硬碟不全壞掉,那麼最多可以損壞50%的硬碟裝置而不丟失資料。

由於RAID10方案繼承了RAID0的高讀寫速度和RAID1的資料安全性,在不考慮成本的情況下RAID10的效能都超過了RAID5,因此當前成 為廣泛使用的一種儲存技術。

說明:由於篇幅所限,其他的方案就不一一列出,需要說明的是應該按照實際需求去考慮成本、磁碟效能、資料安全性等因素,按需選擇最合適需求場景的方案。

1.2 mdadm命令

通過上一篇文章“linux入門系列12--磁碟管理之分割槽、格式化與掛載”的講解,已經學會了磁碟裝置管理之後,再來部署RAID就會非常簡單,因此如果還沒掌握的話,建議先返回去看上一篇文章。

在正式操作RAID之前,我們先看一下在linux中RAID磁碟陣列的管理命令mdadm。

語法格式:

​ mdadm [模式引數] RAID名稱 [選項] [成員磁碟列表]

引數選項:

引數 作用
-a 檢查裝置名稱
-n 指定裝置數量
-l level,指定 RAID 級別
-C 建立RAID
-v 顯示詳細過程
-f 模擬裝置損壞
-r remove,移除裝置
-D 檢視詳細資訊

1.3 例項1-RAID10部署

1.3.1 環境準備

我們直接在虛擬機器中模擬新增多塊磁碟來演示RAID的操作,生產環境中採用的命令和步驟都是一致的。

為了避免實驗之間的干擾,我們先克隆一臺新的Centos虛擬機器進行演示

點選“克隆”後,彈出虛擬機器嚮導

點選“下一步”

儲存預設選擇“虛擬機器中的當前狀態”,點選“下一步”

選擇“建立完整的克隆”,點選“下一步”

按需修改虛擬機器名稱已經存放的位置,點選“完成”按鈕

等待克隆完成(根據不同機器的效能,克隆時間不同)

這樣新的虛擬機器就準備好了。

1.3.2 建立RAID10

如前所述,RAID10至少需要4塊磁碟,因此我們先新增4塊磁碟。

(1)新增磁碟

選擇剛才克隆的虛擬機器,點選“編輯虛擬機器設定”

在彈出的“虛擬機器設定”視窗中,點選“新增”

在彈出的“新增硬體嚮導”中選擇“硬碟”,然後點選“下一步”

磁碟型別儲存預設“SCSI”,點選“下一步”

磁碟型別保持預設的“建立新虛擬機器磁碟”,點選“下一步”

根據需要設定磁碟大小,此處設定為1G,點選“下一步”

選擇磁碟檔案存放路徑,點選“完成”按鈕

即可看到剛才新增的一塊磁碟已經成功。

在上邊介面中點選“新增”按鈕,用相同的方法再新增3塊磁碟,總共新新增4塊磁碟。

(2)建立RAID10磁碟陣列

啟動剛才新增磁碟的虛擬機器,並用之前講解的lsblk或fdisk檢視磁碟裝置

[root@origin ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0  500M  0 part /boot
└─sda2            8:2    0 19.5G  0 part 
  ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm  /
sdb               8:16   0    1G  0 disk 
sdc               8:32   0    1G  0 disk 
sdd               8:48   0    1G  0 disk 
sde               8:64   0    1G  0 disk 
sr0              11:0    1  3.9G  0 rom  /run/media/root/CentOS 7 x86_64
[root@origin ~]# fdisk -l
Disk /dev/sde: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdd: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdc: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
...省略部分內容
[root@origin ~]# 

可以看到剛才新增的磁碟:sdb、sdc、sdd、sde,裝置名稱名稱分別為:/dev/sdb,/dev/sdc,/dev/sdd,/dev/sde

接下來用mdadm命令建立RAID10

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

C引數代表建立一個RAID陣列卡;-v引數顯示建立的過程,同時在後面追加一個裝置名稱/dev/md0,這樣/dev/md0就是建立後的RAID 磁碟陣列的名稱;-a yes 引數代表自動建立裝置檔案;-n 4引數代表使用4塊硬碟來部署這個RAID磁碟陣列;而-l 10引數則代表RAID10方案。

建立磁碟陣列成功之後,下一步就是格式化

1.3.3 格式化RAID

用mkfs命令格式化RAID磁碟陣列

[root@origin ~]# mkfs.ext4 /dev/md0 
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
131072 inodes, 523776 blocks
26188 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done 
[root@origin ~]# 
1.3.4 掛載磁碟陣列

建立目錄並掛載磁碟陣列

[root@origin ~]# mkdir /raid
[root@origin ~]# mount /dev/md0 /raid
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
[root@origin ~]# 

咦,細心的朋友可能就有疑問了,甚至開始懷疑是不是自己操作錯了,前面明明添加了4塊磁碟,每個磁碟為1G,總量應該為4G,但此處卻看到/dev/md0大小為2G?

是的,你沒看錯,根據前面講解的RAID10方案,容量會減少。此處可以看到4塊磁碟的情況下,可用容量會減少一半。

我們還需要把掛載資訊寫入到配置檔案中,使其永久生效

[root@origin ~]# echo "/dev/md0 /raid ext4 defaults 0 0">>/etc/fstab
[root@origin ~]# cat /etc/fstab 
...省略部分內容
/dev/md0 /raid ext4 defaults 0 0
[root@origin ~]# 

這樣就把磁碟陣列掛載到了raid目錄。

1.3.5 檢視磁碟陣列資訊

檢視磁碟陣列資訊

[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分內容
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
[root@origin ~]#

可以看到4塊磁碟陣列中的4塊磁碟均已正常工作。

至此,RAID10方案部署完成。由此可見,整個操作流程給新增硬碟一致,都是需要建立、格式化、掛載等步驟,非常簡單。

1.4 例項2-修復RAID10中壞掉的磁碟

此實驗模擬剛才的磁碟陣列中某塊硬碟壞掉後的替換操作,因此在前邊的環境中繼續執行以下操作。

1.4.1 模擬裝置損壞

使用mdadm命令的-f引數模擬裝置損壞

[root@origin ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分內容
    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
       0       8       16        -      faulty   /dev/sdb
[root@origin ~]#

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

在RAID10級別的磁碟陣列中,當RAID1磁碟陣列中存在一個故障盤時並不影響RAID10 磁碟陣列的使用。當購買了新的硬碟裝置後再使用 mdadm 命令來予以替換即可,在此期間我們可以在/RAID目錄中正常地建立或刪除檔案。

由於我們是在虛擬機器中模擬的,為了更真實,先重啟系統,之後再繼續後邊的操作。

重啟之後發現損壞的盤已經不再磁碟陣列中了

[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分內容
    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
[root@origin ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE   MOUNTPOINT
sda               8:0    0   20G  0 disk   
├─sda1            8:1    0  500M  0 part   /boot
└─sda2            8:2    0 19.5G  0 part   
  ├─centos-swap 253:0    0    2G  0 lvm    [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm    /
sdb               8:16   0    1G  0 disk   
sdc               8:32   0    1G  0 disk   
└─md0             9:0    0    2G  0 raid10 /raid
sdd               8:48   0    1G  0 disk   
└─md0             9:0    0    2G  0 raid10 /raid
sde               8:64   0    1G  0 disk   
└─md0             9:0    0    2G  0 raid10 /raid
sr0              11:0    1  3.9G  0 rom  
1.4.2 取消磁碟陣列目錄掛載
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
/dev/sda1                497M  134M  363M  27% /boot
[root@origin ~]# umount /raid/
[root@origin ~]# df -h        
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  134M  363M  27% /boot
[root@origin ~]# 

新增磁碟,需要先取消掛載

1.4.3 新增磁碟並加入磁碟陣列

取消掛載之後,我們再用mdadm命令的-a引數新增磁碟

[root@origin ~]# mdadm /dev/md0 -a /dev/sdb
mdadm: added /dev/sdb
[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分內容
    Number   Major   Minor   RaidDevice State
       4       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
[root@origin ~]# 

可以看到/dev/sdb裝置加入磁碟陣列成功

1.4.4 重新掛載磁碟陣列
[root@origin ~]# mount -a
[root@origin ~]# df -h   
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/md0                 2.0G  6.0M  1.9G   1% /raid

可以看到磁碟陣列/dev/md0又成功掛載到/raid目錄了。

由於之前/etc/fstab檔案以及添加了記錄,因此此處就無須再添加了。

至此就模擬出裝置壞掉之後,重新用新磁碟修復的過程。

1.5 例項3-RAID5+備份盤方案

按上邊的RAID10部署方案,最多允許 50%的硬碟裝置發生故障。同一組中的磁碟只要不全壞都可以正常工作,但是在極端情況下如果同一個RAID1中的磁碟裝置全部損壞,也會導致資料丟失。這種情況我們採用採用多加一塊備份盤來解決,這塊硬碟平時處於閒置狀態,一旦RAID磁碟陣列中有硬碟出現故障後則會馬上自動頂替上去。

同樣為了避免干擾,重新克隆一個虛擬機器,並採用RAID5方案來進行演示。

採用RAID5並沒有什麼特別之處,目的只是為了演示下RAID5的用法,因為前面示例1和2都是用的RAID10。

由於RAID5至少需要3塊磁碟,另外此方案還需要一塊備份盤,因此在虛擬機器中克隆新機器後,新增4塊硬碟。

1.5.1 建立RAID5

採用mdadm命令建立RAID5

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

引數-n 3代表建立這個RAID5磁碟陣列所需的硬碟數,引數-l 5代表RAID的級別,而引數-x 1則代表有一塊備份盤。

[root@origin ~]# mdadm -D /dev/md0 
/dev/md0:
...省略部分內容
    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

檢視/dev/md0磁碟陣列看到有一塊備份盤在等待中了(spare)。

1.5.2 格式RAID5磁碟陣列

用mkfs命令將磁碟陣列格式化為ext4檔案格式

[root@origin ~]# mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
131072 inodes, 523776 blocks
26188 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done 
[root@origin ~]# 
1.5.3 掛載磁碟陣列到目錄
[root@origin ~]# echo "/dev/md0 /raid ext4 defaults 0 0" >> /etc/fstab
[root@origin ~]# mkdir /raid
[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
...省略部分內容
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
[root@origin ~]# 
1.5.4 模擬磁碟損壞

我們再次模擬把硬碟裝置/dev/sdb 移出磁碟陣列

[root@origin ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@origin ~]# mdadm -D /dev/md0 
/dev/md0:
...省略部分內容
    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
[root@origin ~]# 

迅速檢視/dev/md0 磁碟陣列的狀態,發現備份盤/dev/sde已經被自動頂替上去並開始了資料同步。

1.5.5 恢復損壞的磁碟

真實場景下,我們要保證隨時有一塊空閒的備份盤以防不測,因此需要替換或修復剛才壞掉的盤/dev/sdb,恢復後它又自動變為空閒的備份盤,一旦有裝置壞掉又會自動頂上去,從而保證資料的安全性。

由於我們上邊一個步驟是模擬的/dev/sdb裝置壞點,雖然壞了但是還是在佔用中,因此重啟虛擬機器(重啟後發現/dev/sdb就沒有了,不重啟會提示/dev/sdd裝置繁忙無法成功執行以下步驟),然後執行以下操作:

[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分內容
    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
[root@origin ~]# umount /raid/
[root@origin ~]# mdadm /dev/md0 -a /dev/sdb
mdadm: added /dev/sdb
[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  134M  363M  27% /boot
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分內容
    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

       5       8       16        -      spare   /dev/sdb
[root@origin ~]# 

可以看到,新增後/dev/sdb裝置又自動變為備份盤了。這樣就保證了資料的安全。

二、邏輯卷管理器(LVM)

前面講解的用RAID磁碟陣列技術來管理磁碟裝置,雖然能有效提供磁碟裝置的讀寫效能以及資料的安全性,但是硬碟裝置分割槽或部署RAID磁碟陣列後,硬碟分割槽大小就難以調整,而LVM(邏輯卷管理器)技術可以允許使用者對硬碟資源進行動態調整。

2.1 LVM概述

LVM(Logical Volume Manager)是Linux系統用於對硬碟分割槽進行管理的一種機制,建立初衷是為了解決硬碟裝置在建立分割槽後不易修改分割槽大小的缺陷。

儘管對傳統的硬碟分割槽進 行強制擴容或縮容從理論上來講是可行的,但是卻可能造成資料的丟失。

LVM架構圖如下:

LVM技術是在硬碟分割槽和檔案系統之間添加了一個邏輯層,它提供了一個抽象的卷組,可以把多塊硬碟進行卷組合並。這樣一來,使用者不必關心物理硬碟裝置的底層架構和佈局,就可以實現對硬碟分割槽的動態調整。

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

在生產環境中無法精確地評估每個硬碟分割槽在日後的使用情況,因此會導致 原先分配的硬碟分割槽不夠用。隨著業務的增加磁碟不夠用了需要擴容,或者業務縮減我們需要對磁碟分割槽進行精簡縮容等等,這些都可以通過LVM來解決。

部署LVM時,需要逐個配置物理卷、卷組和邏輯卷。常用命令如下:

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

2.2 案例實操

為了避免干擾,重新克隆一個虛擬機器,並新增2塊磁碟(新增2塊的目的是為了演示將磁碟新增到LVM的卷組中,實際情況可能會有更多的磁碟)。

大概步驟為:先對這兩塊新硬碟進行建立物理卷的操作,然後對這兩塊硬碟進行卷組合並,接下來根據需求把合併後的卷組切割出一個約為 150MB 的邏輯卷裝置,最後把這個邏輯卷裝置格式化成 EXT4 檔案系統後掛載使用。

2.2.1 部署LVM

(1)讓磁碟裝置支援LVM

[root@origin ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0  500M  0 part /boot
└─sda2            8:2    0 19.5G  0 part 
  ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm  /
sdb               8:16   0    1G  0 disk 
sdc               8:32   0    1G  0 disk 
sr0              11:0    1  3.9G  0 rom  /run/media/root/CentOS 7 x86_64
[root@origin ~]# pvcreate /dev/sdb /dev/sdc
  Physical volume "/dev/sdb" successfully created
  Physical volume "/dev/sdc" successfully created
[root@origin ~]# pvscan
  PV /dev/sda2   VG centos          lvm2 [19.51 GiB / 0    free]
  PV /dev/sdc                       lvm2 [1.00 GiB]
  PV /dev/sdb                       lvm2 [1.00 GiB]
  Total: 3 [21.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 2 [2.00 GiB]
[root@origin ~]#

檢視剛才新家的2塊裝置為:sdb、sdc。將其建立物理卷,並通過pvscan命令檢視以建立物理卷。

(2)磁碟裝置加入卷組

[root@origin ~]# vgcreate storage /dev/sdb /dev/sdc
  Volume group "storage" successfully created
[root@origin ~]# 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               1.99 GiB
  PE Size               4.00 MiB
  Total PE              510
  Alloc PE / Size       0 / 0   
  Free  PE / Size       510 / 1.99 GiB
  VG UUID               EKcctk-C1nM-Y2W8-s7pS-1bq8-W9ie-UTJM8Z
...省略部分內容
[root@origin ~]# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "storage" using metadata type lvm2
  Found volume group "centos" using metadata type lvm2
[root@origin ~]# 

用vgcreate建立名稱為storage的卷組,並通過vgdisplay或vgscan可以檢視。

(3)建立邏輯卷

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

[root@origin ~]# lvcreate -n vo -l 37 storage
  Logical volume "vo" created
[root@origin ~]# lvscan 
  ACTIVE            '/dev/storage/vo' [148.00 MiB] inherit
  ACTIVE            '/dev/centos/root' [17.51 GiB] inherit
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit
[root@origin ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo
  LV Name                vo
  VG Name                storage
  LV UUID                qziHT9-1qTT-1CRa-TIoq-cosz-Hhn0-jX5CVm
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:14:18 +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
...省略部分內容
[root@origin ~]# 

通過lvcreate建立名稱為vo的邏輯卷後,通過lvdisplay可以檢視/dev/storage/vo大小為剛設定的148M(LV Size 148.00 MiB)。

(4)格式化邏輯卷並掛載

[root@origin ~]# 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@origin ~]# mkdir /lvm
[root@origin ~]# mount /dev/storage/vo /lvm
[root@origin ~]# echo "/dev/storage/vo /lvm ext4 defaults 0 0" >> /etc/fstab
[root@origin ~]#

格式化邏輯卷後掛載到lvm目錄,並把掛載資訊寫入fstab檔案使其開機自動生效。

(5)檢視掛載狀態

[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/storage-vo   140M  1.6M  128M   2% /lvm
[root@origin ~]# echo "test">/lvm/test.txt
[root@origin ~]# ls /lvm/
lost+found  test.txt
[root@origin ~]# 

通過df命令就可以檢視掛載成功,並可以成功寫入檔案到lvm目錄下。

2.2.2 LVM擴容

上一步建立的容量為148M,下面將演示將其擴充套件到300M

(1)解除安裝裝置與掛載點的關聯

[root@origin ~]# umount /lvm
[root@origin ~]#

(2)擴充套件邏輯卷

把上一個實驗中的邏輯卷 vo 擴充套件至 300MB

[root@origin ~]# lvextend -L 300M /dev/storage/vo
  Extending logical volume vo to 300.00 MiB
  Logical volume vo successfully resized
[root@origin ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo
  LV Name                vo
  VG Name                storage
  LV UUID                qziHT9-1qTT-1CRa-TIoq-cosz-Hhn0-jX5CVm
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:14:18 +0800
  LV Status              available
  '#' open                 0
  LV Size                300.00 MiB
 ...省略部分內容

可以看到擴充套件後/dev/storage/vo邏輯卷大小為300M。

(3)檢查硬碟完整性並重置硬碟容量

[root@origin ~]# 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: 12/38000 files (0.0% non-contiguous), 10455/151552 blocks
[root@origin ~]# resize2fs /dev/storage/vo
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 307200 (1k) blocks.
The filesystem on /dev/storage/vo is now 307200 blocks long.
[root@origin ~]# 

(4)重新掛載裝置

[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/storage-vo   287M  2.1M  266M   1% /lvm
[root@origin ~]# 

可以看到擴容後,lvm目錄的大小為300M(上圖實際顯示為287M)。

這樣就完成了邏輯卷的擴容。

2.2.3 LVM縮小容

相較於擴容邏輯卷,在對邏輯捲進行縮容操作時,其丟失資料的風險更大,所以在生產環境中一定要提前備份資料。

為了保證資料安全性,Linux系統規定,在對LVM邏輯捲進行縮容操作之前,要先檢查檔案系統的完整性。

上一步擴容後lvm容量為300M,本次演示將其縮容到100M,步驟如下:

(1)解除安裝檔案系統

[root@origin ~]# umount /lvm
[root@origin ~]# 

(2)檢查檔案系統完整性

[root@origin ~]#  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: 12/76000 files (0.0% non-contiguous), 15761/307200 blocks
[root@origin ~]# 

(3)縮容邏輯卷

把邏輯卷 vo 的容量減小到 100MB

[root@origin ~]# resize2fs /dev/storage/vo 100M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 102400 (1k) blocks.
The filesystem on /dev/storage/vo is now 102400 blocks long.
[root@origin ~]# lvreduce -L 100M /dev/storage/vo
  WARNING: Reducing active logical volume to 100.00 MiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vo? [y/n]: y  
  Reducing logical volume vo to 100.00 MiB
  Logical volume vo successfully resized
[root@origin ~]# 

(4)重新掛載檔案系統

[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/storage-vo    93M  1.6M   85M   2% /lvm
[root@origin ~]# 

可以看到lvm目錄已經縮小到93M,這樣就完成了邏輯卷的縮容操作。

2.2.4 LVM快照功能

邏輯卷快照功能就類似於還原作業系統,可以將邏輯卷狀態還原到指定時間點。

LVM快照功能有2個特點:快照卷只能使用一次,一旦執行還原操作後立即自動刪除;快照卷的容量必須等同於邏輯卷的容量防止資料丟失。

(1)檢視當前卷組資訊

[root@origin ~]# 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               1.99 GiB
  PE Size               4.00 MiB
  Total PE              510
  Alloc PE / Size       25 / 100.00 MiB
  Free  PE / Size       485 / 1.89 GiB
  ...省略部分內容

可以看到卷組中已經使用了100M,空閒容量還有1.89G。(Alloc PE / Size 25 / 100.00 MiB, Free PE / Size 485 / 1.89 GiB)

(2)生成快照卷

[root@origin ~]# lvcreate -L 100M -s -n SNAP /dev/storage/vo
  Logical volume "SNAP" created
[root@origin ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo
  LV Name                vo
  VG Name                storage
  LV UUID                qziHT9-1qTT-1CRa-TIoq-cosz-Hhn0-jX5CVm
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:14:18 +0800
  LV snapshot status     source of
                         SNAP [active]
  LV Status              available
  '#' open                 1
  LV Size                100.00 MiB
  Current LE             25
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
   
  --- Logical volume ---
  LV Path                /dev/storage/SNAP
  LV Name                SNAP
  VG Name                storage
  LV UUID                TVfDRL-LnYd-z76K-fOuS-AD3C-Sw49-7jPgPo
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:40:10 +0800
  LV snapshot status     active destination for vo
  LV Status              available
  '#' open                 0
  LV Size                100.00 MiB
  Current LE             25
  COW-table size         100.00 MiB
  COW-table LE           25
  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
 ...省略部分內容

通過lvcreate命令生成一個名為SNAP的快照邏輯卷。此時邏輯卷的儲存空間佔用量為0.01%。(Allocated to snapshot 0.01%)

(3)邏輯卷中新增檔案,檢視快照卷空間使用量

[root@origin ~]# dd if=/dev/zero of=/lvm/files count=1 bs=50M
1+0 records in
1+0 records out
52428800 bytes (52 MB) copied, 0.289668 s, 181 MB/s
[root@origin ~]# ls /lvm/
files  lost+found  test.txt
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
...省略部分內容
/dev/mapper/storage-vo    93M   52M   35M  61% /lvm
[root@origin ~]# lvdisplay 
...省略部分內容
  --- Logical volume ---
  LV Path                /dev/storage/SNAP
  LV Name                SNAP
  VG Name                storage
  LV UUID                TVfDRL-LnYd-z76K-fOuS-AD3C-Sw49-7jPgPo
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:40:10 +0800
  LV snapshot status     active destination for vo
  LV Status              available
  '#' open                 0
  LV Size                100.00 MiB
  Current LE             25
  COW-table size         100.00 MiB
  COW-table LE           25
  Allocated to snapshot  50.29%
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3
...省略部分內容

在邏輯卷所掛載的目錄中建立一個50MB 的垃圾檔案,然後再檢視快照卷/dev/storage/SNAP和邏輯卷/dev/storage/vo的狀態。可以發現儲存空間的佔用量都上升了,快照卷佔用量為:Allocated to snapshot 50.29%。

(4)通過快照卷還原邏輯卷

通過剛才建立的/dev/storage/SNAP快照卷,還原邏輯卷/dev/storage/vo的狀態。

還原之前先取消目錄掛載

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

可以看到還原邏輯卷後,快照卷自動刪除了,通過lvdisplay命令檢視也不會再有/dev/storage/SNAP 。

(5)重新掛載邏輯卷並檢視檔案

[root@origin ~]# mount -a
[root@origin ~]# ls /lvm/
lost+found  test.txt
[root@origin ~]# 

可以看到,還原之後剛才建立files檔案不見了,這樣就把邏輯卷還原到了建立快照時的狀態。

2.2.5 刪除邏輯卷

當生產環境中想要重新部署LVM或者不再需要使用 LVM 時,可以刪除LVM。

需要提前備份好重要的資料資訊,然後依次刪除邏輯卷、卷組、物理卷裝置,順序不可顛倒。

(1)取消掛載

[root@origin ~]# umount /lvm/

取消邏輯卷與目錄的掛載關聯,刪除配置檔案中永久生效的裝置引數,找到之前新增在/etc/fstab檔案中的一行“/dev/storage/vo /lvm ext4 defaults 0 0”並刪除。

(2)刪除邏輯卷

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

(3)刪除卷組

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

只寫卷組名稱即可,不需要裝置的絕對路徑。

(4)刪除物理卷

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

在上述操作執行完畢之後,再執行 lvdisplay、vgdisplay、pvdisplay 命令來檢視 LVM 的信 息時就不會再看到資訊了,說明刪除成功。

通過上文和本文的演示,基本掌握了centos7下磁碟管理相關操作,如果非運維人員不一定要掌握的非常深刻,理解即可。

本文講了很多磁碟相關的命令,需要多敲幾篇自然就熟悉了。下一篇文章再補充講解下SSH服務相關的知識,然後就開始講解應用服務的部署和使用了(如apache、郵件系統、mysql、動態網站部署等)