]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
allow ifup bring up network manually even without netroot
authorDave Young <dyoung@redhat.com>
Thu, 2 Feb 2012 07:59:49 +0000 (15:59 +0800)
committerHarald Hoyer <harald@redhat.com>
Tue, 7 Feb 2012 11:14:21 +0000 (12:14 +0100)
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>
modules.d/40network/dhclient-script
modules.d/40network/ifup
modules.d/40network/netroot

index e8bd8b224e1323e152669e0832ca073f90e64c95..52e4900c2f0a75b99b0ac93ca31db007ae60c98b 100755 (executable)
@@ -76,7 +76,13 @@ case $reason in
             echo "$line"
         done >/tmp/dhclient.$netif.dhcpopts
         echo online > /sys/class/net/$netif/uevent
-        initqueue --onetime --name netroot-$netif netroot $netif
+
+        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
+        fi
         ;;
     *) echo "dhcp: $reason";;
 esac
index a6b3a7da830afaebe37c01bf1f664473456c8daf..b138e8e3a243213aaf6f026c559954afb5a9e538 100755 (executable)
@@ -5,9 +5,54 @@
 # We don't need to check for ip= errors here, that is handled by the
 # 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
 
 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
 do_dhcp() {
@@ -50,7 +95,11 @@ do_ipv6auto() {
 
 
     echo online > /sys/class/net/$netif/uevent
-    initqueue --onetime --name netroot-$netif netroot $netif
+    if [ -n "$manualup" ]; then
+        /sbin/netroot $netif -m
+    else
+        initqueue --onetime --name netroot-$netif netroot $netif
+    fi
 }
 
 # Handle static ip configuration
@@ -77,47 +126,12 @@ do_static() {
     fi >> /tmp/net.$netif.resolv.conf
 
     echo online > /sys/class/net/$netif/uevent
-    initqueue --onetime --name netroot-$netif netroot $netif
-}
-
-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
+    if [ -n "$manualup" ]; then
+        /sbin/netroot $netif -m
+    else
+        initqueue --onetime --name netroot-$netif netroot $netif
     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
 if [ "$netif" = "lo" ] ; then
@@ -228,5 +242,4 @@ for p in $(getargs ip=); do
     esac
     break
 done
-
 exit 0
index bda34df4e00e5d9c74a60f43fd9ca94ec42c8e2a..f44a97ba9907a3cee668e74c8495582b576a3b78 100755 (executable)
@@ -3,7 +3,6 @@
 # ex: ts=8 sw=4 sts=4 et filetype=sh
 
 PATH=/usr/sbin:/usr/bin:/sbin:/bin
-
 type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
 
 # Huh? Empty $1?
@@ -12,12 +11,16 @@ type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
 # Huh? No interface config?
 [ ! -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
 [ -e /tmp/root.info ] || exit 1
 . /tmp/root.info
-[ -d $NEWROOT/proc ] && exit 0
-[ -z "$netroot" ] && exit 1
+if [ -z "$2" ]; then
+    [ -d $NEWROOT/proc ] && exit 0
+    [ -z "$netroot" ] && exit 1
+fi
 
 # Let's see if we have to wait for other interfaces
 # Note: exit works just fine, since the last interface to be
@@ -31,43 +34,49 @@ done
 netif=$1
 [ -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
-# handlers
-if [ "$netroot" = "dhcp" ] || [ "$netroot" = "dhcp6" ] ; 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
+# handlers when this is not called from manually network bringing up.
+if [ -z "$2" ]; then
+    if [ "$netroot" = "dhcp" ] || [ "$netroot" = "dhcp6" ] ; 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
+        # Set netroot to new_root_path, so cmdline parsers don't call
+        netroot=$new_root_path
 
-    # FIXME!
-    for f in $hookdir/cmdline/90*.sh; do
-        [ -f "$f" ] && . "$f";
-    done
-else
-    rootok="1"
-fi
+        # FIXME!
+        for f in $hookdir/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'"
+    # 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=$(command -v ${handler}root)
-if [ -z "$netroot" ] || [ ! -e "$handler" ] ; then
-    die "No handler for netroot type '$netroot'"
+    handler=${netroot%%:*}
+    handler=${handler%%4}
+    handler=$(command -v ${handler}root)
+    if [ -z "$netroot" ] || [ ! -e "$handler" ] ; then
+        die "No handler for netroot type '$netroot'"
+    fi
 fi
 
 # 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"
 fi
 
+# exit in case manually bring up network
+[ -n "$2" ] && exit 0
+
 # Source netroot hooks before we start the handler
 source_all $hookdir/netroot