我想关闭 CentOS5 服务器上的 tcp 分段卸载。使用 ethtool 的命令是ethtool -K eth0 tso off
但是,此设置仅在此会话中有效。我如何才能让它在重启后仍然有效?
答案1
对于 RHEL7,在 /etc/sysconfig/network-scripts/ifcfg-* 中您可能有:
ETHTOOL_OPTS="-K ${DEVICE} gso 关闭 gro 关闭 tso 关闭"
如果有更多选项则使用类似
ETHTOOL_OPTS="-K ${DEVICE} gso 关闭;-K ${DEVICE} gro 关闭;-K ${DEVICE} tso 关闭"
您必须在 ifcfg 文件中自然地定义 DEVICE。
无需 rc.local 或额外的 ifup 脚本。在通用部署系统中,对您来说很容易。
答案2
由此网页:
您可以在当前运行级别完成后运行命令的位置输入 ethtool 命令/etc/rc.local
(或您的发行版的等效命令),但这并不理想。网络服务可能在运行级别期间启动,而 ethtool 命令往往会中断网络流量。最好在接口启动时应用命令。
CentOS 中的网络服务具有此功能。该脚本/etc/sysconfig/network-scripts/ifup-post
检查是否存在/sbin/ifup-local
,如果存在,则以接口名称作为参数运行它(例如/sbin/ifup-local eth0
:)
我们可以使用 touch 创建此文件,并设置其 SELinux 上下文/sbin/ifup-local
使其可执行,然后在编辑器中打开它。chmod +x /sbin/ifup-local
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 设置在接口启动时应用于接口,所有潜在的网络通信中断都在接口启动时完成,并且您的服务器可以继续以完整的网络功能启动。
答案3
如果你RHEL7(或类似)并使用网络管理器代替/etc/init.d/网络控制你的接口,建议的答案将不起作用,因为/sbin/ifup-本地(也本地前和本地) 永远不会被执行。
而是将你的脚本放入/etc/NetworkManager/dispatcher.d/并确保网络管理器调度程序服务已启用
systemctl enable NetworkManager-dispatcher
暗示:调度程序只会在 NetworkManager 对接口进行更改后启动,它不需要运行或做任何事情,因此如果状态显示
Active: inactive (dead)
完全没问题!
还要确保您的脚本是:
- 可执行文件(chmod +x)
- 归 root 所有 (chown root:root)
- 仅 root 可写入 (chmod 755)
现在 NetworkManager 将向调度程序传递两个 (2) 个变量:
1 美元是界面(eno16777984,eth0,点对点0, ETC...)
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
就这样吧。
干杯
答案4
离题了,对于像我一样来到这里的 Ubuntu 用户,这里有一条注释:
在 Ubuntu 上,教科书方法是编辑/etc/网络/接口文件,该文件又被 init.d/pre-up 等脚本读取。因此/etc/网络/接口文件可能看起来像这样:
auto eth0
iface eth0 inet static
pre-up /sbin/ethtool -s eth0 speed 10 duplex full
文档上是这么说的,但是不起作用。可能是 pre-up 和 up 脚本中的解析逻辑有点过时,它们没有从接口文件中解析出所需的设置。不知道。至少,它对我来说不起作用。
因此,目前可行的解决方案仍然是创建/编辑本地/etc/rc.local文件并说明要在那里执行的命令(但请注意,这可能会在接口启动后中断网络几秒钟)。因此有这样的:
ethtool -s eth0 速度 10 双工全自动协商开启
在/etc/rc.local是如上所述降低界面速度的有效解决方案。
在Ubuntu 17.04 及以上版本
较新的 Ubuntu 使用 Systemd,因此 rc.local 文件不一定在达到“启动”运行级别时执行。必须启用“rc-local”服务。虽然默认情况下似乎是启用的,但出于向后兼容性的原因,可能 - 请务必使用以下命令检查其状态sudo systemctl status rc-local