[Bug 1269921] [NEW] networking services restart hangs due to missing /etc/network/run/ifenslave.* files
Keegan Holley
keeganh at aweber.com
Thu Jan 16 20:01:43 UTC 2014
Public bug reported:
Ubuntu 12.04 LTS
ifenslave-2.6
ifup hangs when bonds are configured and networking is restarted via
'/etc/init.d/networking restart'. The script in '/etc/network/if-pre-
up.d' does not recognize the bond master and hangs because the
'/etc/network/run/ifenslave.*' files are not created.
##/etc/network/if-pre-up.d/ifenslave
#!/bin/sh
[ "$VERBOSITY" = 1 ] && set -x
IFSTATE=/run/network/ifstate
add_master()
{
# Return if $BOND_MASTER is already a bonding interface.
[ -f "/sys/class/net/$BOND_MASTER/bonding/slaves" ] && return
# If the bonding module is not yet loaded, load it.
if [ ! -r /sys/class/net/bonding_masters ]; then
modprobe -q bonding
FAILED=1
echo "Waiting for bonding kernel module to be ready (will timeout after 5s)"
for i in $(seq 50); do
if [ -r /sys/class/net/bonding_masters ]; then
FAILED=0
break
fi
sleep 0.1
done
if [ "$FAILED" = "1" ]; then
echo "/sys/class/net/bonding_masters doesn't exist. Unable to create $BOND_MASTER"
exit 1
fi
fi
# Create the master interface.
if ! grep -sq "\\<$BOND_MASTER\\>" /sys/class/net/bonding_masters; then
echo "+$BOND_MASTER" > /sys/class/net/bonding_masters
fi
}
sysfs_change_down()
{
# Called with :
# $1 = basename of the file in bonding/ to write to.
# $2 = value to write. Won't write if $2 is empty.
if [ "$2" ] ; then
# If the value we plan to write is different from the current one...
if ! grep -sq "\\<$2\\>" "/sys/class/net/$BOND_MASTER/bonding/$1" ; then
# ...and the master is up...
if ip link show "$BOND_MASTER" | grep -sq '[<,]UP[,>]' ; then
# ...bring the master down.
ip link set dev "$BOND_MASTER" down
fi
fi
sysfs "$1" "$2"
fi
}
sysfs()
{
# Called with :
# $1 = basename of the file in bonding/ to write to.
# $2 = value to write. Won't write if $2 is empty.
if [ "$2" ] ; then
echo "$2" > "/sys/class/net/$BOND_MASTER/bonding/$1"
return $?
fi
return 0
}
sysfs_add()
{
#??Called with :
# $1 = target filename.
# $2 = values to write.
for value in $2; do
# Do not add $2 to $1 if already present.
if ! grep -sq "\\<$value\\>" /sys/class/net/$BOND_MASTER/bonding/$1
then
sysfs "$1" "+$value"
fi
done
}
# early_setup_master is the place where we do master setup that need to be done before enslavement.
early_setup_master()
{
# Warning: the order in wich we write into the sysfs files is important.
# Double check in drivers/net/bonding/bond_sysfs.c in linux kernel source tree
# before changing anything here.
# fail_over_mac must be set before enslavement of any slaves.
sysfs fail_over_mac "$IF_BOND_FAIL_OVER_MAC"
}
# late_setup_master runs actions that need to happen after enslavement
late_setup_master()
{
# primary must be set after mode (because only supported in some modes) and after enslavement.
# The first slave in bond-primary found in current slaves becomes the primary.
# If no slave in bond-primary is found, then primary does not change.
for slave in $IF_BOND_PRIMARY ; do
if grep -sq "\\<$slave\\>" "/sys/class/net/$BOND_MASTER/bonding/slaves" ; then
sysfs primary "$slave"
break
fi
done
# primary_reselect should be set after mode (because only supported in some modes), after enslavement
# and after primary. This is currently (2.6.35-rc1) not enforced by the bonding driver, but it is
# probably safer to do it in that order.
sysfs primary_reselect "$IF_BOND_PRIMARY_RESELECT"
# queue_id must be set after enslavement.
for iface_queue_id in $IF_BOND_QUEUE_ID
do
sysfs iface_queue_id $iface_queue_id
done
# active_slave must be set after mode and after enslavement.
# The slave must be up and the underlying link must be up too.
# FIXME: We should have a way to write an empty string to active_slave, to set the active_slave to none.
if [ "$IF_BOND_ACTIVE_SLAVE" ] ; then
# Need to force interface up before. Bonding will refuse to activate a down interface.
ip link set "$IF_BOND_ACTIVE_SLAVE" up
sysfs active_slave "$IF_BOND_ACTIVE_SLAVE"
fi
}
enslave_slaves()
{
case "$BOND_SLAVES" in
none)
BOND_SLAVES=""
;;
all)
BOND_SLAVES=`sed -ne 's/ *\(eth[^:]*\):.*/\1/p' /proc/net/dev`
AUTOIF="yes"
;;
esac
[ "$VERBOSITY" = 1 ] && v=-v
for slave in $BOND_SLAVES ; do
if ( [ "$AUTOIF" ] && grep -q "^$slave=" $IFSTATE ) ; then
echo "Not enslaving interface $slave since it is already configured"
else
# Ensure $slave is down.
ip link set "$slave" down 2>/dev/null
if ! sysfs_add slaves "$slave" 2>/dev/null ; then
echo "Failed to enslave $slave to $BOND_MASTER. Is $BOND_MASTER ready and a bonding interface ?" >&2
else
# Bring up slave if it is the target of an allow-bondX stanza.
# This is usefull to bring up slaves that need extra setup.
if [ -z "$(which ifquery)" ] || ifquery --allow \"$BOND_MASTER\" --list | grep -q $slave; then
ifup $v --allow "$BOND_MASTER" "$slave"
fi
fi
fi
done
}
setup_master()
{
# Warning: the order in wich we write into the sysfs files is important.
# Double check in drivers/net/bonding/bond_sysfs.c in linux kernel source tree
# before changing anything here.
# use_carrier can be set anytime.
sysfs use_carrier "$IF_BOND_USE_CARRIER"
# num_grat_arp can be set anytime.
sysfs num_grat_arp "$IF_BOND_NUM_GRAT_ARP"
# num_unsol_na can be set anytime.
sysfs num_unsol_na "$IF_BOND_NUM_UNSOL_NA"
# xmit_hash_policy can be set anytime.
# Changing xmit_hash_policy requires $BOND_MASTER to be down.
sysfs_change_down xmit_hash_policy "$IF_BOND_XMIT_HASH_POLICY"
# arp_ip_target must be set before arp_interval.
sysfs_add arp_ip_target "$IF_BOND_ARP_IP_TARGET"
sysfs arp_interval "$IF_BOND_ARP_INTERVAL"
# miimon must be set before updelay and downdelay.
sysfs miimon "$IF_BOND_MIIMON"
sysfs downdelay "$IF_BOND_DOWNDELAY"
sysfs updelay "$IF_BOND_UPDELAY"
# Changing ad_select requires $BOND_MASTER to be down.
sysfs_change_down ad_select "$IF_BOND_AD_SELECT"
# Changing mode requires $BOND_MASTER to be down.
# Mode should be set after miimon or arp_interval, to avoid a warning in syslog.
sysfs_change_down mode "$IF_BOND_MODE"
# arp_validate must be after mode (because mode must be active-backup).
sysfs arp_validate "$IF_BOND_ARP_VALIDATE"
# lacp_rate must be set after mode (because mode must be 802.3ad).
# Changing lacp_rate requires $BOND_MASTER to be down.
sysfs_change_down lacp_rate "$IF_BOND_LACP_RATE"
# Finally bring the bond up, note that without a slave it won't be usable though
ip link set dev $BOND_MASTER up
}
# Option slaves deprecated, replaced by bond-slaves, but still supported for backward compatibility.
IF_BOND_SLAVES=${IF_BOND_SLAVES:-$IF_SLAVES}
if [ "$IF_BOND_MASTER" ] ; then
BOND_MASTER="$IF_BOND_MASTER"
BOND_SLAVES="$IFACE"
else
if [ "$IF_BOND_SLAVES" ] ; then
BOND_MASTER="$IFACE"
BOND_SLAVES="$IF_BOND_SLAVES"
fi
fi
# Exit if nothing to do...
[ -z "$BOND_MASTER$BOND_SLAVES" ] && exit
# Always try to create the master, returns if already exists
add_master
if [ "$BOND_MASTER" = "$IFACE" ]; then
# Setup the master interface
early_setup_master
setup_master
# Indicate that we're done setting up the master
# this is required as ifstate is modified at the beginning
# of the interface setup, not at the end
touch /run/network/ifenslave.$IFACE
# Wait for a slave to join, continuing without a slave
# would make dhclient, vconfig or brctl fail, so better wait
# Timeout after a minute
FAILED=1
echo "Waiting for a slave to join $BOND_MASTER (will timeout after 60s)"
for i in $(seq 600); do
if [ -n "$(cat /sys/class/net/$BOND_MASTER/bonding/slaves)" ]; then
FAILED=0
break
fi
sleep 0.1
done
if [ "$FAILED" = "1" ]; then
echo "No slave joined $BOND_MASTER, continuing anyway"
else
# Trigger the udev bridging hook to bridge the bond if needed
if [ -x /lib/udev/bridge-network-interface ]; then
INTERFACE=$BOND_MASTER /lib/udev/bridge-network-interface
fi
# Trigger the udev bridging hook to tag the bond if needed
if [ -x /lib/udev/vlan-network-interface ]; then
INTERFACE=$BOND_MASTER /lib/udev/vlan-network-interface
fi
fi
else
# Wait for the master to be ready
[ ! -f /run/network/ifenslave.$BOND_MASTER ] && echo "Waiting for bond master $BOND_MASTER to be ready"
while :; do
if [ -f /run/network/ifenslave.$BOND_MASTER ]; then
break
fi
sleep 0.1
done
# Only setup one slave at once
BOND_SLAVES=$IFACE enslave_slaves
# Call late_setup_master every time we add a slave as we don't have a way to know
# when all the slaves are up
BOND_SLAVES=$IFACE late_setup_master
fi
exit 0
## /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how they will be activated. For more information, see interfaces(5).
# chef managed!
auto eth1
iface eth1 inet manual
bond-master bond0
bond-primary eth1
# default bridge interface
auto backend
iface backend inet manual
bridge_fd 0
bridge_ports vlan10
bridge_stp off
# failover nic team
auto bond0
iface bond0 inet manual
bond-miimon 100
bond-mode active-backup
bond-primary eth1
bond-slaves none
# The VM network interface
auto eth0
iface eth0 inet static
address 10.0.2.15
broadcast 10.0.2.255
gateway 10.0.2.0
netmask 255.255.255.0
# The loopback interface
auto lo
iface lo inet loopback
# default vlan interface
auto vlan10
iface vlan10 inet manual
vlan_raw_device bond0
ProblemType: Bug
DistroRelease: Ubuntu 12.04
Package: ifenslave-2.6 1.1.0-19ubuntu5
ProcVersionSignature: Ubuntu 3.2.0-32.51-generic 3.2.30
Uname: Linux 3.2.0-32-generic x86_64
ApportVersion: 2.0.1-0ubuntu17.1
Architecture: amd64
Date: Thu Jan 16 17:34:48 2014
InstallationMedia: Ubuntu-Server 12.04.1 LTS "Precise Pangolin" - Release amd64 (20120817.3)
MarkForUpload: True
ProcEnviron:
TERM=xterm
PATH=(custom, no user)
LANG=en_US.UTF-8
SHELL=/bin/bash
SourcePackage: ifenslave-2.6
UpgradeStatus: No upgrade log present (probably fresh install)
** Affects: ifenslave-2.6 (Ubuntu)
Importance: Undecided
Status: New
** Tags: amd64 apport-bug precise
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to ifenslave-2.6 in Ubuntu.
https://bugs.launchpad.net/bugs/1269921
Title:
networking services restart hangs due to missing
/etc/network/run/ifenslave.* files
Status in “ifenslave-2.6” package in Ubuntu:
New
Bug description:
Ubuntu 12.04 LTS
ifenslave-2.6
ifup hangs when bonds are configured and networking is restarted via
'/etc/init.d/networking restart'. The script in '/etc/network/if-pre-
up.d' does not recognize the bond master and hangs because the
'/etc/network/run/ifenslave.*' files are not created.
##/etc/network/if-pre-up.d/ifenslave
#!/bin/sh
[ "$VERBOSITY" = 1 ] && set -x
IFSTATE=/run/network/ifstate
add_master()
{
# Return if $BOND_MASTER is already a bonding interface.
[ -f "/sys/class/net/$BOND_MASTER/bonding/slaves" ] && return
# If the bonding module is not yet loaded, load it.
if [ ! -r /sys/class/net/bonding_masters ]; then
modprobe -q bonding
FAILED=1
echo "Waiting for bonding kernel module to be ready (will timeout after 5s)"
for i in $(seq 50); do
if [ -r /sys/class/net/bonding_masters ]; then
FAILED=0
break
fi
sleep 0.1
done
if [ "$FAILED" = "1" ]; then
echo "/sys/class/net/bonding_masters doesn't exist. Unable to create $BOND_MASTER"
exit 1
fi
fi
# Create the master interface.
if ! grep -sq "\\<$BOND_MASTER\\>" /sys/class/net/bonding_masters; then
echo "+$BOND_MASTER" > /sys/class/net/bonding_masters
fi
}
sysfs_change_down()
{
# Called with :
# $1 = basename of the file in bonding/ to write to.
# $2 = value to write. Won't write if $2 is empty.
if [ "$2" ] ; then
# If the value we plan to write is different from the current one...
if ! grep -sq "\\<$2\\>" "/sys/class/net/$BOND_MASTER/bonding/$1" ; then
# ...and the master is up...
if ip link show "$BOND_MASTER" | grep -sq '[<,]UP[,>]' ; then
# ...bring the master down.
ip link set dev "$BOND_MASTER" down
fi
fi
sysfs "$1" "$2"
fi
}
sysfs()
{
# Called with :
# $1 = basename of the file in bonding/ to write to.
# $2 = value to write. Won't write if $2 is empty.
if [ "$2" ] ; then
echo "$2" > "/sys/class/net/$BOND_MASTER/bonding/$1"
return $?
fi
return 0
}
sysfs_add()
{
#??Called with :
# $1 = target filename.
# $2 = values to write.
for value in $2; do
# Do not add $2 to $1 if already present.
if ! grep -sq "\\<$value\\>" /sys/class/net/$BOND_MASTER/bonding/$1
then
sysfs "$1" "+$value"
fi
done
}
# early_setup_master is the place where we do master setup that need to be done before enslavement.
early_setup_master()
{
# Warning: the order in wich we write into the sysfs files is important.
# Double check in drivers/net/bonding/bond_sysfs.c in linux kernel source tree
# before changing anything here.
# fail_over_mac must be set before enslavement of any slaves.
sysfs fail_over_mac "$IF_BOND_FAIL_OVER_MAC"
}
# late_setup_master runs actions that need to happen after enslavement
late_setup_master()
{
# primary must be set after mode (because only supported in some modes) and after enslavement.
# The first slave in bond-primary found in current slaves becomes the primary.
# If no slave in bond-primary is found, then primary does not change.
for slave in $IF_BOND_PRIMARY ; do
if grep -sq "\\<$slave\\>" "/sys/class/net/$BOND_MASTER/bonding/slaves" ; then
sysfs primary "$slave"
break
fi
done
# primary_reselect should be set after mode (because only supported in some modes), after enslavement
# and after primary. This is currently (2.6.35-rc1) not enforced by the bonding driver, but it is
# probably safer to do it in that order.
sysfs primary_reselect "$IF_BOND_PRIMARY_RESELECT"
# queue_id must be set after enslavement.
for iface_queue_id in $IF_BOND_QUEUE_ID
do
sysfs iface_queue_id $iface_queue_id
done
# active_slave must be set after mode and after enslavement.
# The slave must be up and the underlying link must be up too.
# FIXME: We should have a way to write an empty string to active_slave, to set the active_slave to none.
if [ "$IF_BOND_ACTIVE_SLAVE" ] ; then
# Need to force interface up before. Bonding will refuse to activate a down interface.
ip link set "$IF_BOND_ACTIVE_SLAVE" up
sysfs active_slave "$IF_BOND_ACTIVE_SLAVE"
fi
}
enslave_slaves()
{
case "$BOND_SLAVES" in
none)
BOND_SLAVES=""
;;
all)
BOND_SLAVES=`sed -ne 's/ *\(eth[^:]*\):.*/\1/p' /proc/net/dev`
AUTOIF="yes"
;;
esac
[ "$VERBOSITY" = 1 ] && v=-v
for slave in $BOND_SLAVES ; do
if ( [ "$AUTOIF" ] && grep -q "^$slave=" $IFSTATE ) ; then
echo "Not enslaving interface $slave since it is already configured"
else
# Ensure $slave is down.
ip link set "$slave" down 2>/dev/null
if ! sysfs_add slaves "$slave" 2>/dev/null ; then
echo "Failed to enslave $slave to $BOND_MASTER. Is $BOND_MASTER ready and a bonding interface ?" >&2
else
# Bring up slave if it is the target of an allow-bondX stanza.
# This is usefull to bring up slaves that need extra setup.
if [ -z "$(which ifquery)" ] || ifquery --allow \"$BOND_MASTER\" --list | grep -q $slave; then
ifup $v --allow "$BOND_MASTER" "$slave"
fi
fi
fi
done
}
setup_master()
{
# Warning: the order in wich we write into the sysfs files is important.
# Double check in drivers/net/bonding/bond_sysfs.c in linux kernel source tree
# before changing anything here.
# use_carrier can be set anytime.
sysfs use_carrier "$IF_BOND_USE_CARRIER"
# num_grat_arp can be set anytime.
sysfs num_grat_arp "$IF_BOND_NUM_GRAT_ARP"
# num_unsol_na can be set anytime.
sysfs num_unsol_na "$IF_BOND_NUM_UNSOL_NA"
# xmit_hash_policy can be set anytime.
# Changing xmit_hash_policy requires $BOND_MASTER to be down.
sysfs_change_down xmit_hash_policy "$IF_BOND_XMIT_HASH_POLICY"
# arp_ip_target must be set before arp_interval.
sysfs_add arp_ip_target "$IF_BOND_ARP_IP_TARGET"
sysfs arp_interval "$IF_BOND_ARP_INTERVAL"
# miimon must be set before updelay and downdelay.
sysfs miimon "$IF_BOND_MIIMON"
sysfs downdelay "$IF_BOND_DOWNDELAY"
sysfs updelay "$IF_BOND_UPDELAY"
# Changing ad_select requires $BOND_MASTER to be down.
sysfs_change_down ad_select "$IF_BOND_AD_SELECT"
# Changing mode requires $BOND_MASTER to be down.
# Mode should be set after miimon or arp_interval, to avoid a warning in syslog.
sysfs_change_down mode "$IF_BOND_MODE"
# arp_validate must be after mode (because mode must be active-backup).
sysfs arp_validate "$IF_BOND_ARP_VALIDATE"
# lacp_rate must be set after mode (because mode must be 802.3ad).
# Changing lacp_rate requires $BOND_MASTER to be down.
sysfs_change_down lacp_rate "$IF_BOND_LACP_RATE"
# Finally bring the bond up, note that without a slave it won't be usable though
ip link set dev $BOND_MASTER up
}
# Option slaves deprecated, replaced by bond-slaves, but still supported for backward compatibility.
IF_BOND_SLAVES=${IF_BOND_SLAVES:-$IF_SLAVES}
if [ "$IF_BOND_MASTER" ] ; then
BOND_MASTER="$IF_BOND_MASTER"
BOND_SLAVES="$IFACE"
else
if [ "$IF_BOND_SLAVES" ] ; then
BOND_MASTER="$IFACE"
BOND_SLAVES="$IF_BOND_SLAVES"
fi
fi
# Exit if nothing to do...
[ -z "$BOND_MASTER$BOND_SLAVES" ] && exit
# Always try to create the master, returns if already exists
add_master
if [ "$BOND_MASTER" = "$IFACE" ]; then
# Setup the master interface
early_setup_master
setup_master
# Indicate that we're done setting up the master
# this is required as ifstate is modified at the beginning
# of the interface setup, not at the end
touch /run/network/ifenslave.$IFACE
# Wait for a slave to join, continuing without a slave
# would make dhclient, vconfig or brctl fail, so better wait
# Timeout after a minute
FAILED=1
echo "Waiting for a slave to join $BOND_MASTER (will timeout after 60s)"
for i in $(seq 600); do
if [ -n "$(cat /sys/class/net/$BOND_MASTER/bonding/slaves)" ]; then
FAILED=0
break
fi
sleep 0.1
done
if [ "$FAILED" = "1" ]; then
echo "No slave joined $BOND_MASTER, continuing anyway"
else
# Trigger the udev bridging hook to bridge the bond if needed
if [ -x /lib/udev/bridge-network-interface ]; then
INTERFACE=$BOND_MASTER /lib/udev/bridge-network-interface
fi
# Trigger the udev bridging hook to tag the bond if needed
if [ -x /lib/udev/vlan-network-interface ]; then
INTERFACE=$BOND_MASTER /lib/udev/vlan-network-interface
fi
fi
else
# Wait for the master to be ready
[ ! -f /run/network/ifenslave.$BOND_MASTER ] && echo "Waiting for bond master $BOND_MASTER to be ready"
while :; do
if [ -f /run/network/ifenslave.$BOND_MASTER ]; then
break
fi
sleep 0.1
done
# Only setup one slave at once
BOND_SLAVES=$IFACE enslave_slaves
# Call late_setup_master every time we add a slave as we don't have a way to know
# when all the slaves are up
BOND_SLAVES=$IFACE late_setup_master
fi
exit 0
## /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how they will be activated. For more information, see interfaces(5).
# chef managed!
auto eth1
iface eth1 inet manual
bond-master bond0
bond-primary eth1
# default bridge interface
auto backend
iface backend inet manual
bridge_fd 0
bridge_ports vlan10
bridge_stp off
# failover nic team
auto bond0
iface bond0 inet manual
bond-miimon 100
bond-mode active-backup
bond-primary eth1
bond-slaves none
# The VM network interface
auto eth0
iface eth0 inet static
address 10.0.2.15
broadcast 10.0.2.255
gateway 10.0.2.0
netmask 255.255.255.0
# The loopback interface
auto lo
iface lo inet loopback
# default vlan interface
auto vlan10
iface vlan10 inet manual
vlan_raw_device bond0
ProblemType: Bug
DistroRelease: Ubuntu 12.04
Package: ifenslave-2.6 1.1.0-19ubuntu5
ProcVersionSignature: Ubuntu 3.2.0-32.51-generic 3.2.30
Uname: Linux 3.2.0-32-generic x86_64
ApportVersion: 2.0.1-0ubuntu17.1
Architecture: amd64
Date: Thu Jan 16 17:34:48 2014
InstallationMedia: Ubuntu-Server 12.04.1 LTS "Precise Pangolin" - Release amd64 (20120817.3)
MarkForUpload: True
ProcEnviron:
TERM=xterm
PATH=(custom, no user)
LANG=en_US.UTF-8
SHELL=/bin/bash
SourcePackage: ifenslave-2.6
UpgradeStatus: No upgrade log present (probably fresh install)
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/ifenslave-2.6/+bug/1269921/+subscriptions
More information about the foundations-bugs
mailing list