Skip to main content
RunBook Academy

LinuxXXI · Advanced Linux NetworkingTeaming

NIC teaming - the userspace alternative to bonding

Intermediate⏱ ~8 minteamdteamnl

What you'll learn

  • Describe how teamd differs from the kernel bonding driver
  • List the runner types teamd supports
  • Recognise when teamd is the right choice
  • Disable teamd in favour of bonding when appropriate

Prerequisites

Verified against Ubuntu 24.04 LTS · Debian 12 (Bookworm) · RHEL 9.x · Rocky Linux 9.x · AlmaLinux 9.x · Linux kernel 6.1 LTS / 6.6 LTS · systemd 255+ · OpenSSH 8.7p1 (RHEL 9) / 9.6p1 (Ubuntu 24.04) · nftables 1.0.x · chrony 4.x · Pacemaker 2.1.x · Corosync 3.1.x · 2026-08-09

Not yet marked complete on this device.

teamd is a userspace alternative to the kernel bonding driver. It uses the team netlink interface and runs in userspace; the kernel just provides a passthrough device. Team was introduced as a replacement for bonding in RHEL 7 but the kernel bonding driver has since caught up and is now generally preferred.

When to use teamd

In 2026, bonding is the right choice for almost every case. Teamd exists for historical reasons and for niche cases where userspace logic is needed (rare). The only realistic argument for teamd today is:

  • You need a custom runner (e.g. an in-house load-balancing algorithm not implemented by the kernel).

If you are starting fresh, use bonding. If you inherit a host with teamd, understand how to read its state and migrate to bonding when convenient.

teamd runners

RunnerEquivalent bonding mode
roundrobinbalance-rr (mode 0)
activebackupactive-backup (mode 1)
loadbalancebalance-xor (mode 2)
lacp802.3ad (mode 4)
broadcastbroadcast (mode 3)

The lacp runner is the most common. It behaves the same as bonding mode 4 from the network’s perspective.

Inspect an existing team

teamdctl team0 state
teamdctl team0 state view
ip link show team0

teamdctl <team> state view shows the runner, link watch, and per-port status:

setup:
  runner: lacp
  ...
ports:
  eth0
    link watches:
      link summary: up
      ...
  eth1
    link summary: up
runner:
  active: yes
  ...

Configuration

teamd reads a JSON config file or accepts runtime configuration. RHEL’s nmcli produces the JSON behind the scenes:

sudo nmcli connection add \
  type team \
  con-name team0 \
  ifname team0 \
  config '{"runner": {"name": "lacp"}}'

sudo nmcli connection add \
  type ethernet \
  slave-type team \
  con-name team0-port-eth0 \
  ifname eth0 \
  master team0

Migrate to bonding

If you have a host running teamd and want to migrate to bonding:

  1. Capture the team state (teamdctl team0 state view).
  2. Bring the team down.
  3. Remove the team and slave connections.
  4. Create the bond with the equivalent mode (likely 802.3ad).
  5. Bring the bond up.
  6. Verify with ip and /proc/net/bonding/bond0.

A maintenance window is recommended.

Knowledge check

Knowledge check · 3 questions

  1. Q1. Which command shows the state of a team device?

  2. Q2. For new designs in 2026, the kernel bonding driver is usually preferred over teamd.

  3. Q3. Which of the following are teamd runners? Select all that apply.

Passing score: 75%. Answers are checked in this browser.