为什么udev不触发已挂载的sdcard分区的删除事件?

时间:2019-03-09 20:31:39

标签: systemd mount udev cardreader

问题(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卡。

第一步:

创建一个新的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"

第二步:

安装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*****

Step3:

现在从插槽中取出uSD卡,但不要从计算机上断开USB电缆的连接。观看日志:

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***** 

第四步:

现在,再次插入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 ...等)

第5步:

现在,在安装分区后,从插槽中卸下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主机,端口,伦号挂载到某些特定目录时...但是在某些情况下,这种方法非常简单: https://dev.to/adarshkkumar/mount-a-volume-using-systemd-1h2f

0 个答案:

没有答案