탭 인터페이스와 해당 파일 설명자 간의 연결을 찾는 방법은 무엇입니까?

탭 인터페이스와 해당 파일 설명자 간의 연결을 찾는 방법은 무엇입니까?

qemu임시 인터페이스를 생성하는 오케스트레이션 스크립트로 시작된 가상 머신이 있습니다 tap. 프로세스에 대한 명령줄 인수를 확인하면 qemu-system-x86_64프로세스가 tap파일 설명자를 사용하여 이미 열려 있는 인터페이스에 연결하는 것을 볼 수 있습니다 27.

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

ls -l /proc/<qemu-system-x86_64_PID>/fd/27그것에 따르면 /dev/net/tun.

tap인터페이스 이름(예 vnet99: ) 을 /dev/net/tunwith 에 전달하고 ioctl()올바른 fd를 반환하는 방식으로 작동합니까 ? 아니면 일반적으로 tap호스트의 어떤 인터페이스에 파일 설명자 27이 있는지 어떻게 알 수 있나요 ?

답변1

이것iff:사이의 항목줄 수도 있었을 텐데 답변예전에는커널 3.14에 추가됨제출과 함께tun: add device name(iff) field to proc fdinfo entry, 따라서 Ubuntu 14.04LTS와 같은 커널 3.13 이하에서는 사용할 수 없습니다.

이 경우 커널에 정보를 물어볼 수는 없지만, 커널에 물어보는 것은 가능하다.실제 과정이 정보는 디버거 추적을 사용하여 제공됩니다.

Linux 2.6.27부터 구성된 항목에 대한 정보를 요청하는 ioctl을 사용할 수 있습니다.통탭 인터페이스:TUNGETIFF. 그 목적은 상속을 위한 것입니다.FD문의할 수 있도록FD수신 인터페이스의 이름과 유형(ifr_name그리고ifr_flags) 또는 tuntap 장치가 아직 구성되지 않았으므로( EBADFD) 구성해야 함을 알 수 있습니다.

그래서 사용할 수는 있지만gdb, 사용 가능한 개발 환경이 없는 경우 일부 필수 매개변수 및 값을 알고 있거나 조정해야 하기 때문에 이는 약간 까다롭습니다(향후 또는 아키텍처에 따라 변경될 수 있음). 이 정보와 조정이 여기에 필요합니다.

  • 정의$malloc64비트 시스템의 경우 반환된 메모리 주소의 올바른 크기를 처리합니다. 크레딧은 다음으로 이동합니다.이 댓글SO에서.
  • $malloc(64):struct ifreq64비트에서는 40바이트인 것 같습니다. 안전을 위해 64바이트를 사용하겠습니다.
  • 0x800454d2== TUNGETIFF.
  • 결과는 ifr_name오프셋 0에 있습니다.

다음은 발견된 각 tuntap 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

일반적인 실행 예(루트로만 실행할 수 있으며 libvirt-qemu 사용자도 할 수 없는 것 같습니다)qemu 시스템):

# ./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

답변2

이제 파일 설명자 27이 알려졌으므로 /procQEMU 프로세스를 진행할 수 있습니다.

 $ ls /proc/<qemu-system-x86_64_PID>/fd/27

이 디렉터리와 동일한 수준에는 다음과 같은 세부 정보가 포함된 fd다른 디렉터리가 있습니다 fdinfo.

$ cat /proc/<qemu-system-x86_64_PID>/fdinfo/27
pos:    0
flags:  0104002
mnt_id: 18
iff:    tap0123acdc-66

이 파일의 항목은 iff탭 장치입니다.

인용하다

관련 정보