แจ้งเตือนผู้ใช้เมื่อพวกเขาถอดปลั๊ก USB ไดรฟ์อย่างไม่ปลอดภัย


13

ผู้ใช้บ่นซ้ำ ๆ เกี่ยวกับข้อมูลที่สูญหายในธัมบ์ไดรฟ์ USB หลังจากที่พวกเขาถอดปลั๊กออกโดยไม่ต้องถอดออก เรารัน Ubuntu 14.04 LTS บนเครื่องของเรา เปิดใช้งานการติดตั้งอัตโนมัติ

เนื่องจากฉันเบื่อที่จะจำได้ว่าพวกเขาทำการลบอย่างปลอดภัยก่อนที่จะถอดปลั๊กฉันต้องการให้ Ubuntu แสดงการแจ้งเตือนเมื่อใดก็ตามที่ไดรฟ์ USB ที่เชื่อมต่ออยู่ถูกถอดออก

ฉันคิดว่าการเพิ่มudevกฎที่ทำงานnotify-sendในการลบในกรณีที่ไดรฟ์ยังคงติดตั้ง ฉันจะทราบได้อย่างไรว่าไดรฟ์ USB ถูกเมาท์เมื่อทำการถอดออกหรือไม่?


ดังนั้นคุณจึงบอกว่าเปิดใช้งานการติดตั้งอัตโนมัติ แต่คุณถามว่า "ฉันจะทราบได้อย่างไรว่า usb ที่ใช้กฎ udev ติดตั้งอยู่หรือไม่" . ตอนนี้ฉันคิดว่าคุณหมายถึงคุณจำเป็นต้องกำหนดสถานะของ USB เมื่อทำการถอด - ติดตั้งหรือถอดออก โดยส่วนตัวฉันจะใช้วิธีนี้กับสคริปต์เริ่มต้นที่เพียงแค่ตรวจสอบเวลาการติดตั้ง / ถอนการต่อเชื่อมของ usb ด้วยdf -a | grep 'sd[b-z]' คำสั่ง กฎ udev สามารถส่งวันที่ลบออกไปยังบันทึกของบางประเภท หากเวลาของการลบที่สคริปต์กำหนดให้ตรงกับกฎของ udev (อย่างน้อยเป็นนาทีโดยที่วินาทีอาจมีความล่าช้า) แสดงว่ายูเอสบีไม่ได้ถูกเชื่อมต่อ
Sergiy Kolodyazhnyy

2
ที่นี่ยังเป็นสคริปต์ที่ฉันเขียนเพื่อวัตถุประสงค์ในการเข้าสู่ระบบ paste.ubuntu.com/11748191 หากคุณชอบความคิดนี้ฉันสามารถโพสต์สิ่งนี้เป็นคำตอบได้ แต่โดยส่วนตัวฉันพิจารณาข้อเสนอแนะทั้งสองนี้มากกว่าเป็นวิธีแก้ปัญหาการทำงาน
Sergiy Kolodyazhnyy

คำตอบ:


4

ฉันชอบวิธีการของ Fabby แต่เป็นการดีที่จะสอนผู้คนเกี่ยวกับนิสัยที่ไม่ดีนี้ (พวกเขาไม่ได้ทำงานตลอดเวลาบนเครื่องควบคุม) นี้จะคล้ายกับคุณลักษณะ OSX ตามที่อธิบายไว้ที่นี่

มีความแตกต่างเล็ก ๆ น้อย ๆ ที่คุณอาจใช้เพื่อทราบว่าปลอดภัยหรือไม่:

  • ตัวแปร udev ID_PART_TABLE_TYPE=dosถูกตั้งค่าสำหรับsdxดิสก์โหนด ( ไม่ใช่พาร์ติชันโหนด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
    

อีกวิธีหนึ่งคุณอาจใช้สคริปต์ (หลาม) ที่เชื่อมต่อกับudisksDBUS มันมีข้อมูลที่จำเป็นทั้งหมดที่คุณต้องการเกี่ยวกับพาร์ทิชันเมานท์ / unmount ดิสก์ปลั๊ก / ถอดปลั๊ก ...

การอ้างอิง / ที่มา: Gentoo Wiki: Udisks - USB_Thumb_Drive_Example


1
ในขณะที่ฉันชอบแนวทางของ Fabby นี่คือสิ่งที่ฉันกำลังมองหา! ตอนนี้ฉันวางแผนที่จะเขียนสคริปต์ไพ ธ อนซึ่งคอยฟังudisksเหตุการณ์บน DBUS แล้วจัดการกับการแสดงข้อความโต้ตอบ ฯลฯ
RenWal

8

น่าเสียดายที่ Micro $ oft นั้นค่อนข้างถูกต้อง: การลบ USB ... และคุณจะยังคงมีปัญหานี้อยู่จนกระทั่งคุณ:

  1. ปิดใช้งานการติดตั้งอัตโนมัติ

    หากผู้ใช้ต้องติดตั้งด้วยตนเองมันจะง่ายขึ้นในการฝึกให้พวกเขาลงจากหลังม้าเช่นกัน

  2. สร้างกฎ udev ที่ปิดการแคชทั้งหมดในดิสก์ USB ...


2
+1 - การปิดใช้งานแคชช่วยลดปัญหา ตราบใดที่พวกเขาไม่ได้ถอดปลั๊กอุปกรณ์ในระหว่างการเขียน (ซึ่งมักจะทำให้ไฟ LED บนอุปกรณ์สว่างขึ้น / แฟลช) พวกเขาจะไม่เป็นไร
Nathan Osman

โอเคนั่นใช้งานได้ดีทางด้านคอมพิวเตอร์ แต่ไม่ได้ปิดการใช้งานแคชหรือการตั้งค่าสถานะการซิงค์บนเมานท์ทำให้แฟลชชิปหมดเร็ว? ไดรฟ์ USB เหล่านั้นเป็น VFAT ทั้งหมดและฉันได้ยินมาว่า Linux ค่อนข้างก้าวร้าวในการอัปเดตตาราง FAT ซึ่งเป็นส่วนที่มีตารางอยู่
RenWal

ฉันเพิ่งซื้อSLC sticks และยังไม่เคยตายกับฉันเลยโดยไม่คำนึงถึงระบบไฟล์ ... (และฉันมีเพียง 2)
Fabby

@RenWal: เนื่องจากคุณไม่เคยยอมรับคำตอบในเว็บไซต์นี้: อย่าลืมคลิกสีเทา☑ทางด้านซ้ายของข้อความนี้ซึ่งหมายความว่าใช่คำตอบนี้ถูกต้อง!
Fabby

1
FWIW, Windows ปิดใช้งานการเขียนแคชบนไดรฟ์ USB ที่จัดรูปแบบ FAT เป็นค่าเริ่มต้นด้วยเหตุผลเดียวกันดังนั้นฉันเดาว่าการสึกหรอพิเศษใด ๆ บนไดรฟ์ถูกมองว่าเป็นความชั่วร้ายที่น้อยลง
thomasrutter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.