Я б хотів вимкнути завантаження сегментації tcp на сервері CentOS5. Використовуючи команду ethtool ethtool -K eth0 tso off
: Це налаштування зберігається лише для цього сеансу. Як я можу змусити його зберігатись через перезавантаження?
Я б хотів вимкнути завантаження сегментації tcp на сервері CentOS5. Використовуючи команду ethtool ethtool -K eth0 tso off
: Це налаштування зберігається лише для цього сеансу. Як я можу змусити його зберігатись через перезавантаження?
Відповіді:
З цієї веб-сторінки :
Ви можете ввести команди ettool в /etc/rc.local
(або еквівалент вашого дистрибутива), де команди виконуються після завершення поточного рівня запуску, але це не ідеально. Можливо, мережеві послуги почалися під час запуску рівня, і команди ettool мають тенденцію переривати мережевий трафік. Краще було б застосовувати команди під час створення інтерфейсу.
Служба мережі в 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-script / ifcfg- * у вас можуть бути:
ETHTOOL_OPTS = "- K $ {DEVICE} gso off gro to tso off"
якщо більше варіантів, то використовуйте подібні
ETHTOOL_OPTS = "- K $ {DEVICE} gso off; -K $ {DEVICE} gro off; -K $ {DEVICE} tso off"
у вашому файлі ifcfg повинен бути природний ПРИЛАД.
Ні rc.local, ні додаткові сценарії ifup не потрібні. Легко вам у загальних системах розгортання.
Якщо ви перебуваєте на RHEL7 (або подібному) і використовуєте Менеджер мереж замість /etc/init.d/network для управління своїми інтерфейсами, запропонована відповідь не працюватиме, оскільки / sbin / ifup-local (а також 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 = "вниз"] ви отримуєте 20 секунд, а потім 10-першу
і так далі.
Отже, щоб виконати те, що шукала ОП, ви можете поставити щось подібне:
#!/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
Caveat: вміст / proc / net / bonding / bondX може відрізнятися для різних версій RedHat / Fedora / CentOS від тієї, якою я користувався під час написання сценарію, тому команда витягнути імена підлеглого інтерфейсу може не працювати .
Поза темою, для користувачів Ubuntu, які прийшли сюди, як я, це як замітка:
Для Ubuntu це підручник - це редагувати файл / etc / network / interfaces, який, у свою чергу, читається сценаріями init.d / pre-up -up тощо. Отже, файл / etc / network / interface може виглядати так:
auto eth0
iface eth0 inet static
pre-up /sbin/ethtool -s eth0 speed 10 duplex full
Ось що кажуть документи, але це не працює . Можливо, логіка синтаксичного аналізу в сценаріях попереднього і вгору трохи датована, і вони не розбирають необхідні параметри з файлу інтерфейсів. Не знаю. Принаймні, це не працювало для мене.
Таким чином, на сьогодні хакерське, але робоче рішення - це все-таки створити / відредагувати локальний /etc/rc.local файл і вказати, що команда буде виконана там (але зауважте, що це може перервати мережу на секунду після того, як інтерфейс вже був вихований). Отже, маючи це:
ethtool -s eth0 швидкість 10 duplex full autoneg on
in /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
, але це насправді не має значення):
auto eth1 iface eth1 inet статична адреса xxx.xxx.xxx.xxx мережна маска xx pre-up / sbin / ethtool -K $ IFACE вимкнено
Для 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 буде вимкнено для інтерфейсу.