xref: /dflybsd-src/contrib/lvm2/dist/scripts/lvm_dump.sh (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
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