Come mantenere le impostazioni di ethtool attraverso il riavvio


15

Vorrei disattivare l'offload della segmentazione tcp su un server CentOS5. Utilizzando ethtool il comando è ethtool -K eth0 tso offTuttavia, questa impostazione persiste solo per questa sessione. Come posso farlo persistere attraverso i riavvii?


2
metterlo in uno script iniziale da qualche parte.
Zoredache,

Risposte:


15

Da questa pagina Web :

Puoi inserire i comandi ethtool in /etc/rc.local(o l'equivalente della tua distribuzione) dove i comandi vengono eseguiti dopo il completamento del runlevel corrente, ma questo non è l'ideale. I servizi di rete potrebbero essere stati avviati durante il runlevel e i comandi ethtool tendono a interrompere il traffico di rete. Sarebbe più preferibile applicare i comandi quando viene visualizzata l'interfaccia.

Il servizio di rete in CentOS ha la capacità di farlo. Lo script /etc/sysconfig/network-scripts/ifup-postverifica l'esistenza di /sbin/ifup-local, e se esiste, lo esegue con il nome dell'interfaccia come parametro (es. /sbin/ifup-local eth0:)

Possiamo creare questo file con touch /sbin/ifup-localrendendolo eseguibile con chmod +x /sbin/ifup-localimpostare il suo contesto SELinux con chcon --reference /sbin/ifup /sbin/ifup-locale quindi aprirlo in un editor.

Un semplice script per applicare le stesse impostazioni a tutte le interfacce sarebbe qualcosa di simile

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

Tieni presente che questo tenterà di applicare le impostazioni a TUTTE le interfacce, anche al loopback.

Se abbiamo interfacce diverse a cui vogliamo applicare impostazioni diverse, o vogliamo saltare il loopback, possiamo fare un'istruzione 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

Ora le impostazioni di ethtool vengono applicate alle interfacce all'avvio, tutte le potenziali interruzioni della comunicazione di rete vengono eseguite all'avvio dell'interfaccia e il server può continuare ad avviarsi con funzionalità di rete complete.


nota anche su ETHTOOL_OPTS descritto qui access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/… Tuttavia, per qualche motivo, non funziona sulla mia macchina ma superuser.com/questions/995200/…
javapowered

12

Per RHEL7 in / etc / sysconfig / network-scripts / ifcfg- * potresti avere:

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

se più opzioni usa like

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

devi avere DEVICE naturalmente definito nel tuo file ifcfg.

Non sono necessari rc.local né script ifup aggiuntivi. Facile per te in sistemi di distribuzione generici.


10

Se sei su RHEL7 (o simili) e usi Network Manager invece di /etc/init.d/network per controllare le tue interfacce, la risposta proposta non funzionerà, poiché / sbin / ifup-local (così come ifdown-pre-local e ifdown-local ) non verrà mai eseguito.

Metti invece i tuoi script in /etc/NetworkManager/dispatcher.d/ e assicurati che il servizio NetworkManager-dispatcher sia abilitato

systemctl enable NetworkManager-dispatcher

Suggerimento: il dispatcher si avvia solo quando NetworkManager apporta modifiche a un'interfaccia, non è necessario che sia in esecuzione o altro, quindi se lo stato legge

Active: inactive (dead)

va benissimo!

Assicurati anche che il tuo script sia:

  1. eseguibile (chmod + x)
  2. di proprietà di root (chown root: root)
  3. scrivibile solo da root (chmod 755)

Ora NetworkManager passerà due (2) variabili al dispatcher:

$ 1 è l'interfaccia ( eno16777984 , eth0 , ppp0 , ecc ...)

$ 2 con lo stato ( su o giù )

e permette di concatenare gli script (proprio come / etc / rc ...) per avere un certo controllo sull'ordine in cui il dispatcher li eseguirà:

10 primi, 20 secondi e così via ...

L'ordine salirà su una connessione

se [$ 2 = "su"] sono i primi 10 seguiti da 20 secondi

e discendente su una disconnessione

se [$ 2 = "down"] ottieni 20 secondi seguito da 10 primi

e così via.

Quindi, per realizzare ciò che OP stava cercando, potresti mettere qualcosa del genere:

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

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

E chiamalo un giorno.

Saluti


Tieni presente che questa domanda è molto vecchia e che ha già una risposta accettata e la tua risposta non aggiunge davvero nuove. Cerca di evitare di rispondere a post molto vecchi in quanto tende a ingombrare la prima pagina.
Catherine MacInnes,

3
Cerca "ifup-local" su Google e ottieni questo come sesto successo. Niente che considererei "vecchio"
user1972814,

2
Questo aggiunge sicuramente qualcosa in merito a CentOS 7. Nessun'altra soluzione ha funzionato per me in CentOS 7.
JDL

3
Lo script bash ha un errore, dovrebbe essere:if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
dreua

5

Ho riscontrato problemi con la risposta accettata (che, mi affretto ad aggiungere, ho trovato molto utile) perché stavo usando interfacce legate.

Mi ci è voluto un po 'di tempo per scoprire cosa stava succedendo, ma ho scoperto che quando si genera un legame, o anche quando si individua individualmente uno schiavo del legame, il ifup-local sceneggiatura non viene chiamata per le interfacce degli schiavi. Presumo che ciò sia dovuto al fatto che alle interfacce slave non sono stati assegnati indirizzi IP.

Per ovviare a questo ho modificato il mio ifup-localper analizzare il contenuto di/proc/bonding/bondX dell'interfaccia che era stata richiamata, se si trattava di un legame, per ottenere i nomi dell'interfaccia slave, e quindi ho fatto le cose necessarie con loro.

Alla fine il mio ifup-localsembrava il seguente:

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

Avvertenza: il contenuto di / proc / net / bonding / bondX potrebbe essere diverso per le diverse versioni di RedHat / Fedora / CentOS rispetto a quello che stavo usando quando ho scritto lo script, quindi il comando per estrarre i nomi dell'interfaccia slave potrebbe non funzionare .


4

Fuori tema, per gli utenti Ubuntu che sono venuti qui, come me, questo come una nota:

Su Ubuntu, il libro di testo modo per farlo è quello di modificare il etc / / interfacce / network di file che a sua volta viene letto dal init.d / pre-up-up, ecc script. Quindi un file / etc / network / interfaces potrebbe apparire così:

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

Questo è ciò che dicono i documenti, ma non funziona . Potrebbe essere che la logica di analisi negli script pre-up e up sia un po 'datata e non analizzino le impostazioni richieste dal file interfacce. Non lo so. Almeno, non funzionava per me.

Quindi la soluzione hack-ish ma funzionante per ora è ancora quella di creare / modificare un file /etc/rc.local locale e dichiarare il comando da eseguire lì (ma nota che questo potrebbe interrompere la rete per un secondo dopo che l'interfaccia è già stata cresciuto). Quindi avendo questo:

ethtool -s eth0 speed 10 duplex full autoneg on

in /etc/rc.local è la soluzione funzionante per rallentare un'interfaccia come previsto sopra.

Su Ubuntu 17.04 e versioni successive

Ubuntus più recente usa Systemd, e quindi il file rc.local non viene necessariamente eseguito al raggiungimento del runlevel 'start', per esempio. Il servizio "rc-local" deve essere abilitato. Anche se sembra essere di default, per motivi di compatibilità all'indietro, probabilmente - assicurati di controllare il suo stato consudo systemctl status rc-local


La pre-updirettiva ha funzionato per me su Linux Mint 17.3 per impostare il flag TSO, grazie :)
Joril

1

Ho scoperto che l'impostazione di questo tipo di configurazione /etc/network/interfacesfunziona effettivamente per Ubuntu (ammesso di averlo usato per lo spegnimentolarge-receive-offload , ma non dovrebbe importare davvero):

auto eth1
iface eth1 inet static
    indirizzo xxx.xxx.xxx.xxx
    maschera di rete xx
    pre-up / sbin / ethtool -K $ IFACE lro off

1

Per Ubuntu, puoi farlo aggiungendo la seguente riga in /etc/network/interfaces:

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

il post-up qui eseguirà l'operazione indicata dopo aver visualizzato l'interfaccia specifica.


0

Sì, per ora non è possibile utilizzare i file di configurazione. Puoi inserire il comando /etc/init.d/rc.locale dovrebbe essere fatto.

Quel file viene eseguito nell'ultima sequenza di avvio e quindi verrà disattivato per l'interfaccia.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.