Cara mempertahankan pengaturan ethtool melalui reboot


15

Saya ingin mematikan segmentasi tcp pada server CentOS5. Menggunakan ethtool perintahnya adalah ethtool -K eth0 tso offNamun, pengaturan ini hanya berlanjut untuk sesi ini. Bagaimana saya bisa membuatnya bertahan melalui reboot?


2
letakkan di skrip awal di suatu tempat.
Zoredache

Jawaban:


15

Dari halaman web ini :

Anda dapat memasukkan perintah ethtool di /etc/rc.local(atau yang setara dengan distribusi Anda) tempat perintah dijalankan setelah runlevel saat ini selesai, tetapi ini tidak ideal. Layanan jaringan mungkin telah dimulai selama perintah runlevel dan ethtool cenderung mengganggu lalu lintas jaringan. Akan lebih disukai untuk menerapkan perintah ketika antarmuka dibesarkan.

Layanan jaringan di CentOS memiliki kemampuan untuk melakukan ini. Script /etc/sysconfig/network-scripts/ifup-postmemeriksa keberadaan /sbin/ifup-local, dan jika ada, berjalan dengan nama antarmuka sebagai parameter (misalnya: /sbin/ifup-local eth0)

Kita dapat membuat file ini dengan sentuhan /sbin/ifup-localmembuatnya dapat dieksekusi dengan chmod +x /sbin/ifup-localmengatur konteks SELinux dengan chcon --reference /sbin/ifup /sbin/ifup-localdan kemudian membukanya di editor.

Sebuah skrip sederhana untuk menerapkan pengaturan yang sama ke semua antarmuka akan menjadi seperti ini

#!/bin/bash
if [ -n "$1" ]; then
/sbin/ethtool -G $1 rx 4096 tx 4096
/sbin/ethtool -K $1 tso on gso on
fi

Perlu diingat ini akan mencoba menerapkan pengaturan ke SEMUA antarmuka, bahkan loopback.

Jika kita memiliki antarmuka yang berbeda, kita ingin menerapkan pengaturan yang berbeda, atau ingin melewatkan loopback, kita dapat membuat pernyataan kasus

#!/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

Sekarang pengaturan ethtool diterapkan ke antarmuka saat mereka mulai, semua gangguan potensial terhadap komunikasi jaringan dilakukan saat antarmuka muncul, dan server Anda dapat terus melakukan booting dengan kapabilitas jaringan penuh.


juga perhatikan tentang ETHTOOL_OPTS yang dijelaskan di sini access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/... Namun karena beberapa alasan itu tidak berfungsi pada mesin saya namun superuser.com/questions/995200/…
javapowered

12

Untuk RHEL7 di / etc / sysconfig / network-scripts / ifcfg- * Anda mungkin memiliki:

ETHTOOL_OPTS = "- K $ {DEVICE} harus dihapus"

jika lebih banyak opsi maka gunakan like

ETHTOOL_OPTS = "- K $ {DEVICE} gso off; -K $ {DEVICE} hapus; -K $ {DEVICE} tso off"

Anda harus memiliki PERANGKAT secara alami didefinisikan dalam file ifcfg Anda.

Tidak diperlukan skrip rc.local atau ifup tambahan. Mudah bagi Anda dalam sistem penyebaran generik.


10

Jika Anda menggunakan RHEL7 (atau yang serupa) dan menggunakan Network Manager alih-alih /etc/init.d/network untuk mengontrol antarmuka Anda, jawaban yang diusulkan tidak akan berfungsi, karena / sbin / ifup-local (serta ifdown-pra-lokal) dan ifdown-local ) tidak akan pernah dieksekusi.

Alih-alih menempatkan skrip Anda ke /etc/NetworkManager/dispatcher.d/ dan pastikan layanan NetworkManager-dispatcher diaktifkan

systemctl enable NetworkManager-dispatcher

Petunjuk: Operator hanya akan melakukan kick ketika NetworkManager membuat perubahan pada antarmuka, itu tidak perlu dijalankan atau apa pun, jadi jika statusnya berbunyi

Active: inactive (dead)

itu baik-baik saja!

Pastikan juga skrip Anda adalah:

  1. dieksekusi (chmod + x)
  2. dimiliki oleh root (chown root: root)
  3. hanya dapat ditulis oleh root (chmod 755)

Sekarang NetworkManager akan meneruskan dua (2) variabel ke operator:

$ 1 menjadi antarmuka ( eno16777984 , eth0 , ppp0 , dll ...)

$ 2 memegang status (baik naik atau turun )

dan memungkinkan chaining skrip (seperti / etc / rc ...) untuk memiliki kontrol atas urutan di mana operator akan menjalankannya:

10 pertama, 20 detik dan seterusnya ...

Pesanan akan naik pada koneksi

jika [$ 2 = "naik"] 10-nya diikuti oleh 20-detik

dan turun pada putuskan

jika [$ 2 = "turun"] Anda mendapatkan 20 detik diikuti oleh 10-pertama

dan seterusnya.

Jadi untuk mencapai apa yang dicari OP, Anda bisa meletakkan sesuatu seperti ini:

#!/bin/bash
if [ "$1" = "eth0" && "$2" = "up" ]; then
  /sbin/ethtool --offload eth0 tso off
fi

di /etc/NetworkManager/dispatcher.d/20-ethtool

Dan menyebutnya sehari.

Bersulang


Harap perhatikan bahwa pertanyaan ini sudah sangat lama dan sudah memiliki jawaban yang diterima dan jawaban Anda tidak benar-benar menambahkan yang baru. Cobalah menghindari menjawab posting yang sangat lama karena cenderung mengacaukan halaman depan.
Catherine MacInnes

3
Cari Google untuk "ifup-local" dan Anda mendapatkan ini sebagai hit ke-6. Tidak ada yang saya anggap "lama"
user1972814

2
Ini jelas menambahkan sesuatu sehubungan dengan CentOS 7. Tidak ada solusi lain yang bekerja untuk saya di CentOS 7.
JDL

3
Skrip bash memiliki kesalahan, seharusnya:if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
dreua

5

Saya mengalami masalah dengan jawaban yang diterima (yang, saya cepat-cepat menambahkan, saya merasa sangat membantu) karena saya menggunakan antarmuka terikat.

Butuh beberapa saat untuk menemukan apa yang terjadi, tetapi saya menemukan bahwa ketika memunculkan ikatan, atau bahkan ketika memunculkan budak ikatan secara individu, ifup-localskrip tidak akan dipanggil untuk antarmuka budak. Saya berasumsi bahwa ini karena antarmuka slave tidak memiliki alamat IP yang ditugaskan untuk mereka.

Untuk mengatasinya, saya memodifikasi saya ifup-localuntuk mem-parsing isi /proc/bonding/bondXuntuk antarmuka yang telah dibesarkan, jika itu adalah ikatan, untuk mendapatkan nama antarmuka budak, dan kemudian melakukan hal-hal yang diperlukan dengan mereka.

Pada akhirnya saya ifup-localtampak seperti berikut:

#!/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

Peringatan: isi / proc / net / bonding / bondX mungkin berbeda untuk versi yang berbeda dari RedHat / Fedora / CentOS dengan yang saya gunakan ketika saya menulis skrip, jadi perintah untuk mengeluarkan nama antarmuka slave mungkin tidak berfungsi .


4

Di luar topik, untuk pengguna Ubuntu yang datang ke sini, seperti saya, ini sebagai catatan:

Di Ubuntu, cara buku teks untuk melakukannya adalah dengan mengedit file / etc / network / interfaces yang pada gilirannya dibaca oleh skrip init.d / pre-up-up, dll. Jadi file / etc / network / interfaces mungkin terlihat seperti ini:

auto eth0
iface eth0 inet static
pre-up /sbin/ethtool -s eth0 speed 10 duplex full

Itu yang dikatakan dokter, tetapi tidak berhasil . Mungkin logika parsing dalam skrip pra-naik dan naik sedikit tanggal dan mereka tidak menguraikan pengaturan yang diperlukan dari file antarmuka. Tidak tahu Setidaknya, itu tidak berhasil untuk saya.

Jadi solusi hack-ish tetapi berfungsi untuk saat ini adalah masih membuat / mengedit file /etc/rc.local lokal dan menyatakan perintah yang akan dikeluarkan di sana (tetapi perhatikan bahwa ini dapat mengganggu jaringan selama beberapa detik setelah antarmuka telah diangkat). Jadi memiliki ini:

ethtool -s eth0 speed 10 duplex full autoneg on

di /etc/rc.local adalah solusi yang berfungsi untuk memperlambat antarmuka sebagaimana dimaksud di atas.

Di Ubuntu 17.04 dan lebih tinggi

Ubuntus yang lebih baru menggunakan Systemd, dan dengan demikian file rc.local tidak perlu dieksekusi saat mencapai runlevel 'start', misalnya. Layanan "rc-local" harus diaktifkan. Meskipun tampaknya secara default, untuk alasan kompatibilitas ke belakang, mungkin - pastikan untuk memeriksa statusnya dengansudo systemctl status rc-local


The pre-updirektif bekerja untuk saya di Linux Mint 17.3 untuk menetapkan bendera TSO, terima kasih :)
Joril

1

Saya menemukan bahwa pengaturan jenis konfigurasi ini /etc/network/interfacesbenar-benar berfungsi untuk Ubuntu (memang saya menggunakannya untuk mematikan large-receive-offload, tetapi itu tidak terlalu menjadi masalah):

auto eth1
iface eth1 inet statis
    alamat xxx.xxx.xxx.xxx
    netmask xx
    pre-up / sbin / ethtool -K $ IFACE lro off

1

Untuk Ubuntu, Anda dapat melakukan ini dengan menambahkan baris berikut di /etc/network/interfaces:

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

post-up di sini akan melakukan operasi yang diberikan setelah membuka antarmuka spesifik.


0

Ya, itu tidak dapat dilakukan menggunakan file konfigurasi untuk saat ini. Anda dapat memasang perintah /etc/init.d/rc.localdan itu harus dilakukan.

File itu dieksekusi pada urutan terakhir dari urutan booting sehingga tso akan dimatikan untuk antarmuka.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.