Busybox에 케이블이 연결/분리될 때 eth 인터페이스를 구성 해제/재구성하는 방법

Busybox에 케이블이 연결/분리될 때 eth 인터페이스를 구성 해제/재구성하는 방법

저는 Busybox와 musl을 기반으로 하는 Raspberry Pi에서 Alpine Linux를 실행하고 있습니다.

실행하면 해당 인터페이스의 백그라운드에서도 시작됩니다 ifup eth0. udhcpc즉, 이더넷 케이블이 연결된 상태에서 실행하면 ifup즉시 IP 주소를 받고, 그렇지 않은 경우 연결할 때까지 백그라운드에서 회전한 다음 IP 주소를 받습니다. 그러나 이것은 일회성입니다.

IP 주소를 얻고 케이블을 뽑으면 해당 IP 주소가 유지되며 예를 들어 일부 네트워크 요청을 시도하면 ping google.com시간이 초과될 때까지 이 인터페이스를 통해 요청을 시도합니다. 여러 네트워크 인터페이스가 있는 경우 특히 문제가 됩니다. 이 경우 첫 번째 네트워크 인터페이스를 계속 사용하려고 시도하고 인터넷에 연결되어 있을 수 있는 다른 네트워크 인터페이스를 무시합니다.

케이블이 끊어졌거나 연결이 끊어졌음을 감지하고 인터페이스를 구성 해제한 다음 다시 연결한 후 재구성하는 데 적합한 경량 솔루션은 무엇입니까?

혹시 모르니, 여기 내 /etc/network/interfaces파일 도 있어요

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet dhcp

답변1

일반적인 시스템에서 이 명령은 ip monitor link dev ethX이벤트 중심 접근 방식으로 사용되어 캐리어 상태 변경에 반응할 수 있습니다(예: NO-CARRIER).

이용할 수 없기 때문에바쁜 상자Q/A에 대한 내 답변에 설명된 대로 최소한의 구현IP 링크 다운과 물리적 링크 손실의 차이점, 이것운송업체 상태이름이 사람이더넷다음 사이트에서도 이용 가능:

/sys/class/net/ethX/carrier
  • NO-CARRIER0은 인터페이스의 플래그 인 연산자가 없음을 의미합니다.
  • 1은 연산자를 의미합니다.

이 값은 인터페이스가 시작된 후에만 사용할 수 있습니다 ip link set ethX up. 그렇지 않으면 읽을 때 오류가 반환됩니다. 이것운송업체 상태그리고작동상태거의 모든 설정에서 동일하므로(이 경우 포함, 자세한 내용은 이전 링크 참조) 사용하기가 더 쉽습니다.작동상태다음으로 돌아갈 수 있습니다 /sys/class/net/ethX/operstate.

  • lowerlayerdown연산자가 없는 경우(인터페이스 개방형),
  • up통신사의 경우,
  • down인터페이스가 다음과 같은 경우행정아래에.

따라서 이를 대체하려면 다음 셸 함수와 같이 ip monitor link dev ethX정기적으로 폴링하여 동일한 정보를 검색할 수 있습니다 /sys/class/net/ethX/operstate. 이 함수는 약 2초마다 인수로 제공된 인터페이스를 폴링하고 변경 사항만 출력합니다.

stateevent () {
        local fileoperstate=/sys/class/net/"$1"/operstate
        local operstate oldoperstate=$(cat "$fileoperstate")

        while sleep 2; do
                operstate=$(cat "$fileoperstate")
                if [ "$oldoperstate" = "$operstate" ]; then
                        continue
                fi
                oldoperstate="$operstate"
                echo "$operstate"
        done
}

OP의 목표는 연결이 끊긴 인터페이스에 대한 경로를 결국 잃어서 시간 초과가 없고 이중 홈 RPi와의 충돌이 없도록 하는 것입니다(자체 라우팅 테이블에서 두 개의 기본 게이트웨이를 별도로 처리하는 솔루션이 있지만 매우 복잡합니다). 특히 DHCP와 통합할 때 고유한 접근 방식이 필요하며 여전히 반송파 손실을 처리해야 합니다.

일부 테스트에 따르면 주소 손실(경로 손실 포함)은 단순히 경로 손실보다 더 쉬운 것으로 나타났습니다. 또는 해당 경로(특히 커널의 자동 LAN 라우팅)가 나중에 올바르게 복원되지 않을 수도 있습니다. 이는 RPi가 자체 클라이언트인 드문 경우 DHCP에서 설정한 자체 주소에 연결해서는 안 되며 예를 들어 RPi에 할당된 주소를 고수해야 함을 의미합니다.루오127.0.0.1 또는 여기에 추가된 다른 주소와 같은 인터페이스입니다.

바쁜 상자udhcpc' 이 문제를 쉽게 해결할 수 있는 유용한 내장 함수가 있습니다 .

신호:

USR1임대 갱신
USR2임대 종료

그럼 그냥 달리면서 물어봐우즈베키스탄작업 자체를 수행하려면 간단한 신호를 사용하십시오. release는 주소를 제거하고(인터페이스 연결이 끊어졌으므로 DHCP 서버에 알릴 방법은 없지만 문제는 아닙니다), renew는 해당 주소(및 경로)를 다시 추가합니다.

다음은 이전 함수의 출력에서 ​​오는 이벤트를 사용하여 이를 수행하는 이벤트 루프 함수입니다.

eventloop () {
        local intf=$1
        local state

        while read -r state; do
                case "$state" in
                        lowerlayerdown)
                                        pkill -USR2 -f "(^|/)udhcpc( | .* )-i $intf( |$)"
                                ;;
                        up)
                                        pkill -USR1 -f "(^|/)udhcpc( | .* )-i $intf( |$)"
                                ;;
                        down)
                                ;;
                esac
        done
}

인터페이스가 관리상 종료된 경우(방금 사용된 경우에도) 조치가 필요하지 않습니다 ip link set eth0 down. 경로는 커널에 의해 제거되었으며 LAN 경로는 나중에 자체적으로 다시 추가됩니다.우즈베키스탄인터페이스가 백업되면.

위의 두 가지 쉘 함수를 포함하고 다음으로 끝나는 이름의 쉘 스크립트 manageudhcpc.sh (보통 , 로 시작 ) 를 가질 수 있습니다 .#!/bin/sh

stateevent "$1" | eventloop "$1"

두 번 실행합니다(반환되지 않으므로 포크합니다).

./manageudhcpc.sh eth0 &
./manageudhcpc.sh eth1 &

OP에 맡기겠습니다.

  • 시작하려면 이 스크립트를 통합하세요.
  • 처음 부팅할 때 인터페이스가 무엇을 하는지 살펴보세요.우즈베키스탄연결되지 않은 인터페이스로 시작하여 초기 임대를 기다리는 경우 다르게 동작할 수 있습니다.

노트:

  • 두 네트워크 모두에서 DHCP용으로 설정된 두 개의 인터페이스를 사용하여 Alpine 3.12 및 Alpine Edge LXC 컨테이너에서 성공적으로 테스트되었습니다.
  • 매우 보수적이다확장 정규식올바른 것을 찾는 데 사용됨우즈베키스탄정확한 Alpine 버전에 따라 변경해야 할 수도 있습니다(3.12와 Edge 사이에서 변경해야 했기 때문에 둘 다에서 작동했습니다). 그것은pid 파일대신 사용할 수 있습니다.

관련 정보