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


15

Gostaria de desativar o descarregamento de segmentação TCP em um servidor CentOS5. Usando o ethtool, o comando é ethtool -K eth0 tso offNo entanto, essa configuração persiste apenas para esta sessão. Como faço para persistir durante as reinicializações?


2
coloque-o em um script inicial em algum lugar.
Zoredache

Respostas:


15

Nesta página :

Você pode inserir os comandos ethtool /etc/rc.local(ou o equivalente da sua distribuição) em que 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 sido iniciados durante o nível de execução e os comandos ethtool tendem a interromper o tráfego de rede. Seria mais preferível aplicar os comandos à medida que a interface é exibida.

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

Podemos criar esse arquivo com o toque, /sbin/ifup-localtorná-lo executável, chmod +x /sbin/ifup-localdefinir o contexto do SELinux chcon --reference /sbin/ifup /sbin/ifup-locale 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 tivermos interfaces diferentes para as quais queremos aplicar configurações diferentes ou para 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 ethtool são aplicadas às interfaces quando elas são iniciadas, todas as possíveis interrupções na comunicação da rede são feitas à medida que a interface é criada, e o servidor pode continuar a inicialização com todos os recursos de rede.


observe também o ETHTOOL_OPTS descrito aqui access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/… No entanto, por algum motivo, ele ainda não funciona na minha máquina superuser.com/questions/995200/…
javapowered

12

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

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

se houver mais opções, use como

ETHTOOL_OPTS = "- K $ {DEVICE} desabilitado; -K $ {DEVICE} desabilitado; -K $ {DEVICE} desabilitado"

você precisa ter naturalmente DEVICE definido no seu arquivo ifcfg.

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


10

Se você estiver no RHEL7 (ou similar) e usar o Network Manager em vez do /etc/init.d/network para controlar suas interfaces, a resposta proposta não funcionará, já que / sbin / ifup-local (assim como ifdown-pré-local) e ifdown-local ) nunca serão executados.

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ó entra em ação quando o NetworkManager faz alterações em uma interface, não precisa estar em execução nem nada, portanto, se o status indicar

Active: inactive (dead)

tudo bem!

Verifique também se o seu script é:

  1. executável (chmod + x)
  2. de propriedade da raiz (raiz da raiz: raiz)
  3. gravável apenas pela raiz (chmod 755)

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

$ 1 sendo a interface ( eno16777984 , eth0 , ppp0 , etc ...)

$ 2 mantendo o status (para cima ou para baixo )

e permite encadear os scripts (assim como / etc / rc ...) para ter algum controle sobre a ordem na qual o expedidor os executará:

10 primeiro, 20 segundos e assim por diante ...

O pedido será crescente em uma conexão

se [$ 2 = "up"] for 10 primeiros, seguido por 20 segundos

e descendo em uma desconexão

se [$ 2 = "down"] você obtiver 20 segundos, seguido por 10 primeiros

e assim por diante.

Portanto, 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 termine um dia.

Felicidades


Observe que esta pergunta é muito antiga e que ela já tem uma resposta aceita e sua resposta não adiciona novas. Tente evitar responder a postagens muito antigas, pois elas tendem a desorganizar a primeira página.
Catherine MacInnes 27/05

3
Pesquise no Google por "ifup-local" e você verá isso como o sexto hit. Nada que eu consideraria "antigo"
user1972814 27/05

2
Isso definitivamente acrescenta algo em relação ao CentOS 7. Nenhuma outra solução trabalharam para mim no CentOS 7.
JDL

3
O script bash tem um erro, ele deve ser:if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
dreua

5

Encontrei problemas com a resposta aceita (que, apressadamente, acrescento, achei muito útil) porque estava usando interfaces vinculadas.

Demorei um pouco para descobrir o que estava acontecendo, mas descobri que, ao criar um vínculo, ou mesmo ao criar um escravo de vínculo individualmente, o ifup-localscript não seria chamado para as interfaces de escravo. Suponho que isso ocorre porque as interfaces escravas não tinham nenhum endereço IP atribuído a elas.

Para contornar isso, modifiquei o meu ifup-localpara analisar o conteúdo da /proc/bonding/bondXinterface criada, se fosse um vínculo, para obter os nomes da interface escrava e, em seguida, fiz as coisas necessárias com elas.

No final, eu ifup-localparecia 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

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


4

Fora do tópico, para usuários do Ubuntu que vieram aqui, como eu, isso como uma nota:

No Ubuntu, a maneira mais prática de fazer isso é editar o arquivo / etc / network / interfaces, que por sua vez é lido pelos scripts init.d / pre-up -up, etc. Portanto, um arquivo / etc / network / interfaces pode ter a seguinte 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 esteja um pouco desatualizada e eles não analisem as configurações necessárias no arquivo de interfaces. Não sei. Pelo menos, não estava funcionando para mim.

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

ethtool -s eth0 velocidade 10 duplex autoneg completo em

em /etc/rc.local é a solução que funciona para diminuir a velocidade da interface, conforme planejado acima.

No Ubuntu 17.04 e superior

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 estar por padrão, provavelmente por motivos de compatibilidade com versões anteriores - verifique o status comsudo systemctl status rc-local


A pre-updirectiva trabalhou para mim em Linux Mint 17,3 para definir o sinalizador TSO, graças :)
Joril

1

Eu descobri que definir esse tipo de configuração /etc/network/interfacesrealmente funciona para o Ubuntu (desde que eu o usei para desligar large-receive-offload, mas isso não deveria importar):

auto eth1
iface eth1 inet static
    endereço xxx.xxx.xxx.xxx
    netmask xx
    pré-up / sbin / ethtool -K $ IFACE lro off

1

Para o Ubuntu, você pode fazer isso adicionando a seguinte linha /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 especificada após exibir a interface específica.


0

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

Esse arquivo é executado no final da sequência de inicialização e, portanto, é desativado para a interface.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.