Multiple fixes and improvements

OK, likely I should have split this commit in many more, to ease
reviews and improve bisectability. But since I didn't, I'll at least
try to summarize here what was changed by this big commit, starting
with the more complex additions to the trivial ones:

- Added a log submission system; for now, it doesn't submit logs
to anywhere since we don't have such API well-defined. But it saves
the logs locally in a tar.zst, using timestamps to define the moment
of log collection and clears the old files. The naming of the log
compressed tarball makes use of the Deck serial number and Steam
most recent logged account (thanks @TonyP for that idea).

- Still on the log submission topic: we try first pstore logs, and
if we have none of them, we check kdump logs. In case we have a
vmcore, we save it locally (after renaming), but for now we consider
that this kind of file won't be submitted.

- Since we now have makedumpfile in Holo (thanks @xexaxo), I've
removed this binary from here and made this package dependent on
makedumpfile. Also, adjusted the respective scripts.

- Added some error messages through logger, in case we fail to
load pstore/kdump or fail in the log submission script.

- Changed systemd service to just do the pstore/kdump loading
and call the submit_report.sh script, which is then "disowned"
in order we finish as fast as possible the systemd service; boot
delays due to this service wouldn't be nice.

- Increased the "crashkernel" memory recommended in the documentation,
since I've noticed the most recent version of the kernel requires
a bit more - let's play safe!

- Changed timestamps to use UTC tz - this is due kdump collection
happening so early, that timezone is not set, so let's stick with
UTC in all cases.

- Checked scripts with shellcheck[0] and improved the README.

[0] Accepted most suggestions, but some are polemic, and may introduce
issues, so the scripts are not fully passing shellcheck and I don't
expect them to be in the future, it's just a minor style improvement
and failsafe for multiple shells.

Signed-off-by: Guilherme G. Piccoli <gpiccoli@igalia.com>
This commit is contained in:
Guilherme G. Piccoli
2022-01-12 18:38:32 -03:00
parent 2ab4eae53e
commit 3638dc8264
10 changed files with 189 additions and 71 deletions

View File

@ -1,4 +1,4 @@
#!/bin/sh
#!/bin/bash
#
# SPDX-License-Identifier: LGPL-2.1+
#
@ -21,22 +21,22 @@ fi
DEVN_MOUNTED=$(mount |grep "${MOUNT_DEVNODE}" | head -n1 | cut -f3 -d\ )
KDUMP_FOLDER="${DEVN_MOUNTED}/${KDUMP_FOLDER}"
echo "${KDUMP_FOLDER}" > ${KDUMP_MNT}
sync ${KDUMP_MNT}
echo "${KDUMP_FOLDER}" > "${KDUMP_MNT}"
sync "${KDUMP_MNT}"
if [ "$1" == "initrd" ]; then
if [ "$1" = "initrd" ]; then
mkdir -p "${KDUMP_FOLDER}"
rm -f "${KDUMP_FOLDER}/kdump-initrd-$(uname -r).img"
echo "Creating the kdump initramfs for kernel \"$(uname -r)\" ..."
dracut --no-early-microcode --host-only -q -m\
"bash systemd systemd-initrd systemd-sysusers modsign dbus-daemon kdump dbus udev-rules dracut-systemd base fs-lib shutdown"\
--kver $(uname -r) "${KDUMP_FOLDER}/kdump-initrd-$(uname -r).img"
--kver "$(uname -r)" "${KDUMP_FOLDER}/kdump-initrd-$(uname -r).img"
exit 0
fi
if [ "$1" == "clear" ]; then
if [ "$1" = "clear" ]; then
rm -f ${KDUMP_FOLDER}/kdump-initrd-*
exit 0
fi
@ -46,29 +46,37 @@ fi
# here a 5MiB memory region.
# Notice that we assume ramoops is a module here - if built-in, we should
# properly load it through command-line parameters.
if [ ${USE_PSTORE_RAM} -eq 1 ]; then
if [ "${USE_PSTORE_RAM}" -eq 1 ]; then
MEM_REQUIRED=5242880 # 5MiB
RECORD_SIZE=0x200000 # 2MiB
RANGE=$(grep "RAM buffer" /proc/iomem | head -n1 | cut -f1 -d\ )
MEM_END=$(echo $RANGE | cut -f2 -d\-)
MEM_START=$(echo $RANGE | cut -f1 -d\-)
MEM_END=$(echo "$RANGE" | cut -f2 -d\-)
MEM_START=$(echo "$RANGE" | cut -f1 -d\-)
MEM_SIZE=$(( 16#${MEM_END} - 16#${MEM_START} ))
if [ ${MEM_SIZE} -ge ${MEM_REQUIRED} ]; then
if modprobe ramoops mem_address=0x${MEM_START} mem_size=${MEM_REQUIRED} record_size=${RECORD_SIZE}; then
exit 0
fi
logger "pstore-RAM load was attempted and failed...will try kdump"
fi
# Fallbacks to kdump load - if we fail when configuring pstore, better try kdump;
# who knows and we may be lucky enough to have some crashkernel reserved memory...
# TODO (maybe): could invert the order and try kdump first, if it fails, try pstore!
fi
# TODO: insert code here to validate that crashkernel is configured and
# memory is reserved; if not, set it on grub.cfg and recreate the EFI grub
# config file, warning users that in the current boot kdump is not set.
# Stolen from Debian kdump
KDUMP_CMDLINE=$(sed -re 's/(^| )(crashkernel|hugepages|hugepagesz)=[^ ]*//g;s/"/\\\\"/' /proc/cmdline)
KDUMP_CMDLINE="${KDUMP_CMDLINE} panic=-1 oops=panic fsck.mode=force fsck.repair=yes nr_cpus=1 reset_devices"
VMLINUX="$(grep -o 'BOOT_IMAGE=[^ ]*' /proc/cmdline)"
kexec -s -p "${VMLINUX#*BOOT_IMAGE=}" --initrd "${KDUMP_FOLDER}/kdump-initrd-$(uname -r).img" --append="${KDUMP_CMDLINE}" || true
if ! kexec -s -p "${VMLINUX#*BOOT_IMAGE=}" --initrd "${KDUMP_FOLDER}/kdump-initrd-$(uname -r).img" --append="${KDUMP_CMDLINE}"; then
logger "kdump load was attempted and failed"
exit 0
fi