From d136ca4eeb3d7be2beef210dcf51a18210900844 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Mon, 8 Apr 2013 17:47:49 +0800 Subject: [PATCH] network: support multiple bonding interfaces Currently dracut only support 1 bond, namyly bond0 by default. However multiple bonds configuration may be needed. For example in kdump, in 1st kernel, more than one bonds may be configured, and bondX other than bond0 is used as output interface to remote host which will store dump core. This patch can solve this problem, to write real bond information to initramfs, 2nd kdump kernel will use it to create the relevant bondX interface. Tested-by: Baoquan He Signed-off-by: Baoquan He --- modules.d/40network/ifup.sh | 15 ++++++++++----- modules.d/40network/net-genrules.sh | 9 ++++++--- modules.d/40network/parse-bond.sh | 6 +++--- modules.d/40network/parse-bridge.sh | 6 ------ modules.d/45ifcfg/write-ifcfg.sh | 9 +++++---- 5 files changed, 24 insertions(+), 21 deletions(-) diff --git a/modules.d/40network/ifup.sh b/modules.d/40network/ifup.sh index 815ab64..593f387 100755 --- a/modules.d/40network/ifup.sh +++ b/modules.d/40network/ifup.sh @@ -21,14 +21,18 @@ use_bridge='false' use_vlan='false' # enslave this interface to bond? -if [ -e /tmp/bond.info ]; then - . /tmp/bond.info +for i in /tmp/bond.*.info; do + [ -e "$i" ] || continue + unset bondslaves + unset bondname + . "$i" for slave in $bondslaves ; do if [ "$netif" = "$slave" ] ; then netif=$bondname + break 2 fi done -fi +done if [ -e /tmp/team.info ]; then . /tmp/team.info @@ -138,11 +142,12 @@ if [ "$netif" = "lo" ] ; then fi # start bond if needed -if [ -e /tmp/bond.info ]; then - . /tmp/bond.info +if [ -e /tmp/bond.${netif}.info ]; then + . /tmp/bond.${netif}.info if [ "$netif" = "$bondname" ] && [ ! -e /tmp/net.$bondname.up ] ; then # We are master bond device modprobe bonding + echo "+$netif" > /sys/class/net/bonding_masters ip link set $netif down # Stolen from ifup-eth diff --git a/modules.d/40network/net-genrules.sh b/modules.d/40network/net-genrules.sh index f4652b9..05fa5f3 100755 --- a/modules.d/40network/net-genrules.sh +++ b/modules.d/40network/net-genrules.sh @@ -28,11 +28,14 @@ fi fi # bond: attempt only the defined interface (override bridge defines) - if [ -e /tmp/bond.info ]; then - . /tmp/bond.info + for i in /tmp/bond.*.info; do + [ -e "$i" ] || continue + unset bondslaves + unset bondname + . "$i" # It is enough to fire up only one IFACES="$IFACES ${bondslaves%% *}" - fi + done if [ -e /tmp/team.info ]; then . /tmp/team.info diff --git a/modules.d/40network/parse-bond.sh b/modules.d/40network/parse-bond.sh index 983eb3a..25c51b8 100755 --- a/modules.d/40network/parse-bond.sh +++ b/modules.d/40network/parse-bond.sh @@ -54,8 +54,8 @@ if getarg bond >/dev/null; then fi # Make it suitable for initscripts export bondoptions=$(str_replace "$bondoptions" ";" ",") - echo "bondname=$bondname" > /tmp/bond.info - echo "bondslaves=\"$bondslaves\"" >> /tmp/bond.info - echo "bondoptions=\"$bondoptions\"" >> /tmp/bond.info + echo "bondname=$bondname" > /tmp/bond.${bondname}.info + echo "bondslaves=\"$bondslaves\"" >> /tmp/bond.${bondname}.info + echo "bondoptions=\"$bondoptions\"" >> /tmp/bond.${bondname}.info return fi diff --git a/modules.d/40network/parse-bridge.sh b/modules.d/40network/parse-bridge.sh index 1f027bb..8c305c0 100755 --- a/modules.d/40network/parse-bridge.sh +++ b/modules.d/40network/parse-bridge.sh @@ -37,12 +37,6 @@ parsebridge() { unset bridgename ethnames iface=eth0 -if [ -e /tmp/bond.info ]; then - . /tmp/bond.info - if [ -n "$bondname" ] ; then - iface=$bondname - fi -fi # Parse bridge for bridgename and ethnames if bridge="$(getarg bridge)"; then diff --git a/modules.d/45ifcfg/write-ifcfg.sh b/modules.d/45ifcfg/write-ifcfg.sh index f7a476c..16da5e4 100755 --- a/modules.d/45ifcfg/write-ifcfg.sh +++ b/modules.d/45ifcfg/write-ifcfg.sh @@ -9,10 +9,6 @@ udevadm settle --timeout=30 read IFACES < /tmp/net.ifaces -if [ -e /tmp/bond.info ]; then - . /tmp/bond.info -fi - if [ -e /tmp/bridge.info ]; then . /tmp/bridge.info fi @@ -89,6 +85,11 @@ for netif in $IFACES ; do # bridge? unset bridge unset bond + unset bondslaves + unset bondname + unset bondoptions + [ -e /tmp/bond.${netif}.info ] && . /tmp/bond.${netif}.info + uuid=$(cat /proc/sys/kernel/random/uuid) if [ "$netif" = "$bridgename" ]; then bridge=yes