2006-10-05 22:42:33 +04:00
#!/bin/bash
2006-11-23 20:23:14 +03:00
# we use some bash-isms (getopts?)
2006-10-05 22:42:33 +04:00
# lvm_dump: This script is used to collect pertinent information for
# the debugging of lvm issues.
2006-11-23 20:23:14 +03:00
# following external commands are used throughout the script
# which, echo and test are internal in bash at least
MKDIR = mkdir # need -p
TAR = tar # need czf
RM = rm # need -rf
CP = cp
TAIL = tail # we need -n
LS = ls # need -la
PS = ps # need alx
SED = sed
DD = dd
CUT = cut
DATE = date
BASENAME = basename
2007-07-03 00:18:38 +04:00
UNAME = uname
2006-11-23 20:23:14 +03:00
# user may override lvm and dmsetup location by setting LVM_BINARY
# and DMSETUP_BINARY respectively
LVM = ${ LVM_BINARY -lvm }
DMSETUP = ${ DMSETUP_BINARY -dmsetup }
die( ) {
code = $1 ; shift
echo " $@ " 1>& 2
exit $code
}
# which should error out if the binary is not executable, although i
# am not sure we can rely on this
which $LVM >& /dev/null || die 2 " Fatal: could not find lvm binary ' $LVM ' "
test -x ` which $LVM ` || die 2 " Fatal: lvm binary ' $LVM ' not executable "
which $DMSETUP >& /dev/null || die 2 " Fatal: could not find dmsetup binary ' $DMSETUP ' "
test -x ` which $DMSETUP ` || die 2 " Fatal: dmsetup binary ' $DMSETUP ' not executable "
2006-10-05 22:42:33 +04:00
function usage {
echo " $0 [options] "
echo " -h print this message"
echo " -a advanced collection - warning: if lvm is already hung,"
echo " then this script may hang as well if -a is used"
echo " -m gather LVM metadata from the PVs"
2006-11-16 19:44:48 +03:00
echo " -d <directory> dump into a directory instead of tarball"
2006-10-05 22:42:33 +04:00
echo " -c if running clvmd, gather cluster data as well"
echo ""
exit 1
}
advanced = 0
clustered = 0
metadata = 0
while getopts :acd:hm opt; do
case $opt in
2006-11-16 19:44:48 +03:00
s) sysreport = 1 ; ;
2006-10-05 22:42:33 +04:00
a) advanced = 1 ; ;
c) clustered = 1 ; ;
2006-11-16 19:44:48 +03:00
d) userdir = $OPTARG ; ;
2006-10-05 22:42:33 +04:00
h) usage ; ;
m) metadata = 1 ; ;
:) echo " $0 : $OPTARG requires a value: " ; usage ; ;
\? ) echo " $0 : unknown option $OPTARG " ; usage ; ;
*) usage ; ;
esac
done
2006-11-23 20:23:14 +03:00
NOW = ` $DATE -u +%G%m%d%k%M%S | /usr/bin/tr -d ' ' `
2006-11-16 19:44:48 +03:00
if test -n " $userdir " ; then
dir = " $userdir "
else
2006-11-23 20:23:14 +03:00
dirbase = " lvmdump- $HOSTNAME - $NOW "
2006-11-16 19:44:48 +03:00
dir = " $HOME / $dirbase "
fi
2006-11-23 20:23:14 +03:00
test -e $dir && die 3 " Fatal: $dir already exists "
$MKDIR -p $dir || die 4 " Fatal: could not create $dir "
2006-11-16 19:44:48 +03:00
log = " $dir /lvmdump.log "
myecho( ) {
echo " $@ "
echo " $@ " >> $log
}
log( ) {
echo " $@ " >> $log
eval " $@ "
}
2006-10-05 22:42:33 +04:00
echo " "
2006-11-16 19:44:48 +03:00
myecho " Creating dump directory: $dir "
2006-10-05 22:42:33 +04:00
echo " "
if ( ( $advanced ) ) ; then
2006-11-16 19:44:48 +03:00
myecho "Gathering LVM volume info..."
2006-10-05 22:42:33 +04:00
2006-11-16 19:44:48 +03:00
myecho " vgscan..."
2006-11-23 20:23:14 +03:00
log " $LVM vgscan -vvvv > $dir /vgscan 2>&1 "
2006-10-05 22:42:33 +04:00
2006-11-16 19:44:48 +03:00
myecho " pvscan..."
2006-11-23 20:23:14 +03:00
log " $LVM pvscan -v >> $dir /pvscan 2>> $log "
2006-10-05 22:42:33 +04:00
2006-11-16 19:44:48 +03:00
myecho " lvs..."
2006-11-23 20:23:14 +03:00
log " $LVM lvs -a -o +devices >> $dir /lvs 2>> $log "
2006-10-05 22:42:33 +04:00
2006-11-16 19:44:48 +03:00
myecho " pvs..."
2006-11-23 20:23:14 +03:00
log " $LVM pvs -a -v > $dir /pvs 2>> $log "
2006-10-05 22:42:33 +04:00
echo " vgs..."
2006-11-23 20:23:14 +03:00
log " $LVM vgs -v > $dir /vgs 2>> $log "
2006-10-05 22:42:33 +04:00
fi
if ( ( $clustered ) ) ; then
2006-11-16 19:44:48 +03:00
myecho "Gathering cluster info..."
2007-08-20 16:06:35 +04:00
{
for i in nodes status services; do
cap_i = $( echo $i | tr a-z A-Z)
printf " $cap_i :\n----------------------------------\n "
log " cman_tool $i 2>> $log "
echo
done
echo "LOCKS:"
echo "----------------------------------"
2007-08-09 13:53:33 +04:00
if [ -f /proc/cluster/dlm_locks ]
then
2007-08-20 16:06:35 +04:00
echo clvmd > /proc/cluster/dlm_locks
cat /proc/cluster/dlm_locks
echo
echo "RESOURCE DIR:"
cat /proc/cluster/dlm_dir
echo
echo "DEBUG LOG:"
cat /proc/cluster/dlm_debug
echo
2007-08-09 13:53:33 +04:00
fi
if [ -f /debug/dlm/clvmd ]
then
2007-08-20 16:06:35 +04:00
cat /debug/dlm/clvmd
echo
echo "WAITERS:"
cat /debug/dlm/clvmd_waiters
echo
echo "MASTER:"
cat /debug/dlm/clvmd_master
2007-08-09 13:53:33 +04:00
fi
2007-08-20 16:06:35 +04:00
} > $dir /cluster_info
2006-10-05 22:42:33 +04:00
fi
2006-11-16 19:44:48 +03:00
myecho "Gathering LVM & device-mapper version info..."
echo "LVM VERSION:" > $dir /versions
2006-11-23 20:23:14 +03:00
$LVM lvs --version >> $dir /versions 2>> $log
2006-11-16 19:44:48 +03:00
echo "DEVICE MAPPER VERSION:" >> $dir /versions
2006-11-23 20:23:14 +03:00
$DMSETUP --version >> $dir /versions 2>> $log
2007-07-03 00:18:38 +04:00
echo "KERNEL VERSION:" >> $dir /versions
$UNAME -a >> $dir /versions 2>> $log
echo "DM TARGETS VERSIONS:" >> $dir /versions
$DMSETUP targets >> $dir /versions 2>> $log
2006-10-05 22:42:33 +04:00
2006-11-16 19:44:48 +03:00
myecho "Gathering dmsetup info..."
2006-11-23 20:23:14 +03:00
log " $DMSETUP info -c > $dir /dmsetup_info 2>> $log "
log " $DMSETUP table > $dir /dmsetup_table 2>> $log "
log " $DMSETUP status > $dir /dmsetup_status 2>> $log "
2006-10-05 22:42:33 +04:00
2006-11-16 19:44:48 +03:00
myecho "Gathering process info..."
2006-11-23 20:23:14 +03:00
log " $PS alx > $dir /ps_info 2>> $log "
2006-10-05 22:42:33 +04:00
2006-11-16 19:44:48 +03:00
myecho "Gathering console messages..."
2006-11-23 20:23:14 +03:00
log " $TAIL -n 75 /var/log/messages > $dir /messages 2>> $log "
2006-10-05 22:42:33 +04:00
2006-11-16 19:44:48 +03:00
myecho "Gathering /etc/lvm info..."
2006-11-23 20:23:14 +03:00
log " $CP -a /etc/lvm $dir /lvm 2>> $log "
2006-10-05 22:42:33 +04:00
2006-11-16 19:44:48 +03:00
myecho "Gathering /dev listing..."
2007-04-20 03:06:05 +04:00
log " $LS -laR /dev > $dir /dev_listing 2>> $log "
2006-10-05 22:42:33 +04:00
2007-04-25 18:49:27 +04:00
myecho "Gathering /sys/block listing..."
log " $LS -laR /sys/block > $dir /sysblock_listing "
2006-10-05 22:42:33 +04:00
if ( ( $metadata ) ) ; then
2006-11-16 19:44:48 +03:00
myecho "Gathering LVM metadata from Physical Volumes..."
2006-10-05 22:42:33 +04:00
2006-11-23 20:23:14 +03:00
log " $MKDIR -p $dir /metadata "
2006-10-05 22:42:33 +04:00
2006-11-23 20:23:14 +03:00
pvs = " $( $LVM pvs --separator , --noheadings --units s --nosuffix -o \
name,pe_start 2>> $log | $SED -e 's/^ *//' ) "
2006-11-16 19:44:48 +03:00
for line in " $pvs "
2006-10-05 22:42:33 +04:00
do
2006-11-23 20:23:14 +03:00
test -z " $line " && continue
pv = " $( echo $line | $CUT -d, -f1) "
pe_start = " $( echo $line | $CUT -d, -f2) "
name = " $( $BASENAME $pv ) "
2006-11-16 19:44:48 +03:00
myecho " $pv "
2006-11-23 20:23:14 +03:00
log " $DD if= $pv of= $dir /metadata/ $name bs=512 count= $pe_start 2>> $log "
2006-11-16 19:44:48 +03:00
done
2006-10-05 22:42:33 +04:00
fi
2006-11-16 19:44:48 +03:00
if test -z " $userdir " ; then
lvm_dump = " $dirbase .tgz "
myecho " Creating report tarball in $HOME / $lvm_dump ... "
cd $HOME
2006-11-23 20:23:14 +03:00
$TAR czf $lvm_dump $dirbase 2>/dev/null
$RM -rf $dir
fi
if test " $UID " != "0" && test " $EUID " != "0" ; then
myecho
myecho "WARNING! Running as non-privileged user, dump is likely incomplete!"
myecho
2006-11-16 19:44:48 +03:00
fi
2006-10-05 22:42:33 +04:00
exit 0