156a34939Shaad#!/bin/bash 256a34939Shaad# We use some bash-isms (getopts?) 356a34939Shaad 456a34939Shaad# Copyright (C) 2007 Red Hat, Inc. All rights reserved. 556a34939Shaad# 656a34939Shaad# This file is part of LVM2. 756a34939Shaad# 856a34939Shaad# This copyrighted material is made available to anyone wishing to use, 956a34939Shaad# modify, copy, or redistribute it subject to the terms and conditions 1056a34939Shaad# of the GNU General Public License v.2. 1156a34939Shaad# 1256a34939Shaad# You should have received a copy of the GNU General Public License 1356a34939Shaad# along with this program; if not, write to the Free Software Foundation, 1456a34939Shaad# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 1556a34939Shaad 1656a34939Shaad# lvm_dump: This script is used to collect pertinent information for 1756a34939Shaad# the debugging of lvm issues. 1856a34939Shaad 1956a34939Shaad# following external commands are used throughout the script 2056a34939Shaad# echo and test are internal in bash at least 2156a34939ShaadMKDIR=mkdir # need -p 2256a34939ShaadTAR=tar # need czf 2356a34939ShaadRM=rm # need -rf 2456a34939ShaadCP=cp 2556a34939ShaadTAIL=tail # we need -n 2656a34939ShaadLS=ls # need -la 2756a34939ShaadPS=ps # need alx 2856a34939ShaadSED=sed 2956a34939ShaadDD=dd 3056a34939ShaadCUT=cut 3156a34939ShaadDATE=date 3256a34939ShaadBASENAME=basename 3356a34939ShaadUNAME=uname 3456a34939Shaad 3556a34939Shaad# user may override lvm and dmsetup location by setting LVM_BINARY 3656a34939Shaad# and DMSETUP_BINARY respectively 3756a34939ShaadLVM=${LVM_BINARY-lvm} 3856a34939ShaadDMSETUP=${DMSETUP_BINARY-dmsetup} 3956a34939Shaad 4056a34939Shaaddie() { 4156a34939Shaad code=$1; shift 4256a34939Shaad echo "$@" 1>&2 4356a34939Shaad exit $code 4456a34939Shaad} 4556a34939Shaad 4656a34939Shaad"$LVM" version >& /dev/null || die 2 "Could not run lvm binary '$LVM'" 4756a34939Shaad"$DMSETUP" version >& /dev/null || DMSETUP=: 4856a34939Shaad 4956a34939Shaadfunction usage { 5056a34939Shaad echo "$0 [options]" 5156a34939Shaad echo " -h print this message" 5256a34939Shaad echo " -a advanced collection - warning: if lvm is already hung," 5356a34939Shaad echo " then this script may hang as well if -a is used" 5456a34939Shaad echo " -m gather LVM metadata from the PVs" 5556a34939Shaad echo " -d <directory> dump into a directory instead of tarball" 5656a34939Shaad echo " -c if running clvmd, gather cluster data as well" 5756a34939Shaad echo "" 5856a34939Shaad 5956a34939Shaad exit 1 6056a34939Shaad} 6156a34939Shaad 6256a34939Shaadadvanced=0 6356a34939Shaadclustered=0 6456a34939Shaadmetadata=0 6556a34939Shaadwhile getopts :acd:hm opt; do 6656a34939Shaad case $opt in 6756a34939Shaad s) sysreport=1 ;; 6856a34939Shaad a) advanced=1 ;; 6956a34939Shaad c) clustered=1 ;; 7056a34939Shaad d) userdir=$OPTARG ;; 7156a34939Shaad h) usage ;; 7256a34939Shaad m) metadata=1 ;; 7356a34939Shaad :) echo "$0: $OPTARG requires a value:"; usage ;; 7456a34939Shaad \?) echo "$0: unknown option $OPTARG"; usage ;; 7556a34939Shaad *) usage ;; 7656a34939Shaad esac 7756a34939Shaaddone 7856a34939Shaad 7956a34939ShaadNOW=`$DATE -u +%G%m%d%k%M%S | /usr/bin/tr -d ' '` 8056a34939Shaadif test -n "$userdir"; then 8156a34939Shaad dir="$userdir" 8256a34939Shaadelse 8356a34939Shaad dirbase="lvmdump-$HOSTNAME-$NOW" 8456a34939Shaad dir="$HOME/$dirbase" 8556a34939Shaadfi 8656a34939Shaad 8756a34939Shaadtest -e $dir && die 3 "Fatal: $dir already exists" 8856a34939Shaad$MKDIR -p $dir || die 4 "Fatal: could not create $dir" 8956a34939Shaad 9056a34939Shaadlog="$dir/lvmdump.log" 9156a34939Shaad 9256a34939Shaadmyecho() { 9356a34939Shaad echo "$@" 9456a34939Shaad echo "$@" >> "$log" 9556a34939Shaad} 9656a34939Shaad 9756a34939Shaadlog() { 9856a34939Shaad echo "$@" >> "$log" 9956a34939Shaad eval "$@" 10056a34939Shaad} 10156a34939Shaad 10256a34939Shaadwarnings() { 10356a34939Shaad if test "$UID" != "0" && test "$EUID" != "0"; then 10456a34939Shaad myecho "WARNING! Running as non-privileged user, dump is likely incomplete!" 10556a34939Shaad elif test "$DMSETUP" = ":"; then 10656a34939Shaad myecho "WARNING! Could not run dmsetup, dump is likely incomplete." 10756a34939Shaad fi 10856a34939Shaad} 10956a34939Shaad 11056a34939Shaadwarnings 11156a34939Shaad 11256a34939Shaadmyecho "Creating dump directory: $dir" 11356a34939Shaadecho " " 11456a34939Shaad 11556a34939Shaadif (( $advanced )); then 11656a34939Shaad myecho "Gathering LVM volume info..." 11756a34939Shaad 11856a34939Shaad myecho " vgscan..." 11956a34939Shaad log "\"$LVM\" vgscan -vvvv > \"$dir/vgscan\" 2>&1" 12056a34939Shaad 12156a34939Shaad myecho " pvscan..." 12256a34939Shaad log "\"$LVM\" pvscan -v >> \"$dir/pvscan\" 2>> \"$log\"" 12356a34939Shaad 12456a34939Shaad myecho " lvs..." 12556a34939Shaad log "\"$LVM\" lvs -a -o +devices >> \"$dir/lvs\" 2>> \"$log\"" 12656a34939Shaad 12756a34939Shaad myecho " pvs..." 12856a34939Shaad log "\"$LVM\" pvs -a -v > \"$dir/pvs\" 2>> \"$log\"" 12956a34939Shaad 13056a34939Shaad myecho " vgs..." 13156a34939Shaad log "\"$LVM\" vgs -v > \"$dir/vgs\" 2>> \"$log\"" 13256a34939Shaadfi 13356a34939Shaad 13456a34939Shaadif (( $clustered )); then 13556a34939Shaad myecho "Gathering cluster info..." 13656a34939Shaad 13756a34939Shaad { 13856a34939Shaad for i in nodes status services; do 13956a34939Shaad cap_i=$(echo $i|tr a-z A-Z) 14056a34939Shaad printf "$cap_i:\n----------------------------------\n" 14156a34939Shaad log "cman_tool $i 2>> \"$log\"" 14256a34939Shaad echo 14356a34939Shaad done 14456a34939Shaad 14556a34939Shaad echo "LOCKS:" 14656a34939Shaad echo "----------------------------------" 14756a34939Shaad if [ -f /proc/cluster/dlm_locks ] 14856a34939Shaad then 14956a34939Shaad echo clvmd > /proc/cluster/dlm_locks 15056a34939Shaad cat /proc/cluster/dlm_locks 15156a34939Shaad echo 15256a34939Shaad echo "RESOURCE DIR:" 15356a34939Shaad cat /proc/cluster/dlm_dir 15456a34939Shaad echo 15556a34939Shaad echo "DEBUG LOG:" 15656a34939Shaad cat /proc/cluster/dlm_debug 15756a34939Shaad echo 15856a34939Shaad fi 15956a34939Shaad if [ -f /debug/dlm/clvmd ] 16056a34939Shaad then 16156a34939Shaad cat /debug/dlm/clvmd 16256a34939Shaad echo 16356a34939Shaad echo "WAITERS:" 16456a34939Shaad cat /debug/dlm/clvmd_waiters 16556a34939Shaad echo 16656a34939Shaad echo "MASTER:" 16756a34939Shaad cat /debug/dlm/clvmd_master 16856a34939Shaad fi 16956a34939Shaad } > $dir/cluster_info 17056a34939Shaadfi 17156a34939Shaad 17256a34939Shaadmyecho "Gathering LVM & device-mapper version info..." 17356a34939Shaadecho "LVM VERSION:" > "$dir/versions" 17456a34939Shaad"$LVM" lvs --version >> "$dir/versions" 2>> "$log" 17556a34939Shaadecho "DEVICE MAPPER VERSION:" >> "$dir/versions" 17656a34939Shaad"$DMSETUP" --version >> "$dir/versions" 2>> "$log" 17756a34939Shaadecho "KERNEL VERSION:" >> "$dir/versions" 17856a34939Shaad"$UNAME" -a >> "$dir/versions" 2>> "$log" 17956a34939Shaadecho "DM TARGETS VERSIONS:" >> "$dir/versions" 18056a34939Shaad"$DMSETUP" targets >> "$dir/versions" 2>> "$log" 18156a34939Shaad 18256a34939Shaadmyecho "Gathering dmsetup info..." 18356a34939Shaadlog "\"$DMSETUP\" info -c > \"$dir/dmsetup_info\" 2>> \"$log\"" 18456a34939Shaadlog "\"$DMSETUP\" table > \"$dir/dmsetup_table\" 2>> \"$log\"" 18556a34939Shaadlog "\"$DMSETUP\" status > \"$dir/dmsetup_status\" 2>> \"$log\"" 18656a34939Shaad 18756a34939Shaadmyecho "Gathering process info..." 18856a34939Shaadlog "$PS alx > \"$dir/ps_info\" 2>> \"$log\"" 18956a34939Shaad 19056a34939Shaadmyecho "Gathering console messages..." 19156a34939Shaadlog "$TAIL -n 75 /var/log/messages > \"$dir/messages\" 2>> \"$log\"" 19256a34939Shaad 19356a34939Shaadmyecho "Gathering /etc/lvm info..." 19456a34939Shaadlog "$CP -a /etc/lvm \"$dir/lvm\" 2>> \"$log\"" 19556a34939Shaad 19656a34939Shaadmyecho "Gathering /dev listing..." 19756a34939Shaadlog "$LS -laR /dev > \"$dir/dev_listing\" 2>> \"$log\"" 19856a34939Shaad 19956a34939Shaadmyecho "Gathering /sys/block listing..." 200*bec4d750Shaadlog "$LS -laR /sys/block > \"$dir/sysblock_listing\" 2>> \"$log\"" 201*bec4d750Shaadlog "$LS -laR /sys/devices/virtual/block >> \"$dir/sysblock_listing\" 2>> \"$log\"" 20256a34939Shaad 20356a34939Shaadif (( $metadata )); then 20456a34939Shaad myecho "Gathering LVM metadata from Physical Volumes..." 20556a34939Shaad 20656a34939Shaad log "$MKDIR -p \"$dir/metadata\"" 20756a34939Shaad 20856a34939Shaad pvs="$("$LVM" pvs --separator , --noheadings --units s --nosuffix -o \ 20956a34939Shaad name,pe_start 2>> "$log" | $SED -e 's/^ *//')" 21056a34939Shaad for line in $pvs 21156a34939Shaad do 21256a34939Shaad test -z "$line" && continue 21356a34939Shaad pv="$(echo $line | $CUT -d, -f1)" 21456a34939Shaad pe_start="$(echo $line | $CUT -d, -f2)" 21556a34939Shaad name="$($BASENAME "$pv")" 21656a34939Shaad myecho " $pv" 21756a34939Shaad log "$DD if=$pv \"of=$dir/metadata/$name\" bs=512 count=$pe_start 2>> \"$log\"" 21856a34939Shaad done 21956a34939Shaadfi 22056a34939Shaad 22156a34939Shaadif test -z "$userdir"; then 22256a34939Shaad lvm_dump="$dirbase.tgz" 22356a34939Shaad myecho "Creating report tarball in $HOME/$lvm_dump..." 22456a34939Shaadfi 22556a34939Shaad 22656a34939Shaadwarnings 22756a34939Shaad 22856a34939Shaadif test -z "$userdir"; then 22956a34939Shaad cd "$HOME" 23056a34939Shaad "$TAR" czf "$lvm_dump" "$dirbase" 2>/dev/null 23156a34939Shaad "$RM" -rf "$dir" 23256a34939Shaadfi 23356a34939Shaad 23456a34939Shaadexit 0 23556a34939Shaad 236