AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 561201
Accepted
Torxed
Torxed
Asked: 2020-01-10 05:40:29 +0800 CST2020-01-10 05:40:29 +0800 CST 2020-01-10 05:40:29 +0800 CST

无需猜测即可获取与 macvtap 关联的 /dev/tapX

  • 772

按照本指南设置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]+)。这会起作用,但不确定这是最好/正确的方法。

linux networking
  • 1 1 个回答
  • 620 Views

1 个回答

  • Voted
  1. Best Answer
    A.B
    2020-04-20T12:31:41+08:002020-04-20T12:31:41+08:00

    设备名称是根据接口索引创建的:

    snprintf(tap_name, IFNAMSIZ, "tap%d", dev->ifindex);
    

    [...]

          devt = MKDEV(MAJOR(macvtap_major), vlantap->tap.minor);
          classdev = device_create(&macvtap_class, &dev->dev, devt,
                       dev, tap_name);
    

    如果存在 OP 的ip link show macvtap0答案,它很可能会以:

    11: macvtap0@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 [...]
    
    • 这个属性在一些地方被 使用或记录 。

      $ echo /dev/tap$(cat /sys/class/net/macvtap0/ifindex)
      /dev/tap11
      

    如果您不想依赖这个似乎没有正式记录的特定属性(整个树中不存在macvtaplinux/Documentation/这个词),您可以依赖于/sys(似乎也没有为macvtap正式记录):

    这些信息在macvtap/*子目录中可用。请注意,这tap11是单个条目的符号链接macvtap/tap11,由于它在哪里不切实际,所以应该忽略它(但不是它指向的目录)。

    • 从网络接口名称中找到设备节点条目名称:

      1. /sys/class/net/macvtap0/macvtap/*有一个条目,即分接设备名称,它是一个目录:

        $ printf '/dev/%s\n' "$(basename /sys/class/net/macvtap0/macvtap/*)"
        /dev/tap11
        

        intf_to_devtap可以使用调用的函数:

        intf_to_devtap () {
            [ -e "/sys/class/net/$1/macvtap" ] || return 1
            printf '/dev/%s\n' "$(basename /sys/class/net/$1/macvtap/*)"
        }
        

        对于 OP 的情况:

        $ intf_to_devtap macvtap0
        /dev/tap11
        
      2. dev输入主要:次要:

        $ cat /sys/class/net/macvtap0/macvtap/*/dev
        242:1
        

        如果在多个网络命名空间中创建了macvtap ,每个命名空间具有相同的接口索引,则此属性(以及下面的等效项uevent)是唯一保证唯一的,从而导致设备节点名称冲突。冲突示例(之前没有创建macvtap设备时):

        # ip netns add collision1; ip netns add collision2
        # ip -n collision1 link add type dummy; ip -n collision2 link add type dummy
        # ip -n collision1 link add link dummy0 type macvtap
        # ls -l /dev/tap*
        crw-------. 1 root root 242, 1 Apr 19 21:24 /dev/tap3
        # ip -n collision2 link add link dummy0 type macvtap
        # ls -l /dev/tap*
        crw-------. 1 root root 242, 1 Apr 19 21:24 /dev/tap3
        

        没有出现第二个点击条目。这是因为当第二个网络命名空间也创建了一个索引为 3 的接口(lo=1、dummy0=2、macvtap0=3)时发生了冲突,并且没有创建第二个设备条目,/dev因为已经存在同名文件。同样为了准确处理网络设备而ip netns重新/sys安装,可以验证实际上存在两个分接设备,即使第二个没有“映射”:

        # ip netns exec collision1 sh -c 'cat /sys/class/net/macvtap0/macvtap/*/dev'
        242:1
        # ip netns exec collision2 sh -c 'cat /sys/class/net/macvtap0/macvtap/*/dev'
        242:2
        

        因此,即使一半的信息与此不匹配,仍然可以通过“映射”然后使用设备来使用第二个macvtap/sys接口后端,例如:

        # mknod /dev/tap3b c 242 2
        

        或使用更详细的名称,例如/dev/tap-VM1-intfA.

      3. uevent条目,同时给出主要:次要和名称:

        $ cat /sys/class/net/macvtap0/macvtap/*/uevent
        MAJOR=242
        MINOR=1
        DEVNAME=tap11
        
    • 从开发条目到接口名称:

      与/dev/tap11:

      /dev/tap11-> /sys/class/macvtap/tap11-> /sys/devices/virtual/net/macvtap0/macvtap/tap11。请注意,/sys/class/net/macvtap0before 实际上是指向/sys/devices/virtual/net/macvtap0.

      还是在最后一个目录下,device入口是接口目录的符号链接,所以我们在最后/sys/class/macvtap/tap11/device->/sys/devices/virtual/net/macvtap0

      devtap_to_intf可以使用调用的函数:

      devtap_to_intf () {
          [ -c "$1" ] || [ -c "/dev/$1" ] || return 1
          local path="$(readlink -e "/sys/class/macvtap/${1#/dev/}/device")"
          printf '%s\n' "${path#/sys/devices/virtual/net/}"
      }
      

      对于OP的情况:

      $ devtap_to_intf /dev/tap11
      macvtap0
      
    • 4

相关问题

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 奇怪的路由器与centos 6一起工作[关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve