Jak zachować ustawienia ethtool poprzez ponowne uruchomienie


15

Chciałbym wyłączyć odciążanie segmentacji TCP na serwerze CentOS5. Przy użyciu ethtool polecenie brzmi: ethtool -K eth0 tso offTo ustawienie jednak zachowuje się tylko dla tej sesji. Jak mogę utrzymać to przez ponowne uruchomienie?


2
umieść go gdzieś w skrypcie startowym.
Zoredache

Odpowiedzi:


15

Z tej strony :

Możesz wprowadzić polecenia ethtool w /etc/rc.local(lub odpowiedniku twojej dystrybucji), gdzie polecenia są uruchamiane po zakończeniu bieżącego poziomu pracy, ale nie jest to idealne. Usługi sieciowe mogły zostać uruchomione podczas poziomu pracy, a polecenia ethtool zwykle zakłócają ruch w sieci. Bardziej preferowane jest stosowanie poleceń podczas uruchamiania interfejsu.

Usługa sieciowa w CentOS ma taką możliwość. Skrypt /etc/sysconfig/network-scripts/ifup-postsprawdza istnienie /sbin/ifup-local, a jeśli istnieje, uruchamia go z nazwą interfejsu jako parametrem (np . /sbin/ifup-local eth0:)

Możemy utworzyć ten plik za pomocą dotyku, /sbin/ifup-localaby był wykonywalny, chmod +x /sbin/ifup-localustawiając kontekst SELinux za pomocą, chcon --reference /sbin/ifup /sbin/ifup-locala następnie otwierając go w edytorze.

Prosty skrypt do zastosowania tych samych ustawień do wszystkich interfejsów byłby podobny

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

Należy pamiętać, że spróbuje to zastosować ustawienia do WSZYSTKICH interfejsów, nawet do sprzężenia zwrotnego.

Jeśli mamy różne interfejsy, do których chcemy zastosować inne ustawienia lub chcemy pominąć sprzężenie zwrotne, możemy złożyć instrukcję case

#!/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

Teraz ustawienia ettool są stosowane do interfejsów podczas ich uruchamiania, wszystkie potencjalne przerwy w komunikacji sieciowej są wykonywane w miarę uruchamiania interfejsu, a serwer może nadal uruchamiać się z pełnymi możliwościami sieci.


zauważ także ETHTOOL_OPTS opisane tutaj access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/... Jednak z jakiegoś powodu to jeszcze nie działa na mojej maszynie superuser.com/questions/995200/…
javapowered

13

Dla RHEL7 w / etc / sysconfig / network-scripts / ifcfg- * możesz mieć:

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

jeśli więcej opcji, użyj jak

ETHTOOL_OPTS = "- K $ {DEVICE} gso wyłączone; -K $ {DEVICE} gro off; -K $ {DEVICE} tso wyłączone"

musisz oczywiście zdefiniować URZĄDZENIE w swoim pliku ifcfg.

Nie potrzeba żadnych skryptów rc.local ani dodatkowych skryptów ifup. Łatwy w ogólnych systemach wdrażania.


10

Jeśli korzystasz z RHEL7 (lub podobnego) i używasz Network Managera zamiast /etc/init.d/network do kontrolowania interfejsów, proponowana odpowiedź nie będzie działać, ponieważ / sbin / ifup-local (a także ifdown-pre-local i ifdown-local ) nigdy nie zostanie wykonany.

Zamiast tego umieść skrypty w /etc/NetworkManager/dispatcher.d/ i upewnij się, że usługa NetworkManager-dispatcher jest włączona

systemctl enable NetworkManager-dispatcher

Wskazówka: dyspozytor uruchomi się tylko wtedy, gdy NetworkManager dokona zmian w interfejsie, nie musi być uruchomiony ani nic, więc jeśli status brzmi

Active: inactive (dead)

w porządku!

Upewnij się także, że twój skrypt to:

  1. plik wykonywalny (chmod + x)
  2. własnością root (chown root: root)
  3. zapisywalny tylko przez root (chmod 755)

Teraz NetworkManager przekaże dyspozytorowi dwie (2) zmienne:

1 USD to interfejs ( eno16777984 , eth0 , ppp0 itp.)

2 USD za status (w górę lub w dół )

i pozwala na tworzenie łańcuchów skryptów (tak jak / etc / rc ...), aby mieć pewną kontrolę nad kolejnością ich uruchamiania:

10 pierwsze, 20 sekund i tak dalej ...

Kolejność będzie rosła przy połączeniu

jeśli [$ 2 = „w górę”] jest to 10-sekundowy, a następnie 20-sekundowy

i zejście po rozłączeniu

jeśli [$ 2 = "w dół"] otrzymasz 20 sekund, a następnie 10-pierwszy

i tak dalej.

Aby osiągnąć to, czego szukał OP, możesz umieścić coś takiego:

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

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

I nazwij to dniem.

Twoje zdrowie


Pamiętaj, że to pytanie jest bardzo stare i że ma już zaakceptowaną odpowiedź, a twoja odpowiedź tak naprawdę nie dodaje nowych. Staraj się unikać odpowiadania na bardzo stare posty, ponieważ często zapychają się na pierwszej stronie.
Catherine MacInnes

3
Wyszukaj w Google „ifup-local”, a otrzymasz to jako szósty hit. Nic, co
uważałbym

2
To zdecydowanie dodaje coś w stosunku do CentOS 7. Żadne inne rozwiązanie nie działało dla mnie w CentOS 7.
JDL

3
Skrypt bash ma błąd, powinien być:if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
dreua

5

Wystąpiły problemy z zaakceptowaną odpowiedzią (którą, pośpiesznie dodając, okazało się bardzo pomocne), ponieważ korzystałem z połączonych interfejsów.

Długo zajęło mi odkrycie, co się dzieje, ale odkryłem, że przywołując więź, a nawet osobno wychowując niewolnika, ifup-localskrypt nie będzie wywoływał interfejsów niewolników. Zakładam, że dzieje się tak, ponieważ interfejsy slave nie mają przypisanych żadnych adresów IP.

Aby obejść ten problem, zmodyfikowałem mój, ifup-localaby przeanalizować zawartość /proc/bonding/bondXinterfejsu, który został przywołany, jeśli to była więź, aby uzyskać nazwy interfejsu slave, a następnie zrobiłem z nimi niezbędne rzeczy.

W końcu mój ifup-localwyglądał następująco:

#!/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

Zastrzeżenie: zawartość / proc / net / bonding / bondX może być inna dla różnych wersji RedHat / Fedora / CentOS niż ta, z której korzystałem podczas pisania skryptu, więc polecenie wyciągnięcia nazw interfejsów slave może nie działać .


4

Nie na temat, dla użytkowników Ubuntu, którzy przybyli tutaj, jak ja, to jako notatka:

Na Ubuntu: podręcznik jest edycja pliku / etc / network / interfaces , który z kolei jest odczytywany przez skrypty init.d / pre-up-up itp. Tak an / etc / network / interfaces plik może wyglądać następująco:

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

Tak mówią doktorzy, ale to nie działa . Może być tak, że logika analizowania w skryptach wstępnego i wstępnego jest nieco przestarzała i nie analizują wymaganych ustawień z pliku interfejsów. Nie wiem Przynajmniej mi to nie działało.

Więc hack-ish, ale działającym rozwiązaniem jest na razie utworzenie / edycja lokalnego pliku /etc/rc.local i podanie polecenia, które ma zostać tam wykonane (należy jednak pamiętać, że może to przerwać pracę sieci na kilka sekund po tym, jak interfejs został już uruchomiony) wychowany). Mając to:

ethtool -s eth0 speed 10 duplex full autoneg on

w /etc/rc.local jest działającym rozwiązaniem do spowolnienia interfejsu zgodnie z powyższym zamierzeniem.

Na Ubuntu 17.04 i nowszych

Nowsze wersje Ubuntus używają Systemd, a zatem plik rc.local niekoniecznie jest wykonywany po osiągnięciu na przykład poziomu uruchamiania. Usługa „rc-local” musi być włączona. Chociaż wydaje się, że jest to domyślnie, prawdopodobnie ze względu na kompatybilność wsteczną - sprawdź jego status za pomocąsudo systemctl status rc-local


pre-upDyrektywa pracował dla mnie na Linux Mint 17,3 do ustawiania flagi OSP dzięki :)
Joril

1

Przekonałem się, że ustawienie tego rodzaju konfiguracji w /etc/network/interfacesrzeczywistości działa dla Ubuntu ( large-receive-offloadoczywiście, że użyłem go do wyłączenia , ale to nie powinno mieć znaczenia):

auto eth1
iface eth1 inet static
    adres xxx.xxx.xxx.xxx
    maska ​​sieci xx
    pre-up / sbin / ethtool -K $ IFACE lro off

1

W przypadku Ubuntu możesz to zrobić, dodając następujący wiersz /etc/network/interfaces:

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

post-up tutaj wykona daną operację po uruchomieniu określonego interfejsu.


0

Tak, na razie nie można tego zrobić przy użyciu plików konfiguracyjnych. Możesz wprowadzić polecenie /etc/init.d/rc.locali należy to zrobić.

Ten plik jest wykonywany na końcu sekwencji rozruchowej, więc interfejs zostałby wyłączony.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.