7c98127746
mdev is slow and missing features, it also requires that we load all the modules that we include at once making the boot process slower. udev is required for unl0kr (and buffyboard), it can also load modules on demand (and asynchronously). Making the boot process considerably faster on devices, especially for generic images where we have lots of drivers for different display panels in the initramfs. Additionally, import full fat modprobe from the kmod package, this is required to support compressed modules. This brings us more in line with other distros and generally improves compatibility. If devices use broken kernel modules which don't correctly define modalias', these drivers may not be loaded by udev. This should be fixed by defining the missing modalias statements in the driver. This also runs udev earlier in the init, so that display drivers are loaded before the splash in case they are needed. Signed-off-by: Caleb Connolly <caleb@postmarketos.org> Co-authored-by: Clayton Craft <clayton@craftyguy.net> [ci:ignore-count] [ci:skip-build]: already built successfully in CI
124 lines
3.2 KiB
Bash
124 lines
3.2 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
|
|
# Run udev early, before splash, to make sure any relevant display drivers are
|
|
# loaded in time
|
|
setup_udev
|
|
|
|
if [ "$IN_CI" = "false" ]; then
|
|
setup_framebuffer
|
|
show_splash "Loading..."
|
|
fi
|
|
|
|
setup_dynamic_partitions "${deviceinfo_super_partitions:=}"
|
|
|
|
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
|
|
|
|
setup_usb_network
|
|
start_unudhcpd
|
|
|
|
if grep -q "pmos.debug-shell" /proc/cmdline; then
|
|
debug_shell
|
|
fi
|
|
|
|
check_keys
|
|
|
|
mount_subpartitions
|
|
|
|
wait_boot_partition
|
|
mount_boot_partition /boot
|
|
extract_initramfs_extra /boot/initramfs-extra
|
|
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
|
|
|
|
echo "Switching root"
|
|
|
|
# Restore stdout and stderr to their original values if they
|
|
# were stashed
|
|
if [ -e "/proc/1/fd/3" ]; then
|
|
exec 1>&3 2>&4
|
|
elif ! grep -q "pmos.debug-shell" /proc/cmdline; then
|
|
echo "$LOG_PREFIX Disabling console output again (use 'pmos.debug-shell' to keep it enabled)"
|
|
exec >/dev/null 2>&1
|
|
fi
|
|
|
|
# Re-enable kmsg ratelimiting (might have been disabled for logging)
|
|
echo ratelimit > /proc/sys/kernel/printk_devkmsg
|
|
|
|
killall mdev udevd syslogd 2>/dev/null
|
|
|
|
# Kill any getty shells that might be running
|
|
for pid in $(pidof sh); do
|
|
if ! [ "$pid" = "1" ]; then
|
|
kill -9 "$pid"
|
|
fi
|
|
done
|
|
|
|
# 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
|