AIX启动过程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AIX 启动过程
AIX 启动过程较为复杂些,AIX 的启动过程可以简单分为三个过程来完成。
1.阶段一:
1.1 首先用 OCS(On-Chip Sequencer)调用微处理器检查主板是否有问题,如没问题就交控制权交给只读储存器(ROS),即 Read Only Storage,然后执行系统加电自检(POST)。
1.2 加电完成后,ROS 将检查自定义引导列表,引导设备包括:磁盘、磁带、CD-ROM、以太网等。
如果自定义引
导设备列表无法找到引导设备,ROS 将会检查默认引导设备列表,如果再次无法找到引导设备,系统将无法启动。
在自定义引导设备列表或默认引导设备列表中如找到引导设备,ROS 就会查找引导设备中第一个引导记录,并查找
引导设备中引导逻辑卷(Boot Logical Volume,简称 BLV)的长度和 BLV 的地址,且将 BLV 载入内存中。
1.3 BLV 加载到内存后,就在内存中建立 RAM 文件系统,并把控制权给 RAM 文件系统,接着开始系统初始化内核。
BLV 包含的内容有: AIX 内核、RAMFS、基本用户设备。
初始化内核之后执行 init 程序,其进程号(PID)为 1,
并执行 rc.boot 1。
1.4 rc.boot 1 详细执行过程:
rc.boot 其实是一个普通的 Shell 脚本,执行 rc.boot 1 时,首先执行命令: restbase,作用主要是将简化版的ODM 加载到 RAMFS,如果这个过程执行失败,LED 显示屏将会显示 548 错误。
然后执行 cfgmgr -f(first) 读取 ODM 中的 Config_Rules 类,属性 phase 等于 1 的全被认为是基本设备,该步骤主要为激活 rootvg 做前提准备。
紧接着执行 bootinfo -b 来检测最后一次引导设备,如果成功,LED 显示屏显示 511,到此,阶段 1 执行完成。
2. 阶段二:
2.1 rc.boot 1 执行完成后,由 RAMFS 中的 init 进程再次执行 rc.boot 2。
2.2 在执行 rc.boot 2 过程中,首先调用 ipl_varyon 命令来激活 rootvg , 如要激活失败,LED 显示屏将会显示552/554/556 其中之一。
2.3 激活 rootvg 后,执行 fsck -fp /dev/hd4, 如果未发现问题,就将/dev/hd4 挂载到 RAMFS 中的临时挂载点:/mnt. 否则失败,LED 显示屏将会显示 555/557。
2.4 安装 /usr 和 /var 文件系统,一旦 /var 文件系统安装完成,就执行 copycore 命令把默认的 dump 设备
(/dev/hd6)最后的 dump 信息复制到默认的临时目录 /var/adm/ras。
复制完成后马上卸载 /var 文件系统。
2.5 激活位于 rootvg 中的页面空间(hd6),此任务由 swapon 命令来完成。
注意:AIX 的页面空间就是 LINUX 下
的 Swap 空间。
2.6 使用 mergedev 命令把 RAMFS 中的 /dev 复制到硬盘文件系统上,然后再用 cp Cu* /mnt/etc/objrepos 把RAMFS 中用户化的 ODM 信息复制到磁盘上。
2.7 卸载 RAMFS 中的 /usr 文件系统和磁盘中的根文件系统(/dev/hd4),然后在 RAMFS 中的根文件系统所在的
安装点永久性的安装 rootvg(磁盘上的)根文件系统,使用 newroot 命令实现从 RAMFS 根文件系统到 rootvg 根
文件系统的切换。
一旦 rootvg 根文件系统安装完成后,/usr 和/var 文件系统就都可以被安装在磁盘上的挂载点。
2.8 所有文件系统都挂载后,此时系统还未提供操作控制台,而是还要将引导信息写入到 alog 中,以便将来查
看引导信息或错误信息。
复制完后,退出 rc.boot 程序,并将控制权交给磁盘中 rootvg 中的 init 进程,且释放RAMFS。
2.9 rootvg 的 init 进程掌握控制权后,它将读取 /etc/inittab 文件,并查找默认的启动级别,启动级别位于
init: 和 :initdefault 之间。
需要注意的是如果这个文件不存在,就会进入到单用户模式,也就是维护模式。
另外, /etc/inittab 文件每隔 1 分钟执行一次,如果发现上次检测之后有增加或修改,就会执行增加或修改命
令。
3. 阶段三:
3.1 在阶段二结束后,init 进程在 /etc/inittab 文件中如果找到 brc 的标识符,就开始执行阶段三,也就是第
三次执行 rc.boot。
即 rc.boot 3。
3.2 运行 rc.boot 3 后,首先安装/tmp 文件系统,紧接着同步 rootvg。
如果为正常引导(多用户引导),就执行cfgmgr -p2,如果为维护模式引导,就执行 cfgmgr -p3。
cfgmgr 主要读取 ODM 中 Config_Rules 类,配置属性 phase 为 2 或 3 的设备,也就是剩下的所有设备(属性 phase 等于 1 的设备为基本设备)。
3.3 执行 cfgcon 配置终端控制台,例如 TTY 或磁盘上的某一个文件。
3.4 执行 savebase 将根文件系统上的 ODM 信息保存到引导逻辑卷(BLV)中。
然后退出 rc.boot 3,接着由 init
进程执行/etc/inittab 其它进程。
/etc/inittab 执行完后,AIX 系统到此已经完成启动,此时用户可以登录熟悉
的 AIX 欢迎界面。
一个硬盘在 AIX 系统下系统保留区数据结构,AIX 下的 Block 其实就是 512Byte,编号从 0 开始,跟我们所说的
扇区是一样的。
以下是我机器上某块盘的信息
想了解更多的东西,请阅读:
/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.kernelext/doc/ke rnextc/logival_vol_subsys.htm
硬盘物理位置,用扇
区标记(sec)
Readvgda 结果(readvgda -s hdisk10)
0 sec(开始)
boot record
lvmid: 1598838349
vgid: 0037521400004c00000000dc6ffba362
lvmarea_len: 4212 --> (vgda_len + vgsa_len) * 2
vgda_len: 2098
bad-block directory
LVM record(7 sec
和 70 sec)
Readvgda 会调用 LVM
record 中的数据
mirror write
consistency (MWC)
record
vgda_psn[0]: 136
vgda_psn[1]: 2242
reloc_psn: 286749223
pv_num: 1
pp_size: 28
vgsa_len: 8
vgsa_psn[0]: 128
vgsa_psn[1]: 2234
version: 8
vg_type: -8739
图片是 7sec 的十六进制视图,可以通过十六进制转换成上面某些参数的十进制数值。
LVM record 记录着
lvmarea 最基本的参
数
127 sec(结束)
128 sec(开始)
VGSA 数据区
*****************************************
VGSA at block 128
135 sec(结束)
*****************************************
*****************************************
vgsa beg: timestamp 946773107 (386e9c73), 314919315 (12c54993)
vgsa beg: timestamp Sat Jan 1 18:31:47 CST:2000
vgsa.pv_missing: 0
vgsa.stalepp[0]: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
vgsa.stalepp[1]: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
vgsa.stalepp[2]: ff 3f 0 ff ff ff ff ff 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
vgsa.factor: 1
vgsa.pad2: 0 0 0
vgsa end: timestamp 946773107 (386e9c73), 314919315 (12c54993)
vgsa end: timestamp Sat Jan 1 18:31:47 CST:2000
*****************************************
136 sec(开始)
VGDA 数据区
*****************************************
VGDA at block 136
LP/PP MAP
2233 sec(结束)
*****************************************
*****************************************
vgh.vg_id: 0037521400004c00000000dc6ffba362
vgh.numlvs: 1
vgh.maxlvs: 256
vgh.pp_size: 28
vgh.numpvs: 3
vgh.total_vgdas: 3
vgh.vgda_size: 2098
vgh.quorum: 1
vgh.auto_varyon: 1
vgh.check_sum: 0
vgda hdr: timestamp 946773107 (386e9c73), 352680539 (15057a5b) vgda hdr: timestamp Sat Jan 1 18:31:47 CST:2000
以上是从 136 扇区读取的
********** Logical Volume: datalv4 ***********
lve.lvname: 0
lve.maxsize: 512
lve.lv_state: 1
lve.mirror: 3
lve.mirror_policy: 2
lve.num_lps: 10
lve.permissions: 1
lve.bb_relocation: 1
lve.write_verify: 2
lve.mirwrt_consist: 1
lve.stripe_exp: 0
lve.striping_width: 0
lve.lv_avoid: 0
lve.child_minor_num: 0
********** Physical Volume: 1 ***********
pvh.pv_num: 1
pvh.pv_id: 003752146ff9501b
pvh.pp_count: 546
pvh.pv_state: 1
pvh.pvnum_vgdas: 1
pvh.psn_part1: 4352
* pv_num:pp_num:pp_state lv_name:lp_num:pp_copy_val:pv_fst_mir:part_fst_ mir:p
v_snd_mir:part_snd_mir
* pv1:111:1 datalv4:1:1:3:15:2:4
* pv1:112:1 datalv4:2:1:3:16:2:5
* pv1:113:1 datalv4:3:1:3:17:2:6
* pv1:114:1 datalv4:4:1:3:18:2:7
* pv1:115:1 datalv4:5:1:3:19:2:8
* pv1:116:1 datalv4:6:1:3:20:2:9
* pv1:117:1 datalv4:7:1:3:21:2:10
* pv1:118:1 datalv4:8:1:3:22:2:11
* pv1:119:1 datalv4:9:1:3:23:2:12
* pv1:120:1 datalv4:10:1:3:24:2:13
第一个 PV 的 Map 表,MAP 表的开头是某个 PV 的 pvh.pv_id
********** Physical Volume: 2 ***********
pvh.pv_num: 2
pvh.pv_id: 003752146ff979f4
pvh.pp_count: 15
pvh.pv_state: 1
pvh.pvnum_vgdas: 1
pvh.psn_part1: 4352
* pv_num:pp_num:pp_state lv_name:lp_num:pp_copy_val:pv_fst_mir:part_fst_ mir:p
v_snd_mir:part_snd_mir
* pv2: 4:1 datalv4:1:3:1:111:3:15
* pv2: 5:1 datalv4:2:3:1:112:3:16
* pv2: 6:1 datalv4:3:3:1:113:3:17
* pv2: 7:1 datalv4:4:3:1:114:3:18
* pv2: 8:1 datalv4:5:3:1:115:3:19
* pv2: 9:1 datalv4:6:3:1:116:3:20
* pv2: 10:1 datalv4:7:3:1:117:3:21
* pv2: 11:1 datalv4:8:3:1:118:3:22
* pv2: 12:1 datalv4:9:3:1:119:3:23
* pv2: 13:1 datalv4:10:3:1:120:3:24
********** Physical Volume: 3 ***********
pvh.pv_num: 3
pvh.pv_id: 003752146ff9a31b
pvh.pp_count: 67
pvh.pv_state: 1
pvh.pvnum_vgdas: 1
pvh.psn_part1: 4352
* pv_num:pp_num:pp_state lv_name:lp_num:pp_copy_val:pv_fst_mir:part_fst_ mir:p
v_snd_mir:part_snd_mir
* pv3: 15:1 datalv4:1:2:1:111:2:4
* pv3: 16:1 datalv4:2:2:1:112:2:5
* pv3: 17:1 datalv4:3:2:1:113:2:6
* pv3: 18:1 datalv4:4:2:1:114:2:7
* pv3: 19:1 datalv4:5:2:1:115:2:8
* pv3: 20:1 datalv4:6:2:1:116:2:9
* pv3: 21:1 datalv4:7:2:1:117:2:10
* pv3: 22:1 datalv4:8:2:1:118:2:11
* pv3: 23:1 datalv4:9:2:1:119:2:12
* pv3: 24:1 datalv4:10:2:1:120:2:13
*****************************************
vgt.concurrency: 0
vgda trl: timestamp 946773107 (386e9c73), 352680539 (15057a5b)
vgda trl: timestamp Sat Jan 1 18:31:47 CST:2000
2234 sec(开始)
VGSA 数据区(备份)
2241 sec(结束)
2242 sec(开始)
VGDA 数据区(备份)
LP/PP MAP
4339 sec(结束)
4340 sec(开始)
4351 sec
4352 sec (物理硬
盘第 1PP 开始)
LV 开始
N sec(结束)(硬盘
总扇区数)
硬盘的 PVID
一个硬盘要被操作系统正常使用,必须先分配 PVID,硬盘的 PVID 在以后加入某个 VG、LV 都是要用到的。
分配 PVID 的过程就像 windows 下的初始化硬盘操作,就是把硬盘 0 扇区改写成符合操作系统使用的格式,只改写 0 扇区,别的地方没有任何改变。
用 lspv 命令就可以知道哪些硬盘还没有分配 PVID,用#chdev -l hdiskX -a pv=yes 就可以给硬盘分配 PVID,当一个硬盘在操作系统中已经有了 PVID,#chdev -l hdiskX -a pv=yes 命令不会改变原来的 PVID。
如果要修改某块盘的 PVID,我们要先清除掉原先的 PVID,然后再生成,可以用以下命令:
#chdev -l hdiskX -a pv=clear
#chdev -l hdiskX -a pv=yes
chinadns 的 Blog 有对 PVID 的详细介绍:
我们从底层观察 chdev -l hdiskX -a pv=yes 对硬盘 0 扇区的改动:
# lspv
hdisk0 003752149a0b2b91 rootvg
hdisk10 none None
hdisk11 003752146ff979f4 None
hdisk12 003752146ff9a31b None
hdisk10 没有分配 PVID,我们看看 0 扇区的十六进制代码:
# lquerypv -h /dev/hdisk10 0 200 (结果:第一列是序号,后 4 列是十六进制数据)00000000 C9C2D4C1 00000000 00000000 00000000 |................|
00000010 00000000 00000000 00000000 00000000 |................|
00000020 00000000 00000000 00000000 00000000 |................|
00000030 00000000 00000000 00000000 00000000 |................|
00000040 00000000 00000000 00000000 00000000 |................|
00000050 00000000 00000000 00000000 00000000 |................|
00000060 00000000 00000000 00000000 00000000 |................|
00000070 00000000 00000000 00000000 00000000 |................|
00000080 00000000 00000000 00000000 00000000 |................|
00000090 00000000 00000000 00000000 00000000 |................|
000000A0 00000000 00000000 00000000 00000000 |................|
000000B0 00000000 00000000 00000000 00000000 |................|
000000C0 00000000 00000000 00000000 00000000 |................|
000000D0 00000000 00000000 00000000 00000000 |................|
000000E0 00000000 00000000 00000000 00000000 |................|
000000F0 00000000 00000000 00000000 00000000 |................|
00000100 00000000 00000000 00000000 00000000 |................|
00000110 00000000 00000000 00000000 00000000 |................|
00000120 00000000 00000000 00000000 00000000 |................|
00000130 00000000 00000000 00000000 00000000 |................|
00000140 00000000 00000000 00000000 00000000 |................|
00000150 00000000 00000000 00000000 00000000 |................|
00000160 00000000 00000000 00000000 00000000 |................|
00000170 00000000 00000000 00000000 00000000 |................|
00000180 00000000 00000000 00000000 00000000 |................| 00000190 00000000 00000000 00000000 00000000 |................| 000001A0 00000000 00000000 00000000 00000000 |................| 000001B0 00000000 00000000 00000000 00000000 |................| 000001C0 00000000 00000000 00000000 00000000 |................| 000001D0 00000000 00000000 00000000 00000000 |................| 000001E0 00000000 00000000 00000000 00000000 |................| 000001F0 00000000 00000000 00000000 00000000 |................| # chdev -l hdisk10 -a pv=yes
hdisk10 changed
# lspv
hdisk0 003752149a0b2b91 rootvg
hdisk10 0037521474170251 None
hdisk11 003752146ff979f4 None
hdisk12 003752146ff9a31b None
# lquerypv -h /dev/hdisk10 0 200
00000000 C9C2D4C1 00000000 00000000 00000000 |................| 00000010 00000000 00000000 00000000 00000000 |................| 00000020 00000000 00000000 00000000 00000000 |................| 00000030 00000000 00000000 00000000 00000000 |................| 00000040 00000000 00000000 00000000 00000000 |................| 00000050 00000000 00000000 00000000 00000000 |................| 00000060 00000000 00000000 00000000 00000000 |................| 00000070 00000000 00000000 00000000 00000000 |................| 00000080 00375214 74170251 00000000 00000000 |.7R.t..Q........| 00000090 00000000 00000000 00000000 00000000 |................| 000000A0 00000000 00000000 00000000 00000000 |................| 000000B0 00000000 00000000 00000000 00000000 |................| 000000C0 00000000 00000000 00000000 00000000 |................| 000000D0 00000000 00000000 00000000 00000000 |................|
000000E0 00000000 00000000 00000000 00000000 |................|
000000F0 00000000 00000000 00000000 00000000 |................|
00000100 00000000 00000000 00000000 00000000 |................|
00000110 00000000 00000000 00000000 00000000 |................|
00000120 00000000 00000000 00000000 00000000 |................|
00000130 00000000 00000000 00000000 00000000 |................|
00000140 00000000 00000000 00000000 00000000 |................|
00000150 00000000 00000000 00000000 00000000 |................|
00000160 00000000 00000000 00000000 00000000 |................|
00000170 00000000 00000000 00000000 00000000 |................|
00000180 00000000 00000000 00000000 00000000 |................|
00000190 00000000 00000000 00000000 00000000 |................|
000001A0 00000000 00000000 00000000 00000000 |................|
000001B0 00000000 00000000 00000000 00000000 |................|
000001C0 00000000 00000000 00000000 00000000 |................|
000001D0 00000000 00000000 00000000 00000000 |................|
000001E0 00000000 00000000 00000000 00000000 |................|
000001F0 00000000 00000000 00000000 00000000 |................|
这样我们就知道 chdev -l hdisk10 -a pv=yes 更改了哪些数据了。
lquerypv -h /dev/hdisk10 0 200 这个命令行很有用,你可以查看硬盘中任何一个扇区的内容,后面两个参数的具体意思:lquerypv -h /dev/hdisk10 0 200
0 -- 从硬盘哪个字节开始查看,是十六进制
200 -- 输出到屏幕上的字节数,十六进制,十六进制 200 转换成十进制,512,就是一个扇区的大小。
假如我们要查看 128 扇区数据,命令应该是:lquerypv -h /dev/hdisk10 10000 200
10000 怎么换算来的?128*512=65536(十进制),转换成十六进制是 10000,因为我们要看一个扇区的数据,后面的参数就是 512 字节,转换成十六进制就是 200。
mkvg 对硬盘的数据改动
我们来看一下操作
# lspv
hdisk0 003752149a0b2b91 rootvg
hdisk13 003752147454a336 None
hdisk14 003752147454c64c None
hdisk15 003752147454e7cd None
# mkvg -s 256 -y testvg hdisk13 hdisk14 hdisk15
# lspv
hdisk0 003752149a0b2b91 rootvg
hdisk13 003752147454a336 testvg
hdisk14 003752147454c64c testvg
hdisk15 003752147454e7cd testvg
*************************************************************************** # readvgda -s hdisk13
lvmid: 1598838349
vgid: 0037521400004c00000000dc74595c25
lvmarea_len: 4212
vgda_len: 2098
vgda_psn[0]: 136
vgda_psn[1]: 2242
reloc_psn: 286749223
pv_num: 1
pp_size: 28
vgsa_len: 8
vgsa_psn[0]: 128
vgsa_psn[1]: 2234
version: 8
vg_type: -8739
(这是 LVM record,在硬盘前 128 个扇区,分别在 7sec 和 70sec)
*=============== 1ST VGDA-VGSA: hdisk13 ===============*
*****************************************
VGSA at block 128
*****************************************
*****************************************
vgsa beg: timestamp 946844818 (386fb492), 357026209 (1547c9a1) --这个是时间戳,在 128sec 开头 8 个字节。
vgsa beg: timestamp Sun Jan 2 14:26:58 CST:2000
vgsa.pv_missing: 0
vgsa.stalepp[0]: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
vgsa.stalepp[1]: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
vgsa.stalepp[2]: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
vgsa.factor: 1
vgsa.pad2: 0 0 0
vgsa end: timestamp 946844818 (386fb492), 357026209 (1547c9a1)--这个是时间戳,在 135sec 结尾 8 个字节。
vgsa end: timestamp Sun Jan 2 14:26:58 CST:2000
(从 LVM record 知道,VGSA 大小是 8sec。
mkvg 时 VGSA 只写入时间戳)
*****************************************
VGDA at block 136
*****************************************
*****************************************
vgh.vg_id: 0037521400004c00000000dc74595c25
vgh.numlvs: 0
vgh.maxlvs: 256
vgh.pp_size: 28
vgh.numpvs: 3
vgh.total_vgdas: 3
vgh.vgda_size: 2098
vgh.quorum: 1
vgh.auto_varyon: 1
vgh.check_sum: 0
vgda hdr: timestamp 946844818 (386fb492), 402158211 (17f87283) vgda hdr: timestamp Sun Jan 2 14:26:58 CST:2000
(这是真正的 VGDA 头部信息,在硬盘 136sec)
********** Physical Volume: 1 ***********
pvh.pv_num: 1
pvh.pv_id: 003752147454a336
pvh.pp_count: 546
pvh.pv_state: 1
pvh.pvnum_vgdas: 1
pvh.psn_part1: 4352
(这是 Physical Volume: 1 的 LP MAP 表头部信息,在 153sec)
********** Physical Volume: 2 ***********
pvh.pv_num: 2
pvh.pv_id: 003752147454c64c
pvh.pp_count: 15
pvh.pv_state: 1
pvh.pvnum_vgdas: 1
pvh.psn_part1: 4352
(这是 Physical Volume: 2 的 LP MAP 表头部信息,在 188sec)
********** Physical Volume: 3 ***********
pvh.pv_num: 3
pvh.pv_id: 003752147454e7cd
pvh.pp_count: 67
pvh.pv_state: 1
pvh.pvnum_vgdas: 1
pvh.psn_part1: 4352
(这是 Physical Volume: 3 的 LP MAP 表头部信息,在 189sec)
*****************************************
vgt.concurrency: 0
vgda trl: timestamp 946844818 (386fb492), 402158211 (17f87283)
vgda trl: timestamp Sun Jan 2 14:26:58 CST:2000
*=============== 2ND VGDA-VGSA: hdisk13 ===============*
*****************************************
VGSA at block 2234
*****************************************
*****************************************
vgsa beg: timestamp 946844818 (386fb492), 357026209 (1547c9a1)
vgsa beg: timestamp Sun Jan 2 14:26:58 CST:2000
vgsa.pv_missing: 0
vgsa.stalepp[0]: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
vgsa.stalepp[1]: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
vgsa.stalepp[2]: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
vgsa.factor: 1
vgsa.pad2: 0 0 0
vgsa end: timestamp 946844818 (386fb492), 357026209 (1547c9a1)
vgsa end: timestamp Sun Jan 2 14:26:58 CST:2000
*****************************************
VGDA at block 2242
*****************************************
*****************************************
vgh.vg_id: 0037521400004c00000000dc74595c25
vgh.numlvs: 0
vgh.maxlvs: 256
vgh.pp_size: 28
vgh.numpvs: 3
vgh.total_vgdas: 3
vgh.vgda_size: 2098
vgh.quorum: 1
vgh.auto_varyon: 1
vgh.check_sum: 0
vgda hdr: timestamp 946844818 (386fb492), 402158211 (17f87283) vgda hdr: timestamp Sun Jan 2 14:26:58 CST:2000
********** Physical Volume: 1 ***********
pvh.pv_num: 1
pvh.pv_id: 003752147454a336
pvh.pp_count: 546
pvh.pv_state: 1
pvh.pvnum_vgdas: 1
pvh.psn_part1: 4352
********** Physical Volume: 2 ***********
pvh.pv_num: 2
pvh.pv_id: 003752147454c64c
pvh.pp_count: 15
pvh.pv_state: 1
pvh.pvnum_vgdas: 1
pvh.psn_part1: 4352
********** Physical Volume: 3 ***********
pvh.pv_num: 3
pvh.pv_id: 003752147454e7cd
pvh.pp_count: 67
pvh.pv_state: 1
pvh.pvnum_vgdas: 1
pvh.psn_part1: 4352
*****************************************
vgt.concurrency: 0
vgda trl: timestamp 946844818 (386fb492), 402158211 (17f87283)
vgda trl: timestamp Sun Jan 2 14:26:58 CST:2000
从 readvgda 得到的信息,当 mkvg 的时候,对硬盘的写操作范围是 128sec+lvmarea_len: 4212sec,即 4340 个扇区
其中 128sec 以前的 LVM record 很重要,从 128-4339 扇区,可以说是原先的数据全部被破坏,相当于先全部清 0 每个扇区,然后写入 vgsa、vgda 信息。
重新 mkvg 过的的 VG,原来每个硬盘的 LP/PP MAP 信息全部被破坏。
下面我们来看一下 7sec 十六进制数据(为了对比我把硬盘先每个字节都填上 DD,然后才 mkvg):
7sec
#lquerypv -h /dev/hdisk13 E00 200
00000E00 5F4C564D 00375214 00004C00 000000DC |_LVM.7R...L.....|
00000E10 74595C25 00001074 00000832 00000088 |tY\%...t...2....|
00000E20 000008C2 11177227 00000100 0001001C |......r'........|
00000E30 00000008 00000080 000008BA 0008DDDD |................|
00000E40 00000000 DDDDDDDD DDDDDDDD DDDDDDDD |................|
00000E50 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................|
00000E60 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................|
00000E70 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................|
00000E80 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................|
00000E90 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................|
00000EA0 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000EB0 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000EC0 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000ED0 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000EE0 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000EF0 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000F00 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000F10 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000F20 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000F30 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000F40 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000F50 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000F60 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000F70 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000F80 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000F90 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000FA0 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000FB0 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000FC0 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000FD0 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000FE0 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 00000FF0 DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD |................| 对照:
lvmid: 1598838349
vgid: 0037521400004c00000000dc74595c25
lvmarea_len:
4212
vgda_len: 2098
vgda_psn[0]: 136
vgda_psn[1]: 2242
reloc_psn: 286749223
pv_num: 1
pp_size: 28
vgsa_len: 8
vgsa_psn[0]:
128
vgsa_psn[1]: 2234
version: 8
vg_type: -8739
如果熟悉了这种对照方式,哪些地方出错还可以重新填写构造出来。
以上是 VG 创建过程中的一些数据改动细节,让我们知道其实 mkvg 不会造成用户数据区的丢失,只是改动硬盘系统保留区的数据。
打印某块盘的 PVMAP 我们如果要看某个 LV 的 LP/PP MAP 信息用下列命令:
# lslv -m lvname
就可以看到这个 LV 的所有 LP/PP MAP 如果要看整块盘的 PVMAP 信息,就得用这个命令:
lquerypv -p pvid -N hdiskX -scPnaDdAt
如下:
# lquerypv -p 003752147454a336 -N hdisk13 -scPnaDdAt
如果一个硬盘 PP 数量太多,屏幕往上滚动,我们只能看到最后那些 PVMAP 信息,为了能方便看到完整的 PVMAP 信息,我们可以把它保存到文本文件里:
# lquerypv -p 003752147454a336 -N hdisk13 -scPnaDdAt >>pvmap.txt
这样我们从结果 pvmap.txt 看到非常完整的 PVMAP,可以知道这块盘的 PP 在 LV 中的分配情况。
有位前辈曾经研究过系统保留区信息,因为 IBM 这方面的资料比较少,大家都还有一些未知的地方,如果有人能补充就更好了。
0-127 扇区是 IBM 前生注定要这么做的,128 扇区以后的 VGSA、VGDA 的每一个信息存放位置都是经过精细计算的,不多余一个扇区,更不会少一个扇区。
大家先看看这位前辈整理出来的数据,是不是以前我们渴望得
知的东西呢,也顺便想想 128sec 以后扇区变化规律。
First an overview of the disk layout:
PSN = Physical Sector Number,
LEN = length in physical sectors Physical Sectors are 512 bytes.
Use lquerypv -h to view these offsets
Physical Sector Layout (Ver 1)
Offset PSN Len Purpose
000000 0 1 IPL Record
000200 1 1 Disk Configuration Record
000400 2 1 First Mirror WriteConsistency Cache Record 000600 3 1 Second Mirror Write Consistence CacheRecord 000800 4 3 Unknown
000E00 7 1 LVM Information Record
001000 8 22 Bad Block Directory
008000 64 1 Backup Configuration Record
008C00 70 1 Backup LVM Information Record
008E00 71 22 Backup Bad Block Directory
00F000 120 8 Concurrent Configuraiton Work Record 010000 128 8 VGSA
011000 136 1 VGDA
011200 137 16 LV Information Records
013200 153 2048 PV Information/PP Maps
113200 2201 32 LV Name Registry
117200 2233 1 Unknown
117400 2234 8 Backup VGSA
118400 2242 1 Backup VGDA
118600 2243 16 Backup LV Information Records
11A600 2259 2048 Backup PV Information/PP Maps
21A600 4307 32 Backup LV Name Registry
21E600 4339 1 Unknown
Physical Sector Layout (Ver 5)
Offset PSN Length Purpose
000000 0 1 IPL Record
000200 1 1 Disk Configuration Record
000400 2 1 First Mirror Write Consistency Cache Record 000600 3 4 Second Mirror Write Consistence Cache Record
000E00 7 1 LVM Information Record
001000 8 22 Bad Block Directory
008000 64 1 Backup Configuration Record
008C00 70 1 Backup LVM Information Record
008E00 71 22 Backup Bad Block Directory
00F000 120 8 Concurrent Configuraiton Work Record 010000 128 256 VGSA
030000 384 1 VGDA
030200 385 424 LV Information Records
065200 809 7752 PV Information/PP Maps
42E200 8561 64 LV Name Registry
436200 8625 79 Unknown
440000 8704 256 Backup VGSA
460000 8960 1 Backup VGDA
460200 8961 424 Backup LV Information Records 495200 9385 7752 Backup PV Information/PP Maps
85E200 17137 64 Backup LV Name Registry
866200 17201 79 Unknown
7 扇区大致的数据结构如下,欢迎指正
LVM Information Record
typedef struct {
uint32 lvm_id; /* 0x000 */
uchar vg_id[16]; /*0x004 */
uint32 lvmarea_len; /* 0x014 */
uint32 vgda_len; /* 0x018 */
uint32 vgda_psn[2]; /* 0x01C */
uint32 reloc_psn; /* 0x024 */
uint32 reloc_len; /* 0x028 */
uint16 pv_num; /* 0x02C */
uint16 pp_size; /* 0x02E */
uint32 vgsa_len; /* 0x030 */
uint32 vgsa_psn[2]; /* 0x034 */
uint16 version; /* 0x03C */
uint16 vg_type; /* 0x03E */
int32 ltg_shift; /* 0x040 */
uchar padding1[444]; /* 0x044 */
}
开讲 VGSA,揭开神秘面纱
VGSA--Volume Group Status Area,VG 中的硬盘状态、PP 状态描述区域。
注明:以下数据分析基于普通 VG,硬盘最大数量为 32 块,即 mkvg 的时候 factor=1,每块硬盘最大 PP 数为 1016。
# readvgda -s hdisk13
lvmid: 1598838349
vgid: 0037521400004c00000000dc74595c25
lvmarea_len: 4212
vgda_len: 2098
vgda_psn[0]: 136
vgda_psn[1]: 2242
reloc_psn: 286749223
pv_num: 1
pp_size: 28
vgsa_len: 8
vgsa_psn[0]: 128
vgsa_psn[1]: 2234
version: 8
vg_type: -8739
*=============== 1ST VGDA-VGSA: hdisk13 ===============*
*****************************************
VGSA at block 128
*****************************************
*****************************************
vgsa beg: timestamp 946861740 (386ff6ac), 67100033 (3ffdd81)
vgsa beg: timestamp Sun Jan 2 19:09:00 CST:2000
vgsa.pv_missing: 0
vgsa.stalepp[0]: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
vgsa.stalepp[1]: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
vgsa.stalepp[2]: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
vgsa.factor: 1
vgsa.pad2: 0 0 0
vgsa end: timestamp 946861740 (386ff6ac), 67100033 (3ffdd81)
vgsa end: timestamp Sun Jan 2 19:09:00 CST:2000
*****************************************
VG 中的硬盘状态、PP 状态的描述是用 0 和 1 表示的,0 表示状态良好,1 表示出现故障。
为什么 vgsa_len 是 8 个扇区呢,VGSA 到底要存放多少数据呢?
我们来算一下:
VG 中的硬盘状态,最多预留 32 块盘状态描述空间。
硬盘中的 PP 状态,每块盘最多预留 1016 PP 描述空间
32 块盘最多有 32*1016 = 32512 个 PP 状态描述空间
VG 中的 32 块盘硬盘状态用掉多少个字节呢?回答是 4 个 Byte
即:00 00 00 00,这 4 个 Byte 转换成 bit(二进制)就是:00000000 00000000 00000000 00000000 ,这就是 32
个盘的状态描述地址,如果 VG 中的第一块盘坏了,硬盘描述状态就是:00000001 00000000 00000000 00000000 ,
转换成十六进制就是 01 00 00 00。
一个硬盘中的 1016 个 PP,占用几个字节的状态描述空间呢?回答是 127 个 Byte,1 个 Byte 可以描述 8 个 PP 状态,1 个硬盘用掉:1016 / 8 = 127 (Byte) PP 状态描述空间 32 块盘的 PP 描述用掉:127 * 32 = 4064 Byte , 4064 byte / 512 = 7.9375 sec ,不到 8 个扇区,其实 VGSA 还有一些别的参数,所以分配给 VGSA 8sec 已经够用了。
VGSA 结构如下:
typedef struct {
uint32 vg_mtime[2]; /* 0x000 */
uint32 pv_unavailable_bitmap; /* 0x008 */
uchar pv01_stale_pp_map[127]; /* 0x00C */
uchar pv02_stale_pp_map[127]; /* 0x08B */
uchar pv03_stale_pp_map[127]; /* 0x10A */
uchar pv04_stale_pp_map[127]; /* 0x189 */
uchar pv05_stale_pp_map[127]; /* 0x208 */
uchar pv06_stale_pp_map[127]; /* 0x287 */
uchar pv07_stale_pp_map[127]; /* 0x306 */
uchar pv08_stale_pp_map[127]; /* 0x385 */
uchar pv09_stale_pp_map[127]; /* 0x404 */
uchar pv10_stale_pp_map[127]; /* 0x483 */
uchar pv11_stale_pp_map[127]; /* 0x502 */
uchar pv12_stale_pp_map[127]; /* 0x581 */
uchar pv13_stale_pp_map[127]; /* 0x600 */
uchar pv14_stale_pp_map[127]; /* 0x67F */
uchar pv15_stale_pp_map[127]; /* 0x6FE */
uchar pv16_stale_pp_map[127]; /* 0x77D */
uchar pv17_stale_pp_map[127]; /* 0x7FC */
uchar pv18_stale_pp_map[127]; /* 0x87B */
uchar pv19_stale_pp_map[127]; /* 0x8FA */
uchar pv20_stale_pp_map[127]; /* 0x979 */。