LVM卷在线扩缩容及常用操作

在使用lvm前先了解下 LVM介绍及架构,直接开撸。

LVM卷使用

假设有一块1T的盘(/dev/sdb),创建三个分区,使用LVM配置逻辑卷并管理,常见操作步骤如下:

1. 使用fdisk创建LVM类型的分区 → 2. 创建物理卷 → 3. 创建卷组 → 4. 创建逻辑卷 → 5. 格式化并挂载逻辑卷 → 6. 更新fstab

使用fdisk创建分区fdisk /dev/sdb

    • 按 n 创建新分区,选择主分区 (p),分区号1,起始扇区默认,结束扇区设置为 +300G

    • 按 t 更改分区类型,选择 8e (Linux LVM)。

    • 重复上述步骤创建分区2和3,分配剩余空间(确保类型均为8e)。

    • 按 w 保存并退出。

LVM配置逻辑卷

1. 创建物理卷(PV):
pvcreate /dev/sdb1 /dev/sdb2 /dev/sdb3

2. 创建卷组(VG):
vgcreate vg_sealer /dev/sdb1 /dev/sdb2 /dev/sdb3

3. 创建逻辑卷(LV):
lvcreate -n lv_sealer -L 300G vg_sealer

格式化并挂载逻辑卷

1. 格式化逻辑卷:根据需求选择 ext4、xfs 或其他类型,格式化命令需匹配
mkfs.ext4 /dev/vg_sealer/lv_sealer

2. 创建挂载目录:
mkdir -p /var/lib/sealer

3. 获取逻辑卷的UUID:
blkid /dev/vg_sealer/lv_sealer

4. 编辑/etc/fstab文件:
vim /etc/fstab
添加以下行,
# 设备标识(建议使用UUID,避免设备名变化导致问题),第1个0为dump 备份标志(0=不备份,1=备份),第2个0为 fsck 检查顺序(0=不检查,根分区设为1,其他数据分区可设为0或2)
UUID=你的UUID /var/lib/sealer ext4 defaults 0 0
或者直接挂LVM逻辑卷
/dev/vg_sealer/lv_sealer /var/lib/sealer ext4 defaults 0 0

5. 挂载逻辑卷:
mount -a

实际挂载的是LVM逻辑卷(如/dev/vg_sealer/lv_sealer),而非直接挂载/dev/sdb1。LVM允许更灵活的存储管理,建议通过逻辑卷进行操作。


LVM逻辑卷扩容

现在300G的卷不够用了,需要将逻辑卷 lv_sealer 从 300G 扩展到 400G,操作步骤如下:

1. 检察卷组(VG)的剩余空间 → 2. 扩容逻辑卷(LV)大小 → 3. 扩展文件系统 → 4. 验证扩展结果

1. 首先确认卷组 vg_sealer 是否有足够的剩余空间:
vgdisplay vg_sealer 

# 查看 Free PE / Size 字段,确保剩余空间 ≥ 100G(若不足需先扩展卷组)
Free  PE / Size       25599 / 700G   # 表示剩余 100G 空间

2. 扩展逻辑卷(LV)大小:将逻辑卷从 300G 扩展到 400G(新增 100G)
lvextend -L +100G /dev/vg_sealer/lv_sealer  
lvextend -L 400G /dev/vg_sealer/lv_sealer # 或直接指定目标大小:-L 400G

# 此命令会将卷组中 所有剩余空间 添加到 lv_sealer。
lvextend -l +100%FREE /dev/vg_sealer/lv_sealer # 将剩余空间全部分配给逻辑卷(LV)

3. 扩展文件系统:调整文件系统以使用新增的空间(假设文件系统为 ext4)
resize2fs /dev/vg_sealer/lv_sealer #(如果是 xfs 文件系统,用 xfs_growfs /var/lib/sealer)

4. 验证扩展结果:确认逻辑卷和文件系统的新大小
lvdisplay /dev/vg_sealer/lv_sealer  # 检查 LV 大小
df -h /var/lib/sealer               # 检查文件系统大小

完成后,逻辑卷和文件系统将扩容至 400G, /var/lib/sealer 的挂载点会自动使用新空间。且 ext4/xfs 支持在线调整(ext4支持在线扩缩容、xfs只支持扩容,不支持缩容),无需卸载文件系统。操作前建议备份重要数据(虽然风险极低)。

创建逻辑卷并占用全部剩余空间

现在突然有个需求,需要创建一个etcd的逻辑卷,并把卷组剩余的空间都分给它使用,此时可以使用 lvcreate 命令,通过 -l 100%FREE 参数直接分配所有剩余空间:

lvcreate -n lv_etcd -l 100%FREE vg_sealer
  • 参数解释

    • -n lv_etcd:指定逻辑卷名称为 lv_etcd

    • -l 100%FREE:占用卷组中 全部剩余空间

    • vg_sealer:目标卷组名称(根据实际情况替换)。


LVM扩展现有的卷组空间

由于创建了一个新的逻辑卷lv_etcd,占用了卷组的所有剩余空间。现在需要将已有的PV添加盘扩容,操作步骤如下:

1. 添加新磁盘或扩展现有磁盘的分区 → 2. 创建或调整物理卷 → 3. 将新的物理卷添加到卷组 → 4. 扩展逻辑卷并使用新增的空间 → 5. 调整文件系统大小

场景分析

  1. 情况一:已有物理卷(如 /dev/sdb1)所在的磁盘空间被扩大(例如虚拟机磁盘扩容),需要扩展物理卷。

  2. 情况二:新增一块磁盘(如 /dev/sdc),需将其初始化为物理卷并添加到卷组中。

通用步骤:检查当前LVM状态

查看卷组、物理卷、逻辑卷的当前状态:

pvs          # 查看物理卷信息,显示物理卷(PV)信息(所属 VG、容量等)
vgs          # 查看卷组剩余空间,显示卷组(VG)的总容量、剩余空间
lvs          # 查看逻辑卷信息,显示逻辑卷(LV)名称、大小、所属 VG
lsblk        # 查看磁盘、分区、LVM 设备的树状层级关系

# 查看卷组(VG)包含的物理卷(PV)
pvs --segments -o+pv_name,vg_name  # 列出所有PV及其所属VG

# 针对特定卷组(例如 vg_sealer):
pvdisplay -S vgname=vg_sealer      # 显示该VG下的所有PV详细信息

# 查看卷组(VG)的详细空间分配
vgdisplay vg_sealer                # 替换为实际VG名称

快速查看 LVM 逻辑卷(LV)、卷组(VG)、物理卷(PV)及底层磁盘的层级关系,可以通过组合命令一步实现。

echo "===== Physical Volumes (PVs) =====" && pvs && \
echo "\n===== Volume Groups (VGs) =====" && vgs && \
echo "\n===== Logical Volumes (LVs) =====" && lvs && \
echo "\n===== Block Devices Hierarchy =====" && mount -a && lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT

输出示例:

===== Physical Volumes (PVs) =====
  PV         VG       Fmt  Attr PSize    PFree
  /dev/sda2  vg_root  lvm2 a--  <99.00g     0
  /dev/sdb1  vg_data  lvm2 a--  500.00g 200.00g
  /dev/sdc1  vg_data  lvm2 a--  500.00g 500.00g

===== Volume Groups (VGs) =====
  VG       #PV #LV #SN Attr   VSize    VFree
  vg_root    1   2   0 wz--n-  <99.00g     0
  vg_data    2   1   0 wz--n- 1000.00g 700.00g

===== Logical Volumes (LVs) =====
  LV       VG       Attr       LSize   Pool Origin Data%  Meta%
  root     vg_root  -wi-ao---- <95.00g
  swap     vg_root  -wi-ao----   4.00g
  lv_data  vg_data  -wi-ao---- 300.00g

===== Block Devices Hierarchy =====
NAME          SIZE TYPE  FSTYPE      MOUNTPOINT
sda          100G  disk
├─sda1         1G  part  vfat        /boot/efi
└─sda2        99G  part  LVM2_member
  ├─vg_root-root 95G lvm   ext4        /
  └─vg_root-swap  4G lvm   swap        [SWAP]
sdb          500G  disk
└─sdb1       500G  part  LVM2_member
  └─vg_data-lv_data 300G lvm   xfs         /data
sdc          500G  disk
└─sdc1       500G  part  LVM2_member

关键信息解读

  1. 物理卷(PV)

    • /dev/sdb1 和 /dev/sdc1 属于卷组 vg_data,总容量 1000G,剩余 700G。

    • /dev/sda2 属于 vg_root,已完全分配。

  2. 卷组(VG)

    • vg_data 包含 2 个 PV(sdb1 和 sdc1),总空间 1000G。

    • vg_root 用于系统和交换分区。

  3. 逻辑卷(LV)

    • lv_data 大小 300G,挂载到 /data,使用 xfs 文件系统。

    • vg_root 中的 root 和 swap 逻辑卷分别挂载到 / 和作为交换分区。

  4. 磁盘层级(lsblk)

    • sdb1 和 sdc1 是 LVM 物理卷(LVM2_member)。

    • 逻辑卷路径为 /dev/mapper/vg_data-lv_data(对应 dm 设备)。

情况一:扩展现有物理卷(如磁盘分区已扩容)

假设原有物理卷 /dev/sdb1 所在的磁盘已从 300G 扩容到 500G,需调整物理卷大小。

1. 扩展分区大小

  • 使用 fdisk 或 parted 调整分区大小(需删除并重建分区,注意备份数据)。

  • 或者使用在线工具如 growpart(适用于无需重建分区):

growpart /dev/sdb 1  # 调整 /dev/sdb 的第1个分区

2. 刷新物理卷大小

pvresize /dev/sdb1

3. 验证物理卷扩展

pvdisplay /dev/sdb1  # 查看物理卷新容量

4. 扩展逻辑卷

lvextend -l +100%FREE /dev/vg_sealer/lv_sealer  # 占用全部剩余空间
resize2fs /dev/vg_sealer/lv_sealer              # 调整文件系统(ext4)
# 若为xfs文件系统:xfs_growfs /var/lib/sealer

情况二:添加新磁盘到卷组

假设新增磁盘 /dev/sdc,需将其初始化为物理卷并加入卷组。

1. 创建新分区(可选)

  • 若需分区(推荐使用完整磁盘):

fdisk /dev/sdc

按 n 创建新分区,设置类型为 8e(Linux LVM),保存退出。

2. 创建物理卷

# 使用整块磁盘
pvcreate /dev/sdc

# 或指定分区(如 /dev/sdc1)
pvcreate /dev/sdc1

3. 扩展卷组

# 将新物理卷添加到卷组
vgextend vg_sealer /dev/sdc

4. 扩展逻辑卷

lvextend -l +100%FREE /dev/vg_sealer/lv_sealer  # 分配全部剩余空间
resize2fs /dev/vg_sealer/lv_sealer              # 调整文件系统(ext4)
# 若为xfs文件系统:xfs_growfs /var/lib/sealer

验证结果

# 查看卷组扩容后的总空间
vgdisplay vg_sealer    

# 检查逻辑卷大小
lvdisplay /dev/vg_sealer/lv_sealer 

# 确认文件系统已扩容 
df -h /var/lib/sealer

注意事项

  1. 数据备份:操作前备份重要数据,尤其是调整分区时。

  2. 分区对齐:使用 parted 或 fdisk 时注意分区对齐,避免性能问题。

  3. 在线扩容ext4 和 xfs 文件系统支持在线调整,无需卸载。

  4. 虚拟机环境:若为虚拟机磁盘扩容,需先扩展虚拟磁盘,再在操作系统中操作。


LVM(PV/VG/LV)缩容

对LVM(PV/VG/LV)进行缩容是一项高风险操作,需谨慎执行。以下是分步指南及注意事项:

场景一:缩小逻辑卷(LV)

1. 卸载文件系统(可选但推荐)
umount /var/lib/sealer   # 替换为实际挂载点

2. 检查文件系统完整性
e2fsck -f /dev/vg_sealer/lv_sealer   # ext4专用

3. 缩小文件系统(以ext4为例)
resize2fs /dev/vg_sealer/lv_sealer 300G   # 目标大小(如300G)

4. 缩小逻辑卷(LV)
lvreduce -L 300G /dev/vg_sealer/lv_sealer  # 与文件系统大小一致

5. 重新挂载文件系统
mount /dev/vg_sealer/lv_sealer /var/lib/sealer

场景二:从卷组(VG)中移除物理卷(PV)

1. 迁移数据到其他PV
pvmove /dev/sdb1   # 将数据从/dev/sdb1迁移到其他PV

2. 从卷组中移除PV
vgreduce vg_sealer /dev/sdb1

3. 删除PV
pvremove /dev/sdb1

场景三:缩小物理卷(PV)

1. 缩小PV(需先缩小所属VG/LV)
pvresize --setphysicalvolumesize 200G /dev/sdb1   # 调整PV大小

2. 调整分区大小(使用parted或fdisk)
parted /dev/sdb resizepart 1 200G   # 调整分区大小

验证操作

lvdisplay /dev/vg_sealer/lv_sealer   # 检查LV大小
vgdisplay vg_sealer                  # 检查VG剩余空间
pvdisplay /dev/sdb1                  # 检查PV大小
df -h /var/lib/sealer                # 检查文件系统大小

注意事项

  1. xfs文件系统不可缩容:若使用xfs,只能备份数据→删除LV→重建更小的LV→恢复数据。

  2. 顺序不可逆:必须先缩小文件系统,再缩小LV,否则数据丢失。

  3. 虚拟机/物理机差异:物理机需确保硬件支持磁盘缩容(如RAID/LVM配置)。

  4. 数据丢失:操作失误可能导致数据不可恢复。

  5. 性能影响:频繁调整可能导致文件系统碎片化。

  6. 依赖工具

    • resize2fs:ext2/3/4文件系统调整工具。

    • parted:替代fdisk的更友好分区工具。


参考:fdisk/parted创建与删除分区

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/6365.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注