Как сохранить настройки 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)
это совершенно нормально!
Также убедитесь, что ваш скрипт:
- исполняемый файл (chmod +x)
- принадлежит root (chown root:root)
- Доступно для записи только пользователю 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.