记一次LVM系统盘挂掉修复
面临的问题
系统采用LVM逻辑卷管理,系统盘/数据盘均挂载在LVM卷组中。系统盘采用双500G硬盘,其中一个盘由于自身故障损坏,导致lvm逻辑卷无法加载,系统不可启动。
查阅资料
修复核心是移除故障 PV→换盘→重建 PV/VG→恢复镜像→修复引导。若系统已无法启动,优先用 Debian Live / 救援盘操作,全程备份关键数据
LVM使用双盘备份(LVM 镜像 / RAID1 或 简单双盘拷贝)
1. 双盘为 RAID1(软件 RAID) 模式
- 确认故障盘
执行
cat /proc/mdstat查看 RAID 阵列状态,标记出故障盘(通常显示为 failed);再用mdadm --detail /dev/mdX(X 为阵列编号,如 md0)确认故障盘的设备名(如 /dev/sdb)。 - 移除故障盘 执行命令将故障盘从阵列中移除:
mdadm /dev/mdX --remove /dev/sdb
- 物理更换硬盘 关机后更换新硬盘,开机后执行 fdisk -l 确认新硬盘的设备名(需与原故障盘一致,如仍为 /dev/sdb)。
- 重建 RAID 阵列 将新盘加入阵列并触发同步:
mdadm /dev/mdX --add /dev/sdb
再次执行 cat /proc/mdstat 可查看同步进度,等待进度完成即可。
2. 双盘为 LVM 镜像(Logical Volume Mirror) 模式
- 确认故障物理卷(PV)
执行
lvdisplay查看逻辑卷状态,找到故障的物理卷;再用pvdisplay确认故障 PV 对应的设备名。 - 移除故障 PV 先将故障 PV 从卷组(VG)中移除:
vgreduce 卷组名 /dev/故障设备名
- 更换新硬盘并初始化 关机换盘后,对新盘创建物理卷:
pvcreate /dev/新设备名
- 重新加入卷组并重建镜像 将新 PV 加入卷组,并重做 LVM 镜像:
vgextend 卷组名 /dev/新设备名
lvconvert --mirrorlog mirrored --devices /dev/新设备名 逻辑卷路径
LVM镜像备份启动盘修复
1. 环境准备与故障确认
- 用 Debian Live 或安装盘进入救援模式,挂载系统并激活 LVM:
vgchange -ay # 激活所有卷组
lvscan # 确认 LV 状态(如降级 degraded)
pvdisplay # 标记故障 PV(如 /dev/sdb1)
- 用 lsblk/fdisk -l 核对故障盘设备名,确保新盘可被识别。
2. 移除故障 PV 并物理换盘
- 从卷组移除故障 PV(假设卷组为 debian-vg):
vgreduce debian-vg --removemissing # 移除失效 PV
pvremove /dev/sdb1 # 清理失效 PV 元数据
- 关机更换新盘,开机后确认新盘设备名(如仍为 /dev/sdb)。
3. 重建 LVM 与镜像同步
- 新盘创建 PV 并加入卷组
pvcreate /dev/sdb1 # 初始化新 PV
vgextend debian-vg /dev/sdb1 # 加入卷组
- 恢复 LVM 镜像(假设 LV 为 root):
lvconvert --replace /dev/sdb1 /dev/debian-vg/root # 替换故障 PV
lvdisplay # 确认镜像状态正常,等待同步完成(用 watch cat /proc/mdstat 查看进度)
4. 修复 GRUB 引导
- 挂载系统并绑定关键目录:
mount /dev/debian-vg/root /mnt
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt # 切换到系统根环境
- 重新安装 GRUB 到新盘(假设新盘为 /dev/sdb,EFI 系统需额外挂载 EFI 分区):
grub-install /dev/sdb
update-grub # 更新引导配置
- 退出 chroot 并重启:exit && reboot
5. 收尾与校验
- 重启后执行以下命令确认状态:
pvdisplay && vgdisplay && lvdisplay # 确认 LVM 状态正常
fsck -fy /dev/debian-vg/root # 校验文件系统
LVM非镜像盘
条带化(无冗余)的 LVM 根分区,单盘损坏会导致数据部分丢失、卷组失效,核心修复思路是先救数据、再重建卷组,无法直接恢复原 LVM 完整数据,需用备份兜底。
核心前提与风险
- 无冗余 LVM 条带化(如 -i 2)时,单盘损坏会导致数据分片丢失,原 LV 无法完整恢复,必须依赖备份。
- 操作前优先用 dd 等工具对剩余好盘做镜像备份,避免二次损坏。
- 全程在 Live CD(如 Ubuntu Server、CentOS Stream 救援镜像)中操作,原系统大概率无法正常启动。
步骤
1. 进入救援环境与备份
- 制作并从 Live CD 启动,确保能识别剩余好盘(如 /dev/sda)与新替换盘(如 /dev/sdb)。
- 备份剩余好盘数据(关键):
dd if=/dev/sda of=/mnt/external/backup_sda.img status=progress # 外接存储路径自行替换
- 扫描 LVM 状态,确认故障 PV:
pvscan # 会显示 missing PV 的 UUID
vgs # 卷组状态为 partial
lvs # 逻辑卷可能不可用
2. 清理失效 PV 与卷组
- 强制激活卷组(仅用于清理,不可读写数据):
vgchange -ay --partial your_vg_name # your_vg_name 替换为实际卷组名
- 移除卷组中失效的 PV:
vgreduce --removemissing your_vg_name # 清除缺失的物理卷,恢复卷组一致性
pvchange -x n /dev/failed_disk # 若失效盘还能识别,先标记为不可用
- 此时卷组仅保留好盘的 PV,但因条带丢失,原 LV 仍不可用,需卸载并删除失效 LV:
lvremove your_vg_name/root_lv # 谨慎操作,仅在确认数据无法恢复时执行
3. 更换新盘并重建 LVM
- 移除损坏硬盘,接入同容量或更大的新盘(如 /dev/sdb)。
- 初始化新盘为 PV:
pvcreate /dev/sdb # 新盘创建 PV
vgextend your_vg_name /dev/sdb # 将新 PV 加入卷组
- 创建新的逻辑卷(避免条带化,优先线性或加镜像):
lvcreate -n root_lv -L 950G your_vg_name # 容量按需调整,默认线性模式
# 若要冗余,可用镜像:lvcreate -m 1 -n root_lv -L 950G your_vg_name
- 格式化新 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
- 挂载必要系统目录,准备修复引导:
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
- 更新 /etc/fstab,确保新 LV 的 UUID 正确(用 blkid 查新 LV 的 UUID):
blkid /dev/your_vg_name/root_lv # 复制 UUID
vi /etc/fstab # 替换 root 分区的 UUID
- 修复 GRUB 引导(以 GRUB2 为例):
grub-install /dev/sda # 安装到新盘的 MBR
update-grub
exit # 退出 chroot
5. 验证与收尾
- 卸载所有挂载点,重启系统:
umount -R /mnt/new_root
reboot
- 系统启动后,检查 LVM 与文件系统状态:
pvscan && vgs && lvs
df -h # 确认 root 分区正常挂载
fsck -f /dev/your_vg_name/root_lv # 检查文件系统完整性
判断LVM是否是镜像模式
1. 扫描并激活卷组
- 扫描所有 PV/VG/LV,定位故障与可用卷组:
pvscan # 看是否有 missing PV,记录 VG 名称
vgscan # 扫描卷组元数据
- 强制激活卷组(单盘故障时用 –partial,仅用于查询,禁止读写数据): vgchange -ay –partial your_vg_name # 替换为实际 VG 名
2. 用 lvs 命令判断镜像 / 冗余(最核心)
这是判断镜像的关键命令,通过属性与扩展字段直接识别冗余配置。
- 查看 LV 镜像属性与组件:
lvs -a -o +devices,copy_percent # -a 显示内部 LV;-o 自定义列;+devices 看底层设备
- 关键输出解析(镜像卷特征):
| 字段 | 镜像卷特征 | 无冗余条带化特征 |
|---|---|---|
| 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)
- 简化查询(快速筛选镜像卷):
lvs -o name,vg_name,attr,copy_percent # 只看核心镜像相关字段
3. 辅助验证(交叉确认冗余)
- 用 lvdisplay 查详细配置(含镜像日志与映射):
lvdisplay --maps your_vg_name/your_lv_name # --maps 显示 LE 到 PV 的映射
- 用 vgdisplay 看卷组冗余相关配置:
vgdisplay your_vg_name # 看 PV 数量、PE 分布,镜像卷通常对应多 PV
- 用 dmsetup 查设备映射(底层验证):
dmsetup info -c /dev/mapper/your_vg_name-your_lv_name # 看是否为镜像映射
4. 故障场景特殊判断(单盘损坏时)
- 若卷组激活失败,查看 LVM 元数据备份(辅助判断历史配置):
cat /etc/lvm/backup/your_vg_name # 搜索 mirror_count 字段,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
修复方案
核心思路如下:
- 当前系统启动不了,采用liveCD救援环境修复
- 验证lvm分区情况,区分出当前镜像是否是镜像模式