120 lines
3.4 KiB
Bash
Executable File
120 lines
3.4 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
PATH=$PATH:/sbin:/usr/sbin
|
|
|
|
. /lib/dracut-lib.sh
|
|
|
|
if getarg rdnetdebug ; then
|
|
exec >/tmp/netroot.$1.$$.out
|
|
exec 2>>/tmp/netroot.$1.$$.out
|
|
set -x
|
|
fi
|
|
|
|
# Huh? Empty $1?
|
|
[ -z "$1" ] && exit 1
|
|
|
|
# Huh? No interface config?
|
|
[ ! -e /tmp/net.$1.up ] && exit 1
|
|
|
|
# Only try to configure from one network interface at a time
|
|
#
|
|
if [ -z "$NETROOT_LOCKED" ] ; then
|
|
NETROOT_LOCKED=true
|
|
export NETROOT_LOCKED
|
|
exec flock -xo /tmp/netroot.lock -c "$0 $*"
|
|
exit 1
|
|
fi
|
|
|
|
# There's no sense in doing something if no (net)root info is available
|
|
# or root is already there
|
|
[ -e /tmp/root.info ] || exit 1
|
|
. /tmp/root.info
|
|
[ -d $NEWROOT/proc ] && exit 0
|
|
[ -z "$netroot" ] && exit 1
|
|
|
|
# Let's see if we have to wait for other interfaces
|
|
# Note: exit works just fine, since the last interface to be
|
|
# online'd should see all files
|
|
[ -e "/tmp/net.ifaces" ] && read IFACES < /tmp/net.ifaces
|
|
for iface in $IFACES ; do
|
|
[ -e /tmp/net.$iface.up ] || exit 1
|
|
done
|
|
|
|
# Set or override primary interface
|
|
netif=$1
|
|
[ -e "/tmp/net.bootdev" ] && read netif < /tmp/net.bootdev
|
|
|
|
# Figure out the handler for root=dhcp by recalling all netroot cmdline
|
|
# handlers
|
|
if [ "$netroot" = "dhcp" ] ; then
|
|
# Unset root so we can check later
|
|
unset root
|
|
|
|
# Load dhcp options
|
|
[ -e /tmp/dhclient.$netif.dhcpopts ] && . /tmp/dhclient.$netif.dhcpopts
|
|
|
|
# If we have a specific bootdev with no dhcpoptions or empty root-path,
|
|
# we die. Otherwise we just warn
|
|
if [ -z "$new_root_path" ] ; then
|
|
[ -n "$BOOTDEV" ] && die "No dhcp root-path received for '$BOOTDEV'"
|
|
warn "No dhcp root-path received for '$BOOTDEV' trying other interfaces if available"
|
|
exit 1
|
|
fi
|
|
|
|
# Set netroot to new_root_path, so cmdline parsers don't call
|
|
netroot=$new_root_path
|
|
|
|
for f in ./cmdline/90*.sh; do
|
|
[ -f "$f" ] && . "$f";
|
|
done
|
|
else
|
|
rootok="1"
|
|
fi
|
|
|
|
# Check: do we really know how to handle (net)root?
|
|
[ -z "$root" ] && die "No or empty root= argument"
|
|
[ -z "$rootok" ] && die "Don't know how to handle 'root=$root'"
|
|
|
|
handler=${netroot%%:*}
|
|
handler=${handler%%4}
|
|
handler="/sbin/${handler}root"
|
|
if [ -z "$netroot" ] || [ ! -e "$handler" ] ; then
|
|
die "No handler for netroot type '$netroot'"
|
|
fi
|
|
|
|
# We're here, so we can assume that upping interfaces is now ok
|
|
[ -z "$IFACES" ] && IFACES="$netif"
|
|
for iface in $IFACES ; do
|
|
. /tmp/net.$iface.up
|
|
done
|
|
|
|
[ -e /tmp/net.$netif.gw ] && . /tmp/net.$netif.gw
|
|
[ -e /tmp/net.$netif.hostname ] && . /tmp/net.$netif.hostname
|
|
[ -e /tmp/net.$netif.resolv.conf ] && cp -f /tmp/net.$netif.resolv.conf /etc/resolv.conf
|
|
|
|
# Source netroot hooks before we start the handler
|
|
source_all netroot
|
|
|
|
# Run the handler; don't store the root, it may change from device to device
|
|
# XXX other variables to export?
|
|
if $handler $netif $netroot $NEWROOT; then
|
|
# Network rootfs mount successful
|
|
for iface in $IFACES ; do
|
|
[ -f /tmp/dhclient.$iface.lease ] && cp /tmp/dhclient.$iface.lease /tmp/net.$iface.lease
|
|
[ -f /tmp/dhclient.$iface.dhcpopts ] && cp /tmp/dhclient.$iface.dhcpopts /tmp/net.$iface.dhcpopts
|
|
done
|
|
|
|
# Save used netif for later use
|
|
[ ! -f /tmp/net.ifaces ] && echo $netif > /tmp/net.ifaces
|
|
else
|
|
warn "Mounting root via '$netif' failed"
|
|
# If we're trying with multiple interfaces, put that one down.
|
|
# ip down/flush ensures that routeing info goes away as well
|
|
if [ -z "$BOOTDEV" ] ; then
|
|
ip link set $netif down
|
|
ip addr flush dev $netif
|
|
echo "#empty" > /etc/resolv.conf
|
|
fi
|
|
fi
|
|
exit 0
|