CentOS5サーバーでtcpセグメンテーションオフロードをオフにしたいと思います。 ethtoolを使用すると、コマンドはethtool -K eth0 tso off
ただし、この設定はこのセッションでのみ持続します。どうすれば再起動後も持続させることができますか?
これから webpage :
Ethtoolコマンドは/etc/rc.local
(またはディストリビューションの同等のもの)に入力できます。コマンドは現在のランレベルの完了後に実行されますが、これは理想的ではありません。ランレベル中にネットワークサービスが開始された可能性があり、ethtoolコマンドはネットワークトラフィックを中断する傾向があります。インターフェイスが起動するときにコマンドを適用する方が望ましいでしょう。
CentOSのネットワークサービスには、これを行う機能があります。スクリプト/etc/sysconfig/network-scripts/ifup-post
は/sbin/ifup-local
の存在を確認し、存在する場合は、インターフェース名をパラメーターとして使用して実行します(例:/sbin/ifup-local eth0
)
Touch /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設定が開始時にインターフェイスに適用され、インターフェイスが起動すると、ネットワーク通信へのすべての潜在的な中断が行われ、サーバーは完全なネットワーク機能で引き続き起動できます。
/ etc/sysconfig/network-scripts/ifcfg- *のRHEL7の場合:
ETHTOOL_OPTS = "-K $ {DEVICE} gso off gro off 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の代わりにNetwork Managerを使用する場合/ sbin/ifup-local(およびifdown-pre-localなので、提案された回答が機能しないインターフェイスを制御しますそしてifdown-local)は決して実行されません。
代わりに、スクリプトを/ etc/NetworkManager/dispatcher.d /に入れ、NetworkManager-dispatcherサービスが有効になっていることを確認します
systemctl enable NetworkManager-dispatcher
ヒント:ディスパッチャは、NetworkManagerがインターフェイスに変更を加えたときにのみ起動します。実行中などは必要ないため、ステータスが
Active: inactive (dead)
それは完全に大丈夫です!
また、スクリプトが次のとおりであることを確認してください。
これで、NetworkManagerは2つの変数をディスパッチャーに渡します。
$ 1インターフェースであること(eno16777984、eth、pppなど...)
$ 2ステータスを保持(pまたはdown)
また、(/ etc/rc ...のように)スクリプトをチェーンして、ディスパッチャーがスクリプトを実行する順序を制御できます。
10秒、20秒など...
注文は接続時に昇順になります
[$ 2 = "up"]の場合、最初の10秒の後に20秒
切断時に下降
[$ 2 = "down"]の場合、20秒後に10秒になります
等々。
したがって、OPが探していたものを達成するには、次のようなものを配置できます。
#!/bin/bash
if [ "$1" = "eth0" && "$2" = "up" ]; then
/sbin/ethtool --offload eth0 tso off
fi
in / etc/NetworkManager/dispatcher.d/20-ethtool
そして、それを1日と呼びます。
乾杯
結合されたインターフェースを使用していたため、受け入れられた回答で問題が発生しました。
何が起こっているのかを知るのにしばらく時間がかかりましたが、ボンドを立ち上げるとき、またはボンドスレーブを個別に立ち上げるときでも、スレーブインターフェイスに対して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では、 textbook これを行う方法は、/ etc/network/interfacesファイルを編集することです。このファイルは、init.d /によって読み取られます。 pre-up -upなどのスクリプト。したがって、/ etc/network/interfacesファイルは次のようになります。
auto eth0
iface eth0 inet static
pre-up /sbin/ethtool -s eth0 speed 10 duplex full
それはドキュメントが言うことですが、それは動作しません。 pre-upスクリプトとupスクリプトの解析ロジックが少し古く、interfacesファイルから必要な設定を解析していない可能性があります。分からない。少なくとも、それは私にとってはうまくいきませんでした。
したがって、今のところハックっぽいが実際に機能する解決策は、ローカル/ etc/rc.localファイルを作成/編集し、そこに実行されるコマンドを指定することです(ただし、これはインターフェイスがすでに起動した後、ネットワークが1秒間中断する場合があります)。だからこれを持っている:
ethtool -s eth0速度10二重全自動オン
/ etc/rc.localは、上記のようにインターフェイスを遅くするための実用的なソリューションです。
オンUbuntu 17.04以降
最近のUbuntuはSystemdを使用しているため、たとえば「start」ランレベルに達したときにrc.localファイルが実行されるとは限りません。 「rc-local」サービスを有効にする必要があります。デフォルトのようですが、後方互換性の理由から、おそらく-Sudo systemctl status rc-local
でステータスを確認してください
Ubuntuの場合、/etc/network/interfaces
に次の行を追加することでこれを行うことができます。
auto eth0
iface eth0 inet static
[...]
post-up /sbin/ethtool -K eth0 tso off gso off gro off
ここでのポストアップは、特定のインターフェイスを起動した後に、指定された操作を実行します。
この種の設定を/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
ええ、今のところ設定ファイルを使ってそれを行うことはできません。コマンドは/etc/init.d/rc.local
に置くことができ、実行する必要があります。
そのファイルはブートシーケンスの最後に実行されるため、インターフェイスのtsoはオフになります。