第五章 磁盘头格式
位于每个磁盘第一个AU,AU编号0,可以用如下Kfed命令读取:
[oracle@red1 disks]$ kfed read /dev/oracleasm/disks/VOL1 aun=0 blkn=0|more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD
……………………
具体内容如下:
00 endian_kfbh:
Little Endian = 1
Big Endian = 0
01 hard_kfbh:
KFBH_HARD 0x02 /* expected magic number */
KFBH_HARD_4K 0x80 /* 4K metadata block size */
KFBH_HARD_8K 0xa0 /* 8K metadata block size */
KFBH_HARD_16K 0xc0 /* 16K metadata block size */
KFBH_HARD_32K 0xe0 /* 32K metadata block size */
02 type_kfbh:
磁盘头总是KFBTYP_DISKHEAD
03 datfmt_kfbh:
04 to 07 block_kfbh.blk:
磁盘头总是为0
08 to 0B block_kfbh.obj:
Since this is a little endian architecture this represents the number "0x80000000". The high order byte will always be 0x80 and the lower bytes represent the disk number which is 0x0 here meaning this is the first disk in the diskgroup.
0C to 0F check_kfbh:
校验码,写到磁盘前计算。
10 to 13 fcn_kfbh.base
14 to 17 fcn_kfbh.wrap
18 to 1B fspare1_kfbh
1C to 1f fspare2_kfbh
磁盘头无意义。
20 to 27 driver_kfdhdb.driver_kfdhdb:
没有使用Lib包的时候显示为ORCLDISK。
28 to 3F driver_kfdhdb.reserved_kfddrb:
kfdhdb.driver.reserved[0]: 0 ; 0x008: 0x00000000
kfdhdb.driver.reserved[1]: 0 ; 0x00c: 0x00000000
kfdhdb.driver.reserved[2]: 0 ; 0x010: 0x00000000
kfdhdb.driver.reserved[3]: 0 ; 0x014: 0x00000000
kfdhdb.driver.reserved[4]: 0 ; 0x018: 0x00000000
kfdhdb.driver.reserved[5]: 0 ; 0x01c: 0x00000000
为0。
40 to 43 compat_kfdhdb:
版本号
44 and 45 dsknum_kfdhdb:
可以看到占两个字节:
kfdhdb.dsknum: 0 ; 0x024: 0x0000
一个DG中,最多只能有65536块盘。
46 grptyp_kfdhdb:
冗余策略:
KFDGTP_INVALID ((kfdgtp)0) /* Illegal value */
KFDGTP_EXTERNAL ((kfdgtp)1) /* External redundancy */
KFDGTP_NORMAL ((kfdgtp)2) /* Normal redundancy */
KFDGTP_HIGH ((kfdgtp)3) /* High redundancy */
47 hdrsts_kfdhdb:
KFDHDR_INVALID ((kfdhdr)0) /* Illegal value */
KFDHDR_UNKNOWN ((kfdhdr)1) /* Disk header block unreadable */
KFDHDR_CANDIDATE ((kfdhdr)2) /* No OSM or OS disk header found */
KFDHDR_MEMBER ((kfdhdr)3) /* Normal member of the group */
KFDHDR_FORMER ((kfdhdr)4) /* Disk dropped cleanly from group */
KFDHDR_CONFLICT ((kfdhdr)5) /* Header conflicts */
KFDHDR_INCOMPAT ((kfdhdr)6) /* Written by incompatible software*/
KFDHDR_PROVISIONED ((kfdhdr)7) /* Disk was prepared beforehand */
参见V$asm_disk
48 to 67 dskname_kfdhdb
68 to 87 grpname_kfhdb:
88 to A7 fgname_kfdhdb:
A8 to C7 capname_kfdhdb:
未使用
kfdhdb.crestmp.hi: 32956296 ; 0x0a8: HOUR=0x8 DAYS=0x1c MNTH=0x7 YEAR=0x7db
kfdhdb.crestmp.lo: 978288640 ; 0x0ac: USEC=0x0 MSEC=0x3e0 SECS=0x24 MINS=0xe
创建时的时间戳
kfdhdb.mntstmp.hi: 32956352 ; 0x0b0: HOUR=0x0 DAYS=0x1e MNTH=0x7 YEAR=0x7db
kfdhdb.mntstmp.lo: 95641600 ; 0x0b4: USEC=0x0 MSEC=0xd8 SECS=0x1b MINS=0x1
Mount时的时间戳
kfdhdb.secsize: 512 ; 0x0b8: 0x0200
扇区大小
kfdhdb.blksize: 4096 ; 0x0ba: 0x1000
块大小
kfdhdb.ausize: 1048576 ; 0x0bc: 0x00100000
AU大小。
kfdhdb.mfact: 113792 ; 0x0c0: 0x0001bc80
版本相关,无意义
kfdhdb.dsksize: 102 ; 0x0c4: 0x00000066
本磁盘包含的AU数量。kfdhdb.ausize * dsksize_kfdhdb = disk size
kfdhdb.pmcnt: 2 ; 0x0c8: 0x00000002
AU的物理地址空间。
kfdhdb.fstlocn: 1 ; 0x0cc: 0x00000001
说明第一个AU后,是用户可用空间。
kfdhdb.altlocn: 2 ; 0x0d0: 0x00000002
说明文件目录开始自第二个AU
kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002
File Directory block 1 Allocation Unit number
第六章 PST - Partnership and Status Table
位于每个磁盘第二个AU,AU编号为1。
PST - Partnership and Status Table contains the status information about
the ASM disks in a disk group - disk number, status (either online or offline),
partner disk number, failure group info (11g) and heartbeat info. AU number 1
in every disk within a disk group is reserved for PST. Only a few disk actually
have a PST - in external redundancy group we only have one PST table, in normal
redundancy group (double mirroring) we have up to 3 PST and in high redundancy
we have up to 5 PST. The GMON process is responsible for PST processing. See
kfdp source code for more informaiton.
kfbh.endian
Little endian = 1
Big endian = 0
kfbh.hard
H.A.R.D. magic # and block size
kfbh.type
metadata block type,对PST为KFBTYP_PST_META。
kfbh.datfmt
metadata block data format
kfbh.block
blk :T=0 NUMB=0x100,共四个字节,其中一个字节为T=0,剩余的为NUMB=0x100
obj -- Disk header should have TYPE=0x8 NUMB=
kfbh.check
校验码
kfbh.fcn.base: 0 ; 0x010: 0x00000000
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
PST最后改变的时间。
kfdpHdrB.time.hi: 32956296 ; 0x000: HOUR=0x8 DAYS=0x1c MNTH=0x7 YEAR=0x7db
kfdpHdrB.time.lo: 978361344 ; 0x004: USEC=0x0 MSEC=0x27 SECS=0x25 MINS=0xe
PST最后被UPDATE的时间
kfdpHdrB.last: 1 ; 0x008: 0x00000001
kfdpHdrB.next: 1 ; 0x00c: 0x00000001
版本号:
kfdpHdrB.copyCnt: 2 ; 0x010: 0x02
1:外部冗余。2:正常冗余。等等
kfdpHdrB.incarn: 0 ; 0x014: 0x00000000
化身号,PST发生移动时增加
kfdpHdrB.copy[0]: 0 ; 0x018: 0x0000
kfdpHdrB.copy[1]: 2 ; 0x01a: 0x0002
kfdpHdrB.copy[2]: 0 ; 0x01c: 0x0000
kfdpHdrB.copy[3]: 0 ; 0x01e: 0x0000
kfdpHdrB.copy[4]: 0 ; 0x020: 0x0000
冗余模式:
[0] -- external redundancy
[0-2] -- normal redundancy
[0-4] -- high redundancy
kfdpHdrB.dtaSz: 4 ; 0x022: 0x0004
kfdpHdrB.dtaSz
kf3.h /* # dta entries in PST */
This is the number of disks that it needs to keep track of.
第七章 目录结构
磁盘头中的kfdhdb.f1b1locn位,指明了文件目录的开始位置。
下面读取sdd中2号Au的1号块(第三个Au的第二个块),1号块中是1号文件的AU分布。2号块中是2号文件的AU分布。以此类推。每个块是4096字节,第一个块被占作别用,一个AU可以保存255个文件。所以,此DG的0号磁盘、2号AU中保存1至255个文件的AU分布。256号文件在第二个AU中。
$ kfed read /dev/sdd aun=2 blkn=1 | more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 4 ; 0x002: KFBTYP_FILEDIR // block type = file directory block...
kfffdb.node.incarn: 1 ; 0x000: A=1 NUMM=0x0 // 文件化身号。参见V$ASM_ALIAS.FILE_INCARNATION
kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffff
kfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0
kfffdb.hibytes: 0 ; 0x00c: 0x00000000 // 文件大小
kfffdb.lobytes: 2097152 ; 0x010: 0x00200000 // 文件大小(此处是2M,两个AU)
kfffdb.xtntcnt: 2 ; 0x014: 0x00000002 // 文件一共有两个区
kfffdb.xtnteof: 2 ; 0x018: 0x00000002 // 在EOF标志前有两个区
kfffdb.blkSize: 4096 ; 0x01c: 0x00001000 // 标准ASM块大小
kfffdb.flags: 1 ; 0x020: O=1 S=0 S=0 D=0 C=0 I=0 R=0 A=0
// Flag definitions
O - File is original, not snapshot
S - File is striped
S - Strict allocation policy
D - File is damaged
C - File creation is committed
I - File has empty indirect block
R - File has known at-risk value
A - The at-risk value itsefl
kfffdb.fileType: 15 ; 0x021: 0x0f //文件类型为元数据
kfffdb.dXrs: 17 ; 0x022: SCHE=0x1 NUMB=0x1 // 直接区冗余方案
kfffdb.iXrs: 17 ; 0x023: SCHE=0x1 NUMB=0x1 // 间接区冗余方案
kfffdb.dXsiz[0]: 4294967295 ; 0x024: 0xffffffff // # 直接区的大小
kfffdb.dXsiz[1]: 0 ; 0x028: 0x00000000
kfffdb.dXsiz[2]: 0 ; 0x02c: 0x00000000
kfffdb.iXsiz[0]: 4294967295 ; 0x030: 0xffffffff // # 间接区的大小
kfffdb.iXsiz[1]: 0 ; 0x034: 0x00000000
kfffdb.iXsiz[2]: 0 ; 0x038: 0x00000000
kfffdb.xtntblk: 2 ; 0x03c: 0x0002 // 直接区和间接区的总数
kfffdb.break: 300 ; 0x03e: 0x012c // 间接区的索引
kfffdb.priZn: 0 ; 0x040: 0x00 // Primary extent allocation zone
kfffdb.secZn: 0 ; 0x041: 0x00 // Secondary extent allocation zone
kfffdb.ub2spare: 0 ; 0x042: 0x0000 // Spare
kfffdb.alias[0]: 4294967295 ; 0x044: 0xffffffff // No alias pointers for this file
kfffdb.alias[1]: 4294967295 ; 0x048: 0xffffffff
kfffdb.strpwdth: 0 ; 0x04c: 0x00 // Stripe width in extents
kfffdb.strpsz: 0 ; 0x04d: 0x00 // Stripe size in 2^N bytes
kfffdb.usmsz: 0 ; 0x04e: 0x0000 // User metadata size
kfffdb.crets.hi: 32855344 ; 0x050: HOUR=0x10 DAYS=0x9 MNTH=0x5 YEAR=0x7d5
kfffdb.crets.lo: 28766208 ; 0x054: USEC=0x0 MSEC=0x1bc SECS=0x1b MINS=0x0
// 文件的创建日期: 9 May 2005 16:00:27
kfffdb.modts.hi: 32855344 ; 0x058: HOUR=0x10 DAYS=0x9 MNTH=0x5 YEAR=0x7d5
kfffdb.modts.lo: 28766208 ; 0x05c: USEC=0x0 MSEC=0x1bc SECS=0x1b MINS=0x0
// 文件的修改日期
kfffdb.spare[0]: 0 ; 0x060: 0x00000000 // Pad to leave room for 360 kfxp
...
kfffdb.spare[15]: 0 ; 0x09c: 0x00000000
kfffdb.usm: ; 0x0a0: length=0 // User metadata
接下来是1号文件的AU分布
kfffde[0].xptr.au: 2 ; 0x4a0: 0x00000002
kfffde[0].xptr.disk: 0 ; 0x4a4: 0x0000
kfffde[0].xptr.flags: 0 ; 0x4a6: L=0 E=0 D=0 C=0 S=0
kfffde[0].xptr.chk: 40 ; 0x4a7: 0x28
kfffde[1].xptr.au: 92 ; 0x4a8: 0x0000005c
kfffde[1].xptr.disk: 0 ; 0x4ac: 0x0000
kfffde[1].xptr.flags: 0 ; 0x4ae: L=0 E=0 D=0 C=0 S=0
kfffde[1].xptr.chk: 118 ; 0x4af: 0x76
kfffde[2].xptr.au: 4294967295 ; 0x4b0: 0xffffffff // no more extents
kfffde[2].xptr.disk: 65535 ; 0x4b4: 0xffff
kfffde[2].xptr.flags: 0 ; 0x4b6: L=0 E=0 D=0 C=0 S=0
kfffde[2].xptr.chk: 42 ; 0x4b7: 0x2a
...
第八章 重要的文件
一、1号文件,文件目录。记录所有其他文件的AU分布
二、2号文件,磁盘目录。记录所有磁盘状态
其中的标志位信息如下:kfddde[0].state:
#define KFDSTA_INVALID ((kfdsta)0) /* Illegal value */
#define KFDSTA_UNKNOWN ((kfdsta)1) /* ASM disk state not known */
#define KFDSTA_NORMAL ((kfdsta)2) /* Happy disk */
#define KFDSTA_UNUSED ((kfdsta)3) /* Unused State - Open */
#define KFDSTA_DROPPING ((kfdsta)4) /* Disk being dropped from group */
#define KFDSTA_HUNG ((kfdsta)5) /* Disk drop operation hung */
#define KFDSTA_FORCING ((kfdsta)6) /* Disk beinng drop forced */
#define KFDSTA_DROPPED ((kfdsta)7) /* Disk no longer part of group */
#define KFDSTA_ADDING ((kfdsta)8) /* Disk being globally validated */
三、3号文件,ACD
四、4号文件:COD。相当于ASM中的回滚段
五、5号文件:模版目录
六、别名目录