如何通过重新启动来保持ethtool设置

我想closuresCentOS5服务器上的tcp分段卸载。 使用ethtool命令是ethtool -K eth0 tso off但是,此设置仅保留此会话。 我怎样才能让它坚持通过重新启动?

从这个网页 :

您可以在/etc/rc.local (或者您的发行版的等价物)中inputethtool命令,在当前运行级别完成之后运行命令,但这并不理想。 networking服务可能在运行级别启动,ethtool命令倾向于中断networkingstream量。 随着界面的提出,应用命令会更好。

CentOS中的networking服务有能力做到这一点。 脚本/etc/sysconfig/network-scripts/ifup-post检查是否存在/sbin/ifup-local ,如果存在,则以接口名称作为参数运行它(例如: /sbin/ifup-local eth0

我们可以使用touch /sbin/ifup-local来创build这个文件,使用chmod +x /sbin/ifup-local可执行它,用chcon --reference /sbin/ifup /sbin/ifup-local设置它的SELinux上下文,然后打开它编辑。

一个简单的脚本将相同的设置应用到所有接口将是类似的

 #!/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设置将在接口启动时应用,所有可能的networking通信中断都将在接口启动时完成,您的服务器可以继续使用全部networkingfunction启动。

对于/ etc / sysconfig / network-scripts / ifcfg- *中的RHEL7,您可能有:

ETHTOOL_OPTS =“ – K $ {DEVICE} gso off off off off off”

如果更多的select,然后使用

ETHTOOL_OPTS =“ – K $ {DEVICE}closures; -K $ {DEVICE}closures; -K $ {DEVICE}closures”

你必须自然地在你的ifcfg文件中定义DEVICE。

没有rc.local也不需要额外的ifup脚本。 在通用部署系统中对您很简单。

我遇到了接受的答案(我急于补充说,我发现非常有用)的问题,因为我正在使用绑定接口。

我花了一段时间才发现发生了什么事情,但是我发现,当build立一个债券,或者甚至单独build立债券奴隶时, ifup-local脚本不会被称为从属接口。 我认为这是因为从属接口没有分配给它们的IP地址。

为了解决这个问题,我修改了我的ifup-local来parsing已经提出的接口/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的内容可能与我在编写脚本时使用的版本不同,因此拔出从属接口名称的命令可能不起作用。

题外话,对于像我这样来到这里的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脚本中的parsing逻辑有些过时,并且没有从接口文件中parsing出所需的设置。 不知道。 至less,这不适合我。

因此,现在的工作方式仍然是创build/编辑一个本地的/etc/rc.local文件,并声明命令在那里被放逐(但是请注意,这可能在接口已经带大)。 所以有这个:

ethtool -s eth0 speed 10 duplex full autoneg on

/etc/rc.local中是正常工作的解决scheme。

我发现在/etc/network/interfaces中设置这种configuration实际上适用于Ubuntu(我曾经用它来closureslarge-receive-offload ,但实际上并不重要):

 auto eth1
 iface eth1 inet static
    地址xxx.xxx.xxx.xxx
     netmask xx
     pre-up / sbin / ethtool -K $ IFACEclosures

如果你使用的是RHEL7 (或者类似的)并且使用networkingpipe理器而不是/etc/init.d/network来控制你的接口,那么build议的答案将不起作用,因为/ sbin / ifup-local (以及ifdown-local-localifdown-local )永远不会被执行。

而是把你的脚本放到/etc/NetworkManager/dispatcher.d/中 ,确保NetworkManager-dispatcher服务启用

 systemctl enable NetworkManager-dispatcher 

提示:调度程序只有在NetworkManager对接口进行更改时才会启动,不需要运行或任何操作,所以如果状态为

 Active: inactive (dead) 

这是完全好的!

还要确保你的脚本是:

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

现在NetworkManager将两个(2)variables传递给调度器:

$ 1是接口( eno16777984eth0ppp0等)

$ 2持有状态(

它允许链接脚本(就像/ etc / rc …)一样控制调度器执行它们的顺序:

10秒,20秒等等…

订单将在连接上升

如果[$ 2 =“up”],那么它的10-first,然后是20-second

并在断开连接时下降

如果[$ 2 =“down”]则获得20秒,然后是10-first

等等。

所以为了完成OP所寻找的东西,你可以把这样的东西:

 #!/bin/bash if [ "$1" = "eth0" && "$2" = "up" ]; then /sbin/ethtool --offload eth0 tso off fi 

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

一天过去吧

干杯

是的,暂时不能使用configuration文件来完成。 你可以把这个命令放在/etc/init.d/rc.local ,它应该完成。

该文件在引导序列的最后执行,因此将closures该接口。