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


15

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


2
それをどこかの開始スクリプトに入れてください。
ゾレダチェ

回答:


15

このウェブページから:

/etc/rc.local現在のランレベルの完了後にコマンドが実行される(またはディストリビューションの同等の)ethtoolコマンドを入力できますが、これは理想的ではありません。ランレベル中にネットワークサービスが開始された可能性があり、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設定はインターフェイスの起動時に適用され、ネットワーク通信の潜在的な中断はすべてインターフェイスの起動時に行われ、サーバーは完全なネットワーク機能で起動を継続できます。


またETHTOOL_OPTSに関する注意は、ここで説明access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/...それは私のマシンはまだ上で作業をしません何らかの理由によりしかしsuperuser.com/questions/995200/...
javapowered

12

/ etc / sysconfig / network-scripts / ifcfg- *にあるRHEL7の場合、次のものがあります。

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

さらにオプションがあれば、likeを使用します

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

ifcfgファイルでDEVICEを自然に定義する必要があります。

rc.localも追加のifupスクリプトも必要ありません。汎用展開システムで簡単に行えます。


10

あなたは上にある場合RHEL7(または同様)と使用ネットワークマネージャを代わりにの/etc/init.d/networkいるため、提案答えは動作しませんあなたのインタフェースを制御するために/ sbinに/ ifupのローカル(同様にifdownを-あらかじめローカルそして、ifdownをローカルで)実行されることはありません飽きないだろう。

代わりに、スクリプトを/etc/NetworkManager/dispatcher.d/に置き、NetworkManager-dispatcherサービスが有効になっていることを確認します

systemctl enable NetworkManager-dispatcher

ヒント:ディスパッチャは、NetworkManagerがインターフェイスに変更を加えた場合にのみ作動します。実行する必要はないため、ステータスが

Active: inactive (dead)

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

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

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

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

インターフェイスである$ 1eno16777984eth0ppp0など)

ステータスを保持している$ 2upまたはdown

また、スクリプトをチェーン化して(/ etc / rc ...と同様)、ディスパッチャが実行する順序を制御できます。

10-first、20-secondなど...

注文は接続時に昇順になります

[$ 2 = "up"]の場合、最初の10秒に続いて20秒

切断時に下降

[$ 2 = "down"]の場合、20秒後に10秒が続きます

等々。

OPが探していたものを達成するには、次のようなものを置くことができます。

#!/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」を検索すると、6番目のヒットとして取得されます。「古い」とみなされるものは何もない
-user1972814

2
これにより、CentOS 7に関して間違いなく何かが追加されます。CentOS7では、他のソリューションは機能しませんでし
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

注意:/ proc / net / bonding / bondXの内容は、RedHat / Fedora / CentOSのバージョンによって、スクリプトを作成したときに使用していたものと異なる場合があるため、スレーブインターフェイス名を引き出すコマンドが機能しない場合があります。


4

私のようにここに来たUbuntuユーザーのために、これはメモとしてオフトピックです:

Ubuntuの場合、教科書では、/ 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

それはドキュメントが言っていることですが、動作しません。準備スクリプトと起動スクリプトの解析ロジックは少し古く、インターフェイスファイルから必要な設定を解析しない可能性があります。わからない。少なくとも、私にとってはうまくいきませんでした。

そのため、今のところハックっぽいが動作する解決策は、ローカルの/etc/rc.localファイルを作成/編集し、そこにコマンドを出力することです(ただし、インターフェースが既に確立された後、数秒間ネットワークが中断する可能性があることに注意してください)育った)。だからこれを持っている:

ethtool -s eth0 speed 10二重全自動オン

/etc/rc.localの上に意図したとおりのインタフェースを遅くする作業溶液です。

のUbuntu 17.04と上記

最近のUbuntuではSystemdを使用しているため、たとえば、「開始」ランレベルに達したときにrc.localファイルが実行されるとは限りません。「rc-local」サービスを有効にする必要があります。デフォルトのようですが、後方互換性の理由から、おそらく-でステータスを確認してくださいsudo systemctl status rc-local


このpre-up指令は、TSOフラグを設定するためにLinux Mint 17.3で機能しました。ありがとう
ござい

1

この種の設定/etc/network/interfacesをUbuntu で実際に動作させることがわかりました(オフlarge-receive-offloadにするためにそれを使用したことは認めましたが、それは実際には問題ではありません)。

自動eth1
iface eth1 inet static
    アドレスxxx.xxx.xxx.xxx
    ネットマスクxx
    事前準備/ sbin / ethtool -K $ IFACE lro off

1

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

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

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


0

ええ、現時点では構成ファイルを使用して行うことはできません。コマンドを入れることができ/etc/init.d/rc.local、それを行う必要があります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.