【问题标题】:Call variable from within udev rule从 udev 规则中调用变量
【发布时间】:2023-03-04 19:26:01
【问题描述】:

我有多个 udev 规则来检查 ATTRS{name}=="abc123" 并在该设备存在时调用各种函数。这些 udev 规则位于多个位置,因为这是在 bitbake 中为自定义嵌入式操作系统创建的。现在,如果我想更改此设备以测试不同的硬件,每次更改每个 ATTR{name} 调用都太耗时了。

我的解决方案是定义一个 var,例如$UDEVVAR="[device_name]" 在某个 conf 文件中(待确定),然后将每个 ATTR{name} 调用更改为 ATTR{name}=="${UDEVVAR}" 之类的内容。

我已经在为概念证明编写的本地规则中测试了这种方法,尽管该规则没有调用。这个地方规则有点不同,虽然遵循相同的概念。无论我放在哪里的闪存驱动器都没有定义 ATTR{name},所以我使用了 USB 鼠标和那个闪存驱动器。这个 udev 规则是:

SUBSYSTEM=="${UDEVVAR}", ACTION=="add", RUN+="/usr/local/bin/trigger.sh"

trigger.sh 只是将日期时间戳写入日志文件。将 SUBSYSTEM 硬编码为 =="block" 时,规则调用成功,但在定义 UDEVVAR="block" 时,规则不会被调用。这个想法是,如果可行,那么我将定义 UDEVVAR="hidraw" 来测试鼠标。

我似乎找不到太多关于任何人试图做这样的事情的文档。我想我犯了某种语法错误,或者可能 udev 规则不允许这样的事情。

感谢您的帮助!

【问题讨论】:

    标签: linux embedded-linux bitbake udev


    【解决方案1】:

    您应该能够在 udev 规则中使用 ENV。

    SUBSYSTEM=="$env{UDEV_SUBSYS}", ACTION=="add", RUN+="/usr/local/bin/trigger.sh"
    

    或者甚至将其用作过滤条件(以便有条件地运行 N 个相似的给定规则):

    ENV{UDEV_SUBSYS}=="hidraw", ACTION=="add", RUN+="/usr/local/bin/trigger.sh"
    

    然后您必须及时定义变量,例如在/etc/environment 中(甚至使用u-boot setenv):

    UDEV_SUBSYS="hidraw"
    

    如果您希望在启动完成后动态更改它(即从用户态进程),这还不够;您将必须实现一种机制,在更新环境后重新启动 udev 作为其子项

    详情请见udev manual

    注意:这和手册一样对systemd-udevd 有效。 YMMV 与其他 udev 口味。

    编辑:/etc/environment 不太支持 busybox init。 请参阅/etc/inittab 了解您可能拥有的任何初始化脚本,并在那里获取环境文件(或设置/导出变量)。

    编辑 2:可悲的是,似乎只有 NAMESYMLINKPROGRAMOWNERGROUPMODESECLABELRUN 字段支持替换。 :( 我之前在手册中忽略了这一点。

    您可能会成功编写一个将设备数据作为环境接收并在PROGRAM 字段中提供以进行匹配的shell 脚本。如果认为匹配,则返回 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多