当用户不安全地拔出USB拇指驱动器时提醒用户


13

用户在拔出USB拇指驱动器而未卸载的情况下反复抱怨其数据丢失。我们在计算机上运行Ubuntu 14.04 LTS。自动挂载已启用。

由于我已经厌倦了记住它们在拔出之前必须进行安全移除,因此我想让Ubuntu在每次拔出已安装的USB驱动器时显示警报。

我想到要添加一条udev规则,该规则可notify-send在驱动器仍安装的情况下在删除时运行。如何确定USB驱动器在卸下时是否已安装?


因此,您已经说过启用了自动挂载,但是然后您问“我如何确定是否触发了udev规则的USB挂载?” 。现在,我认为您的意思是您需要确定移除后的USB状态-已安装还是已卸载。我个人将使用一个启动脚本来解决这个问题,该脚本仅使用df -a | grep 'sd[b-z]' 命令监视USB的安装/卸载时间。udev规则可以将删除日期发送到某种日志。如果脚本给出的删除时间与udev规则的删除时间匹配(至少按分钟计算,可能会有几秒钟的延迟),则不会挂载usb。
Sergiy Kolodyazhnyy 2015年

2
这也是我为记录目的编写的脚本。paste.ubuntu.com/11748191 如果您喜欢这个想法,我可以将其发布为答案,但是我个人认为这两个评论是一个建议,而不是
可行的

Answers:


4

我喜欢Fabby的方法,但是最好教人们这个坏习惯(他们并不是一直在受控机器上工作)。这是类似于OSX功能,如所描述这里

您可以使用它来知道它是否可以安全删除,这之间有一个小的区别:

  • 在不安全删除中ID_PART_TABLE_TYPE=dossdx磁盘节点(NOT分区节点sdxY)设置了udev变量。

  • 未设置为安全删除的位置

通过监视udev事件注意到:

udevadm monitor -u --environment
  • 安全移除

    UDEV  [8292.380554] change   /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/host16/target16:0:0/16:0:0:0/block/sdb (block)
    ACTION=change
    DEVLINKS=/dev/disk/by-id/usb-ADATA_USB_Flash_Drive_8d90ec535e6663-0:0 /dev/disk/by-path/pci-0000:00:14.0-usb-0:2:1.0-scsi-0:0:0:0
    DEVNAME=/dev/sdb
    DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/host16/target16:0:0/16:0:0:0/block/sdb
    DEVTYPE=disk
    DISK_MEDIA_CHANGE=1
    ID_BUS=usb
    ID_INSTANCE=0:0
    ID_MODEL=USB_Flash_Drive
    ID_MODEL_ENC=USB\x20Flash\x20Drive\x20
    ID_MODEL_ID=c96a
    ID_PATH=pci-0000:00:14.0-usb-0:2:1.0-scsi-0:0:0:0
    ID_PATH_TAG=pci-0000_00_14_0-usb-0_2_1_0-scsi-0_0_0_0
    ID_REVISION=0.00
    ID_SERIAL=ADATA_USB_Flash_Drive_8d90ec535e6663-0:0
    ID_SERIAL_SHORT=8d90ec535e6663
    ID_TYPE=disk
    ID_USB_DRIVER=usb-storage
    ID_USB_INTERFACES=:080650:
    ID_USB_INTERFACE_NUM=00
    ID_VENDOR=ADATA
    ID_VENDOR_ENC=ADATA\x20\x20\x20
    ID_VENDOR_ID=125f
    MAJOR=8
    MINOR=16
    SEQNUM=2989
    SUBSYSTEM=block                                                              
    TAGS=:systemd:                                                               
    USEC_INITIALIZED=554873
    
  • 不安全删除

    UDEV  [8391.320280] remove   /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host17/target17:0:0/17:0:0:0/block/sdb (block)
    ACTION=remove
    DEVLINKS=/dev/disk/by-id/usb-ADATA_USB_Flash_Drive_8d90ec535e6663-0:0 /dev/disk/by-path/pci-0000:00:14.0-usb-0:3:1.0-scsi-0:0:0:0
    DEVNAME=/dev/sdb
    DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/host17/target17:0:0/17:0:0:0/block/sdb
    DEVTYPE=disk
    ID_BUS=usb
    ID_INSTANCE=0:0
    ID_MODEL=USB_Flash_Drive
    ID_MODEL_ENC=USB\x20Flash\x20Drive\x20
    ID_MODEL_ID=c96a
    ID_PART_TABLE_TYPE=dos
    ID_PATH=pci-0000:00:14.0-usb-0:3:1.0-scsi-0:0:0:0
    ID_PATH_TAG=pci-0000_00_14_0-usb-0_3_1_0-scsi-0_0_0_0
    ID_REVISION=0.00
    ID_SERIAL=ADATA_USB_Flash_Drive_8d90ec535e6663-0:0
    ID_SERIAL_SHORT=8d90ec535e6663
    ID_TYPE=disk
    ID_USB_DRIVER=usb-storage
    ID_USB_INTERFACES=:080650:
    ID_USB_INTERFACE_NUM=00
    ID_VENDOR=ADATA
    ID_VENDOR_ENC=ADATA\x20\x20\x20
    ID_VENDOR_ID=125f
    MAJOR=8
    MINOR=16
    SEQNUM=3022
    SUBSYSTEM=block
    TAGS=:systemd:
    USEC_INITIALIZED=436355
    

  1. 创建udev规则(更改useranme

    $ sudo nano /etc/udev/rules.d/90-unsafe-remove-notify.rules
    
    ACTION=="remove", KERNEL=="sd?", ENV{ID_PART_TABLE_TYPE}!="", RUN+="/usr/bin/sudo -u username DISPLAY=:0 notify-send 'Unsafe Remove' '<b><i>Your long message</b></i>' -i /usr/share/icons/gnome/48x48/emotes/face-worried.png -t 10000"
    
  2. 重新加载规则

    sudo udevadm control --reload-rules
    

另一种方法,您可以使用连接到udisksDBUS 的脚本(python)。它具有您需要的有关分区安装/卸载,磁盘插入/拔出的所有必需信息...

参考/来源: Gentoo Wiki:Udisks-USB_Thumb_Drive_Example


1
虽然我确实喜欢Fabby的方法,但这是我一直在寻找的!我现在打算写一个Python脚本,用于监听udisks的DBUS事件,然后处理消息对话框的显示等
RenWal

8

不幸的是,Micro $ oft实际上是正确的事情:USB移除...而且您将继续遇到这个问题,直到您:

  1. 禁用自动挂载

    如果用户必须手动安装,则也更容易培训他们卸载。

  2. 创建一个udev规则以关闭USB磁盘上的所有缓存 ...


2
+1-禁用缓存有助于减少问题。只要他们在写操作期间不拔出设备(通常会导致设备上的LED亮起/闪烁),它们就可以了。
内森·奥斯曼

好的,在计算机端可以很好地工作。但是,是否在挂载上禁用缓存或设置同步标志不会很快烧毁闪存芯片?这些USB驱动器都是VFAT,我听说Linux在更新FAT表方面非常积极-耗尽了包含该表的扇区。
RenWal

我只购买SLC摇杆,并且无论文件系统如何,我都还没有死……(而且我只有2个)
Fabby 2015年

@RenWal:因为您从未在此站点上接受答案:请不要忘记单击文本左侧的灰色☑,这表示是的,此答案有效!
Fabby 2015年

1
FWIW,出于相同的原因,Windows默认情况下会禁用FAT格式的USB驱动器上的写缓存,因此,我认为驱动器上的任何额外磨损都被认为是一种较小的危害。
thomasrutter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.