当你发现某个文件夹满到放不下新文件时,又不能放到其他文件夹和分区,应该会想到加块儿硬盘吧。可以如何将新硬盘合并到即将满了的分区呢?LVM,逻辑卷管理(Logical Volume Manager),它是 Linux 环境下对磁盘分区进行管理的一种机制,可以提高磁盘分区的灵活性。很牛的一点是,LVM 允许在不停机的情况下伸缩文件系统的大小,这在服务器上十分重要。
LVM 的几个概念
- 物理存储介质(PhysicalStorageMedia)
指系统的物理存储设备:磁盘,如:/dev/hda、/dev/sda等,是存储系统最底层的存储单元。
- 物理卷(Physical Volume,PV)
指磁盘分区或从逻辑上与磁盘分区具有同样功能的设备(如 RAID),是 LVM 的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与 LVM 相关的管理参数。
- 卷组(Volume Group,VG)
类似于非 LVM 系统中的物理磁盘,其由一个或多个物理卷 PV 组成。可以在卷组上创建一个或多个 LV(逻辑卷)。
- 逻辑卷(Logical Volume,LV)
类似于非 LVM 系统中的磁盘分区,逻辑卷建立在卷组 VG 之上。在逻辑卷 LV 之上可以建立文件系统(比如 /home 或者 /usr 等)。
- 物理块(Physical Extent,PE)
PE 是物理卷 PV 的基本划分单元,具有唯一编号的 PE 是可以被 LVM 寻址的最小单元。PE 的大小是可配置的,默认为 4 MB。所以物理卷(PV)由大小等同的基本单元 PE 组成。
- 逻辑块(Logical Extent,LE)
逻辑卷 LV 也被划分为可被寻址的基本单位,称为 LE。在同一个卷组中,LE 的大小和 PE 是相同的,并且一一对应。
准备物理卷(PV)
创建物理卷
提示:直接操作磁盘有风险,请根据实际情况来!
pvcreate /dev/sda
查看物理卷
pvdisplay
"/dev/sda" is a new physical volume of "<2.73 TiB"
--- NEW Physical volume ---
PV Name /dev/sda
VG Name
PV Size <2.73 TiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID IXSvwr-TOUv-4GJ9-Pzzi-mB0P-VM3h-Zl5eHu
删除物理卷
pvremove /dev/sda
准备卷组(VG)
创建卷组
vgcreate vg1 /dev/sda /dev/sdb1 /dev/sdb2
查看卷组
vgdisplay
--- Volume group ---
VG Name vg1
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 <5.46 TiB
PE Size 4.00 MiB
Total PE 1430792
Alloc PE / Size 0 / 0
Free PE / Size 1430792 / <5.46 TiB
VG UUID GPQkyt-yEGc-wpKr-ks28-mkJO-b9MF-sA7JHu
缩容卷组
vgreduce vg1 /dev/sdc
通过删除 LVM 卷组中的物理卷来减少卷组容量,但不能删除 LVM 卷组中剩余的最后一个物理卷。
先使用 pvs
命令检查是否使用了:
pvs -o +pv_used
PV VG Fmt Attr PSize PFree Used
/dev/sda vg1 lvm2 a-- <2.73t <2.73t 0
/dev/sdc vg1 lvm2 a-- <2.73t <2.73t 0
如果物理卷已经被使用了,则必须使用 pvmove
命令将数据传输到另一个物理卷,然后将其从卷组中删除。
扩容卷组
vgextend vg1 /dev/sdc
删除卷组
vgremove vg1
准备逻辑卷(LV)
创建逻辑卷
lvcreate -L 100M -n lv1 vg1 # 创建 100 M 大小名为 lv1 的逻辑卷
lvcreate -l 100%VG -n lv1 vg1 # 创建占全部卷组大小的逻辑卷
lvcreate -l 100%FREE -n lv1 vg1 # 创建 100% 剩余空间大小的逻辑卷
查看逻辑卷
lvdisplay
--- Logical volume ---
LV Path /dev/vg1/lv1
LV Name lv1
VG Name vg1
LV UUID 3f8r8Z-Ybw8-nIyQ-fAnA-cRIy-RXcU-J9935d
LV Write Access read/write
LV Creation host, time ubuntu, 2022-03-22 11:24:18 +0000
LV Status available
# open 0
LV Size <5.46 TiB
Current LE 1430792
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
/dev/vg1
这个文件夹是创建 LV 后才被创建的。除了 /dev/vg1/lv1
还会创建一个 /dev/mapper/vg1-lv1
他们都是软链接,链接到了 /dev/dm0
。
此时查看使用情况:
pvs -o +pv_used PV VG Fmt Attr PSize PFree Used
/dev/sda vg1 lvm2 a-- <2.73t 0 <2.73t
/dev/sdc vg1 lvm2 a-- <2.73t 0 <2.73t
可见,创建完 LV 后两块儿磁盘就 100% 被使用了。
像使用物理卷那样使用逻辑卷 /dev/vg1/lv1
就可以了:
mkfs.ext4 /dev/vg1/lv1 # 格式化
mkdir /data && chattr +i /data # 创建挂载点
mount /dev/vg1/lv1 /data
缩容逻辑卷
缩容是个细致活,不能大意了,否则数据可能丢失。主要有 5 步:
-
卸载要操作的文件系统
umount /dev/vg1/lv1
-
检查修复文件系统错误
e2fsck -f /dev/vg1/lv1
e2fsck 1.45.5 (07-Jan-2020)
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/vg1/lv1: 12/183144448 files (0.0% non-contiguous), 11836033/1465131008 blocks
这个命令要根据文件系统的类型来选择了,本文用的是 ext4 文件系统。
-
缩小文件系统
resize2fs /dev/vg1/lv1 4T # 将文件系统缩小为 4 TB
resize2fs 1.45.5 (07-Jan-2020)
Resizing the filesystem on /dev/vg1/lv1 to 1073741824 (4k) blocks.
The filesystem on /dev/vg1/lv1 is now 1073741824 (4k) blocks long.
如果要查看调整后的大小,可以使用 dumpe2fs -h /dev/vg1/lv1
命令,不过要计算一下才能得到结果:Block count * Block size (bytes)
echo "1073741824 * 4096 / 1024 / 1024 / 1024" | bc
4096 # 这是我调整后的结果,4T
-
缩小逻辑卷大小
lvreduce -L 4T /dev/vg1/lv1 # 将逻辑卷缩小为 4 TB
lvdisplay # 查看调整后的大小
--- Logical volume ---
LV Path /dev/vg1/lv1
LV Name lv1
VG Name vg1
LV UUID 3f8r8Z-Ybw8-nIyQ-fAnA-cRIy-RXcU-J9935d
LV Write Access read/write
LV Creation host, time ubuntu, 2022-03-22 11:24:18 +0000
LV Status available
# open 0
LV Size 4.00 TiB
Current LE 1048576
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
也可以使用 lvresize -L 4T /dev/vg1/lv1
命令来调整大小。
-
挂载文件系统并使用
mount /dev/vg1/lv1 /data
扩容逻辑卷
扩容相对来说更容易一些,不需要 umount 文件系统。
查看卷组 VG 空闲空间状态:
vgdisplay
--- Volume group ---
VG Name vg1
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 7
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 <5.46 TiB
PE Size 4.00 MiB
Total PE 1430792
Alloc PE / Size 1048576 / 4.00 TiB
Free PE / Size 382216 / <1.46 TiB
VG UUID GPQkyt-yEGc-wpKr-ks28-mkJO-b9MF-sA7JHu
可以看到空闲的 PE 数量是 382216。
扩展卷大小,使用全部的空闲空间:
lvextend -l +382216 /dev/vg1/lv1
这里使用了加号来增加空间。扩展卷同样也可以使用 lvresize
命令。
扩展文件系统,使用全部的卷空间:
df -h
/dev/mapper/vg1-lv1 4.0T 89M 3.8T 1% /data
resize2fs /dev/vg1/lv1
df -h
/dev/mapper/vg1-lv1 5.5T 72M 5.2T 1% /data
可以看到扩展前后文件系统的大小发生了预期的变化。
删除逻辑卷
lvremove /dev/vg1/lv1