Eu tenho uma qemu
VM iniciada por um script de orquestração, que cria tap
interfaces transitórias. Quando inspeciono os argumentos da linha de comando do qemu-system-x86_64
processo, posso ver que o processo se conecta à tap
interface já aberta com o descritor de arquivo 27
:
-netdev tap,fd=27,id=hostnet1,vhost=on,vhostfd=28
Segundo ls -l /proc/<qemu-system-x86_64_PID>/fd/27
aponta para /dev/net/tun
.
Funciona de alguma forma de forma que o tap
nome da interface (por exemplo vnet99
) seja passado /dev/net/tun
com ioctl()
e isso retorne o fd correto? Ou, em geral, como posso descobrir qual tap
interface em minha máquina host possui o descritor de arquivo 27?
A
iff:
entrada que poderia ter dado uma resposta foi adicionada no kernel 3.14 com o committun: add device name(iff) field to proc fdinfo entry
, portanto, não está disponível no kernel 3.13 ou anterior, por exemplo, no Ubuntu 14.04LTS.Nesse caso, embora não seja possível pedir ao kernel para fornecer as informações, ainda é possível solicitar ao processo real que forneça essas informações, rastreando-as com um depurador.
Existe um ioctl disponível desde o Linux 2.6.27 para pedir informações sobre uma interface tuntap configurada :
TUNGETIFF
. Seu uso é para um processo que herda um fd poder consultar o fd para receber o nome e tipo da interface (ifr_name
eifr_flags
) ou saber que o dispositivo tuntap ainda não foi configurado (EBADFD
) e que deve fazê-lo.Portanto, embora seja possível usar
gdb
, é um pouco complicado porque, se nenhum ambiente de desenvolvimento estiver disponível, alguns parâmetros e valores necessários devem ser conhecidos ou ajustados (e podem mudar no futuro ou com arquiteturas). Essas informações e ajustes são necessários aqui:$malloc
para sistemas de 64 bits para lidar com o tamanho correto para o endereço de memória retornado: o crédito vai para este comentário de SO.$malloc(64)
:struct ifreq
parece ter 40 bytes em 64 bits, vamos usar 64 para ficarmos seguros.0x800454d2
==TUNGETIFF
.ifr_name
está no deslocamento 0.Aqui está um script de shell preparando o caminho para cada tuntap fd encontrado para chamar
gdb
, junto com o próprio script do gdb:tungetiff.sh
:tungetiff.gdb
:Exemplo típico de execução (provavelmente só funcionará como root, mesmo o usuário libvirt-qemu não parece ser capaz de ptrace qemu-system):
Com o descritor de arquivo 27 conhecido, você
/proc
seguiria o processo do QEMU:No mesmo nível do
fd
diretório está outro diretóriofdinfo
que contém detalhes como este:A
iff
entrada neste arquivo é o dispositivo de toque.Referências