exportvg的流程和理解

转载自http://blog.csdn.net/bingzhuan/article/details/4194885

一、exportvg
exportvg从系统中删除VG的信息,它应该(至少)包括以下操作:
ü
从运行时的内核中删除VG信息

ü
/etc/filesystems文件中删除VG中的FS

ü
ODM库中删除VG信息,包括VG中的LV

ü
删除/etc/vg/vg<VGID>句柄文件

ü
删除/devVGLV的设备文件

以下是exportvgexportvg datavg)的主流程以及简单描述:
VGNAME=$1
VGID=`getlvodm -v $VGNAME`


putlvodm -k $VGID

lqueryvgs | grep $VGID
if [ $? -eq 0 ]
then

exit 

fi


getlvodm -L $VGNAME > /tmp/lvinfo$$ 


while read LVNAME LVID
do

imfs -lx $LVNAME

done < /tmp/lvinfo$$

putlvodm -G $VGNAME
/bin/rm -f /etc/vg/vg`echo $VGID | tr "[a-z]" "[A-Z]"`

putlvodm -U $VGNAME 2>/dev/null
savebase

流程命令注释
获取VGIDgetlvodm -v $VGNAME
锁住VGputlvodm -k $VGID
确认VG已经varyofflqueryvgsvaryoffvgVG信息从运行时的内核中删除
删除/etc/filesystems中的FS信息imfs -lx $LVNAME
删除ODM中的信息putlvodm -G $VGNAME删除设备文件
删除/et/vg下的handle filerm
VG解锁putlvodm -U $VGNAME因为VG已经被导出,有可能是空操作
将新的ODM同步到BLVsavebase

二、获取VGID
getlvodm命令从ODM中获取VGID的方法很简单,我们可以通过以下命令来模拟:
odmget -q "name=$vgname and attribute=vgserial_id" CuAt | grep value | cut -d '"' -f 2
三、确认VG已经varyoff
先看看lvm cmds from a to z中对这条命令的描述:An object file command that queries the IDs of all volume groups in the system。那么它是返回所有VGVGID,无论是否varyon,还是仅返回varyon状态的VG?看看它调用了哪个库函数,也许能回答这个问题。
#dump -Tv /usr/sbin/lqueryvgs
............
[19]
0x00000000
undef
IMP
DS EXTref liblvm.a(shr.o) lvm_queryvgs

............

看上去lqueryvgs是对lvm_queryvgs子例程的封装。那么再看看lvm_queryvgs有哪些用途。在basetrf1中这样描述:The lvm_queryvgs subroutine returns the volume group IDs and major numbers for all volume groups in the system that are onlineOK,这正是我们所期望的。让我们自己实现一个简单的命令来替换lqueryvgs
#include "lvm.h"
#include "stdio.h"
#include "errno.h"

struct queryvgs{

long
num_vgs;


struct{


long
major_num;


struct unique_id
vg_id;


}vgs[LVM_MAXVGS];

};

extern int lvm_queryvgs(struct queryvgs **queryvgs,mid_t kmid); 

void DumpVGID(struct unique_id *pvgid)
{

printf("%08x",pvgid->word1);


printf("%08x",pvgid->word2);


printf("%08x",pvgid->word3);


printf("%08x",pvgid->word4);

}

int main()
{

int i;


struct queryvgs
*pQueryvgs;




if(lvm_queryvgs(&pQueryvgs,0)!=0)


{


printf("lvm_queryvgs failed.errno=%d/n",errno);


return errno;


}




for(i=0;i<pQueryvgs->num_vgs;i++)


{


DumpVGID(&(pQueryvgs->vgs.vg_id));


printf("/n");


}




return 0;

}

编译得到my_lqueryvgs命令。执行该命令得到如下输出:
#./my_lqueryvgs 
005a3faa00004c00000000fe6c5f711a
005a3faa00004c00000000fe6b883bd3
这个命令的输出比lqueryvgs的简单,但是已经满足我们的需要了。
四、ODM中获取属于该VGLV信息
getlvodm -L $VGNAME也不复杂,我们通过下列脚本来模拟:
odmget -q "attribute=lvserial_id and value like '$VGID.*'" CuAt | egrep 'name|value' | cut -d '"' -f 2 |sed '{N;s//n/ /;}'
五、删除/etc/filesystems中的信息
imfs的作用是Removes file system data from /etc/filesystems。这个操作就不模拟了。
六、删除ODM中的信息
lvm cmfs from a to z没有putlvodm -G <vgname>,但是找到了putlvodm -V <vgid>,并且功能应该是类似的:removes a volume group from the Configuration Database。那么我们也通过shell脚本来模拟,具体可参考AU16,此处不再赘述。
另外putlvodm -G <vgname>除了在ODM中删除信息外,还删除VGLV的设备文件。因此可以认为putlvodm -G <vgname>=ODM中删除VGLV+ 删除/dev下的设备文件。
七、删除vghandle file
每个VG/etc/vg目录下都有个handle file,文件名为vg$VGID,大小为0IBM网站上这样描述这些文件:
These files are called "mapped file" or "handle file" by LVM and are mainly used for the VG lock mechanism to serialize access to the VG information area. Many LVM commands call lvm_getvgdef() to lock the VG and get or change VG descriptor information. 
mkvg or importvg will create the name of /etc/vg/vg<VGID> file if not in existence.
varyoffvg or exportvg will remove the mapped file. 

看上去varyoffvg时候这些文件就被删除了,那么exportvg时候再删除一次也没什么。
八、后继操作
至此exportvg的主体工作应该已经完成。执行putlvodm -U $VGNAME命令解锁。为什么不用putlvodm -K $VGID命令解锁?已经几乎完全exportvg了,这锁还存在并且有效?这些也是我迷惑的地方,关键在于不知道putlvodm加了什么锁,这个锁在运行时的内核中怎么存在并且怎样和VGNAME以及VGID关联起来。
最后执行savebase同步BLV中的ODM
九、总结
VGNAME=$1
VGID=`odmget -q "name=$VGNAME and attribute=vgserial_id" CuAt | grep value | cut -d '"' -f 2`


putlvodm -k $VGID

/tmp/my_lqueryvgs | grep $VGID
if [ $? -eq 0 ]
then

exit 

fi


odmget -q "attribute=lvserial_id and value like '$VGID.*'" CuAt | egrep 'name|value' | cut -d '"' -f 2 |sed '{N;s//n/ /;}' > /tmp/lvinfo$$ 


while read LVNAME LVID
do

imfs -lx $LVNAME

done < /tmp/lvinfo$$

putlvodm -G $VGNAME
/bin/rm -f /etc/vg/vg`echo $VGID | tr "[a-z]" "[A-Z]"`

putlvodm -U $VGNAME 2>/dev/null
savebase

十、后记
在上述分析中我开始时候不能确定的是什么时候删除设备文件,只是怀疑putlvodm -G命令执行了这个操作。然后通过单独执行每条命令的方式确认了确实是这条命令。
虽然先前已经分析过varyoffvg命令,但是并没有注意到/etc/vg下的handle file的处理,还是因为知识不够扎实不够全面。
在实验过程中有个小插曲,和putlvodm -k有关。在实验时候忘了执行varyoffvg,但是已经执行了putlvodm -k。在没有执行putlvodm -K的情况下就执行varyoffvg,那么varyoffvghang在那了,而且在不同窗口中执行了2varyoffvg。然后通过ctrl+Z的方式终止了命令,虽然命令终止了,但是ps命令可以看到有putlvodm -k命令遗留在那,而且putlvodm -K命令无效。光是kill -9命令也杀不死putlvodm -k,必须先执行kill -9,然后执行putlvodm -K才行。我想这或许体现了putlvodm -k加锁的某些方面。
正确的流程应该是首先执行putlvodm -K,然后执行varyoffvg。这个步骤未必有效,但肯定比上面的步骤正确。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值