按照本指南设置macvtap
效果很好。
该指南的摘录如下所示:
# ip link add link eth1 name macvtap0 type macvtap
# ip link set macvtap0 address 1a:46:0b:ca:bc:7b up
# ip link show macvtap0
然后该指南继续解释您可以执行以下操作:
#qemu-system-x86_64 -net nic,model=virtio,addr=1a:46:0b:ca:bc:7b -net tap,fd=3 3<>/dev/tap11
如果您macvtap
最终使用/dev/tap11
.
但是你如何检查哪个/dev/tapX
接口实际分配给了macvtap0
上面?
我有很多服务在我的机器上随机设置水龙头设备。而且我无法猜测我的特定的最终是哪一个。
我希望通过以下方式启动 qemu 机器:
-netdev tap,ifname="macvtap0",id=network0,script=no,downscript=no \
-device i82559b,netdev=network0,mac=${MAC}
macvtap0
可以,我刚刚创建的设备在哪里。
但是,这给了我:
qemu-system-x86_64: could not configure /dev/net/tun (macvtap0): Invalid argument
本文概述:如何找到tap接口与其文件描述符之间的联系?- 他们描述了一种通过访问 PID 并检查关联的文件描述符来做到这一点的方法,对我来说,这里的问题是 qemu 没有设置设备,我是。并且没有与之相关的PID。
Sow如何获取与新创建的接口/dev
关联的文件句柄?macvtap
编辑:我已经解决了几天这个问题,但我刚刚意识到我忘了检查/sys/class/net/macvtap0/
,并且有一个/tap2
设备。显然,我需要遍历所有内容仍然找到匹配的名称regex(tap[0-9]+)
。这会起作用,但不确定这是最好/正确的方法。
设备名称是根据接口索引创建的:
如果存在 OP 的
ip link show macvtap0
答案,它很可能会以:这个属性在一些地方被 使用或记录 。
如果您不想依赖这个似乎没有正式记录的特定属性(整个树中不存在macvtap
linux/Documentation/
这个词),您可以依赖于/sys
(似乎也没有为macvtap正式记录):这些信息在
macvtap/*
子目录中可用。请注意,这tap11
是单个条目的符号链接macvtap/tap11
,由于它在哪里不切实际,所以应该忽略它(但不是它指向的目录)。从网络接口名称中找到设备节点条目名称:
/sys/class/net/macvtap0/macvtap/*
有一个条目,即分接设备名称,它是一个目录:intf_to_devtap
可以使用调用的函数:对于 OP 的情况:
dev
输入主要:次要:如果在多个网络命名空间中创建了macvtap ,每个命名空间具有相同的接口索引,则此属性(以及下面的等效项
uevent
)是唯一保证唯一的,从而导致设备节点名称冲突。冲突示例(之前没有创建macvtap设备时):没有出现第二个点击条目。这是因为当第二个网络命名空间也创建了一个索引为 3 的接口(
lo
=1、dummy0
=2、macvtap0
=3)时发生了冲突,并且没有创建第二个设备条目,/dev
因为已经存在同名文件。同样为了准确处理网络设备而ip netns
重新/sys
安装,可以验证实际上存在两个分接设备,即使第二个没有“映射”:因此,即使一半的信息与此不匹配,仍然可以通过“映射”然后使用设备来使用第二个macvtap
/sys
接口后端,例如:或使用更详细的名称,例如
/dev/tap-VM1-intfA
.uevent
条目,同时给出主要:次要和名称:从开发条目到接口名称:
与
/dev/tap11
:/dev/tap11
->/sys/class/macvtap/tap11
->/sys/devices/virtual/net/macvtap0/macvtap/tap11
。请注意,/sys/class/net/macvtap0
before 实际上是指向/sys/devices/virtual/net/macvtap0
.还是在最后一个目录下,
device
入口是接口目录的符号链接,所以我们在最后/sys/class/macvtap/tap11/device
->/sys/devices/virtual/net/macvtap0
devtap_to_intf
可以使用调用的函数:对于OP的情况: