186d7f5d3SJohn Marino#!/bin/bash 286d7f5d3SJohn Marino# We use some bash-isms (getopts?) 386d7f5d3SJohn Marino 486d7f5d3SJohn Marino# Copyright (C) 2007 Red Hat, Inc. All rights reserved. 586d7f5d3SJohn Marino# 686d7f5d3SJohn Marino# This file is part of LVM2. 786d7f5d3SJohn Marino# 886d7f5d3SJohn Marino# This copyrighted material is made available to anyone wishing to use, 986d7f5d3SJohn Marino# modify, copy, or redistribute it subject to the terms and conditions 1086d7f5d3SJohn Marino# of the GNU General Public License v.2. 1186d7f5d3SJohn Marino# 1286d7f5d3SJohn Marino# You should have received a copy of the GNU General Public License 1386d7f5d3SJohn Marino# along with this program; if not, write to the Free Software Foundation, 1486d7f5d3SJohn Marino# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 1586d7f5d3SJohn Marino 1686d7f5d3SJohn Marino# lvm_dump: This script is used to collect pertinent information for 1786d7f5d3SJohn Marino# the debugging of lvm issues. 1886d7f5d3SJohn Marino 1986d7f5d3SJohn Marino# following external commands are used throughout the script 2086d7f5d3SJohn Marino# echo and test are internal in bash at least 2186d7f5d3SJohn MarinoMKDIR=mkdir # need -p 2286d7f5d3SJohn MarinoTAR=tar # need czf 2386d7f5d3SJohn MarinoRM=rm # need -rf 2486d7f5d3SJohn MarinoCP=cp 2586d7f5d3SJohn MarinoTAIL=tail # we need -n 2686d7f5d3SJohn MarinoLS=ls # need -la 2786d7f5d3SJohn MarinoPS=ps # need alx 2886d7f5d3SJohn MarinoSED=sed 2986d7f5d3SJohn MarinoDD=dd 3086d7f5d3SJohn MarinoCUT=cut 3186d7f5d3SJohn MarinoDATE=date 3286d7f5d3SJohn MarinoBASENAME=basename 3386d7f5d3SJohn MarinoUNAME=uname 3486d7f5d3SJohn Marino 3586d7f5d3SJohn Marino# user may override lvm and dmsetup location by setting LVM_BINARY 3686d7f5d3SJohn Marino# and DMSETUP_BINARY respectively 3786d7f5d3SJohn MarinoLVM=${LVM_BINARY-lvm} 3886d7f5d3SJohn MarinoDMSETUP=${DMSETUP_BINARY-dmsetup} 3986d7f5d3SJohn Marino 4086d7f5d3SJohn Marinodie() { 4186d7f5d3SJohn Marino code=$1; shift 4286d7f5d3SJohn Marino echo "$@" 1>&2 4386d7f5d3SJohn Marino exit $code 4486d7f5d3SJohn Marino} 4586d7f5d3SJohn Marino 4686d7f5d3SJohn Marino"$LVM" version >& /dev/null || die 2 "Could not run lvm binary '$LVM'" 4786d7f5d3SJohn Marino"$DMSETUP" version >& /dev/null || DMSETUP=: 4886d7f5d3SJohn Marino 4986d7f5d3SJohn Marinofunction usage { 5086d7f5d3SJohn Marino echo "$0 [options]" 5186d7f5d3SJohn Marino echo " -h print this message" 5286d7f5d3SJohn Marino echo " -a advanced collection - warning: if lvm is already hung," 5386d7f5d3SJohn Marino echo " then this script may hang as well if -a is used" 5486d7f5d3SJohn Marino echo " -m gather LVM metadata from the PVs" 5586d7f5d3SJohn Marino echo " -d <directory> dump into a directory instead of tarball" 5686d7f5d3SJohn Marino echo " -c if running clvmd, gather cluster data as well" 5786d7f5d3SJohn Marino echo "" 5886d7f5d3SJohn Marino 5986d7f5d3SJohn Marino exit 1 6086d7f5d3SJohn Marino} 6186d7f5d3SJohn Marino 6286d7f5d3SJohn Marinoadvanced=0 6386d7f5d3SJohn Marinoclustered=0 6486d7f5d3SJohn Marinometadata=0 6586d7f5d3SJohn Marinowhile getopts :acd:hm opt; do 6686d7f5d3SJohn Marino case $opt in 6786d7f5d3SJohn Marino s) sysreport=1 ;; 6886d7f5d3SJohn Marino a) advanced=1 ;; 6986d7f5d3SJohn Marino c) clustered=1 ;; 7086d7f5d3SJohn Marino d) userdir=$OPTARG ;; 7186d7f5d3SJohn Marino h) usage ;; 7286d7f5d3SJohn Marino m) metadata=1 ;; 7386d7f5d3SJohn Marino :) echo "$0: $OPTARG requires a value:"; usage ;; 7486d7f5d3SJohn Marino \?) echo "$0: unknown option $OPTARG"; usage ;; 7586d7f5d3SJohn Marino *) usage ;; 7686d7f5d3SJohn Marino esac 7786d7f5d3SJohn Marinodone 7886d7f5d3SJohn Marino 7986d7f5d3SJohn MarinoNOW=`$DATE -u +%G%m%d%k%M%S | /usr/bin/tr -d ' '` 8086d7f5d3SJohn Marinoif test -n "$userdir"; then 8186d7f5d3SJohn Marino dir="$userdir" 8286d7f5d3SJohn Marinoelse 8386d7f5d3SJohn Marino dirbase="lvmdump-$HOSTNAME-$NOW" 8486d7f5d3SJohn Marino dir="$HOME/$dirbase" 8586d7f5d3SJohn Marinofi 8686d7f5d3SJohn Marino 8786d7f5d3SJohn Marinotest -e $dir && die 3 "Fatal: $dir already exists" 8886d7f5d3SJohn Marino$MKDIR -p $dir || die 4 "Fatal: could not create $dir" 8986d7f5d3SJohn Marino 9086d7f5d3SJohn Marinolog="$dir/lvmdump.log" 9186d7f5d3SJohn Marino 9286d7f5d3SJohn Marinomyecho() { 9386d7f5d3SJohn Marino echo "$@" 9486d7f5d3SJohn Marino echo "$@" >> "$log" 9586d7f5d3SJohn Marino} 9686d7f5d3SJohn Marino 9786d7f5d3SJohn Marinolog() { 9886d7f5d3SJohn Marino echo "$@" >> "$log" 9986d7f5d3SJohn Marino eval "$@" 10086d7f5d3SJohn Marino} 10186d7f5d3SJohn Marino 10286d7f5d3SJohn Marinowarnings() { 10386d7f5d3SJohn Marino if test "$UID" != "0" && test "$EUID" != "0"; then 10486d7f5d3SJohn Marino myecho "WARNING! Running as non-privileged user, dump is likely incomplete!" 10586d7f5d3SJohn Marino elif test "$DMSETUP" = ":"; then 10686d7f5d3SJohn Marino myecho "WARNING! Could not run dmsetup, dump is likely incomplete." 10786d7f5d3SJohn Marino fi 10886d7f5d3SJohn Marino} 10986d7f5d3SJohn Marino 11086d7f5d3SJohn Marinowarnings 11186d7f5d3SJohn Marino 11286d7f5d3SJohn Marinomyecho "Creating dump directory: $dir" 11386d7f5d3SJohn Marinoecho " " 11486d7f5d3SJohn Marino 11586d7f5d3SJohn Marinoif (( $advanced )); then 11686d7f5d3SJohn Marino myecho "Gathering LVM volume info..." 11786d7f5d3SJohn Marino 11886d7f5d3SJohn Marino myecho " vgscan..." 11986d7f5d3SJohn Marino log "\"$LVM\" vgscan -vvvv > \"$dir/vgscan\" 2>&1" 12086d7f5d3SJohn Marino 12186d7f5d3SJohn Marino myecho " pvscan..." 12286d7f5d3SJohn Marino log "\"$LVM\" pvscan -v >> \"$dir/pvscan\" 2>> \"$log\"" 12386d7f5d3SJohn Marino 12486d7f5d3SJohn Marino myecho " lvs..." 12586d7f5d3SJohn Marino log "\"$LVM\" lvs -a -o +devices >> \"$dir/lvs\" 2>> \"$log\"" 12686d7f5d3SJohn Marino 12786d7f5d3SJohn Marino myecho " pvs..." 12886d7f5d3SJohn Marino log "\"$LVM\" pvs -a -v > \"$dir/pvs\" 2>> \"$log\"" 12986d7f5d3SJohn Marino 13086d7f5d3SJohn Marino myecho " vgs..." 13186d7f5d3SJohn Marino log "\"$LVM\" vgs -v > \"$dir/vgs\" 2>> \"$log\"" 13286d7f5d3SJohn Marinofi 13386d7f5d3SJohn Marino 13486d7f5d3SJohn Marinoif (( $clustered )); then 13586d7f5d3SJohn Marino myecho "Gathering cluster info..." 13686d7f5d3SJohn Marino 13786d7f5d3SJohn Marino { 13886d7f5d3SJohn Marino for i in nodes status services; do 13986d7f5d3SJohn Marino cap_i=$(echo $i|tr a-z A-Z) 14086d7f5d3SJohn Marino printf "$cap_i:\n----------------------------------\n" 14186d7f5d3SJohn Marino log "cman_tool $i 2>> \"$log\"" 14286d7f5d3SJohn Marino echo 14386d7f5d3SJohn Marino done 14486d7f5d3SJohn Marino 14586d7f5d3SJohn Marino echo "LOCKS:" 14686d7f5d3SJohn Marino echo "----------------------------------" 14786d7f5d3SJohn Marino if [ -f /proc/cluster/dlm_locks ] 14886d7f5d3SJohn Marino then 14986d7f5d3SJohn Marino echo clvmd > /proc/cluster/dlm_locks 15086d7f5d3SJohn Marino cat /proc/cluster/dlm_locks 15186d7f5d3SJohn Marino echo 15286d7f5d3SJohn Marino echo "RESOURCE DIR:" 15386d7f5d3SJohn Marino cat /proc/cluster/dlm_dir 15486d7f5d3SJohn Marino echo 15586d7f5d3SJohn Marino echo "DEBUG LOG:" 15686d7f5d3SJohn Marino cat /proc/cluster/dlm_debug 15786d7f5d3SJohn Marino echo 15886d7f5d3SJohn Marino fi 15986d7f5d3SJohn Marino if [ -f /debug/dlm/clvmd ] 16086d7f5d3SJohn Marino then 16186d7f5d3SJohn Marino cat /debug/dlm/clvmd 16286d7f5d3SJohn Marino echo 16386d7f5d3SJohn Marino echo "WAITERS:" 16486d7f5d3SJohn Marino cat /debug/dlm/clvmd_waiters 16586d7f5d3SJohn Marino echo 16686d7f5d3SJohn Marino echo "MASTER:" 16786d7f5d3SJohn Marino cat /debug/dlm/clvmd_master 16886d7f5d3SJohn Marino fi 16986d7f5d3SJohn Marino } > $dir/cluster_info 17086d7f5d3SJohn Marinofi 17186d7f5d3SJohn Marino 17286d7f5d3SJohn Marinomyecho "Gathering LVM & device-mapper version info..." 17386d7f5d3SJohn Marinoecho "LVM VERSION:" > "$dir/versions" 17486d7f5d3SJohn Marino"$LVM" lvs --version >> "$dir/versions" 2>> "$log" 17586d7f5d3SJohn Marinoecho "DEVICE MAPPER VERSION:" >> "$dir/versions" 17686d7f5d3SJohn Marino"$DMSETUP" --version >> "$dir/versions" 2>> "$log" 17786d7f5d3SJohn Marinoecho "KERNEL VERSION:" >> "$dir/versions" 17886d7f5d3SJohn Marino"$UNAME" -a >> "$dir/versions" 2>> "$log" 17986d7f5d3SJohn Marinoecho "DM TARGETS VERSIONS:" >> "$dir/versions" 18086d7f5d3SJohn Marino"$DMSETUP" targets >> "$dir/versions" 2>> "$log" 18186d7f5d3SJohn Marino 18286d7f5d3SJohn Marinomyecho "Gathering dmsetup info..." 18386d7f5d3SJohn Marinolog "\"$DMSETUP\" info -c > \"$dir/dmsetup_info\" 2>> \"$log\"" 18486d7f5d3SJohn Marinolog "\"$DMSETUP\" table > \"$dir/dmsetup_table\" 2>> \"$log\"" 18586d7f5d3SJohn Marinolog "\"$DMSETUP\" status > \"$dir/dmsetup_status\" 2>> \"$log\"" 18686d7f5d3SJohn Marino 18786d7f5d3SJohn Marinomyecho "Gathering process info..." 18886d7f5d3SJohn Marinolog "$PS alx > \"$dir/ps_info\" 2>> \"$log\"" 18986d7f5d3SJohn Marino 19086d7f5d3SJohn Marinomyecho "Gathering console messages..." 19186d7f5d3SJohn Marinolog "$TAIL -n 75 /var/log/messages > \"$dir/messages\" 2>> \"$log\"" 19286d7f5d3SJohn Marino 19386d7f5d3SJohn Marinomyecho "Gathering /etc/lvm info..." 19486d7f5d3SJohn Marinolog "$CP -a /etc/lvm \"$dir/lvm\" 2>> \"$log\"" 19586d7f5d3SJohn Marino 19686d7f5d3SJohn Marinomyecho "Gathering /dev listing..." 19786d7f5d3SJohn Marinolog "$LS -laR /dev > \"$dir/dev_listing\" 2>> \"$log\"" 19886d7f5d3SJohn Marino 19986d7f5d3SJohn Marinomyecho "Gathering /sys/block listing..." 20086d7f5d3SJohn Marinolog "$LS -laR /sys/block > \"$dir/sysblock_listing\" 2>> \"$log\"" 20186d7f5d3SJohn Marinolog "$LS -laR /sys/devices/virtual/block >> \"$dir/sysblock_listing\" 2>> \"$log\"" 20286d7f5d3SJohn Marino 20386d7f5d3SJohn Marinoif (( $metadata )); then 20486d7f5d3SJohn Marino myecho "Gathering LVM metadata from Physical Volumes..." 20586d7f5d3SJohn Marino 20686d7f5d3SJohn Marino log "$MKDIR -p \"$dir/metadata\"" 20786d7f5d3SJohn Marino 20886d7f5d3SJohn Marino pvs="$("$LVM" pvs --separator , --noheadings --units s --nosuffix -o \ 20986d7f5d3SJohn Marino name,pe_start 2>> "$log" | $SED -e 's/^ *//')" 21086d7f5d3SJohn Marino for line in $pvs 21186d7f5d3SJohn Marino do 21286d7f5d3SJohn Marino test -z "$line" && continue 21386d7f5d3SJohn Marino pv="$(echo $line | $CUT -d, -f1)" 21486d7f5d3SJohn Marino pe_start="$(echo $line | $CUT -d, -f2)" 21586d7f5d3SJohn Marino name="$($BASENAME "$pv")" 21686d7f5d3SJohn Marino myecho " $pv" 21786d7f5d3SJohn Marino log "$DD if=$pv \"of=$dir/metadata/$name\" bs=512 count=$pe_start 2>> \"$log\"" 21886d7f5d3SJohn Marino done 21986d7f5d3SJohn Marinofi 22086d7f5d3SJohn Marino 22186d7f5d3SJohn Marinoif test -z "$userdir"; then 22286d7f5d3SJohn Marino lvm_dump="$dirbase.tgz" 22386d7f5d3SJohn Marino myecho "Creating report tarball in $HOME/$lvm_dump..." 22486d7f5d3SJohn Marinofi 22586d7f5d3SJohn Marino 22686d7f5d3SJohn Marinowarnings 22786d7f5d3SJohn Marino 22886d7f5d3SJohn Marinoif test -z "$userdir"; then 22986d7f5d3SJohn Marino cd "$HOME" 23086d7f5d3SJohn Marino "$TAR" czf "$lvm_dump" "$dirbase" 2>/dev/null 23186d7f5d3SJohn Marino "$RM" -rf "$dir" 23286d7f5d3SJohn Marinofi 23386d7f5d3SJohn Marino 23486d7f5d3SJohn Marinoexit 0 23586d7f5d3SJohn Marino 236