Cómo mantener la configuración de ethtool mediante reinicio

15

Me gustaría desactivar la descarga de segmentación tcp en un servidor CentOS5. Con ethtool, el comando es ethtool -K eth0 tso offSin embargo, esta configuración solo persiste para esta sesión. ¿Cómo puedo hacer que persista durante los reinicios?

Gus E
fuente
2
ponerlo en un script de inicio en alguna parte.
Zoredache

Respuestas:

15

Desde esta página web :

Puede ingresar los comandos ethtool en /etc/rc.local (o el equivalente de su distribución) donde los comandos se ejecutan después de que se complete el nivel de ejecución actual, pero esto no es lo ideal. Los servicios de red pueden haberse iniciado durante el nivel de ejecución y los comandos ethtool tienden a interrumpir el tráfico de red. Sería más preferible tener los comandos aplicados a medida que se abre la interfaz.

El servicio de red en CentOS tiene la capacidad de hacer esto. El script /etc/sysconfig/network-scripts/ifup-postverifica la existencia de /sbin/ifup-local, y si existe, lo ejecuta con el nombre de la interfaz como parámetro (por ejemplo:/sbin/ifup-local eth0 )

Podemos crear este archivo con tacto, /sbin/ifup-localhacerlo ejecutable con chmod +x /sbin/ifup-localestablecer su contexto SELinux conchcon --reference /sbin/ifup /sbin/ifup-local y luego abrirlo en un editor.

Un script simple para aplicar la misma configuración a todas las interfaces sería algo así como

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

Tenga en cuenta que esto intentará aplicar la configuración a TODAS las interfaces, incluso al bucle invertido.

Si tenemos diferentes interfaces a las que queremos aplicar diferentes configuraciones o queremos omitir el loopback, podemos hacer una declaración de caso

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

Ahora, la configuración de ethtool se aplica a las interfaces a medida que comienzan, todas las interrupciones potenciales a la comunicación de red se realizan a medida que se abre la interfaz, y su servidor puede continuar arrancando con capacidades de red completas.

Gus E
fuente
También nota sobre ETHTOOL_OPTS describe aquí access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/... Sin embargo por alguna razón no funciona en mi máquina aún superuser.com/questions/995200/...
javapowered
12

Para RHEL7 en / etc / sysconfig / network-scripts / ifcfg- * puede tener:

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

si hay más opciones, use like

ETHTOOL_OPTS = "- K $ {DISPOSITIVO} desactivado; -K $ {DISPOSITIVO} desactivado; -K $ {DISPOSITIVO} desactivado"

tienes que tener DISPOSITIVO naturalmente definido en tu archivo ifcfg.

No se necesitan scripts rc.local ni ifup adicionales. Fácil para usted en sistemas de implementación genéricos.

arl
fuente
10

Si está en RHEL7 (o similar) y usa Network Manager en lugar de /etc/init.d/network para controlar sus interfaces, la respuesta propuesta no funcionará, ya que / sbin / ifup-local (así como ifdown-pre-local y ifdown-local ) nunca se ejecutarán.

En su lugar, coloque sus scripts en /etc/NetworkManager/dispatcher.d/ y asegúrese de que el servicio NetworkManager-dispatcher esté habilitado

systemctl enable NetworkManager-dispatcher

Sugerencia: el despachador solo se activará una vez que NetworkManager realice cambios en una interfaz, no es necesario que se esté ejecutando ni nada, por lo que si el estado se lee

Active: inactive (dead)

eso está completamente bien!

También asegúrese de que su script sea:

  1. ejecutable (chmod + x)
  2. propiedad de root (chown root: root)
  3. de escritura solo por root (chmod 755)

Ahora NetworkManager pasará dos (2) variables al despachador:

$ 1 es la interfaz ( eno16777984 , eth0 , ppp0 , etc.)

$ 2 manteniendo el estado ( arriba o abajo )

y permite encadenar los scripts (al igual que / etc / rc ...) para tener cierto control sobre el orden en que el despachador los ejecutará:

10 primeros, 20 segundos y así sucesivamente ...

El orden será ascendente en una conexión

if [$ 2 = "up"] es 10-first seguido de 20-second

y descendiendo en una desconexión

si [$ 2 = "down"] obtiene 20 segundos seguido de 10 primeros

y así.

Entonces, para lograr lo que OP estaba buscando, podría poner algo como esto:

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

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

Y llámalo un día.

Salud

usuario1972814
fuente
Tenga en cuenta que esta pregunta es muy antigua y que ya tiene una respuesta aceptada y su respuesta realmente no agrega nuevas. Intenta evitar responder a publicaciones muy antiguas, ya que tiende a saturar la página principal.
Catherine MacInnes
3
Busque en Google "ifup-local" y obtendrá esto como el sexto éxito. Nada que yo considere "viejo"
user1972814
2
Esto definitivamente agrega algo con respecto a CentOS 7. Ninguna otra solución funcionó para mí en CentOS 7.
JDL
3
El script bash tiene un error, debería ser:if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
dreua
5

Me encontré con problemas con la respuesta aceptada (que, me apresuré a agregar, me pareció muy útil) porque estaba usando interfaces enlazadas.

Me llevó un tiempo descubrir lo que estaba sucediendo, pero descubrí que al abrir un enlace, o incluso al abrir un esclavo de enlace individualmente, el ifup-localscript no se llamaría para las interfaces esclavas. Supongo que esto se debe a que las interfaces esclavas no tenían ninguna dirección IP asignada.

Para solucionar esto, modifiqué mi ifup-localpara analizar el contenido de /proc/bonding/bondXla interfaz que se había presentado, si era un enlace, para obtener los nombres de la interfaz esclava, y luego hice lo necesario con ellos.

Al final mi ifup-localparecía lo siguiente:

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

Advertencia: el contenido de / proc / net / bonding / bondX puede ser diferente para diferentes versiones de RedHat / Fedora / CentOS a la que estaba usando cuando escribí el script, por lo que el comando para extraer los nombres de la interfaz esclava puede no funcionar .

PaddyD
fuente
4

Fuera de tema, para los usuarios de Ubuntu que vinieron aquí, como yo, esto como una nota:

En Ubuntu, el libro de texto de manera de hacerlo es editar el etc / / network / interfaces de archivos que a su vez es leído por el init.d / pre-up -up, etc. guiones. Entonces, un archivo / etc / network / interfaces podría verse así:

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

Eso es lo que dicen los documentos, pero no funciona . Es posible que la lógica de análisis en los scripts anteriores y posteriores esté un poco anticuada y no analice la configuración requerida del archivo de interfaces. No se Al menos, no estaba funcionando para mí.

Entonces, la solución hack-ish pero que funciona por ahora es crear / editar un archivo local /etc/rc.local e indicar el comando que se emitirá allí (pero tenga en cuenta que esto puede interrumpir la conexión de red durante unos segundos después de que la interfaz ya haya sido activada) trajo). Entonces teniendo esto:

ethtool -s eth0 speed 10 duplex full autoneg on

en /etc/rc.local es la solución de trabajo para ralentizar una interfaz como se esperaba anteriormente.

En Ubuntu 17.04 y superior

Ubuntus más reciente utiliza Systemd y, por lo tanto, el archivo rc.local no se ejecuta necesariamente al alcanzar el nivel de ejecución 'inicio', por ejemplo. El servicio "rc-local" debe estar habilitado. Aunque parece ser por defecto, probablemente por razones de compatibilidad con versiones anteriores, asegúrese de verificar su estado consudo systemctl status rc-local

isync
fuente
La pre-updirectiva funcionó para mí en Linux Mint 17.3 para configurar el indicador TSO, gracias :)
Joril
1

Descubrí que establecer este tipo de configuración en /etc/network/interfacesrealidad funciona para Ubuntu (dado que lo usé para apagar large-receive-offload, pero eso realmente no debería importar):

auto eth1
iface eth1 inet static
    dirección xxx.xxx.xxx.xxx
    máscara de red xx
    pre-up / sbin / ethtool -K $ IFACE lro off
ibux
fuente
1

Para Ubuntu, puede hacer esto agregando la siguiente línea en /etc/network/interfaces:

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

la publicación posterior aquí realizará la operación dada después de abrir la interfaz específica.

Vishal Singal
fuente
0

Sí, no se puede hacer usando archivos de configuración por el momento. Puede poner el comando /etc/init.d/rc.localy debe hacerse.

Ese archivo se ejecuta en la última secuencia de arranque y, por lo tanto, también se desactivaría para la interfaz.

Soham Chakraborty
fuente