Script Checking LVM Mirror not Working | Unix Linux Forums | AIX

  Go Back    


AIX AIX is IBM's industry-leading UNIX operating system that meets the demands of applications that businesses rely upon in today's marketplace.

Script Checking LVM Mirror not Working

AIX


Tags
aix, unix

Closed Thread    
 
Thread Tools Search this Thread Display Modes
    #1  
Old 03-15-2013
fede_mont fede_mont is offline
Registered User
 
Join Date: Mar 2013
Last Activity: 10 April 2014, 3:43 PM EDT
Posts: 3
Thanks: 0
Thanked 0 Times in 0 Posts
Script Checking LVM Mirror not Working

Hi,

I need to know who can I create an script in order to check server mirror in AIX. I got this script


Code:
!/usr/bin/ksh
#
# Check if a VG is mirrored.
#
# lsattr -El <lvname> -a strictness -a copies
# If copies=2 and scrictness=y, then VG is mirrored
#
# LVs are retrieved via 'lsvg -l <vg>|grep -v <vg>:|grep -v LPs|awk {'print $1'}
#
# Return codes:
#
# 0 VG is mirrored
# 1 Some LVs are not mirrored
# 2 All LVs in VG are not mirrored
# 3 No VG name(s) supplied
# 4 One or more invalid VG specified
# 5-? Other error found
#
if [ "$#" -eq "0" ] ; then
   echo "Please specify one or more volume group names"
   exit 3
fi
#
VGs=$@
for VG in $VGs ; do
   RCforVG=0
   if [ ! -e /dev/${VG} ] ; then
      RCforVG=4
      continue
   fi
   LVCount=0
   MLVCount=0
   for LV in getlvodm -L $VG | awk '{print $1}' ; do
      LVCount=expr $LVCount + 1
      Strict=lsattr -El $LV -a strictness|awk '{print $2}'
      Copies=lsattr -El $LV -a copies|awk '{print $2}'
      if [ "$Strict" = "y" -a "$Copies" -eq "2" ] ; then
         MLVCount=expr $MLVCount + 1
      else
         :
      fi
      if [ "$MLVCount" -eq "0" ] ; then
         RCforVG=2
      fi
      if [ "$MLVCount" -gt "0" -a "$MLVCount" -ne "$LVCount" ] ; then
         RCforVG=1
      fi
   done
   echo "Result code for $VG: $RCforVG"
done

This do not work ¿can someone give me a hand on this?

Moderator's Comments:
edit by bakunin: First of all, please use CODE-tags. It is mentioned in the rules, the FAQ, editor mask for new postings and we really, definitely, positively MEAN IT. Second, please do not use others threads to post your problems. As it is, our founder Neo has foregone no expense to provide an almost unlimited amount of new threads and you are welcome to use one of these.

I am going to split this into a new thread.

Last edited by bakunin; 03-15-2013 at 11:37 AM..
Sponsored Links
    #2  
Old 03-15-2013
bakunin bakunin is offline Forum Staff  
Bughunter Extraordinaire
 
Join Date: May 2005
Last Activity: 20 October 2014, 9:05 PM EDT
Location: In the leftmost byte of /dev/kmem
Posts: 4,282
Thanks: 45
Thanked 824 Times in 651 Posts
In which way it "doesn't work"? Could you be bit more specific, please? Are there error codes, error messages, wrong results (if yes, which ones?), etc.?

Two errors i can tell you from a glance:


Code:
Strict=lsattr -El $LV -a strictness|awk '{print $2}'
Copies=lsattr -El $LV -a copies|awk '{print $2}'

This can't work. You need a subshell for this.


Code:
Strict="$(lsattr -El $LV -a strictness|awk '{print $2}')"
Copies=$(lsattr -El $LV -a copies|awk '{print $2}')


And this is not wrong, but problematic:


Code:
if [ "$Strict" = "y" -a "$Copies" -eq "2" ] ; then

It is possible to mirror LVs not only once (two copies) but also twice (three copies). Further, you do not want to use double quotes when you do integer comparisons. You might want to change this line to


Code:
if [ "$Strict" = "y" -a $Copies -ge 2 ] ; then

I hope this helps.

bakunin

Last edited by bakunin; 03-15-2013 at 11:51 AM..
Sponsored Links
    #3  
Old 03-15-2013
fede_mont fede_mont is offline
Registered User
 
Join Date: Mar 2013
Last Activity: 10 April 2014, 3:43 PM EDT
Posts: 3
Thanks: 0
Thanked 0 Times in 0 Posts
thanks for your healp when I try to execute the script the following error acccur



Code:
./discos.sh rootvg
./disk.sh[25]: 0403-057 Syntax error at line 33 : `|' is not expected.

    #4  
Old 03-15-2013
bakunin bakunin is offline Forum Staff  
Bughunter Extraordinaire
 
Join Date: May 2005
Last Activity: 20 October 2014, 9:05 PM EDT
Location: In the leftmost byte of /dev/kmem
Posts: 4,282
Thanks: 45
Thanked 824 Times in 651 Posts
Quote:
Originally Posted by fede_mont View Post
./disk.sh[25]: 0403-057 Syntax error at line 33 : `|' is not expected.
Here is line 33:

Code:
for LV in getlvodm -L $VG | awk '{print $1}' ; do

Yes, this won't work and for the same reason the other two lines won't work: you need a subshell for this:


Code:
for LV in $(getlvodm -L $VG | awk '{print $1}') ; do

But even if you'd write it syntactically correct you should not do it this way anyways and there are a lot of obvious misconceptions about the workings of LVM in the script. I don't have the time right now to expand on this, but will do so once i get back in a few hours, so stay tuned.

I hope this helps.

bakunin
Sponsored Links
    #5  
Old 03-18-2013
MichaelFelt MichaelFelt is offline
Registered User
 
Join Date: Nov 2012
Last Activity: 11 December 2013, 7:33 AM EST
Location: on the road for work; home is private time
Posts: 311
Thanks: 6
Thanked 76 Times in 71 Posts
I will provide the "start command", someone else can provide the parsing bit.

Note: I am not mirrored.

What to look for!

There are two columns labeled LP and PP. Here is can determine how many copies there are. If PP == LP, one copy; if PP is double LP - 2 copies, if PP is three times LP - then three copies of the data (not copies of the first copy, copies is the number of copies of data - 1, 2 or 3).

The magic command to start this is:

Code:
lsvg -o | lsvg -il


Last edited by MichaelFelt; 03-21-2013 at 12:42 PM.. Reason: updated to add -o flag - thanks to bakunin for the reminder!
Sponsored Links
    #6  
Old 03-21-2013
bakunin bakunin is offline Forum Staff  
Bughunter Extraordinaire
 
Join Date: May 2005
Last Activity: 20 October 2014, 9:05 PM EDT
Location: In the leftmost byte of /dev/kmem
Posts: 4,282
Thanks: 45
Thanked 824 Times in 651 Posts
Sorry, it took me a while longer than i thought to come back to here:


Code:
if [ ! -e /dev/${VG} ] ; then

you look for an existing device file as a test if the VG is online. You should use the AIX methods instead, because they always work, while this may or may not work. Use


Code:
lsvg -o

to get a list of online VGs. Change your test accordingly. Then


Code:
for LV in getlvodm -L $VG | awk '{print $1}'

Even if this would be syntactically correct (which it isn't, see posts above) it would be better to use normal AIX methods to get a list of LVs in a VG. Use


Code:
lsvg -l <vgname>

to create such a list.

I hope this helps.

bakunin
Sponsored Links
Closed Thread

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
What is the difference between DRD and Root Mirror Disk using LVM mirror ? maxim42 HP-UX 3 02-12-2013 12:10 PM
LVM mirror creation problem simonrodan UNIX for Advanced & Expert Users 2 07-22-2012 06:12 PM
My Script For Process Checking is NOT Working rymnd_12345 Shell Programming and Scripting 8 04-24-2012 09:34 AM
LVM - break mirror taking out orignal copy badoshi Linux 0 01-12-2012 06:26 AM
Configure DNS,NFS,NIS,LDAP and LVM(mirror,sparing and multipathing) coolsami HP-UX 1 03-18-2008 12:38 PM



All times are GMT -4. The time now is 01:19 AM.