Linux 逻辑卷管理

环境准备

虚拟机添加 3 块 20G 硬盘:sdbsdcsdd

[root@centos7 ~]# lsblk /dev/sd{b..d}
NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb    8:16  0   20G  0 disk
sdc    8:32  0   20G  0 disk
sdd    8:48  0   20G  0 disk

逻辑卷基本管理

硬盘分区管理方案缺点

  • 硬盘分区空间必须使用连续空间,扩容很麻烦,特别是要扩容的分区后面没有剩余空间时。
  • 使用硬盘分区创建的文件系统不能跨多个硬盘,受单个硬盘容量限制;如果硬盘损坏,文件系统中的数据也会丢失。

逻辑卷管理方案优点

  • 使用逻辑卷可以更加灵活地扩展和缩减文件系统空间。
  • 使用逻辑卷创建的文件系统可以跨多个硬盘,适合创建超大容量文件系统。
  • 使用逻辑卷可以创建镜像卷,保证数据的冗余性;即使单个硬盘损坏,文件系统中的数据也不会丢失。
  • 使用逻辑卷还可以创建快照,保留某一时刻的数据,就像虚拟机快照一样。

逻辑卷基本概念

LVM 是 Logical Volume Manager(逻辑卷管理)的简写。LVM 将若干个磁盘或磁盘分区连接为一个整块的卷组,形成一个存储池。管理员可以在卷组上任意创建逻辑卷,并进一步在逻辑卷上创建文件系统。
在这里插入图片描述

在这里插入图片描述

概念 说明
物理卷(PV, Physical Volume) LVM 的基本存储逻辑块,通过块设备创建。块设备是指磁盘、磁盘分区或从逻辑上和磁盘分区具有同样功能的设备(如 RAID)。与基本的物理存储介质相比,物理卷包含有和 LVM 相关的管理参数。
卷组(VG, Volume Group) 一个逻辑的存储空间,由一个或多个物理卷组成。
逻辑卷(LV, Logical Volume) 从卷组中创建出来的逻辑空间。如果把卷组类比为一个逻辑硬盘,那么逻辑卷则可以类比为一个硬盘分区,也可以在逻辑卷之上创建文件系统。

简单地说:卷组由多个物理卷组成,可以在卷组中创建多个逻辑卷,对逻辑卷创建文件系统给用户使用。

LVM 管理基本流程

  1. 创建物理卷
  2. 创建卷组
  3. 创建逻辑卷
    在这里插入图片描述

创建物理卷

# 创建单个 PV
[root@centos7 ~]# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.

# 一次创建多个 PV
[root@centos7 ~]# pvcreate /dev/sd{c,d}
Physical volume "/dev/sdc" successfully created.
Physical volume "/dev/sdd" successfully created.

# 查看 PV 列表
[root@centos7 ~]# pvs
  PV         VG Fmt  Attr PSize   PFree
  /dev/sdb      lvm2 ---  20.00g 20.00g
  /dev/sdc      lvm2 ---  20.00g 20.00g
  /dev/sdd      lvm2 ---  20.00g 20.00g

# 查看单个 PV 详细信息
[root@centos7 ~]# 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               MBHW0w-OkJL-CasO-PYRR-sduS-U2m5-zdkQ5d

创建卷组

# 创建包含单个 PV 的 VG
[root@centos7 ~]# vgcreate webapp /dev/sdb
Volume group "webapp" successfully created

# 创建包含多个 PV 的 VG
[root@centos7 ~]# vgcreate dbapp /dev/sd{c,d}
Volume group "dbapp" successfully created

[root@centos7 ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree
  /dev/sdb   webapp lvm2 a--  <20.00g <20.00g
  /dev/sdc   dbapp  lvm2 a--  <20.00g <20.00g
  /dev/sdd   dbapp  lvm2 a--  <20.00g <20.00g

# 查看 VG 列表
[root@centos7 ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree
  dbapp    2   0   0 wz--n-  39.99g  39.99g
  webapp   1   0   0 wz--n- <20.00g <20.00g

# 查看单个 VG 详细信息
[root@centos7 ~]# vgdisplay dbapp
  --- Volume group ---
  VG Name               dbapp
  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(Physical Extend)是 PV 的最小存储单元,创建 VG 时可通过 -s 选项设置
  PE Size               4.00 MiB
  Total PE              10238
  Alloc PE / Size       0 / 0
  Free PE / Size        10238 / 39.99 GiB
  VG UUID               kjY26m-D0ax-WmMq-fMJv-1Tnb-imqh-GOAWkG

创建逻辑卷

# 在卷组 dbapp 中创建一个跨硬盘的逻辑卷:名称为 data01,大小为 25G
[root@centos7 ~]# lvcreate -n data01 -L 25G dbapp
Logical volume "data01" created.

# 在卷组 webapp 中创建一个逻辑卷:名称为 webapp01,大小为 5G
[root@centos7 ~]# lvcreate -n webapp01 -L 5G webapp
Logical volume "webapp01" created.

# 查看 LV 列表
[root@centos7 ~]# lvs
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  data01   dbapp  -wi-a----- 25.00g
  webapp01 webapp -wi-a-----  5.00g

逻辑卷设备名支持以下三种格式:

  • /dev/vgname/lvname
  • /dev/mapper/vgname-lvname
  • /dev/dm-N
[root@centos7 ~]# ls -l /dev/dbapp/data01 /dev/mapper/dbapp-data01
lrwxrwxrwx 1 root root 7 617 18:26 /dev/dbapp/data01 -> ../dm-4
lrwxrwxrwx 1 root root 7 617 18:26 /dev/mapper/dbapp-data01 -> ../dm-4

# 查看单个 LV 详细信息
[root@centos7 ~]# lvdisplay /dev/dbapp/data01
  --- Logical volume ---
  LV Path                /dev/dbapp/data01
  LV Name                data01
  VG Name                dbapp
  LV UUID                W8UafB-A7RJ-dBjM-bsA2-8Obc-p8gE-bMZgmm
  LV Write Access        read/write
  LV Creation host, time centos7.linux.com, 2022-12-26 11:42:40 +0800
  LV Status              available
  # open                 0
  LV Size                25.00 GiB
  # LE(Logical Extend)是 LV 的最小存储单元,通常一个 LE 对应于一个 PE
  Current LE             6400
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:4

[root@centos7 ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree
  /dev/sdb   webapp lvm2 a--  <20.00g <15.00g
  /dev/sdc   dbapp  lvm2 a--  <20.00g      0
  /dev/sdd   dbapp  lvm2 a--  <20.00g  14.99g

# 可以看到逻辑卷 /dev/dbapp/data01 空间横跨 2 个硬盘
[root@centos7 ~]# lsblk /dev/sd{b..d}
NAME              MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb                 8:16  0   20G  0 disk
└─webapp-webapp01   253:3  0    5G  0 lvm
sdc                 8:32  0   20G  0 disk
└─dbapp-data01      253:4  0   25G  0 lvm
sdd                 8:48  0   20G  0 disk
└─dbapp-data01      253:4  0   25G  0 lvm

可以看到:物理卷 /dev/sdc 空间已使用完,物理卷 /dev/sdd 空间已使用 5G。


创建文件系统

[root@centos7 ~]# mkfs.xfs /dev/webapp/webapp01
[root@centos7 ~]# mount /dev/webapp/webapp01 /var/www/html

基于 LVM 的文件系统持久化挂载,需要修改 /etc/fstab 文件。


清理

# 卸载文件系统
[root@centos7 ~]# umount /dev/webapp/webapp01

# 删除 LV
[root@centos7 ~]# lvremove /dev/webapp/webapp01 /dev/dbapp/data01
Do you really want to remove active logical volume webapp/webapp01? [y/n]: y
Logical volume "webapp01" successfully removed
Do you really want to remove active logical volume dbapp/data01? [y/n]: y
Logical volume "data01" successfully removed

# 删除 VG
[root@centos7 ~]# vgremove webapp dbapp
Volume group "webapp" successfully removed
Volume group "dbapp" successfully removed

# 删除 PV
[root@centos7 ~]# 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.

扩展和缩减卷组

环境准备

# 创建卷组(如果指定的块设备不是物理卷,则会先将块设备创建为物理卷)
[root@centos7 ~]# vgcreate webapp /dev/sdb
Physical volume "/dev/sdb" successfully created.
Volume group "webapp" successfully created

# 创建逻辑卷
[root@centos7 ~]# lvcreate -n webapp01 -L 10G webapp
Logical volume "webapp01" created.

扩展卷组

如果卷组空间不足,可以通过添加新的物理卷到卷组中,以扩展卷组容量。

[root@centos7 ~]# vgextend webapp /dev/sd{c,d}
Physical volume "/dev/sdc" successfully created.
Physical volume "/dev/sdd" successfully created.
Volume group "webapp" successfully extended

缩减卷组

如果卷组空间中有多余的物理卷,或者物理卷容量小需要更换,则可以将物理卷从卷组中剔除。删除物理卷前需确保物理卷不在使用中。

# 将物理卷 /dev/sdb 从卷组 webapp 中剔除,则会报错
[root@centos7 ~]# vgreduce webapp /dev/sdb
Physical volume "/dev/sdb" still in use

# 解决方法:将物理卷 /dev/sdb 中数据移动到卷组中其他物理卷
[root@centos7 ~]# pvmove /dev/sdb

# 查看物理卷使用状态
[root@centos7 ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree
  /dev/sdb   webapp lvm2 a--  <20.00g <10.00g   # /dev/sdb 在使用
  /dev/sdc   webapp lvm2 a--  <20.00g <20.00g
  /dev/sdd   webapp lvm2 a--  <20.00g <20.00g

# 或者移动到卷组中特定物理卷
[root@centos7 ~]# pvmove /dev/sdb /dev/sdd
/dev/sdb: Moved: 0.51%
/dev/sdb: Moved: 100.00%

# 查看物理卷使用状态
[root@centos7 ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree
  /dev/sdb   webapp lvm2 a--  <20.00g <20.00g   # /dev/sdb 不在使用
  /dev/sdc   webapp lvm2 a--  <20.00g <20.00g
  /dev/sdd   webapp lvm2 a--  <20.00g <10.00g   # /dev/sdd 在使用

# 再次剔除,成功
[root@centos7 ~]# vgreduce webapp /dev/sdb
Removed "/dev/sdb" from volume group "webapp"

[root@centos7 ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree
  /dev/sdb      lvm2 ---   20.00g  20.00g
  /dev/sdc   webapp lvm2 a--  <20.00g <20.00g
  /dev/sdd   webapp lvm2 a--  <20.00g <10.00g

扩展和缩减逻辑卷

扩展逻辑卷

如果逻辑卷空间不足,在卷组空间充足的情况下,可以扩展逻辑卷空间。

[root@centos7 ~]# lvs /dev/webapp/webapp01
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  webapp01 webapp -wi-a----- 10.00g

# 逻辑卷增加 2G 空间
[root@centos7 ~]# lvextend -L +2G /dev/webapp/webapp01
Size of logical volume webapp/webapp01 changed from 10.00 GiB (2560 extents) to 12.00 GiB (3072 extents).
Logical volume webapp/webapp01 successfully resized.

[root@centos7 ~]# lvs /dev/webapp/webapp01
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  webapp01 webapp -wi-a----- 12.00g

缩减逻辑卷

如果逻辑卷空间充足,希望将多余的空间缩减出来另作他用,也可以缩减逻辑卷空间。

[root@centos7 ~]# lvs /dev/webapp/webapp01
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  webapp01 webapp -wi-a----- 12.00g

[root@centos7 ~]# lvreduce -L -2G /dev/webapp/webapp01
WARNING: Reducing active logical volume to 10.00 GiB.
         THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce webapp/webapp01? [y/n]: y
Size of logical volume webapp/webapp01 changed from 12.00 GiB (3072 extents) to 10.00 GiB (2560 extents).
Logical volume webapp/webapp01 successfully resized.

[root@centos7 ~]# lvs /dev/webapp/webapp01
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  webapp01 webapp -wi-a----- 10.00g

扩展和缩减文件系统

扩展 XFS 文件系统

XFS 文件系统只支持扩展不支持缩减

环境准备: 格式化文件系统,并创建数据。

[root@centos7 ~]# mkfs.xfs /dev/webapp/webapp01
[root@centos7 ~]# mkdir /var/www/html
[root@centos7 ~]# mount /dev/webapp/webapp01 /var/www/html
[root@centos7 ~]# cp /etc/host* /var/www/html
[root@centos7 ~]# ls /var/www/html
host.conf  hostname  hosts  hosts.allow  hosts.deny

第一步:扩展逻辑卷

[root@centos7 ~]# lvextend -L 15G /dev/webapp/webapp01
[root@centos7 ~]# lvs /dev/webapp/webapp01
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  webapp01 webapp -wi-ao---- 15.00g

第二步:扩展文件系统

[root@centos7 ~]# xfs_growfs /var/www/html
[root@centos7 ~]# df -h /var/www/html
文件系统                      容量  已用  可用 已用% 挂载点
/dev/mapper/webapp-webapp01    15G  140M   15G    1% /var/www/html

[root@centos7 ~]# ls /var/www/html
host.conf  hostname  hosts  hosts.allow  hosts.deny

块设备和文件系统一并扩展:

[root@centos7 ~]# lvextend -rL 20G /dev/webapp/webapp01
[root@centos7 ~]# lvs /dev/webapp/webapp01
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  webapp01 webapp -wi-ao---- 20.00g

[root@centos7 ~]# df -h /var/www/html
文件系统                      容量  已用  可用 已用% 挂载点
/dev/mapper/webapp-webapp01    20G  176M   20G    1% /var/www/html

扩展 EXT4 文件系统

EXT4 文件系统既支持扩展,也支持缩减。

环境准备: 格式化文件系统,并创建数据。

[root@centos7 ~]# mkfs.ext4 /dev/webapp/webapp01
[root@centos7 ~]# mount /dev/webapp/webapp01 /var/www/html
[root@centos7 ~]# cp /etc/host* /var/www/html
[root@centos7 ~]# ls /var/www/html
host.conf  hostname  hosts  hosts.allow  hosts.deny

第一步:扩展逻辑卷

[root@centos7 ~]# lvextend -L 25G /dev/webapp/webapp01
[root@centos7 ~]# lvs /dev/webapp/webapp01
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  webapp01 webapp -wi-ao---- 25.00g

第二步:扩展文件系统

[root@centos7 ~]# resize2fs /dev/webapp/webapp01
[root@centos7 ~]# df -h /var/www/html
文件系统                      容量  已用  可用 已用% 挂载点
/dev/mapper/webapp-webapp01    25G   36K   24G    1% /var/www/html

[root@centos7 ~]# ls /var/www/html
host.conf  hostname  hosts  hosts.allow  hosts.deny

块设备和文件系统一并扩展:

[root@centos7 ~]# lvextend -rL 30G /dev/webapp/webapp01
[root@centos7 ~]# lvs /dev/webapp/webapp01
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  webapp01 webapp -wi-ao---- 30.00g

[root@centos7 ~]# df -h /var/www/html
文件系统                      容量  已用  可用 已用% 挂载点
/dev/mapper/webapp-webapp01    30G   36K   28G    1% /var/www/html

缩减 EXT4 文件系统

注意事项:

  • 不支持在线缩减,必须卸载后缩减。
  • 缩减后的容量不能小于当前使用的容量。

ext4 减容流程:

  1. 卸载文件系统
  2. e2fsck 检查文件系统
  3. 缩减文件系统
  4. 缩减 LV
  5. 挂载测试

具体操作:

# 第一步:卸载文件系统
[root@centos7 ~]# umount /var/www/html

# 第二步:检测文件系统
[root@centos7 ~]# e2fsck -f /dev/webapp/webapp01
e2fsck 1.42.9 (28-Dec-2013)
第一步: 检查 inode, 块, 和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/webapp/webapp01: 14/1966080 文件(0.0% 为非连续的),167445/7864320 块

# 第三步:缩减文件系统
[root@centos7 ~]# resize2fs /dev/webapp/webapp01 10G
resize2fs 1.45.6 (20-Mar-2020)
将 /dev/webapp/webapp01 上的文件系统调整为 2621440 个块(每块 4k)。
/dev/webapp/webapp01 上的文件系统现在为 2621440 个块(每块 4k)。

# 第四步:缩减逻辑卷
[root@centos7 ~]# lvreduce -L 10G /dev/webapp/webapp01
WARNING: Reducing active logical volume to 10.00 GiB.
         THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce webapp/webapp01? [y/n]: y
Size of logical volume webapp/webapp01 changed from 30.00 GiB (7680 extents) to 10.00 GiB (2560 extents).
Logical volume webapp/webapp01 successfully resized.

# 第五步:挂载文件系统验证
[root@centos7 ~]# mount /dev/webapp/webapp01 /var/www/html
[root@centos7 ~]# df -h /var/www/html
文件系统                      容量  已用  可用 已用% 挂载点
/dev/mapper/webapp-webapp01   9.7G   36K  9.3G    1% /var/www/html

[root@centos7 ~]# ls /var/www/html
host.conf  hostname  hosts  lost+found

补充说明: 如果文件系统是构建在磁盘分区上,扩展和缩减文件系统容量的操作相同。


逻辑卷快照

可以使用快照记录 LV 中的数据,后续可以用来恢复数据。

# 创建快照(快照的容量不能小于 LV 容量)
[root@centos7 ~]# lvcreate -s -n webapp01-snap1 -L 10G /dev/webapp/webapp01
Logical volume "webapp01-snap1" created.

# 挂载快照
[root@centos7 ~]# mount /dev/webapp/webapp01-snap1 /webapp/webapp01/

# 查看数据
[root@centos7 ~]# ls /webapp/webapp01/
host.conf  hostname  hosts  hosts.allow  hosts.deny

# 创建新数据
[root@centos7 ~]# echo hello world > /webapp/webapp01/hello.txt
[root@centos7 ~]# cat /webapp/webapp01/hello.txt
hello world

RAID 逻辑卷

准备环境

[root@centos7 ~]# umount /webapp/webapp01
[root@centos7 ~]# umount /var/www/html
[root@centos7 ~]# lvremove /dev/webapp/webapp01*

创建 RAID1 逻辑卷

[root@centos7 ~]# lvcreate --type raid1 -n webapp01 -L 15G webapp
[root@centos7 ~]# mkfs.xfs /dev/webapp/webapp01
[root@centos7 ~]# mount /dev/webapp/webapp01 /var/www/html/
[root@centos7 ~]# cp /etc/ho* /var/www/html/

模拟故障

[root@centos7 ~]# dd if=/dev/zero of=/dev/sdd bs=1M count=256

此时文件系统仍可以正常访问:

[root@centos7 ~]# ls /var/www/html/
host.conf  hostname  hosts  hosts.allow  hosts.deny

[root@centos7 ~]# umount /var/www/html
[root@centos7 ~]# mount /dev/webapp/webapp01 /var/www/html/

修复 RAID

# 删除丢失的物理卷
[root@centos7 ~]# vgreduce --removemissing webapp --force

# 扫描物理卷变化
[root@centos7 ~]# pvscan

# 扩容回来
[root@centos7 ~]# vgextend webapp /dev/sdd

# 修复 RAID1 逻辑卷
[root@centos7 ~]# lvconvert --repair /dev/webapp/webapp01

# 验证结果
[root@centos7 ~]# pvs | grep webapp
  /dev/sdb   webapp lvm2 a--  <20.00g  <20.00g
  /dev/sdc   webapp lvm2 a--  <20.00g  <20.00g
  /dev/sdd   webapp lvm2 a--  <20.00g   4.99g

其他示例:创建 RAID5 逻辑卷

# 创建一个可用大小为 5GiB 的 RAID5 LV,3 条带,条带大小 64KiB,共使用 4 个设备(含 1 个校验盘)
lvcreate --type raid5 -L 5G -i 3 -I 64 -n mylv vg00
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐