다음과 같은이것설정 가이드가 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/tapX
macvtap0
내 컴퓨터에 클릭 장치를 무작위로 설정하는 여러 서비스가 있습니다. 내 구체적인 결과가 무엇인지 추측할 수 없습니다.
다음 명령을 사용하여 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
현재 위치에서는 실용적이지 않으므로 무시해야 합니다(그러나 가리키는 디렉터리는 아님).
웹에서인터페이스 이름장치 노드 항목 이름을 찾으십시오.
/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
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
.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