当插入给定的 USB 设备(以太网加密狗)时,如何启动 systemd 服务?

当插入给定的 USB 设备(以太网加密狗)时,如何启动 systemd 服务?

我有一个用于以太网访问的 USB 以太网适配器,但我想netctl-ifplugd@...在插入时自动启动。(不要与插入以太网电缆- 由 处理netctl-ifplugd。)我怎样才能实现这一点?

我见过如何编写依赖于现有设备的 systemd 服务?但这似乎与插入无关,仅与它存在有关。

答案1

我见过“如何编写依赖于设备存在的 systemd 服务?”但这似乎与插入设备无关,只与设备存在有关。

它非常相似,只有你需要相反的依赖关系:而不是(或者可能除了)你的服务依赖于设备,你想要虚拟设备单位取决于您的服务。

事实上,尽管相关问题的标题看似在问相反的问题,接受的答案在线程中已经记录了使设备启动服务的确切方法之一(udev-rule 方法)。

但如果你有一个精确的.device 单元名称,直接使用 systemd 依赖项更简单:

如果知道确切的 sysfs 路径:

例如,您已确定该设备sys-子系统-网络设备-usb0.device。您可以使用各种方法来扩展该单元(尽管它是虚拟的),例如foo.device.d/*.conf插件或foo.device.wants/符号链接(其工作方式与例如多用户.目标.想要/)。

  • 您可以[Install]在服务中添加配置,然后systemctl 启用它:

    [Install]
    WantedBy=sys-subsystem-net-devices-%i.device
    
  • 或者您可以直接使用以下命令获得相同的结果systemctl add-wants

    # systemctl add-wants sys-subsystem-net-devices-usb0.device [email protected]
    
  • 这两种方法都只会产生一个符号链接,可以通过手动创建ln -s

对于用户单位来说这通常是相同的。

如果只知道部分名称(或其他属性的某种组合):

编写与您的设备匹配的 udev 规则(确切的 udev 规则语法超出了此处的范围)并让其设置SYSTEMD_WANTS指示您的设备的 udev 属性(又名“设备环境变量”):

ACTION=="add", SUBSYSTEM=="net", KERNEL=="usb*", ENV{SYSTEMD_WANTS}+="netctl-ifplugd@%k.service"

由于所有*.rules文件都按字母顺序处理,因此请确保您的规则位于 systemd 自己的“持久网络接口”规则之后。

如果您使用 ,它适用于用户单位ENV{SYSTEMD_USER_WANTS}


您可能想RUN+="/bin/systemctl start foo"通过 udev 使用。不要这样做。但是如果您这样做,那么至少使用该systemctl --no-block选项,这样您就不会在两个组件之间造成可能的死锁。

答案2

udev是您想要查看的内容。它将允许您执行诸如在硬件插入、拔出、状态发生变化等情况下执行命令之类的操作。您还可以指定各种条件来控制触发(即当插入任何存储设备或仅插入特定制造商的特定型号等时)。您应该在 /etc/udev/rules.d/ 中看到系统上的任何现有规则

相关内容