So behalten Sie die ethtool-Einstellungen durch einen Neustart bei

15

Ich möchte das TCP-Segmentierungs-Offload auf einem CentOS5-Server deaktivieren. Mit ethtool lautet der Befehl ethtool -K eth0 tso off. Diese Einstellung bleibt jedoch nur für diese Sitzung erhalten. Wie kann ich dafür sorgen, dass es durch Neustarts erhalten bleibt?

Gus E
quelle
2
stecke es irgendwo in ein Startskript.
Zoredache

Antworten:

15

Von dieser Webseite :

Sie können die ethtool-Befehle in /etc/rc.local(oder in das Äquivalent Ihrer Distribution) eingeben, in dem Befehle ausgeführt werden, nachdem der aktuelle Runlevel abgeschlossen ist. Dies ist jedoch nicht ideal. Netzwerkdienste wurden möglicherweise während des Runlevels gestartet, und ethtool-Befehle unterbrechen häufig den Netzwerkverkehr. Es ist vorzuziehen, die Befehle anzuwenden, wenn die Schnittstelle aufgerufen wird.

Der Netzwerkdienst in CentOS kann dies tun. Das Skript /etc/sysconfig/network-scripts/ifup-postüberprüft das Vorhandensein von /sbin/ifup-local, und wenn es vorhanden ist , läuft es mit dem Schnittstellennamen als Parameter (zB: /sbin/ifup-local eth0)

Wir können diese Datei mit Touch erstellen /sbin/ifup-localausführbar machen mit chmod +x /sbin/ifup-localsetzen Sie den SELinux Kontext mit chcon --reference /sbin/ifup /sbin/ifup-localund es dann in einem Editor öffnen.

Ein einfaches Skript, mit dem die gleichen Einstellungen auf alle Schnittstellen angewendet werden können, wäre ungefähr so

#!/bin/bash
if [ -n "$1" ]; then
/sbin/ethtool -G $1 rx 4096 tx 4096
/sbin/ethtool -K $1 tso on gso on
fi

Beachten Sie, dass hiermit versucht wird, Einstellungen auf ALLE Schnittstellen anzuwenden, auch auf das Loopback.

Wenn wir unterschiedliche Schnittstellen haben, auf die wir unterschiedliche Einstellungen anwenden möchten, oder den Loopback überspringen möchten, können wir eine case-Anweisung abgeben

#!/bin/bash
case "$1" in
eth0)
/sbin/ethtool -G $1 rx 16384 tx 16384
/sbin/ethtool -K $1 gso on gro on
;;
eth1)
/sbin/ethtool -G $1 rx 64 tx 64
/sbin/ethtool -K $1 tso on gso on
/sbin/ip link set $1 txqueuelen 0
;;
esac
exit 0

Jetzt werden die Einstellungen von ethtool beim Start auf die Schnittstellen angewendet, alle potenziellen Unterbrechungen der Netzwerkkommunikation werden ausgeführt, wenn die Schnittstelle aufgerufen wird, und Ihr Server kann weiterhin mit allen Netzwerkfunktionen gestartet werden.

Gus E
quelle
auch Notiz ETHTOOL_OPTS hier beschriebenen access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/... jedoch aus irgendeinem Grund funktioniert es nicht auf meiner Maschine noch superuser.com/questions/995200/...
javapowered
12

Für RHEL7 in / etc / sysconfig / network-scripts / ifcfg- * haben Sie möglicherweise:

ETHTOOL_OPTS = "- K $ {DEVICE} gso off gro off tso off"

Wenn mehr Optionen vorhanden sind, verwenden Sie "Gefällt mir"

ETHTOOL_OPTS = "- K $ {DEVICE} ist ausgeschaltet; -K $ {DEVICE} ist ausgeschaltet; -K $ {DEVICE} ist ausgeschaltet"

Sie müssen natürlich DEVICE in Ihrer ifcfg-Datei definiert haben.

Es werden weder rc.local noch zusätzliche ifup-Skripte benötigt. Einfach für Sie in allgemeinen Bereitstellungssystemen.

arl
quelle
10

Wenn Sie auf RHEL7 (oder ähnlich) arbeiten und Network Manager anstelle von /etc/init.d/network verwenden , um Ihre Schnittstellen zu steuern, funktioniert die vorgeschlagene Antwort nicht, da / sbin / ifup-local (sowie ifdown-pre-local) und ifdown-local ) werden niemals ausgeführt.

Stellen Sie stattdessen Ihre Skripte in /etc/NetworkManager/dispatcher.d/ und stellen Sie sicher, dass der NetworkManager-Dispatcher- Dienst aktiviert ist

systemctl enable NetworkManager-dispatcher

Hinweis: Der Dispatcher wird nur dann aktiviert, wenn NetworkManager Änderungen an einer Schnittstelle vornimmt, nicht ausgeführt werden muss oder so, wenn der Status lautet

Active: inactive (dead)

Das ist völlig in Ordnung!

Stellen Sie außerdem sicher, dass Ihr Skript:

  1. ausführbare Datei (chmod + x)
  2. im Besitz von root (chown root: root)
  3. nur von root beschreibbar (chmod 755)

Jetzt übergibt NetworkManager zwei (2) Variablen an den Dispatcher:

$ 1 ist die Schnittstelle ( eno16777984 , eth0 , ppp0 , etc ...)

$ 2 hält den Status (entweder nach oben oder nach unten )

und es ermöglicht das Verketten der Skripte (genau wie / etc / rc ...), um die Reihenfolge zu steuern, in der der Dispatcher sie ausführt:

10-first, 20-second und so weiter ...

Die Reihenfolge wird bei einer Verbindung aufsteigend sein

if [$ 2 = "up"] sein 10-first gefolgt von 20-second

und absteigend auf eine Trennung

Wenn [$ 2 = "down"], erhalten Sie 20 Sekunden, gefolgt von 10 zuerst

und so weiter.

Um das zu erreichen, wonach OP gesucht hat, können Sie Folgendes eingeben:

#!/bin/bash
if [ "$1" = "eth0" && "$2" = "up" ]; then
  /sbin/ethtool --offload eth0 tso off
fi

in /etc/NetworkManager/dispatcher.d/20-ethtool

Und nenn es einen Tag.

Prost

user1972814
quelle
Bitte beachten Sie, dass diese Frage sehr alt ist und bereits eine akzeptierte Antwort hat und Ihre Antwort nicht wirklich eine neue hinzufügt. Bitte vermeiden Sie es, sehr alte Beiträge zu beantworten, da dies die Titelseite überfüllt.
Catherine MacInnes
3
Durchsuchen Sie Google nach "ifup-local" und Sie erhalten dies als 6. Treffer. Nichts, was ich als "alt" bezeichnen würde
user1972814
2
Dies fügt definitiv etwas in Bezug auf CentOS 7 hinzu. Keine andere Lösung funktionierte für mich in CentOS 7.
JDL
3
Das Bash-Skript hat einen Fehler. Es sollte sein:if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
dreua
5

Ich hatte Probleme mit der akzeptierten Antwort (die ich, wie ich hinzufügen möchte, als sehr hilfreich empfand), weil ich Bonded Interfaces verwendete.

Es dauerte eine Weile, bis ich herausgefunden hatte, was passierte, aber ich stellte fest, dass das ifup-localSkript beim Aufrufen einer Anleihe oder sogar beim Aufrufen eines einzelnen Anleihesklaven nicht für die Slave-Schnittstellen aufgerufen wurde. Ich gehe davon aus, dass den Slave-Schnittstellen keine IP-Adressen zugewiesen wurden.

Um dies ifup-localzu umgehen, habe ich meine modifiziert , um den Inhalt /proc/bonding/bondXfür die Schnittstelle zu analysieren, die aufgerufen wurde, wenn es sich um eine Bindung handelte, um die Namen der Slave-Schnittstelle zu erhalten, und dann die erforderlichen Dinge mit ihnen zu tun.

Am Ende ifup-localsah mein so aus:

#!/bin/bash

if [ -n "$1" ]
then
  IFACE="$1"

  # If interface is physical
  if [[ $IFACE =~ ^eth[0-9]+$ ]]
  then
    # Do whatever you need for a physical interface here
    # example below
    /sbin/ethtool -K $IFACE rx off    

  # Else if it's a bond
  elif [[ $IFACE =~ ^bond[0-9]+$ ]]
  then
    # Do whatever you need for the bond here
    # example below
    /sbin/ethtool -K $IFACE gso off

    # Now deal with slaves
    # Pull out slave interface names from /proc/net/bonding/bondX
    SLAVES=$(/bin/grep -oP "Slave Interface: \K(eth[0-9]+)" /proc/net/bonding/$IFACE)
    for SLAVE in $SLAVES
    do
      # Do whatever you need with the slave here
      # example below
      /sbin/ethtool -K $SLAVE tso off gso off
    done
  fi
fi

Vorsichtsmaßnahme: Der Inhalt von / proc / net / binding / bondX kann sich für verschiedene Versionen von RedHat / Fedora / CentOS von dem unterscheiden, den ich beim Schreiben des Skripts verwendet habe. Daher funktioniert der Befehl zum Abrufen der Namen der Slave-Schnittstelle möglicherweise nicht .

PaddyD
quelle
4

Off-Topic, für Ubuntu-Benutzer, die hierher kamen, wie ich, dies als Hinweis:

Unter Ubuntu besteht die Lehrbuchmethode darin, die Datei / etc / network / interfaces zu bearbeiten, die wiederum von den Skripten init.d / pre-up -up usw. gelesen wird. Eine / etc / network / interfaces- Datei könnte also so aussehen:

auto eth0
iface eth0 inet static
pre-up /sbin/ethtool -s eth0 speed 10 duplex full

Das ist, was die Dokumente sagen, aber es funktioniert nicht . Möglicherweise ist die Parsing-Logik in den Pre-Up- und Up-Skripten etwas veraltet und sie analysieren die erforderlichen Einstellungen nicht aus der Interface-Datei. Ich weiß es nicht. Zumindest hat es bei mir nicht funktioniert.

Die hackige, aber funktionierende Lösung für den Moment besteht darin , eine lokale /etc/rc.local-Datei zu erstellen / bearbeiten und den dort auszuführenden Befehl anzugeben (beachten Sie jedoch, dass dies das Netzwerk für einige Sekunden unterbrechen kann, nachdem die Schnittstelle bereits vorhanden ist zur Diskussion gebracht). Also mit diesem:

ethtool -s eth0 speed 10 duplex vollautomatisch ein

in /etc/rc.local ist die funktionierende Lösung, um eine Schnittstelle wie oben beabsichtigt zu verlangsamen.

Auf Ubuntu 17.04 und höher

Neuere Ubuntus-Versionen verwenden Systemd, weshalb die Datei rc.local beispielsweise nicht unbedingt beim Erreichen des Runlevels 'start' ausgeführt wird. Der Dienst "rc-local" muss aktiviert sein. Obwohl dies aus Gründen der Abwärtskompatibilität anscheinend die Standardeinstellung ist, prüfen Sie den Status mitsudo systemctl status rc-local

isync
quelle
Die pre-upDirektive funktionierte für mich unter Linux Mint 17.3, um das TSO-Flag zu setzen, danke :)
Joril
1

Ich fand, dass das Setzen dieser Art von Konfiguration in /etc/network/interfacesUbuntu tatsächlich funktioniert (vorausgesetzt, ich habe sie zum Ausschalten verwendet large-receive-offload, aber das sollte eigentlich keine Rolle spielen):

auto eth1
iface eth1 inet static
    Adresse xxx.xxx.xxx.xxx
    Netzmaske xx
    pre-up / sbin / ethtool -K $ IFACE lro off
ibux
quelle
1

Für Ubuntu können Sie dies tun, indem Sie folgende Zeile hinzufügen /etc/network/interfaces:

auto eth0
iface eth0 inet static
[...]
post-up /sbin/ethtool -K eth0 tso off gso off gro off

post-up hier führt die angegebene Operation aus, nachdem die spezifische Schnittstelle aufgerufen wurde.

Vishal Singal
quelle
0

Ja, es kann momentan nicht mit Konfigurationsdateien gemacht werden. Sie können den Befehl in setzen /etc/init.d/rc.localund es sollte getan werden.

Diese Datei wird zum letzten Zeitpunkt der Startsequenz ausgeführt und somit für die Schnittstelle deaktiviert.

Soham Chakraborty
quelle