Me gustaría desactivar la descarga de segmentación tcp en un servidor CentOS5. Con ethtool, el comando es ethtool -K eth0 tso off
Sin embargo, esta configuración solo persiste para esta sesión. ¿Cómo puedo hacer que persista durante los reinicios?
Me gustaría desactivar la descarga de segmentación tcp en un servidor CentOS5. Con ethtool, el comando es ethtool -K eth0 tso off
Sin embargo, esta configuración solo persiste para esta sesión. ¿Cómo puedo hacer que persista durante los reinicios?
Respuestas:
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-post
verifica 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-local
hacerlo ejecutable con chmod +x /sbin/ifup-local
establecer 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.
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.
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:
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
if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
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-local
script 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-local
para analizar el contenido de /proc/bonding/bondX
la 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-local
parecí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 .
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
pre-up
directiva funcionó para mí en Linux Mint 17.3 para configurar el indicador TSO, gracias :)
Descubrí que establecer este tipo de configuración en /etc/network/interfaces
realidad 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
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.
Sí, no se puede hacer usando archivos de configuración por el momento. Puede poner el comando /etc/init.d/rc.local
y debe hacerse.
Ese archivo se ejecuta en la última secuencia de arranque y, por lo tanto, también se desactivaría para la interfaz.