0

问题(TL;DR):

对于具有多个分区的 SD 卡,当从 USB-SD 读卡器中移除 uSD 或 SD 卡时,如何从 udev获取已安装节点的至少“更改”事件,而无需断开 USB 电缆与 PC 的连接?

奖励:获取“分区”节点的“添加/删除”事件(例如“/dev/sdh2”)

什么不起作用:

挂载分区时,udev 不输出分区节点的任何事件,拔卡时!!!

重现步骤:

  • 您需要一个 USB-SD 读卡器(我强烈推荐:https ://www.kingston.com/en/flash/readers/FCR-HS4 )。但我在许多其他 USB-SD 读卡器(例如基于 GenesysLogic 的读卡器)上进行了测试,情况是一样的。
  • 您需要一个至少有 1 或 2 个分区的 uSD 或 SD 卡。

步骤1:

新建一个udev规则,命名为:/etc/udev/rules.d/98-test.rules 内容:

KERNEL!="sd*" , SUBSYSTEM!="block", GOTO="END"
LABEL="WORK"
ACTION=="add", RUN+="/usr/bin/logger *****Received add event for %k*****"
ACTION=="remove", RUN+="/usr/bin/logger *****Received remove event for %k*****"
ACTION=="change", RUN+="/usr/bin/logger *****Received change event for %k*****"

LABEL="END"

第2步:

安装 ccze ( sudo apt install ccze )。这将为您提供漂亮的彩色事件记录。

打开终端,运行以下命令:

journalctl -f | ccze -A

结果:

Mar 09 23:01:32 Ev-Turbo kernel: sd 6:0:0:3: [sdh] 30408704 512-byte logical blocks: (15.6 GB/14.5 GiB) 
Mar 09 23:01:32 Ev-Turbo kernel:  sdh: sdh1 sdh2 
Mar 09 23:01:33 Ev-Turbo root[19519]: *****Received change event for sdh***** 
Mar 09 23:01:33 Ev-Turbo root[19523]: *****Received change event for sdh***** 
Mar 09 23:01:33 Ev-Turbo root[19545]: *****Received add event for sdh2***** 
Mar 09 23:01:33 Ev-Turbo root[19552]: *****Received add event for sdh1*****

第三步:

现在从插槽中取出 uSD 卡,但不要断开 USB 电缆与 PC 的连接。看日志:

Mar 09 23:06:56 Ev-Turbo root[21220]: *****Received change event for sdh***** 
Mar 09 23:06:56 Ev-Turbo root[21223]: *****Received remove event for sdh2***** 
Mar 09 23:06:56 Ev-Turbo root[21222]: *****Received remove event for sdh1***** 

第4步:

现在,再次插入您的 uSD 卡,您将看到:

Mar 09 23:11:21 Ev-Turbo kernel: sd 6:0:0:3: [sdh] 30408704 512-byte logical blocks: (15.6 GB/14.5 GiB) 
Mar 09 23:11:21 Ev-Turbo kernel:  sdh: sdh1 sdh2 
Mar 09 23:11:21 Ev-Turbo root[22652]: *****Received change event for sdh***** 
Mar 09 23:11:21 Ev-Turbo root[22653]: *****Received change event for sdh***** 
Mar 09 23:11:21 Ev-Turbo root[22679]: *****Received add event for sdh2***** 
Mar 09 23:11:21 Ev-Turbo root[22682]: *****Received add event for sdh1*****

现在,尝试将其中一个分区挂载到系统中的某个位置:

sudo mount /dev/sdh2 /media/uSD2

您可以仔细检查它是否真的挂载(运行命令:lsblk、mount...等)

第五步:

现在,在安装分区时,从插槽中取出您的 uSD 卡。看日志:

Mar 09 23:12:32 Ev-Turbo root[23049]: *****Received change event for sdh*****

仅此而已...为什么不再有“删除”事件了???

奖金说明(与上述问题无关):

1) 网络上关于 udev/systemd/systemd-udevd 和挂载脚本的大部分信息都已过时。特别是对于 systemd v239,许多“已解决/工作”的答案都不可用(在这个问题上工作 2 周,阅读网络上的大多数解决方案,在 Debian 9.7、Linux Mint 18.3、Ubuntu 18.04 上测试)

2) 对于大于 212 的 systemd 版本,您需要服务文件来挂载您的可移动设备。示例: https ://serverfault.com/questions/766506/automount-usb-drives-with-systemd

3) 特别是对于systemd v239,需要禁用PrivateMounts 才能通过systemd 单元实现自动挂载。详情:https ://unix.stackexchange.com/questions/464959/udev-rule-to-automount-media-devices-stopped-working-after-systemd-was-updated-t

4)挂载单元文件并不适合所有情况,例如,当您想根据USB主机,端口,lun号挂载到某些特定目录时......但对于某些情况,这种方法非常简单:https:/ /dev.to/adarshkkumar/mount-a-volume-using-systemd-1h2f

4

0 回答 0