使用 Linux 好久了,一定會意識到一個問題,某個分區容量不夠用了,想要擴容怎麼辦?這裡就涉及到 LVM 邏輯捲的管理了,可以動態調整 Linux 分區容量。 ...
使用Linux
好久了,一定會意識到一個問題,某個分區容量不夠用了,想要擴容怎麼辦?這裡就涉及到LVM
邏輯捲的管理了,可以動態調整Linux
分區容量。
LVM 概述
全稱Logical Volume Manager
,可以動態調整磁碟容量,提高磁碟管理靈活性。
在安裝CentOS 7
的過程中選擇自動分區時,預設就是以LVM
的方案安裝的系統。
但是/boot
分區必須獨立出來,不能基於LVM
創建。
PV 物理捲
物理捲,Physical Volume
,是LVM
機制的基本存儲設備,通常對應一個普通分區或是整個硬碟。
創建物理捲時,會在分區或磁碟頭部創建一個用於記錄LVM
屬性的保留區塊,並把存儲空間分割成預設大小為4MB
的基本單元(Physical Extend,PE),從而構成物理捲。
普通分區先轉換分區類型為8e
;整塊硬碟,可以將所有的空間劃分為一個主分區再做調整。
VG 捲組
捲組,Volume Group
,是由一個或多個物理捲組成的一個整體。可以動態添加、移除物理捲,創建時可以指定PE
大小。
LV 邏輯捲
邏輯捲,Logical Volume
,建立在捲組之上,與物理捲沒有直接關係。格式化後,即可掛載使用。
三者關係
通過以上對三者的解釋可以看出,建立LVM
的過程。首先,將普通分區或整個硬碟創建為物理捲;然後,將一個或多個物理捲創建為捲組;最後,在捲組上分割不同的數據存儲空間形成邏輯捲。有了邏輯捲,就可以格式化、掛載使用了。
LVM 管理
LVM 常用命令
功能 | PV 管理命令 | VG 管理命令 | LV 管理命令 |
---|---|---|---|
Scan(掃描) | pvscan | vgscan | lvscan |
Create(建立) | pvcreate | vgcreate | lvcreate |
Display(顯示) | pvdisplay | vgdisplay | lvdisplay |
Remove(移除) | pvremove | vgremove | lvremove |
Extend(擴展) | / | vgextend | lvextend |
Reduce(減少) | / | vgreduce | lvreduce |
PV 管理
pvsacn
- 掃描列出系統中所有的物理捲
-e
:僅顯示屬於輸出捲組的物理捲
-n
:僅顯示不屬於任何捲組的物理捲
[root@localhost ~]# pvscan
PV /dev/sda2 VG centos lvm2 [<19.00 GiB / 0 free]
PV /dev/sdb1 lvm2 [<20.00 GiB]
PV /dev/sdc1 lvm2 [<20.00 GiB]
Total: 3 [58.99 GiB] / in use: 1 [<19.00 GiB] / in no VG: 2 [<40.00 GiB]
pvcreate
- 將分區或整個硬碟轉換成物理捲
[root@localhost ~]# pvcreate /dev/sd{b,c}1
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdc1" successfully created.
pvdisplay
- 顯示物理捲的詳細信息
[root@localhost ~]# pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name centos
PV Size <19.00 GiB / not usable 3.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 4863
Free PE 0
Allocated PE 4863
PV UUID E4eovQ-CgPo-OSDK-75MO-BfD8-pGsP-BUlqip
"/dev/sdb1" is a new physical volume of "<20.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size <20.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID gR5mm3-f50o-XLTq-34GY-n6Iz-WXkQ-uMZAkJ
"/dev/sdc1" is a new physical volume of "<20.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc1
VG Name
PV Size <20.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID O2gKxa-ONts-kyXK-zZrO-3dDg-FhtI-V6GPy9
pvremove
- 刪除指定的物理捲,還原成普通分區或磁碟
TIPS:只有不屬於捲組的物理捲才可以刪除還原。
[root@localhost ~]# pvremove /dev/sdd1
Labels on physical volume "/dev/sdd1" successfully wiped.
VG 管理
vgscan
- 掃描系統中已建立的
LVM
捲組
[root@localhost ~]# vgscan
Reading volume groups from cache.
Found volume group "class" using metadata type lvm2
Found volume group "centos" using metadata type lvm2
vgcreate
- 將一個或多個物理捲創建為一個捲組
-l
:捲組上允許創建的最大邏輯捲數
-p
:捲組中允許添加的最大物理捲數
-s
:捲組上的物理捲的PE
大小
[root@localhost ~]# vgcreate class /dev/sd{b,c}1
Volume group "class" successfully created
vgdisplay
- 顯示系統中各捲組的詳細信息
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name class
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 39.99 GiB
PE Size 4.00 MiB
Total PE 10238
Alloc PE / Size 0 / 0
Free PE / Size 10238 / 39.99 GiB
VG UUID ZtQvGX-YOdy-U8wj-mGQs-TT1e-1PBR-dBNKAG
--- Volume group ---
VG Name centos
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size <19.00 GiB
PE Size 4.00 MiB
Total PE 4863
Alloc PE / Size 4863 / <19.00 GiB
Free PE / Size 0 / 0
VG UUID bLPJGb-SQQ3-KcUb-OSdo-qaMR-9hJE-MTkc7a
vgremove
- 刪除指定的捲組
TIPS:捲組下麵的邏輯捲沒有被掛載使用,捲組刪除時會一併刪除下麵的邏輯捲。
[root@localhost ~]# vgremove class
Volume group "class" successfully removed
vgextend
- 添加新的物理捲,動態擴展卷組的磁碟空間
[root@localhost ~]# vgextend class /dev/sdd1
Volume group "class" successfully extended
vgreduce
- 刪除捲組中的物理捲,減少捲組容量,
-a
:如果命令行中沒有指定要刪除的物理捲,則刪除所有的空物理捲。(all)
TIPS:刪除啊前確保對應的物理捲沒有在使用,就是下麵沒有邏輯捲,否則刪除不了。
[root@localhost ~]# vgreduce class /dev/sdd1
Removed "/dev/sdd1" from volume group "class"
[root@localhost ~]# vgreduce -a class
Physical volume "/dev/sdb1" still in use
Physical volume "/dev/sdc1" still in use
Removed "/dev/sdd1" from volume group "class"
LV 管理
lvscan
- 掃描系統中已建立的
LVM
邏輯捲
[root@localhost ~]# lvscan
ACTIVE '/dev/class/stu01' [25.00 GiB] inherit
ACTIVE '/dev/class/stu02' [14.99 GiB] inherit
ACTIVE '/dev/centos/swap' [2.00 GiB] inherit
ACTIVE '/dev/centos/root' [<17.00 GiB] inherit
lvcreate
- 從指定的捲組中分割空間,創建新的邏輯捲
-L
:指定邏輯捲的大小,單位為KMGT
-l
:指定百分比創建,如50%vg
捲組的一半空間、100%free
所有剩下的。
-n
:指定邏輯捲的名稱
[root@localhost ~]# lvcreate -L 15G -n stu01 class
Logical volume "stu01" created.
[root@localhost ~]# lvcreate -l 100%free -n stu02 class
Logical volume "stu02" created.
lvdisplay
- 顯示邏輯捲的詳細信息
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/class/stu01
LV Name stu01
VG Name class
LV UUID XUP7dq-IM9f-PdKk-XpDH-J1hx-kkuB-cOu3Qx
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2019-08-24 09:42:35 +0800
LV Status available
# open 0
LV Size 25.00 GiB
Current LE 6400
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
--- Logical volume ---
LV Path /dev/class/stu02
LV Name stu02
VG Name class
LV UUID P7iMC1-X0oT-6TCH-vLYj-HW2j-6QMu-rS7Jyp
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2019-08-24 09:59:30 +0800
LV Status available
# open 0
LV Size 14.99 GiB
Current LE 3838
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3
--- Logical volume ---
LV Path /dev/centos/swap
LV Name swap
VG Name centos
LV UUID NXiaXT-T6yv-ktM2-plyS-j6Hg-hkvu-1JQ2eL
LV Write Access read/write
LV Creation host, time localhost, 2019-08-16 17:12:19 +0800
LV Status available
# open 2
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1
--- Logical volume ---
LV Path /dev/centos/root
LV Name root
VG Name centos
LV UUID 7FnsfT-B8xi-3vgu-8N0k-nzNn-8Rra-eoE4iC
LV Write Access read/write
LV Creation host, time localhost, 2019-08-16 17:12:19 +0800
LV Status available
# open 1
LV Size <17.00 GiB
Current LE 4351
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
lvremove
- 刪除指定的邏輯捲
TIPS:備份數據,解掛載,刪除。
[root@localhost ~]# umount /mnt/stu02/
[root@localhost ~]# lvremove /dev/class/stu02
lvextend
- 動態擴展
LVM
邏輯捲的空間大小
-L
:指定擴展邏輯捲的大小,單位為KMGT
-l
:指定百分比擴建,如100%free
所有剩下的。
[root@localhost ~]# lvextend -L +8G /dev/class/stu01
[root@localhost ~]# lvextend -L +8G /dev/class/stu02
TIPS:已掛載,使用線上調整大小,xfs
使用xfs_growfs
,ext4
使用resize2fs
。
[root@localhost ~]# xfs_growfs /dev/class/stu01
[root@localhost ~]# resize2fs /dev/class/stu02
lvreduce
- 減少
LVM
邏輯捲的空間大小,
-L
:指定邏輯捲的大小,單位為KMGT
TIPS:對於xfs
文件系統,備份數據,解掛載,減少空間,強制格式化,重新掛載。需要註意xfs
文件系統只能擴大,不能縮小,非要縮小的話,只有縮小後並強制格式化,但這麼做數據就丟失了。
[root@localhost ~]# umount /mnt/stu01/
[root@localhost ~]# lvreduce -L -10G /dev/class/stu01
[root@localhost ~]# mkfs.xfs -f /dev/class/stu01
[root@localhost ~]# mount -a
[root@localhost ~]# df -hT
TIPS:對於ext4
這類文件系統,備份數據,解掛載,e2fsck -f
檢查文件系統完整性,resize2fs
設置文件系統大小,lvreduce
設置邏輯捲大小,重新掛載。
[root@localhost ~]# umount /mnt/stu02/
[root@localhost ~]# e2fsck -f /dev/class/stu02
[root@localhost ~]# resize2fs /dev/class/stu02 10G
[root@localhost ~]# lvreduce -L 10G /dev/class/stu02
[root@localhost ~]# mount -a
[root@localhost ~]# df -hT
LVM 實驗
創建 LVM 邏輯捲
1.添加兩塊20G
的磁碟,重啟機器,並對其進行分區,全部空間分為一個主分區,類型改為Linux LVM
,ID為8e
。分區過程省略,不清楚可參考上一篇博客。
[root@localhost ~]# fdisk -l /dev/sd{b,c} | grep -i "linux lvm"
/dev/sdb1 2048 41943039 20970496 8e Linux LVM
/dev/sdc1 2048 41943039 20970496 8e Linux LVM
2.將/dev/sdb1
、/dev/sdc1
轉換為物理捲。
[root@localhost ~]# pvcreate /dev/sd{b,c}1
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdc1" successfully created.
3.創建名稱為class
的捲組,並將sdb1
和sdc1
添加進捲組。
[root@localhost ~]# vgcreate class /dev/sd{b,c}1
Volume group "class" successfully created
4.劃分大小為15G
,名稱為stu01
的邏輯捲,然後再擴容10G
;剩下的空間創建名稱為stu02
的邏輯捲。
[root@localhost ~]# lvcreate -L 15G -n stu01 class
Logical volume "stu01" created.
[root@localhost ~]# lvextend -L +10G /dev/class/stu01
Size of logical volume class/stu01 changed from 15.00 GiB (3840 extents) to 25.00 GiB (6400 extents).
Logical volume class/stu01 successfully resized.
[root@localhost ~]# lvcreate -l 100%free -n stu02 class
Logical volume "stu02" created.
5.格式化邏輯捲,stu01
為xfs
,stu02
為ext4
,設置自動掛載,掛載後就可以使用了。
[root@localhost ~]# mkfs.xfs /dev/class/stu01
meta-data=/dev/class/stu01 isize=512 agcount=4, agsize=1638400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=6553600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=3200, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost ~]# mkfs.ext4 /dev/class/stu02
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
983040 inodes, 3930112 blocks
196505 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
120 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@localhost ~]# mkdir /mnt/stu0{1,2}
[root@localhost ~]# vim /etc/fstab
//最後面添加下麵兩行內容
/dev/class/stu01 /mnt/stu01 xfs defaults 0 0
/dev/class/stu02 /mnt/stu02 ext4 defaults 0 0
[root@localhost ~]# mount -a
[root@localhost ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 17G 927M 17G 6% /
devtmpfs devtmpfs 901M 0 901M 0% /dev
tmpfs tmpfs 912M 0 912M 0% /dev/shm
tmpfs tmpfs 912M 8.7M 904M 1% /run
tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 143M 872M 15% /boot
tmpfs tmpfs 183M 0 183M 0% /run/user/0
/dev/mapper/class-stu01 xfs 25G 33M 25G 1% /mnt/stu01
/dev/mapper/class-stu02 ext4 15G 41M 14G 1% /mnt/stu02
擴容 LVM 邏輯捲
1.再添加一塊20G的磁碟,重啟機器,並對其進行分區,全部空間分為一個主分區,類型改為Linux LVM
,ID為8e
。
[root@localhost ~]# fdisk -l /dev/sd{b..d} | grep -i "linux lvm"
/dev/sdb1 2048 41943039 20970496 8e Linux LVM
/dev/sdc1 2048 41943039 20970496 8e Linux LVM
/dev/sdd1 2048 41943039 20970496 8e Linux LVM
2.將/dev/sdd1
轉換為物理捲。
[root@localhost ~]# pvcreate /dev/sdd1
Physical volume "/dev/sdd1" successfully created.
3.若是捲組剩餘空間不夠,就要先對class
捲組進行擴容。
[root@localhost ~]# vgdisplay class
--- Volume group ---
VG Name class
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 6
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 39.99 GiB
PE Size 4.00 MiB
Total PE 10238
Alloc PE / Size 10238 / 39.99 GiB
Free PE / Size 0 / 0
VG UUID iB1h9h-2uQa-rD7o-GBVK-pOCA-ek2c-TXieLr
[root@localhost ~]# vgextend class /dev/sdd1
Volume group "class" successfully extended
[root@localhost ~]# vgdisplay class
--- Volume group ---
VG Name class
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 7
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 3
Act PV 3
VG Size <59.99 GiB
PE Size 4.00 MiB
Total PE 15357
Alloc PE / Size 10238 / 39.99 GiB
Free PE / Size 5119 / <20.00 GiB
VG UUID iB1h9h-2uQa-rD7o-GBVK-pOCA-ek2c-TXieLr
4.對stu01
和stu02
都擴容8G
,分別使用xfs_growfs
和resize2fs
線上調整大小。
[root@localhost ~]# lvextend -L +8G /dev/class/stu01
Size of logical volume class/stu01 changed from 25.00 GiB (6400 extents) to 33.00 GiB (8448 extents).
Logical volume class/stu01 successfully resized.
[root@localhost ~]# lvextend -L +8G /dev/class/stu02
Size of logical volume class/stu02 changed from 14.99 GiB (3838 extents) to 22.99 GiB (5886 extents).
Logical volume class/stu02 successfully resized.
[root@localhost ~]# xfs_growfs /dev/class/stu01
meta-data=/dev/mapper/class-stu01 isize=512 agcount=4, agsize=1638400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=6553600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=3200, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 6553600 to 8650752
[root@localhost ~]# resize2fs /dev/class/stu02
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/class/stu02 is mounted on /mnt/stu02; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 3
The filesystem on /dev/class/stu02 is now 6027264 blocks long.
[root@localhost ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 17G 927M 17G 6% /
devtmpfs devtmpfs 901M 0 901M 0% /dev
tmpfs tmpfs 912M 0 912M 0% /dev/shm
tmpfs tmpfs 912M 8.7M 903M 1% /run
tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 143M 872M 15% /boot
/dev/mapper/class-stu01 xfs 33G 33M 33G 1% /mnt/stu01
/dev/mapper/class-stu02 ext4 23G 44M 22G 1% /mnt/stu02
tmpfs tmpfs 183M 0 183M 0% /run/user/0
收縮 LVM 邏輯捲
關於收縮 LVM 邏輯捲,可以參考上面的命令lvreduce
。這會涉及到數據安全性問題,謹慎使用。
總結
內容不多,但是還要實際操作才能瞭解。就是三步走,創建物理捲,創建捲組,創建邏輯捲,然後格式化並掛載使用。擴容的話,沒有掛載使用,就正常擴,然後格式化掛載,已經掛載使用了,擴容後線上調整生效。還有下一篇關於磁碟配額。