Назад | Перейти на главную страницу

Как сохранить настройки ethtool после перезагрузки

Я хотел бы отключить разгрузку сегментации tcp на сервере CentOS5. Используя ethtool, команда ethtool -K eth0 tso off Однако этот параметр сохраняется только для этого сеанса. Как я могу сделать так, чтобы он сохранялся при перезагрузке?

Из этого страница интернета:

Вы можете ввести команды ethtool в /etc/rc.local (или эквивалент вашего дистрибутива), где команды запускаются после завершения текущего уровня выполнения, но это не идеально. Сетевые службы могли быть запущены на уровне запуска, и команды ethtool обычно прерывают сетевой трафик. Было бы предпочтительнее, чтобы команды применялись по мере появления интерфейса.

Сетевая служба в CentOS имеет такую ​​возможность. Сценарий /etc/sysconfig/network-scripts/ifup-post проверяет наличие /sbin/ifup-local, и если он существует, запускает его с именем интерфейса в качестве параметра (например: /sbin/ifup-local eth0)

Мы можем создать этот файл прикосновением /sbin/ifup-local сделать его исполняемым с помощью chmod +x /sbin/ifup-local установите его контекст SELinux с помощью chcon --reference /sbin/ifup /sbin/ifup-local а затем откройте его в редакторе.

Простой сценарий для применения одинаковых настроек ко всем интерфейсам будет выглядеть примерно так:

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

Имейте в виду, что это попытается применить настройки ко ВСЕМ интерфейсам, даже к шлейфу.

Если у нас есть разные интерфейсы, к которым мы хотим применить разные настройки, или хотим пропустить петлю, мы можем сделать оператор case

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

Теперь настройки ethtool применяются к интерфейсам при их запуске, все потенциальные прерывания сетевой связи выполняются по мере запуска интерфейса, и ваш сервер может продолжать загрузку с полными сетевыми возможностями.

Для RHEL7 в / etc / sysconfig / network-scripts / ifcfg- * у вас может быть:

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

если больше вариантов, используйте как

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

у вас должно быть естественно определено DEVICE в вашем файле ifcfg.

Не требуется ни rc.local, ни дополнительных скриптов ifup. Легко для вас в общих системах развертывания.

Если ты на RHEL7 (или подобное) и используйте Сетевой менеджер вместо того /etc/init.d/network для управления вашими интерфейсами предложенный ответ не подойдет, так как / sbin / ifup-местные (так же как ifdown-pre-local и ifdown-local) никогда не будут выполнены.

Вместо этого поместите свои скрипты в /etc/NetworkManager/dispatcher.d/ и убедитесь, что NetworkManager-диспетчер услуга включена

systemctl enable NetworkManager-dispatcher

Подсказка: Диспетчер сработает только после того, как NetworkManager внесет изменения в интерфейс, он не должен быть запущен или что-то еще, поэтому, если статус читает

Active: inactive (dead)

это совершенно нормально!

Также убедитесь, что ваш сценарий:

  1. исполняемый файл (chmod + x)
  2. принадлежит root (chown root: root)
  3. доступен для записи только root (chmod 755)

Теперь NetworkManager передаст диспетчеру две (2) переменные:

1 доллар являясь интерфейсом (eno16777984, eth0, ppp0, и т.д...)

2 доллара статус (либо вверх или вниз)

и он позволяет связывать сценарии (как и / etc / rc ...), чтобы иметь некоторый контроль над порядком, в котором диспетчер будет их выполнять:

10-первая, 20-секундная и так далее ...

При подключении порядок будет возрастать.

если [$ 2 = "вверх"] сначала 10, а затем 20 секунд

и спускается на отключение

если [$ 2 = "down"] вы получите 20 секунд, а затем 10 первых

и так далее.

Итак, чтобы выполнить то, что искал OP, вы можете поместить что-то вроде этого:

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

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

И положить конец этому.

Ура

У меня возникли проблемы с принятым ответом (который, спешу добавить, я нашел очень полезным), потому что я использовал связанные интерфейсы.

Мне потребовалось некоторое время, чтобы понять, что происходит, но я обнаружил, что при поднятии связи или даже при индивидуальном воспитании связанного раба ifup-local сценарий не будет вызываться для подчиненных интерфейсов. Я предполагаю, что это связано с тем, что подчиненным интерфейсам не назначены какие-либо IP-адреса.

Чтобы обойти это, я изменил свой ifup-local разбирать содержимое /proc/bonding/bondX для интерфейса, который был запущен, если это была связь, чтобы получить имена подчиненных интерфейсов, а затем проделать с ними необходимые вещи.

В конце концов мой ifup-local выглядело так:

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

Предостережение: содержимое / proc / net / bonding / bondX может отличаться для разных версий RedHat / Fedora / CentOS от той, которую я использовал, когда писал скрипт, поэтому команда для извлечения имен подчиненных интерфейсов может не работать .

Не по теме, для пользователей Ubuntu, которые пришли сюда, как и я, это в качестве примечания:

В Ubuntu учебник способ сделать это - отредактировать / и т.д. / сеть / интерфейсы файл, который в свою очередь читается сценариями init.d / pre-up -up и т. д. Так что / и т.д. / сеть / интерфейсы файл может выглядеть так:

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

Так говорят документы, но это не работает. Возможно, логика синтаксического анализа в сценариях подготовки и запуска немного устарела, и они не анализируют необходимые настройки из файла интерфейсов. Не знаю. По крайней мере, у меня это не сработало.

Итак, хакерское, но рабочее решение на данный момент по-прежнему заключается в создании / редактировании локального /etc/rc.local файл и указав команду, которая должна быть завершена там (но обратите внимание, что это может прервать работу сети на несколько секунд после того, как интерфейс уже был запущен). Итак, имея это:

ethtool -s eth0 speed 10 duplex full autoneg on

в /etc/rc.local - это рабочее решение для замедления интерфейса, как указано выше.

На Ubuntu 17.04 и выше

Более поздние версии Ubuntus используют Systemd, поэтому файл rc.local не обязательно запускается, например, при достижении уровня запуска «start». Должна быть включена служба "rc-local". Хотя кажется, что это по умолчанию, вероятно, из соображений обратной совместимости - обязательно проверьте его статус с помощью sudo systemctl status rc-local

Я обнаружил, что установка такой конфигурации в /etc/network/interfaces действительно работает для Ubuntu (если я использовал его для отключения large-receive-offload, но это не должно иметь значения):

auto eth1
iface eth1 inet static
    address xxx.xxx.xxx.xxx
    netmask xx
    pre-up /sbin/ethtool -K $IFACE lro off

Для Ubuntu это можно сделать, добавив следующую строку в /etc/network/interfaces:

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

post-up здесь выполнит данную операцию после вызова определенного интерфейса.

Да, на данный момент это невозможно сделать с помощью файлов конфигурации. Вы можете ввести команду в /etc/init.d/rc.local и это должно быть сделано.

Этот файл выполняется при последней загрузке, поэтому tso будет отключен для интерфейса.