summaryrefslogtreecommitdiffstats
path: root/initramfs/cdboot/init
blob: fbd7bdbfee50e5e1094693a7f21fbd09e741ef0a (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
#!/bin/ash
# Copyright (c) 2007 - 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
#
# Main script for cd-boot demo initial ramdisk - preloading environment for
# for running OpenSLX linux stateless clients version 4 for testing

#############################################################################
# compute prefix bit number from netmask
nm2pref () {
set $(IFS="."; echo $1)
local n=0
local i
  for i in $1 $2 $3 $4 ; do
    case $i in
        0) break ;;
      128) n=$(($n + 1)) ; break ;;
      192) n=$(($n + 2)) ; break ;;
      224) n=$(($n + 3)) ; break ;;
      240) n=$(($n + 4)) ; break ;;
      252) n=$(($n + 6)) ; break ;;
      254) n=$(($n + 7)) ; break ;;
      255) n=$(($n + 8)) ; continue ;;
    esac
  done
echo $n
}

#############################################################################
# device files get their own filesystem (to be move mounted later)
devdir="/dev"
mount -n -t tmpfs -o 'size=25%,mode=0755' initramfsdevs ${devdir}

# create basic device files an directories in dev (for most hardware related
# devices mdev should handle that)
for i in "/dev/mem c 1 1" "/dev/null c 1 3" "/dev/zero c 1 5" \
         "/dev/urandom c 1 9" "/dev/kmsg c 1 11" "/dev/tty0 c 4 0" \
         "/dev/tty1 c 4 1" "/dev/tty2 c 4 2" "/dev/tty3 c 4 3" \
         "/dev/tty4 c 4 4" "/dev/tty5 c 4 5" "/dev/tty6 c 4 6" \
         "/dev/tty7 c 4 7" "/dev/tty8 c 4 8" "/dev/tty9 c 4 9" \
         "/dev/tty10 c 4 10" "/dev/tty c 5 0" "/dev/console c 5 1" \
         "/dev/ptmx c 5 2" "/dev/psaux c 10 1" "/dev/agpgart c 10 175" \
         "/dev/fb0 c 29 0" "/dev/bootsplash p" "/dev/xconsole p"; do
  mknod $i
done
mkdir -p ${devdir}/pts ${devdir}/shm ${devdir}/.udevdb ${devdir}/.udev

# source functions file common for all distros, messages contains all error
# and info output (for some reason the error output is not produced properly
# - crash)

# initramfs-setup configuration (common settings for all clients using a
# certain InitRamFS generated by slxmkramfs/mkdxsinitrd)
[ -f /etc/initramfs-setup ] && . /etc/initramfs-setup 2>/dev/null

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

export DEBUGLEVEL=0
export KERNEL="${ramfs_kernver}"
export NWMODULES="${ramfs_nicmods}"

# set a default LAN interface, might be modified for WLAN or on machines with
# more than one ethernet card built in
nwif="eth0"

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

# keep quiet
#echo "0 0 0 0" >/proc/sys/kernel/printk

# fixme: shut down if script fails
trap "exec (sleep 30; echo o>/proc/sysrq-trigger)" \
  SIGHUP SIGINT SIGPIPE SIGTERM

# if no kernel version is set, try to get it directly from /proc
if [ -z $KERNEL ] ; then
  KERNEL=$(cat /proc/version)
  KERNEL=${KERNEL#*version }
  KERNEL=${KERNEL% (*) (*}
fi

# load network adaptor modules
for mod in ${NWMODULES}; do
  modprobe ${MODPRV} $mod || echo "module $mod did not load for some reason"
  usleep 10000 
done

# read kernel commandline
read KCMDLINE < /proc/cmdline
export KCMDLINE
# read the system wide machine-setup and then the kernel commandline
for opts in $(sed "s/#.*//" /etc/initramfs-setup) ${KCMDLINE} ; do
  case ${opts} in
    debug)
      DEBUGLEVEL=1;;
    # ... or a specified debug level
  esac
done
# at this point a timer should be started to ensure an automated reboot
# or halt of the machine if SLX init does not succeed (e.g. missing kernel
# module for the network adaptor)
if [ "${DEBUGLEVEL}" -gt 0 ] ; then
  cat<<EOF > /bin/watchdog
#!/bin/ash
echo \$$ > /tmp/watchdogpid
[ ! -f /proc/version ] && mount -n -t proc proc /proc
sleep 120 2> /dev/null
echo "o" > /proc/sysrq-trigger
EOF
  chmod u+x /bin/watchdog
  watchdog &
fi

if [ -n "${essid}" ] ; then
  # WLAN setup will most probably change the network interface name stored in
  # nwif (to wlan0 or something like that)
  :
else
  # check here for the active ethernet link
  ip link show dev eth1 >/dev/null 2>&1 && echo "more than one nw if found"
fi

# set up loopback networking and power up ethernet
ip link set dev lo up
ip addr add 127.0.0.1/8 dev lo
ip link set dev $nwif up || echo "noeth"

# start udhcpc here
mkdir -p /usr/share/udhcpc
echo -e '#!/bin/ash\nunset infomsg HOME IFS mask lease interface DEBUGLEVEL\n 
set >/tmp/ipstuff' >/usr/share/udhcpc/default.script
chmod u+x /usr/share/udhcpc/default.script
[ -f /lib/modules/@@@KERNVER@@@/kernel/net/packet/af_packet.ko ] && \
  modprobe -q af_packet
[ -n $vci ] && vci="-V $vci"
udhcpc -b -q $vci -s /usr/share/udhcpc/default.script -i $nwif #2>/dev/null
. /tmp/ipstuff || echo "no ip config"
ip addr add $ip/$(nm2pref $subnet) dev $nwif
ip route add default via $router  

# at this point a little selection script could be downloaded, which lets the
# user choose what kind of SLX client he wants to get

# get kernel and initramfs
wget -c -O /tmp/kernel http://132.230.4.73/trac/kdefault
wget -c -O /tmp/iramfs http://132.230.4.73/trac/idefault
/bin/ash

# start the new kernel with initialramfs and cmdline
kexec -l /tmp/kernel --initrd=/tmp/iramfs --append="ip=$ip:$siaddr:$router:$subnet\
  file=http://132.230.4.73/trac/default.tgz debug=3"
kexec -e