Skip to content

Commit

Permalink
Support bootoptions ethdevice and ethdevice-timeout for specifying fr…
Browse files Browse the repository at this point in the history
…om which device you want to boot from and using which timeout (being 30 seconds if unconfigured), if ethdevice is not specified try to get a working network configuration for each existing network device.
  • Loading branch information
mika authored and daniel-baumann committed Apr 2, 2010
1 parent 787bd56 commit 4632ef1
Showing 1 changed file with 54 additions and 2 deletions.
56 changes: 54 additions & 2 deletions scripts/live
Expand Up @@ -100,6 +100,16 @@ Arguments ()
export DEVICE
;;

ethdevice=*)
ETHDEVICE="${ARGUMENT#ethdevice=}"
export ETHDEVICE
;;

ethdevice-timeout=*)
ETHDEV_TIMEOUT="${ARGUMENT#ethdevice-timeout=}"
export ETHDEV_TIMEOUT
;;

fetch=*)
FETCH="${ARGUMENT#fetch=}"
export FETCH
Expand Down Expand Up @@ -765,7 +775,48 @@ do_netmount ()
udevadm trigger
udevadm settle

ipconfig ${DEVICE} | tee /netboot.config
# if ethdevice was not specified on the kernel command line
# make sure we try to get a working network configuration
# for *every* present network device (except for loopback of course)
if [ -z "$ETHDEVICE" ] ; then
echo "If you want to boot from a specific device use bootoption ethdevice=..."
for device in /sys/class/net/*; do
dev=${device##*/} ;
if [ "$dev" != "lo" ] ; then
ETHDEVICE="$ETHDEVICE $dev"
fi
done
fi

# split args of ethdevice=eth0,eth1 into "eth0 eth1"
for device in $(echo $ETHDEVICE | sed 's/,/ /g') ; do
devlist="$devlist $device"
done

[ -n "$ETHDEV_TIMEOUT" ] || ETHDEV_TIMEOUT=15
echo "Using timeout of $ETHDEV_TIMEOUT seconds for network configuration."

# this is tricky (and ugly) because ipconfig sometimes just hangs/runs into
# an endless loop; iff execution fails give it two further tries, that's
# why we use '$devlist $devlist $devlist' for the other for loop
for dev in $devlist $devlist $devlist ; do
echo "Executing ipconfig -t $ETHDEV_TIMEOUT $dev"
ipconfig -t "$ETHDEV_TIMEOUT" $dev | tee -a /netboot.config &
jobid=$!
sleep "$ETHDEV_TIMEOUT" ; sleep 1
if [ -r /proc/"$jobid"/status ] ; then
echo "Killing job $jobid for device $dev as ipconfig ran into recursion..."
kill -9 $jobid
fi

# if configuration of device worked we should have an assigned
# IP address, iff so let's use the according as $DEVICE for later usage
# simple and primitive approach which seems to work fine
if ifconfig $dev | grep -q 'inet.*addr:' ; then
export DEVICE="$dev"
break
fi
done

# source relevant ipconfig output
OLDHOSTNAME=${HOSTNAME}
Expand All @@ -774,7 +825,8 @@ do_netmount ()
export HOSTNAME

# Check if we have a network device at all
if ! ls /sys/class/net/eth0 > /dev/null 2>&1 && \
if ! ls /sys/class/net/"$DEVICE" > /dev/null 2>&1 && \
! ls /sys/class/net/eth0 > /dev/null 2>&1 && \
! ls /sys/class/net/wlan0 > /dev/null 2>&1 && \
! ls /sys/class/net/ath0 > /dev/null 2>&1 && \
! ls /sys/class/net/ra0 > /dev/null 2>&1
Expand Down

0 comments on commit 4632ef1

Please sign in to comment.