추측 없이 macvtap과 연결된 /dev/tapX 가져오기

추측 없이 macvtap과 연결된 /dev/tapX 가져오기

다음과 같은이것설정 가이드가 macvtap훌륭합니다.
가이드에서 발췌한 내용은 다음과 같습니다.

# ip link add link eth1 name macvtap0 type macvtap
# ip link set macvtap0 address 1a:46:0b:ca:bc:7b up
# ip link show macvtap0

그런 다음 가이드에서는 다음을 수행할 수 있다고 설명합니다.

#qemu-system-x86_64 -net nic,model=virtio,addr=1a:46:0b:ca:bc:7b -net tap,fd=3 3<>/dev/tap11

macvtap최종 결과가 이면 위의 인터페이스 에 실제로 할당된 인터페이스를 어떻게 확인할 수 있습니까 /dev/tap11?
/dev/tapXmacvtap0

내 컴퓨터에 클릭 장치를 무작위로 설정하는 여러 서비스가 있습니다. 내 구체적인 결과가 무엇인지 추측할 수 없습니다.

다음 명령을 사용하여 qemu 머신을 시작하고 싶습니다.

    -netdev tap,ifname="macvtap0",id=network0,script=no,downscript=no \
    -device i82559b,netdev=network0,mac=${MAC}

좋아요, macvtap0제가 방금 만든 장치는 어디에 있나요?
그러나 이것은 나에게 다음을 제공합니다.

qemu-system-x86_64: could not configure /dev/net/tun (macvtap0): Invalid argument

이 기사 개요:탭 인터페이스와 해당 파일 설명자 간의 연결을 찾는 방법은 무엇입니까?- 그들은 PID에 액세스하고 관련 파일 설명자를 확인하여 이를 수행하는 방법을 설명합니다. 나에게 문제는 qemu가 장치를 설정하는 동안 장치를 설정하지 않았다는 것입니다. 그리고 이와 관련된 PID가 없습니다.

/dev그렇다면 새로 생성된 인터페이스와 관련된 파일 핸들을 어떻게 얻을 수 있습니까 macvtap?

편집하다:며칠 동안 이 문제를 해결하려고 노력했지만 확인하는 것을 잊어버렸고 장치 /sys/class/net/macvtap0/가 있다는 것을 방금 깨달았습니다 /tap2. 분명히 일치하는 이름을 찾으려면 모든 항목을 반복해야 합니다 regex(tap[0-9]+). 이것은 작동하지만 이것이 최선의/올바른 방법인지는 확실하지 않습니다.

답변1

장치 이름은만들어진기반으로인터페이스 인덱스:

snprintf(tap_name, IFNAMSIZ, "tap%d", dev->ifindex);

[...]

      devt = MKDEV(MAJOR(macvtap_major), vlantap->tap.minor);
      classdev = device_create(&macvtap_class, &dev->dev, devt,
                   dev, tap_name);

OP의 ip link show macvtap0답변이 존재한다면 다음과 같이 끝날 가능성이 높습니다.

11: macvtap0@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 [...]

이 특정 속성(단어)에 의존하고 싶지 않은 경우macvtap전체 트리에 존재하지 않습니다 linux/Documentation/) 신뢰할 수 있습니다 /sys(공식적으로 문서화된 항목도 없는 것 같습니다)macvtap):

이 정보는 macvtap/*하위 디렉터리에서 찾을 수 있습니다. 이는 tap11단일 항목에 대한 심볼릭 링크이므로 macvtap/tap11현재 위치에서는 실용적이지 않으므로 무시해야 합니다(그러나 가리키는 디렉터리는 아님).

  • 웹에서인터페이스 이름장치 노드 항목 이름을 찾으십시오.

    1. /sys/class/net/macvtap0/macvtap/*항목이 있습니다. 디렉터리인 장치 이름을 탭하세요.

      $ printf '/dev/%s\n' "$(basename /sys/class/net/macvtap0/macvtap/*)"
      /dev/tap11
      

      intf_to_devtap다음과 같은 함수를 사용할 수 있습니다.

      intf_to_devtap () {
          [ -e "/sys/class/net/$1/macvtap" ] || return 1
          printf '/dev/%s\n' "$(basename /sys/class/net/$1/macvtap/*)"
      }
      

      OP의 상황:

      $ intf_to_devtap macvtap0
      /dev/tap11
      
    2. dev항목은 다음과 같습니다1 차, 2 차:

      $ cat /sys/class/net/macvtap0/macvtap/*/dev
      242:1
      

      이 속성(및 아래의 동등한 속성 uevent)은 다음과 같은 경우에만 고유함을 보장합니다.macvtap각각 동일한 인터페이스 인덱스를 갖는 여러 네트워크 네임스페이스에서 생성되어 장치 노드를 형성합니다.이름충돌. 충돌 예(없는 경우macvtap장치가 이전에 생성됨):

      # ip netns add collision1; ip netns add collision2
      # ip -n collision1 link add type dummy; ip -n collision2 link add type dummy
      # ip -n collision1 link add link dummy0 type macvtap
      # ls -l /dev/tap*
      crw-------. 1 root root 242, 1 Apr 19 21:24 /dev/tap3
      # ip -n collision2 link add link dummy0 type macvtap
      # ls -l /dev/tap*
      crw-------. 1 root root 242, 1 Apr 19 21:24 /dev/tap3
      

      두 번째 클릭 항목은 나타나지 않습니다. 이는 두 번째 네트워크 네임스페이스도 인덱스 3( lo=1, =2, =3) 의 인터페이스를 생성할 때 충돌이 발생했고 , dummy0동일한 이름의 파일이 이미 존재하여 macvtap0두 번째 장치 항목이 생성되지 않았기 때문입니다. 또한 네트워크 장치를 정확하게 처리하기 위해 다시 설치했기 /dev때문에 두 번째 탭 장치가 "매핑"되지 않았더라도 실제로 두 개의 탭 장치가 있음을 확인할 수 있습니다.ip netns/sys

      # ip netns exec collision1 sh -c 'cat /sys/class/net/macvtap0/macvtap/*/dev'
      242:1
      # ip netns exec collision2 sh -c 'cat /sys/class/net/macvtap0/macvtap/*/dev'
      242:2
      

      그래서 사람들은 여전히 ​​두 번째 것을 사용할 수 있습니다macvtap인터페이스 백엔드를 "매핑"한 다음 /sys정보의 절반이 이와 일치하지 않더라도 장치를 사용합니다. 예를 들면 다음과 같습니다.

      # mknod /dev/tap3b c 242 2
      

      또는 와 같은 보다 자세한 이름을 사용하십시오 /dev/tap-VM1-intfA.

    3. uevent항목, 전공 기재: 부전공 및 이름:

      $ cat /sys/class/net/macvtap0/macvtap/*/uevent
      MAJOR=242
      MINOR=1
      DEVNAME=tap11
      
  • ~에서개발자인터페이스 이름을 입력하세요:

    그리고 /dev/tap11:

    /dev/tap11-> /sys/class/macvtap/tap11-> /sys/devices/virtual/net/macvtap0/macvtap/tap11. before 는 /sys/class/net/macvtap0실제로 에 대한 심볼릭 링크입니다 /sys/devices/virtual/net/macvtap0.

    여전히 마지막 디렉토리에 있는 항목은 인터페이스 디렉토리에 대한 심볼릭 링크이므로 -> device로 끝납니다 ./sys/class/macvtap/tap11/device/sys/devices/virtual/net/macvtap0

    devtap_to_intf다음과 같은 함수를 사용할 수 있습니다.

    devtap_to_intf () {
        [ -c "$1" ] || [ -c "/dev/$1" ] || return 1
        local path="$(readlink -e "/sys/class/macvtap/${1#/dev/}/device")"
        printf '%s\n' "${path#/sys/devices/virtual/net/}"
    }
    

    OP를 예로 들어 보겠습니다.

    $ devtap_to_intf /dev/tap11
    macvtap0
    

관련 정보