web-dev-qa-db-ja.com

再起動を通じてethtool設定を保持する方法

CentOS5サーバーでtcpセグメンテーションオフロードをオフにしたいと思います。 ethtoolを使用すると、コマンドはethtool -K eth0 tso offただし、この設定はこのセッションでのみ持続します。どうすれば再起動後も持続させることができますか?

15
Gus E

これから 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設定が開始時にインターフェイスに適用され、インターフェイスが起動すると、ネットワーク通信へのすべての潜在的な中断が行われ、サーバーは完全なネットワーク機能で引き続き起動できます。

15
Gus E

/ 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スクリプトも必要ありません。一般的な展開システムで簡単にできます。

14
arl

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)

それは完全に大丈夫です!

また、スクリプトが次のとおりであることを確認してください。

  1. 実行可能ファイル(chmod + x)
  2. ルートが所有(chown root:root)
  3. rootのみが書き込み可能(chmod 755)

これで、NetworkManagerは2つの変数をディスパッチャーに渡します。

$ 1インターフェースであること(eno16777984ethpppなど...)

$ 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日と呼びます。

乾杯

10
user1972814

結合されたインターフェースを使用していたため、受け入れられた回答で問題が発生しました。

何が起こっているのかを知るのにしばらく時間がかかりましたが、ボンドを立ち上げるとき、またはボンドスレーブを個別に立ち上げるときでも、スレーブインターフェイスに対して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のバージョンによって、スクリプトの作成時に使用していたバージョンと異なる場合があるため、スレーブインターフェイス名を取得するコマンドが機能しない場合があります。

5
PaddyD

オフトピック、ここに来た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でステータスを確認してください

4
isync

Ubuntuの場合、/etc/network/interfacesに次の行を追加することでこれを行うことができます。

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

ここでのポストアップは、特定のインターフェイスを起動した後に、指定された操作を実行します。

1
Vishal Singal

この種の設定を/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 
1
ibux

ええ、今のところ設定ファイルを使ってそれを行うことはできません。コマンドは/etc/init.d/rc.localに置くことができ、実行する必要があります。

そのファイルはブートシーケンスの最後に実行されるため、インターフェイスのtsoはオフになります。

0