summaryrefslogblamecommitdiffstats
path: root/core/rootfs/rootfs-stage31/data/init
blob: 798831f2e730b8c2b445c4475e8b4dd27b0bcbe5 (plain) (tree)
1
2
3
4
5
6
7
8
9
          
                                                                               
 
                                                 
 

                                                                         
 
                                                                   
                                              



                                                                               




                                                                             
                                                          
 


                         

                                                                   
                                          
                                  
                                                                                        
                                                             
                                                 

                                                           
 
                                                                                             
          
 
                                                           
                                                            
 
                                                                                                                                          
 

                                                                      











                                          





















                                                         



                                 
 









                                                           

                                                                              





                                                                                        
           


            



                                                        

                                       





                                                                 
                    
                                     





                                                    











                                                                                                               


                                                              






                                                                                               
                                                         








                                                                                           
                                                         















                                                                                 
                                        



                                                                                                                   
 
           
                           
                                                         
                                       

  














                                                                                       


                                                



                                                





                                                                
 

                        


                                     



                                                                                                    
                                                    
             

                                                                                                             




                                                                       
 
                                                          
#!/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
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/opt/openslx/bin

# 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 /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"
found=
for dir in gpu hid net; do
	if [ -d "$BASEDIR/$dir" ]; then
		found=1
		break
	fi
done

if [ -z "$found" ]; then
	echo "0" > /proc/sys/kernel/printk
	reset
	cat <<WARNING
+
+
+
+
+ + + + + + + + + + + + + +
+   WARNING + + WARNING   +
+ - - - - - - - - - - - - +
+
+ kernel/drivers/$dir missing!
+
+ Booted kernel version does not match
+ modules provided by initramfs.
+ Make sure kernel and initramfs-stage31
+ are up to date.
+
+ Kernel:    $(uname -r)
+ initramfs: $(ls -1 /lib/modules | grep -m1 '\..*\..*-')
+
+ System halted.
+
+ + + + + + + + + + + + + +
WARNING
	while true; do
		read some garbage
	done
fi

# preparations for mounting stage3.2
FUTURE_ROOT="/dev/shm/uniontmp"
mkdir -p "$FUTURE_ROOT" /rorootfs
busybox mount -n -t tmpfs -o 'mode=755' none "$FUTURE_ROOT"
mkdir -p "$FUTURE_ROOT/opt/openslx"


# Get all variables we care about from the KCL
. /inc/parse_kcl

[ $DEBUG -ge 5 ] && drop_shell "Requested Debug Shell: before kernel modules."

# NOTE: this is only relevant when using the distro's kernel
# load kernel modules as given in /etc/modules
modprobe -a -b $(cat /etc/modules) 2>/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 /bin/* /sbin/* | tar -xp -C "${FUTURE_ROOT}/opt/openslx/"
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}=)/#<s31>\\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

drop_shell "Da is irgendwie kein systemd im neuen root..."