Lvm 解析

981 views

Published on

1 Comment
0 Likes
Statistics
Notes
  • Be the first to like this

No Downloads
Views
Total views
981
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
23
Comments
1
Likes
0
Embeds 0
No embeds

No notes for slide
  • LIF Header 包含指向 LIF 的指针 LIF Data Area ( Logical Interchange Format ) 包含 LIF PA RISC 机器 HPUX 系统使用的工具: ISL (Initial System Loader) : Chooses a boot disk using hardware paths in NVRAM Loads and runs the ISL utility from the boot disk hpux loader utility : Reads AUTO file from boot disk for kernel load options Loads and runs the hpux kernel loader Autofile Label file Offline Diagnostics
  • Lvm 解析

    1. 1. LVM 解析
    2. 2. LVM 结构 LVM 命令解析
    3. 3. LVM 结构
    4. 4. LVM Basics Review Boot Disk Data Disk pvcreate -B mkboot vgcreate pvcreate -B pvcreate -B Lvlnboot lvcreate/lvextend pvcreate vgcreate lvcreate/lvextend pvcreate LIF Header PVRA BDRA LIF Volume VGRA Bad Block Pool User Data Area PVRA VGRA Bad Block Pool User Data Area
    5. 5. LVM PVRA Disk Structures PVRA 中的 lvm record : 128 sector 主要包含以下几个部分等信息: Lvm_id: 为 LVMREC01 ,标示为 PA RISC HPUX 的 LVM 结构。 PVID VGID PV 在 vg 中的 num 号。 LIF Header PVRA BDRA LIF Volume VGRA Bad Block Pool User Data Area Reserved LVM Record Bad Block Dir Reserved Duplicate LVM Record Duplicate Bad Block Dir lvm_id pv_id vg_id last_psn pv_num vgra_len,psn vgda_len,psn vgsa_len mcr_len,psn usr_data info alt_pool_info max_defects reserved BDRA info
    6. 6. LVM PVRA Disk Structures PVRA 中的 BBD : 55 sector 当有 IO 请求网盘上写数据出现错误无法完成时,即在该表中记录下该块的 sector 号,并将数据写入 BBR 区,并记录下该块的 sector num 。 LIF Header PVRA BDRA LIF Volume VGRA Bad Block Pool User Data Area Reserved LVM Record Bad Block Dir Reserved Duplicate LVM Record Duplicate Bad Block Dir Reason Status Defect PSN Alt PSN Sector 423 Sector 1724
    7. 7. LVM Physical Disk Layout BDRA : 16 sector 包含指向 / , root , dump , swap 区的指针。 LIF Header PVRA BDRA LIF Volume VGRA Bad Block Pool User Data Area Magic/ Timestamp PVs in root vg Root PV list Root LV #s Root VG # Swap Lvols Root Lvols Dump Lvols State info PVol List Duplicate BDRA & PVol List
    8. 8. LVM VGDA Disk Structures VGRA 中 VGDA 用于描述 VG 中所包含的每个 PV 和 LV 的信息, LIF Header PVRA BDRA LIF Volume VGRA Bad Block Pool User Data Area Volume Group Descriptor Area Mirror Consistency Record Duplicate Info. Volume Group Status Area VG Header LV entry [1] LV entry [maxlvs] . . . PV entry [1] PV entry [maxpvs] . . . VG Trailer
    9. 9. LVM VGDA Disk Structures (continued) 每个 VGRA 包含一个 VG header ,包含 vgid ,现有 lv 、 pv 、 pe 的最大值。 Lv entry 中包含 lvo1 的最大值, lv 的标志信息, mirrors 的数量,条带的大小, schedule strategy 等信息。 Pv entry 中包含 pvid , pe 的数量, pv 的标志信息,每个 pe 和 le 之间的对应表 VG Header LV entry [1] LV entry [maxlvs] . . . PV entry [1] PV entry [maxpvs] . . . VG Trailer vg_timestamp vg_id max_lvs num_pvs max_pxs vgda_magic vg_timestamp PV Header PX entry [1] PX entry [2] PX entry [n] . . max_lxs lv_flags schedule strategy max_mirrors # of stripes stripe size
    10. 10. LVM VGDA Disk Structures (continued) VG Header LV entry [1] LV entry [maxlvs] . . . PV entry [1] PV entry [maxpvs] . . . VG Trailer pv_id px_count pv_flags pv_map_siz pv_defectlim PV Header PX entry [1] PX entry [2] PX entry [n] . . lv_index lx_num
    11. 11. LVM VGSA Disk Structures Volume Group Descriptor Area Mirror Consistency Record Duplicate Info. Max PEs Max PVs PV Missing Array Data Pointers vgsa_magic timestamp Volume Group Status Area PV Stale Array Data Pointers VGSA 包含 vg 的状态信息,包含“丢失”的 pv 及 stale 的 extend LIF Header PVRA BDRA LIF Volume VGRA Bad Block Pool User Data Area
    12. 12. LVM Memory Resident Structures . . . . . . Pointers Memory Resident Structures 每个 vg 在激活的时候会将其 vg 的信息驻留到内存中,如上图所示,该表记载了每个 vgid ,所包含的 pv ,及每个 lv 、 le 的状态等信息,对硬盘的操作可通过该表找到相应的区域完成。 vg_lock **lvols num_lvols **pvols size_pvols num_pvols MWC Info VGDA Info VGSA Info Limits lv_schedule work_Q lv_exts lv_ready . . . lv_stripes pv_maxdefects pv_vg pv_bbdir pv_lvmrec . . . pv_freepxs Extent # Vol # State
    13. 13. 操作系统和 LVM 之间的交互过程 <ul><li>操作系统对 VG 的操作过程主要包含以下文件的访问: </li></ul><ul><li>LVMTAB 文件:包含 VG 名称, VGID ,包含 PV 的设备文件。 </li></ul><ul><li>Vg 的 group 文件和 LV 的 min number </li></ul><ul><li>设备文件 </li></ul><ul><li>PV 的盘头信息:包含 PVID , VGID , LV entry 等信息,并不包含 VG , PV 的名称。 </li></ul><ul><li>内存中的 VG 信息表:包含 VGID 信息及 vg 对应的 group 文件的 mag number ,其中的内容在 VG 激活时更新。 </li></ul><ul><li>下面我将就每个命令具体在后台做了什么操作,用到了上述文件中的那个文件做一个概述。 </li></ul>
    14. 14. LVM 命令祥解
    15. 15. Vgchange <ul><li>该命令用于激活 VG ,将其信息加载到内存中,过程如下:操作系统根据 VG 名称从 lvmtab 中找到对应的 VG ,读出相应的 VGID 和对应 PV 的设备文件名信息,同时查找 /dev 下的的 vg ,找到对应 vg 的 group 文件的 mag number 。根据 PV 的设备文件名,找到相应的所有的 PV ,读取各个盘头信息及该盘的状态,进行比较,看是否一致,如果不一致,则选择系统认为正常的 pv 的盘头信息,激活该 pv ,并和 lvmtab 中读取的 vgid 进行核对,没有问题在内存中添加相应的表空间,并将读取的 vg 信息和实际激活的 pv 信息进行比较,检查是否有错误,并建立和 mag number 的对应关系。可见看似简单的 vgchange 其实很不简单,再遇到 vg 无法激活的情况可参照进行检查是哪出了问题。 </li></ul><ul><li>在 VGRA 中记录了 VG 的激活方式,所以我们必须根据 VG 的特点选择对应的激活方式。 </li></ul><ul><li>参数: </li></ul><ul><li>vgchange –a y 以普通模式激活 VG </li></ul><ul><li>vgchange –a y –q n 以去掉 qurom 的方式激活 vg </li></ul><ul><li>vgchange –a e 以独享方式激活 vg, 一般为 cluster 中的 vg, 设置成 exclusive VG </li></ul><ul><li>vgchange –c y 添加 exclusive 属性 </li></ul><ul><li>vgchange -c n 去除 exclusive 属性 </li></ul>
    16. 16. Vgscan <ul><li>该命令用于扫描盘头,更新 lvmtab 表,过程如下:首先它搜索每个 PV ,读取其 VGID ,和 lvmtab 中的 VGID 进行比较,如果 lvmtab 中有该 VGID ,则跳过不作任何操作,如没有则查找内存,根据 VGID 找到相应的 group 文件的 mag number ,并基于此找到相应的 VG 名称,更新 lvmtab ,所以说 vgscan 是在线修复 lvmtab 的最后一步,如果机器重起,或者由于其他原因造成内存中该 vg 的信息发生变化,将无法用此命令修复 lvmtab. </li></ul><ul><li>我们可以假设一种情况,一个 vg 包含两个 pv ,其中一个损坏,且无法 reduce 掉,即 VGRA 中包含的 pv 信息没有变化,我们把 lvmtab mv 掉,重新 vgscan ,生成新的 lvmtab, 但此时只能找回一个 pv, 激活 vg 时当然会报错,另外 vgdisplay 我们将看到 act pv (少一)数和 cur pv 数不一致,即 vg 盘头信息中应该包含的 pv 数和内存中的数目不一致。 </li></ul>
    17. 17. pvcreate <ul><li>Pvcreate: </li></ul><ul><li>该命令重建 PV 的盘头信息,如 slider 4 页所示,重建时该命令用主机的 CPU number 和创建的时间生成一个唯一的 PVID ,并将其写入 PVRA 中用以标识每个 PV , pv 的盘头信息每个区大小固定,该命令只对盘头信息进行重建,对其他区如数据区的内容不作任何改变,故一个盘被重新 pvcreate 后用 vgcfgrestore 恢复其 vg 信息后,该盘上的数据不会丢失,仍可使用(不建议使用)。 </li></ul><ul><li>参数: </li></ul><ul><li>- B 创建 boot 盘,预留 boot 区大小,后用 mkboot 创建 BDRA 区,故 pvcreate –B 并不创建 BDRA 区。 </li></ul><ul><li>- f 强制创建,即使 disk 上存在文件系统 </li></ul><ul><li>- s disk_size 定义 pv 有效扇区的数量 </li></ul><ul><li>- t disk_type 当 pvcreate 无法返回 pv 的大小时,需要指定设备类型, 如 hp7959S ,如不加 disk_type 则获取 pv 的设备信息。 </li></ul><ul><li>- d soft_defects 指定 BBR 区 block 的最小数量,此值不能超过 7039 ,默认为每 8k 一个 block, </li></ul>
    18. 18. Vgcreate <ul><li>Vgcreate: </li></ul><ul><li>该命令重建 VGRA 区,重建时该命令用主机的 CPU number 和创建的时间生成一个唯一的 VGID ,并将其写入同一个 VG 的每个 PV 的 VGRA 中,用以标识每个 VG ,同 pvcreate ,该命令只对 VGRA 的信息进行重建,对其他区如数据区的内容不作任何改变,不会破坏数据。该命令执行后同时将其 vgid 和所用到的 PV 的设备文件名写入 /etc/lvmtab 中,同时将其 VG 盘头信息备份在 /etc/lvmconf 中。 </li></ul><ul><li>参数: </li></ul><ul><li>- f 强制执行,即使该 pv 含文件系统或属于某个 vg. </li></ul><ul><li>- l max _ lv 一个 vg 内 lv 的最大数量 </li></ul><ul><li>- e max _ pe PE/Pv 最大值 </li></ul><ul><li>- p max _ pv 一个 vg 内 pv 的最大数量 </li></ul><ul><li>- s pe _ size 设置 pe 的大小 </li></ul>
    19. 19. Lvcreate <ul><li>该命令用于创建 LV ,在 VGRA 中将所创建的 LV 的信息及 LE 和 PE 的对应表添加到 LV entry 中,并在 VG 的目录中创建相应的设备文件,由于更改了 VGRA ,其 VG 的信息在 /etc/lvmconf 中重新保存。同时他也将更新内存中对应的 VG 的信息,同时将 lv 和设备文件的 MIN number 的对应信息保存到内存中的。 </li></ul><ul><li>参数: </li></ul><ul><li>-d 当设置了 mirror 时,设置向原盘和 mirro 盘写方式, -p 为 Parallel –s 为 Sequential 方式: </li></ul><ul><li>例如: Create a mirrored LV using the parallel scheduling policy: # lvcreate –L 32 –n data –m 1 –d p vg01 </li></ul><ul><li>Change the scheduling policy on an existing LV: # lvchange –d p /dev/vg01/data </li></ul><ul><li>- c 数据一致性恢复设置,有 y (默认) n 两个参数, </li></ul><ul><li>-M 写缓冲方式设置,有 y (默认) n 两个参数 </li></ul><ul><li>两个配合起来有以下三个配置方案: </li></ul><ul><li>例: </li></ul><ul><li>MWC :该种方式在 VGRA 的 MCR 区创建一张表,向硬盘写操作时,如果没有将所有的 mirror 写完,出现中断就在该表 lv 对应的位置上写上一个标志,下次激活时就会同步该区域。 </li></ul><ul><li># lvcreate –L 32 –m 1 –n data –M y vg01 </li></ul><ul><li>NOMWC :系统 crash 后 nomwcsyncd 自动同步整个 lv ,对于大文件系统则需要花费比较长的时间。但写性能会更好一些 </li></ul><ul><li># lvcreate –L 32 –m 1 –n data –M n –c y vg01 </li></ul><ul><li>NONE :不进行同步恢复,常用于向 swap 这样的区域。 </li></ul><ul><li># lvcreate –L 32 –m 1 –n data –M n –c n vg01 </li></ul><ul><li>Change the consistency recovery policy on an existing LV (umount required!) # umount /data # lvchange –M y /dev/vg01/data # mount /data </li></ul><ul><li>- s mirror 分布设置, g:PVG-Strict 并行分布在不同的 pv 上(需在不同的链路上) y:Strict 在不同的盘上 n : Non-Strict 可在同一块盘上。 </li></ul><ul><li>- l 用 le 的数量为单位设置 LV 的大小( 1 - 65535 ) </li></ul><ul><li>- L LV 的实际大小(以 M 为单位, 1 - 1666772 ) </li></ul>
    20. 20. Vgexport <ul><li>该命令用于从 lvmtab 中去除 vg 信息,或用于备份 lvmtab 中 vg 信息及 vg 中包含的 lv 的信息,生成一个 map 文件,该命令首先检查 lvmtab 中对应的 vg 名称,找出对应的 vgid 备份到 map 文件中,同时查找 /dev 下的对应的 vg 名称,找到后备份 vg 中包含的 lv 的名称和 min number 到 map 文件中,由此可见该命令并不保存 pv 的设备文件名或 vg 的名称等信息,同时对盘头信息也不作任何修改。如果不加 -p 参数直接从 lvmtab 中去除 vg 的信息,同时去除相应的设备文件,这需要 deactive vg 。 </li></ul><ul><li>参数: </li></ul><ul><li>-m 指定所存取的 map 名 </li></ul><ul><li>-p 执行命令但不从 lvmtab 中去除相应的 vg 及设备文件 </li></ul><ul><li>-v 显示执行过程及结果 </li></ul><ul><li>-f 将 pv_path 的信息写入 outfile 中 </li></ul><ul><li>-s 配和 -v –p-m 命令使用,将 vg 信息写如一个 map 文件 </li></ul><ul><li>vgexport vg01 导出 vg </li></ul><ul><li>vgexport -m /tmp/vg01.map –p –s vg01 导出 vg ,并存到 vg01.map 中,且不从 lvmtab 中去除相应的 vg 及设备文件 </li></ul>
    21. 21. Vgimport <ul><li>该命令利用 vgexport 生成的 map 文件重新更新 lvmtab 信息及 vg 中 lv 的设备文件。首先创建 vg 目录(这个名就是生成后 lvmtab 中 vg 的名称),用 mknod 创建 group 文件( mag num 可以和原来的不一致)。该命令读取 map 文件中 vgid 信息,并利用此信息重新扫描每个 pv ,找出相同 vgid 的 pv ,并通过操作系统找出相应的设备文件,利用 map 中的 vgid , vg 名称, pv 的设备文件名生成更新 lvmtab ,同时创建 lv 的设备文件。由此可见其中关键的是 vgid ,如果 vgid 发生变化则无法完成该操作。 </li></ul><ul><li>参数: </li></ul><ul><li>-m 指定所存取的 map 名 </li></ul><ul><li>-p 执行命令但不向 lvmtab 中加入相应的 vg 及设备文件 </li></ul><ul><li>-v 显示执行过程及结果 </li></ul><ul><li>-s 配和 -v -m 命令使用,基于一个 map 文件向系统中导入相应的信息,由于 vgid 是基于主机的 cpu number 创建的所以导入到另一台机器上时会报 warning ,加上此参数忽略。 </li></ul><ul><li>例:加载 c0t1d0 c0t3d0 上的 vg01 </li></ul><ul><li>vgimport -v /dev/vg01 /dev/dsk/c0t1d0 /dev/dsk/c0t3d0 </li></ul><ul><li>利用 vg01.map 加载 vg01 的信息 </li></ul><ul><li>vgimport –m /tmp/vg01.map –s vg01 </li></ul>
    22. 22. Vgcfgrestore , vgcfgbackup <ul><li>vgcfgbackup 该命令用于备份 VGRA 的信息,该命令首先通过 lvmtab 获取 vgid 和 PV 设备文件,根据 vgid 在内存中找到相应的所有 pv ,将整个盘头信息保存到一个文件中,在此过程中如果, lvmtab 文件不正确或不存在, vg 没有激活,或者 vg 中某个盘没有被“激活” -- 损毁,此操作均无法完成,保存的文件中除了有盘头信息外还有 vg 的名称及所包含盘的设备文件名。 </li></ul><ul><li>vgcfgrestore 即利用上述保存的文件恢复盘头信息,该过程不论 VG 是否激活,或 LVM 是否存在,都可操作,对内存状态及 LVMTAB 文件不会有什么影响。但需要注意的是如果 vg 激活状态,当前 vg 的信息和备份文件的不同,则无法完成。 </li></ul><ul><li>试验:一个 vg 两个 pv ,将其中一个 pv 用 dd 破坏掉盘头,用 vgchange –q n 激活,报无法 query 那个 pv ,重新用 vgcfgrestore 恢复盘头信息, vg 激活正常。 </li></ul><ul><li>参数: </li></ul><ul><li>vgcfgbackup </li></ul><ul><li>-f 将保存的 vg 的 lvm 配置信息保存到指定的路径中,默认情况为 /etc/lvmconf/ 中 </li></ul><ul><li>例: vgcfgbackup -f /tmp/vg00.backup vg00 </li></ul><ul><li>Vgcfgrestore </li></ul><ul><li>-n 指定的 vg 的名称 </li></ul><ul><li>-F 用指定的文件,而非 /etc/lvmconf 下默认文件 </li></ul><ul><li>-l 显示配置信息 </li></ul><ul><li>-R 强制执行,即使 vg 处于激活状态 </li></ul><ul><li>向 c0t4d0 上加载 lvm 配置信息 </li></ul><ul><li>vgcfgrestore -f /tmp/vg00.backup /dev/rdsk/c0t4d0 </li></ul>
    23. 23. Vgdisplay pvdisplay <ul><li>Vgdisplay 同样通过 lvmtab 文件找到相应的 vgid ,然后再内存在找到匹配的 vg ,显示其相应的信息,所以如果 lvmtab 不正常,或者 vg 没有激活都无法正常显示。其每次显示 LV 的设备文件名要通过 min number 在 /dev/vg** 下重新读取,也就是说如果 lv 的名称发生变化,对应显示出来的信息也会发生变化,如果对应的 lv 设备文件不在则无法显示,同时 cur lv 和 open lv 的值不同。两外如果 vg 激活时此时硬盘状态发生变化,如盘头信息丢失(即硬盘损坏),此时 vgdisplay 显示结果不会发生变化, deactive 后再激活将看到变化。 </li></ul><ul><li>pvdisplay 同样同样通过 lvmtab 文件找到所隶属的 vgid ,然后再内存在找到匹配的 vg ,显示其相应的 pv 信息,所以所以如果 lvmtab 不正常,或者 vg 没有激活,或者所要显示的 pv 没有“激活”都无法正常显示。 </li></ul>
    24. 24. Vgreduce <ul><li>从 vg 中删除 pv ,在 vg 激活状态运行 </li></ul><ul><li>- f 删除 vg 中丢失的 pv ,系统根据 lvmtab 中的信息读取相应的 vgid 和 pv 信息,搜索硬盘的盘头,并和内存中的信息比较,找出信息不一致的硬盘,且检查该 pv 是否有内存表中指向的 LE ,如果有则报出相应的 LE 信息,提示用 lvreduce 或 lvremove 删除相应的 lv 再删除。此时用 vgdisplay 显示, cur pv 大于 act pv ,如果没有正在使用的 LE ,则系统修改剩下 pv 的盘头信息,去除该 pv ,更新内存信息,但并不修改 lvmtab 。此时如果想将被去掉的硬盘重新加入系统, 1 、 vgextend , 2 、用开始备份的 conf 文件恢复该 vg 下所有的硬盘。 </li></ul><ul><li>-A 是否对所作的修改进行保存, y 保存, vgcfgbackup 被执行,默认值; n 不保存。 </li></ul><ul><li>一般用法,从 vg 中删除 pv ,修改 lvmtab 且修改剩下 pv 的盘头信息,多条路径时须将每条路径都删除才能将 pv 删掉,否则删除主路径,则辅路径被使用。 </li></ul><ul><li>例: </li></ul><ul><li>从 vg01 中去除 c0t1d0 </li></ul><ul><li>vgreduce /dev/vg01 /dev/dsk/c0t1d0 </li></ul><ul><li>将 vg01 中丢失的 pv 全部去掉 </li></ul><ul><li>vgreduce -f /dev/vg01 </li></ul>
    25. 25. lvreduce <ul><li>减少 lv 的空间或 mirror 的数量。修改后 VGRA 的信息被修改,同时内存更新,其他不受影响。 </li></ul><ul><li>参数: </li></ul><ul><li>-l 减少的 LE 的数量 -L 减少 LV 实际大小 </li></ul><ul><li>-f 强制执行,如果较少后剩余空间量小于数据空间,不会出现提示执行,数据将被破坏且无法 mount, </li></ul><ul><li>-k 针对 missed 盘删除 lv 的 mirror ,常配合 -m 0 使用 </li></ul><ul><li>-m 去除 mirror 到指定的数量 </li></ul><ul><li>例:减少 lv 到 100 个 pe : lvreduce -l 100 /dev/vg01/lvol3 </li></ul><ul><li>减少 lv 的 mirror 到一个: lvreduce -m 1 /dev/vg01/lvol5 </li></ul><ul><li>去除 mirror : lvreduce -m 0 /dev/vg01/lvol4 /dev/dsk/c1t0d0 </li></ul><ul><li>用 pv_key 删除 mirror :用 lvdisplay -k -v /dev/vg00/lvol1 显示坏的那块盘的 pv_key 值 如下所示 </li></ul><ul><li>LE PV1 PE1 Status 1 PV2 PE2 Status 2 </li></ul><ul><li>00000 0 00000 current 1 00000 stale 则坏的那块盘 pv_key 为 1 </li></ul><ul><li>用 lvreduce -k -m 0 /dev/vg00/lvol1 1 命令删除该 mirror ,这也是经常遇到的 ghost 盘的一个解决办法 </li></ul>

    ×