当用户不安全地拔下 USB 拇指驱动器时发出警报

当用户不安全地拔下 USB 拇指驱动器时发出警报

用户反复抱怨,在未卸载的情况下拔下 USB 拇指驱动器后,数据会丢失。我们的机器上运行着 Ubuntu 14.04 LTS。自动安装已启用。

因为我厌倦了记住在拔下电源之前进行安全删除,所以我想让 Ubuntu 在拔下已安装的 USB 驱动器时显示警报。

我想添加一条在驱动器仍然安装的情况下在删除时udev运行的规则。notify-send如何确定 USB 驱动器在移除时是否被安装?

答案1

不幸的是,微软实际上做对了一件事:移除 USB... 而你会继续遇到这个问题,直到你:

  1. 禁用自动挂载

    如果用户必须手动骑上去,那么训练他们下马也会更容易。

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

答案2

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

有一个小小的差别,您可以使用它来了解它是否是安全的删除:

  • 为磁盘节点ID_PART_TABLE_TYPE=dos设置了udev 变量(sdxNOT 分区节点sdxY) 处于不安全的删除状态。

  • 未在安全删除中设置

通过监控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
    

另一种方法是,您可以使用连接到 DBUS 的脚本 (python) udisks。它包含有关分区挂载/卸载、磁盘插入/拔出的所有必要信息...

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

相关内容