Вопрос: Как сохранить настройки ethtool с помощью перезагрузки


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


13
2018-01-04 19:05


Источник


поместите его в стартовый скрипт где-нибудь. - Zoredache


Ответы:


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

Вы можете ввести команды ethtool в /etc/rc.local (или эквивалент вашего дистрибутива), где команды запускаются после завершения текущего уровня выполнения, но это не идеально. Сетевые службы, возможно, начались во время команд runlevel, а команды 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

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

Если у нас есть разные интерфейсы, мы хотим применить разные настройки или пропустить loopback, мы можем сделать оператор 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 применяются к интерфейсам по мере их запуска, все возможные перерывы в сетевой коммуникации выполняются по мере расширения интерфейса, и ваш сервер может продолжать загружаться с полным сетевым потенциалом.


15
2018-01-04 19:11



Эй, это мой блог! Спасибо за кредит ссылки :) - suprjami
также обратите внимание на описанные здесь ETHTOOL_OPTS access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/... Однако по какой-то причине он еще не работает на моей машине superuser.com/questions/995200/... - javapowered


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

ETHTOOL_OPTS = "- K $ {УСТРОЙСТВО} gso off gro off tso off"

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

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

вы должны иметь естественное УСТРОЙСТВО, определенное в вашем файле ifcfg.

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


7
2018-01-29 09:35





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

Мне потребовалось некоторое время, чтобы узнать, что происходит, но я обнаружил, что, воспитывая связь, или даже когда воспитывать раб-раб по отдельности, 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 с тем, которое я использовал при написании сценария, поэтому команда вытащить имена подчиненных интерфейсов может не работать ,


5
2017-11-04 18:29





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

Вместо этого ваши скрипты /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 = "вниз"], вы получаете 20 секунд, затем 10-первых

и так далее.

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

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

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

И назовите это днем.

ура


4
2018-05-27 20:10



Обратите внимание, что этот вопрос очень старый и что у него уже есть принятый ответ, и ваш ответ действительно не добавляет новых. Пожалуйста, старайтесь избегать ответов на очень старые сообщения, поскольку он имеет тенденцию загромождать первую страницу. - Catherine MacInnes
Найдите Google для «ifup-local», и вы получите это как шестой хит. Ничего, что я бы считал «старым», - user1972814
Это определенно добавляет что-то в отношении CentOS 7. Никакое другое решение не работало для меня в CentOS 7. - JDL
Сценарий bash имеет ошибку, он должен быть: if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then - dreua


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

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

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

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

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

ethtool -s eth0 speed 10 duplex full autoneg on

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

На Ubuntu 17.04 и выше

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


4
2018-01-19 14:34



pre-up директива работала для меня на Linux Mint 17.3 для установки флага TSO, спасибо :) - Joril


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

auto eth1
iface eth1 inet static
    адрес xxx.xxx.xxx.xxx
    сетевая маска xx
    pre-up / sbin / ethtool -K $ IFACE lro off

1
2018-02-25 19:36





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

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

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


1
2018-02-22 08:14