all: Refactor the whole kdump/pstore folder setting
This is somewhat a big refactor. The early design of kdump/pstore was meant to support the A/B scheme of Steam Deck and a dracut-based initrd only. In this scheme, we had a DEVNODE (like nvme partition or a devlink) that represented the device node to be mounted early in boot when kdump was in use. Also, we had a folder defined in the config file on top of such dev node, and a temporary file used to "carry" the composition of the full kdump path across boot time scripts. Yeah, kinda complex setup. We are now moving to a more generic approach, and for that, the design choice was a more convenient/simple one for the common cases, that requires some operations to properly work on SteamOS dracut-based initrd. Now we have only a single path on config file, which should be accessible in a R/W filesystem by both scripts executed in the systemd service. No devnode information or temp file is used anymore. But with that, comes the need of discovering the proper devnode and base folder for kdump'ing early in boot, from the initrd. Using the findmnt tool we manage to derive all the necessary data during the initrd preparation phase. Also, while at it we manage to fix an "inconsistency" of our dracut initrd creation script: installkernel() should be responsible to deal with DRM modules removal, not install(). On top of this (already big) change, now our dracut initrd excludes not only amdgpu driver/FWs, but radeon, nvidia and i915 as well. And due to our refactor of the mount point information (using findmnt to collect info during dracut initrd creation), we also allow now arbitrary filesystem drivers to be included, i.e., we don't hardcode/limit for ext4 only. Again, mea culpa for not splitting this in multiple atomic/simple commits, the burden to keep a pretty git log is starting to consume precious time. Signed-off-by: Guilherme G. Piccoli <gpiccoli@igalia.com>
This commit is contained in:
@ -22,17 +22,12 @@ PSTORE_RECORD_SZ=2097152
|
|||||||
#
|
#
|
||||||
#
|
#
|
||||||
# Mount-related options
|
# 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
|
# 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
|
# MOUNT_FOLDER is the the place in which both pstore and kdump logs will
|
||||||
# doesn't exist); this is the place in which both pstore and kdump logs
|
# be stored, as well as the kdump initrd and some ancillary data. This
|
||||||
# will be stored, as well as the kdump initrd and some ancillary data.
|
# directory should be in an accessible filesystem (read/write) and if such
|
||||||
# Finally, MNT_TMP is just a temporary file that carries the full path
|
# folder doesn't exist, it'll be created.
|
||||||
# of the mounted folder across boot-time scripts.
|
MOUNT_FOLDER="/home/.steamos/offload/var/kdump"
|
||||||
MOUNT_DEVNODE="/dev/disk/by-partsets/shared/home"
|
|
||||||
MOUNT_FOLDER="/.steamos/offload/var/kdump"
|
|
||||||
MNT_TMP="/tmp/.kdump_load.mnt"
|
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# Kdump controlling settings
|
# Kdump controlling settings
|
||||||
|
|||||||
@ -13,6 +13,13 @@
|
|||||||
# output for the user.
|
# 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
|
# We have a more controlled situation with regards the config
|
||||||
# files here, since we manually added them in the initrd and
|
# files here, since we manually added them in the initrd and
|
||||||
# the validation also happened there, during such addition,
|
# the validation also happened there, during such addition,
|
||||||
@ -21,21 +28,13 @@ for cfg in "/usr/share/kdump.d"/*; do
|
|||||||
. "$cfg"
|
. "$cfg"
|
||||||
done
|
done
|
||||||
|
|
||||||
VMCORE="/proc/vmcore"
|
|
||||||
KDUMP_TIMESTAMP=$(date -u +"%Y%m%d%H%M")
|
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"
|
mkdir -p "/kdump_path"
|
||||||
|
if ! mount "${MOUNT_POINT}" /kdump_path; then
|
||||||
if ! mount "${DEVN}" /kdump_path; then
|
|
||||||
reboot -f
|
reboot -f
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -52,7 +51,7 @@ if [ "${FULL_COREDUMP}" -ne 0 ]; then
|
|||||||
sync "${KDUMP_FOLDER}/vmcore.compressed"
|
sync "${KDUMP_FOLDER}/vmcore.compressed"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
umount "${DEVN}"
|
umount "${MOUNT_POINT}"
|
||||||
sync
|
sync
|
||||||
|
|
||||||
reboot -f
|
reboot -f
|
||||||
|
|||||||
@ -73,19 +73,10 @@ cleanup_unused_initrd() {
|
|||||||
|
|
||||||
load_kdump_config
|
load_kdump_config
|
||||||
|
|
||||||
# Find the proper mount point expected for kdump collection:
|
# In case the kdump main folder doesn't exist, create it
|
||||||
DEVN_MOUNTED="$(findmnt "${MOUNT_DEVNODE}" -fno TARGET)"
|
# here, as soon as possible.
|
||||||
|
|
||||||
# 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}"
|
|
||||||
mkdir -p "${MOUNT_FOLDER}"
|
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
|
if [ "$1" = "initrd" ]; then
|
||||||
create_initrd
|
create_initrd
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
@ -4,39 +4,60 @@ check() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
installkernel() {
|
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() {
|
install() {
|
||||||
# A valid makedumpfile is essential for the kdump initrd creation.
|
# A valid makedumpfile is essential for the kdump initrd creation.
|
||||||
if [ ! -x "$(command -v makedumpfile)" ]; then
|
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
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
load_kdump_config
|
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
|
# Install necessary binaries
|
||||||
inst date
|
inst date
|
||||||
inst sync
|
inst sync
|
||||||
inst makedumpfile
|
inst makedumpfile
|
||||||
|
|
||||||
mkdir -p "$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/kdump.d/
|
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;
|
# Finally, we need to derive the proper place to save the dump from the
|
||||||
# notice that partset link is not available that early in boot time.
|
# config files, in a way that makes possible to mount it in early boot.
|
||||||
DEVN="$(readlink -f "${MOUNT_DEVNODE}")"
|
DEVNODE="$(findmnt -n -o SOURCE --target "${MOUNT_FOLDER}")"
|
||||||
echo "${DEVN}" > "$initdir"/usr/lib/kdump/kdump.devnode
|
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"
|
inst_hook pre-mount 01 "$moddir/kdump-collect.sh"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
load_kdump_config
|
load_kdump_config
|
||||||
|
|
||||||
MAIN_FOLDER="$(cat "${MNT_TMP}")"
|
MAIN_FOLDER="${MOUNT_FOLDER}"
|
||||||
rm -f "${MNT_TMP}"
|
|
||||||
|
|
||||||
if [ ! -d "${MAIN_FOLDER}" ]; then
|
if [ ! -d "${MAIN_FOLDER}" ]; then
|
||||||
logger "kdump: invalid folder (${MAIN_FOLDER}) - aborting..."
|
logger "kdump: invalid folder (${MAIN_FOLDER}) - aborting..."
|
||||||
|
|||||||
Reference in New Issue
Block a user