【问题标题】:How to automatically run 'sudo modprobe -r ftdi_sio' whenever the device is plugged into my computer每当设备插入我的计算机时,如何自动运行“sudo modprobe -r ftdi_sio”
【发布时间】:2020-04-26 12:29:23
【问题描述】:

我有一个正在使用的 USB 设备,我正在开发一个使用 WebUSB 和 Google Chrome 的应用程序。 问题是每当我将 USB 设备插入我的 Linux 计算机时,我必须手动运行 sudo modprobe -r ftdi_sio 来卸载它。

我希望每当我将该设备插入计算机时自动卸载它,而不必每次都手动输入。

关于如何实施的任何想法?非常感谢您的帮助

【问题讨论】:

    标签: linux linux-kernel usb linux-device-driver


    【解决方案1】:

    一种选择是将 ftdi_sio 模块“列入黑名单”以阻止其自动加载。为此,请创建以下文件:

    /etc/modprobe.d/ftdi_sio-blacklist.conf

    # This is a comment. Change it if you want.
    blacklist ftdi_sio
    

    【讨论】:

      【解决方案2】:

      将您的命令放入 /etc/rc.local 并重新启动。看看它是否有效。或者您可以找到如何将其他 .ko 配置为在系统启动期间自动加载。按照同样的方法使您的模块自动加载。

      【讨论】:

      • 首先感谢您的回复!!这在我重新启动计算机时有效,而不是在我拔下然后插入我的设备时。当我将设备插入计算机时,我需要启动此命令。因为每次拔下设备时,我都必须手动运行此命令。
      • 或者至少在某种程度上,永远不要让 Linux 加载这个设备供自己使用。
      【解决方案3】:

      正确的方法是创建一个 udev 规则,在连接特定 USB 设备时触发。

      创建文件 /etc/udev/rules.d/99-usb-load.rules,并将“7523”和“1a86”替换为您的 USB 设备的产品 ID 和供应商 ID。

      # For debugging if the rule is working
      ACTION=="add", ENV{ID_MODEL_ID}=="7523", ENV{ID_VENDOR}=="1a86", RUN+="/bin/sh -c '/bin/echo inserted device >> /tmp/udev_file'"
      ACTION=="remove", ENV{ID_MODEL_ID}=="7523", ENV{ID_VENDOR}=="1a86", RUN+="/bin/sh -c '/bin/echo removed device >> /tmp/udev_file'"
      
      # Actual rules
      ACTION=="add", ENV{ID_MODEL_ID}=="7523", ENV{ID_VENDOR}=="1a86", RUN+="/sbin/rmmod ftdi_sio"
      ACTION=="remove", ENV{ID_MODEL_ID}=="7523", ENV{ID_VENDOR}=="1a86", RUN+=""
      

      重启udev守护进程

      sudo /etc/init.d/udev restart
      

      只要连接了具有匹配 PID/VID 的 USB 设备,就会执行添加规则,并卸载模块 ftdi_sio。前两条规则用于调试目的,将一行写入 /tmp/udev_file,可用于验证规则是否已触发。

      【讨论】:

      • 感谢您的回复,我马上试试
      • 您是否在 /tmp/udev_file 中获取了日志?首先要确保设备正确触发规则。
      • 如果您可以在添加所需设备的同时共享一些日志,这可能会有所帮助。首先是 udevadm monitor --property 的输出,然后是 udevadm monitor。在一个终端中启动此命令并插入您的设备。
      • 不,不幸的是,我在评论之前检查了。我什至尝试将这些命令放入我之前创建的规则中,也没有奏效。我什至尝试重新启动我的笔记本电脑,但不幸的是没有得到任何结果。谢谢你的帮助!!
      【解决方案4】:

      看起来 USB 设备是新设备,插入后没有现有驱动程序可供处理。您需要一条中断线和一个 USB 驱动程序代码来满足您的要求。您需要将设备注册到该驱动程序并将驱动程序注册到 USB 总线。还需要编写适当的中断例程,以便在插入设备后立即调用。这将使其按您的意愿工作!

      【讨论】:

        【解决方案5】:

        如果您已经有一个用于 USB 设备的 .rules 文件,则将以下内容附加到 /etc/udev/rules.d/ 目录中的预先存在的文件中。否则,在/etc/udev/rules.d/ 目录中创建一个文件,内容如下:

        ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", ACTION=="add", RUN+="/sbin/rmmod ftdi_sio"
        ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", ACTION=="remove", RUN+=""
        

        这意味着当供应商 ID 0403 和产品 ID 6010 的设备插入时,它会运行 /sbin/rmmod ftdi_sio,这会删除 ftdi_sio 模块。第二条规则意味着拔下电源时不会运行任何东西。有关如何命名.rules 文件(例如99-mydevice.rules)的更多信息,请参阅[writing udev rules]

        您必须将 04036010 替换为您设备的供应商 ID 和产品 ID。插入 USB 设备后,在命令行上运行lsusb 可以找到供应商 ID 和产品 ID。它将具有以下格式:

        Bus xxx Device xxx: ID idVendor:idProduct ManufacturerName
        

        /etc/udev/rules.d/ 目录中创建或编辑.rules 文件后,请务必使用以下命令重新加载.rules 文件:

        sudo udevadm control --reload
        

        关于 udev 规则的一些进一步参考:

        debian wiki

        arch wiki

        writing udev rules

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-08
          • 2023-03-29
          • 1970-01-01
          • 1970-01-01
          • 2017-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多