lvm卷创建删除扩容坏盘移出卷组操作

查看lv信息常用命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 查看pv是否有数据
lvdisplay -m
lvdisplay -m /dev/starbucks/lv_opt
# 或者:

lvdisplay -m

你会看到类似:

Physical volume /dev/sdc
Physical extents 0 to xxx

Physical volume /dev/sdd
Physical extents xxx to xxx
# 查看pv卷组映射关系
lvs -a -o +devices
# 查看 vg使用情况
vgs -o +pv_count,lv_count,vg_attr

# 刷新
lvscan
# 恢复卷组信息
vgcfgrestore -f /etc/lvm/backup/vg_mf vg_mf
# 激活vg
vgchange -ay vg_mf

注意事项:

  • 常见扩容命令用法
    1
    2
    3
    4
    5
    6
    # 创建时只创建2G
    lvcreate -L 2G -n lv_test vg_test
    # 在原来的基础上+2G
    lvextend -L +2G /dev/mapper/vg_test-lv_test
    # 扩容到5G
    lvextend -L 5G /dev/mapper/vg_test-lv_test

详情如下:

创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建lvm逻辑卷

# 创建pv卷的过程
pvcreate /dev/sd{b..c}
pvs
# 创建vg卷(创建的过程中就把pv卷加进来)
# 可以简写为一条命令 vgcreate vg_test /dev/sd{b..c}
vgcreate vg_test /dev/sdb
vgs
# 将sdc卷加入vg卷组vg_test
vgextend vg_test /dev/sdc
# 创建lvm卷组(逻辑卷组)
lvcreate -L 5G -n lv_test vg_test
lvcreate -L 2G -n lv_test vg_test
# 所有容量创建进lvm卷
lvcreate -l 100%FREE -n lv_test vg_test

扩容lvm卷组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 扩容lvm卷组过程
# 刷新分区表
partprobe
# 创建pv
pvcreate /dev/sdc1
# 查看pv
pvs
# vg卷组名称centos通过vgs查看
vgs
# 将pv卷扩展到vg卷组并查看
vgextend vg_test /dev/sdc1
vgdisplay
# 此时查看pv卷 发现多了刚才的这块磁盘
pvs
# vg_test-lv_test 名称通过 lsblk即可查看
# vg_test vg卷组名 lv_test lv卷组名
####100%空闲空间扩展
lvextend -l +100%FREE /dev/mapper/vg_test-lv_test
# 扩容到5G
lvextend -L +5G /dev/mapper/vg_test-lv_test
# 扩容到文件系统
ext4文件系统扩容命令: resize2fs /dev/mapper/vg_test-lv_test
xfs 文件系统扩容命令: xfs_growfs /dev/mapper/vg_test-lv_test

注意:如果2块pv一块5G 如果创建的lvm卷就有2G那么另外一块盘就不会显示vg_test-lv_test 因为他没在用

删除lvm卷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 删除lvm卷
步骤:
1、卸载挂载点
2、将pv卷从vg卷组移出
3、执行删除pv pvmove
4、此时磁盘已经移出

详情
# 查看挂载点
df -h | grep lv_test
# 假设输出显示挂载在 /mnt/data,则执行卸载
sudo umount /mnt/data

# 如果卸载失败,提示目标正忙,可以使用 fuser 命令查找并终止占用进程,然后强制卸载
sudo fuser -km /mnt/data # 终止所有访问 /mnt/data 的进程
sudo umount -l /mnt/data # 强制卸载

# 删除逻辑卷 (LV)
# 卸载成功后,删除逻辑卷 lv_test。
sudo lvremove /dev/vg_test/lv_test
系统会提示确认,输入 y 即可。
删除卷组 (VG)
# 逻辑卷删除后,删除卷组 vg_test。
sudo vgremove vg_test
清除物理卷 (PV) 信息
最后,清除物理磁盘 /dev/sdb 和 /dev/sdc 上的 LVM 标签,使其恢复到未分配状态。
sudo pvremove /dev/sdb /dev/sdc

坏盘移出卷组

写在前面:

注意事项(下方坏盘移除出现的部分问题看此处):

  • 坏盘sdb修复完成拔出机器后 重启服务器 会发现系统中对应的盘符发生了改变
  • 卸载磁盘的时候一定要选对如果选错了:会导致lvm损坏—-即会导致下方报错
  • 此时会报错
    1
    2
    WARNING: Couldn't find device with uuid BVuqOy-xI9e-HTSv-zyhI-bRrv-OuQ9-GDWf5h.
    WARNING: VG vg_test is missing PV BVuqOy-xI9e-HTSv-zyhI-bRrv-OuQ9-GDWf5h (last written to /dev/sdc).
  • 修复方法如下
    传送门 博主另外一篇文章 多块磁盘配置lvm卷 不含vg卷的某块磁盘损坏解决 存在一个bug每次需要重新激活vg卷vgchange -ay vg_mf但已经是比较优秀的解决方法了
  • 千万不能执行vgreduce --removemissing --force否则数据会永久丢失

坏盘移出修复操作(成功但注意上方注意事项问题)

既然 /dev/sdb 已经损坏,你的目标是将数据迁移到 /dev/sdc 并将坏盘移出卷组。

根据你提供的 pvs 信息:
/dev/sdb (坏盘): 已用约 2G,空闲 0。
/dev/sdc (好盘): 已用约 2G,空闲 2.99G。

好消息是:好盘 sdc 的空闲空间(2.99G)足以容纳坏盘 sdb 上的数据(约 2G),因此可以直接进行无损迁移。

请按照以下步骤操作:

迁移之前一定要看lvm逻辑卷中有没有足够的pe即看pv卷有没有剩下足够的pe没分配的

如果没有剩余pe空间 则需要新创建一块pv加入vg卷组 再对坏盘进行迁移

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
一、先卸载挂载点
# 查看挂载点
df -h | grep lv_test
# 假设输出显示挂载在 /mnt/data,则执行卸载
sudo umount /mnt/data

# 如果卸载失败,提示目标正忙,可以使用 fuser 命令查找并终止占用进程,然后强制卸载
sudo fuser -km /mnt/data # 终止所有访问 /mnt/data 的进程
sudo umount -l /mnt/data # 强制卸载

二、迁移数据
1、将坏盘 sdb 上的所有数据移动到卷组内的其他磁盘(即 sdc)上。
# 不写目标磁盘:告诉 LVM “随便找个有地方的盘存进去”。LVM 会自动寻找卷组内其他磁盘的空闲 PE 进行存放。
sudo pvmove /dev/sdb
# 指定磁盘迁移(将sdb数据迁移到sdc)
pvmove /dev/sdb /dev/sdc

注意:这个过程可能需要一点时间,取决于数据量大小。如果中途断线,数据也是安全的,重启后再次运行该命令即可继续。

2、确认迁移完成
移动完成后,再次查看物理卷状态,确保 sdb 的已用空间变为 0。
# 需要自己计算
sudo pvs
# 直接显示已用空间
# 确认该pv上没有数据
pvs -o+pv_used

pvs -o pv_name,vg_name,pv_size,pv_used,pv_free
此时 /dev/sdb 的 PUsed 应该为 0,而 /dev/sdc 的 PFree 应该变小。

3、将坏盘移出卷组
# 数据移走后,将 sdb 从 vg_test 卷组中剔除。
sudo vgreduce vg_test /dev/sdb

4、清除坏盘标签(可选)
# 虽然盘坏了,但为了彻底清除 LVM 信息,可以执行此命令(如果盘彻底坏了无法写入,这步会报错,忽略即可)。
sudo pvremove /dev/sdb

# 最后卸载磁盘(云环境通过这种确认即可 物理机则需要使用ledctl这样的工具亮灯处理)
# 从OS内确认待删除磁盘(sdb)对应的path,这里是scsi-0:0:1:0
# 卸载磁盘的时候一定要选对如果选错了 会导致lvm损坏
ll /dev/disk/by-path


5、💡 补充情况:如果盘坏得太厉害
# 如果 pvmove 报错(例如提示 I/O error 或无法读取),说明坏盘已经无法读取数据:

# 如果数据不重要:直接强制移除坏盘。
sudo vgreduce --removemissing --force vg_test

(注意:这会导致存储在 sdb 上的那部分数据丢失)

如果数据重要:不要执行任何操作,尝试使用 ddrescue 等工具先对 sdb 进行镜像备份,再进行恢复。

详情:

磁盘标识

执行迁移pvmove

迁移完成后会变成0(pvs -o pv_name,vg_name,pv_size,pv_used,pv_free)

后续操作截图

扩展 只删除lv卷其他pv vg都没动的情况下恢复lvm卷操作

✅ 正确的恢复方法(适用于未来)

如果在未来不慎删除了逻辑卷(LV),****最关键的一步是立即停止任何写入操作,然后利用 LVM 的元数据备份进行恢复。

**LVM 会自动在 **/etc/lvm/archive/ 目录下备份卷组(VG)的元数据历史。lvremove 操作也会生成一条备份记录。

恢复步骤:

  1. 立即停止写入 发现误删后,不要再执行任何 lvcreatepvmovevgreduce 等命令,防止元数据被覆盖。

  2. 查找删除前的元数据备份 使用 vgcfgrestore --list 命令查看指定卷组的历史备份。

    1
    vgcfgrestore --list vg_test

    **你会看到类似下面的输出,其中会记录每次操作(如 **lvcreate, lvremove)前后的备份文件。

    1
    2
    3
    4
    File: /etc/lvm/archive/vg_test_00005-123456789.vg
    VG name:   vg_test
    Description: Created *before* executing 'lvremove /dev/vg_test/lv_test'
    Backup Time: Thu Apr 9 10:00:00 2026

    **你需要找到在 **lvremove 之前 的那一个备份文件。

  3. 使用备份文件恢复卷组 使用找到的备份文件来恢复整个卷组的元数据。这会将 lv_test 的配置信息重新写回系统。

    1
    2
    3
    # 建议先使用 --test 参数进行模拟,确认无误后再正式执行
    vgcfgrestore -f /etc/lvm/archive/vg_test_00005-123456789.vg --test vg_test
    vgcfgrestore -f /etc/lvm/archive/vg_test_00005-123456789.vg vg_test
  4. 激活逻辑卷并挂载 恢复元数据后,激活卷组和逻辑卷,然后尝试挂载。

    1
    2
    vgchange -ay vg_test
    mount /dev/vg_test/lv_test /mnt

请注意:此方法成功的前提是,在执行 lvremove 后,没有进行任何新的 LVM 操作(尤其是创建新的 LV)来覆盖旧的元数据和数据块。

💡 经验总结

  • 操作前备份:在执行任何危险的 LVM 操作(如 lvremove, vgreduce)前,手动备份元数据:vgcfgbackup vg_name
  • 数据备份是根本:LVM 的元数据备份只能恢复卷的结构,不能替代真正的数据备份。重要数据一定要有异地或离线备份。
  • 谨慎操作lvremove 是一个破坏性很强的命令,执行前务必三思,确认数据已备份或不再需要。