Jawaban:
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-post
memeriksa 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-local
membuatnya dapat dieksekusi dengan chmod +x /sbin/ifup-local
mengatur konteks SELinux dengan chcon --reference /sbin/ifup /sbin/ifup-local
dan 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.
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.
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:
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
if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
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-local
skrip 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-local
untuk mem-parsing isi /proc/bonding/bondX
untuk 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-local
tampak 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 .
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
pre-up
direktif bekerja untuk saya di Linux Mint 17.3 untuk menetapkan bendera TSO, terima kasih :)
Saya menemukan bahwa pengaturan jenis konfigurasi ini /etc/network/interfaces
benar-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
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.
Ya, itu tidak dapat dilakukan menggunakan file konfigurasi untuk saat ini. Anda dapat memasang perintah /etc/init.d/rc.local
dan itu harus dilakukan.
File itu dieksekusi pada urutan terakhir dari urutan booting sehingga tso akan dimatikan untuk antarmuka.