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

Только, чтобы быть ясным, единственным вопросом является желание Western Digital Caviar Green HDs быть до задания?

Вам предложили 24 из них, таким образом, с достойным уровнем RAID (как RAID 10) необходимо смочь вытащить достойную скорость из них, однако, эти жесткие диски нацелены на настольный рынок, и я не думаю, что хотел бы выполнить их в любом сервере, где время работы было важно.

15
задан 4 January 2013 в 21:05
8 ответов

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

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

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

15
ответ дан 2 December 2019 в 20:45

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

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

0
ответ дан 2 December 2019 в 20:45

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

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

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

4
ответ дан 2 December 2019 в 20:45

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

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

Я обнаружил, что установка такого типа конфигурации в / 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
1
ответ дан 2 December 2019 в 20:45

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

12
ответ дан 2 December 2019 в 20:45

Если Вы находитесь на 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, являясь интерфейсом (eno1677984, eth0, ppp0 и др. ...)

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

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

10-first, 20 seconds и так далее....

Ордер будет повышаться по соединению

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

и понижаться по разъединению

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

и так далее.

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

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

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

и закругляться.

Спасибо

.
9
ответ дан 2 December 2019 в 20:45

Для 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
ответ дан 2 December 2019 в 20:45

Теги

Похожие вопросы