Como persistir as configurações do ethtool através da reinicialização

14

Eu gostaria de desativar o descarregamento de segmentação tcp em um servidor CentOS5. Usando o ethtool, o comando é ethtool -K eth0 tso off No entanto, essa configuração só persiste para esta sessão. Como posso fazer isso persistir durante as reinicializações?

    
por Gus E 04.01.2013 / 20:05

8 respostas

15

A partir desta página da web :

Você pode inserir os comandos ethtool em /etc/rc.local (ou o equivalente da sua distribuição), onde os comandos são executados após a conclusão do nível de execução atual, mas isso não é o ideal. Os serviços de rede podem ter iniciado durante o nível de execução e os comandos ethtool tendem a interromper o tráfego da rede. Seria mais preferível ter os comandos aplicados à medida que a interface é criada.

O serviço de rede no CentOS tem a capacidade de fazer isso. O script /etc/sysconfig/network-scripts/ifup-post verifica a existência de /sbin/ifup-local e, se existir, executa-o com o nome da interface como parâmetro (por exemplo: /sbin/ifup-local eth0 )

Podemos criar este arquivo com o toque /sbin/ifup-local para torná-lo executável com chmod +x /sbin/ifup-local definir seu contexto do SELinux com chcon --reference /sbin/ifup /sbin/ifup-local e depois abri-lo em um editor.

Um script simples para aplicar as mesmas configurações a todas as interfaces seria algo como

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

Lembre-se de que isso tentará aplicar as configurações em TODAS as interfaces, mesmo no loopback.

Se temos interfaces diferentes, queremos aplicar configurações diferentes, ou queremos pular o loopback, podemos fazer uma declaração 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

Agora as configurações do ethtool são aplicadas às interfaces conforme elas são iniciadas, todas as possíveis interrupções na comunicação de rede são feitas à medida que a interface é ativada e seu servidor pode continuar a inicialização com recursos de rede completos.

    
por 04.01.2013 / 20:11
8

Para o RHEL7 em / etc / sysconfig / network-scripts / ifcfg- * você pode ter:

ETHTOOL_OPTS="- K $ {DISPOSITIVO} desligue e desligue"

se houver mais opções, use como

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

você tem que ter naturalmente DEVICE definido em seu arquivo ifcfg.

Não são necessários scripts rc.local nem extra de ifup. Fácil para você em sistemas de implantação genéricos.

    
por 29.01.2016 / 10:35
6

Se você estiver em RHEL7 (ou semelhante) e usar Gerenciador de rede em vez de /etc/init.d/network para controlar seu interfaces a resposta proposta não funcionará, pois / sbin / ifup-local (assim como ifdown-pre-local e ifdown-local ) nunca será executado.

Em vez disso, coloque seus scripts em /etc/NetworkManager/dispatcher.d / e verifique se o serviço NetworkManager-dispatcher está ativado

systemctl enable NetworkManager-dispatcher

Dica: O despachante só será acionado assim que o NetworkManager fizer alterações em uma interface, não precisar estar em execução nem nada, por isso, se o status for

Active: inactive (dead)

está tudo bem!

Verifique também se o seu script é:

  1. executável (chmod + x)
  2. de propriedade de root (raiz do usuário: raiz)
  3. gravável apenas pelo root (chmod 755)

Agora, o NetworkManager passará duas (2) variáveis para o expedidor:

$1 being the interface (eno16777984, eth0, ppp0, etc...)

$2 holding the status (either up or down)

e permite encadear os scripts (assim como / etc / rc ...) para ter algum controle sobre a ordem em que o dispatcher irá executá-los:

10-first, 20-second and so on...

O pedido será ascendente em uma conexão

if [$2 = "up"] its 10-first followed by 20-second

e descendo em uma desconexão

if [$2 = "down"] you get 20-second followed by 10-first

e assim por diante.

Então, para realizar o que o OP estava procurando, você poderia colocar algo assim:

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

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

E chame isso por um dia.

Felicidades

    
por 27.05.2016 / 22:10
5

Eu me deparei com problemas com a resposta aceita (o que, devo acrescentar, achei muito útil) porque eu estava usando interfaces ligadas.

Demorei um pouco para descobrir o que estava acontecendo, mas descobri que ao criar um título, ou mesmo ao criar um escravo de títulos individualmente, o script ifup-local não seria chamado para as interfaces escravas. Eu suponho que isso acontece porque as interfaces escravas não tinham nenhum endereço IP atribuído a elas.

Para contornar isso, modifiquei meu ifup-local para analisar o conteúdo de /proc/bonding/bondX da interface que havia sido criada, se era uma ligação, para obter os nomes das interfaces escravas e, em seguida, fiz as coisas necessárias com eles.

No final, meu ifup-local se parece com o seguinte:

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

Ressalva: o conteúdo de / proc / net / bonding / bondX pode ser diferente para versões diferentes de RedHat / Fedora / CentOS para o que eu estava usando quando escrevi o script, então o comando para extrair os nomes das interfaces escravas pode não funcionar.

    
por 04.11.2014 / 19:29
4

Off-topic, para usuários do Ubuntu que vieram aqui, como eu, isso como uma nota:

No Ubuntu, o livro didático é a maneira de editar o / arquivo etc / network / interfaces que por sua vez é lido pelos scripts init.d / pre-up, etc. Então, um arquivo / etc / network / interfaces pode ter esta aparência:

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

É o que dizem os documentos, mas não funciona . Pode ser que a lógica de análise nos scripts de pré-up e up seja um pouco datada e eles não analisem as configurações necessárias do arquivo de interfaces. Não sei. Pelo menos, não estava funcionando para mim.

Portanto, a solução hack-ish mas working, por enquanto, ainda é criar / editar um arquivo /etc/rc.local local e declarar o comando a ser executado lá (mas note que isso pode interromper rede por alguns segundos após a interface já ter sido ativada). Então, tendo isso:

ethtool -s eth0 speed 10 duplex full autoneg on

em /etc/rc.local é a solução de trabalho para diminuir a velocidade de uma interface como pretendido acima.

No Ubuntu 17.04 e acima

Ubuntus mais recente usa o Systemd e, portanto, o arquivo rc.local não é necessariamente executado ao atingir o nível de execução 'start', por exemplo. O serviço "rc-local" deve estar ativado. Embora pareça ser por padrão, por motivos de compatibilidade com versões anteriores, provavelmente - certifique-se de verificar seu status com sudo systemctl status rc-local

    
por 19.01.2014 / 15:34
1

Descobri que a configuração desse tipo de configuração em /etc/network/interfaces realmente funciona para o Ubuntu (desde que eu usei para desativar large-receive-offload , mas isso realmente não deveria importar):

auto eth1
iface eth1 inet static
    address xxx.xxx.xxx.xxx
    netmask xx
    pre-up /sbin/ethtool -K $IFACE lro off
    
por 25.02.2016 / 20:36
1

Para o Ubuntu, você pode fazer isso adicionando a seguinte linha em /etc/network/interfaces :

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

o post-up aqui executará a operação em questão depois de exibir a interface específica.

    
por 22.02.2018 / 09:14
0

Sim, isso não pode ser feito usando arquivos de configuração no momento. Você pode colocar o comando em /etc/init.d/rc.local e isso deve ser feito.

Esse arquivo é executado na última seqüência de inicialização e, portanto, tso seria desativado para a interface.

    
por 04.01.2013 / 20:13