我有一个用于以太网访问的 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/ 中看到系统上的任何现有规则