mophis
作者mophis2011-08-17 09:34
软件开发工程师, 杭州

exportvg的流程和理解 .

字数 4590阅读 5018评论 11赞 5

一、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

流程
命令
注释
获取VGID
getlvodm -v $VGNAME

锁住VG
putlvodm -k $VGID

确认VG已经varyoff
lqueryvgs
varyoffvgVG信息从运行时的内核中删除
删除/etc/filesystems中的FS信息
imfs -lx $LVNAME

删除ODM中的信息
putlvodm -G $VGNAME
删除设备文件
删除/et/vg下的handle file
rm

VG解锁
putlvodm -U $VGNAME
因为VG已经被导出,有可能是空操作
将新的ODM同步到BLV
savebase

二、获取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。这个步骤未必有效,但肯定比上面的步骤正确。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

5

添加新评论11 条评论

roman1985roman1985软件开发工程师, 北明软件
2013-04-07 11:15
感受颇深
lvaixlvaix系统架构师, 北京超弦存储器研究院
2011-10-14 11:47
高深~
beluga2010beluga2010网络管理员, 智达信
2011-10-14 10:58
高端!!!!
WUJJ0828WUJJ0828系统架构师, 华际信息系统有限公司
2011-09-02 10:02
比较深入!
akingzakingz系统工程师, 东华软件
2011-08-30 21:40
好文!~
lcq225lcq225软件开发工程师, Haike Group
2011-08-24 11:30
高深莫测
sleepsheep79sleepsheep79系统架构师, HP
2011-08-22 08:59
好帖
geniusgenius技术经理, 华洋广场
2011-08-21 10:49
很深
daoguo525daoguo525系统工程师, 世纪五岳(北京)科技有限公司
2011-08-21 10:36
高手就是不一样
lwb_aixlwb_aix系统工程师, 重庆南华中天技术有限公司
2011-08-18 09:56
的确是高手哦
haku7916haku7916项目经理, 博康
2011-08-17 21:43
高手啊 ~~
Ctrl+Enter 发表

作者其他文章

X社区推广