Как найти связь между интерфейсом крана и его файловым дескриптором?

У меня есть виртуальная машина qemu запущенная скриптом оркестровки, который создает временные интерфейсы tap . Когда я проверяю аргументы командной строки процесса qemu-system-x86_64 , я вижу, что процесс подключается к уже открытому интерфейсу tap с дескриптором файла 27 :

 -netdev tap,fd=27,id=hostnet1,vhost=on,vhostfd=28 

Согласно ls -l /proc//fd/27 он указывает на /dev/net/tun .

vnet99 ли это так, что имя интерфейса tap (например, vnet99 ) передается в /dev/net/tun с помощью ioctl() и это возвращает правильный fd? Или вообще, как я могу узнать, какой интерфейс tap на моем хост-компьютере имеет дескриптор файла 27?

2 Solutions collect form web for “Как найти связь между интерфейсом крана и его файловым дескриптором?”

Запись iff: которая могла бы дать ответ, была добавлена ​​в ядре 3.14 с помощью tun: add device name(iff) field to proc fdinfo entry commit tun: add device name(iff) field to proc fdinfo entry , поэтому недоступно в ядре 3.13 или ранее, например, в Ubuntu 14.04LTS.

В этом случае, хотя невозможно попросить kernel ​​предоставить информацию, все же возможно попросить фактический процесс предоставить эту информацию, отследив ее с помощью отладчика.

Начиная с Linux 2.6.27 доступен ioctl для запроса информации о настроенном интерфейсе TUNGETIFF : TUNGETIFF . Он используется для процесса, унаследовавшего fd, чтобы иметь возможность запросить fd для получения имени и типа интерфейса ( ifr_name и ifr_flags ) или узнать, что устройство tuntap еще не настроено ( EBADFD ) и что он должен это сделать.

Таким образом, хотя это возможно с помощью gdb , это немного сложно, потому что, если среда разработки недоступна, необходимо знать или корректировать несколько необходимых параметров и значений (которые могут измениться в будущем или в зависимости от архитектуры). Эти данные и корректировки, где это необходимо, здесь:

  • определение $malloc для 64-битных систем для обработки правильного размера для возвращенного адреса памяти: кредит идет на этот комментарий от SO.
  • $malloc(64) : struct ifreq выглядит как 40 байтов на 64 битах, давайте использовать 64, чтобы оставаться в безопасности.
  • 0x800454d2 == TUNGETIFF .
  • результат ifr_name со смещением 0.

Вот сценарий оболочки, подготавливающий способ для каждого найденного туннельного fd для вызова gdb , вместе с собственным сценарием gdb:

tungetiff.sh :

 #!/bin/sh [ $# -gt 0 ] || exit 1 SCRIPTGDB="$1"; shift for pid in "$@"; do for procfd in /proc/$pid/fd/*; do if [ "$(readlink $procfd)" = "/dev/net/tun" ]; then fd=$(basename $procfd) printf 'pid=%d fd=%d ifname=' $pid $fd gdb -batch-silent --pid=$pid -ex 'set $fd'=$fd -x "$SCRIPTGDB" fi done done 

tungetiff.gdb :

 set $malloc=(void *(*)(long long)) malloc p $malloc(64) p ioctl($fd, 0x800454d2, $1) set *((char *)($1+16))=0 set logging file /dev/stdout set logging on printf "%s\n",$1 set logging off call free($1) quit 

Типичный пример выполнения (вероятно, будет работать только как root, даже пользователь libvirt-qemu, похоже, не сможет отследить qemu-system):

 # ./tungetiff.sh tungetiff.gdb $(pgrep qemu-system-) pid=22281 fd=26 ifname=vnet1 pid=22281 fd=30 ifname=vnet2 pid=27109 fd=26 ifname=vnet0 

С известным файловым дескриптором 27 вы пройдете /proc по процессу QEMU:

  $ ls /proc//fd/27 

На том же уровне, что и каталог fd находится другой каталог fdinfo который содержит такие детали, как этот:

 $ cat /proc//fdinfo/27 pos: 0 flags: 0104002 mnt_id: 18 iff: tap0123acdc-66 

Запись iff в этом файле является устройством крана.

Рекомендации

  • Как узнать, подключен ли процесс к интерфейсу крана?
  • root / Документация / сети / tuntap.txt Документы ядра
Interesting Posts

Если ssh-add будет тихим, если ключ уже есть

Как разрешить группе читать или редактировать файлы без права на archlinux?

Rsync из нескольких папок в один

Как использовать команды для файлов внутри каталогов, начиная со специального символа?

Как я могу использовать две команды bash в команде -exec команды find?

Как сохранить переменную, которая увеличивается по индексу?

Make не компилирует модули. Ошибка: создание модулей, этап 2. Модули MODPOST 0

Проверять службы, запущенные на сервере, и перезапускать их, если они были остановлены?

stop / start gui на debian

Могу ли я заставить Linux загружать инициализацию параллельно?

Как создать виртуальный файл, связанный с программой, например, в файл `.gz` через` gzip`?

/ proc / sys / kernel / hung_task_timeout_secs

Найти рекурсивный поиск Grep

«Неизвестные переходы, перечисленные в локальном; обновить git-приложение! "

du: объединить обе метки времени

Linux и Unix - лучшая ОС в мире.