LVM 全攻略:一文掌握邏輯卷的增刪改查(含生產實操)
今天分享一下LVM,這是我結合生產環境總結出來的操作,非常實用,文章較長,請耐心閱讀。
一、邏輯卷介紹
LVM(Logical Volume Manager)邏輯卷管理,是在硬盤分區和文件系統之間添加的一個邏輯層。
LVM就是通過將底層的物理硬盤封裝,然后以邏輯卷的方式呈現給上層應用。當我們對底層的物理硬盤進行操作時,不再是針對分區進行操作,而是通過邏輯卷對底層硬盤進行管理操作。
二、邏輯卷基本概念
概念原理圖如下:
(1) 物理卷(Physical Volume,PV)
物理卷是底層真正提供容量,存放數據的設備,它可以是硬盤分區、整個硬盤、raid陣列或SAN硬盤。設備必須初始化為LVM物理卷,才能與LVM結合使用。。
(2) 卷組(Volume Group, VG)
卷組建立在物理卷之上,它由一個或多個物理卷組成。即把物理卷整合起來提供容量分配。 一個LVM系統中可以只有一個卷組,也可以包含多個卷組。
(3) 邏輯卷(Logical Volume, LV)
邏輯卷建立在卷組之上,它是從卷組中“切出”的一塊空間。它是最終用戶使用的邏輯設備。邏輯卷創建之后,其大小可以伸縮。
(4) 物理區域 PE(physical extent)
每一個物理卷被劃分為稱為PE(Physical Extents)的基本單元,具有唯一編號的PE是能被LVM尋址的最小單元。PE的大小可指定,默認為4 MB。 PE的大小一旦確定將不能改變,同一個卷組中的所有物理卷的PE的大小是一致的。 4MB=4096kb=4096kb/4kb=1024個block
三、邏輯卷創建與刪除
操作命令:
創建和刪除順序:
1. 環境準備
可以將硬盤做成PV,也可以將分區做成PV。
本次實驗就用三塊5G的硬盤來模擬(容量你自定義即可)。
[root@liyb ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 2G 0 part /boot
└─sda2 8:2 0 48G 0 part
└─rl-root 253:0 0 48G 0 lvm /
sdb 8:16 0 5G 0 disk
sdc 8:32 0 5G 0 disk
sdd 8:48 0 5G 0 disk
sr0 11:0 1 10.2G 0 rom
[root@liyb ~]#
2. 安裝lvm相關軟件包
有些發行版本是安裝系統時就已經安裝了,不用重復安裝。
yum install lvm2 lvm2-libs -y
3. 創建物理卷(PV)
# 將三個硬盤做成PV
pvcreate /dev/sdb /dev/sdc /dev/sdd # 也可以寫成/dev/sd{b..d} 或 /dev/sd[bcd] 或 /dev/sd[b-d]
# 查看PV情況,因為我們根分區也是LVM格式,所有有4個PV
pvs
# 刪除PV,這一步先不做。
pvremove /dev/sdb /dev/sdc /dev/sdb
圖片
說明:除了pvs還可以使用pvdisplay和pvscan等命令查看更詳細的信息
4. 創建與擴展卷組(VG)
- 創建卷組(VG)使用vgcreate命令
- 擴展卷組使用vgextend命令
將/dev/sdb與/dev/sdc創建成一個卷組,卷組名自定義為vg-data:
# 創建卷組
[root@liyb ~]# vgcreate vg-data /dev/sdb /dev/sdc
Volume group "vg-data" successfully created
將/dev/sdd擴展添加到卷組vg01中:
# vgextend vg-data /dev/sdd
Volume group "vg-data" successfully extended
查看驗證:
# 查看卷組情況
vgs
# 查看PV情況
pvs
注意事項:
- 可以通過-s指定PE大小(默認是4MB)
- PE大,讀取速度快,但浪費空間。反之,讀取速度慢,但節省空間。類似于socket
5. 將卷組劃分為邏輯卷(LV)
- 使用lvcreate命令劃分LV
- 使用lvs命令查看
創建邏輯卷:
lvcreate常見參數 | 說明 |
-n | 指定邏輯卷的名字 |
-L | 指定邏輯卷的大小 |
-l | 通過指定PE的個數或空間百分比來指定邏輯卷的大小 |
# 指定創建邏輯卷大小
[root@liyb ~]# lvcreate -n lv-data -L 2G vg-data
Logical volume "lv-data" created.
# 創建第二個LV,指定PE個數,一個PE默認4MB
[root@liyb ~]# lvcreate -n lv-data2 -l 200 vg-data
Logical volume "lv-data2" created.
# 創建第三個LV,將剩余的全部的50%空間分給它
[root@liyb ~]# lvcreate -n lv-data3 -l 50%free vg-data
Logical volume "lv-data3" created.
查看邏輯卷:
# lvs
注意事項:
- 生產環境盡量不要一個vg創建多個lv,我上面例子只是為了驗證常用功能
- lv名字可以自定義,可以結合業務來起名字
6. 驗證lv設備名
# ls /dev/vg-data
# ls /dev/mapper/vg-data*
7. 格式化并掛載
這里以lv-data為例,其他掛載的話,步驟一樣:
# 格式化
[root@liyb ~]# mkfs.xfs /dev/vg-data/lv-data
# 創建掛載點,已有掛載目錄可省略
[root@liyb ~]# mkdir /data
# 掛載
[root@liyb ~] mount /dev/vg-data/lv-data /data
# 查看掛載情況
df -h
四、邏輯卷在線擴容
1. 查看vg空間
在生產環境中,擴容順序是: 新增硬盤/分區-->創建PV-->擴容VG-->擴容LV-->擴容文件系統
#
df -h |tail -1
# 查看vgs剩余可用容量
[root@liyb ~]# vgs
VG #PV #LV #SN Attr VSize VFree
rl 1 1 0 wz--n- <48.00g 0
vg-data 3 3 0 wz--n- <14.99g <6.11g
# free空間還有近14G
2. 在線擴容邏輯卷
上次查看到,VG還有6G可用,我直接演示如何擴容LV。我這里也演示LV擴容的三種方法
# 方法一:指定擴容后最終容量為3G(從2G變3G)
[root@liyb ~]# lvextend -L 3G /dev/vg-data/lv-data
Size of logical volume vg-data/lv-data changed from 2.00 GiB (512 extents) to 3.00 GiB (768 extents).
Logical volume vg-data/lv-data successfully resized.
# 方法二:在原有基礎再擴容2G(從3G變5G)
[root@liyb ~]# lvextend -L +2G /dev/vg-data/lv-data
Size of logical volume vg-data/lv-data changed from 3.00 GiB (768 extents) to 5.00 GiB (1280 extents).
Logical volume vg-data/lv-data successfully resized.
# 方法三:將VG剩余容量全部擴容給LV,此操作會將vg剩余空間全用完。
[root@liyb ~]# lvresize -l +100%FREE /dev/vg-data/lv-data
# 查看lvs
[root@liyb ~]# lvs
3. 擴容文件系統
前面步驟只是擴容了LV,文件系統并沒有擴容,所以需要進行下面步驟
# 適合xfs文件系統,本次操作執行這個
xfs_growfs /dev/vg-data/lv-data
# 如果你的文件系統是ext4格式,則使用resize2fs
resize2fs /dev/vg-data/lv-data
4. 驗證在線擴容成功
[root@liyb ~]# df -h|grep data
/dev/mapper/vg--data-lv--data 8.1G 91M 8.0G 2% /data
注意事項:
- 在線縮容LV目前只支持ext4文件系統,沒事別做這個操作,容易丟數據。
- xfs文件系統可支持離線擴容,但是操作時做好備份。
五、刪除邏輯卷(謹慎)
如果要刪除邏輯卷,逆向操作步驟為:
卸載文件系統--->刪除邏輯卷LV--->刪除卷組--->刪除物理卷PV
# 卸載文件系統,下面命令也可以選擇掛載點
[root@liyb ~]# umount /dev/vg-data/lv-data
# 刪除LV
[root@liyb ~]# lvremove /dev/vg-data/lv-data
Do you really want to remove active logical volume vg-data/lv-data? [y/n]: y
Logical volume "lv-data" successfully removed.
# 刪除VG,如果有多個LV使用同一個卷組,會提示你都刪除。
[root@liyb ~]# vgremove vg-data
Do you really want to remove volume group "vg-data" containing 2 logical volumes? [y/n]: y
Do you really want to remove active logical volume vg-data/lv-data2? [y/n]: y
Logical volume "lv-data2" successfully removed.
Do you really want to remove active logical volume vg-data/lv-data3? [y/n]: y
Logical volume "lv-data3" successfully removed.
Volume group "vg-data" successfully removed
# 刪除物理卷PV
[root@liyb ~]# pvremove /dev/sd{b..d}
Labels on physical volume "/dev/sdb" successfully wiped.
Labels on physical volume "/dev/sdc" successfully wiped.
Labels on physical volume "/dev/sdd" successfully wiped.