summaryrefslogtreecommitdiffstats
path: root/remote/rootfs/rootfs-stage31/data/init
blob: 93df822cf750b4ec5a8e0d1db7fc98ada91e80a9 (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
#!/bin/sh
# Copyright (c) 2012 - OpenSLX GmbH
#
# This program is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
#
# If you have any feedback please consult http://openslx.org/feedback and
# send your feedback to feedback@openslx.org
#
# General information about OpenSLX can be found at http://openslx.org
#
# First script for initial ramfs for OpenSLX linux stateless clients
#############################################################################

export PATH=/bin:/sbin:/usr/bin:/usr/sbin
export LD_LIBRARY_PATH=/usr/lib64


mount -n -t tmpfs -o 'mode=755' run "/run"

# mount the important standard directories
[ ! -f /proc/cpuinfo ] && mount -n -t proc proc /proc
[ ! -d /sys/class ] && mount -n -t sysfs sysfs /sys

echo "/sbin/mdev" > /proc/sys/kernel/hotplug
# read graphic and network adaptor configuration (without proprietary drivers yet)

# TODO: must ugly hack ever... needs to be improved when we add prop drivers
for DRM in /lib/modules/*/kernel/drivers/gpu/drm/*.ko /lib/modules/*/kernel/drivers/gpu/drm/*/*.ko; do
	echo "Trying to load module $DRM"
	insmod "$DRM"
done

# read kernel command line for debugging switch
DEBUG=0
read KCL < /proc/cmdline
export KCL
for opts in ${KCL}; do
	case ${opts} in
		debug*)
			DEBUG=1 ;;
		splash*)
			SPLASH=1 ;;
		ip=*)
			# process IP info
			ipinfo=${opts#ip=} ;;
		nfs=*)
      			nfs=${opts#nfs=}
      			nfspath=${nfs#*:}
      			nfsserver=${nfs%:/*}
			;;
		BOOTIF=*)
			macaddr="$( echo "$opts" | cut -b 11- | tr '-' ':' )" ;;
	esac
done

echo "Mac address is '$macaddr'"

mdev -s &

if [ "x$SPLASH" == "x1" -a "x$DEBUG" != "x1" ]; then
	# start plymouth
	plymouthd && plymouth show-splash
fi

# still needed?
#echo "modprobe -qa usbhid hid-bright" >/etc/modprobe.base
#/bin/sh /etc/modprobe.base; mdev -s

# setup network
nwif="eth0"
# set up loopback networking
echo "Setting up loopback"
ip link set dev lo up 2>/dev/null
ip addr add 127.0.0.1/8 dev lo 2>/dev/null
echo "Setting up $nwif"
ip link set dev $nwif up  2>/dev/null || { echo "No link for $nwif, dropping to shell.."; setsid sh -c 'exec sh </dev/tty1 >/dev/tty1 2>&1'; }

# analyze ip information from the kernel command line and put parts
# of it into several variables
if [ -n "$ipinfo" ] ; then
  getip () {
    local val="$ipinfo:"; i=$(($1 - 1));
    while [ $i -gt 0 ] ; do
      val=${val#*:} ; i=$(($i - 1));
    done;
  echo $val|sed "s/:.*//"; }
  clientip=$(getip 1)
  serverip=$(getip 2)
  gateway=$(getip 3)
  subnet_mask=$(getip 4)
  broadcast_address=$(ipcalc -s -b $clientip $subnet_mask|sed s/.*=//)
  [ -z "$broadcast_address" ] && broadcast_address=255.255.255.255
  # we might have an idea of the dns server via preboot
  dns_srv=$(getip 5)
  [ -n "$dns_srv" ] && echo nameserver $dns_srv >/etc/resolv.conf;
  echo -e "# ip configuration written by $0 script:\nclientip=$clientip\n\
subnet_mask=$subnet_mask\ngateway=$gateway\nserverip=$serverip\n\
broadcast_address=$broadcast_address" >>/etc/initramfs-setup
  # set static ip address
  ip addr add $clientip/$(ipcalc -s -p $clientip $subnet_mask|sed s/.*=//) \
    broadcast $broadcast_address dev $nwif 2>/dev/null
  ip route add default via $gateway 2>/dev/null
else
  noipyet="yes"
fi


# load local file systems - in kernel now! :-)
#modprobe aufs
#modprobe squashfs

mkdir -p /dev/shm/union /dev/shm/uniontmp /rorootfs
mount -n -t tmpfs none /dev/shm/uniontmp

if [ -n "$nfs" ] ; then
	echo "Mounting stage 3.2 as NFS"
	mount -t nfs -o ro,async,nolock ${nfsserver}:${nfspath} /rorootfs ||  { echo "Problem mounting NFS-Directory from ${nfsserver}:${nfspath}. Dropping to DEBUG shell."; DEBUG=1; } 	
else
	echo "Mounting stage 3.2 as SquashFS"
	mount -t squashfs /mnt/$(ls /mnt) /rorootfs || { echo "Problem mounting Squashfs. Dropping to DEBUG shell."; DEBUG=1; }
fi
			
if [ $DEBUG -ge 1 ]; then
	echo "Starting debug shell, CTRL + D will start Stage 3.2."
	setsid sh -c 'exec sh </dev/tty1 >/dev/tty1 2>&1'
else
	#Debug is not set so hide kernel debug output
	echo "0" >/proc/sys/kernel/printk
fi

echo "Building aufs..."
mount -n -t aufs -o br:/dev/shm/uniontmp:/rorootfs=ro none /mnt
mkdir -p /mnt/uniontmp /mnt/tmp
mount -n --move /dev/shm/uniontmp /mnt/uniontmp

# create udev rule for nic we booted from
echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="'$macaddr'", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"' > "/mnt/etc/udev/rules.d/70-net-boot-nic-name.rules"

for mnt in proc sys run ; do
  umount -n $mnt
done

echo "Switching root...."
unset BOOT_IMAGE initrd
[ "x$SPLASH" == "x1" -a "x$DEBUG" != "x1" ] && plymouth update-root-fs --new-root-dir=/mnt
# new style of pivoting (switch_root or run-init)
exec /sbin/switch_root -c /dev/console /mnt /usr/lib/systemd/systemd