Я хотел бы отключить разгрузку сегментации tcp на сервере CentOS5. При использовании команды ethtool, ethtool -K eth0 tso off
однако, этот параметр сохраняется только для этого сеанса. Как я могу сделать это через перезагрузки?
Я хотел бы отключить разгрузку сегментации tcp на сервере CentOS5. При использовании команды ethtool, ethtool -K eth0 tso off
однако, этот параметр сохраняется только для этого сеанса. Как я могу сделать это через перезагрузки?
Ответы:
С этой веб-страницы :
Вы можете вводить команды 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)
это совершенно нормально!
Также убедитесь, что ваш скрипт:
Теперь 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
И назовите это днем.
ура
if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
У меня возникли проблемы с принятым ответом (который, спешу добавить, я нашел очень полезным), потому что я использовал связанные интерфейсы.
Мне потребовалось некоторое время, чтобы выяснить, что происходит, но я обнаружил, что при установлении связи или даже при индивидуальном поднятии подчиненного 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
pre-up
меня в Linux Mint 17.3 работала директива для установки флага TSO, спасибо :)
Я обнаружил, что настройка этого типа конфигурации на /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.