Comment conserver les paramètres ethtool lors du redémarrage

15

Je voudrais désactiver le déchargement de segmentation TCP sur un serveur CentOS5. En utilisant ethtool, la commande est ethtool -K eth0 tso offCependant, ce paramètre persiste uniquement pour cette session. Comment puis-je le faire persister lors des redémarrages?

Gus E
la source
2
mettez-le quelque part dans un script de démarrage.
Zoredache

Réponses:

15

De cette page Web :

Vous pouvez entrer les commandes ethtool dans /etc/rc.local(ou l'équivalent de votre distribution) où les commandes sont exécutées une fois le niveau d'exécution actuel terminé, mais ce n'est pas idéal. Les services réseau peuvent avoir démarré pendant le niveau d'exécution et les commandes ethtool ont tendance à interrompre le trafic réseau. Il serait plus préférable d'appliquer les commandes à mesure que l'interface est lancée.

Le service réseau dans CentOS a la capacité de le faire. Le script /etc/sysconfig/network-scripts/ifup-postvérifie l'existence de /sbin/ifup-local, et si elle existe, fonctionne avec le nom de l' interface comme paramètre (par exemple: /sbin/ifup-local eth0)

Nous pouvons créer ce fichier avec touch, le /sbin/ifup-localrendre exécutable en chmod +x /sbin/ifup-localdéfinissant son contexte SELinux avec chcon --reference /sbin/ifup /sbin/ifup-local, puis l'ouvrir dans un éditeur.

Un script simple pour appliquer les mêmes paramètres à toutes les interfaces serait quelque chose comme

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

Gardez à l'esprit que cela tentera d'appliquer les paramètres à TOUTES les interfaces, même au bouclage.

Si nous avons différentes interfaces auxquelles nous voulons appliquer des paramètres différents, ou si nous voulons sauter le bouclage, nous pouvons faire une déclaration de cas

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

Désormais, les paramètres ethtool sont appliqués aux interfaces au démarrage, toutes les interruptions potentielles de la communication réseau sont effectuées au fur et à mesure que l'interface est lancée, et votre serveur peut continuer à démarrer avec toutes les capacités du réseau.

Gus E
la source
notez également les ETHTOOL_OPTS décrits ici access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/… Cependant, pour une raison quelconque, cela ne fonctionne pas encore sur ma machine superuser.com/questions/995200/…
javapowered
12

Pour RHEL7 dans / etc / sysconfig / network-scripts / ifcfg- * vous pouvez avoir:

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

si plus d'options, utilisez comme

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

vous devez avoir naturellement DEVICE défini dans votre fichier ifcfg.

Aucun script rc.local ni ifup supplémentaire n'est nécessaire. Facile pour vous dans les systèmes de déploiement génériques.

arl
la source
10

Si vous êtes sur RHEL7 (ou similaire) et utilisez Network Manager au lieu de /etc/init.d/network pour contrôler vos interfaces, la réponse proposée ne fonctionnera pas, car / sbin / ifup-local (ainsi que ifdown-pre-local et ifdown-local ) ne seront jamais exécutés.

Au lieu de cela, placez vos scripts dans /etc/NetworkManager/dispatcher.d/ et assurez-vous que le service NetworkManager-dispatcher est activé

systemctl enable NetworkManager-dispatcher

Astuce: Le répartiteur ne démarrera qu'une fois que NetworkManager apportera des modifications à une interface, il n'a pas besoin d'être en cours d'exécution ou quoi que ce soit, donc si l'état indique

Active: inactive (dead)

c'est tout à fait bien!

Assurez-vous également que votre script est:

  1. exécutable (chmod + x)
  2. appartenant à root (chown root: root)
  3. accessible en écriture uniquement par root (chmod 755)

Maintenant, NetworkManager passera deux (2) variables au répartiteur:

$ 1 étant l'interface ( eno16777984 , eth0 , ppp0 , etc ...)

2 $ détenant le statut ( vers le haut ou vers le bas )

et cela permet d'enchaîner les scripts (tout comme / etc / rc ...) pour avoir un certain contrôle sur l'ordre dans lequel le répartiteur les exécutera:

10 premières, 20 secondes et ainsi de suite ...

La commande sera ascendante sur une connexion

si [$ 2 = "up"] ses 10 premiers suivis de 20 secondes

et descendant sur une déconnexion

si [$ 2 = "down"] vous obtenez 20 secondes suivies de 10 premières

etc.

Donc, pour accomplir ce que OP recherchait, vous pourriez mettre quelque chose comme ceci:

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

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

Et appelez ça un jour.

À votre santé

user1972814
la source
Veuillez noter que cette question est très ancienne et qu'elle a déjà une réponse acceptée et que votre réponse n'ajoute pas vraiment de nouvelle. Veuillez éviter de répondre à de très anciens messages car cela a tendance à encombrer la première page.
Catherine MacInnes
3
Recherchez «ifup-local» sur Google et vous obtenez cela comme le 6e hit. Rien que je considérerais "vieux"
user1972814
2
Cela ajoute définitivement quelque chose en ce qui concerne CentOS 7. Aucune autre solution n'a fonctionné pour moi dans CentOS 7.
JDL
3
Le script bash contient une erreur, elle devrait être:if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
dreua
5

J'ai rencontré des problèmes avec la réponse acceptée (que, je m'empresse d'ajouter, j'ai trouvé très utile) parce que j'utilisais des interfaces liées.

Il m'a fallu un certain temps pour découvrir ce qui se passait, mais j'ai constaté que lors de la création d'une liaison, ou même lors de la création d'un esclave de liaison individuellement, le ifup-localscript n'était pas appelé pour les interfaces esclaves. Je suppose que cela est dû au fait qu'aucune adresse IP ne leur a été attribuée aux interfaces esclaves.

Pour contourner cela, j'ai modifié mon ifup-localpour analyser le contenu de /proc/bonding/bondXl'interface qui avait été affichée, s'il s'agissait d'un lien, pour obtenir les noms des interfaces esclaves, puis j'ai fait les choses nécessaires avec eux.

À la fin, ma ifup-localressemblait à ceci:

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

Attention: le contenu de / proc / net / bonding / bondX peut être différent pour les différentes versions de RedHat / Fedora / CentOS à celui que j'utilisais lorsque j'ai écrit le script, donc la commande pour extraire les noms des interfaces esclaves peut ne pas fonctionner .

PaddyD
la source
4

Hors sujet, pour les utilisateurs d'Ubuntu qui sont venus ici, comme moi, ceci comme une note:

Sur Ubuntu, le manuel façon de le faire est d'éditer le fichier / etc / network / interfaces fichier qui à son tour est lu par le init.d / pre-up -up, etc. scripts. Un fichier / etc / network / interfaces pourrait donc ressembler à ceci:

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

C'est ce que disent les docs, mais cela ne fonctionne pas . Il se peut que la logique d'analyse dans les scripts de pré-montée et de montée en puissance soit un peu datée et qu'ils n'analysent pas les paramètres requis du fichier d'interface. Je ne sais pas. Au moins, cela ne fonctionnait pas pour moi.

Donc, la solution hack-ish mais qui fonctionne pour l'instant est toujours de créer / modifier un fichier local /etc/rc.local et d'indiquer la commande à y exécuter (mais notez que cela peut interrompre la mise en réseau pendant quelques secondes après que l'interface a déjà été élevé). Donc, avoir ceci:

ethtool -s eth0 speed 10 duplex full autoneg on

dans /etc/rc.local est la solution de travail pour ralentir une interface comme prévu ci-dessus.

Sur Ubuntu 17.04 et supérieur

Ubuntus plus récent utilise Systemd, et donc le fichier rc.local n'est pas nécessairement exécuté lors de l'atteinte du niveau d'exécution 'start', par exemple. Le service "rc-local" doit être activé. Bien qu'il semble être par défaut, pour des raisons de compatibilité descendante, probablement - assurez-vous de vérifier son état avecsudo systemctl status rc-local

isync
la source
La pre-updirective a fonctionné pour moi sur Linux Mint 17.3 pour définir le drapeau TSO, merci :)
Joril
1

J'ai trouvé que la définition de ce type de configuration /etc/network/interfacesfonctionne réellement pour Ubuntu (à condition que je l'utilise pour la désactivation large-receive-offload, mais cela ne devrait pas vraiment avoir d'importance):

auto eth1
iface eth1 inet statique
    adresse xxx.xxx.xxx.xxx
    masque de réseau xx
    pre-up / sbin / ethtool -K $ IFACE lro off
ibux
la source
1

Pour Ubuntu, vous pouvez le faire en ajoutant la ligne suivante /etc/network/interfaces:

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

post-up ici effectuera l'opération donnée après avoir lancé l'interface spécifique.

Vishal Singal
la source
0

Oui, cela ne peut pas être fait en utilisant des fichiers de configuration pour le moment. Vous pouvez mettre en place la commande /etc/init.d/rc.localet cela devrait être fait.

Ce fichier est exécuté à la fin de la séquence de démarrage et donc tso serait désactivé pour l'interface.

Soham Chakraborty
la source