#!/opt/openslx/bin/ash # ----------------------------------------------------------------------------- # # Copyright (c) 2012..2018 bwLehrpool-Projektteam # # This program/file is free software distributed under the GPL version 2. # See https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html # # If you have any feedback please consult https://bwlehrpool.de and # send your feedback to support@bwlehrpool.de. # # General information about bwLehrpool can be found at https://bwlehrpool.de # # ----------------------------------------------------------------------------- # # First script for initial ramfs for OpenSLX linux stateless clients ############################################################################# # set PATH correctly including busybox's in /opt/openslx/* export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/opt/openslx/bin:/opt/openslx/sbin # TODO fix this ugly part... # some binaries have hardcoded path to /sbin, e.g. brctl needs /sbin/modprobe # to load bridge.ko - thus we provide this by symlinking busybox's sbin folder. # this hopefully covers most such hardcoded calls... [ ! -d /sbin ] && ln -s /opt/openslx/sbin /sbin # if /sbin is present, at least make sure we have modprobe... [ ! -e /sbin/modprobe ] && ln -s /opt/openslx/sbin/modprobe /sbin/modprobe # also make sure other script can use /bin/ash safely... [ ! -e /bin/ash ] && ln -s /opt/openslx/bin/busybox /bin/ash # import common functions . "/inc/functions" # NOTE: busybox mount is only available through the busybox binary, # the link had to be dropped, to prevent bugs in the stage32. # mount the important standard directories mkdir -p /tmp /proc /sys /dev /run busybox mount -n -t devtmpfs -o 'rw,relatime,nosuid,noexec,mode=0755' initramfsdevs /dev [ ! -f /proc/cpuinfo ] && busybox mount -n -t proc proc /proc echo "/sbin/hotplug" > "/proc/sys/kernel/hotplug" bench_event "KERNEL" "Kernel initialized" [ ! -d /sys/class ] && busybox mount -n -t sysfs sysfs /sys find /sys/devices/pci* -type f -name modalias -exec /sbin/hotplug --file {} \; &> /dev/null & HOTPLUG=$! busybox mount -n -t tmpfs -o 'mode=755,size=10m' run "/run" busybox mount -n -t tmpfs -o 'mode=755,size=50m' temp "/tmp" haveged --pidfile /tmp/haveged.pid # Tries to put it in /var/run by default, which doesn't exist so it just dies without any error message :-/ # IMPORTANT - check if kernel modules in initrams match kernel version BASEDIR="/lib/modules/$(uname -r)/kernel/drivers" for dir in gpu hid; do if ! [ -d "$BASEDIR/$dir" ]; then echo "0" > /proc/sys/kernel/printk reset cat </dev/null # Load drm gfx drivers, if successful, check if splash screen should be shown, and do so . "/inc/drm.functions" SD_CMDLINE= showicon() { : } if [ "$SPLASH" -eq 1 ]; then if setup_gfx; then echo "1 1 0 1" > /proc/sys/kernel/printk exec 4>&1 5>&2 > /dev/null 2>&1 clear echo -e "\033[?25l" >&4 if splashtool --center "/etc/splash.ppm" -b; then MUTED_OUTPUT=1 showicon() { splashtool "$@" } showicon --reset "/opt/openslx/icons" else MUTED_OUTPUT= exec 1>&4 2>&5 fi fi if [ -z "$MUTED_OUTPUT" ]; then echo "Cannot show splash screen :-(" SD_CMDLINE="--show-status" fi else setup_gfx fi # suppress kernel output if DEBUG is set and no splash screen is requested if [ $SPLASH -eq 0 ]; then [ $DEBUG -ge 1 ] && echo "4 4 1 7" > /proc/sys/kernel/printk || echo "1 1 0 1" >/proc/sys/kernel/printk fi [ $DEBUG -ge 4 ] && drop_shell "Requested Debug Shell: before network." # Wait for hotplug seeding to finish, so the nic will be there echo "Waiting for hotplug -s ..." wait "$HOTPLUG" . "/inc/setup_network" || . "/inc/setup_network_retry" || drop_shell "Error setting up network" bench_event "NETWORK" "Network up and running" [ $DEBUG -ge 3 ] && drop_shell "Requested Debug Shell: after network/before configuring." . "/inc/activate_sysconfig" || drop_shell "Could not source /inc/activate_sysconfig" bench_event "CONFIG" "Downloaded config" showicon --icon "/opt/openslx/icons/active/??-config.ppm" # From here on, we have all the vars from /opt/openslx/config # Sync time via NTP . "/inc/ntp_sync" [ $DEBUG -ge 2 ] && drop_shell "Requested Debug Shell: after configuration/before stage32." . "/inc/setup_stage32" || drop_shell "Problem setting up stage3.2" bench_event "STAGE32" "Downloaded stage 3.2" showicon --icon "/opt/openslx/icons/active/??-rootfs.ppm" # copy files needed for stage3.2 to FUTURE_ROOT echo "Copying busybox etc. to stage32..." tar -cp /opt/openslx/bin/* /opt/openslx/sbin/* | tar -xp -C "${FUTURE_ROOT}/" mkdir -p "${FUTURE_ROOT}/opt/openslx/inc" cp -a "/inc/functions" "${FUTURE_ROOT}/opt/openslx/inc/" # set the SLX_ROOT_PASS if given in config if [ ! -z "$SLX_ROOT_PASS" ]; then sed -i "s#^root:[^:]*:#root:$SLX_ROOT_PASS:#" "${FUTURE_ROOT}/etc/shadow" fi # set the SLX_DEMO_PASS if given in config if [ ! -z "$SLX_DEMO_PASS" ]; then sed -i "s#^demo:[^:]*:#demo:$SLX_DEMO_PASS:#" "${FUTURE_ROOT}/etc/shadow" fi # Activate debug shell after switchroot? if [ -n "$DEBUG_SHELL" ]; then mkdir -p "${FUTURE_ROOT}/etc/systemd/system/sysinit.target.wants" ln -s "../debug-shell.service" "${FUTURE_ROOT}/etc/systemd/system/sysinit.target.wants/debug-shell.service" fi # Exam mode if [ -n "$SLX_EXAM" ]; then # Visual: Move splash screen to upper left corner showicon --tl "/etc/splash.ppm" fi # Merge freshly generated config to stage32 if [ -s "/run/config" ]; then line= while read -r line || [ -n "$line" ]; do [ "${line:0:1}" = '#' ] && continue var="${line%%=*}" [ "$var" = "$line" ] && continue sed -i -r "s/^(${var}=)/#\\1/" "${FUTURE_ROOT}/opt/openslx/config" done < "/run/config" cat "/run/config" >> "${FUTURE_ROOT}/opt/openslx/config" fi # one last debug shell if activated [ $DEBUG -ge 1 ] && drop_shell "Requested Debug Shell: before switch_root." # need /proc for this ;) bench_event "PRESWITCH" "Switching to stage 3.2" # unmount filesystems for mnt in run tmp; do busybox umount -f -l "/$mnt" 2>/dev/null done mkdir -p "${FUTURE_ROOT}/dev" busybox mount -o move /dev "${FUTURE_ROOT}/dev" # Copy splashtool and icons cp /opt/openslx/bin/splashtool "${FUTURE_ROOT}/opt/openslx/bin/" cp -r /opt/openslx/icons "${FUTURE_ROOT}/opt/openslx/" run_hooks pre-switchroot echo "Waiting for async processes..." wait echo "Switching root...." echo "$bench_result" > "${FUTURE_ROOT}/opt/openslx/.benchmark" # Prepare environment (HOME is needed as a hack for nss_ldap with ssl and no caching) unset BOOT_IMAGE initrd KCL ip slxbase slxsrv IPINFO vga ip MAC BOOTIF DEBUG OLDPWD MUTED_OUTPUT GFX unset ip router dns hostname domain search if ntpsrv export HOME=/ export recovery= export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin" for init in "/lib/systemd/systemd" "/usr/lib/systemd/systemd"; do [ -x "${FUTURE_ROOT}/${init}" ] || continue export init exec /sbin/switch_root -c /dev/console /mnt "$init" $SD_CMDLINE done