Только, чтобы быть ясным, единственным вопросом является желание Western Digital Caviar Green HDs быть до задания?
Вам предложили 24 из них, таким образом, с достойным уровнем RAID (как RAID 10) необходимо смочь вытащить достойную скорость из них, однако, эти жесткие диски нацелены на настольный рынок, и я не думаю, что хотел бы выполнить их в любом сервере, где время работы было важно.
Вы можете ввести команды ethtool в /etc/rc.local
(или в эквиваленте вашего дистрибутива), где команды запускаются после завершения текущего уровня выполнения, но это не идеально. Сетевые службы могли быть запущены на уровне запуска, и команды ethtool обычно прерывают сетевой трафик. Было бы предпочтительнее, чтобы команды применялись при открытии интерфейса.
Сетевая служба в CentOS имеет такую возможность. Сценарий / etc / sysconfig / network-scripts / ifup-post
проверяет наличие / sbin / ifup-local
и, если он существует, запускает его с именем интерфейса как параметр (например: и ваш сервер может продолжать загружаться с полным набором сетевых возможностей.
Да, на данный момент это невозможно сделать с помощью файлов конфигурации. Вы можете поместить команду в /etc/init.d/rc.local
, и это должно быть сделано.
Этот файл запускается в последней загрузочной последовательности, поэтому tso будет отключен для интерфейса.
Не по теме, для пользователей 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
У меня возникли проблемы с принятым ответом (который, спешу добавить, я нашел очень полезным), потому что я использовал связанные интерфейсы.
Мне потребовалось время, чтобы обнаружил, что происходит, но я обнаружил, что при вызове связи или даже при индивидуальном подключении подчиненного устройства, сценарий 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 от той, которую я использовал, когда писал сценарий, поэтому команда вытащить имена подчиненных интерфейсов может не получиться.
Я обнаружил, что установка такого типа конфигурации в / 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
Для 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 (или аналогичном) и используйте 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)
- это совершенно нормально!
Также убедитесь, что ваш скрипт:
Теперь 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
и закругляться.
Спасибо
. Для Ubuntu вы можете сделать это, добавив следующую строку в / etc / network / interfaces
:
auto eth0
iface eth0 inet static
[...]
post-up /sbin/ethtool -K eth0 tso off gso off gro off
post-up здесь выполнит данную операцию после вызова определенного интерфейса.