Cách duy trì cài đặt ethtool thông qua khởi động lại


15

Tôi muốn tắt giảm tải phân đoạn tcp trên máy chủ CentOS5. Sử dụng ethtool lệnh là ethtool -K eth0 tso offTuy nhiên, cài đặt này chỉ tồn tại cho phiên này. Làm thế nào tôi có thể làm cho nó tồn tại thông qua khởi động lại?


2
đặt nó trong một kịch bản bắt đầu ở đâu đó.
Zoredache

Câu trả lời:


15

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-postkiểm tra sự tồn tại của /sbin/ifup-localvà 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-localvà 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 đủ.


cũng lưu ý về ETHTOOL_OPTS mô tả ở đây access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/... Tuy nhiên do một số lý do nó không làm việc trên máy tính nhưng tôi superuser.com/questions/995200/...
javapowered

12

Đố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.


10

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-localifdown-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à:

  1. thực thi (chmod + x)
  2. thuộc sở hữu của root (chown root: root)
  3. chỉ có thể ghi bằng root (chmod 755)

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


Xin lưu ý rằng câu hỏi này rất cũ và nó đã có câu trả lời được chấp nhận và câu trả lời của bạn không thực sự thêm mới. Hãy cố gắng tránh trả lời các bài viết rất cũ vì nó có xu hướng làm lộn xộn trang đầu.
Catherine MacInnes

3
Tìm kiếm trên Google cho "ifup-local" và bạn nhận được đây là lần truy cập thứ 6. Không có gì tôi sẽ coi là "cũ"
user1972814

2
Điều này chắc chắn bổ sung một cái gì đó liên quan đến CentOS 7. Không có giải pháp nào khác phù hợp với tôi trong CentOS 7.
JDL

3
Tập lệnh bash có lỗi, nên là:if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
dreua

5

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-localkị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/bondXgiao 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-localtrô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 .


4

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


Lệnh pre-upnày hoạt động với tôi trên Linux Mint 17.3 để đặt cờ TSO, cảm ơn :)
Joril

1

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

1

Đố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ể.


0

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.localvà 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.