2006-10-05 22:42:33 +04:00
#!/bin/bash
2007-08-21 00:55:30 +04:00
# We use some bash-isms (getopts?)
# Copyright (C) 2007 Red Hat, Inc. All rights reserved.
#
# This file is part of LVM2.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions
# of the GNU General Public License v.2.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2006-11-23 20:23:14 +03:00
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
2007-10-02 19:48:58 +04:00
# echo and test are internal in bash at least
2006-11-23 20:23:14 +03:00
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
}
2007-10-02 19:48:58 +04:00
" $LVM " version >& /dev/null || die 2 " Could not run lvm binary ' $LVM ' "
2007-10-03 19:00:51 +04:00
" $DMSETUP " version >& /dev/null || DMSETUP = :
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 " $@ "
2007-10-02 20:09:46 +04:00
echo " $@ " >> " $log "
2006-11-16 19:44:48 +03:00
}
log( ) {
2007-10-02 20:09:46 +04:00
echo " $@ " >> " $log "
2006-11-16 19:44:48 +03:00
eval " $@ "
}
2006-10-05 22:42:33 +04:00
2007-10-03 19:00:51 +04:00
warnings( ) {
if test " $UID " != "0" && test " $EUID " != "0" ; then
myecho "WARNING! Running as non-privileged user, dump is likely incomplete!"
elif test " $DMSETUP " = ":" ; then
myecho "WARNING! Could not run dmsetup, dump is likely incomplete."
fi
}
warnings
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..."
2007-10-02 20:09:46 +04: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..."
2007-10-02 20:09:46 +04: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..."
2007-10-02 20:09:46 +04: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..."
2007-10-02 20:09:46 +04:00
log " \" $LVM \" pvs -a -v > \" $dir /pvs\" 2>> \" $log \" "
2006-10-05 22:42:33 +04:00
2007-10-02 20:09:46 +04:00
myecho " vgs..."
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 "
2007-10-02 20:09:46 +04:00
log " cman_tool $i 2>> \" $log \" "
2007-08-20 16:06:35 +04:00
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..."
2007-10-02 20:09:46 +04:00
echo "LVM VERSION:" > " $dir /versions "
" $LVM " lvs --version >> " $dir /versions " 2>> " $log "
echo "DEVICE MAPPER VERSION:" >> " $dir /versions "
" $DMSETUP " --version >> " $dir /versions " 2>> " $log "
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..."
2007-10-02 20:09:46 +04: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..."
2007-10-02 20:09:46 +04: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..."
2007-10-02 20:09:46 +04: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..."
2007-10-02 20:09:46 +04: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-10-02 20:09:46 +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..."
2009-01-06 21:02:57 +03:00
log " $LS -laR /sys/block > \" $dir /sysblock_listing\" 2>> \" $log \" "
log " $LS -laR /sys/devices/virtual/block >> \" $dir /sysblock_listing\" 2>> \" $log \" "
2007-04-25 18:49:27 +04:00
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
2007-10-02 20:09:46 +04:00
log " $MKDIR -p \" $dir /metadata\" "
2006-10-05 22:42:33 +04:00
2007-10-02 20:09:46 +04:00
pvs = " $( " $LVM " pvs --separator , --noheadings --units s --nosuffix -o \
name,pe_start 2>> " $log " | $SED -e 's/^ *//' ) "
2008-08-28 14:40:44 +04: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) "
2007-10-02 20:09:46 +04:00
name = " $( $BASENAME " $pv " ) "
2006-11-16 19:44:48 +03:00
myecho " $pv "
2007-10-02 20:09:46 +04: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 ... "
2007-10-03 19:00:51 +04:00
fi
warnings
if test -z " $userdir " ; then
2007-10-02 19:48:58 +04:00
cd " $HOME "
2007-10-02 20:09:46 +04:00
" $TAR " czf " $lvm_dump " " $dirbase " 2>/dev/null
" $RM " -rf " $dir "
2006-11-23 20:23:14 +03:00
fi
2006-10-05 22:42:33 +04:00
exit 0