LVM(逻辑卷)概念
逻辑卷管理器(Logical volume Manager)是 Linux 系统用于对硬盘分区进行管理的一种机制,理论性较强,其创建初衷是为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上来讲是可行的,但是却可能造成数据的丢失。而 LVM 技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。这样一来,用户不必关心物理硬盘设备的低层架构和布局,就可以实现对硬盘分区的动态调整。
LVM 就是通过将底层的物理硬盘封装,然后以逻辑卷的方式呈现给上层应用。当我们对底层的物理硬盘进行操作时,不再是针对分区进行操作,而是通过逻辑卷对底层硬盘进行管理操作。
结构
- 物理卷( Physical Volume)处于 LVM 的最底层,它们可以是实际物理硬盘上的分区、整个物理硬盘或 RAID 设备
- 卷组(Volume Group)建立在物理卷之上,卷组建立后便可动态添加物理卷到卷组中
- 逻辑卷(Logical Volume)建立在卷组之上,卷组中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后便可动态地扩展和缩小空间
LVM 的优势
- 灵活的容量
- 重新设定存储池大小
- 在线数据重新定位
- 方便设备命名
创建 LVM
创建逻辑卷的过程是把若干物理卷整合到一起组成卷组,在卷组上重新划分出新的分区。
首先添加一个 20Gb 硬盘。
创建物理卷(PV)
使用 lsblk
查看块设备
> lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 39G 0 part
├─centos-root 253:0 0 35.1G 0 lvm /
└─centos-swap 253:1 0 3.9G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
使用 pvcreate
创建物理卷PV
> pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
# 查看是否创建成功
> pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <39.00g 4.00m
/dev/sdb lvm2 --- 20.00g 20.00g
使用 pvdisplay
查看详情
> pvdisplay /dev/sdb
"/dev/sdb" is a new physical volume of "20.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 20.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 2M2Is3-ZD7F-lZH0-Ea1o-TAiL-I7S0-xQlXH1
创建卷组(VG)
使用 vgcreate
创建卷组VG,并且此处可以 -s
选项指定PE(LE)的大小,(默认PE大小4M)
> vgcreate datavg /dev/sdb
Volume group "datavg" successfully created
# 查看是否创建成功
> vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <39.00g 4.00m
datavg 1 0 0 wz--n- <20.00g <20.00g
使用 vgdisplay
查看详情
> vgdisplay datavg
--- Volume group ---
VG Name datavg
System ID
Format lvm2
Metadata Areas 1
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 1
Act PV 1
VG Size <20.00 GiB
PE Size 4.00 MiB
Total PE 5119
Alloc PE / Size 0 / 0
Free PE / Size 5119 / <20.00 GiB
VG UUID bccduc-FvjJ-yCpe-as1Z-KeQH-W1kg-2WON8u
PE大,读取速度快,但浪费空间。反之,读取速度慢,但节省空间。类似于 socket
创建逻辑卷(LV)
使用 lvcreate
创建LV。
lvcreate -n lvname -L lvsize(M,G) vgname
代码语言:javascript复制> lvcreate -n lv1 -L 900M datavg
Logical volume "lv1" created.
# 查看是否创建成功
> lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <35.12g
swap centos -wi-ao---- <3.88g
lv1 datavg -wi-a----- 900.00m
使用 lvdisplay
查看详情
> lvdisplay /dev/datavg/lv1
--- Logical volume ---
LV Path /dev/datavg/lv1
LV Name lv1
VG Name datavg
LV UUID FOfx3Z-Nr2j-gjdL-eMSs-7Gu3-ZtLR-ro5zF0
LV Write Access read/write
LV Creation host, time centos-ps, 2023-01-13 17:06:06 0800
LV Status available
# open 0
LV Size 900.00 MiB
Current LE 225
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
格式化逻辑卷(LV)
xfs文件系统只支持增大,不支持减小。ext2、ext3、ext4增大减小都支持。
使用 mkfs
格式化逻辑卷
> mkfs.ext4 /dev/datavg/lv1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
57600 inodes, 230400 blocks
11520 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=236978176
8 block groups
32768 blocks per group, 32768 fragments per group
7200 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
挂载并使用
使用 mount
挂载
> mkdir /opt/lv1
> mount /dev/datavg/lv1 /opt/lv1
> df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 16K 1.9G 1% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 36G 9.4G 26G 27% /
/dev/sda1 1014M 195M 820M 20% /boot
vmhgfs-fuse 293G 144G 150G 49% /mnt/hgfs
tmpfs 378M 0 378M 0% /run/user/1002
tmpfs 378M 0 378M 0% /run/user/0
/dev/mapper/datavg-lv1 870M 2.3M 807M 1% /opt/lv1
可以看到挂载成功了,但是重启后又需要挂载。
代码语言:javascript复制我们可以编辑
/etc/fstab
添加一行/dev/datavg/lv1 /opt/lv1 ext4 defaults 0 0
> vim /etc/fstab
# /etc/fstab
# Created by anaconda on Thu Jul 28 16:11:47 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=e3727324-7c1e-4dd2-8821-ab4a6fec3316 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/datavg/lv1 /opt/lv1 ext4 defaults 0 0
> mount -a
> df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 16K 1.9G 1% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 36G 9.4G 26G 27% /
/dev/sda1 1014M 195M 820M 20% /boot
vmhgfs-fuse 293G 144G 150G 49% /mnt/hgfs
tmpfs 378M 0 378M 0% /run/user/1002
tmpfs 378M 0 378M 0% /run/user/0
/dev/mapper/datavg-lv1 870M 2.3M 807M 1% /opt/lv1
动态扩容
逻辑卷动态扩容
逻辑卷最大的优点是可以弹性调节容量,逻辑卷存储空间不足时,就需要扩容。 若逻辑卷需要扩容,首先查看其所属的卷组,例如,lv1属于datavg卷组;再查看卷组空间空闲量,datavg卷组可用量为 10.12g。
代码语言:javascript复制> vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <39.00g 4.00m
datavg 1 2 0 wz--n- <20.00g <10.12g
在确认有多余空间的情况下,使用 lvextend
命令的 -L
选项扩展逻辑卷LV的大小(命令 -
为缩容,
为扩容)
> lvextend -L 800M /dev/datavg/lv1
Size of logical volume datavg/lv1 changed from 900.00 MiB (225 extents) to 1.66 GiB (425 extents).
Logical volume datavg/lv1 successfully resized.
> lvextend -L 1024M /dev/datavg/lv1
Size of logical volume datavg/lv1 changed from 1.66 GiB (425 extents) to 2.66 GiB (681 extents).
Logical volume datavg/lv1 successfully resized.
查看大小
代码语言:javascript复制> lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <35.12g
swap centos -wi-ao---- <3.88g
lv1 datavg -wi-ao---- 2.66g
通过 df -h
查看发现并没有增大
> df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 16K 1.9G 1% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 36G 9.4G 26G 27% /
/dev/sda1 1014M 195M 820M 20% /boot
vmhgfs-fuse 293G 144G 150G 49% /mnt/hgfs
tmpfs 378M 0 378M 0% /run/user/1002
tmpfs 378M 0 378M 0% /run/user/0
/dev/mapper/datavg-lv1 870M 2.3M 807M 1% /opt/lv1
这是因为文件系统也需要扩容。
- ext4 文件系统扩容使用
resize2fs [逻辑卷名称]
挂载点 - xfs 文件系统扩容使用
xfs_growfs
挂载点
> resize2fs /dev/datavg/lv1
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/datavg/lv1 is mounted on /opt/lv1; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/datavg/lv1 is now 697344 blocks long.
再次查看扩容成功了
代码语言:javascript复制> resize2fs /dev/datavg/lv1
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/datavg/lv1 is mounted on /opt/lv1; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/datavg/lv1 is now 697344 blocks long.
也可以使用
lvextend
命令的-r
选项来使文件系统自动扩容
卷组(VG)动态扩容
卷组(VG)扩容
逻辑卷扩容时,若卷组中没有足够的存储空间,就需要增加卷组的容量。vgextend
命令可以将新的物理卷加入卷组。该过程首先创建物理卷,然后将物理卷加入卷组。
卷组的扩容相当简单,一般是 LVM 空间不够时,添加一块新硬盘时使用。
增加一块磁盘 /dev/sdc
代码语言:javascript复制> lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 39G 0 part
├─centos-root 253:0 0 35.1G 0 lvm /
└─centos-swap 253:1 0 3.9G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
├─datavg-lv1 253:2 0 2.7G 0 lvm /opt/lv1
└─datavg-lv2 253:3 0 9G 0 lvm
sdc 8:32 0 1G 0 disk
扩容
代码语言:javascript复制> vgextend datavg /dev/sdc
Physical volume "/dev/sdc" successfully created.
Volume group "datavg" successfully extended
> pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <39.00g 4.00m
/dev/sdb datavg lvm2 a-- <20.00g <8.34g
/dev/sdc datavg lvm2 a-- 1020.00m 1020.00m
> vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <39.00g 4.00m
datavg 2 2 0 wz--n- 20.99g 9.33g
卷组(VG)缩容
当硬盘空间不足时,就需要减少卷组占用的空间。如果删除的物理卷存有数据,需要先把数据移动到其他物理卷(保证有足够的空间存储数据)。pvmove
命令可以迁移物理卷的数据,在不指定目标卷的情况下,系统默认把数据迁移到临近的物理卷。例如,将 /dev/sdb
中的数据迁移出去,默认迁移到 /dev/sdc
。
迁移数据
代码语言:javascript复制> pvmove /dev/sdb
使用 vgreduce
命令从卷组中删除 /dev/sdc
物理卷
> vgreduce datavg /dev/sdc
Removed "/dev/sdc" from volume group "datavg"
LVM 快照应用环境
快照的主要作用是保留数据在某一刻的状态,磁盘快照文件和系统所对应的虚拟磁盘本身大小不一样,快照比原数据小很多。
LVM 提供逻辑卷快照功能,用户可以在某个时间点创建一个逻辑卷副本,它也占用卷组的存储空间,称为快照卷,快照卷与原始的逻辑卷必须在同一个卷组。快照卷是一种特殊的逻辑卷,它可以挂载在设备上。lvcreate
命令可以创建一个快照,-s
参数指定逻辑卷,
> lvcreate -L 100M -n centos-snap -s /dev/centos/root
Logical volume "centos-snap" created.
使用 lvscan
命令查看新创建的快照卷。
> lvscan
ACTIVE '/dev/centos/swap' [<3.88 GiB] inherit
ACTIVE Original '/dev/centos/root' [<35.12 GiB] inherit
ACTIVE Snapshot '/dev/centos/centos-snap' [100.00 MiB] inherit
在 /mnt
目录下创建一个挂载点 centos-snap
,将快照卷挂载在上面,并设置为只读,以免破坏快照中的数据。
> lvscan
ACTIVE '/dev/centos/swap' [<3.88 GiB] inherit
ACTIVE Original '/dev/centos/root' [<35.12 GiB] inherit
ACTIVE Snapshot '/dev/centos/centos-snap' [100.00 MiB] inherit
在 /mnt
目录下创建一个挂载点 centos-snap,将快照卷挂载在上面,并设置为只读,以免破坏快照卷中的数据。
> mkdir /mnt/centos-snap
> mount -o ro /dev/centos/centos-snap /mnt/centos-snap
查看原来的数据
代码语言:javascript复制> ls /mnt/centos-snap
删除 LVM
删除 LVM 步骤:
umount
卸载- 删除
/etc/fstab
文件下的永久挂载 lvremove
移除逻辑卷(LV)vgremove
移除卷组(VG)pvremove
移除物理卷(PV)
代码语言:javascript复制下面只展示命令,具体细节可自行执行删除。
> umount /opt/lv1
> vim /etc/fstab
> lvremove /dev/datavg/lv1
Do you really want to remove active logical volume datavg/lv1? [y/n]: y
Logical volume "lv1" successfully removed
> vgremove datavg
> pvremove /dev/sdb
参考
- Linux LVM详解
- Linux 磁盘管理 | 菜鸟教程