一、原来的情况
a)pv 方面
[root@mail ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/hda6 my_vg lvm2 a- 964.00M 924.00M
/dev/hda7 my_vg lvm2 a- 1.87G 1.87G
/dev/hda8 lvm2 -- 964.81M 964.81M
/dev/hdb5 my_vg lvm2 a- 964.00M 964.00M
/dev/hdb6 my_vg lvm2 a- 3.73G 3.69G
[root@mail ~]#
b)vg 方面
[root@mail ~]# vgs
VG #PV #LV #SN Attr VSize VFree
my_vg 4 2 0 wz--n- 7.48G 7.40G
[root@mail ~]#
c)lv 方面
[root@mail ~]# lvs -o +devices
LV VG Attr LSize Origin Snap% Move Log Copy% Devices
lvol0 my_vg -wi-ao 40.00M /dev/hda6(0)
lvol1 my_vg -wi-ao 40.00M /dev/hdb6(0)
[root@mail ~]#
可以看到现在有两个逻辑卷,一个是 lvol0 ,位于 /dev/hda6 上,一个是 lvol1 ,位于 /dev/hdb6 上。
二、现在在 /dev/hda6 和 /dev/hdb6 上各建立一个文件系统
[root@mail ~]# mount |grep '/dev/mapper'
/dev/mapper/my_vg-lvol0 on /mnt/test1 type ext3 (rw)
/dev/mapper/my_vg-lvol1 on /mnt/test2 type ext3 (rw)
[root@mail ~]#
[root@mail ~]# ll /mnt/test1
total 1420
drwx------ 2 root root 12288 May 25 14:54 lost+found
-rw-r--r-- 1 root root 1433988 May 25 14:55 vmlinuz-2.6.9-5.EL // 一个上面放有内核文件
[root@mail ~]# ll /mnt/test2
total 405
-rw-r--r-- 1 root root 398755 May 25 14:56 initrd-2.6.9-5.EL.img // 一个上面放的是 ram disk 文件
drwx------ 2 root root 12288 May 25 14:54 lost+found
[root@mail ~]#
三、现在我们要用 pvcreate 模拟故障
[root@mail ~]# pvcreate -ff /dev/hda6
Really INITIALIZE physical volume "/dev/hda6" of volume group "my_vg" [y/n]? y
Can't open /dev/hda6 exclusively. Mounted filesystem?
[root@mail ~]#
可以看到 pvcreate 拒绝对那些上面有逻辑卷的 pv ,如果把 /dev/hda6 上的逻辑卷删除就可以执行上面的命令了
[root@mail ~]# pvcreate --test -ff /dev/hda6
Test mode: Metadata will NOT be updated.
Really INITIALIZE physical volume "/dev/hda6" of volume group "my_vg" [y/n]? y
WARNING: Forcing physical volume creation on /dev/hda6 of volume group "my_vg"
Physical volume "/dev/hda6" successfully created
[root@mail ~]#
四、仍然保持上面的文件系统被挂载,再用 dd 命令模拟故障(把 lvm2 标签擦除,但不擦除分区表)
[root@mail ~]# dd if=/dev/zero of=/dev/hda6 bs=512 count=1 seek=1
0+0 records in
0+0 records out
[root@mail ~]#
五、pvs、vgs、lvs 的输出
[root@mail ~]# pvs --partial
Partial mode. Incomplete volume groups will be activated read-only.
Couldn't find device with uuid 'T9ZZdJ-tAIA-T9yW-M1rK-lO6J-yFGL-B62vki'.
Couldn't find device with uuid 'T9ZZdJ-tAIA-T9yW-M1rK-lO6J-yFGL-B62vki'.
(省略)
PV VG Fmt Attr PSize PFree
/dev/hda7 my_vg lvm2 a- 1.87G 1.87G
/dev/hda8 lvm2 a- 964.00M 964.00M
/dev/hdb5 my_vg lvm2 a- 964.00M 964.00M
/dev/hdb6 my_vg lvm2 a- 3.73G 3.69G
unknown device my_vg lvm2 a- 964.00M 924.00M // 变成未知设备了
[root@mail ~]#
[root@mail ~]# vgs --partial
Partial mode. Incomplete volume groups will be activated read-only.
Couldn't find device with uuid 'T9ZZdJ-tAIA-T9yW-M1rK-lO6J-yFGL-B62vki'.
Couldn't find device with uuid 'T9ZZdJ-tAIA-T9yW-M1rK-lO6J-yFGL-B62vki'.
(省略)
VG #PV #LV #SN Attr VSize VFree
my_vg 4 2 0 rz-pn- 7.48G 74G // 卷组的 metadata 变成只读的了,且是 partial 的状态
[root@mail ~]#
[root@mail ~]# lvs --partial
Partial mode. Incomplete volume groups will be activated read-only.
Couldn't find device with uuid 'T9ZZdJ-tAIA-T9yW-M1rK-lO6J-yFGL-B62vki'.
Couldn't find device with uuid 'T9ZZdJ-tAIA-T9yW-M1rK-lO6J-yFGL-B62vki'.
(省略)
LV VG Attr LSize Origin Snap% Move Log Copy%
lvol0 my_vg -wi-ao 40.00M
lvol1 my_vg -wi-ao 40.00M // 但 lv 方面显示还是正常的
[root@mail ~]#
五、现在可以访问文件系统吗?可以卸载/挂载故障 pv 上的文件系统吗?
首先我们访问位于 /dev/hda6 上的 /dev/my_vg/lvol0 文件系统。
[root@mail test2]# cd /mnt/test1
[root@mail test1]# ll
total 1420
drwx------ 2 root root 12288 May 25 15:34 lost+found
-rw-r--r-- 1 root root 1433988 Jan 6 2005 vmlinuz-2.6.9-5.EL
[root@mail test1]# touch a
[root@mail test1]# ll
total 1420
-rw-r--r-- 1 root root 0 May 25 15:39 a
drwx------ 2 root root 12288 May 25 15:34 lost+found
-rw-r--r-- 1 root root 1433988 Jan 6 2005 vmlinuz-2.6.9-5.EL
[root@mail test1]#
[root@mail test1]# df -hl
Filesystem Size Used Avail Use% Mounted on
/dev/hdb2 15G 6.2G 7.6G 46% /
/dev/hdb1 99M 8.4M 86M 9% /boot
none 379M 0 379M 0% /dev/shm
/dev/mapper/my_vg-lvol0
39M 5.9M 31M 16% /mnt/test1
/dev/mapper/my_vg-lvol1
39M 4.9M 32M 14% /mnt/test2
[root@mail test1]#
可以看到在分区表没有被擦除的情况下,还是可以正常访问文件系统的。
补充 :这说明 pv 一旦丢失,并不是没有机会挽救数据,我们可以把文件系统以只读的方式挂载,再把里面的数据拷贝出来
[root@mail test1]# mount -o remount -o ro /mnt/test1
[root@mail test1]# mount |grep 'lvol0'
/dev/mapper/my_vg-lvol0 on /mnt/test1 type ext3 (ro)
[root@mail test1]#
[root@mail test1]# touch d
touch: cannot touch `d': Read-only file system // 只读系统,不允许创建文件
[root@mail test1]# cp a /tmp
[root@mail test1]# // 把需要的文件拷贝到安全的地方
下面我们访问在别的 pv 上的文件系统
[root@mail ~]# cd /mnt/test2
[root@mail test2]# ll
total 405
-rw-r--r-- 1 root root 398755 May 17 12:40 initrd-2.6.9-5.EL.img
drwx------ 2 root root 12288 May 25 15:34 lost+found
[root@mail test2]# touch a
[root@mail test2]# ll
total 405
-rw-r--r-- 1 root root 0 May 25 15:44 a
-rw-r--r-- 1 root root 398755 May 17 12:40 initrd-2.6.9-5.EL.img
drwx------ 2 root root 12288 May 25 15:34 lost+found
[root@mail test2]#
可以看到一个 pv 的损坏,并不一定会影响到其他的 pv 上的文件系统
六、如果用 dd 命令把 /dev/my_vg/lvol0 的分区表擦除
[root@mail ~]# dd if=/dev/zero of=/dev/my_vg/lvol0 count=10
10+0 records in
10+0 records out
[root@mail ~]# mount /dev/my_vg/lvol0 /mnt/test1
mount: you must specify the filesystem type
[root@mail ~]#
注意,这里 dd 命令的 in 必须用 /dev/my_vg/lvol0 ,而不是 /dev/hda6 ,否则是不会擦除分区表的。
七、再用 dd 命令把另外一个文件系统的分区表也擦除
[root@mail ~]# pvs --partial -o +pe_start --unit s
Partial mode. Incomplete volume groups will be activated read-only.
Couldn't find device with uuid 'T9ZZdJ-tAIA-T9yW-M1rK-lO6J-yFGL-B62vki'
(省略)
PV VG Fmt Attr PSize PFree 1st PE
/dev/hda7 my_vg lvm2 a- 3915776S 3915776S 384S
/dev/hda8 my_vg lvm2 a- 1974272S 1974272S 384S
/dev/hdb5 my_vg lvm2 a- 1974272S 1974272S 384S
/dev/hdb6 my_vg lvm2 a- 7815168S 7733248S 384S // 第一个 pe 是在 /dev/hdb6 的第384个扇区开始的。
unknown device my_vg lvm2 a- 1974272S 1892352S 384S
[root@mail ~]#
我们用 dd 命令把 /dev/hdb6 的前 400 个扇区都清零(包括 LVM2 label、meta data、/dev/my_vg/lvol1 的分区表)
[root@mail ~]# dd if=/dev/zero of=/dev/hdb6 bs=512 count=400
400+0 records in
400+0 records out
[root@mail ~]#
[root@mail ~]# pvs --partial
Partial mode. Incomplete volume groups will be activated read-only.
Couldn't find device with uuid 'T9ZZdJ-tAIA-T9yW-M1rK-lO6J-yFGL-B62vki'.
Couldn't find device with uuid 'uH3elJ-PFj2-nj2o-UWiN-MPdU-yivG-wZphDl'.
(省略)
PV VG Fmt Attr PSize PFree
/dev/hda7 my_vg lvm2 a- 1.87G 1.87G
/dev/hda8 my_vg lvm2 a- 964.00M 964.00M
/dev/hdb5 my_vg lvm2 a- 964.00M 964.00M
unknown device my_vg lvm2 a- 964.00M 924.00M
unknown device my_vg lvm2 a- 3.73G 3.69G // 可以看到 /dev/hdb6 也变成未知设备了
[root@mail ~]#
[root@mail ~]# mount /dev/my_vg/lvol1 /mnt/test2
mount: you must specify the filesystem type // 可以看到 /dev/my_vg/lvol1 变成未知类型的文件系统了
[root@mail ~]#
补充 :从上面我们可以看出,一个 pv 的丢失有两种情况 :
a)LVM2 标签丢失而已,但文件系统的分区表还在(用 pvs --partial -o +pe_start 就可以看出分区表大概在那一块)
b)LVM2 标签,meta data、分区表都丢失了,这样除非用 fsck 修复文件系统才行
八、上面是在文件系统没有挂载前就擦除分区表,如果是文件被挂载的时候,就把分区表擦除呢?
[root@mail ~]# dd if=/dev/zero of=/dev/my_vg/lvol0 count=10
10+0 records in
10+0 records out
[root@mail ~]# df -hl
Filesystem Size Used Avail Use% Mounted on
/dev/hdb2 15G 6.2G 7.6G 46% /
/dev/hdb1 99M 8.4M 86M 9% /boot
none 379M 0 379M 0% /dev/shm
/dev/mapper/my_vg-lvol0
4.0T 4.0T 0 100% /mnt/test1 // 可以看到大小变成了 4T ,利用率是 100%
/dev/mapper/my_vg-lvol1
39M 4.9M 32M 14% /mnt/test2
[root@mail ~]#
[root@mail ~]# cd /mnt/test1
[root@mail test1]# ll
total 0
[root@mail test1]#
数据都丢失了
[root@mail ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/hda6 my_vg lvm2 a- 964.00M 924.00M
/dev/hda7 my_vg lvm2 a- 1.87G 1.87G
/dev/hda8 my_vg lvm2 a- 964.00M 964.00M
/dev/hdb5 my_vg lvm2 a- 964.00M 964.00M
/dev/hdb6 my_vg lvm2 a- 3.73G 3.69G
[root@mail ~]#
不过这时 LVM2 标签还在,所以 pvs 不会报错
九、现在我们选择好配置文件,开始恢复 pv 了
我们选择 /dev/hda8 作为新的 pv 来代替 /dev/hda6
[root@mail ~]# pvs --partial
Partial mode. Incomplete volume groups will be activated read-only.
Couldn't find device with uuid '5iSsqG-lopN-8WBo-CXhQ-wGGV-hoYV-a97yJs'.
(省略)
PV VG Fmt Attr PSize PFree
/dev/hda7 my_vg lvm2 a- 1.87G 1.87G
/dev/hda8 lvm2 -- 964.81M 964.81M
/dev/hdb5 my_vg lvm2 a- 964.00M 964.00M
/dev/hdb6 my_vg lvm2 a- 3.73G 3.69G
unknown device my_vg lvm2 a- 964.00M 924.00M
[root@mail ~]#
[root@mail ~]# pvcreate --restorefile /etc/lvm/backup/my_vg --uuid 5iSsqG-lopN-8WBo-CXhQ-wGGV-hoYV-a97yJs /dev/hda8
Couldn't find device with uuid '5iSsqG-lopN-8WBo-CXhQ-wGGV-hoYV-a97yJs'.
Physical volume "/dev/hda8" successfully created
[root@mail ~]#
这样就把 /dev/hda6 上原来的 pv 信息写入到 /dev/hda8 上。
十、用 pvs -v 查看各 pv 的情况
[root@mail ~]# pvs -v
Scanning for physical volume names
Wiping cache of LVM-capable devices
PV VG Fmt Attr PSize PFree DevSize PV UUID
/dev/hda7 my_vg lvm2 a- 1.87G 1.87G 1.87G 3CC6h5-TV0j-PTdf-vjbt-4X16-81eK-AdI3EL
/dev/hda8 my_vg lvm2 a- 964.00M 924.00M 964.81M 5iSsqG-lopN-8WBo-CXhQ-wGGV-hoYV-a97yJs
/dev/hdb5 my_vg lvm2 a- 964.00M 964.00M 964.81M t12gYi-62oj-yhUf-RY43-em53-rQQ8-CxiiyK
/dev/hdb6 my_vg lvm2 a- 3.73G 3.69G 3.73G 04neNp-cqzC-gYmS-vntk-Pqke-8XQM-dcTXRb
[root@mail ~]#
可以看到 /dev/hda8 已经是 my_vg 的一部分了,而且 UUID 就等于 /dev/hda6 原来的 UUID
而 /dev/hda6 则没有显示,说明它上面的 LVM2 标签被擦除了
不过这时候 /etc/lvm/backup/my_vg 文件并不会更新,它还是认为有一个 /dev/hda6 设备
pv0 {
id = "5iSsqG-lopN-8WBo-CXhQ-wGGV-hoYV-a97yJs"
device = "/dev/hda6" # Hint only
status = ["ALLOCATABLE"]
dev_size = 1975932 # 964.811 Megabytes
pe_start = 384
pe_count = 241 # 964 Megabytes
}
十一、再查看 vg 方面的情况,并尝试把 /dev/hda6 从 my_vg 中”删除“
[root@mail ~]# vgs
VG #PV #LV #SN Attr VSize VFree
my_vg 4 2 0 wz--n- 7.48G 7.40G
[root@mail ~]#
[root@mail ~]# vgreduce --removemissing my_vg
Volume group "my_vg" is already consistent
[root@mail ~]#
可以看到已经不用删除了。
十二、再看看 lvs 的情况
[root@mail ~]# lvs -o +devices
LV VG Attr LSize Origin Snap% Move Log Copy% Devices
lvol0 my_vg -wi-ao 40.00M /dev/hda8(0)
lvol1 my_vg -wi-ao 40.00M /dev/hdb6(0)
[root@mail ~]#
十三、再看看文件系统的情况
[root@mail ~]# mount /dev/my_vg/lvol0 /mnt/test1
mount: you must specify the filesystem type
[root@mail ~]#
由于前面已经把分区表擦除了,所以这里即使恢复了 pv 也无法恢复文件系统
十四、重启 vg 会怎样?
[root@mail ~]# vgchange -an my_vg
Volume group my_vg metadata is inconsistent
Volume group for uuid not found: sPsqqxZVfsT0fD3ZiMS6hJAeyDLR9LIx4eyS3c2uyN0mvI3aiOsheXofomKTMPzE
Volume group my_vg metadata is inconsistent
Volume group for uuid not found: sPsqqxZVfsT0fD3ZiMS6hJAeyDLR9LIxMqyL7RjD242soNSbcmLZJcgZuPS5U3li
2 logical volume(s) in volume group "my_vg" now active
[root@mail ~]#
可以看到报告 vg 的 metadata 不一致
十五、是否需要恢复卷组的 VGDA ?
这说明我们还需要进一步的恢复 vg 的 metadata 信息
[root@mail ~]# vgchange -an my_vg
0 logical volume(s) in volume group "my_vg" now active
[root@mail ~]# vgchange -ay my_vg
2 logical volume(s) in volume group "my_vg" now active
[root@mail ~]#
现在 vg 的 metadata 就一致了,不过现在 /etc/lvm/backup/my_vg 文件已经被修改了
pv0 {
id = "5iSsqG-lopN-8WBo-CXhQ-wGGV-hoYV-a97yJs"
device = "/dev/hda8" # Hint only
status = ["ALLOCATABLE"]
dev_size = 1975932 # 964.811 Megabytes
pe_start = 384
pe_count = 241 # 964 Megabytes
}
十六、是否需要把故障pv从 vg 中删除出去?
不需要了
十七、现在考虑如何恢复文件系统的问题了
首先我们要找到备份的 superblock 位于什么地方,这需要用到 mke2fs 命令的一个”很有用的参数“ : -n
-n causes mke2fs to not actually create a filesystem, but display what it would do if it were to create a filesystem.
This can be used to determine the location of the backup superblocks for a particular filesystem, so long as the
mke2fs parameters that were passed when the filesystem was originally created are used again. (With the -n option
added, of course!)
# 也就是说 -n 让 mke2fs 不要真正建立文件系统,而是”模拟“建立
# 从上面我们可以看出找到备份的 superblock
[root@mail backup]# mke2fs -n /dev/my_vg/lvol0
mke2fs 1.35 (28-Feb-2004)
max_blocks 41943040, rsv_groups = 5120, rsv_gdb = 159
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
10240 inodes, 40960 blocks
2048 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=41943040
5 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
8193, 24577 // 这行就是我们要的
[root@mail backup]#
现在可以重新建立文件系统了,不过现实中需要注意一点,
当一个文件系统出现问题时,并不一定要重建 pv ,可以用 fsck -N 看一下 fsck 会怎么修复(但不真正修复)
再用 mke2fs -n /dev// 找出 superblock 的可能位置
然后用 e2fsck -b /dev// 修复
阅读(3041) | 评论(0) | 转发(0) |