V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
15399905591
V2EX  ›  问与答

Linux 下 /dev/bus/usb 文件每次插拔会变动

  •  
  •   15399905591 · 2019-01-10 17:28:20 +08:00 · 3186 次点击
    这是一个创建于 1925 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我使用 appium 模拟手机操作,我找了个 appium 的 docker 镜像( https://github.com/appium/appium-docker-android), 我使用该该镜像,每个容器都需要使用--device 参数指定一个 USB 设备,这个参数其实是指定的 /dev/bus/usb 下的某个文件,如下:

    docker run -d -p 4723:4723 --device /dev/bus/usb/XXX/YYY:/dev/bus/usb/XXX/YYY -v ~/.android:/root/.android --name device1 appium/appium

    但是 /dev/bus/usb 下每次插拔后,文件名都会变化,我怎么固定这个参数呢?

    16 条回复    2019-01-13 09:58:17 +08:00
    zjb861107
        1
    zjb861107  
       2019-01-10 18:13:29 +08:00
    zjb861107
        2
    zjb861107  
       2019-01-10 18:14:30 +08:00
    如果我没理解错的话,应该是 adb 的问题。
    所以参考上面提到的几种方案吧
    zbinlin
        3
    zbinlin  
       2019-01-10 18:22:05 +08:00
    首先你找到这个 USB 设备的 Vendor ID 和 Product ID,可以通过 `lsusb` 查看:

    ```sh
    lsusb
    ```

    输出:
    ```
    Bus 002 Device 028: ID 0451:8046 Texas Instruments, Inc.
    Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 001 Device 004: ID 05d5:624c Super Gate Technology Co., Ltd
    Bus 001 Device 003: ID 0bda:8178 Realtek Semiconductor Corp. RTL8192CU 802.11n WLAN Adapter
    ```

    例如我要找到的这个设备是 `Realtek Semiconductor Corp. RTL8192CU 802.11n WLAN Adapter`,则它的 VID 和 PID 分别是 `0bda`, `8178`。

    然后这样指定就可以了:

    ```sh
    docker run -d -p 4723:4723 --device $( \
    lsusb -d 0bda:8178 | \
    awk '{ \
    vid=$2; pid=substr($4, 1, length($4) - 1); \
    printf "/dev/bus/usb/%s/%s:/dev/bus/usb/%s/%s", vid, pid, vid, pid; \
    }' \
    ) -v ~/.android:/root/.android --name device1 appium/appium
    ```
    15399905591
        4
    15399905591  
    OP
       2019-01-11 10:37:42 +08:00
    @zjb861107 谢谢,确实是 adb 的问题,但是单独提供一个 adb 服务是没用的,因为每个 docker 容器里都会带一个 adb,而 usb 一但被某个容器连接了,其它容器的 adb 就无法调用
    15399905591
        5
    15399905591  
    OP
       2019-01-11 10:49:08 +08:00
    @zbinlin 谢谢答复,但有个问题,我每次插拔以后,pid 都会变动,这样,我之前启动的容器就没办法连接到了
    zbinlin
        6
    zbinlin  
       2019-01-11 11:34:08 +08:00
    @15399905591 被次插都变?不可能吧,你这是什么设备的?把 lsusb 输出贴出来看下
    15399905591
        7
    15399905591  
    OP
       2019-01-11 11:39:51 +08:00
    Bus 002 Device 068: ID 12d1:107e Huawei Technologies Co., Ltd.
    Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
    Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 003 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
    Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub


    这条信息,只要重新插拔,Bus 002 Device 068: ID 12d1:107e Huawei Technologies Co., Ltd.
    Device 后面的 ID 就会变动
    15399905591
        8
    15399905591  
    OP
       2019-01-11 11:40:07 +08:00
    zbinlin
        9
    zbinlin  
       2019-01-11 12:17:49 +08:00
    如果只插有一个这种 USB 设备,可以把 pid 省略,如 `lsusb -d 12d1:`
    15399905591
        10
    15399905591  
    OP
       2019-01-11 13:35:28 +08:00
    @zbinlin 我就是有很多设备,不可能每次插拔都去获取,我想把这个 ID 固定下来。
    weyou
        11
    weyou  
       2019-01-11 13:44:51 +08:00 via Android
    udev 建一条规则,做个 device symbol link 到 /dev
    zjb861107
        12
    zjb861107  
       2019-01-11 15:34:44 +08:00
    @15399905591 adb server 用 sorccu/adb 启动然后暴露 5037 端口,appium 容器和宿主机上都不要启动 adb server。
    15399905591
        13
    15399905591  
    OP
       2019-01-11 15:50:56 +08:00
    @zjb861107 你这种方法的问题在于,appium server 的 adb 是写容器内部的,我得改 appium 的容器才行。
    15399905591
        14
    15399905591  
    OP
       2019-01-11 15:51:06 +08:00
    @weyou 我试试看,谢谢了。
    zjb861107
        15
    zjb861107  
       2019-01-11 16:49:00 +08:00
    @15399905591 我倒是觉得,想生产环境使用这是必须的,一个容器只做一件事。
    官方的示例只是供你参考,让你能够“一键”跑起来,具体自己使用还是要修改的。这方面也可以参考 openstf。
    julyclyde
        16
    julyclyde  
       2019-01-13 09:58:17 +08:00
    @15399905591 bus 几 device 几,是设备在电脑上的连接关系
    后边 device 几才是 vid:pid
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5250 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 07:43 · PVG 15:43 · LAX 00:43 · JFK 03:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.