前一篇文章學習了磁盤分區、格式化、掛載等相關知識,本文將講解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、動態網站部署等)。
