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有效提高磁盤數據的吞吐速度,但是不具備數據備份和錯誤修復能力。

其示意圖如下:

file

1.1.2 RAID1

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

RAID1示意圖如下:

file

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

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

1.1.3 RAID5

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

示意圖如下:

file

RAID5技術是把硬盤設備的數據奇偶校驗信息保存到其他硬盤設備中。這樣的好處是其中任何一設備損壞后不至於出現致命缺陷,圖中的parity部分存放的就是數據的奇偶校驗信息。

簡單說就是RAID5方案實際上沒有備份硬盤中的真實數據信息(數據只有一份),而是當硬盤設備出現問題后通過奇偶校驗信息來嘗試重建損壞的數據。

這種方案兼顧了了硬盤設備的讀寫速度、數據安全性與存儲成本問題。

1.1.4 RAID10

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

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

file

如圖所示,需要至少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虛擬機進行演示

file

點擊“克隆”后,彈出虛擬機向導

file

點擊“下一步”

file

保存默認選擇“虛擬機中的當前狀態”,點擊“下一步”

file

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

file

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

file

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

file

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

1.3.2 創建RAID10

如前所述,RAID10至少需要4塊磁盤,因此我們先添加4塊磁盤。

(1)添加磁盤

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

file

在彈出的“虛擬機設置”窗口中,點擊“添加”

file

在彈出的“添加硬件向導”中選擇“硬盤”,然后點擊“下一步”

file

磁盤類型保存默認“SCSI”,點擊“下一步”

file

磁盤類型保持默認的“創建新虛擬機磁盤”,點擊“下一步”

file

根據需要設置磁盤大小,此處設置為1G,點擊“下一步”

file

選擇磁盤文件存放路徑,點擊“完成”按鈕

file

即可看到剛才添加的一塊磁盤已經成功。

file

在上邊界面中點擊“添加”按鈕,用相同的方法再添加3塊磁盤,總共新添加4塊磁盤。

file

(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、動態網站部署等)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM