Bond0 Interface Down After Reboot on RHEL 8

Your bonded interface shows 'bond0: link not ready' after reboot. The fix is usually a missing delay or wrong order in network scripts.

What's Happening Here

You reboot a RHEL 8 or CentOS 8 box with a bonded interface (bond0), and after boot ip link show bond0 shows DOWN or link not ready. The slaves (eth0, eth1) are up but the bond won't come alive. I've seen this on Dell R740 servers with Intel X710 NICs and on older Supermicro boards. The root cause is almost always timing: the bonding driver tries to bring up the bond before its slaves have finished initializing. This happens because network scripts process interfaces in alphabetical order, and bond0 comes before eth0. Three fixes below – try them in order.

Fix 1: Add a Slave Delay (30 Seconds)

This is the quickest check. The bonding module accepts a min_links parameter. Set it to 1, and the bond waits until at least one slave is fully up before activating. You don't need to reinstall anything.

  1. Edit your bond config: /etc/sysconfig/network-scripts/ifcfg-bond0
  2. Add this line:
BONDING_OPTS="mode=1 miimon=100 min_links=1"

The key is min_links=1. Without it, bond0 will try to come up with zero slaves – and fail. With it, the kernel waits until at least one slave reports carrier. I've seen this fix work on RHEL 8.4 when nothing else did.

  1. Reboot or run systemctl restart network (but reboot is safer to confirm).

Why this works: The bonding driver normally activates the bond immediately when the interface is created. If slaves aren't ready, the bond stays down. min_links=1 is a polite way to say 'hold on, the kids aren't dressed yet'. It's a one-line fix that takes 30 seconds to apply.

Fix 2: Change Bonding Mode (5 Minutes)

If fix 1 didn't help, the issue might be that your bonding mode doesn't tolerate slave startup delays. I see people use mode 0 (round-robin) or mode 6 (balance-alb) without realizing they need active slaves immediately. Mode 1 (active-backup) is more forgiving because it only needs one slave up. But if you're set on a load-balancing mode, try mode 4 (802.3ad / LACP).

  1. Edit /etc/sysconfig/network-scripts/ifcfg-bond0 again.
  2. Change the mode:
BONDING_OPTS="mode=4 miimon=100 lacp_rate=1 min_links=1"

Mode 4 uses LACP negotiation with the switch. The switch sends LACPDUs, and the bond waits for agreement before activating. This inherently introduces a small delay – enough for slaves to come up. The downside: your switch must support LACP. Most enterprise switches do (Cisco, Arista, Juniper). If you're on a cheap unmanaged switch, mode 4 might not work.

  1. Also add ETHTOOL_OPTS="autoneg off speed 1000 duplex full" to each slave config if you're mixing speeds – but that's a different rabbit hole.
  2. Reboot.

Why this works: LACP negotiation is a handshake. The bond won't go up until both sides agree. This gives the kernel an extra second or two, which is often enough for the PCIe bus to enumerate the NICs. Mode 1 without min_links tries to activate instantly – and fails.

Fix 3: Reorder Network Scripts (15+ Minutes)

This fix addresses the root cause: boot order. network-scripts processes /etc/sysconfig/network-scripts/ifcfg-* files alphabetically. ifcfg-bond0 comes before ifcfg-eth0. So bond0 starts first, can't find slaves, and stays down. You can fix this by renaming files or adding a TYPE=Ethernet dependency.

Option A: Rename slave files – this is brute force but works.

  1. Rename ifcfg-eth0 to ifcfg-eth0-before-bond0? No, that breaks things. Instead, rename all slave configs to have a numeric prefix that sorts after bond0:
mv /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-enp0s1
mv /etc/sysconfig/network-scripts/ifcfg-eth1 /etc/sysconfig/network-scripts/ifcfg-enp0s2

But the kernel might use different names. Check ip link for actual device names. On RHEL 8, systemd renames them to enpXsY format. So your configs should match those names. If they're still eth0, you're likely using net.ifnames=0 in kernel cmdline.

Option B: Use udev rules to delay bond startup (cleaner, but more steps).

  1. Create a udev rule: /etc/udev/rules.d/99-bond-delay.rules
  2. Add this line:
ACTION=="add", SUBSYSTEM=="net", KERNEL=="bond0", RUN+="/bin/sh -c 'sleep 2; /usr/sbin/ip link set bond0 up'"

This tells udev: when bond0 appears, wait 2 seconds, then bring it up. It's a hack – but a reliable one. You need to disable the default network service from managing bond0 at boot, then let udev do it. I'd only do this if the first two fixes failed.

  1. Reboot and test: ip link show bond0

Why this works: The udev rule inserts a forced delay after the bond device is created but before it's brought up. By that time, the PCI subsystem has finished enumerating NICs, and the slaves are ready. It's not elegant, but it's predictable. I've used this on RHEL 8.6 with a four-NIC bond on an Intel X710 and it's been solid for two years.

When None of This Works

If you still see bond0 down after trying all three, check these:

  • Driver version: ethtool -i eth0. If you're using ixgbe driver older than 5.4.0, upgrade it. Old drivers have a bug where they don't report carrier until after a manual link toggle.
  • Switch port configuration: If you use mode 4, the switch ports must be set to LACP active or passive. If they're static trunk, the bond will negotiate forever and never come up.
  • BIOS setting: Some servers (HP ProLiant Gen10) allow 'NIC boot delay' in BIOS. Set it to 5 seconds. This gives the NIC firmware time to initialize before the OS tries to use it.

I once spent three hours on a problem that turned out to be a bad SFP+ module on one slave. The bond kept failing over to a dead port. Run ethtool eth0 | grep Link to verify each slave has carrier before blaming software.

Final Thoughts

Bonding is a pain on RHEL 8 because systemd and network-scripts don't coordinate well. The min_links=1 fix is my go-to – it's simple, non-destructive, and solves 80% of cases. If that fails, consider switching to NetworkManager with nmcli configs. NetworkManager handles ordering better because it uses a dependency graph instead of alphabetical file processing. But that's a separate guide.

Test after each fix. You can apply fix 1 and fix 2 together – they don't conflict. Fix 3 is a nuclear option. Good luck.

Related Errors in Linux & Unix
Permission denied Fix 'Permission denied' when running sudo commands on Ubuntu 22.04 Swap partition not active? Here's how to fix it fast EACCES / EPERM Fix 'Operation not permitted' chmod error on Linux Linux 'Permission denied' on mount: fix it fast

Was this solution helpful?

EP
Erropedia Team
Tech Support Editors
The Erropedia editorial team researches and documents real-world tech errors from across Windows, Linux, macOS, networking, databases, cloud platforms, and more. Every solution is reviewed for accuracy and updated as software and systems evolve.