Vorrei disattivare l'offload della segmentazione tcp su un server CentOS5. Utilizzando ethtool il comando è ethtool -K eth0 tso off
Tuttavia, questa impostazione persiste solo per questa sessione. Come posso farlo persistere attraverso i riavvii?
Vorrei disattivare l'offload della segmentazione tcp su un server CentOS5. Utilizzando ethtool il comando è ethtool -K eth0 tso off
Tuttavia, questa impostazione persiste solo per questa sessione. Come posso farlo persistere attraverso i riavvii?
Risposte:
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-post
verifica 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-local
rendendolo eseguibile con chmod +x /sbin/ifup-local
impostare il suo contesto SELinux con chcon --reference /sbin/ifup /sbin/ifup-local
e 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.
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.
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:
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
if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
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-local
per 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-local
sembrava 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 .
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
pre-up
direttiva ha funzionato per me su Linux Mint 17.3 per impostare il flag TSO, grazie :)
Ho scoperto che l'impostazione di questo tipo di configurazione /etc/network/interfaces
funziona 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
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.
Sì, per ora non è possibile utilizzare i file di configurazione. Puoi inserire il comando /etc/init.d/rc.local
e dovrebbe essere fatto.
Quel file viene eseguito nell'ultima sequenza di avvio e quindi verrà disattivato per l'interfaccia.