我想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-local和ifdown-local )永远不会被执行。
而是把你的脚本放到/etc/NetworkManager/dispatcher.d/中 ,确保NetworkManager-dispatcher服务启用
systemctl enable NetworkManager-dispatcher
提示:调度程序只有在NetworkManager对接口进行更改时才会启动,不需要运行或任何操作,所以如果状态为
Active: inactive (dead)
这是完全好的!
还要确保你的脚本是:
现在NetworkManager将两个(2)variables传递给调度器:
$ 1是接口( eno16777984 , eth0 , ppp0等)
$ 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该接口。