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

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

8 ответов

Решение

С этой веб-страницы:

Вы можете ввести команды 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

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

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

#!/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} отключено;-K ${DEVICE} выключено;-K ${DEVICE} отключено"

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

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

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

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

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 = "вниз"] вы получите 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 учебник может это сделать, отредактировав файл / etc / network / interfaces, который, в свою очередь, читается скриптами init.d / pre-up -up и т. Д. Поэтому файл / etc / network / interfaces может выглядеть следующим образом:

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

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

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

ethtool -s eth0 скорость 10 дуплекс полный автонег

в /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, но это не должно иметь большого значения):

авто eth1
iface eth1 inet static
    адрес xxx.xxx.xxx.xxx
    маска сети хх
    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

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

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

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

Другие вопросы по тегам