免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2439 | 回复: 0

LVM案例(关键字VGDA、VGSA、PV头、PVID、VGID) [复制链接]

论坛徽章:
0
发表于 2011-02-16 13:48 |显示全部楼层
LVM案例(关键字VGDA、VGSA、PV头、PVID、VGID)
案例:
主机A、C,A -- 生产机,C -- 测试机
主机A:
#lspv
pv1     0000000000001111        datavg
pv2     0000000000002222        datavg
pv3     0000000000003333        datavg
pv4     0000000000004444        datavg

主机C:
#lspv
pv1     0000000000001111        None
pv2     0000000000002222        None
pv3     0000000000003333        None
pv4     0000000000004444        None

2台主机同时看到4块PV,但仅仅在A上使用

误操作:
在主机C上用PV1强制新建一个testvg
主机C:
#lspv
pv1     0000000000001111        testvg
注意PVID之前就已经识别,未变化过。接着将testvgexport掉,生产环境A的数据库故障。数据库重新启动,成功。应用也正常。

开始擦屁股,A主机上lsvg、lsvg -l、lspv命令都正常,errpt有报错,就是在C机上mkvg的时候,A机报得错,一切看起来似乎很正常,但是内伤严重!!!电话求助larryh,讨论了一番后,尝试过一把synclvodm,无果。

发现对pv做lqueryvg,以及readvgda的时候就不正常了。两块好的的pv里读出的vgda信息,内容完整,且仅有2个地方不同,是PVID和pv_num。而损坏的pv1的VGDA信息已经非常不完整。但是应用正常,起码说明盘里的应用数据是正常的未被损坏。

基本思路:损坏的是PV1的PV头部的信息,得想办法从好盘里恢复。当晚回家,一夜没睡好,睡觉梦到很多命令...   

修复:
第二天larryh给出解决方案,将好盘的PV头信息dd出来,修改其中的PVID和pv_num为原PV1的正确数值,
然后把修改好的数据dd回损坏的PV,成功。一切命令正常。
在C主机上做importvg等操作一切正常,故障修复!

修复方法的探寻,关键点有2点
1、PV头里记录了哪些信息?
2、整个PV头的精确的大小是多少?

经过几天断断续续的研究,研究情况如下,欢迎大家讨论!
物理扇区Physical Sector,物理扇区号Physical Sector Number(PSN)
一个扇区=512字节

PV头里的重要扇区的记录信息:
0扇区=512字节
00000080h-00000087h 8个字节记录了PVID
这个可以拿几个系统的PV的头部出来研究,就可以发现。qintl在他的帖子里用
chdev -l hdiskX -a pv=yes
chdev -l hdiskX -a pv=clear的方法来验证过,没有问题。

7扇区=512字节
00000E00h-0000E03h 4个字节         LVMID
00000E04h-0000E13h 16                VGID
00000E14h-0000E17h 4                两份VGDA+VGSA总长度.单位扇区 00 00 10 74 = 4212
00000E18h-0000E1Bh 4                单份VGDA长度.00 00 08 32 = 2098
00000E1Ch-0000E1Fh 4                第一份VGDA起始扇区号. 00 00 00 88 = 136
00000E20h-0000E23h 4                第二份VGDA起始扇区号.00 00 08 C2 = 2242
00000E24h-0000E27h 4                Bad Block Relocation区起始扇区号
00000E28h-0000E2Bh 4                Bad Block Relocation区扇区数
00000E2Ch-0000E2Dh 2                本PV在VG中的编号,从1开始即00 01, 00 02, 00 03 …
00000E2Eh-0000E2Fh 2                PP Size对2的幂
00000E30h-0000E33h 4                单份VGSA长度.单位扇区 00 00 00 08 = 8
00000E34h-0000E37h 4                第一份VGSA起始扇区号.00 00 00 80 = 128
00000E38h-0000E3Bh 4                第二份VGSA起始扇区号.00 00 08 BA = 2234
00000E3Ch-0000E3Dh 2                VGDA和VGSA版本号
00000E3Eh-0000E3Fh 2                VG Type编号
00000E40h-0000E43h 4                LTG大小
00000E44h-0000FFFh 444                保留未用

以上信息在lvmrec.h有完整记录
/* Old LVM record layout
00000E00   LVM___ID VGID__W1 VGID__W2 VGID__W3
00000E10   VGID__W4 AREA_LEN VGDA_LEN VGDAPSN0
00000E20   VGDAPSN1 RELOCPSN RELOCLEN PVnmPPsh
00000E30   VGSA_LEN VGSAPSN0 VGSAPSN1 VERnTYPE
00000E40   LTG_SIZE RESERVED RESERVED RESERVED
00000E50   RESERVED RESERVED RESERVED RESERVED
...
00000FF0   RESERVED RESERVED RESERVED RESERVED
*/

readvgda读出来的信息也跟以上信息相符
对于普通VG需要dd的精确扇区数=128+4212=4340
至于VGDA、VGSA里的信息,参考了qintl的帖子里给出的结构,在此不再累述。VGDA里比较私有的信息是VGID,记录的地方可以看dd出来的东西可以找出来。这次案例让我加深了对LVM的理解,很有益处。在解决问题的过程中,翻看LU上xiaomage、qintl、seventh和鸡哥的类似帖有豁然开朗的感觉。正如larryh原来所说,在LVM上花再多的时间都不为过!

参考资料:
1、larryh的研究成果,整个PV头结构
2、AIX Logical Volume Manager from A to Z_ Introduction and Concepts
3、LU上xiaomage和qintl的两个精华帖
http://bbs.loveunix.net/viewthre ... aomage79&page=1
http://bbs.loveunix.net/viewthre ... aomage79&page=1
4、AIX操作系统下的几个头文件hd_psn.h、lvmrec.h等

讨论:
1、mkvg的操作只是修改了PV头部的保留区域部分信息,而真正的数据区域未动,所以即便mkvg误操作也是可以恢复的。这一点qintl在帖子里说过,案例证明是正确的。

2、我的案例并不复杂,仅仅是误用了mkvg,没有新建lv甚至新建FS的动作,所以只有PV的头部信息需要恢复。如果整个硬盘的数据损坏,只能从现成的好数据里找到MAP信息做恢复,如果连MAP信息都没有,只能构建MAP信息再做恢复。这需要理解更透彻,更细心,不能犯一点错误。

3、案例仅仅针对普通VG。我事后尝试研究BIG VG的PV头结构,没有完成。BIG VG的0扇区和7扇区的内容和普通VG差别不大,很容易读出来。只是VGSA、VGDA的扇区变大了,这在BIG VG的7扇区有记录,两份VGSA的开始扇区号分别变为了128、9216;两份VGDA的扇区号是:384、9472。但BIG VG里的VGSA、VGDA结构,看不出来,找了几个头文件+dd出来的内容识别,不符合,没有继续下去了。不知哪位可以提供?以供研究

欢迎大家讨论!

在此再次特别感谢larryh的强力支持!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP