Як зберегти настройки ettool за допомогою перезавантаження


15

Я б хотів вимкнути завантаження сегментації tcp на сервері CentOS5. Використовуючи команду ethtool ethtool -K eth0 tso off: Це налаштування зберігається лише для цього сеансу. Як я можу змусити його зберігатись через перезавантаження?


2
помістити його в стартовий сценарій десь.
Зоредаче

Відповіді:


15

З цієї веб-сторінки :

Ви можете ввести команди 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 застосовуються до інтерфейсів під час їх запуску, усі можливі переривання мережевого зв’язку робляться по мірі підключення інтерфейсу, і ваш сервер може продовжувати завантажуватися з усіма можливостями мережі.


також зверніть увагу на описаний тут ETHTOOL_OPTS access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/… Однак, чомусь він не працює на моїй машині, але superuser.com/questions/995200/…
javapowered

13

Для 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 не потрібні. Легко вам у загальних системах розгортання.


10

Якщо ви перебуваєте на 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)

це абсолютно добре!

Також переконайтесь, що ваш сценарій:

  1. виконуваний файл (chmod + x)
  2. належить корінь (chown root: корінь)
  3. доступний для запису тільки з коренем (chmod 755)

Тепер 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

І називайте це день.

Ура


Зауважте, що це запитання дуже давнє і що воно вже має прийняту відповідь, і ваша відповідь насправді не додає нового. Будь-ласка, намагайтеся уникати відповідей на дуже старі повідомлення, оскільки вони, як правило, захаращують головну сторінку.
Кетрін Макіннес

3
Шукайте в Google "ifup-local", і ви отримаєте це як шостий хіт. Нічого, що я вважав би "старим"
user1972814,

2
Це, безумовно, додає чогось щодо CentOS 7. Жодне інше рішення не працювало для мене у CentOS 7.
JDL

3
У скрипті bash є помилка, вона повинна бути:if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
dreua

5

У мене виникли проблеми з прийнятою відповіддю (що, поспішаю додати, мені було дуже корисно), оскільки я використовував зв’язані інтерфейси.

Мені знадобилось певний час, щоб дізнатись, що відбувається, але я виявив, що при підведенні облігації, або навіть при піднесенні раба облігацій поодинці, 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 від тієї, якою я користувався під час написання сценарію, тому команда витягнути імена підлеглого інтерфейсу може не працювати .


4

Поза темою, для користувачів 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, спасибі :)
Joril

1

Я виявив, що налаштування подібної конфігурації /etc/network/interfacesнасправді працює для Ubuntu (дано, я використовував її для відключення large-receive-offload, але це насправді не має значення):

auto eth1
iface eth1 inet статична
    адреса xxx.xxx.xxx.xxx
    мережна маска xx
    pre-up / sbin / ethtool -K $ IFACE вимкнено

1

Для Ubuntu ви можете це зробити, додавши наступний рядок у /etc/network/interfaces:

auto eth0
iface eth0 inet static
[...]
post-up /sbin/ethtool -K eth0 tso off gso off gro off

post-up тут виконає дану операцію після виведення конкретного інтерфейсу.


0

Так, це неможливо зробити за допомогою файлів конфігурації на даний момент. Ви можете поставити команду, /etc/init.d/rc.localі це слід зробити.

Цей файл виконується в останню чергу завантажувальної послідовності, тому tso буде вимкнено для інтерфейсу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.