배포판에 따라 호출 ip link set <iface> up
(또는 down; ifup / ifdown도 가능)은 다양한 구성 파일(Debian에서는 /etc/network/interfaces, Gentoo에는 /etc/conf.d/net...이 있는 것 같습니다)을 살펴보고 변경(예: DHCP와 상호작용 등)
내가 본 바로는 strace
명령이 ip
커널과 직접 대화합니다(그렇습니까?). 그러나 결국 누군가가 해당 쉘 스크립트를 실행하고 구성을 읽습니다. 이런 일이 일어나는 메커니즘은 무엇입니까? 초기화 시스템이 일부 커널 인터페이스에서 up/down 상태 변경을 수신하고 이러한 스크립트를 실행합니까? 아니면 뭔가 다른 걸까요?
답변1
설명대로 호출하는 ip link set <iface> up
것은 커널과 최소한의 통신만 수행하는 것입니다.rtnetlinkAPI(경로뿐만 아니라 링크, 주소 등에 관한 것입니다. 여기서는 RTM_NEWLINK
) 인터페이스를 관리적으로 불러옵니다. 이전 도구는 더 이상 사용되지 않는(네트워크용) ioctl API(여기서는 ) ifconfig
를 사용하여 커널에 동일한 요청을 합니다 .SIOCGIFFLAGS
이 명령은 요청된 작업만 수행하고 그 이상은 수행하지 않는 낮은 수준의 명령입니다.
ifup
(데비안에서)의 일부입니다ifupdown(또는 대체ifupdown2) 제품군이며 다양한 Linux 배포판에서 서로 다르게 구현됩니다. 그들은 아마도 스스로 호출하는 스크립트 모음일 뿐이며 ip link set ...
, 아마도 그들 중 일부는 다른 사용 가능한 도구(예:네트워크매니저). 그래서 당신은 그것들을 절대 같은 수준에 놓을 수 없습니다: ip link set ... up
is not at all ifup ...
.
이제 다른 네트워킹 도구는 어떻게 될까요?네트워크매니저상호작용하고 무슨 일이 일어났는지 알아요? 그들은 커널을 통해 묻고 있기 때문에rtnetlink, 관심 있는 일부 네트워크 이벤트에 대한 알림을 받습니다.넷링크API 구현은 멀티캐스트를 지원합니다. 즉, 단일 메시지를 여러 관련 당사자(사용자 공간 또는 커널에 속함)가 효율적으로 수신할 수 있으므로 이벤트 구현이 단순화됩니다.
일반적으로 무언가(여기 ip link set ... up
)가 커널에 메시지를 보내면 커널은 관련 당사자에게 멀티캐스트되는 메시지로 응답합니다. 명령은 ip link
이 메시지를 다시 수신하지만 "인터페이스가 방금 시작되었음을 알고 있는 모든 대기 도구도 수신합니다." " (관리 상태 작동과 작동 상태 작동 간의 차이점은 제쳐두겠습니다).
명령 출력에 의해 구동되는 이벤트 루프를 사용하여 스크립트에서 동일한 작업을 수행하는 것이 가능합니다.ip monitor
커널에서 네트워크 이벤트를 기다리고 있습니다. 물론 실제로 구문 분석 가능한 출력이 더 바람직할 것입니다. 슬프게도 다른 많은 출력은iproute2하위 명령은 -json
의 경우가 아닌 JSON 출력( 사용) 을 지원합니다 ip monitor
.
여기기초적인ip monitor link
이 인터페이스에 대한 변경이 완료될 때마다(작동 상태와 관련이 없더라도) 인터페이스의 작동 상태를 표시하기 위한 쉘 예제입니다 .기초적인예). 신뢰할 수 없는 출력을 구문 분석하므로 일부 경우에는 실패할 것으로 예상됩니다.
#!/bin/sh
ip -o monitor link | while read -r index interface status remaining; do
iface=$(printf '%s\n' "$interface" | sed -E 's/(@.*)?:$//')
operstate=$(printf '%s\n' "$remaining" | grep -Eo ' state [^ ]+' | sed 's/^ state //')
printf '%s %s\n' "$iface" "$operstate"
done
위 스크립트가 실행되는 동안 다른 곳에서 다음 명령을 시도해 보세요.
# ip link add test1 type veth peer name test2
# ip link set test1 up
# ip link set test2 up
# ip link delete test1 # script doesn't handle correctly lines starting with Deleted
주소, 경로 등에서도 마찬가지입니다. 이것이 바로 다음과 같은 도구입니다.네트워크매니저명령에 반응하고 있습니다 ip link set <iface> up
.