用户反复抱怨,在未卸载的情况下拔下 USB 拇指驱动器后,数据会丢失。我们的机器上运行着 Ubuntu 14.04 LTS。自动安装已启用。
因为我厌倦了记住在拔下电源之前进行安全删除,所以我想让 Ubuntu 在拔下已安装的 USB 驱动器时显示警报。
我想添加一条在驱动器仍然安装的情况下在删除时udev
运行的规则。notify-send
如何确定 USB 驱动器在移除时是否被安装?
答案1
不幸的是,微软实际上做对了一件事:移除 USB... 而你会继续遇到这个问题,直到你:
禁用自动挂载
如果用户必须手动骑上去,那么训练他们下马也会更容易。
创建一个 udev 规则关闭 USB 磁盘上的所有缓存...
答案2
我喜欢 Fabby 的方法,但最好还是教教人们这个坏习惯(他们不会一直在受控的机器上工作)。这类似于 OSX 功能,如所述这里。
有一个小小的差别,您可以使用它来了解它是否是安全的删除:
为磁盘节点
ID_PART_TABLE_TYPE=dos
设置了udev 变量(sdx
NOT 分区节点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
创建 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"
重新加载规则
sudo udevadm control --reload-rules
另一种方法是,您可以使用连接到 DBUS 的脚本 (python) udisks
。它包含有关分区挂载/卸载、磁盘插入/拔出的所有必要信息...