如何通过重启来保留ethtool设置


15

我想在CentOS5服务器上关闭tcp分段卸载。使用ethtool的命令是ethtool -K eth0 tso off但是,此设置仅在此会话中保留。如何使它在重新启动后仍然存在?


2
将其放在某个地方的启动脚本中。
Zoredache

Answers:


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

13

对于/ 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文件中自然定义了DEVICE。

不需要rc.local或多余的ifup脚本。在通用部署系统中很容易使用。


10

如果您使用的是RHEL7(或类似版本),并且使用网络管理器而不是/etc/init.d/network来控制您的接口,则建议的答案将不起作用,因为/ sbin / ifup-local(以及ifdown-pre-localifdown-local)将永远不会执行。

而是将脚本放入/etc/NetworkManager/dispatcher.d/,并确保已启用NetworkManager-dispatcher服务。

systemctl enable NetworkManager-dispatcher

提示:仅当NetworkManager对接口进行更改,不需要运行或任何其他操作时,调度程序才会启动,因此状态显示为

Active: inactive (dead)

完全没问题!

还要确保您的脚本是:

  1. 可执行文件(chmod + x)
  2. 由root拥有(own root:root)
  3. 只能由root用户写入(chmod 755)

现在,NetworkManager会将两(2)个变量传递给调度程序:

$ 1是接口(eno16777984eth0ppp0等)

$ 2保持状态(向上向下

并且它允许链接脚本(就像/ 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

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

并称之为一天。

干杯


请注意,这个问题非常老,已经有了可接受的答案,您的答案并没有真正添加新的答案。请尽量避免回答很老的帖子,因为它往往使首页变得混乱。
凯瑟琳·麦金尼斯

3
在Google上搜索“ ifup-local”,您将获得第6次点击。我什么都不会考虑“旧的”
user1972814

2
这无疑增加了一些在问候的CentOS 7.没有其他的解决方案中的CentOS 7.工作对我来说
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

注意:对于不同版本的RedHat / Fedora / CentOS,/ proc / net / bonding / bondX的内容可能与我编写脚本时所使用的版本不同。 。


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

那是文档所说的,但不起作用。可能是因为pre-up和up脚本中的解析逻辑有些过时,并且它们没有从interfaces文件中解析出所需的设置。不知道 至少,它对我不起作用。

因此,目前尚不可行但可行的解决方案仍然是创建/编辑本地/etc/rc.local文件,并说明要在该文件中执行的命令(但请注意,这可能会在接口已经被连接后中断网络一秒钟。带大)。所以有这个:

ethtool -s eth0速度10双工全自动

/etc/rc.local中的命令是按上述方法减慢接口速度的有效解决方案。

Ubuntu 17.04及更高版本上

例如,较新的Ubuntu使用Systemd,因此在达到“开始”运行级别时不一定要执行rc.local文件。必须启用“ rc-local”服务。尽管默认情况下似乎是默认设置,但出于向后兼容的原因,可能-请确保使用以下命令检查其状态:sudo systemctl status rc-local


pre-up指令在Linux Mint 17.3上为我设置了TSO标志,对我
有用

1

我发现在/etc/network/interfacesUbuntu 中实际上可以设置这种配置(当然,我large-receive-offload已将其用于关闭,但这并不重要):

自动eth1
iface eth1 inet静态
    地址xxx.xxx.xxx.xxx
    网络掩码xx
    pre-up / 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

张贴特定介面后,这里将执行指定的操作。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.