재부팅을 통해 ethtool 설정을 유지하는 방법


15

CentOS5 서버에서 TCP 세그먼트 화 오프로드를 끄고 싶습니다. ethtool을 사용하는 명령은 ethtool -K eth0 tso off그러나이 설정은이 세션에 대해서만 지속됩니다. 재부팅을 통해 지속되도록하려면 어떻게해야합니까?


2
어딘가에 시작 스크립트에 넣으십시오.
Zoredache

답변:


15

웹 페이지에서 :

/etc/rc.local현재 런레벨이 완료된 후 명령이 실행되는 곳에 ethtool 명령을 입력 할 수 있지만 (이상은 배포판에 상응하는) 가능합니다. 네트워크 서비스는 실행 수준에서 시작되었을 수 있으며 ethtool 명령은 네트워크 트래픽을 방해하는 경향이 있습니다. 인터페이스가 시작될 때 명령을 적용하는 것이 더 바람직합니다.

CentOS의 네트워크 서비스는이를 수행 할 수 있습니다. 스크립트 /etc/sysconfig/network-scripts/ifup-post의 존재를 확인 /sbin/ifup-local하고, 존재하는 경우, 매개 변수로 인터페이스 이름으로 실행 (예 : /sbin/ifup-local eth0)

SELinux 컨텍스트를 설정하여 터치하여이 파일을 /sbin/ifup-local실행 가능하게 한 다음 편집기에서 열 수 있습니다.chmod +x /sbin/ifup-localchcon --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 설정이 시작될 때 인터페이스에 적용되고, 인터페이스가 시작될 때 네트워크 통신에 대한 모든 잠재적 중단이 이루어지며 서버는 완전한 네트워크 기능으로 계속 부팅 할 수 있습니다.


access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…에 설명 된 ETHTOOL_OPTS 에 대한 참고 사항도 있지만 어떤 이유로 인해 아직 내 컴퓨터에서는 작동하지 않습니다. superuser.com/questions/995200/…
javapowered

12

/ etc / sysconfig / network-scripts / ifcfg- *의 RHEL7의 경우 다음이있을 수 있습니다.

ETHTOOL_OPTS = "-K $ {DEVICE} gso off gro off tso off"

더 많은 옵션이 있다면

ETHTOOL_OPTS = "-K $ {DEVICE} gso off; -K $ {DEVICE} gro off; -K $ {DEVICE} tso off"

ifcfg 파일에 자연스럽게 DEVICE가 정의되어 있어야합니다.

rc.local이나 추가 ifup 스크립트가 필요하지 않습니다. 일반 배포 시스템에서 쉽게 사용할 수 있습니다.


10

당신은에있는 경우 RHEL7 (또는 모두) 및 사용하는 네트워크 관리자를 대신 을 /etc/init.d/ ,하지 않습니다 작업하여 인터페이스 이후 제안 된 답변을 제어 할 경우 / sbin / ifup을 로컬 (뿐만 아니라 ifdown을-사전 지역을ifdown을 로컬이 ) 실행되지 얻을 않습니다.

대신 스크립트를 /etc/NetworkManager/dispatcher.d/에 넣고 NetworkManager-dispatcher 서비스가 활성화 되어 있는지 확인하십시오

systemctl enable NetworkManager-dispatcher

힌트 : 디스패처는 NetworkManager가 인터페이스를 변경 한 후에 만 ​​실행되며, 실행 중이거나 다른 항목이 없어도됩니다.

Active: inactive (dead)

완전히 괜찮습니다!

또한 스크립트가 다음과 같은지 확인하십시오.

  1. 실행 파일 (chmod + x)
  2. 루트 소유 (chown root : root)
  3. 루트 만 쓰기 가능 (chmod 755)

이제 NetworkManager는 두 개의 변수를 디스패처에 전달합니다.

인터페이스가 $ 1 ( eno16777984 , eth0 , ppp0 등)

상태를 유지하는 $ 2 ( up 또는 down )

그리고 / 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

그리고 그것을 하루라고 부릅니다.

건배


이 질문은 매우 오래되어 이미 답변을 받았으며 답변에 실제로 새로운 내용이 추가되지는 않습니다. 아주 오래된 게시물은 첫 페이지가 복잡 해지는 경향이 있으므로 답변을 피하십시오.
Catherine MacInnes

3
"ifup-local"을 Google에서 검색하면 6 번째 히트로 표시됩니다. 내가 "오래된"것으로 생각하는 것 없음
user1972814

2
이것은 CentOS 7과 관련하여 확실히 무언가를 추가합니다. CentOS 7에서는 다른 솔루션이 효과가 없었습니다.
JDL

3
bash 스크립트에 오류가 있습니다.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

나처럼 여기에 온 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 스크립트의 구문 분석 논리는 약간 날짜가 있으며 인터페이스 파일에서 필요한 설정을 구문 분석하지 않습니다. 몰라 적어도 그것은 나를 위해 작동하지 않았습니다.

따라서 지금까지 해킹이지만 작동하는 솔루션은 여전히 ​​로컬 /etc/rc.local 파일 을 작성 / 편집하고 거기에서 명령을 끝내도록 명령하는 것입니다 (그러나 인터페이스가 이미 끝난 후 1 초 동안 네트워킹이 중단 될 수 있음에 유의하십시오) 제기). 그래서 이것을 갖는 것 :

ethtool -s eth0 속도 10 이중 전이중 자동 켜짐

/etc/rc.local에 이상 의도 한대로 인터페이스를 느리게하는 작업 솔루션입니다.

우분투 17.04 이상

보다 최근의 Ubuntus는 Systemd를 사용하므로 예를 들어 '시작'실행 수준에 도달 할 때 rc.local 파일이 반드시 실행되는 것은 아닙니다. "rc-local"서비스를 활성화해야합니다. 기본적으로 호환성이 있기 때문에 이전 버전과의 호환성을 위해 다음과 같이 상태를 확인하십시오.sudo systemctl status rc-local


pre-up, 감사합니다 :)이 TSO 플래그를 설정하기위한 리눅스 민트 17.3에 나를 위해 일한 지침
Joril

1

나는이 종류의 구성을 설정하는 것이 /etc/network/interfaces실제로 우분투 에서 작동 한다는 것을 알았습니다 (끄기 위해 사용 large-receive-offload했지만 실제로는 중요하지 않습니다).

자동 eth1
iface eth1 inet 정적
    주소 xxx.xxx.xxx.xxx
    넷 마스크 xx
    사전 준비 / sbin / ethtool -K $ IFACE lro off

1

우분투의 경우 다음에 다음 줄을 추가하면됩니다 /etc/network/interfaces.

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

post-up은 특정 인터페이스를 불러 온 후 주어진 작업을 수행합니다.


0

예, 지금은 구성 파일을 사용하여 수행 할 수 없습니다. 명령을 넣을 수 /etc/init.d/rc.local있으며 완료해야합니다.

이 파일은 부팅 순서의 마지막에 실행되므로 인터페이스에 대해 tso가 해제됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.