Answers:
从此网页:
您可以/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设置会在启动时应用于接口,在启动接口时会完成所有潜在的网络通信中断,并且服务器可以继续使用完整的网络功能启动。
如果您使用的是RHEL7(或类似版本),并且使用网络管理器而不是/etc/init.d/network来控制您的接口,则建议的答案将不起作用,因为/ sbin / ifup-local(以及ifdown-pre-local和ifdown-local)将永远不会执行。
而是将脚本放入/etc/NetworkManager/dispatcher.d/,并确保已启用NetworkManager-dispatcher服务。
systemctl enable NetworkManager-dispatcher
提示:仅当NetworkManager对接口进行更改,不需要运行或任何其他操作时,调度程序才会启动,因此状态显示为
Active: inactive (dead)
完全没问题!
还要确保您的脚本是:
现在,NetworkManager会将两(2)个变量传递给调度程序:
$ 1是接口(eno16777984,eth0,ppp0等)
$ 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中
并称之为一天。
干杯
if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
因为使用绑定接口,所以我遇到了可接受的答案的问题(我急忙补充一下,发现非常有帮助)。
我花了一段时间才发现正在发生的事情,但我发现当建立一个绑定,甚至单独建立一个绑定从属时,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的内容可能与我编写脚本时所使用的版本不同。 。
离题,对于像我这样来到这里的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标志,对我
对于Ubuntu,您可以通过在以下行中添加以下行来实现/etc/network/interfaces
:
auto eth0
iface eth0 inet static
[...]
post-up /sbin/ethtool -K eth0 tso off gso off gro off
张贴特定介面后,这里将执行指定的操作。
是的,暂时无法使用配置文件来完成。您可以放入命令/etc/init.d/rc.local
,它应该完成。
该文件在引导序列的最后执行,因此该接口的tso将被关闭。