summaryrefslogtreecommitdiffstats
path: root/core/rootfs/rootfs-stage31/data/init
blob: 798831f2e730b8c2b445c4475e8b4dd27b0bcbe5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
#!/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..."