네트워크 인터페이스가 물리적(장치)인지 가상(별칭)인지 어떻게 알 수 있나요?

네트워크 인터페이스가 물리적(장치)인지 가상(별칭)인지 어떻게 알 수 있나요?

저는 라우터용 임베디드 Linux인 OpenWrt를 실행하는 작은 홈 라우터를 가지고 있습니다. 5개의 이더넷 포트가 있습니다. 하나는 WAN으로 표시되고 4개는 LAN 1~4로 표시됩니다. 여기에는 다음과 같은 네트워크 인터페이스가 정의되어 있습니다 ifconfig.

root@TIBERIUS: ~ > ifconfig | grep Link
br-lan    Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
eth0      Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
lan1      Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
lan2      Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
lan3      Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
lan4      Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
lo        Link encap:Local Loopback
pppoe-wan Link encap:Point-to-Point Protocol
wan       Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
wlan0     Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0

보시다시피 장치는 많지만 MAC 주소는 하나뿐입니다.

내가 이해한 바로는 이러한 장치 중 일부는 가상입니다. lo와 를 먼저 제쳐두겠습니다 . pppoe-wan이것은 루프백 장치와 PPPoE 연결입니다. 하지만 나머지 부분에 대해서는 물리적인지 가상인지 어떻게 알 수 있나요? 예를 들어 가상 인터페이스에 레이블을 지정하는 명명 규칙이 있다는 것을 알고 있지만 eth0.1여기에서는 이를 따르지 않는 것 같습니다. ifconfig두 가지 인터페이스의 출력을 살펴보겠습니다 .

root@TIBERIUS: ~ > ifconfig wan
wan       Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:15007 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12055 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:13341276 (12.7 MiB)  TX bytes:1831757 (1.7 MiB)

root@TIBERIUS: ~ > ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:25799 errors:0 dropped:0 overruns:23 frame:0
          TX packets:25294 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:15481996 (14.7 MiB)  TX bytes:15160380 (14.4 MiB)
          Interrupt:4

txqueuelen0이 아닌 퍼지 세부 정보를 갖는 것 외에 eth0유일하게 중요한 차이점은 항목 eth0이 있다는 것 입니다 Interrupt. 제가 알 수 있는 것은 하드웨어 기능입니다. 그렇다면 Interrupt네트워크 인터페이스의 항목을 검색하여 네트워크 인터페이스가 물리적 인터페이스인지 여부를 알 수 있는 방법은 무엇입니까 ifconfig? 아니면 더 좋은 방법이 있나요? 네트워크 장치가 물리적 장치인지 가상 장치인지 확인하는 간단하고 직접적인 방법이 있습니까?

다음이 있습니다.관련 질문허용되는 답변이 있지만 결론적이지는 않습니다.

고쳐 쓰다

derobert의 답변에 대한 답변은 다음과 같습니다 ls -l /sys/class/net.

br-lan      -> ../../devices/virtual/net/br-lan
eth0        -> ../../devices/platform/ag71xx.0/net/eth0
lan1        -> ../../devices/platform/dsa.0/net/lan1
lan2        -> ../../devices/platform/dsa.0/net/lan2
lan3        -> ../../devices/platform/dsa.0/net/lan3
lan4        -> ../../devices/platform/dsa.0/net/lan4
lo          -> ../../devices/virtual/net/lo
pppoe-wan   -> ../../devices/virtual/net/pppoe-wan
wan         -> ../../devices/platform/dsa.0/net/wan

[이 목록에 대한 부록: wlan0이것도 표시되었을 텐데 wlan0 -> ../../devices/platform/ath9k/net/wlan0, 위 목록을 복사할 때 WLAN을 비활성화했기 때문에 표시되지 않았습니다. ]

eth0유일한 장치 라고 말하고 싶습니다 . dsa.0그것이 무엇인지 잘 모르겠습니다 .

그리고 Bryan Agee의 답변에 대한 답변은 다음과 같습니다.

root@TIBERIUS: ~ > cat /etc/config/network

config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config interface 'eth'
        option ifname 'eth0'
        option proto 'none'

config interface 'lan'
        option ifname 'lan1 lan2 lan3 lan4'
        option type 'bridge'
        option proto 'static'
        option ipaddr '192.168.33.1'
        option netmask '255.255.255.0'

config interface 'wan'
        option ifname 'wan'
        option proto 'pppoe'
        option username '…'
        option password '…'

답변1

당신은 확인할 수 있습니다 /sys:

anthony@Zia:/sys/class/net$ ls -l /sys/class/net/
total 0
lrwxrwxrwx 1 root root 0 Dec 11 15:38 br0 -> ../../devices/virtual/net/br0
lrwxrwxrwx 1 root root 0 Dec 11 15:38 lan -> ../../devices/pci0000:00/0000:00:1e.0/0000:07:01.0/net/lan
lrwxrwxrwx 1 root root 0 Dec 11 15:38 lo -> ../../devices/virtual/net/lo
lrwxrwxrwx 1 root root 0 Dec 11 15:38 tun0 -> ../../devices/virtual/net/tun0

따라서 실제 장치는 /sys/class/net에 나타납니다. 알아채다별명(예: lan:0) 이렇게 하지 마세요. 그러면 어떤 것이 별칭인지 알 수 있습니다. 어떤 것이 실제 하드웨어(lan)이고 어떤 것이 아닌지(br0, lo, tun0) 명확하게 확인할 수 있습니다.

밝히다

위에서는 모든 가상이 가상이기 때문에 어떤 것이 실제인지 확인할 수 있습니다. 그리고 LAN은 PCI 버스에 있습니다.

귀하의 예에는 eth0, wan 및 lan1-4의 6개가 있습니다. 총 5개의 포트만 있다고 말씀하셨기 때문에 이것은 이상합니다. 나는 eth0이 실제로 스위치 칩에 배선되어 있고 나머지 5개 포트는 해당 스위치의 포트라고 추측합니다. wlan0도 실제일 수 있지만(아마도 무선 어댑터) /sys...에는 표시되지 않습니다.

따라서 모든 실제적인 목적을 위해 실제 포트는 wan, lan1–4 및 wlan0이라고 말하고 싶습니다. br-lan은 4개의 LAN 포트가 모두 스위치 역할을 하도록 설정된 브리지입니다(스위치를 분할할 수 있음).

답변2

인터페이스 MAC 주소가 다음과 같다고 가정합니다.아니요부정 행위, 다음을 사용해 볼 수 있습니다.이더넷 도구:

ethtool -P {Network interface name}

"영구 주소: 00:00:00:00:00:00”는 가상 네트워크 인터페이스임을 나타냅니다.

다음 bash 루프는 모든 네트워크 인터페이스의 MAC 주소를 표시합니다.

for i in $(ip -o link show | awk -F': ' '{print $2}'); \
do mac=$(ethtool -P $i) \
&& printf '%-10s %-10s\n' "$i" "$mac"; \
done

lo         Permanent address: 00:00:00:00:00:00
enp5s0f0   Permanent address: 44:1e:a1:73:39:c8
enp4s0f0   Permanent address: 00:9c:02:b0:ef:20
enp5s0f1   Permanent address: 44:1e:a1:73:39:c9
enp4s0f1   Permanent address: 00:9c:02:b0:ef:24
virbr1     Permanent address: 00:00:00:00:00:00
virbr1-nic Permanent address: 00:00:00:00:00:00
virbr0     Permanent address: 00:00:00:00:00:00
virbr0-nic Permanent address: 00:00:00:00:00:00
vnet0      Permanent address: 00:00:00:00:00:00
vnet1      Permanent address: 00:00:00:00:00:00

답변3

모든sysfs 매뉴얼 페이지

/시스템/클래스/네트워크

이 디렉토리의 각 항목은 디렉토리에 액세스하는 프로세스의 네트워크 네임스페이스에 표시되는 실제 또는 가상 네트워크 장치 중 하나를 나타내는 심볼릭 링크입니다. 이러한 각 기호 링크는 /sys/devices 디렉토리의 항목을 참조합니다.

따라서 우리가 해야 할 일은 sysfs 파일 시스템의 네트워크 인터페이스에 연결된 물리적 장치가 있는지 확인하는 것입니다./sys/class/net/eth0/device

인터페이스 이름을 알고 있으면 간단한 스크립트를 사용할 수 있습니다.

#!/bin/bash

iface=eth0

if test -e /sys/class/net/${iface}/device; then
        echo $iface
fi

모든 물리적 장치의 인터페이스 이름을 인쇄하려면 다음을 수행하십시오.

#!/bin/bash

while IFS='\n' read p1 line ;do
        iface=$(echo "$p1" | sed -n 's/[0-9]: \(.*\):.*/\1/p')

        if test -n $iface && ip addr show dev $iface >/dev/null 2>&1; then
                if test -e /sys/class/net/${iface}/device; then
                        echo $iface
                fi
        fi
done < <(ip address)

트릭을 수행하는 한 줄의 내용은 다음과 같습니다.

echo $(cd /sys/class/net; dirname */device)

for 루프 등에 사용하기에 적합합니다. 예를 들면 다음과 같습니다.

for interface in $(cd /sys/class/net; dirname */device); do
    echo $interface
    # Do whatever else you may need to do with $interface
done

답변4

가상 캔(vcan) 장치 목록을 가져오는 방법을 알아내려고 노력 중이며 다음과 같은 결론에 도달했습니다.

ip -details -oneline link | grep vcan

그러면 가상 캔 장치만 나열됩니다.

vcan 장치 이름 목록을 얻으려면 다음이 작동합니다.

ip -details -oneline link | grep vcan | awk -F': ' '{print $2}'

관련 정보