allow ifup bring up network manually even without netroot

For kdump we need scp vmcore to remote machine, the nic to be used is
not limited to netroot one. we need a feature for manually bringing up
 network interface. Also it is useful for emergency shell with
ssh-client for recovery or test purpose

I implement this by adding one argument to ifup script, user can use
`/sbin/ifup eth0 -m` to bring up eth0, note ifup will regard it a
manual operation for the nic specified in 1st argument if there's
the 2nd argument.

If same nic is used for netroot the 2nd argument will be ignored,
in this case we will leave netroot bring up it automatically to
avoid side effect. And in this case hooks such as kdump will need to
execute after netroot mounted.

`ifup eth0 -m` will create /tmp/net.eth0.manualup stamp file,
later dhclient-script can check this and pass $2 to netroot,
then netroot script will bring eth0 up

Thanks for comments and suggestions from David Dillow.

Signed-off-by: Dave Young <dyoung@redhat.com>
master
Dave Young 2012-02-02 15:59:49 +08:00 committed by Harald Hoyer
parent 418febfc44
commit 957bc5c92f
3 changed files with 112 additions and 81 deletions

View File

@ -76,7 +76,13 @@ case $reason in
echo "$line" echo "$line"
done >/tmp/dhclient.$netif.dhcpopts done >/tmp/dhclient.$netif.dhcpopts
echo online > /sys/class/net/$netif/uevent echo online > /sys/class/net/$netif/uevent

if [ -e /tmp/net.$netif.manualup ]; then
/sbin/netroot $netif -m
rm -f /tmp/net.$netif.manualup
else
initqueue --onetime --name netroot-$netif netroot $netif initqueue --onetime --name netroot-$netif netroot $netif
fi
;; ;;
*) echo "dhcp: $reason";; *) echo "dhcp: $reason";;
esac esac

View File

@ -5,9 +5,54 @@
# We don't need to check for ip= errors here, that is handled by the # We don't need to check for ip= errors here, that is handled by the
# cmdline parser script # cmdline parser script
# #
# without $2 means this is for real netroot case
# or it is for manually bring up network ie. for kdump scp vmcore
PATH=/usr/sbin:/usr/bin:/sbin:/bin PATH=/usr/sbin:/usr/bin:/sbin:/bin


type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
export PS4="ifup.$1.$$ + "
exec >>/run/initramfs/loginit.pipe 2>>/run/initramfs/loginit.pipe
type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh

# Huh? No $1?
[ -z "$1" ] && exit 1

# $netif reads easier than $1
netif=$1

# enslave this interface to bond?
if [ -e /tmp/bond.info ]; then
. /tmp/bond.info
for slave in $bondslaves ; do
if [ "$netif" = "$slave" ] ; then
netif=$bondname
fi
done
fi

# bridge this interface?
if [ -e /tmp/bridge.info ]; then
. /tmp/bridge.info
if [ "$netif" = "$ethname" ]; then
if [ "$netif" = "$bondname" ] && [ -n "$DO_BOND_SETUP" ] ; then
: # We need to really setup bond (recursive call)
else
netif="$bridgename"
fi
fi
fi

# bail immediately if the interface is already up
# or we don't need the network
[ -f "/tmp/net.$netif.up" ] && exit 0
[ -f "/tmp/root.info" ] || exit 0
. /tmp/root.info

# disable manual ifup while netroot is set for simplifying our logic
# in netroot case we prefer netroot to bringup $netif automaticlly
[ -n "$2" ] && [ -z "$netroot" ] && manualup="$2"
[ -z "$netroot" ] && [ -z "$manualup" ] && exit 0
[ -n "$manualup" ] && >/tmp/net.$netif.manualup


# Run dhclient # Run dhclient
do_dhcp() { do_dhcp() {
@ -50,7 +95,11 @@ do_ipv6auto() {




echo online > /sys/class/net/$netif/uevent echo online > /sys/class/net/$netif/uevent
if [ -n "$manualup" ]; then
/sbin/netroot $netif -m
else
initqueue --onetime --name netroot-$netif netroot $netif initqueue --onetime --name netroot-$netif netroot $netif
fi
} }


# Handle static ip configuration # Handle static ip configuration
@ -77,47 +126,12 @@ do_static() {
fi >> /tmp/net.$netif.resolv.conf fi >> /tmp/net.$netif.resolv.conf


echo online > /sys/class/net/$netif/uevent echo online > /sys/class/net/$netif/uevent
initqueue --onetime --name netroot-$netif netroot $netif if [ -n "$manualup" ]; then
} /sbin/netroot $netif -m

export PS4="ifup.$1.$$ + "
exec >>/run/initramfs/loginit.pipe 2>>/run/initramfs/loginit.pipe
type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh

# Huh? No $1?
[ -z "$1" ] && exit 1

# $netif reads easier than $1
netif=$1

# enslave this interface to bond?
if [ -e /tmp/bond.info ]; then
. /tmp/bond.info
for slave in $bondslaves ; do
if [ "$netif" = "$slave" ] ; then
netif=$bondname
fi
done
fi

# bridge this interface?
if [ -e /tmp/bridge.info ]; then
. /tmp/bridge.info
if [ "$netif" = "$ethname" ]; then
if [ "$netif" = "$bondname" ] && [ -n "$DO_BOND_SETUP" ] ; then
: # We need to really setup bond (recursive call)
else else
netif="$bridgename" initqueue --onetime --name netroot-$netif netroot $netif
fi fi
fi }
fi

# bail immediately if the interface is already up
# or we don't need the network
[ -f "/tmp/net.$netif.up" ] && exit 0
[ -f "/tmp/root.info" ] || exit 0
. /tmp/root.info
[ -z "$netroot" ] && exit 0


# loopback is always handled the same way # loopback is always handled the same way
if [ "$netif" = "lo" ] ; then if [ "$netif" = "lo" ] ; then
@ -228,5 +242,4 @@ for p in $(getargs ip=); do
esac esac
break break
done done

exit 0 exit 0

View File

@ -3,7 +3,6 @@
# ex: ts=8 sw=4 sts=4 et filetype=sh # ex: ts=8 sw=4 sts=4 et filetype=sh


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

type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh


# Huh? Empty $1? # Huh? Empty $1?
@ -12,12 +11,16 @@ type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
# Huh? No interface config? # Huh? No interface config?
[ ! -e /tmp/net.$1.up ] && exit 1 [ ! -e /tmp/net.$1.up ] && exit 1


# There's no sense in doing something if no (net)root info is available # [ ! -z $2 ] means this is for manually bringing up network
# instead of real netroot; If It's called without $2, then there's
# no sense in doing something if no (net)root info is available
# or root is already there # or root is already there
[ -e /tmp/root.info ] || exit 1 [ -e /tmp/root.info ] || exit 1
. /tmp/root.info . /tmp/root.info
[ -d $NEWROOT/proc ] && exit 0 if [ -z "$2" ]; then
[ -z "$netroot" ] && exit 1 [ -d $NEWROOT/proc ] && exit 0
[ -z "$netroot" ] && exit 1
fi


# Let's see if we have to wait for other interfaces # Let's see if we have to wait for other interfaces
# Note: exit works just fine, since the last interface to be # Note: exit works just fine, since the last interface to be
@ -31,9 +34,14 @@ done
netif=$1 netif=$1
[ -e "/tmp/net.bootdev" ] && read netif < /tmp/net.bootdev [ -e "/tmp/net.bootdev" ] && read netif < /tmp/net.bootdev


if [ -e /tmp/net.$netif.manualup ]; then
rm -f /tmp/net.$netif.manualup
fi

# Figure out the handler for root=dhcp by recalling all netroot cmdline # Figure out the handler for root=dhcp by recalling all netroot cmdline
# handlers # handlers when this is not called from manually network bringing up.
if [ "$netroot" = "dhcp" ] || [ "$netroot" = "dhcp6" ] ; then if [ -z "$2" ]; then
if [ "$netroot" = "dhcp" ] || [ "$netroot" = "dhcp6" ] ; then
# Unset root so we can check later # Unset root so we can check later
unset root unset root


@ -55,19 +63,20 @@ if [ "$netroot" = "dhcp" ] || [ "$netroot" = "dhcp6" ] ; then
for f in $hookdir/cmdline/90*.sh; do for f in $hookdir/cmdline/90*.sh; do
[ -f "$f" ] && . "$f"; [ -f "$f" ] && . "$f";
done done
else else
rootok="1" rootok="1"
fi fi


# Check: do we really know how to handle (net)root? # Check: do we really know how to handle (net)root?
[ -z "$root" ] && die "No or empty root= argument" [ -z "$root" ] && die "No or empty root= argument"
[ -z "$rootok" ] && die "Don't know how to handle 'root=$root'" [ -z "$rootok" ] && die "Don't know how to handle 'root=$root'"


handler=${netroot%%:*} handler=${netroot%%:*}
handler=${handler%%4} handler=${handler%%4}
handler=$(command -v ${handler}root) handler=$(command -v ${handler}root)
if [ -z "$netroot" ] || [ ! -e "$handler" ] ; then if [ -z "$netroot" ] || [ ! -e "$handler" ] ; then
die "No handler for netroot type '$netroot'" die "No handler for netroot type '$netroot'"
fi
fi fi


# We're here, so we can assume that upping interfaces is now ok # We're here, so we can assume that upping interfaces is now ok
@ -122,6 +131,9 @@ if [ -n "$dest" ] && ! arping -q -f -w 60 -I $netif $dest ; then
dinfo "Resolving $dest via ARP on $netif failed" dinfo "Resolving $dest via ARP on $netif failed"
fi fi


# exit in case manually bring up network
[ -n "$2" ] && exit 0

# Source netroot hooks before we start the handler # Source netroot hooks before we start the handler
source_all $hookdir/netroot source_all $hookdir/netroot