95b22138c4
Rework logging to always log the initramfs output to the kernel ringbuffer and deprecate PMOS_NO_OUTPUT_REDIRECT in favour of following the kernel loglevel. I know it seems silly to use syslogd for this, but it's necessary to buffer writes to /dev/kmsg per-line if we want to correctly set the log level, and "tee" does not do this (it will write multiple lines at once, resulting in "<14>" prints in the ringbuffer). The main advantage to this is that we won't have kernel logs cut in half by initramfs logs anymore, everything will be nicely line buffered! The previous logging solution of multiple "tail" commands would actually fail to log up to the last few lines before a crash due to how tail works (it polls the file and buffers lines). I attempted something like this before, but I stopped after running into ratelimiting issues. These are now resolved by configuring the printk_devkmsg sysctl. Dropping PMOS_NO_OUTPUT_REDIRECT: The general motivations behind PMOS_NO_OUTPUT_REDIRECT was to avoid cluttering up the console with initramfs logs when they aren't wanted; this is now handled instead by the kernels logging facility. We log to the ringbuffer at LOGLEVEL_INFO, so if "quiet" is specified on the cmdline (or the loglevel is otherwise set above info) then initramfs logs will also not be shown. Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
107 lines
3 KiB
Bash
107 lines
3 KiB
Bash
#!/bin/sh
|
|
# shellcheck disable=SC1091
|
|
|
|
IN_CI="false"
|
|
LOG_PREFIX="[pmOS-rd]"
|
|
|
|
[ -e /hooks/10-verbose-initfs.sh ] && set -x
|
|
|
|
[ -e /hooks/05-ci.sh ] && IN_CI="true"
|
|
|
|
[ -e /etc/unudhcpd.conf ] && . /etc/unudhcpd.conf
|
|
. ./init_functions.sh
|
|
. /usr/share/misc/source_deviceinfo
|
|
[ -e /etc/os-release ] && . /etc/os-release
|
|
# provide a default for os-release's VERSION in case the file doesn't exist
|
|
VERSION="${VERSION:-unknown}"
|
|
|
|
# This is set during packaging and is used when triaging bug reports
|
|
INITRAMFS_PKG_VERSION="<<INITRAMFS_PKG_VERSION>>"
|
|
|
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
|
/bin/busybox --install -s
|
|
/bin/busybox-extras --install -s
|
|
|
|
# Mount everything, set up logging, modules, mdev
|
|
mount_proc_sys_dev
|
|
setup_log
|
|
setup_firmware_path
|
|
|
|
if [ "$IN_CI" = "false" ]; then
|
|
# shellcheck disable=SC2154
|
|
load_modules /lib/modules/initramfs.load "libcomposite"
|
|
setup_framebuffer
|
|
show_splash "Loading..."
|
|
setup_mdev
|
|
setup_dynamic_partitions "${deviceinfo_super_partitions:=}"
|
|
mount_subpartitions
|
|
else
|
|
# loads all modules
|
|
setup_udev
|
|
fi
|
|
run_hooks /hooks
|
|
|
|
if [ "$IN_CI" = "true" ]; then
|
|
echo "PMOS: CI tests done, disabling console and looping forever"
|
|
dmesg -n 1
|
|
fail_halt_boot
|
|
fi
|
|
|
|
# Always run dhcp daemon/usb networking for now (later this should only
|
|
# be enabled, when having the debug-shell hook installed for debugging,
|
|
# or get activated after the initramfs is done with an OpenRC service).
|
|
setup_usb_network
|
|
start_unudhcpd
|
|
|
|
wait_boot_partition
|
|
mount_boot_partition /boot
|
|
extract_initramfs_extra /boot/initramfs-extra
|
|
setup_udev
|
|
run_hooks /hooks-extra
|
|
|
|
# For testing the mass storage gadget log export function. We use a flag
|
|
# file on /boot so that we can test it on all devices as modifying the
|
|
# kernel cmdline is not always possible.
|
|
if [ -e /boot/.pmos_export_logs ]; then
|
|
echo "PMOS: Exporting logs via mass storage gadget"
|
|
show_splash "Exporting boot logs..."
|
|
# Delete the flag so we don't soft-brick the device by always booting
|
|
# to the log export mode.
|
|
mount -o remount,rw /boot
|
|
rm -f /boot/.pmos_export_logs
|
|
fail_halt_boot
|
|
fi
|
|
|
|
wait_root_partition
|
|
delete_old_install_partition
|
|
resize_root_partition
|
|
unlock_root_partition
|
|
resize_root_filesystem
|
|
mount_root_partition
|
|
|
|
# Mount boot partition into sysroot, so we do not depend on /etc/fstab, as
|
|
# not all old installations have a proper /etc/fstab file. See #2800
|
|
umount /boot
|
|
mount_boot_partition /sysroot/boot "rw"
|
|
|
|
init="/sbin/init"
|
|
setup_bootchart2
|
|
|
|
# Switch root
|
|
run_hooks /hooks-cleanup
|
|
|
|
# Restore stdout and stderr to their original values
|
|
exec 1>&3 2>&4
|
|
|
|
# Re-enable kmsg ratelimiting (might have been disabled for logging)
|
|
echo ratelimit > /proc/sys/kernel/printk_devkmsg
|
|
|
|
killall mdev udevd syslogd 2>/dev/null
|
|
|
|
# shellcheck disable=SC2093
|
|
exec switch_root /sysroot "$init"
|
|
|
|
echo "$LOG_PREFIX ERROR: switch_root failed!" > /dev/kmsg
|
|
echo "$LOG_PREFIX Looping forever. Install and use the debug-shell hook to debug this." > /dev/kmsg
|
|
echo "$LOG_PREFIX For more information, see <https://postmarketos.org/debug-shell>" > /dev/kmsg
|
|
fail_halt_boot
|