# !/bin/sh # # Copyright Matthias Hentges (c) 2005 # # License: GPL (see http://www.gnu.org/licenses/gpl.txt for a copy of the GPL) M_TITLE="Boot from NFS" die() { echo -e "ERROR: $1" >/dev/tty0 exec $SH_SHELL /dev/tty0 2>&1 } # This function is activated by init.altboot by calling this script with the "run" option run_module() { test -e /etc/altboot.func && . /etc/altboot.func || die "ERROR: /etc/altboot.func not found. Check your installation!" # Mount /proc, etc init_rootfs # Needed for NFS /etc/init.d/portmap start >/dev/null 2>&1 || die "/etc/init.d/portmap start failed!" # For some reason NFS mounts hang if /e/i/networking is not run. # For the time beeing I'm too lazy to investigate ;) /etc/init.d/networking start >/dev/null 2>&1 || die "/etc/init.d/networking start failed!" sleep 2 # After the PCMCIA service is started, an inserted WLAN card should automatically # activate itself. if test -x /etc/init.d/pcmcia then /etc/init.d/pcmcia start >/dev/null 2>&1 || die "/etc/init.d/pcmcia start failed!" else # With kernel 2.6.16+ udev is used /etc/init.d/udev start >/dev/null 2>&1 || die "/etc/init.d/udev start failed!" /etc/init.d/udev stop fi nfs_host="`cat /etc/fstab | grep -v ^# | grep nfs | awk '{print $1}'|sed -n "s/\(.*\)\:\(.*\)/\1/p" `" nfs_mounts="`cat /etc/fstab | grep -v ^# | grep nfs | awk '{print $1}'`" nfs_mountpoints="`cat /etc/fstab | grep -v ^# | grep nfs | awk '{print $2}'`" WLAN_NIC="`iwconfig 2>/dev/null | grep ESSID | awk '{print $1}'`" if test -z "$nfs_host" then die "${C_RED}No configured NFS drives found in /etc/fstab$C_RESET" fi # WLAN with DHCP needs some time to get a lease, set up the routing, etc. echo -n "Waiting for WLAN" cnt=0 while true do if (ping -c 1 $nfs_host) >/dev/null 2>&1 then echo " found" break else if test "$cnt" = 30 -o "$cnt" = 60 then echo "" echo "WARNING: WLAN didn't activate in $cnt seconds!" if test "$cnt" = 30 then echo "Restarting udhcpc" killall udhcpc udhcpc -i "$WLAN_NIC" -H `cat /etc/hostname` >/dev/null 2>&1 else die "Failed to activate WLAN!" break fi else echo -n "." let cnt=$cnt+1 fi fi sleep 1 done if test "` echo "$nfs_mountpoints" |wc -l | tr -d " "`" -gt 1 then echo -e "Please select your NFS root:\n" cnt=1 for nfs_mount in $nfs_mountpoints do echo -e "\t[$cnt] $nfs_mount" let cnt=$cnt+1 done echo "" while test -z "$selection" do stty echo echo -n "Boot NFS root: " if test "$AUTOBOOT" != "yes" then read junk < /dev/tty1 else if test -e /etc/.altboot-bootNFS-source.last then junk="`cat /etc/.altboot-bootNFS-source.last`" test -z "$junk" && read junk < /dev/tty1 || echo "$junk (autoboot)" else read junk < /dev/tty1 fi fi cnt=1 for nfs_mount in $nfs_mounts do if test "$junk" = "$cnt" then selection="$nfs_mount" echo "$junk" > /etc/.altboot-bootNFS-source.last fi let cnt=$cnt+1 done done else test -z "$nfs_mounts" && die "No NFS mounts configured in /etc/fstab!" selection="$nfs_mounts" fi mkdir -p /media/nfsroot || die "mkdir -p /media/nfsroot failed!" echo -n "Mounting NFS root..." if ( mount | grep -q "/media/nfsroot" ) then echo "/media/nfsroot already used, tying to umount..." umount /media/image losetup -d /dev/loop0 umount /media/nfsroot || die "umount failed!" fi mount -t nfs "$selection" /media/nfsroot && echo ok || die "mount -t nfs "$selection" /media/nfsroot failed!" # Use configured resolv.conf in the pivoted rootfs #echo -n "Copying resolv.conf..." #cp /etc/resolv.conf /media/nfsroot/etc && echo ok || echo "FAILED" check_target "/media/nfsroot" bootNFS } case "$1" in title) echo "$M_TITLE";; run) run_module "$2";; esac