Skip to content

Commit

Permalink
crashkernel: Add crash-recovery.sh
Browse files Browse the repository at this point in the history
Import existing /sbin/crash-recovery.sh into repository.
  • Loading branch information
donald committed Aug 12, 2019
1 parent 1fc3548 commit 281c7f3
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 0 deletions.
77 changes: 77 additions & 0 deletions crashkernel/crash-recovery.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# We are called from initramfs:/init ( /project/admin/initramfs/init )
#
# Execution environment:
# kernel is the crashkernel
# we are pid 1
# original root is mounted at /
# root might be mounted "ro" (if we have that in the kernel command line of the crash kernel)
# /dev is mounted (prepopulated by devtmpfs)
# we are executed by bash

# graphics console is not yet working, because the replaced kernel
# most probably used a framebuffer driver which reinitialized the graphics adapter
# so it no longer runs in a mode initialized by bios/grub.
# These bios-settings can not be restored easily, because this would require
# real mode(true?), which kexec doesn't go through.
#
# We can start the framebuffer driver and get a working console (fbcon) if
# we just load the right driver for the graphics adapter.
#
# However, nouveau currently requires to much memory (because of debugging data) and
# would just create a out of memory kernel panic.
#
#modprobe bochs_drm # DRM Support for bochs dispi vga interface (qemu stdvga)
#modprobe nouveau # nvidia : requires 512MB memory....
#
# We can't use /dev/kmsg (kernel ring buffer), because it only accepts a very limited
# number of messages per time slot....
#
#exec >/deo v/kmsg 2>&1
#
# So for now just use our serial console /dev/ttyS1 which hopefully is connected to another system.
#
exec >/dev/ttyS1 2>&1

reboot() {
test "$1" && echo "$S $1"
echo "+++++++++++++++++++++++++++++++++++++ reboot in 10s"
sleep 10
/sbin/reboot -f
}

free_space() {
local path="$1"
echo $(( $(stat -f -c %a "$path") * $(stat -f -c %S "$path") ))
}

set -x
echo "+++++++++++++++++++++++++++++++++++++ crash recovery"

mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys

test -e /proc/vmcore || reboot "no crashdump"
core_size=$(stat -c %s /proc/vmcore)

mount -o remount,rw / /

if mount -L CRASHDUMP /mnt; then
test -e /mnt/crash.vmcore && rm /mnt/crash.vmcore
if (( $(free_space /mnt) - $core_size > 1024*1024*1024 )); then
echo "+++++++++++++++++++++++++++++++++++++ saving crash dump to CRASHDUMP volume"
cp /proc/vmcore /mnt/crash.vmcore
umount /mnt
else
echo "+++++++++++++++++++++++++++++++++++++ not enough free space on CRASHDUMP volume"
fi
reboot
fi;

test -e /var/crash.vmcore && rm /var/crash.vmcore
if (( $(free_space /var) - $core_size > 1024*1024*1024 )); then
echo "+++++++++++++++++++++++++++++++++++++ saving crash dump to /var"
cp /proc/vmcore /var/crash.vmcore
else
echo "+++++++++++++++++++++++++++++++++++++ not enough free space in /var"
fi
reboot
1 change: 1 addition & 0 deletions install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -150,4 +150,5 @@ mkdir -p "$DESTDIR$usr_prefix/share/applications"
install_data applications-defaults/defaults.list "$DESTDIR$usr_prefix/share/applications/defaults.list"
install_data misc_etc_files/modprobe.d/nfs_slotlimit.conf "$DESTDIR$sysconfdir/modprobe.d/nfs_slotlimit.conf"
install_data crashkernel/crashkernel.service "$DESTDIR$systemdunitdir/crashkernel.service"
install_exec crashkernel/crash-recovery.sh "$DESTDIR$root_sbindir/crash-recovery.sh"
exit

0 comments on commit 281c7f3

Please sign in to comment.