转处http://blog.chinaunix.net/uid-20201831-id-4079013.html
这个实验来自于红皮书,通过这个实验可以很好的了解redefinevg和synclvodm的区别。
redefinevg和synclvodm命令
最常见的ODM问题是:ODM和LVM控制信息不同步。这种情况下,一般是ODM中的信息不准确(但不一定所有的问题都是如此),而磁盘上的VGDA和VGSA是准确的。
修复ODM信息不准确的问题最常用的两个命令:redefinevg、synclvodm。redefinevg将重建ODM中的VG和PV信息,给出足够的信息去激活卷组,它也会恢复一些LV的信息;synclvodm将从VGDA和LVCB中恢复剩下的LV信息,以提供对LV的访问。
通过下面的例子,我们能很好的理解redefinevg和synclvodm这两个命令的区别。在下面的例子中,我们将创建名为targetvg的卷组,并在targetvg上创建targetlv文件系统,log lv为targetlog,mount点为/targetfs。
# lsvg -l targetvg
targetvg:
LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT
targetlog jfslog 1 1 1 closed/syncd N/A
targetlv jfs 32 32 1 closed/syncd /targetfs
# mount /targetfs
# echo "data" > /targetfs/data
我们假设这个VG里面的需要的所有ODM信息都损坏了,我们用odmdelete来达到破坏ODM信息的效果,在删除之前首先是备份信息(odmget备份)。
# odmdelete -o CuAt -q "name LIKE target*"
0518-307 odmdelete: 9 objects deleted.
# odmdelete -o CuDvDr -q "value3 LIKE target*"
0518-307 odmdelete: 3 objects deleted.
# odmdelete -o CuDvDr -q "value1=targetvg"
0518-307 odmdelete: 1 objects deleted.
# odmdelete -o CuDv -q "name LIKE target*"
0518-307 odmdelete: 3 objects deleted.
# odmdelete -o CuDep -q "name=targetvg"
0518-307 odmdelete: 2 objects deleted.
现在让我们来看看下面的结果。
# lsvg
rootvg
# lsvg -o
0516-304 : Unable to find device id 005f3e8e00004c000000013ac3744be1 in the Device
Configuration Database.
vgid=005f3e8e00004c000000013ac3744be1
rootvg
# lspv -M hdisk1
0516-320 : Physical volume hdisk1 is not assigned to
a volume group.
# lslv -m targetlv
0516-306 lslv: Unable to find targetlv in the Device
Configuration Database.
在ODM信息被破坏之后,我们查询不到关于VG的信息,依赖于vg的lv信息也查询不到。
即使ODM中信息是混乱的,数据依然可用,我们仍可以进行mount和umount
一些人可能会用exportvg或varyonvg来修复这个问题,我们可以尽管一试
# exportvg targetvg
0516-306 getlvodm: Unable to find volume group targetvg in the Device
Configuration Database.
0516-772 exportvg: Unable to export volume group targetvg
# varyonvg targetvg
0516-008 varyonvg: LVM system call returned an unknown
error code (3).
为什么exportvg没有成功呢?因为exportvg的前提是vg的定义还在,但是我们已经删除了在odm中的vg定义,
vg的定义不在,所以执行失败。
推荐的修复操作:synclvodm targetvg,也将会失败,同样是因为在odm中vg的定义已不在。
# synclvodm targetvg
0516-306 : Unable to find volume group targetvg in the Device
Configuration Database.
0516-502 synclvodm: Unable to access volume group targetvg.
为了恢复基础的ODM信息,我们必须使用redefinevg,这里我们用redefinevg -d hdisk1 targetvg来恢复
在恢复之前,我们可以先用lqueryvg -Atp hdisk1来确认vgid信息。
# lqueryvg -Atp hdisk1
0516-320 lqueryvg: Physical volume hdisk1 is not assigned to
a volume group.
Max LVs: 256
PP Size: 28
Free PPs: 1059
LV count: 2
PV count: 2
Total VGDAs: 3
Conc Allowed: 0
MAX PPs per PV 1016
MAX PVs: 32
Quorum (disk): 1
Quorum (dd): 1
Auto Varyon ?: 1
Conc Autovaryo 0
Varied on Conc 0
Logical: 005f3e8e00004c000000013ac3744be1.1 targetlog 1
005f3e8e00004c000000013ac3744be1.2 targetlv 1
Physical: 00cb6010395938b0 2 0
0007c06c50569818 1 0
Total PPs: 1092
LTG size: 128
HOT SPARE: 0
AUTO SYNC: 0
VG PERMISSION: 0
SNAPSHOT VG: 0
IS_PRIMARY VG: 0
PSNFSTPP: 4352
VARYON MODE: ???????
VG Type: 0
Max PPs: 32512
我们可以看到,005f3e8e00004c000000013ac3744be1正好是我们用lsvg -o查出的丢失的vgid
我们运行redefinevg命令
# redefinevg -d hdisk1 targetvg
#
运行成功之后,检查信息
# lsvg
rootvg
targetvg
# lsvg -o
targetvg
rootvg
# lsvg -l targetvg
targetvg:
LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT
targetlog ??? 1 1 1 open/syncd N/A
targetlv ??? 32 32 1 open/syncd /targetfs
#
到此为止,我们还没有完全修复好ODM中的targetvg信息,还需要检查下当前ODM库中的信息。
# odmget CuAt |grep -ip targetvg
CuAt:
name = "targetvg"
attribute = "vgserial_id"
value = "005f3e8e00004c000000013ac3744be1"
type = "R"
generic = "D"
rep = "n"
nls_index = 637
CuAt:
name = "targetvg"
attribute = "pv"
value = "00cb6010395938b00000000000000000"
type = "R"
generic = ""
rep = "sl"
nls_index = 0
CuAt:
name = "targetvg"
attribute = "pv"
value = "0007c06c505698180000000000000000"
type = "R"
generic = ""
rep = "sl"
nls_index = 0
# odmget CuDv |grep -ip targetvg
CuDv:
name = "targetvg"
status = 1
chgstatus = 1
ddins = ""
location = ""
parent = ""
connwhere = ""
PdDvLn = "logical_volume/vgsubclass/vgtype"
# odmget CuDvDr |grep -ip targetvg
CuDvDr:
resource = "ddins"
value1 = "targetvg"
value2 = "42"
value3 = ""
CuDvDr:
resource = "devno"
value1 = "42"
value2 = "0"
value3 = "targetvg"
# odmget CuDep |grep -ip targetvg
由上面的信息可以看出(也可以跟我们之前备份的信息对比),我们已经重建了odm库中targetvg的vgid,pv信息,但是我们还没有从lvcb中
恢复lv信息,这就是为什么我们在lsvg -l targetvg结果的type列中,显示为“?”的原因。在这个阶段,像extendlv等命令将执行失败,因为在
odm中没有关于targetvg的lv信息。
# extendlv targetlv 1
0516-306 getlvodm: Unable to find targetlv in the Device
Configuration Database.
0516-788 extendlv: Unable to extend logical volume.
#
要修复这个问题,运行synclvodm命令,这样,lvcb控制信息将会恢复到ODM中,做完这一步后,所有的ODM信息都被恢复了。
# synclvodm targetvg
# lsvg -l targetvg
targetvg:
LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT
targetlog jfslog 1 1 1 open/syncd N/A
targetlv jfs 32 32 1 open/syncd /targetfs
# savebase
总结:借用农哥的原话。
synclvodm是从VGDA同步ODM,前提是VG的定义还在,ODM里错误的被修正,缺失的会从VGDA导入,但ODM里多的还会存在。
redefinevg也是从VGDA同步ODM,前提是VG定义没了才用,要指定从哪个PV导入,ODM里多的还会在
synclvodm同步vgda和lvcb中的信息到odm
redefinevg总是能执行成功的,因为pv信息如果在odm中被删除了,还可以通过cfgmgr来认出来
exportvg是把VGDA信息从ODM库中导出去,前提也是VG的定义还在。