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


15

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


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

Ответы:


15

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

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


также обратите внимание на ETHTOOL_OPTS, описанный здесь access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/… Однако по какой-то причине он еще не работает на моей машине superuser.com/questions/995200/…
javapowered

12

Для 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. Легко для вас в общих системах развертывания.


10

Если вы используете 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

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

ура


Обратите внимание, что этот вопрос очень старый и на него уже есть принятый ответ, и ваш ответ на самом деле не добавляет новый. Пожалуйста, постарайтесь не отвечать на очень старые сообщения, так как это приводит к загромождению главной страницы.
Кэтрин Макиннес

3
Поищите в Google «ifup-local», и вы получите это как 6-й хит. Ничего, что я бы посчитал "старым"
user1972814

2
Это определенно добавляет что-то в отношении CentOS 7. У меня не было другого решения в CentOS 7.
JDL

3
В скрипте bash есть ошибка, она должна быть:if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
dreua

5

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

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


4

Не по теме, для пользователей 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


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

1

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

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

1

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

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

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


0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.