记一次LVM系统盘挂掉修复

面临的问题

系统采用LVM逻辑卷管理,系统盘/数据盘均挂载在LVM卷组中。系统盘采用双500G硬盘,其中一个盘由于自身故障损坏,导致lvm逻辑卷无法加载,系统不可启动。

查阅资料

修复核心是移除故障 PV→换盘→重建 PV/VG→恢复镜像→修复引导。若系统已无法启动,优先用 Debian Live / 救援盘操作,全程备份关键数据

LVM使用双盘备份(LVM 镜像 / RAID1 或 简单双盘拷贝)

1. 双盘为 RAID1(软件 RAID) 模式

  1. 确认故障盘 执行 cat /proc/mdstat 查看 RAID 阵列状态,标记出故障盘(通常显示为 failed);再用 mdadm --detail /dev/mdX(X 为阵列编号,如 md0)确认故障盘的设备名(如 /dev/sdb)。
  2. 移除故障盘 执行命令将故障盘从阵列中移除:
mdadm /dev/mdX --remove /dev/sdb
  1. 物理更换硬盘 关机后更换新硬盘,开机后执行 fdisk -l 确认新硬盘的设备名(需与原故障盘一致,如仍为 /dev/sdb)。
  2. 重建 RAID 阵列 将新盘加入阵列并触发同步:
mdadm /dev/mdX --add /dev/sdb

再次执行 cat /proc/mdstat 可查看同步进度,等待进度完成即可。

2. 双盘为 LVM 镜像(Logical Volume Mirror) 模式

  1. 确认故障物理卷(PV) 执行 lvdisplay 查看逻辑卷状态,找到故障的物理卷;再用 pvdisplay 确认故障 PV 对应的设备名。
  2. 移除故障 PV 先将故障 PV 从卷组(VG)中移除:
vgreduce 卷组名 /dev/故障设备名
  1. 更换新硬盘并初始化 关机换盘后,对新盘创建物理卷:
pvcreate /dev/新设备名
  1. 重新加入卷组并重建镜像 将新 PV 加入卷组,并重做 LVM 镜像:
vgextend 卷组名 /dev/新设备名
lvconvert --mirrorlog mirrored --devices /dev/新设备名 逻辑卷路径

LVM镜像备份启动盘修复

1. 环境准备与故障确认

  1. 用 Debian Live 或安装盘进入救援模式,挂载系统并激活 LVM:
vgchange -ay  # 激活所有卷组
lvscan        # 确认 LV 状态(如降级 degraded)
pvdisplay     # 标记故障 PV(如 /dev/sdb1)
  1. 用 lsblk/fdisk -l 核对故障盘设备名,确保新盘可被识别。

2. 移除故障 PV 并物理换盘

  1. 从卷组移除故障 PV(假设卷组为 debian-vg):
vgreduce debian-vg --removemissing  # 移除失效 PV
pvremove /dev/sdb1                  # 清理失效 PV 元数据
  1. 关机更换新盘,开机后确认新盘设备名(如仍为 /dev/sdb)。

3. 重建 LVM 与镜像同步

  1. 新盘创建 PV 并加入卷组
pvcreate /dev/sdb1                          # 初始化新 PV
vgextend debian-vg /dev/sdb1                # 加入卷组
  1. 恢复 LVM 镜像(假设 LV 为 root):
lvconvert --replace /dev/sdb1 /dev/debian-vg/root  # 替换故障 PV
lvdisplay  # 确认镜像状态正常,等待同步完成(用 watch cat /proc/mdstat 查看进度)

4. 修复 GRUB 引导

  1. 挂载系统并绑定关键目录:
mount /dev/debian-vg/root /mnt
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt  # 切换到系统根环境
  1. 重新安装 GRUB 到新盘(假设新盘为 /dev/sdb,EFI 系统需额外挂载 EFI 分区):
grub-install /dev/sdb
update-grub  # 更新引导配置
  1. 退出 chroot 并重启:exit && reboot

5. 收尾与校验

  1. 重启后执行以下命令确认状态:
pvdisplay && vgdisplay && lvdisplay  # 确认 LVM 状态正常
fsck -fy /dev/debian-vg/root         # 校验文件系统

LVM非镜像盘

条带化(无冗余)的 LVM 根分区,单盘损坏会导致数据部分丢失、卷组失效,核心修复思路是先救数据、再重建卷组,无法直接恢复原 LVM 完整数据,需用备份兜底。

核心前提与风险

  1. 无冗余 LVM 条带化(如 -i 2)时,单盘损坏会导致数据分片丢失,原 LV 无法完整恢复,必须依赖备份。
  2. 操作前优先用 dd 等工具对剩余好盘做镜像备份,避免二次损坏。
  3. 全程在 Live CD(如 Ubuntu Server、CentOS Stream 救援镜像)中操作,原系统大概率无法正常启动。

步骤

1. 进入救援环境与备份

  1. 制作并从 Live CD 启动,确保能识别剩余好盘(如 /dev/sda)与新替换盘(如 /dev/sdb)。
  2. 备份剩余好盘数据(关键):
dd if=/dev/sda of=/mnt/external/backup_sda.img status=progress  # 外接存储路径自行替换
  1. 扫描 LVM 状态,确认故障 PV:
pvscan  # 会显示 missing PV 的 UUID
vgs     # 卷组状态为 partial
lvs     # 逻辑卷可能不可用

2. 清理失效 PV 与卷组

  1. 强制激活卷组(仅用于清理,不可读写数据):
vgchange -ay --partial your_vg_name  # your_vg_name 替换为实际卷组名
  1. 移除卷组中失效的 PV:
vgreduce --removemissing your_vg_name  # 清除缺失的物理卷,恢复卷组一致性
pvchange -x n /dev/failed_disk  # 若失效盘还能识别,先标记为不可用
  1. 此时卷组仅保留好盘的 PV,但因条带丢失,原 LV 仍不可用,需卸载并删除失效 LV:
lvremove your_vg_name/root_lv  # 谨慎操作,仅在确认数据无法恢复时执行

3. 更换新盘并重建 LVM

  1. 移除损坏硬盘,接入同容量或更大的新盘(如 /dev/sdb)。
  2. 初始化新盘为 PV:
pvcreate /dev/sdb  # 新盘创建 PV
vgextend your_vg_name /dev/sdb  # 将新 PV 加入卷组
  1. 创建新的逻辑卷(避免条带化,优先线性或加镜像):
lvcreate -n root_lv -L 950G your_vg_name  # 容量按需调整,默认线性模式
# 若要冗余,可用镜像:lvcreate -m 1 -n root_lv -L 950G your_vg_name
  1. 格式化新 LV 并恢复备份数据:
mkfs.xfs /dev/your_vg_name/root_lv  # 按原文件系统类型(ext4/xfs)调整
mount /dev/your_vg_name/root_lv /mnt/new_root
rsync -av /mnt/backup_data/ /mnt/new_root/  # 从备份恢复数据

4. 修复系统引导与 fstab

  1. 挂载必要系统目录,准备修复引导:
mount --bind /dev /mnt/new_root/dev
mount --bind /proc /mnt/new_root/proc
mount --bind /sys /mnt/new_root/sys
chroot /mnt/new_root
  1. 更新 /etc/fstab,确保新 LV 的 UUID 正确(用 blkid 查新 LV 的 UUID):
blkid /dev/your_vg_name/root_lv  # 复制 UUID
vi /etc/fstab  # 替换 root 分区的 UUID
  1. 修复 GRUB 引导(以 GRUB2 为例):
grub-install /dev/sda  # 安装到新盘的 MBR
update-grub
exit  # 退出 chroot

5. 验证与收尾

  1. 卸载所有挂载点,重启系统:
umount -R /mnt/new_root
reboot
  1. 系统启动后,检查 LVM 与文件系统状态:
pvscan && vgs && lvs
df -h  # 确认 root 分区正常挂载
fsck -f /dev/your_vg_name/root_lv  # 检查文件系统完整性

判断LVM是否是镜像模式

1. 扫描并激活卷组

  1. 扫描所有 PV/VG/LV,定位故障与可用卷组:
pvscan  # 看是否有 missing PV,记录 VG 名称
vgscan  # 扫描卷组元数据
  1. 强制激活卷组(单盘故障时用 –partial,仅用于查询,禁止读写数据): vgchange -ay –partial your_vg_name # 替换为实际 VG 名

2. 用 lvs 命令判断镜像 / 冗余(最核心)

这是判断镜像的关键命令,通过属性与扩展字段直接识别冗余配置。

  1. 查看 LV 镜像属性与组件:
lvs -a -o +devices,copy_percent  # -a 显示内部 LV;-o 自定义列;+devices 看底层设备
  1. 关键输出解析(镜像卷特征):
字段镜像卷特征无冗余条带化特征
Attr含 m(mirror),如 mwi-a-含 s(striped),如 swi-a-
Log显示镜像日志(如 lv_mlog)空或无日志字段
Cpy%Sync同步进度(如 100.00 表示已同步)无此字段
Devices含 _mimage_0/_mimage_1 多盘映射条带化多盘分段映射(如 sda (0),sdb (0))
内部 LV出现 lv_mimage_0/lv_mlog 等无内部镜像组件

示例镜像卷输出:

LV                 VG   Attr       LSize  Cpy%Sync Devices
my_lv              vg0  mwi-aotz--  100G  100.00   my_lv_mimage_0(0),my_lv_mimage_1(0)
[my_lv_mimage_0]   vg0  iwi-aotz--  100G           /dev/sda1(0)
[my_lv_mimage_1]   vg0  iwi-aotz--  100G           /dev/sdb1(0)
[my_lv_mlog]       vg0  lwi-aotz--    4M           /dev/sdc1(0)
  1. 简化查询(快速筛选镜像卷):
lvs -o name,vg_name,attr,copy_percent  # 只看核心镜像相关字段

3. 辅助验证(交叉确认冗余)

  1. 用 lvdisplay 查详细配置(含镜像日志与映射):
lvdisplay --maps your_vg_name/your_lv_name  # --maps 显示 LE 到 PV 的映射
  1. 用 vgdisplay 看卷组冗余相关配置:
vgdisplay your_vg_name  # 看 PV 数量、PE 分布,镜像卷通常对应多 PV
  1. 用 dmsetup 查设备映射(底层验证):
dmsetup info -c /dev/mapper/your_vg_name-your_lv_name  # 看是否为镜像映射

4. 故障场景特殊判断(单盘损坏时)

  1. 若卷组激活失败,查看 LVM 元数据备份(辅助判断历史配置):
cat /etc/lvm/backup/your_vg_name  # 搜索 mirror_count 字段,1 表示单镜像
  1. 若只能识别单 PV,结合 lvs -a 看是否有残留镜像组件,判断原卷是否为镜像卷。

挂载并修复grub

挂载根逻辑卷和 /boot 分区,进入 chroot 环境:

vgchange -ay sys
# 挂载根逻辑卷
mount /dev/sys/root /mnt
# 挂载独立的 /boot 分区(关键!)
mount /dev/sdb2 /mnt/boot
# 挂载系统必要目录
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys

chroot /mnt

grub-install --target=x86_64-efi --efi-directory=/boot/efi /dev/sdb

强制重建 initramfs 并包含 LVM 模块

# 强制重建所有内核版本的 initramfs
update-initramfs -u -k all -v
update-grub

修复方案

核心思路如下:

  1. 当前系统启动不了,采用liveCD救援环境修复
  2. 验证lvm分区情况,区分出当前镜像是否是镜像模式

1. 进live CD救援过程