Google PlusFacebookTwitter

L’utilisation de Kdump sur Debian Wheezy

By on Jan 31, 2013 in Devel, Linux | 3 comments

Share On GoogleShare On FacebookShare On Twitter

Kdump et Debian

Depuis quelques jours je m’amuse à jouer avec Kdump sous Debian. Au premier abord, la prise en main semble assez simple mais j’ai vite déchanté… Au final, la configuration de Kdump sur une Debian n’est pas des plus aisée.

Dans les dépôts Debian on trouve le paquet kdump-tools qui contient le script kdump-config permettant d’automatiser la prise d’un dump lors d’un crash.

kdump-config c’est bien mais ça ne suffit pas. Après l’installation de ce paquet, il reste à configurer GRUB et vérifier que le noyau possède bien toutes les options nécessaires à la prise en charge de kexec.

Autre point que je trouve dommage avec kdump-config est que ce dernier ne permet pas (pour le moment) d’envoyer le dump généré sur un serveur distant ce qui peut-être pratique dans le cas ou le disque dur local rencontre quelques soucis. Dans le script en question à la fonction kdump_save_core() l’auteur a laisser le commentaire suivant :

# TODO: implement different transport options other than
# store to local disk

Pour des besoins personnels, j’ai donc ajouté un bout de code à la fonction kdump_save_core() me permettant d’envoyer le dump sur un serveur distant soit via NFS soit via SSH.

Cette fonction prend désormais deux paramètres supplémentaires définis dans le fichier de configuration de kdump-tools

USE_KDUMP=1
KDUMP_RUNLEVEL="3"
KDUMP_SAVEDIR="root@10.20.254.78:/srv/data/crashdump"
KDUMP_NET="sftp"
KDUMP_SYSCTL="kernel.panic_on_oops=1"
KDUMP_COREDIR="/var/crash"
KDUMP_FAIL_CMD="reboot -f"
DEBUG_KERNEL=/usr/lib/debug/boot/vmlinux-3.2.0-4-amd64
MAKEDUMP_ARGS="-c -d 31"

La fonction kdump_save_core() après modification :

# Saving the vmcore:
#	Our priorities are:
#	  1. If the makedumpfile config link is valid, use that
#	  2. else if the vmlinux link is valid, use that
#	  3. else fallback to using:  makedumpfile -d 1 -c
#	  4. else use cp
#
# TODO: implement different transport options other than
# store to local disk
#
# Returns: 0/1 (success/fail)
# Sets: KDUMP_STAMPDIR, KDUMP_COREFILE
function kdump_save_core()
{
	KDUMP_STAMPDIR="$KDUMP_COREDIR/"`date +"%Y%m%d%H%M"`
	KDUMP_CORETEMP="$KDUMP_STAMPDIR/dump-incomplete"
	KDUMP_COREFILE="$KDUMP_STAMPDIR/dump."`date +"%Y%m%d%H%M"`

	mkdir -p $KDUMP_STAMPDIR

	DEBUG_KERNEL=`readlink -n -s $kernel_link`
	if [ -e "$DEBUG_KERNEL" ] ; then
		MAKEDUMP_ARGS=${MAKEDUMP_ARGS:="-c -d 31"}
		MAKEDUMP_ARGS="$MAKEDUMP_ARGS -x $DEBUG_KERNEL"
	else
		MAKEDUMP_ARGS=${MAKEDUMP_ARGS:="-c -d 1"}
	fi

	# Move previously linked kernel particulars into dump directory.
	[ -e $kernel_link ] && mv $kernel_link $KDUMP_STAMPDIR
	[ -e $kconfig_link ] && mv $kconfig_link $KDUMP_STAMPDIR
	[ -e $systemmap_link ] && mv $systemmap_link $KDUMP_STAMPDIR

	log_action_msg "running makedumpfile $MAKEDUMP_ARGS $vmcore_file $KDUMP_CORETEMP"
	makedumpfile $MAKEDUMP_ARGS $vmcore_file $KDUMP_CORETEMP
	if [ $? -ne 0 ] ; then
		log_failure_msg "$NAME: makedumpfile failed, falling back to 'cp'"
		logger -t $NAME "makedumpfile failed, falling back to 'cp'"
		KDUMP_CORETEMP="$KDUMP_STAMPDIR/vmcore-incomplete"
		KDUMP_COREFILE="$KDUMP_STAMPDIR/vmcore."`date +"%Y%m%d%H%M"`
		cp $vmcore_file $KDUMP_CORETEMP
	fi

	# did we succeed?
	if [ $? == 0 ]; then
		mv $KDUMP_CORETEMP $KDUMP_COREFILE
		log_success_msg "$NAME: saved vmcore in $KDUMP_STAMPDIR"
		logger -t $NAME "saved vmcore in $KDUMP_STAMPDIR"

		# If the net option has been defined in the config file :
		#	- We send the core to a NFS server
		#			OR
		#	- We send the core to SFTP server
		#
		# Options defined in the config file :
		#	1. KDUMP_NET (nfs|sftp)
		#	2. KDUMP_SAVEDIR
		#
		# Returns: 0/1 (success/fail)
		# Sets: DIR_TO_PUT, MOUNTPOINT, SFTP_DIRECTORY, SFTP_ADDRESS, SSH_OPTIONS
		DIR_TO_PUT=$(hostname)-$(date +"%Y%m%d%H%M")
		if [ "$KDUMP_NET" == "nfs" ]
		then
			MOUNTPOINT="/mnt"
			logger -t $NAME "Send the vmcore $KDUMP_COREFILE to NFS server..."
			if [ ! -d $MOUNTPOINT ]
			then
				mkdir -p $MOUNTPOINT
			fi
			mount -t nfs $KDUMP_SAVEDIR $MOUNTPOINT
			mkdir -p ${MOUNTPOINT}/${DIR_TO_PUT}
			cp $KDUMP_COREFILE ${MOUNTPOINT}/${DIR_TO_PUT}/
			umount $MOUNTPOINT || umount -f $MOUNTPOINT
			log_success_msg "$NAME: saved vmcore in ${KDUMP_SAVEDIR}/${DIR_TO_PUT}"
			logger -t $NAME "saved vmcore in ${KDUMP_SAVEDIR}/${DIR_TO_PUT}"
			return 0
		elif [ "$KDUMP_NET" == "sftp" ]
		then
			SFTP_DIRECTORY=$(echo $KDUMP_SAVEDIR | awk -F":" '{ print $2 }')
			SFTP_ADDRESS=$(echo $KDUMP_SAVEDIR | awk -F":" '{ print $1 }' | awk -F"@" '{ print $2 }')
			SSH_OPTIONS="-o StrictHostKeyChecking=no -o CheckHostIP=no"
			logger -t $NAME "Send the vmcore $KDUMP_COREFILE to SFTP server..."
			ssh $SSH_OPTIONS $SFTP_ADDRESS mkdir -p ${SFTP_DIRECTORY}/${DIR_TO_PUT}
			scp $SSH_OPTIONS $KDUMP_COREFILE ${KDUMP_SAVEDIR}/${DIR_TO_PUT}
			log_success_msg "$NAME: saved vmcore in ${KDUMP_SAVEDIR}/${DIR_TO_PUT}"
			logger -t $NAME "saved vmcore in ${KDUMP_SAVEDIR}/${DIR_TO_PUT}"
			return 0
		else
			return 1;
			log_failure_msg "$NAME: failed to send vmcore to $KDUMP_SAVEDIR"
			logger -t $NAME "failed to send vmcore to $KDUMP_SAVEDIR"
		fi
		return 0;
	else
		log_failure_msg "$NAME: failed to save vmcore in $KDUMP_STAMPDIR"
		logger -t $NAME "failed to save vmcore in $KDUMP_STAMPDIR"
		return 1;
	fi
}

Pour faciliter le déploiement de Kdump, j’ai pondu un petit script disponible dans le paquet kdump-install. Il prend en charge la configuration du GRUB en fonction de la mémoire disponible sur le serveur, la configuration de Kdump (avec prise en charge du NFS et du SSH), la configuration des Magic SysRq.

Voici à quoi ressemble la sortie d’écran du script après l’exécution de la commande kdump-install :
Output de kdump-install

Liens :

The following two tabs change content below.

Gaëtan Trellu (goldyfruit)

Cloud Technical Advisor chez IBM
Autodidacte en informatique, depuis 2005 je parcours l’écosystème Unix à la recherche de nouvelles connaissances et de nouvelles rencontres.

Derniers articles parGaëtan Trellu (goldyfruit) (voir tous)

CC BY 4.0 L’utilisation de Kdump sur Debian Wheezy par Gaëtan Trellu (goldyfruit) est sous Licence Creative Commons Internationale Attribution 4.0.