From 281c7f37f689ecca4471f694e8cffb8bffe5f3ad Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Mon, 12 Aug 2019 14:08:48 +0200 Subject: [PATCH] crashkernel: Add crash-recovery.sh Import existing /sbin/crash-recovery.sh into repository. --- crashkernel/crash-recovery.sh | 77 +++++++++++++++++++++++++++++++++++ install.sh | 1 + 2 files changed, 78 insertions(+) create mode 100644 crashkernel/crash-recovery.sh diff --git a/crashkernel/crash-recovery.sh b/crashkernel/crash-recovery.sh new file mode 100644 index 00000000..97e2ffa8 --- /dev/null +++ b/crashkernel/crash-recovery.sh @@ -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 diff --git a/install.sh b/install.sh index 32f7e695..bf9c1282 100755 --- a/install.sh +++ b/install.sh @@ -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