use*_*507 9 networking process kvm tap
我有时会遇到带有 Tap 接口的机器(例如,当 KVM 运行时)。我如何知道哪个进程附加到 TAP 接口?
小智 5
每个文件描述符都有一个 /proc/ pid /fdinfo/ num条目,例如:
# cat /proc/24332/fdinfo/28
pos: 0
flags: 0104002
mnt_id: 18
iff: tap0123acdc-66
Run Code Online (Sandbox Code Playgroud)
因此,使用接口名称,您可以通过以下方式获取 pid:
# egrep -l iff:.*tap0123acdc-66 /proc/*/fdinfo/* 2>/dev/null|cut -d/ -f3
24332
Run Code Online (Sandbox Code Playgroud)
这让我感到好奇,我查看了 Linux 内核源代码(我假设你的问题是关于 Linux 的)。
看来答案比你想象的要困难。此TUN/TAP API 教程页面提供了一些见解。基本上,您的程序通过打开/dev/net/tun并向其发送TUNSETIFF ioctl. 如果一切顺利,将创建一个接口,内核为您提供其名称和文件描述符,这就是您管理它的方式。
这里有两个问题:
struct tun_struct(TUN 和 TAP 在很大程度上共享相同的数据结构)。实际上,我怀疑 2 不会发生太多。检查一个openvpn进程,lsof显示它仍然打开了 TAP 设备的文件描述符,并且显然正在使用它,但由于/dev/net/tun是一种像 一样的多路复用设备/dev/ptmx,您可以使用lsof来找出当前正在使用 TUN/TAP 设备的进程,但是你无法知道什么进程正在使用什么设备。
有一些间接的方法可以解决根本问题。对于 OpenVPN,我使用隧道设置脚本,使用更具描述性的名称来命名tunX/设备,其中包括 OpenVPN 配置文件的基本名称。tapX因此,/etc/openvpn/foo.conf引出了一个vpn-foo设备。然后我可以将 OpenvVPN 进程与其使用的接口关联起来。不过,还没有必要使用 QEmu/KVM 来做到这一点。
| 归档时间: |
|
| 查看次数: |
7969 次 |
| 最近记录: |