diff --git a/00-default.conf b/00-default.conf index e426a55..df49b64 100644 --- a/00-default.conf +++ b/00-default.conf @@ -22,17 +22,12 @@ PSTORE_RECORD_SZ=2097152 # # # Mount-related options -# MOUNT_DEVNODE is the desired mount-point unique link in the /dev/disk -# directory link; this is used to derive the numerical devnode for kdump, # since the link is not present so early in the system boot. MOUNT_FOLDER -# should live in the filesystem of the devnode (and will be created if -# doesn't exist); this is the place in which both pstore and kdump logs -# will be stored, as well as the kdump initrd and some ancillary data. -# Finally, MNT_TMP is just a temporary file that carries the full path -# of the mounted folder across boot-time scripts. -MOUNT_DEVNODE="/dev/disk/by-partsets/shared/home" -MOUNT_FOLDER="/.steamos/offload/var/kdump" -MNT_TMP="/tmp/.kdump_load.mnt" +# MOUNT_FOLDER is the the place in which both pstore and kdump logs will +# be stored, as well as the kdump initrd and some ancillary data. This +# directory should be in an accessible filesystem (read/write) and if such +# folder doesn't exist, it'll be created. +MOUNT_FOLDER="/home/.steamos/offload/var/kdump" # # # Kdump controlling settings diff --git a/kdump-collect.sh b/kdump-collect.sh index 4ef0b23..e4e5247 100644 --- a/kdump-collect.sh +++ b/kdump-collect.sh @@ -13,6 +13,13 @@ # output for the user. # +# Bail out in case we don't have a vmcore, i.e. either we're not kdumping +# or something is pretty wrong and we wouldn't be able to progress. +VMCORE="/proc/vmcore" +if [ ! -f $VMCORE ]; then + reboot -f +fi + # We have a more controlled situation with regards the config # files here, since we manually added them in the initrd and # the validation also happened there, during such addition, @@ -21,21 +28,13 @@ for cfg in "/usr/share/kdump.d"/*; do . "$cfg" done -VMCORE="/proc/vmcore" KDUMP_TIMESTAMP=$(date -u +"%Y%m%d%H%M") -KDUMP_FOLDER="/kdump_path/${MOUNT_FOLDER}/crash/${KDUMP_TIMESTAMP}" +MOUNT_POINT="$(cat /usr/lib/kdump/kdump.mnt)" +BASE_FOLDER="$(cat /usr/lib/kdump/kdump.dir)" +KDUMP_FOLDER="/kdump_path/${BASE_FOLDER}/crash/${KDUMP_TIMESTAMP}" -# Bail out in case we don't have a vmcore, i.e. either we're not kdumping -# or something is pretty wrong and we wouldn't be able to progress. -# -if [ ! -f $VMCORE ]; then - reboot -f -fi - -DEVN="$(cat /usr/lib/kdump/kdump.devnode)" mkdir -p "/kdump_path" - -if ! mount "${DEVN}" /kdump_path; then +if ! mount "${MOUNT_POINT}" /kdump_path; then reboot -f fi @@ -52,7 +51,7 @@ if [ "${FULL_COREDUMP}" -ne 0 ]; then sync "${KDUMP_FOLDER}/vmcore.compressed" fi -umount "${DEVN}" +umount "${MOUNT_POINT}" sync reboot -f diff --git a/kdump-load.sh.in b/kdump-load.sh.in index 44187c3..deb9114 100644 --- a/kdump-load.sh.in +++ b/kdump-load.sh.in @@ -73,19 +73,10 @@ cleanup_unused_initrd() { load_kdump_config -# Find the proper mount point expected for kdump collection: -DEVN_MOUNTED="$(findmnt "${MOUNT_DEVNODE}" -fno TARGET)" - -# Create the kdump main folder here, as soon as possible, given -# the importance of such directory in all kdump/pstore steps. -MOUNT_FOLDER="${DEVN_MOUNTED}/${MOUNT_FOLDER}" +# In case the kdump main folder doesn't exist, create it +# here, as soon as possible. mkdir -p "${MOUNT_FOLDER}" -echo "${MOUNT_FOLDER}" > "${MNT_TMP}" -sync "${MNT_TMP}" - -# Notice that at this point it's required to have the full -# MOUNT_FOLDER, so this must remain after the DEVNODE operations above. if [ "$1" = "initrd" ]; then create_initrd exit 0 diff --git a/module-setup.sh.in b/module-setup.sh.in index 2d0b3cb..3c7d32b 100644 --- a/module-setup.sh.in +++ b/module-setup.sh.in @@ -4,39 +4,60 @@ check() { } installkernel() { - hostonly='' instmods ext4 + load_kdump_config + + # First clear all unnecessary firmwares/drivers added by drm in order + # to reduce the size of the minimal initramfs being created - kdump + # is an non-graphical environment. This should have been already done + # via dracut cmdline arguments, but play safe and delete here as well. + # Our list include the most common FWs/drivers (amd, i915, nvidia) + rm -rf "$initdir"/usr/lib/firmware/{amdgpu,i915,nvidia,radeon} + rm -rf "$initdir"/usr/lib/modules/*/kernel/drivers/gpu/drm/{amd,i915,nouveau,radeon} + + FSMOD="$(findmnt -n -o FSTYPE --target "${MOUNT_FOLDER}")" + if [ -z "${FSMOD}" ]; then + logger "kdump: error on filesystem discovery" + exit 1 + fi + + hostonly='' instmods "${FSMOD}" } install() { # A valid makedumpfile is essential for the kdump initrd creation. if [ ! -x "$(command -v makedumpfile)" ]; then - logger "kdump: failed to create initrd, makedumpfile is missing" + logger "kdump: failed to create dracut initrd, makedumpfile is missing" exit 1 fi load_kdump_config - # First clear all unnecessary firmwares/drivers added by drm in order - # to reduce the size of the minimal initramfs being created. This - # should be already done via dracut cmdline arguments, but let's play - # safe and delete from here as well just in case. - rm -rf "$initdir"/usr/lib/firmware/amdgpu/ - rm -rf "$initdir"/usr/lib/modules/*/kernel/drivers/gpu/drm/amd/* - # Install necessary binaries inst date inst sync inst makedumpfile - mkdir -p "$initdir"/usr/share/kdump.d/ - cp -LR --preserve=all /usr/share/kdump.d/* "$initdir"/usr/share/kdump.d/ + # Copying kdump config/lib files is essential for a functional kdump. + cp -LR --preserve=all /usr/share/kdump.d/ "$initdir"/usr/share/ + cp -LR --preserve=all /usr/lib/kdump/ "$initdir"/usr/lib/ - # Determine the numerical devnode for kdump, and save it on initrd; - # notice that partset link is not available that early in boot time. - DEVN="$(readlink -f "${MOUNT_DEVNODE}")" - echo "${DEVN}" > "$initdir"/usr/lib/kdump/kdump.devnode + # Finally, we need to derive the proper place to save the dump from the + # config files, in a way that makes possible to mount it in early boot. + DEVNODE="$(findmnt -n -o SOURCE --target "${MOUNT_FOLDER}")" + if [ -z "${DEVNODE}" ]; then + logger "kdump: error on devnode discovery" + exit 1 + fi + echo "${DEVNODE}" > "$initdir"/usr/lib/kdump/kdump.mnt - cp -LR --preserve=all /usr/lib/kdump/* "$initdir"/usr/lib/kdump/ + TGT="$(findmnt -n -o TARGET --target "${MOUNT_FOLDER}")" + if [ -z "${TGT}" ]; then + logger "kdump: error on base folder discovery" + exit 1 + fi + + BASE_FLD="${MOUNT_FOLDER#*$TGT}" + echo "${BASE_FLD}" > "$initdir"/usr/lib/kdump/kdump.dir inst_hook pre-mount 01 "$moddir/kdump-collect.sh" } diff --git a/save-dumps.sh.in b/save-dumps.sh.in index 4a54d0e..68a61bc 100644 --- a/save-dumps.sh.in +++ b/save-dumps.sh.in @@ -1,7 +1,6 @@ load_kdump_config -MAIN_FOLDER="$(cat "${MNT_TMP}")" -rm -f "${MNT_TMP}" +MAIN_FOLDER="${MOUNT_FOLDER}" if [ ! -d "${MAIN_FOLDER}" ]; then logger "kdump: invalid folder (${MAIN_FOLDER}) - aborting..."