xref: /netbsd-src/external/gpl2/lvm2/dist/scripts/lvm_dump.sh (revision bec4d750d436214708904d6a2c66f8d979761c4b)
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