วิธียืนยันการตั้งค่า ethtool ผ่านการรีบูท


15

ฉันต้องการปิดการแบ่งส่วนข้อมูล tcp บนเซิร์ฟเวอร์ CentOS5 การใช้ ethtool คำสั่งคือethtool -K eth0 tso offอย่างไรก็ตามการตั้งค่านี้จะคงอยู่สำหรับเซสชันนี้เท่านั้น ฉันจะทำให้มันคงอยู่ได้ด้วยการรีบูตเครื่อง?


2
วางไว้ในสคริปต์เริ่มต้นที่ไหนสักแห่ง
Zoredache

คำตอบ:


15

จากหน้าเว็บนี้:

คุณสามารถป้อนคำสั่ง ethtool ใน/etc/rc.local(หรือเทียบเท่าการกระจายของคุณ) ซึ่งคำสั่งจะทำงานหลังจาก runlevel ปัจจุบันเสร็จสมบูรณ์ แต่สิ่งนี้ไม่เหมาะ บริการเครือข่ายอาจเริ่มต้นขึ้นในระหว่างคำสั่ง runlevel และ ethtool มักจะขัดจังหวะการรับส่งข้อมูลเครือข่าย มันจะดีกว่าที่จะมีคำสั่งนำมาใช้เป็นอินเทอร์เฟซถูกนำขึ้นมา

บริการเครือข่ายใน CentOS มีความสามารถในการทำเช่นนี้ สคริปต์/etc/sysconfig/network-scripts/ifup-postการตรวจสอบสำหรับการดำรงอยู่ของ/sbin/ifup-localและถ้ามันมีอยู่แล้วทำงานด้วยชื่ออินเตอร์เฟซที่เป็นพารามิเตอร์ (เช่น: /sbin/ifup-local eth0)

เราสามารถสร้างไฟล์นี้ได้ด้วยการสัมผัส/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

โปรดทราบว่าสิ่งนี้จะพยายามใช้การตั้งค่ากับอินเทอร์เฟซทั้งหมดแม้กระทั่งลูปแบ็ค

หากเรามีอินเทอร์เฟซที่แตกต่างกันเราต้องการใช้การตั้งค่าที่แตกต่างกันหรือต้องการข้ามลูปแบ็คเราสามารถสร้างข้อความสั่งเคส

#!/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 ถูกนำไปใช้กับอินเทอร์เฟซเมื่อเริ่มต้นการขัดจังหวะที่อาจเกิดขึ้นกับการสื่อสารเครือข่ายทั้งหมดเกิดขึ้นเมื่ออินเทอร์เฟซถูกนำขึ้นมาและเซิร์ฟเวอร์ของคุณสามารถบู๊ตต่อไปได้


โปรดทราบเกี่ยวกับ ETHTOOL_OPTS อธิบายไว้ที่นี่access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/ด้วยเหตุผลบางประการมันไม่ทำงานบนเครื่องของฉัน แต่superuser.com/questions/995200/…
javapowered

13

สำหรับ RHEL7 ใน / etc / sysconfig / network-สคริปต์ / ifcfg- * คุณอาจมี:

ETHTOOL_OPTS = "- K $ {อุปกรณ์} gso off gro off tso off"

หากตัวเลือกเพิ่มเติมจากนั้นใช้เช่น

ETHTOOL_OPTS = "- K $ {DEVICE} gso off; -K $ {DEVICE} ครางออกไป; -K $ {DEVICE} tso off"

คุณต้องกำหนดอุปกรณ์ตามธรรมชาติในไฟล์ ifcfg ของคุณ

ไม่จำเป็นต้องใช้สคริปต์ rc.local และ ifup พิเศษ ง่ายต่อคุณในระบบการปรับใช้ทั่วไป


10

หากคุณใช้งานRHEL7 (หรือเหมือนกัน) และใช้Network Managerแทน/etc/init.d/networkเพื่อควบคุมอินเตอร์เฟสของคุณคำตอบที่เสนอจะไม่ทำงานเนื่องจาก/ sbin / ifup-local (เช่นเดียวกับifdown-localและifdown-local ) จะไม่ถูกดำเนินการ

แทนที่จะใส่สคริปต์ของคุณลงใน/etc/NetworkManager/dispatcher.d/และให้แน่ใจว่าบริการNetworkManager-dispatcherเปิดใช้งาน

systemctl enable NetworkManager-dispatcher

คำแนะนำ:โปรแกรมเลือกจ่ายงานจะเริ่มต้นเมื่อ NetworkManager ทำการเปลี่ยนแปลงอินเทอร์เฟซก็ไม่จำเป็นต้องทำงานหรืออะไรก็ตามดังนั้นหากสถานะอ่าน

Active: inactive (dead)

ไม่เป็นไร!

ตรวจสอบให้แน่ใจด้วยว่าสคริปต์ของคุณคือ:

  1. ปฏิบัติการได้ (chmod + x)
  2. เป็นเจ้าของโดย root (chown root: root)
  3. เขียนได้โดย root เท่านั้น (chmod 755)

ตอนนี้ NetworkManager จะส่งผ่านตัวแปรสอง (2) ตัวแปรไปยังโปรแกรมเลือกจ่ายงาน:

$ 1เป็นอินเทอร์เฟซ ( eno16777984 , eth0 , ppp0 , ฯลฯ ... )

$ 2ถือสถานะ ( ขึ้นหรือลง )

และอนุญาตให้ผูกมัดสคริปต์ (เช่น / etc / rc ... ) เพื่อควบคุมลำดับที่โปรแกรมเลือกจ่ายงานจะดำเนินการ:

10 แรก, 20 วินาทีและต่อไป ...

คำสั่งซื้อจะเพิ่มขึ้นจากการเชื่อมต่อ

ถ้า [$ 2 = "up"] เป็น 10 ครั้งแรกตามด้วย 20 วินาที

และลดการเชื่อมต่อ

ถ้า [$ 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

และเรียกมันว่าวันเดียว

ไชโย


โปรดทราบว่าคำถามนี้เก่ามากและมีคำตอบที่ยอมรับแล้วและคำตอบของคุณไม่ได้เพิ่มใหม่ โปรดพยายามหลีกเลี่ยงการตอบกระทู้เก่า ๆ เนื่องจากมีความยุ่งเหยิงในหน้าแรก
Catherine MacInnes

3
ค้นหาคำว่า "ifup-local" ของ Google และคุณจะได้รับสิ่งนี้เป็นอันดับ 6 ไม่มีอะไรที่ฉันจะพิจารณา "เก่า"
user1972814

2
นี่เป็นการเพิ่มบางอย่างเกี่ยวกับ CentOS 7 ไม่มีวิธีแก้ปัญหาอื่นสำหรับฉันใน CentOS 7
JDL

3
สคริปต์ทุบตีมีข้อผิดพลาดควรเป็น:if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
dreua

5

ฉันพบปัญหากับคำตอบที่ยอมรับ (ซึ่งฉันรีบเพิ่มฉันพบว่ามีประโยชน์มาก) เพราะฉันใช้อินเตอร์เฟสที่ถูกผูกมัด

ฉันใช้เวลาสักครู่เพื่อค้นหาว่าเกิดอะไรขึ้น แต่ฉันพบว่าเมื่อนำพันธะขึ้นมาหรือแม้กระทั่งเมื่อนำทาสขึ้นมาทีละ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

ข้อแม้: เนื้อหาของ / proc / net / bonding / bondX อาจแตกต่างกันไปสำหรับ RedHat / Fedora / CentOS รุ่นต่าง ๆ กับที่ฉันใช้เมื่อฉันเขียนสคริปต์ดังนั้นคำสั่งเพื่อดึงชื่ออินเตอร์เฟสทาสอาจไม่ทำงาน .


4

Off-topic สำหรับผู้ใช้ 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

นั่นคือสิ่งที่เอกสารพูด แต่มันไม่ทำงาน อาจเป็นไปได้ว่าตรรกะการแยกวิเคราะห์ในสคริปต์ก่อนขึ้น - ลงเป็นวันที่บิตและพวกเขาไม่แยกวิเคราะห์การตั้งค่าที่จำเป็นจากไฟล์อินเตอร์เฟส ไม่ทราบ อย่างน้อยมันก็ไม่ได้ผลสำหรับฉัน

ดังนั้น hack-ish แต่วิธีแก้ปัญหาที่ใช้งานได้ในตอนนี้ยังคงสร้าง / แก้ไขไฟล์/etc/rc.localภายในเครื่องและระบุคำสั่งที่จะใช้งานที่นั่น นำขึ้นมา). ดังนั้นมีสิ่งนี้:

ethtool -s eth0 ความเร็ว 10 ดูเพล็กซ์เต็มอัตโนมัติ

in /etc/rc.localเป็นวิธีการทำงานเพื่อชะลออินเทอร์เฟซตามที่ตั้งใจไว้ข้างต้น

บนUbuntu 17.04 ขึ้นไป

Ubuntus ล่าสุดใช้ Systemd ดังนั้นไฟล์ rc.local จึงไม่จำเป็นต้องถูกเรียกใช้เมื่อถึงระดับ 'start' runlevel ต้องเปิดใช้งานบริการ "rc-local" แม้ว่าจะเป็นค่าเริ่มต้นด้วยเหตุผลด้านความเข้ากันได้ย้อนหลังอาจจะ - ตรวจสอบให้แน่ใจว่าได้ตรวจสอบสถานะด้วยsudo systemctl status rc-local


pre-upสั่งทำงานให้ฉันบน Linux Mint 17.3 สำหรับการตั้งธง TSO ขอบคุณ :)
Joril

1

ฉันพบว่าการตั้งค่าการกำหนดค่าประเภทนี้/etc/network/interfacesใช้งานได้จริงกับ Ubuntu (อนุญาตให้ฉันใช้เพื่อปิดlarge-receive-offloadเครื่อง แต่ไม่ควรทำเรื่องสำคัญ):

auto eth1
iface eth1 inet คงที่
    ที่อยู่ xxx.xxx.xxx.xxx
    netmask xx
    pre-up / sbin / ethtool -K $ IFACE lro ปิด

1

สำหรับ Ubuntu คุณสามารถทำได้โดยเพิ่มบรรทัดต่อไปนี้ใน/etc/network/interfaces:

auto eth0
iface eth0 inet static
[...]
post-up /sbin/ethtool -K eth0 tso off gso off gro off

การโพสต์ขึ้นที่นี่จะดำเนินการตามที่กำหนดหลังจากแสดงอินเตอร์เฟสเฉพาะ


0

ใช่มันไม่สามารถทำได้โดยใช้ไฟล์การกำหนดค่าในขณะนี้ คุณสามารถวางคำสั่งใน/etc/init.d/rc.localและมันควรจะทำ

ไฟล์นั้นจะถูกดำเนินการในลำดับสุดท้ายของการบูทและดังนั้น tso จะถูกปิดสำหรับอินเตอร์เฟส

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.