3.1 kfed工具介绍
本节内容主要使用kfed工具研究asm diskheader的物理结构,无论asm磁盘组是否启动均可以使用kfed工具读取和修改asm元数据信息,语法如下图所示,
图3 kfed工具解析
3.2 磁盘头kfbh结构解析
使用kfed命令读取ASM磁盘头
$ kfed read aus=1M aun=0 blkn=0 dev=/dev/oracleasm/disks/data2
磁盘头元数据块共分为两部分,内部实现由C语言的两个结构体组成,通用元数据层(kfbh)和磁盘头元数据层(kfdhdb),偏移量0~31为通用元数据层共包含32 bytes,其它部分为磁盘头元数据层,根据元数据块类型不同,物理结构各有差异。
所有ASM元数据块均包含通用元数据层,前32 bytes结构一致,以磁盘头元数据块为例,
kfbh.endian: 1 ; 0x000: 0x01
endian结构体kfbh中的成员变量,代表服务器字节序,大端序为0,小端序为1,“1 ; 0x000: 0x01”代表偏移量为0x000的地址,存储的值为0x01,其二进制表示为“1”,说明数据库运行操作系统为小端序,其余成员变量解释如下图所示,
图3 kfbh结构解析
3.3 磁盘头kfdhdb结构解析
kfdhdb.fstlocn: 1 ; 0x0cc: 0x00000001
kfdhdb.altlocn: 2 ; 0x0d0: 0x00000002
kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002
kfdhdb.fstlocn存储指向KFBTYP_FREESPC所在当前AU的ASM块号;
kfdhdb. altlocn存储指向KFBTYP_ALLOCTBL所在当前AU的ASM块号
kfdhdb.f1b1locn存储指向ASM file 1 文件目录表,块类型代码为kfbh.type: 4 ; 0x002: KFBTYP_FILEDIR,因此文件目录表并非存储在固定位置,具体存储位置以kfdhdb.f1b1locn实际存储值为准。
kfdhdb.vfstart: 0 ; 0x0ec: 0x00000000
kfdhdb.vfend: 0 ; 0x0f0: 0x00000000
kfdhdb.spfile: 0 ; 0x0f4: 0x00000000
kfdhdb.spfflg: 0 ; 0x0f8: 0x00000000
kfdhdb.vfstart/ vfend指向表决盘存储的开始/结束AU,0表示未存储表决盘。
kfdhdb.spfile/ spfflg,表示该磁盘中是否存储ASM spfile,以及ASM spfile的存储位置,因此在ASM磁盘组未MOUNT的情况下,依然可以通过该值的信息,查找和加载spfile,从而启动asm实例。其它成员变量的解析如下图所示,
图4 kfdhdb结构解析