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/tun
with 에 전달하고 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
, 사용 가능한 개발 환경이 없는 경우 일부 필수 매개변수 및 값을 알고 있거나 조정해야 하기 때문에 이는 약간 까다롭습니다(향후 또는 아키텍처에 따라 변경될 수 있음). 이 정보와 조정이 여기에 필요합니다.
- 정의
$malloc
64비트 시스템의 경우 반환된 메모리 주소의 올바른 크기를 처리합니다. 크레딧은 다음으로 이동합니다.이 댓글SO에서. $malloc(64)
:struct ifreq
64비트에서는 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이 알려졌으므로 /proc
QEMU 프로세스를 진행할 수 있습니다.
$ 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
탭 장치입니다.