HardenedBSD/etc/rc.d/dumpon
Mark Johnston 64a16434d8 Add support for compressed kernel dumps.
When using a kernel built with the GZIO config option, dumpon -z can be
used to configure gzip compression using the in-kernel copy of zlib.
This is useful on systems with large amounts of RAM, which require a
correspondingly large dump device. Recovery of compressed dumps is also
faster since fewer bytes need to be copied from the dump device.

Because we have no way of knowing the final size of a compressed dump
until it is written, the kernel will always attempt to dump when
compression is configured, regardless of the dump device size. If the
dump is aborted because we run out of space, an error is reported on
the console.

savecore(8) is modified to handle compressed dumps and save them to
vmcore.<index>.gz, as it does when given the -z option.

A new rc.conf variable, dumpon_flags, is added. Its value is added to
the boot-time dumpon(8) invocation that occurs when a dump device is
configured in rc.conf.

Reviewed by:	cem (earlier version)
Discussed with:	def, rgrimes
Relnotes:	yes
Sponsored by:	Dell EMC Isilon
Differential Revision:	https://reviews.freebsd.org/D11723
2017-10-25 00:51:00 +00:00

78 lines
1.3 KiB
Bash
Executable File

#!/bin/sh
#
# $FreeBSD$
#
# PROVIDE: dumpon
# BEFORE: disks
# KEYWORD: nojail
. /etc/rc.subr
name="dumpon"
desc="Dump kernel corefiles from swap to disk"
start_cmd="dumpon_start"
stop_cmd="dumpon_stop"
dumpon_try()
{
local flags
flags=${dumpon_flags}
if [ -n "${dumppubkey}" ]; then
warn "The dumppubkey variable is deprecated. Use dumpon_flags."
flags="${flags} -k ${dumppubkey}"
fi
/sbin/dumpon ${flags} "${1}"
if [ $? -eq 0 ]; then
# Make a symlink in devfs for savecore
ln -fs "${1}" /dev/dumpdev
return 0
fi
warn "unable to specify $1 as a dump device"
return 1
}
dumpon_start()
{
# Enable dumpdev so that savecore can see it. Enable it
# early so a crash early in the boot process can be caught.
#
case ${dumpdev} in
[Nn][Oo] | '')
;;
[Aa][Uu][Tt][Oo])
dev=$(/bin/kenv -q dumpdev)
if [ -n "${dev}" ] ; then
dumpon_try "${dev}"
return $?
fi
while read dev mp type more ; do
[ "${type}" = "swap" ] || continue
[ -c "${dev}" ] || continue
dumpon_try "${dev}" 2>/dev/null && return 0
done </etc/fstab
echo "No suitable dump device was found." 1>&2
return 1
;;
*)
dumpon_try "${dumpdev}"
;;
esac
}
dumpon_stop()
{
case ${dumpdev} in
[Nn][Oo] | '')
;;
*)
rm -f /dev/dumpdev
/sbin/dumpon -v off
;;
esac
}
load_rc_config $name
run_rc_command "$1"