Fullmoon System

Linux bonding-configuratie: verschillen per modus en active-backup op CentOS 7.9

AI_Manager

Linux bonding is een functionaliteit waarmee twee of meer fysieke netwerkinterfaces worden samengevoegd tot één logische interface. Dit maakt het mogelijk om bij een storing over te schakelen naar een ander communicatiepad of om de belasting over meerdere verbindingen te verdelen, al hangt het effect af van de gekozen modus en de switchconfiguratie. Dit artikel vat de verschillen per modus samen en behandelt vervolgens hoe u active-backup bonding configureert en herstelt in de network-scripts-omgeving van CentOS 7.9.

Toepassingsgebied: Dit is een onderhoudsvoorbeeld voor een omgeving met statische IPv4-adressen die wordt beheerd door network.service. Aangezien de ondersteuning voor CentOS Linux 7 op 30 juni 2024 is beëindigd, dient dit niet als standaard voor nieuwe servers te worden gebruikt. Officiële aankondiging van het einde van de ondersteuning voor CentOS Linux

Wat u wel en niet kunt bereiken met bonding

active-backup gebruikt slechts één NIC voor communicatie en schakelt bij een storing over naar de andere NIC. Zelfs als u twee 1Gbps NIC’s bundelt, blijft de communicatiebandbreedte tijdens normaal bedrijf beperkt tot de snelheid van één actieve NIC. Daarentegen kunnen load-balancing-modi zoals LACP meerdere stromen over verschillende NIC’s verdelen. De snelheid van een enkele verbinding neemt echter niet altijd toe in verhouding tot het aantal NIC’s.

Bonding maakt gebruik van de Linux bonding-driver. Netwerk-teaming op basis van teamd is een afzonderlijke implementatie die voor hetzelfde doel kan worden gebruikt; combineer deze twee configuratiemethoden daarom niet. Zelfs als de link wordt verbroken, kan de communicatie worden onderbroken als de gehele switch, de bovenliggende router of hetzelfde stroomcircuit tegelijkertijd uitvalt.

Bonding-modi en switchconfiguratie

De vergelijking is gebaseerd op een standaard serveromgeving die is verbonden met een switch. Voor directe verbindingen of speciale topologieën is afzonderlijke validatie vereist.

Modus Werking Vereisten aan switchzijde Aandachtspunten bij selectie
0: balance-rr Verdeelt uitgaande pakketten in volgorde over de NIC’s Vereist doorgaans statische poortaggregatie Pakketvolgorde kan veranderen
1: active-backup Eén actieve NIC, schakelt over bij storing LACP of statische aggregatie niet vereist Geen snelheidsoptelling
2: balance-xor Selectie van verzendpad op basis van hash-beleid Vereist doorgaans statische poortaggregatie Geen LACP-onderhandelingsmodus
3: broadcast Verzendt hetzelfde pakket naar alle NIC’s Vereist doorgaans poortaggregatie Dit is verkeersreplicatie, geen optelling van doorvoersnelheid
4: 802.3ad / LACP Verdeelt stromen binnen de aggregatiegroep Vereist LACP-configuratie op de corresponderende poorten Controleer de snelheid, duplex en het hash-beleid van dezelfde aggregatiegroep
5: balance-tlb Verzenddistributie, ontvangst via één NIC Geen speciale aggregatie-instellingen vereist Controleer ondersteuning door de driver
6: balance-alb Voegt IPv4-ontvangstdistributie toe aan TLB Geen speciale aggregatie-instellingen vereist Afhankelijk van ARP-onderhandeling en ondersteuning voor MAC-wijzigingen

In tegenstelling tot modus 5 kan modus 6 ook IPv4-ontvangst distribueren. Maak onderscheid tussen statische aggregatie voor modus 0, 2, 3 en LACP voor modus 4. Raadpleeg voor gedetailleerde voorwaarden de sectie over modi en switchconfiguratie in de Linux-kernel bonding-documentatie.

Controleer de werkomgeving en de situatie vóór wijzigingen

In het voorbeeld worden eth0 en eth1 verbonden met bond0, waarbij het serveradres wordt ingesteld op 192.168.1.100/24 en de gateway op 192.168.1.1. Vervang deze door de werkelijke namen en adressen en controleer op IP-conflicten en of de gateway zich in hetzelfde subnet bevindt. Verbind de poorten met hetzelfde VLAN en netwerk, en groepeer poorten voor active-backup niet in een LACP-groep.

Het toepassen van netwerkinstellingen onderbreekt de communicatie van de betreffende NIC. Voer dit niet alleen uit via een SSH-verbinding, maar zorg voor een onafhankelijk beheerpad zoals IPMI, iDRAC of een virtualisatieconsole, en reserveer onderhoudstijd. Als u VLAN’s, bridges, virtuele IP’s, meerdere standaardroutes, policy routing of IPv6 gebruikt, is een apart plan nodig om deze instellingen naar de bond te migreren. De onderstaande automatische generator is geen hulpmiddel om dergelijke configuraties volledig te converteren.

cat /etc/centos-release
uname -r
ip -br link
ip -br address
ip route show table all
ip rule show
systemctl is-active network
systemctl is-active NetworkManager
modinfo bonding
ethtool eth0
ethtool eth1

Controleer of network de bestaande beheerinstantie is en of NetworkManager inactief is. Stop voor servers die door NetworkManager worden beheerd de service niet vanwege dit voorbeeld, maar gebruik de nmcli bonding-procedure voor die omgeving. Zorg ervoor dat beide tools niet tegelijkertijd dezelfde NIC beheren.

modinfo bonding wordt gebruikt om module-informatie op te vragen. Aangezien de bonding-driver is opgenomen in de kernels van standaarddistributies, moet u niet zomaar een apart kmod-bonding-pakket installeren alleen omdat deze niet in lsmod staat. Als modinfo zelf mislukt, controleer dan eerst of de momenteel actieve kernel overeenkomt met de geïnstalleerde modulepakketten.

De voltooide vorm van het ifcfg-bestand

Plaats IP, gateway en bonding-opties in /etc/sysconfig/network-scripts/ifcfg-bond0. miimon=100 is een linkstatusbewaking met intervallen van 100 milliseconden; dit garandeert niet de communicatiemogelijkheid van het gehele bovenliggende pad.

DEVICE=bond0
NAME=bond0
TYPE=Bond
BONDING_MASTER=yes
BOOTPROTO=none
ONBOOT=yes
NM_CONTROLLED=no
IPADDR=192.168.1.100
PREFIX=24
GATEWAY=192.168.1.1
DEFROUTE=yes
PEERDNS=no
IPV6INIT=no
BONDING_OPTS="mode=active-backup miimon=100"

PEERDNS=no zorgt ervoor dat DNS-instellingen in dit profiel niet worden gewijzigd. Controleer na toepassing of bestaande naamomzetting nog steeds werkt. De IPV6INIT=no in dit voorbeeld geeft aan dat het uitsluitend voor IPv4 is; pas dit niet ongewijzigd toe op servers die IPv6 gebruiken.

Wijs geen dubbele IP-adressen of standaardgateways toe aan fysieke NIC’s en stel MASTER en SLAVE in. Hieronder volgt de inhoud van twee verschillende bestanden.

# /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
NM_CONTROLLED=no
MASTER=bond0
SLAVE=yes
IPV6INIT=no

# /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
NAME=eth1
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
NM_CONTROLLED=no
MASTER=bond0
SLAVE=yes
IPV6INIT=no

Er mogen geen dubbele ifcfg-bestanden of afzonderlijke profielen die automatisch starten voor dezelfde NIC achterblijven. Specificeer bonding-specifieke opties in BONDING_OPTS. Als er een correcte ifcfg-configuratie aanwezig is, laadt het netwerkscript de benodigde modules, dus het is niet nodig om telkens regels toe te voegen aan /etc/modules-load.d/bonding.conf. RHEL 7 officiële ifcfg bonding-configuratie

Bash-script voor het maken van back-ups en kandidaat-instellingen

Sla de onderstaande inhoud op als prepare-bond.sh en pas de variabelen aan uw omgeving aan. Maak een back-up van de huidige ifcfg- en netwerkstatus in een map die alleen toegankelijk is voor root en genereer de nieuwe instellingen in een apart pad. Het overschrijven van de werkelijke ifcfg-bestanden of het herstarten van de NIC’s gebeurt in de volgende sectie.

#!/bin/bash
# Exclusief voor CentOS 7.9 / network.service: maak alleen back-ups en kandidaat-instellingen aan.
set -euo pipefail
umask 077

BOND_DEVICE="bond0"
ETH0_DEVICE="eth0"
ETH1_DEVICE="eth1"
IP_ADDRESS="192.168.1.100"
PREFIX="24"
GATEWAY="192.168.1.1"
CFG_DIR="/etc/sysconfig/network-scripts"

die() { printf '%s\n' "$*" >&2; exit 1; }
valid_ipv4() {
  local value="$1" octet a b c d
  [[ "$value" =~ ^[0-9]{1,3}(\.[0-9]{1,3}){3}$ ]] || return 1
  IFS=. read -r a b c d <<< "$value"
  for octet in "$a" "$b" "$c" "$d"; do
    (( 10#$octet <= 255 )) || return 1
  done
}

[[ "$EUID" -eq 0 ]] || die "root로 실행하세요."
[[ -d "$CFG_DIR" ]] || die "network-scripts 경로가 없습니다."
for nic in "$BOND_DEVICE" "$ETH0_DEVICE" "$ETH1_DEVICE"; do
  [[ "$nic" =~ ^[a-zA-Z0-9_-]{1,15}$ ]] || die "인터페이스 이름을 확인하세요."
done
[[ "$ETH0_DEVICE" != "$ETH1_DEVICE" ]] || die "서로 다른 물리 NIC가 필요합니다."
[[ "$BOND_DEVICE" != "$ETH0_DEVICE" && "$BOND_DEVICE" != "$ETH1_DEVICE" ]] ||
  die "bond 이름이 물리 NIC와 같습니다."
[[ ! -e "/sys/class/net/$BOND_DEVICE" && ! -e "$CFG_DIR/ifcfg-$BOND_DEVICE" ]] ||
  die "기존 bond가 있습니다. 기존 구성 변경은 이 예제 범위 밖입니다."
valid_ipv4 "$IP_ADDRESS" || die "IP 주소 형식이 잘못되었습니다."
valid_ipv4 "$GATEWAY" || die "게이트웨이 주소 형식이 잘못되었습니다."
[[ "$GATEWAY" != "$IP_ADDRESS" ]] || die "게이트웨이는 서버 자신과 달라야 합니다."
[[ "$PREFIX" =~ ^([1-9]|[12][0-9]|3[0-2])$ ]] || die "PREFIX는 1~32여야 합니다."
systemctl is-active --quiet network ||
  die "기존 network.service 환경에서만 사용하세요."
if systemctl is-active --quiet NetworkManager; then
  die "NetworkManager 환경입니다. 해당 환경의 nmcli 본딩 절차를 사용하세요."
fi

modinfo bonding >/dev/null
for nic in "$ETH0_DEVICE" "$ETH1_DEVICE"; do
  [[ -e "/sys/class/net/$nic" ]] || die "NIC가 없습니다: $nic"
  [[ -f "$CFG_DIR/ifcfg-$nic" ]] || die "기존 ifcfg 파일이 없습니다: $nic"
  [[ ! -L "/sys/class/net/$nic/master" ]] || die "이미 다른 장치에 종속된 NIC입니다: $nic"
  [[ ! -e "$CFG_DIR/route-$nic" && ! -e "$CFG_DIR/rule-$nic" &&
     ! -e "$CFG_DIR/route6-$nic" && ! -e "$CFG_DIR/rule6-$nic" ]] ||
    die "별도 경로/정책 설정은 bond에 따로 이전해야 합니다: $nic"
  if ip -6 address show dev "$nic" scope global | grep -q 'inet6 '; then
    die "IPv6 주소가 있는 NIC입니다. IPv6 이전 계획을 먼저 작성하세요: $nic"
  fi
done

PLAN_DIR=$(mktemp -d "/root/bond-plan.XXXXXXXX")
mkdir "$PLAN_DIR/before" "$PLAN_DIR/new"
for nic in "$ETH0_DEVICE" "$ETH1_DEVICE"; do
  cp -a "$CFG_DIR/ifcfg-$nic" "$PLAN_DIR/before/"
done
ip address show > "$PLAN_DIR/address-before.txt"
ip route show table all > "$PLAN_DIR/routes-before.txt"
ip rule show > "$PLAN_DIR/rules-before.txt"
printf 'BOND_DEVICE=%q\nETH0_DEVICE=%q\nETH1_DEVICE=%q\n' \
  "$BOND_DEVICE" "$ETH0_DEVICE" "$ETH1_DEVICE" > "$PLAN_DIR/names.sh"

cat > "$PLAN_DIR/new/ifcfg-$BOND_DEVICE" <<EOF
DEVICE=$BOND_DEVICE
NAME=$BOND_DEVICE
TYPE=Bond
BONDING_MASTER=yes
BOOTPROTO=none
ONBOOT=yes
NM_CONTROLLED=no
IPADDR=$IP_ADDRESS
PREFIX=$PREFIX
GATEWAY=$GATEWAY
DEFROUTE=yes
PEERDNS=no
IPV6INIT=no
BONDING_OPTS="mode=active-backup miimon=100"
EOF

for nic in "$ETH0_DEVICE" "$ETH1_DEVICE"; do
  cat > "$PLAN_DIR/new/ifcfg-$nic" <<EOF
DEVICE=$nic
NAME=$nic
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
NM_CONTROLLED=no
MASTER=$BOND_DEVICE
SLAVE=yes
IPV6INIT=no
EOF
done
printf '백업 및 후보 설정: %s\n' "$PLAN_DIR"
printf '실제 설정과 네트워크 상태는 변경하지 않았습니다.\n'

Controleer eerst de syntaxis met bash -n prepare-bond.sh en maak de kandidaat-instellingen aan met sudo bash prepare-bond.sh. Noteer het uitgevoerde pad en de back-up. Aangezien de controle in het script geen IP-conflicten, VLAN-overeenstemming, switchbeleid of alle routeringsafhankelijkheden kan verifiëren, moet u ook de verificatieprocedure vóór de wijziging uitvoeren.

Toepassing via de console

Voer de onderstaande opdrachten stap voor stap uit en ga niet verder als er een fout optreedt. Een exit-code 1 van diff betekent dat er verschillen zijn. Controleer of de verschillen bedoelde wijzigingen zijn voordat u de NIC uitschakelt. Als u hier het voorbeeld-IP wijzigt, kan ook het beheeradres veranderen.

# Voer dit uit vanuit de root-console. Vervang het pad hieronder door het daadwerkelijke pad uit de uitvoer van de generator.
PLAN_DIR=/root/bond-plan.XXXXXXXX
test -f "$PLAN_DIR/names.sh" || exit 1
source "$PLAN_DIR/names.sh"
CFG_DIR=/etc/sysconfig/network-scripts

# Kandidaat-instellingen controleren: tot dit punt wordt de communicatiestatus niet gewijzigd.
cat "$PLAN_DIR/new/ifcfg-$BOND_DEVICE"
diff -u "$PLAN_DIR/before/ifcfg-$ETH0_DEVICE" "$PLAN_DIR/new/ifcfg-$ETH0_DEVICE"
diff -u "$PLAN_DIR/before/ifcfg-$ETH1_DEVICE" "$PLAN_DIR/new/ifcfg-$ETH1_DEVICE"

# Alleen uitvoeren nadat de controle is voltooid. Vanaf hier wordt de communicatie van de doel-NIC verbroken.
# Controleer de oorzaak en stop als ifdown mislukt.
ifdown "$ETH0_DEVICE"
ifdown "$ETH1_DEVICE"

# Installeer de onderstaande drie bestanden. Activeer ze niet en herstel ze als er zelfs maar één mislukt.
install -o root -g root -m 600 "$PLAN_DIR/new/ifcfg-$BOND_DEVICE" "$CFG_DIR/ifcfg-$BOND_DEVICE"
install -o root -g root -m 600 "$PLAN_DIR/new/ifcfg-$ETH0_DEVICE" "$CFG_DIR/ifcfg-$ETH0_DEVICE"
install -o root -g root -m 600 "$PLAN_DIR/new/ifcfg-$ETH1_DEVICE" "$CFG_DIR/ifcfg-$ETH1_DEVICE"
restorecon "$CFG_DIR/ifcfg-$BOND_DEVICE" "$CFG_DIR/ifcfg-$ETH0_DEVICE" "$CFG_DIR/ifcfg-$ETH1_DEVICE"

ifup "$BOND_DEVICE"
ifup "$ETH0_DEVICE"
ifup "$ETH1_DEVICE"

Validatie van adres, bonding-modus en failover

ip -br address show bond0
ip -d link show bond0
ip link show master bond0
cat /proc/net/bonding/bond0
ip route
ping -c 4 -I bond0 192.168.1.1
ethtool eth0
ethtool eth1

Het feit dat bond0 wordt weergegeven, betekent niet dat het proces voltooid is. Controleer of het adres alleen aan de bond is toegewezen, of beide fysieke NIC’s ondergeschikt zijn aan de bond en of de standaardroute correct is. In /proc/net/bonding/bond0 leest u de volgende items.

# Dit is een voorbeeld van een indeling en geen meetresultaat van een specifieke server.
Bonding Mode: fault-tolerance (active-backup)
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
...
Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
...
Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps

Currently Active Slave is de NIC die momenteel voor communicatie wordt gebruikt. Controleer of de MII Status van beide NIC’s in orde is en verifieer de werkelijke verbindingssnelheid met de resultaten van ethtool voor elke fysieke NIC. Interpreteer de geaggregeerde snelheid die op het bond-apparaat wordt weergegeven niet als een resultaat van een doorvoermeting.

  1. Verstuur vanaf een aparte client continu pings en daadwerkelijke serviceverzoeken naar het IP-adres van de server.
  2. Terwijl u de onderhoudsconsole openhoudt, blokkeert u slechts één kabel of de bijbehorende switchpoort van de actieve NIC.
  3. Registreer of de actieve NIC overschakelt naar de andere poort, of de communicatie wordt hersteld en wat de impact op pakketverlies en de service is.
  4. Herstel het onderbroken pad en controleer de verbindingsstatus van beide poorten. Test het tegenovergestelde pad op dezelfde manier.
  5. Controleer na het verifiëren van de nieuwe beheersessie, DNS-opzoekingen en serviceantwoorden of de permanente configuratie correct is door een geplande herstart uit te voeren.

Een kabelstoringstest en een netwerkstoringstest op een hoger niveau zijn verschillend. Omdat miimon de verbindingsstatus bewaakt, worden storingen in switches of routers op een hoger niveau waarbij de verbinding fysiek in stand blijft, mogelijk niet gedetecteerd. Test het bereik van de failover die nodig is voor de daadwerkelijke service en de switchconfiguratie afzonderlijk.

Herstel bij problemen

Voer de volgende procedure uit in de console. Dit is van toepassing als het een nieuwe configuratie betreft zonder eerdere bond en u terugkeert naar de oorspronkelijke NIC-configuratie die door het voorbereidingsscript is opgeslagen. Controleer op stapsgewijze fouten en de huidige status, en herstel de originele bestanden na verificatie. Als u tijdens het toepassingsproces afzonderlijke routerings-, DNS- of firewallinstellingen hebt gewijzigd, moeten deze wijzigingen ook ongedaan worden gemaakt.

# Geef het daadwerkelijke back-uppad op dat werd weergegeven tijdens de toepassing. Uitvoeren vanaf de root-console.
PLAN_DIR=/root/bond-plan.XXXXXXXX
test -f "$PLAN_DIR/names.sh" || exit 1
source "$PLAN_DIR/names.sh"
CFG_DIR=/etc/sysconfig/network-scripts

# Controleer de resultaten per stap. Controleer bij een ifdown-fout van een nog niet aangemaakte bond eerst de status.
ifdown "$BOND_DEVICE"
ifdown "$ETH0_DEVICE"
ifdown "$ETH1_DEVICE"

# Deze procedure is alleen van toepassing op nieuwe configuraties waarvoor nog geen bond bestond.
ip link delete "$BOND_DEVICE" type bond
mv "$CFG_DIR/ifcfg-$BOND_DEVICE" "$PLAN_DIR/ifcfg-bond-failed"
cp -a "$PLAN_DIR/before/ifcfg-$ETH0_DEVICE" "$CFG_DIR/ifcfg-$ETH0_DEVICE"
cp -a "$PLAN_DIR/before/ifcfg-$ETH1_DEVICE" "$CFG_DIR/ifcfg-$ETH1_DEVICE"
restorecon "$CFG_DIR/ifcfg-$ETH0_DEVICE" "$CFG_DIR/ifcfg-$ETH1_DEVICE"

ifup "$ETH0_DEVICE"
ifup "$ETH1_DEVICE"
ip -br address
ip route
journalctl -u network --since '-10 minutes' --no-pager

Vergelijk na herstel het bestaande adres en de route met address-before.txt en routes-before.txt, en controleer de beheerverbinding en services vanaf andere clients. Als Link Failure Count toeneemt of de modus afwijkt van de verwachting, controleer dan de kabels, switch-VLAN’s, poortaggregatie-instellingen, dubbele profielen en BONDING_OPTS.

Referentiedocumentatie