磁盘管理 - Linux系统磁盘进阶

1. LVM概述

1.1 LVM基本概念

LVM (Logical Volume Manager) 逻辑卷管理器,是Linux环境下对磁盘分区进行管理的一种机制。

LVM组成:

  • 物理卷(PV): 把常规的块设备(硬盘,分区等可以读写数据的设备)通过pvcreate命令对其进行初始化,就成了物理卷
  • 卷组(VG): 把多个物理卷的容量组成一个逻辑整体,可以从里面灵活分配容量
  • 逻辑卷(LV): 从卷组中划分部分空间成为一个可以读写数据的逻辑单元。需要对其格式化然后挂载使用

1.2 LVM架构图

1
2
物理磁盘 → 物理卷(PV) → 卷组(VG) → 逻辑卷(LV) → 文件系统 → 挂载使用
/dev/sdb /dev/sdb datavg /dev/datavg/lv1 xfs/ext4 /data

1.3 LVM优势

  1. 灵活扩容: 可以在线扩容,无需卸载文件系统
  2. 动态管理: 可以动态调整逻辑卷大小
  3. 跨磁盘: 可以将多个物理磁盘组成一个逻辑卷
  4. 快照功能: 支持快照备份
  5. 在线迁移: 支持在线数据迁移

1.4 LVM与普通分区对比

特性 普通分区 LVM逻辑卷
扩容 困难,需要重新分区 简单,在线扩容
跨磁盘 不支持 支持
动态调整 不支持 支持
快照 不支持 支持
管理复杂度 简单 相对复杂

2. 部署逻辑卷

2.1 创建过程

创建逻辑卷的基本流程:

  1. 创建物理卷: 添加物理磁盘
  2. 创建卷组: 添加物理卷加入到该卷组
  3. 在卷组中划分逻辑卷: 创建逻辑卷
  4. 格式化并挂载: 格式化文件系统并挂载使用

2.2 步骤0: 准备物理磁盘

1
2
3
4
5
# 查看可用磁盘
[root@linux-node1 ~]# lsblk |grep "sd[bcd]"
sdb 8:16 0 1G 0 disk
sdc 8:32 0 1G 0 disk
sdd 8:48 0 1G 0 disk

2.3 步骤1: 将磁盘加入PV

1
2
3
4
5
6
7
8
9
10
11
# 创建物理卷
[root@linux-node1 ~]# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.

# 检查pv创建情况
[root@linux-node1 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb lvm2 --- 1.00g 1.00g

# 查看物理卷详细信息
[root@linux-node1 ~]# pvdisplay

批量创建物理卷:

1
2
3
4
5
# 创建多个物理卷
pvcreate /dev/sdb /dev/sdc /dev/sdd

# 或使用通配符
pvcreate /dev/sd[bcd]

2.4 步骤2: 创建名为datavg的卷组

1
2
3
4
5
6
7
8
9
10
11
# 创建卷组
[root@linux-node1 ~]# vgcreate datavg /dev/sdb
Volume group "datavg" successfully created

# 检查卷组
[root@linux-node1 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
datavg 1 0 0 wz--n- 1020.00m 1020.00m

# 查看卷组详细信息
[root@linux-node1 ~]# vgdisplay

创建卷组时指定PE大小:

1
2
# 默认PE大小为4MB,可以自定义
vgcreate -s 8M datavg /dev/sdb

2.5 步骤3: 创建逻辑卷

1
2
3
4
5
6
7
8
9
10
# 创建逻辑卷, 分配名称, 以及大小, 指定卷组
[root@linux-node1 ~]# lvcreate -L 100M -n lv1 datavg
Logical volume "lv1" created.

# 检查逻辑卷
[root@linux-node1 ~]# lvscan
ACTIVE '/dev/datavg/lv1' [100.00 MiB] inherit

# 查看逻辑卷详细信息
[root@linux-node1 ~]# lvdisplay

lvcreate常用选项:

选项 功能 示例
-L 指定逻辑卷大小 -L 100M
-l 指定PE数量 -l 25
-n 指定逻辑卷名称 -n lv1
-s 创建快照 -s -n snap1

创建逻辑卷的多种方式:

1
2
3
4
5
6
7
8
# 方式1: 指定大小
lvcreate -L 100M -n lv1 datavg

# 方式2: 使用百分比
lvcreate -l 50%VG -n lv1 datavg

# 方式3: 使用剩余空间
lvcreate -l 100%FREE -n lv1 datavg

2.6 步骤4: 格式化文件系统

1
2
3
4
5
# 格式化文件系统
[root@linux-node1 ~]# mkfs.xfs /dev/datavg/lv1

# 或格式化为ext4
[root@linux-node1 ~]# mkfs.ext4 /dev/datavg/lv1

2.7 步骤5: 挂载并使用

1
2
3
4
5
6
7
8
9
10
11
# 创建挂载点
[root@linux-node1 ~]# mkdir /lv1

# 挂载逻辑卷
[root@linux-node1 ~]# mount /dev/datavg/lv1 /lv1/

# 查看挂载情况
[root@linux-node1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/mapper/datavg-lv1 97M 5.2M 92M 6% /lv1

2.8 完整部署脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
# LVM逻辑卷完整部署脚本

# 1. 创建物理卷
pvcreate /dev/sdb /dev/sdc /dev/sdd

# 2. 创建卷组
vgcreate datavg /dev/sdb /dev/sdc /dev/sdd

# 3. 创建逻辑卷
lvcreate -L 500M -n lv1 datavg

# 4. 格式化
mkfs.xfs /dev/datavg/lv1

# 5. 创建挂载点并挂载
mkdir -p /lv1
mount /dev/datavg/lv1 /lv1

# 6. 永久挂载
echo "/dev/datavg/lv1 /lv1 xfs defaults 0 0" >> /etc/fstab

# 7. 验证
df -h |grep lv1

3. 卷组池管理

3.1 扩展卷组VG

扩展卷组VG, 扩大VG卷组容量。

步骤1: 新硬盘加入PV

1
2
3
# 创建新的物理卷
[root@linux-node1 ~]# pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created.

步骤2: 使用vgextend扩展

1
2
3
4
5
6
7
8
# 扩展卷组
[root@linux-node1 ~]# vgextend datavg /dev/sdc
Volume group "datavg" successfully extended

# 验证扩展结果
[root@linux-node1 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
datavg 2 1 0 wz--n- <2.00g <1.90g

3.2 移除卷组VG

移除vg组中某一块硬盘。

1
2
3
4
5
# 移除卷组中的物理卷
[root@linux-node1 ~]# vgreduce datavg /dev/sdb
Removed "/dev/sdb" from volume group "datavg"

# 注意:移除前需要确保该PV上没有数据,或先迁移数据

3.3 数据迁移卷组VG

同一卷组的磁盘才可以进行在线迁移。

步骤1: 检查当前逻辑卷VG中PV使用情况

1
2
3
4
[root@linux-node1 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb vg1 lvm2 a-- 2.00g 1.76g
/dev/sdc vg1 lvm2 a-- 2.00g 2.00g

步骤2: pvmove在线数据迁移至其他pv

1
2
3
4
# 将/dev/sdb上的数据迁移到其他PV
[root@linux-node1 ~]# pvmove /dev/sdb
/dev/sdb: Moved: 41.33%
/dev/sdb: Moved: 100.00%

步骤3: 检查是否将sdb数据迁移至sdc

1
2
3
4
[root@linux-node1 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb vg1 lvm2 a-- 2.00g 2.00g
/dev/sdc vg1 lvm2 a-- 2.00g 1.76g

数据迁移说明:

  • 迁移后,/dev/sdb的数据已全部迁移到/dev/sdc
  • /dev/sdb现在完全空闲,可以安全移除

3.4 卷组管理命令总结

命令 功能 示例
vgcreate 创建卷组 vgcreate datavg /dev/sdb
vgextend 扩展卷组 vgextend datavg /dev/sdc
vgreduce 缩小卷组 vgreduce datavg /dev/sdb
vgremove 删除卷组 vgremove datavg
vgs 查看卷组 vgs
vgdisplay 查看卷组详细信息 vgdisplay
pvmove 迁移PV数据 pvmove /dev/sdb

4. 扩容逻辑卷

逻辑卷的扩展, 取决于vg卷中剩余多少容量, 扩展容量不能超过卷组VG。

4.1 查看卷组剩余空间

1
2
3
[root@server0 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg1 2 2 0 wz--n- 1.88g 1.00g

4.2 扩展LV逻辑卷

方式1: 增加指定大小

1
2
3
4
5
6
# 增加800M分配给逻辑卷(注意: +800M 表示增加800M)
[root@linux-node1 ~]# lvextend -L +800M /dev/datavg/lv1
Size of logical volume datavg/lv1 changed from 100.00 MiB (25 extents) to 900.00 MiB (225 extents).
Logical volume datavg/lv1 successfully resized.

# 注意:+800M 表示增加,800M 表示设置为800M

方式2: 使用百分比

1
2
3
4
# 分配磁盘池中多少百分比给逻辑卷
[root@linux-node1 ~]# lvextend -l +50%FREE /dev/datavg/lv1

# 使用剩余空间的50%

方式3: 使用剩余全部空间

1
2
# 使用卷组中所有剩余空间
lvextend -l +100%FREE /dev/datavg/lv1

4.3 扩展文件系统

扩展逻辑卷后,需要扩展文件系统才能使用新增的空间。

XFS文件系统扩容

1
2
3
4
5
6
7
8
9
10
11
12
# xfs扩容(在线扩容,无需卸载)
[root@server0 ~]# xfs_growfs /dev/datavg/lv1
meta-data=/dev/mapper/datavg-lv1 isize=512 agcount=4, agsize=6400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=25600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 25600 to 230400

EXT4文件系统扩容

1
2
3
4
5
6
# ext4扩容(在线扩容,无需卸载)
[root@server0 ~]# resize2fs /dev/datavg/lv1
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/datavg/lv1 is mounted on /lv1; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/datavg/lv1 is now 230400 blocks long.

4.4 扩容完整流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 查看当前使用情况
df -h /lv1

# 2. 扩展逻辑卷
lvextend -L +800M /dev/datavg/lv1

# 3. 扩展文件系统(xfs)
xfs_growfs /dev/datavg/lv1

# 或扩展文件系统(ext4)
resize2fs /dev/datavg/lv1

# 4. 验证扩容结果
df -h /lv1

4.5 扩容注意事项

  1. XFS文件系统: 只能扩容,不能缩小
  2. EXT4文件系统: 可以扩容和缩小
  3. 在线扩容: 两种文件系统都支持在线扩容,无需卸载
  4. 空间检查: 扩容前检查卷组剩余空间

5. 缩小逻辑卷

注意: 只有EXT4文件系统支持缩小,XFS文件系统不支持缩小。

5.1 缩小EXT4逻辑卷步骤

步骤1: 创建测试环境

1
2
3
4
5
6
# 创建1G的逻辑卷作为裁剪的对象
lvcreate -n uplooking -L 1G finance
mkfs.ext4 /dev/finance/uplooking
mkdir /finance/uplooking
mount /dev/finance/uplooking /finance/uplooking/
cp /etc/host* /finance/uplooking/

步骤2: 卸载文件系统

1
2
# 如果已经挂载,必须先卸载
umount /dev/finance/uplooking

步骤3: 检测文件系统

1
2
3
4
5
# 裁剪容量,必须是先检测文件系统
fsck -f /dev/finance/uplooking

# 缩小文件系统到512M
resize2fs /dev/finance/uplooking 512M

步骤4: 裁剪逻辑卷容量

1
2
3
4
5
# 调整完毕后采取裁剪逻辑卷容量
lvreduce -L 512M /dev/finance/uplooking
WARNING: Reducing active logical volume to 512.00 MiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce uplooking? [y/n]: y

步骤5: 再次检测文件系统

1
2
# 强烈建议裁剪后,再次检测文件系统
fsck -f /dev/finance/uplooking

步骤6: 挂载测试

1
2
3
4
5
# 如果能够挂载,一般说明裁剪成功,文件系统没有损坏
mount /dev/finance/uplooking /mnt
df -h |grep uplooking
# /dev/mapper/finance-uplooking 472M 1.6M 435M 1% /mnt
# 而且文件系统容量被刷新了

5.2 缩小逻辑卷完整流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
# 缩小EXT4逻辑卷脚本

# 1. 卸载文件系统
umount /dev/finance/uplooking

# 2. 检测文件系统
fsck -f /dev/finance/uplooking

# 3. 缩小文件系统
resize2fs /dev/finance/uplooking 512M

# 4. 缩小逻辑卷
lvreduce -L 512M /dev/finance/uplooking

# 5. 再次检测文件系统
fsck -f /dev/finance/uplooking

# 6. 挂载测试
mount /dev/finance/uplooking /mnt
df -h |grep uplooking

5.3 缩小注意事项

  1. XFS不支持缩小: XFS文件系统不支持缩小操作
  2. 必须先缩小文件系统: 缩小逻辑卷前必须先缩小文件系统
  3. 数据备份: 缩小操作有风险,建议先备份数据
  4. 卸载文件系统: 缩小前必须卸载文件系统
  5. 文件系统检测: 缩小前后都要检测文件系统

6. 删除逻辑卷

6.1 删除逻辑卷步骤

步骤1: 卸载文件系统

1
2
# 卸载逻辑卷
umount /dev/datavg/lv1

步骤2: 删除逻辑卷

1
2
3
4
# 删除逻辑卷
lvremove /dev/datavg/lv1
Do you really want to remove active logical volume "lv1"? [y/n]: y
Logical volume "lv1" successfully removed

步骤3: 验证删除

1
2
3
4
5
# 查看逻辑卷列表
lvscan

# 查看卷组信息
vgs

6.2 删除卷组

1
2
3
# 删除卷组(必须先删除所有逻辑卷)
vgremove datavg
Volume group "datavg" successfully removed

6.3 删除物理卷

1
2
3
# 删除物理卷
pvremove /dev/sdb
Labels on physical volume "/dev/sdb" successfully wiped.

6.4 完整删除流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
# 完整删除LVM流程

# 1. 卸载所有逻辑卷
umount /dev/datavg/lv1
umount /dev/datavg/lv2

# 2. 删除所有逻辑卷
lvremove /dev/datavg/lv1
lvremove /dev/datavg/lv2

# 3. 删除卷组
vgremove datavg

# 4. 删除物理卷
pvremove /dev/sdb /dev/sdc /dev/sdd

# 5. 验证
pvs
vgs
lvs

7. LVM快照

7.1 快照概述

LVM快照是逻辑卷的一个时间点副本,可以用于备份和恢复。

7.2 创建快照

1
2
3
4
5
6
7
# 创建快照
lvcreate -L 100M -s -n lv1-snap /dev/datavg/lv1

# 参数说明:
# -L: 快照大小(建议为原逻辑卷的10-20%)
# -s: 创建快照
# -n: 快照名称

7.3 挂载快照

1
2
3
# 挂载快照
mkdir /snap
mount /dev/datavg/lv1-snap /snap

7.4 删除快照

1
2
3
4
5
# 卸载快照
umount /snap

# 删除快照
lvremove /dev/datavg/lv1-snap

8. LVM管理命令总结

8.1 物理卷(PV)命令

命令 功能 示例
pvcreate 创建物理卷 pvcreate /dev/sdb
pvremove 删除物理卷 pvremove /dev/sdb
pvs 查看物理卷 pvs
pvdisplay 查看物理卷详细信息 pvdisplay
pvmove 迁移物理卷数据 pvmove /dev/sdb

8.2 卷组(VG)命令

命令 功能 示例
vgcreate 创建卷组 vgcreate datavg /dev/sdb
vgextend 扩展卷组 vgextend datavg /dev/sdc
vgreduce 缩小卷组 vgreduce datavg /dev/sdb
vgremove 删除卷组 vgremove datavg
vgs 查看卷组 vgs
vgdisplay 查看卷组详细信息 vgdisplay

8.3 逻辑卷(LV)命令

命令 功能 示例
lvcreate 创建逻辑卷 lvcreate -L 100M -n lv1 datavg
lvextend 扩展逻辑卷 lvextend -L +100M /dev/datavg/lv1
lvreduce 缩小逻辑卷 lvreduce -L 512M /dev/datavg/lv1
lvremove 删除逻辑卷 lvremove /dev/datavg/lv1
lvscan 查看逻辑卷 lvscan
lvdisplay 查看逻辑卷详细信息 lvdisplay

8.4 文件系统扩展命令

命令 功能 文件系统 示例
xfs_growfs 扩展XFS文件系统 XFS xfs_growfs /dev/datavg/lv1
resize2fs 扩展/缩小EXT文件系统 EXT2/3/4 resize2fs /dev/datavg/lv1

9. LVM实战案例

9.1 案例1: 在线扩容生产环境数据盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# 生产环境在线扩容脚本

# 1. 查看当前使用情况
df -h /data
vgs

# 2. 扩展逻辑卷(增加500G)
lvextend -L +500G /dev/datavg/data_lv

# 3. 扩展文件系统(XFS)
xfs_growfs /dev/datavg/data_lv

# 4. 验证
df -h /data

9.2 案例2: 迁移数据更换磁盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
# 迁移数据更换磁盘脚本

# 1. 添加新磁盘
pvcreate /dev/sde

# 2. 扩展卷组
vgextend datavg /dev/sde

# 3. 迁移数据
pvmove /dev/sdb /dev/sde

# 4. 从卷组移除旧磁盘
vgreduce datavg /dev/sdb

# 5. 删除旧物理卷
pvremove /dev/sdb

9.3 案例3: 创建LVM快照备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
# 创建快照备份脚本

# 1. 创建快照
lvcreate -L 10G -s -n mysql-snap /dev/datavg/mysql_lv

# 2. 挂载快照
mkdir /backup/snap
mount /dev/datavg/mysql-snap /backup/snap

# 3. 备份数据
tar czf /backup/mysql-$(date +%Y%m%d).tar.gz /backup/snap/*

# 4. 卸载并删除快照
umount /backup/snap
lvremove /dev/datavg/mysql-snap

10. LVM最佳实践

10.1 规划建议

  1. 卷组命名: 使用有意义的名称(如datavg、appvg)
  2. 逻辑卷命名: 使用描述性名称(如mysql_lv、data_lv)
  3. PE大小: 默认4MB,大容量建议使用8MB或16MB
  4. 预留空间: 卷组中预留10-20%空间用于快照和扩容

10.2 性能优化

  1. 条带化: 对于多磁盘,使用条带化提高性能
  2. 镜像: 重要数据使用镜像提高可靠性
  3. 快照大小: 快照大小建议为原逻辑卷的10-20%

10.3 监控建议

  1. 定期检查: 使用vgslvs定期检查
  2. 空间监控: 监控逻辑卷使用率
  3. 性能监控: 监控LVM性能指标

11. LVM常见问题

11.1 问题1: 无法扩展逻辑卷

1
2
3
4
5
# 检查卷组剩余空间
vgs

# 如果空间不足,先扩展卷组
vgextend datavg /dev/sdc

11.2 问题2: XFS文件系统无法缩小

1
2
3
4
5
6
# XFS不支持缩小,只能扩容
# 如果需要缩小,需要:
# 1. 备份数据
# 2. 删除逻辑卷
# 3. 重新创建更小的逻辑卷
# 4. 恢复数据

11.3 问题3: 逻辑卷无法删除

1
2
3
4
5
6
# 检查是否被挂载
mount |grep lv1

# 卸载后删除
umount /dev/datavg/lv1
lvremove /dev/datavg/lv1

12. 命令快速参考

12.1 LVM完整流程命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建LVM
pvcreate /dev/sdb
vgcreate datavg /dev/sdb
lvcreate -L 100M -n lv1 datavg
mkfs.xfs /dev/datavg/lv1
mount /dev/datavg/lv1 /lv1

# 扩展LVM
vgextend datavg /dev/sdc
lvextend -L +100M /dev/datavg/lv1
xfs_growfs /dev/datavg/lv1

# 删除LVM
umount /lv1
lvremove /dev/datavg/lv1
vgremove datavg
pvremove /dev/sdb

12.2 查看命令

1
2
3
4
5
6
7
8
9
10
11
12
# 查看物理卷
pvs
pvdisplay

# 查看卷组
vgs
vgdisplay

# 查看逻辑卷
lvs
lvdisplay
lvscan

实战优化