Seguir este guia para configurar um macvtap
funciona muito bem.
Um trecho do guia se parece com isso:
# 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
O guia continua explicando que você pode fazer:
#qemu-system-x86_64 -net nic,model=virtio,addr=1a:46:0b:ca:bc:7b -net tap,fd=3 3<>/dev/tap11
E isso funciona muito bem, se o seu macvtap
terminar em /dev/tap11
.
Mas como você verifica qual /dev/tapX
interface realmente foi atribuída ao macvtap0
acima?
Eu tenho muitos serviços configurando dispositivos de toque na minha máquina em momentos aleatórios. E eu não posso adivinhar em qual meu específico acabou.
Eu esperava que inicializar a máquina qemu com:
-netdev tap,ifname="macvtap0",id=network0,script=no,downscript=no \
-device i82559b,netdev=network0,mac=${MAC}
Funcionaria, onde macvtap0
está o dispositivo que acabei de criar.
No entanto, isso me dá:
qemu-system-x86_64: could not configure /dev/net/tun (macvtap0): Invalid argument
Descrito neste artigo: Como encontrar a conexão entre a interface de toque e seu descritor de arquivo? - eles descrevem uma maneira de fazer isso acessando o PID e verificando os descritores de arquivos associados, o problema aqui para mim é que o qemu não está configurando o dispositivo, eu estou. E não há PID associado a ele.
Então, como posso obter o identificador de arquivo /dev
associado à macvtap
interface recém-criada?
Edit: Já estou há alguns dias nesse problema, mas acabei de perceber que esqueci de verificar /sys/class/net/macvtap0/
e há um /tap2
dispositivo. Obviamente, preciso percorrer todo o conteúdo ainda para encontrar uma correspondência de nome regex(tap[0-9]+)
. Isso funcionará, mas não tenho certeza se é a maneira melhor/correta de fazer isso.
O nome do dispositivo é criado com base no índice da interface :
Se a resposta do OP
ip link show macvtap0
estivesse presente, provavelmente começaria com:Esta propriedade está sendo usada ou documentada em alguns lugares .
Se você não quiser confiar nesta propriedade específica que não parece estar oficialmente documentada (a palavra macvtap não existe em toda a
linux/Documentation/
árvore), você pode confiar nas entradas em/sys
(que também não parecem ser oficialmente documentado para macvtap ):As informações estão disponíveis no
macvtap/*
subdiretório. Observe quetap11
é um link simbólico para a entrada únicamacvtap/tap11
e, como é impraticável onde está, deve ser ignorado (mas não o diretório para o qual aponta).A partir do nome da interface de rede , localize o nome da entrada do nó do dispositivo:
/sys/class/net/macvtap0/macvtap/*
tem uma única entrada, o nome do dispositivo de toque, que é um diretório:Uma função chamada
intf_to_devtap
pode ser usada:Para o caso do OP:
dev
entrada para major:minor :Esta propriedade (e a equivalente abaixo em
uevent
) é a única com garantia de exclusividade caso haja macvtap criados em vários namespaces de rede, cada um com o mesmo índice de interface, fazendo assim uma colisão de nome de nó de dispositivo . Exemplo de colisão (quando nenhum dispositivo macvtap foi criado antes):Uma segunda entrada de toque não apareceu. Isso porque houve uma colisão quando o segundo namespace de rede também criou uma interface com índice 3 (
lo
=1,dummy0
=2,macvtap0
=3), e a segunda entrada de dispositivo não foi criada/dev
porque já existia um arquivo com o mesmo nome. Comoip netns
também remonta/sys
para o manuseio preciso dos dispositivos de rede, pode-se verificar que realmente existem dois dispositivos de toque, mesmo que o segundo não tenha sido "mapeado":Portanto, ainda se pode usar o backend da 2ª interface macvtap "mapeamento" e depois usar o dispositivo, mesmo que metade das
/sys
informações não corresponda a isso, por exemplo:ou com um nome mais detalhado como
/dev/tap-VM1-intfA
.uevent
entrada, dando major:minor e name:Da entrada dev ao nome da interface:
Com
/dev/tap11
:/dev/tap11
->/sys/class/macvtap/tap11
->/sys/devices/virtual/net/macvtap0/macvtap/tap11
. Observe que/sys/class/net/macvtap0
antes é na verdade um link simbólico para/sys/devices/virtual/net/macvtap0
.Ainda no último diretório, a
device
entrada é um link simbólico para o diretório da interface, então temos no final/sys/class/macvtap/tap11/device
->/sys/devices/virtual/net/macvtap0
Uma função chamada
devtap_to_intf
pode ser usada:Com o caso do OP: