diff options
Diffstat (limited to 'make-boot-image.sh')
-rwxr-xr-x | make-boot-image.sh | 81 |
1 files changed, 41 insertions, 40 deletions
diff --git a/make-boot-image.sh b/make-boot-image.sh index b3ec8df..1d07478 100755 --- a/make-boot-image.sh +++ b/make-boot-image.sh @@ -20,15 +20,14 @@ WGET="wget" # "wget --no-check-certificate" could help but is a security concer NFS_MOUNT_CMDLINE="mount -v -t nfs -o nolock 172.16.2.28:/masters /mnt/nfs" # You probably need to tweak version numbers in following URLs if you have an HTTP 404 - Not found error -#KERNEL_TARBALL_URL=https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.2.9.tar.xz # no modules, kernel 5.x seems to not support /sbin/hotplug -KERNEL_TARBALL_URL=https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.20.17.tar.xz # ok in qemu +#KERNEL_TARBALL_URL=https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.2.9.tar.xz # ok in qemu, seems sane on real hardware +KERNEL_TARBALL_URL=https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.20.17.tar.xz # ok in qemu, seems sane on real hardware #KERNEL_TARBALL_URL=https://cdn.kernel.org/pub/linux/kernel/v3.x/linux-3.18.140.tar.xz # ok in qemu #KERNEL_TARBALL_URL=https://cdn.kernel.org/pub/linux/kernel/v3.x/linux-3.12.74.tar.xz # reset loop in qemu - # old kernels 2.6, 3.x before year 2017 don't cope with recent distro/gcc defaults options (-fPIE) # https://unix.stackexchange.com/questions/436071/compile-old-kernel-with-new-gcc # https://lore.kernel.org/patchwork/patch/731680/ -#KERNEL_TARBALL_URL=https://cdn.kernel.org/pub/linux/kernel/v3.x/linux-3.11.9.tar.xz # Kconfiglib v12.13.0 can't cope with it, and gcc probably to recent +#KERNEL_TARBALL_URL=https://cdn.kernel.org/pub/linux/kernel/v3.x/linux-3.11.9.tar.xz # Kconfiglib v12.13.0 can't cope with it, and gcc probably too recent #KERNEL_TARBALL_URL=https://cdn.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.4.tar.xz # KConfigLib allows to create kernel .config in a programmatic manner, in a somewhat portable way @@ -43,7 +42,7 @@ USB_IDS_URL=https://usb-ids.gowdy.us/usb.ids # Free space checking to not let everything go wrong ROOT_MIN_AVAIL_MIO=256 -WORKDIR_MIN_AVAIL_MIO=2048 +WORKDIR_MIN_AVAIL_MIO=2560 DLDIR_MIN_AVAIL_MIO=512 OUTDIR_MIN_AVAIL_MIO=64 @@ -119,9 +118,9 @@ fi umask 0022 # Needed for embeding initrd without "sudo make" in kernel dir -[ -d "$WORKDIR" ] || mkdir -p "$WORKDIR" && check_free_space $WORKDIR_MIN_AVAIL_MIO "$WORKDIR" -[ -d "$DLDIR" ] || mkdir -p "$DLDIR" && check_free_space $DLDIR_MIN_AVAIL_MIO "$DLDIR" -[ -d "$OUTDIR" ] || mkdir -p "$OUTDIR" && check_free_space $OUTDIR_MIN_AVAIL_MIO "$OUTDIR" +[ -d "$WORKDIR" ] || ( mkdir -p "$WORKDIR" && check_free_space $WORKDIR_MIN_AVAIL_MIO "$WORKDIR" ) +[ -d "$DLDIR" ] || ( mkdir -p "$DLDIR" && check_free_space $DLDIR_MIN_AVAIL_MIO "$DLDIR" ) +[ -d "$OUTDIR" ] || ( mkdir -p "$OUTDIR" && check_free_space $OUTDIR_MIN_AVAIL_MIO "$OUTDIR" ) # When using sudo with password auth, ask and cache pass first @@ -236,6 +235,13 @@ while more_work and i < passes: if sym.name == 'INITRAMFS_SOURCE': more_work = sset(sym, '../initrd/') or more_work + # Support dumb hotplug via /sbin/hotplug script (disabled by default on 5.x kernels, may be some 4.x also) + # We don't ship mdev/udev/systemd or any netlink listener to load appropriate modules for now + if sym.name == 'UEVENT_HELPER': + more_work = sset(sym) or more_work + if sym.name == 'UEVENT_HELPER_PATH': + more_work = sset(sym, '/sbin/hotplug') or more_work + # Make kernel directly loadable by EFI, add USB3, Dell flash if sym.name in ['EFI_STUB', 'EARLY_PRINTK_EFI']: more_work = sset(sym) or more_work @@ -286,8 +292,8 @@ while more_work and i < passes: if sym.name == 'INITRAMFS_COMPRESSION': sset(sym, '.xz') - # Enable .config to be readable from /proc/config.gz (convinent for all-in-one image) - if sym.name in ['IKCONFIG','IKCONFIG_PROC']: + # Enable beeps (pcspkr) and .config to be readable from /proc/config.gz + if sym.name in ['IKCONFIG','IKCONFIG_PROC', 'INPUT_PCSPKR']: sset(sym) # Try to get rid of some useless features in EFIcast context @@ -442,17 +448,17 @@ echo $VERSION > "$WORKDIR/initrd/etc/eficast_version" cat > "$WORKDIR/initrd/etc/rc.d/funcs" <<"EOF" # echo_color <foreground_color> <background_color> [prefix_string] <message> echo_color() { - setterm --foreground "$1" --background "$2" + setterm --foreground "$1" --background "$2" --bold on echo -n "$3" - setterm --foreground white --background black + setterm --foreground white --background black --bold off [ "x$4" == "xversion" ] && echo " (eficast v"$(cat /etc/eficast_version)")" || echo } # no args, print colored message, wait 10 sec and reboot eficast_end() { echo -e "\e]2;eficast_end\007" # Term title (tmux), intentionnal carriage return - echo_color white green "----- EFICAST end of execution ------" ( sfx_success ; touch /run/nosound ) & + message success [ -r /run/eficast_end ] && action=$(cat /run/eficast_end) case $action in poweroff) read -t10 -p 'Ctrl+C to have a shell, Enter to skip wait time for poweroff...' @@ -470,9 +476,10 @@ eficast_end() { # note : rcS rescue_shell is slighly different because most of the env is not ready in rcS rescue_shell() { echo -e "\e]2;rescue_shell\007" # Term title (tmux), intentionnal carriage return + message rescue echo_color white red "Something went wrong. Dropping to a shell." version ( sfx_failure ; touch /run/nosound ) & - PS1='\h:\w# ' HOME='/root/' /bin/busybox sh + PS1='\h:\w# ' HOME='/root/' busybox sh } machine_info() { @@ -581,18 +588,17 @@ export TERM=linux # busybox on qemu set vt102, then tmux segfaults EOF add_initrd_script etc/rc.d/rcS <<"EOF" -echo -e '\e[37;42m'----- EFICAST start of execution ------'\e[0m' echo -e '\e[32m/etc/rc.d/rcS script will run on /dev/console now\e[0m' -echo -e '\e[37;43m'----- rcS script started -----'\e[0m' # Hint for user about boot steps if its hangs +echo -e '\e[37;43m\e[1m'----- rcS script started -----'\e[0m' # Hint for user about boot steps if its hangs # Declare some funcs to have a tidy output with trace mode # note : rc.d/funcs has a rescue_shell() that is slighly different (the environment is not fully intialized here) rescue_shell() { - busybox echo -e '\e[37;41m'Something went wrong. Dropping to a shell.'\e[0m' - busybox beep + /bin/busybox echo -e '\e[37;41m\e[1m'Something went wrong. Dropping to a shell.'\e[0m' + /bin/busybox beep PS1='\h:\w# ' busybox setsid busybox cttyhack busybox sh - busybox sync; busybox umount /dev/pts /dev /sys /proc - busybox reboot -f + /bin/busybox sync; busybox umount /dev/pts /dev /sys /proc + /bin/busybox reboot -f } mount_pseudofilesystems() { @@ -606,9 +612,7 @@ mount_pseudofilesystems() { return 0 } -# FIXME : mod loading does not work on kernel 5.x /sbin/hotplug is not called. /proc entry has vanished. -# First try with busybox mdev -d was a failure. -# See https://github.com/slashbeast/mdev-like-a-boss/blob/master/mdev.init ? +# TODO Kernel 5.x disable UEVENT_HELPER by default, it may need some clean alternative coldplugging() { echo 4 > /proc/sys/kernel/printk for d in /sys/bus/*/devices/* @@ -627,11 +631,10 @@ klogd; syslogd # Start logging in /var/log/messages mount -o remount -o size=80% / # Allow using most of RAM for rootfs coldplugging # Load modules for cold-plugged peripherials loadkmap < /etc/keys.bmap # Load keyboard layout -sleep 5 # Wait for physical link detection + STP + IPv6 DAD & Autoconf set +v # Hint users about boot steps to help them if it hangs echo -e '\e[32m/etc/rc.d/rc2-or-rescue script will run on /dev/tty1 now\e[0m' -echo -e '\e[37;43m----- rcS script ended -----\e[0m' +echo -e '\e[37;43m\e[1m----- rcS script ended -----\e[0m' EOF add_initrd_script etc/rc.d/rc2-or-rescue <<"EOF" . /etc/rc.d/funcs # Load helper functions @@ -645,24 +648,22 @@ else touch /run/rescue fi EOF add_initrd_script etc/rc.d/rc2 <<"EOF" -echo -e '\e[37;43m'----- rc2 script started -----'\e[0m' # Hint for user about boot steps if its hangs . /etc/rc.d/funcs # Load helper functions +echo_color white yellow '----- rc2 script started -----' +message boot-ok setterm -blank 60 # screen sleep mode after 60 minutes set -v # Trace execution network_up network_conf network_show machine_info -/etc/rc.d/initrd-autorun.sh && eficast_end -set +v -echo -e '\e[37;43m'----- rc2 script ended -----'\e[0m' # Hint for user about boot steps if its hangs +/etc/rc.d/initrd-autorun && eficast_end EOF -add_initrd_script etc/rc.d/initrd-autorun.sh <<"EOF" +add_initrd_script etc/rc.d/initrd-autorun <<"EOF" echo -ne "\e]2;$0\007" # Term title (tmux) . /etc/rc.d/funcs # Load helper functions -read -t10 -p 'Ctrl+C to have a shell, Enter to skip wait time...' -echo -mount | grep -q /mnt/nfs && umount /mnt/nfs +echo_color white yellow '----- initrd-autorun script started -----' +echo -e '\e[32m/etc/rc.d/nfs-mount script will run now\e[0m' busybox sh -v /etc/rc.d/nfs-mount if [ $? -ne 0 ] then echo_color white red "----- NFS server : not mounted ------" @@ -677,15 +678,15 @@ then echo_color white red "----- NFS server : missing script ------" exit 2 fi echo_color white green "----- NFS server ready ------" -message nfs autorun +read -t10 -p 'Ctrl+C to have a shell, Enter to skip wait time...' +message nfs-ok echo -ne "\e]2;nfs-autorun.sh\007" # Term title (tmux) cd /mnt/nfs # don't use source here, exit in inner script will skip cleanup routine (and rescue_shell) ./nfs-autorun.sh -echo -e '\e[37;43m'----- initrd-autorun.sh script ended -----'\e[0m' # Hint for user about boot steps if its hangs -} EOF add_initrd_script etc/rc.d/nfs-mount <<EOF +mount | grep -q /mnt/nfs && umount /mnt/nfs $NFS_MOUNT_CMDLINE EOF add_initrd_script sbin/hotplug <<"EOF" @@ -695,13 +696,13 @@ add_initrd_script sbin/hotplug <<"EOF" if [ "x$ACTION" = "xadd" ] then if [ -n "$PCI_ID" ] then if [ -n "$MODALIAS" ] - then echo "$0: PCI_ID==$PCI_ID, starting 'modprobe $MODALIAS'" - else echo -e "\e[37;43m$0: PCI_ID==$PCI_ID, no MODALIAS found\e[0m" + then /bin/busybox modprobe -v $MODALIAS 2>&1 | /bin/busybox awk -vT="$0: DEVPATH=$DEVPATH PCI_ID==$PCI_ID " '{ print T $0 }' | /bin/busybox tee -a /var/log/hotplug-pci.log + else echo -e '\e[37;43m\e[1m'$0: PCI_ID==$PCI_ID, no MODALIAS found'\e[0m' + echo $0: PCI_ID==$PCI_ID, no MODALIAS found >> /var/log/hotplug-pci.log fi - /sbin/modprobe -v $MODALIAS 2>&1 | /bin/busybox awk -vT="$0: DEVPATH=$DEVPATH PCI_ID==$PCI_ID " '{ print T $0 }' | /bin/busybox tee -a /var/log/hotplug-pci.log else if [ -n "$MODALIAS" ] - then /sbin/modprobe -v $MODALIAS 2>&1 | /bin/busybox awk -vT="$0: DEVPATH=$DEVPATH MODALIAS==$MODALIAS " '{ print T $0 }' >> /var/log/hotplug-non-pci.log + then /bin/busybox modprobe -v $MODALIAS 2>&1 | /bin/busybox awk -vT="$0: DEVPATH=$DEVPATH MODALIAS==$MODALIAS " '{ print T $0 }' >> /var/log/hotplug-non-pci.log else echo "$0: DEVPATH=$DEVPATH no MODALIAS found" >> /var/log/hotplug-non-pci.log fi fi |