Package: ifenslave
Version: 2.12
Severity: important
Dear Maintainer,
Bonding on Debian 11 Bullseye is not working, when using "bond-slaves int1
int2" syntax on the bonding interface.
However it seems to work, when defining bonding the other way around using
"bond-master bond1" on the interfaces which make up the bonding interface.
I came across bug #968368 and modified the ifenslave pre-up.d script, hence the
changes below.
The same config (using bond-slaves) was working fine in Debian Buster. In
Bullseye the bond interface stays DOWN and /proc/net/bonding/bond* also shows
mii-status down.
-- System Information:
Debian Release: 11.0
APT prefers testing-security
APT policy: (500, 'testing-security'), (500, 'testing')
Architecture: amd64 (x86_64)
Kernel: Linux 5.10.0-7-amd64 (SMP w/24 CPU threads)
Kernel taint flags: TAINT_FIRMWARE_WORKAROUND
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8),
LANGUAGE=en_US:en
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
Versions of packages ifenslave depends on:
ii ifupdown 0.8.36
ii iproute2 5.10.0-4
Versions of packages ifenslave recommends:
ii net-tools 1.60+git20181103.0eebece-1
ifenslave suggests no packages.
-- Configuration Files:
/etc/network/if-pre-up.d/ifenslave changed:
[ "$VERBOSITY" = 1 ] && set -x
[ "$ADDRFAM" = meta ] && exit 0
add_master()
{
# Return if $IFACE is already a bonding interface.
[ -f "/sys/class/net/$IFACE/bonding/slaves" ] && return
ip link add dev "$IFACE" type bond
}
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 [ -n "$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 [ -n "$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()
{
# Warning: the order in which we write into the sysfs files is
important.
# Double check in drivers/net/bonding/bond_sysfs.c in the 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"
}
enslave_slaves()
{
case "$BOND_SLAVES" in
none)
BOND_SLAVES=""
;;
all)
BOND_SLAVES=$(sed -ne 's/ *\(eth[^:]*\):.*/\1/p'
/proc/net/dev)
;;
esac
[ "$VERBOSITY" = 1 ] && v=-v
for slave in $BOND_SLAVES ; do
export IFENSLAVE_ENV_NAME="IFUPDOWN_$slave"
IFUPDOWN_IFACE="$(printenv "$IFENSLAVE_ENV_NAME")"
unset IFENSLAVE_ENV_NAME
#if ifquery --state "$slave" 2>/dev/null || [ -n
"$IFUPDOWN_IFACE" ] ; then
if ifquery --state "$slave" 2>/dev/null ; then
# Skipping interface that's already up or being
configured
continue
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 useful to bring up slaves that need
extra setup.
ifup $v --allow "$BOND_MASTER" "$slave"
fi
fi
done
}
setup_master()
{
# Warning: the order in which we write into the sysfs files is
important.
# Double check in drivers/net/bonding/bond_s