Я хотел бы отключить разгрузку сегментации 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
Имейте в виду, что это попытается применить настройки ко ВСЕМ интерфейсам, даже к шлейфу.
Если у нас есть разные интерфейсы, к которым мы хотим применить разные настройки, или хотим пропустить петлю, мы можем сделать оператор case
#!/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} gso off; -K $ {DEVICE} gro off; -K $ {DEVICE} tso off"
у вас должно быть естественно определено DEVICE в вашем файле ifcfg.
Не требуется ни rc.local, ни дополнительных скриптов ifup. Легко для вас в общих системах развертывания.
Если ты на RHEL7 (или подобное) и используйте Сетевой менеджер вместо того /etc/init.d/network для управления вашими интерфейсами предложенный ответ не подойдет, так как / sbin / ifup-местные (так же как ifdown-pre-local и ifdown-local) никогда не будут выполнены.
Вместо этого поместите свои скрипты в /etc/NetworkManager/dispatcher.d/ и убедитесь, что NetworkManager-диспетчер услуга включена
systemctl enable NetworkManager-dispatcher
Подсказка: Диспетчер сработает только после того, как NetworkManager внесет изменения в интерфейс, он не должен быть запущен или что-то еще, поэтому, если статус читает
Active: inactive (dead)
это совершенно нормально!
Также убедитесь, что ваш сценарий:
Теперь NetworkManager передаст диспетчеру две (2) переменные:
1 доллар являясь интерфейсом (eno16777984, eth0, ppp0, и т.д...)
2 доллара статус (либо вверх или вниз)
и он позволяет связывать сценарии (как и / etc / rc ...), чтобы иметь некоторый контроль над порядком, в котором диспетчер будет их выполнять:
10-первая, 20-секундная и так далее ...
При подключении порядок будет возрастать.
если [$ 2 = "вверх"] сначала 10, а затем 20 секунд
и спускается на отключение
если [$ 2 = "down"] вы получите 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 учебник способ сделать это - отредактировать / и т.д. / сеть / интерфейсы файл, который в свою очередь читается сценариями init.d / pre-up -up и т. д. Так что / и т.д. / сеть / интерфейсы файл может выглядеть так:
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
Я обнаружил, что установка такой конфигурации в /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
Для Ubuntu это можно сделать, добавив следующую строку в /etc/network/interfaces
:
auto eth0
iface eth0 inet static
[...]
post-up /sbin/ethtool -K eth0 tso off gso off gro off
post-up здесь выполнит данную операцию после вызова определенного интерфейса.
Да, на данный момент это невозможно сделать с помощью файлов конфигурации. Вы можете ввести команду в /etc/init.d/rc.local
и это должно быть сделано.
Этот файл выполняется при последней загрузке, поэтому tso будет отключен для интерфейса.