
逻辑卷管理器(Logical volume Manager)是 Linux 系统用于对硬盘分区进行管理的一种机制,理论性较强,其创建初衷是为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上来讲是可行的,但是却可能造成数据的丢失。而 LVM 技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。这样一来,用户不必关心物理硬盘设备的低层架构和布局,就可以实现对硬盘分区的动态调整。
LVM 就是通过将底层的物理硬盘封装,然后以逻辑卷的方式呈现给上层应用。当我们对底层的物理硬盘进行操作时,不再是针对分区进行操作,而是通过逻辑卷对底层硬盘进行管理操作。

创建逻辑卷的过程是把若干物理卷整合到一起组成卷组,在卷组上重新划分出新的分区。

首先添加一个 20Gb 硬盘。
使用 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 diskBash
Copy
使用 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.00gBash
Copy
使用 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-xQlXH1Bash
Copy
使用 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.00gBash
Copy
使用 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-2WON8uBash
Copy
PE大,读取速度快,但浪费空间。反之,读取速度慢,但节省空间。类似于 socket
使用 lvcreate 创建LV。
lvcreate -n lvname -L lvsize(M,G) vgname> 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                                                 Bash
Copy
使用 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:2Bash
Copy
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: 完成Bash
Copy
使用 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/lv1Bash
Copy
可以看到挂载成功了,但是重启后又需要挂载。
我们可以编辑
/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/lv1Bash
Copy
逻辑卷最大的优点是可以弹性调节容量,逻辑卷存储空间不足时,就需要扩容。 若逻辑卷需要扩容,首先查看其所属的卷组,例如,lv1属于datavg卷组;再查看卷组空间空闲量,datavg卷组可用量为 10.12g。
> 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.12gBash
Copy
在确认有多余空间的情况下,使用 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.Bash
Copy
查看大小
> 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                                                 Bash
Copy
通过 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/lv1Bash
Copy
这是因为文件系统也需要扩容。
resize2fs [逻辑卷名称] 挂载点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.Bash
Copy
再次查看扩容成功了
> 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.Bash
Copy
也可以使用
lvextend命令的-r选项来使文件系统自动扩容
逻辑卷扩容时,若卷组中没有足够的存储空间,就需要增加卷组的容量。vgextend 命令可以将新的物理卷加入卷组。该过程首先创建物理卷,然后将物理卷加入卷组。
卷组的扩容相当简单,一般是 LVM 空间不够时,添加一块新硬盘时使用。
增加一块磁盘 /dev/sdc
> 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 diskBash
Copy
扩容
> 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.33gBash
Copy
当硬盘空间不足时,就需要减少卷组占用的空间。如果删除的物理卷存有数据,需要先把数据移动到其他物理卷(保证有足够的空间存储数据)。pvmove 命令可以迁移物理卷的数据,在不指定目标卷的情况下,系统默认把数据迁移到临近的物理卷。例如,将 /dev/sdb 中的数据迁移出去,默认迁移到 /dev/sdc。
迁移数据
> pvmove /dev/sdbBash
Copy
使用 vgreduce 命令从卷组中删除 /dev/sdc物理卷
> vgreduce datavg /dev/sdc
  Removed "/dev/sdc" from volume group "datavg"Bash
Copy
快照的主要作用是保留数据在某一刻的状态,磁盘快照文件和系统所对应的虚拟磁盘本身大小不一样,快照比原数据小很多。
LVM 提供逻辑卷快照功能,用户可以在某个时间点创建一个逻辑卷副本,它也占用卷组的存储空间,称为快照卷,快照卷与原始的逻辑卷必须在同一个卷组。快照卷是一种特殊的逻辑卷,它可以挂载在设备上。lvcreate 命令可以创建一个快照,-s 参数指定逻辑卷,
> lvcreate -L 100M -n centos-snap -s /dev/centos/root
  Logical volume "centos-snap" created.Bash
Copy
使用 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] inheritBash
Copy
在 /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] inheritBash
Copy
在 /mnt 目录下创建一个挂载点 centos-snap,将快照卷挂载在上面,并设置为只读,以免破坏快照卷中的数据。
> mkdir /mnt/centos-snap
> mount -o ro /dev/centos/centos-snap /mnt/centos-snapBash
Copy
查看原来的数据
> ls /mnt/centos-snapBash
Copy
删除 LVM 步骤:
umount 卸载/etc/fstab 文件下的永久挂载lvremove 移除逻辑卷(LV)vgremove 移除卷组(VG)pvremove 移除物理卷(PV)下面只展示命令,具体细节可自行执行删除。
> 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/sdbBash
Copy