Chinaunix首页 | 论坛 | 博客
  • 博客访问: 561484
  • 博文数量: 375
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 15
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-20 10:21
文章分类

全部博文(375)

文章存档

2015年(1)

2014年(374)

分类: LINUX

2014-08-18 11:06:28

一、原来的情况


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// 修复








 
阅读(3020) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~