我有一台 Lenny 服务器,该服务器已将 SAN 连接配置为名为“datavg”的 VG 的唯一 PV。
昨天,我用 Debian 补丁更新了该盒子并重新启动了它。
重启后,它没有启动,说找不到 /dev/mapper/datavg-datalv。
这是我所做的:
- 以救援模式启动并在 /etc/fstab 中注释挂载
- 重新启动到完整用户模式。(挂载点是 /data,只有 postgresql 无法启动)
- 执行 vgdisplay、lvdisplay、pvdisplay 来找出卷组发生了什么。(datavg 完全丢失)
之后,我注意到 LUN 在 Linux 上可见,并且 LVM 分区也可见:
# ls -la /dev/mapper/mpath0*
brw-rw---- 1 root disk 254, 6 2009-11-23 15:48 /dev/mapper/mpath0
brw-rw---- 1 root disk 254, 7 2009-11-23 15:48 /dev/mapper/mpath0-part1
- 然后,我尝试使用 pvscan 来查看它是否能找到 PV。不幸的是,它没有检测到该分区是 PV。-
我在分区上运行了 pvck,但没有找到任何标签:
# pvck /dev/mapper/mpath0-part1
Could not find LVM label on /dev/mapper/mpath0-part1
- 然后,我想知道 LUN 是否是空的,所以我对前几个 MB 进行了 dd。在这里,我可以看到 LVM 标头:
datavg {
id = "removed-hwEK-Pt9k-Kw4F7e"
seqno = 2
status = ["RESIZEABLE", "READ", "WRITE"]
extent_size = 8192
max_lv = 0
max_pv = 0
physical_volumes {
pv0 {
id = "removed-AfF1-2hHn-TslAdx"
device = "/dev/dm-7"
status = ["ALLOCATABLE"]
dev_size = 209712382
pe_start = 384
pe_count = 25599
}
}
logical_volumes {
datalv {
id = "removed-yUMd-RIHG-KWMP63"
status = ["READ", "WRITE", "VISIBLE"]
segment_count = 1
segment1 {
start_extent = 0
extent_count = 5120
type = "striped"
stripe_count = 1 # linear
stripes = [
"pv0", 0
]
}
}
}
}
请注意,这是由于 pvck 无法找到 LVM 标签的分区造成的!
- 我决定为该分区写入一个新的 LVM 标签并从备份文件中恢复参数。
pvcreate --uuid removed-AfF1-2hHn-TslAdx --restorefile /etc/lvm/backup/datavg /dev/mapper/mpath0-part1
- 然后我运行了 vgcfgrestore -f /etc/lvm/backup/datavg datavg
- 之后,当我发出 pvscan 时,我出现了。
- 使用 vgchange -ay datavg,我激活了 VG,LV 也可用了。
- 当我尝试安装 LV 时,它没有找到任何文件系统。我尝试了几种恢复方法,但没有成功。
- 在对受影响的 LV 进行 DD 后,我尝试使用以下方法重新创建超级块:
mkfs.ext3 -S /dev/datavg/backupdatalv
- 但结果却无法安装:
# mount /dev/datavg/backupdatalv /mnt/
mount: Stale NFS file handle
首先,发生这种情况至少可以说不是很好,所以我想尽可能地了解这种故障。
我的问题:
- 补丁和重启后 LVM 标签怎么会消失?
- 挽救 PV 后为什么文件系统不存在?(pvcreate 命令是否破坏了数据?)
- LV 中的 ext3 文件系统还能挽救吗?
- 我能做些什么来防止这个问题的发生?
提前谢谢您,Ger。
答案1
我曾经遇到过类似的问题。在我们的案例中,有人创建了一个分区来保存 PV,但当他们运行 pvcreate 命令时,他们忘记指定分区,而是使用了整个设备。系统运行良好,直到重新启动,LVM 再也找不到 PV。
那么,就您而言,是否有可能有人在创建时运行了“pvcreate /dev/mapper/mpath0”而不是“pvcreate /dev/mapper/mpath0-part1”?如果是这样,您需要从包含 PV 的磁盘中删除分区表。
从 pvcreate(8) 手册页中删除分区表:
dd if=/dev/zero of=PhysicalVolume bs=512 count=1
如果设备上有分区表,内核中的 LVM 代码将无法识别整个设备 PV。一旦我们删除分区表,PV 就会被识别,我们就可以再次访问数据。