Câu trả lời:
Từ trang web này :
Bạn có thể nhập các lệnh ethtool trong /etc/rc.local
(hoặc tương đương phân phối của bạn) nơi các lệnh được chạy sau khi runlevel hiện tại hoàn thành, nhưng điều này không lý tưởng. Các dịch vụ mạng có thể đã bắt đầu trong các lệnh runlevel và ethtool có xu hướng làm gián đoạn lưu lượng mạng. Sẽ tốt hơn nếu có các lệnh được áp dụng khi giao diện được đưa lên.
Dịch vụ mạng trong CentOS có khả năng thực hiện điều này. Kịch bản /etc/sysconfig/network-scripts/ifup-post
kiểm tra sự tồn tại của /sbin/ifup-local
và nếu nó tồn tại, hãy chạy nó với tên giao diện làm tham số (ví dụ /sbin/ifup-local eth0
:)
Chúng ta có thể tạo tệp này bằng cảm ứng /sbin/ifup-local
để làm cho nó có thể thực thi được bằng cách chmod +x /sbin/ifup-local
đặt bối cảnh SELinux của nó với chcon --reference /sbin/ifup /sbin/ifup-local
và sau đó mở nó trong một trình soạn thảo.
Một tập lệnh đơn giản để áp dụng các cài đặt giống nhau cho tất cả các giao diện sẽ giống như
#!/bin/bash
if [ -n "$1" ]; then
/sbin/ethtool -G $1 rx 4096 tx 4096
/sbin/ethtool -K $1 tso on gso on
fi
Hãy nhớ rằng điều này sẽ cố gắng áp dụng các cài đặt cho TẤT CẢ các giao diện, thậm chí cả loopback.
Nếu chúng tôi có các giao diện khác nhau, chúng tôi muốn áp dụng các cài đặt khác nhau hoặc muốn bỏ qua loopback, chúng tôi có thể đưa ra tuyên bố trường hợp
#!/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
Bây giờ cài đặt ethtool được áp dụng cho các giao diện khi chúng bắt đầu, tất cả các gián đoạn tiềm ẩn đối với giao tiếp mạng được thực hiện khi giao diện được đưa lên và máy chủ của bạn có thể tiếp tục khởi động với khả năng mạng đầy đủ.
Đối với RHEL7 trong / etc / sysconfig / network-scripts / ifcfg- * bạn có thể có:
ETHTOOL_OPTS = "- K $ {DEVICE} đã tắt máy tính"
Nếu có nhiều lựa chọn thì hãy sử dụng như
ETHTOOL_OPTS = "- K $ {DEVICE} gso off; -K $ {DEVICE} Gro off; -K $ {DEVICE} tắt"
bạn phải có DEVICE tự nhiên được xác định trong tệp ifcfg của bạn.
Không có kịch bản lệnh RC.local hay thêm ifup cần thiết. Dễ dàng cho bạn trong các hệ thống triển khai chung.
Nếu bạn đang sử dụng RHEL7 (hoặc tương tự) và sử dụng Trình quản lý mạng thay vì /etc/init.d/network để kiểm soát các giao diện của bạn, câu trả lời được đề xuất sẽ không hoạt động, vì / sbin / ifup-local (cũng như ifdown-pre-local và ifdown-local ) sẽ không bao giờ được thực thi.
Thay vì đặt các kịch bản của bạn vào /etc/NetworkManager/dispatcher.d/ và chắc chắn rằng NetworkManager-điều phối dịch vụ được kích hoạt
systemctl enable NetworkManager-dispatcher
Gợi ý: Bộ điều phối sẽ chỉ khởi động khi NetworkManager thay đổi giao diện, nó không cần phải chạy hay bất cứ thứ gì, vì vậy nếu trạng thái đọc
Active: inactive (dead)
Điều đó hoàn toàn tốt!
Cũng đảm bảo rằng tập lệnh của bạn là:
Bây giờ NetworkManager sẽ chuyển hai (2) biến cho bộ điều phối:
$ 1 là giao diện ( eno16777984 , eth0 , ppp0 , v.v ...)
$ 2 giữ trạng thái ( tăng hoặc giảm )
và nó cho phép xâu chuỗi các tập lệnh (giống như / etc / rc ...) để có một số quyền kiểm soát thứ tự mà bộ điều phối sẽ thực thi chúng:
10 giây, 20 giây và cứ thế ...
Thứ tự sẽ tăng dần trên một kết nối
if [$ 2 = "up"] 10 đầu tiên của nó sau 20 giây
và giảm dần khi ngắt kết nối
nếu [$ 2 = "xuống"] bạn nhận được 20 giây sau 10 giây trước
và như thế.
Vì vậy, để thực hiện những gì OP đang tìm kiếm, bạn có thể đặt một cái gì đó như thế này:
#!/bin/bash
if [ "$1" = "eth0" && "$2" = "up" ]; then
/sbin/ethtool --offload eth0 tso off
fi
trong /etc/NetworkManager/dispatcher.d/20-ethtool
Và gọi nó là một ngày.
Chúc mừng
if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
Tôi gặp vấn đề với câu trả lời được chấp nhận (mà tôi vội nói thêm, tôi thấy rất hữu ích) vì tôi đang sử dụng các giao diện ngoại quan.
Tôi phải mất một thời gian để khám phá những gì đang xảy ra nhưng tôi thấy rằng khi đưa ra một trái phiếu, hoặc thậm chí khi đưa lên một nô lệ trái phiếu riêng lẻ, ifup-local
kịch bản sẽ không được gọi cho các giao diện nô lệ. Tôi cho rằng điều này là do các giao diện nô lệ không có bất kỳ địa chỉ IP nào được gán cho chúng.
Để hoàn thành điều này, tôi đã sửa đổi ifup-local
để phân tích nội dung của /proc/bonding/bondX
giao diện đã được đưa lên, nếu đó là một trái phiếu, để lấy tên giao diện nô lệ, và sau đó thực hiện những thứ cần thiết với chúng.
Cuối cùng, tôi ifup-local
trông như sau:
#!/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
Hãy cẩn thận: nội dung của / Proc / net / bonding / bondX có thể khác nhau đối với các phiên bản khác nhau của RedHat / Fedora / CentOS với phiên bản tôi đang sử dụng khi tôi viết tập lệnh, do đó lệnh rút tên giao diện nô lệ có thể không hoạt động .
Ngoài chủ đề, đối với người dùng Ubuntu đã đến đây, như tôi, đây là một ghi chú:
Trên Ubuntu, cách làm sách giáo khoa là chỉnh sửa tập tin / etc / network / giao diện được đọc bởi các tập lệnh init.d / pre-up -up, v.v. Vì vậy, tệp / etc / network / interface có thể trông như thế này:
auto eth0
iface eth0 inet static
pre-up /sbin/ethtool -s eth0 speed 10 duplex full
Đó là những gì các tài liệu nói, nhưng nó không hoạt động . Có thể là logic phân tích cú pháp trong các kịch bản trước và lên có một chút ngày và chúng không phân tích các cài đặt cần thiết từ tệp giao diện. Đừng biết nữa. Ít nhất, nó đã không làm việc cho tôi.
Vì vậy, giải pháp hack-ish nhưng hiện tại vẫn là tạo / chỉnh sửa tệp /etc/rc.local cục bộ và nêu rõ lệnh sẽ được thực hiện ở đó (nhưng lưu ý rằng điều này có thể làm gián đoạn mạng trong một giây sau khi giao diện đã được đưa lên). Vì vậy, có điều này:
ethtool -s eth0 speed 10 duplex full autoneg on
trong /etc/rc.local là giải pháp làm việc để làm chậm giao diện như dự định ở trên.
Trên Ubuntu 17.04 trở lên
Gần đây, Ubuntus sử dụng Systemd, và do đó, tệp RC.local không nhất thiết phải được thực thi khi đạt đến runlevel 'start', chẳng hạn. Dịch vụ "RC-local" phải được bật. Mặc dù có vẻ như theo mặc định, vì lý do tương thích ngược, có lẽ - hãy đảm bảo kiểm tra trạng thái của nó vớisudo systemctl status rc-local
pre-up
này hoạt động với tôi trên Linux Mint 17.3 để đặt cờ TSO, cảm ơn :)
Tôi thấy rằng thiết lập loại cấu hình này trong /etc/network/interfaces
thực sự hoạt động cho Ubuntu (được cho là tôi đã sử dụng nó để tắt large-receive-offload
, nhưng điều đó thực sự không quan trọng):
tự động eth1 iface eth1 inet tĩnh địa chỉ xxx.xxx.xxx.xxx netmask xx pre-up / sbin / ethtool -K $ IFACE tắt
Đối với Ubuntu, bạn có thể làm điều này bằng cách thêm dòng sau vào /etc/network/interfaces
:
auto eth0
iface eth0 inet static
[...]
post-up /sbin/ethtool -K eth0 tso off gso off gro off
post-up ở đây sẽ thực hiện các hoạt động nhất định sau khi đưa ra giao diện cụ thể.
Vâng, hiện tại không thể thực hiện bằng các tệp cấu hình. Bạn có thể đưa ra lệnh /etc/init.d/rc.local
và nó sẽ được thực hiện.
Tập tin đó được thực thi ở phần cuối của trình tự khởi động và do đó tso sẽ bị tắt cho giao diện.