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