[linux-lvm] Re: Script to import hardware snapshoted VGs

Mike Snitzer snitzer at redhat.com
Wed May 13 12:44:22 UTC 2009


On Tue, May 12 2009 at  7:15pm -0400,
chris procter <chris-procter at talk21.com> wrote:

> > @@ -76,13 +83,16 @@ fi
> > SHOW=0
> > DISKS=""
> > LVMCONF="/etc/lvm/lvm.conf"
> > -TMP_LVM_SYSTEM_DIR=`mktemp -d -t snap.XXXXXXXX`
> > +TMP_LVM_SYSTEM_DIR=`mktemp -d --tmpdir snap.XXXXXXXX`
> 
> 
> [root at boyle disktools]# mktemp -d --tmpdir snap.XXXXXXXX
> mktemp: invalid option -- -
> Usage: mktemp [-V] | [-dqtu] [-p prefix] [template]
> 
> So the long option doesn't work. The result of an old version of coreutils (coreutils-5.97-19.el5)  on CentOS5.3  not tested it on RHEL yet but if its different I'd be surprised!

OK.

> > NOVGFLAG=0
> 
> The SHOW and  NOVGFLAG variables aren't actually used any more so could be removed (my fault!)

OK.

> > @@ -135,13 +145,22 @@ LVM="${LVM_BINARY:-lvm}"
> > "${LVM}" version >&/dev/null
> > checkvalue $? "${LVM} doesn't look like an lvm binary."
> > 
> > +if [ -n "$NEWVG" ] ; then
> > +    "${LVM}" vgs $NEWVG >& /dev/null
> > +    if [ $? -eq 0 ] ; then
> > +        echo "Error: New VG ($NEWVG) already exists." >&2
> > +        exit 1
> > +    fi
> > +fi
> 
> You dont have to test if the name given with the -n option is unique
> because it gets run through the getvgname function which uses the given
> name as a starting point to build a unique name, but if you prefer to
> enforce the given name rather then just use it as a hint then thats
> fine.

I understood as much but I'm on the fence as to whether that behavior is
desirable if a specific name is explicitly provided.

> > export FILTER="filter=[ ${FILTER} \"r|.*|\" ]"
> > 
> > -awk -v DEV=${TMP_LVM_SYSTEM_DIR} '/^[[:space:]]*filter/{print 
> > ENVIRON["FILTER"];next}\
> > -                    /^[[:space:]]*scan/{print "scan = [ \"" DEV  "\" ]";next} \
> > +awk -v DEV=${TMP_LVM_SYSTEM_DIR} -v CACHE=${TMP_LVM_SYSTEM_DIR}/cache \
> > +                   '/^[[:space:]]*filter/{print ENVIRON["FILTER"];next} \
> > +                    /^[[:space:]]*scan/{print "scan = [ \"" DEV "\" ]";next} \
> > +                    /^[[:space:]]*cache_dir/{print "cache_dir = \"" CACHE 
> > "\"";next} \
> >                      {print $0}' < ${LVMCONF} > ${TMP_LVM_SYSTEM_DIR}/lvm.conf
> 
> 
> This doesn't work on my setup, there is no cache_dir directive as far as I can tell, I think you're trying to change "cache =" instead so that should be:
> 
> awk -v DEV=${TMP_LVM_SYSTEM_DIR} -v CACHE=${TMP_LVM_SYSTEM_DIR}/cache \
>                    '/^[[:space:]]*filter/{print ENVIRON["FILTER"];next} \
>                     /^[[:space:]]*scan/{print "scan = [ \"" DEV "\" ]";next} \
>                     /^[[:space:]]*cache/{print "cache = \"" CACHE "\"";next} \
>                      {print $0}' < ${LVMCONF} > ${TMP_LVM_SYSTEM_DIR}/lvm.conf
> 
> Otherwise it fails :(   Is this an "upgrade to the latest version" thing?

Right, the latest version uses "cache_dir".  Could change both I suppose.

> > @@ -166,18 +189,30 @@ export LVM_SYSTEM_DIR=${TMP_LVM_SYSTEM_DIR}
> > #####################################################################
> > ### Change the uuids.
> > #####################################################################
> > -PVSCAN=`"${LVM}" pvscan`
> 
> I was trying to keep the number of lvm commands to the minimum because
> they can be pretty slow on some of our systems with a lot of luns
> presented, so I was trading complicated awk for speed. Wether it
> really makes a difference is debatable though.

AFAIK the latest version of lvm should not have those problems.

> > -### create a space seperated list of VGs where each VG looks like: 
> > nameexported?disk1disk2... 
> > -VGS=`echo "${PVSCAN}" |awk 
> > '$1~/PV/{for(i=1;i<=NF;i++){if($i=="VG"){vg[$(i+1)]=vg[$(i+1)]""$2} \
> > -                            if($i=="exported"){x[$(i+2)]="x"}}} \
> > -                END{for(k in vg){printf k""x[k] vg[k]" "}}'`
> 
> 
> > +PVINFO=`"${LVM}" pvs -o pv_name,vg_name,vg_attr --noheadings --separator : | 
> > sed -e "s/ //g"`
> > +
> > +# output VG info so each line looks like: name:exported?:disk1,disk2,...
> > +VGINFO=`echo "${PVINFO}" | \
> > +    awk -F : '{{vg[$2]=$1","vg[$2]} \
> > +    if($3 ~ /^..x/){x[$2]="x"}} \
> > +    END{for(k in vg){printf("%s:%s:%s\n", k, x[k], vg[k])}}'`
> 
> You could replace from PVINFO= to here with
> 
> VGINFO=`lvm pvs -o pv_name,vg_name,vg_attr --noheadings --separator : | \
>                   awk -F : '{sub(/^[[:space:]]*/,"");vg[$2]=$1","vg[$2];if($3 ~ /^..x/){x[$2]="x"}} \ 
>                                 END{for(k in vg){printf("%s:%s:%s\n", k, x[k], vg[k])}}'`
> 
> But I'm a sed-a-phobe ;)

Sure.

> > -for VG in ${VGS}
> > +for VG in ${VGINFO}
> > do
> > -    VGNAME=`echo -e "${VG}" |cut -d -f1`
> > -    EXPORTED=`echo -e "${VG}" | cut -d -f2`
> > -    PVLIST=`echo -e "${VG}" | cut -d -f3-`
> > +    VGNAME=`echo "${VG}" | cut -d: -f1`
> > +    EXPORTED=`echo "${VG}" | cut -d: -f2`
> > +    PVLIST=`echo "${VG}" | cut -d: -f3- | tr , ' '`
> 
> I was avoiding using colons as the seperator because its a valid
> character in device names, which is why I was then using control
> characters as separators, but given that we're now linking them all
> to sensible names it probably doesn't matter. 

It doesn't matter for PV names but it does for VG names.  I'll have to
think about it.

Mike




More information about the linux-lvm mailing list