LinuxXXI · Advanced Linux NetworkingTeaming
NIC teaming - the userspace alternative to bonding
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
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
| Runner | Equivalent bonding mode |
|---|---|
roundrobin | balance-rr (mode 0) |
activebackup | active-backup (mode 1) |
loadbalance | balance-xor (mode 2) |
lacp | 802.3ad (mode 4) |
broadcast | broadcast (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:
- Capture the team state (
teamdctl team0 state view). - Bring the team down.
- Remove the team and slave connections.
- Create the bond with the equivalent mode (likely 802.3ad).
- Bring the bond up.
- Verify with
ipand/proc/net/bonding/bond0.
A maintenance window is recommended.
Knowledge check
Knowledge check · 3 questions
Q1. Which command shows the state of a team device?
Q2. For new designs in 2026, the kernel bonding driver is usually preferred over teamd.
Q3. Which of the following are teamd runners? Select all that apply.
Passing score: 75%. Answers are checked in this browser.