![安装驱动器和 Udev - Udev 不安装驱动器,但执行脚本的其他方面](https://linux22.com/image/1184615/%E5%AE%89%E8%A3%85%E9%A9%B1%E5%8A%A8%E5%99%A8%E5%92%8C%20Udev%20-%20Udev%20%E4%B8%8D%E5%AE%89%E8%A3%85%E9%A9%B1%E5%8A%A8%E5%99%A8%EF%BC%8C%E4%BD%86%E6%89%A7%E8%A1%8C%E8%84%9A%E6%9C%AC%E7%9A%84%E5%85%B6%E4%BB%96%E6%96%B9%E9%9D%A2.png)
我想热插拔外部硬盘、安装它并自动运行 Unison 文件同步器。
我制定了一条 udev 规则,名为/etc/udev/rules.d/100-sync.rules
ACTION=="add", SUBSYSTEMS=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="wxyz", ATTRS{idProduct}=="wxyz", RUN+="/home/william/sync.sh"
它触发该脚本:
#!/bin/bash
mkdir /media/william/Backup
mount -U <my_drives_uuid> /media/william/Backup
su william -c 'notify-send "Unison" "Starting Sync"'
su william -c 'unison Desktop_Ext_local_connection.prf -silent > /home/william/unison_errors.log'
su william -c 'notify-send "Unison" "Finished Sync"'
umount /media/william/Backup
rmdir /media/william/Backup
从 root shell 运行脚本按预期工作,但是当它由 udev 触发时,驱动器不会安装。(我仍然收到系统通知和目录创建/销毁)
基于这,我认为这不起作用,因为 udev 使用了不同的命名空间。我尝试创建一个文件,/etc/systemd/system/systemd-udevd.service
内容如下
[Service]
MountFlags=shared *(and alternatively PrivateMounts=no)*
然而,这并没有改变行为 - 它仍然无法安装。(是的,我重新启动了守护进程)
如何使用 udev 安装驱动器?
脚本完成后,Ubuntu 会自动安装驱动器。有没有办法让 Ubuntu 在 udev 运行我的脚本之前安装驱动器?
我看不到 Ubuntu 用于挂载驱动器的任何 udev 规则,其内容/etc/udev/rules.d
只是
100-sync.rules 70-snap.snapd.rules 70-snap.snap-store.rules
那么,我的脚本完成后,Ubuntu 如何安装驱动器,以及如何更改顺序以便首先安装它们?
我正在使用 Ubuntu 20.04.3 LTS,在运行 21.04 的笔记本电脑上也出现了同样的问题
答案1
据我所知,所有包含 FS 挂载的 udev 脚本都是几年前的了。我相信它在出现时就已经改变了systemd
。
以下是来自的参考说明udev_237-人udev (Ubuntu_18.04)
RUN{type}
︙
请注意,由于 systemd-udevd.service 上强制执行的默认沙箱,udev 规则内不允许运行访问网络或挂载/卸载文件系统的程序。
最好采用使用 udev、udisks 等库的解决方案,或者使用持续监视该设备的外部脚本。
顺便说一句,100-
对于其他应用程序来说,现在还为时过早(udev 规则文件是按词汇顺序处理的),最好将其更改为高 2 位数字。如果你想最后使用99-