#!/bin/ash # Copyright (c) 2008..2009 - 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 preboot initial ramfs - preloading environment for running # OpenSLX linux stateless clients version 5. fetchip () { # we expect to get an ip address within 10++ seconds ( sleep 6 ; killall udhcpc >/dev/null 2>&1 ) & for i in 1 2 ; do udhcpc -f -n -q $vci -s /usr/share/udhcpc/default.script -i $nwif 2>/dev/null if grep "ip=" /tmp/ipstuff >/dev/null 2>&1 ; then . /tmp/ipstuff for ns in $dns ; do echo "nameserver $ns" >>/etc/resolv.conf done # simply add a single dns server for passing via kernel cmdline to stage3 # (quickhack, just the last, list of dns might be better ...) echo "dnssrv=$ns" >>/tmp/ipstuff return else if [ $i -eq 1 ] ; then sleep 1 else dialog --msgbox "Did not get any proper IP configuration: Please check \ that your Ethernet card is supported, the machine is connected to the network \ and a DHCP server is answering your requests." 7 65 ash echo "o" >/proc/sysrq-trigger fi fi done } ############################################################################# # PreBoot init main part # device files get their own filesystem devdir="/dev" mount -n -t tmpfs -o 'size=25%,mode=0755' mdev ${devdir} mkdir -p /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug cat > /etc/mdev.conf << "EOF" sda* 0:6 0660 sdb* 0:6 0660 sg* 0:6 0660 hda* 0:6 0660 hdb* 0:6 0660 EOF mdev -s export DEBUGLEVEL=0 # create basic device files an directories in dev 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 export PATH=/bin:/sbin:/usr/bin/:/usr/sbin # redirect kernel messages to tty10 instead of tty1 getty -i -n -l /bin/cat 38400 tty10 & setlogcons 10 # 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 # set a default LAN interface, has to 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 # load framebuffer modules if needed for mod in vesafb fbcon; do if [ x != x$(find /lib/modules -name ${mod}.ko) ]; then modprobe $mod || \ dialog --infobox "Module $mod did not load for some reason." 3 65 usleep 1000 fi done # give startup information dialog --infobox "Starting OpenSLX preboot environment ..." 3 65 # load usb keyboard and network adaptor modules for mod in ${ramfs_nicmods} af_packet unix hid hid-bright usbhid \ uhci-hcd ohci-hcd ; do if [ x != x$(find /lib/modules -name ${mod}.ko) ]; then modprobe $mod || \ dialog --infobox "Module $mod did not load for some reason." 3 65 usleep 10000 fi done # set the default for boot type and read kernel commandline (for this and # other options) export TYPE=fastboot read KCMDLINE /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 & else getty -i -n -l /bin/ash 38400 tty2 & fi if [ -n "${SSID}" ] ; then # WLAN setup will most probably change the network interface name stored in # nwif (to wlan0 or something like that) [ $DEBUGLEVEL -gt 0 ] && echo "set essid to ${essid}"; #value of essid unchecked yet # load network adaptor modules cd /lib/modules/$(ls /lib/modules/)/kernel/drivers/net/wireless for mod in $(find . | grep .ko | sed 's,.*/\([^/]*\).ko,\1',); do echo "Mod:"; echo $mod; modprobe $mod || echo "module $mod did not load for some reason" usleep 10000 done cd / wlanif=$(iwconfig 2>/dev/null|sed -n "/ESSID:/p"|sed "s/ .*//") [ $DEBUGLEVEL -gt 0 ] && echo "wlancard recognized as ${wlanif}"; ip link set dev ${wlanif} up if iwconfig ${wlanif} mode managed essid "${essid}"; then nwif=${wlanif} else error " Unable to configure the WLAN interface." fi : else # check here for the active Ethernet link ip link show dev eth1 >/dev/null 2>&1 && \ dialog --msgbox "More than one network interface found. This could cause \ some trouble as their activation and ordering depends on the module load \ order ..." 7 65 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 "I did not find any usable network adaptor." # run udhcpc and start a debug shell if no lease could be obtained mkdir -p /usr/share/udhcpc echo -e "#!/bin/ash\nunset infomsg HOME IFS mask lease interface DEBUGLEVEL \ BOOT_IMAGE\nset >/tmp/ipstuff" >/usr/share/udhcpc/default.script chmod u+x /usr/share/udhcpc/default.script modprobe -q af_packet [ -n $vci ] && vci="-V $vci" fetchip ip addr add $ip/$(ipcalc -s -p $ip $subnet|sed s/.*=//) dev $nwif ip route add default via $router # get the mac address of the boot network adaptor macaddr=$(ip link show dev $nwif 2>/dev/null | \ sed -n "/ether [0-9e-f]\{2\}:.*/p" | sed -e "s/.*ether //;s/ .*//") echo "macaddr=$macaddr" >>/etc/initramfs-setup # at this point a little selection script could be downloaded, which lets the # user choose what kind of SLX client he wants to get dialog --infobox "Fetching preboot interactive part and configuration from \ the net ($boot_uri) ..." 4 65 mkdir -p /preboot wget -q -O /preboot/preboot.init ${boot_uri}bootloader/env/getinit/formedia/$PBS_ID chmod u+x /preboot/preboot.init echo "pbs_id=$PBS_ID" >> /etc/pbs.conf # start a debug shell if needed, else set quiet kernel parameter if [ "${DEBUGLEVEL}" -gt 0 ] ; then echo "Starting shell, leaving it would continue init." /bin/ash else # no debugging output for stage3 run echo "quiet=quiet" >>/etc/initramfs-setup fi # run the preboot interactive part which finally will execute kexec cd /preboot exec ./preboot.init # we should never return from that one ... dialog --msgbox "The execution of the main preboot component failed. Please \ check network access of your box. Is $boot_uri reachable!?" 6 65 # ping -c 1 $boot_uri sleep 20 && echo "o" >/proc/sysrq-trigger