USB 썸 드라이브를 안전하게 분리 할 때 사용자에게 경고


13

사용자는 USB 썸 드라이브를 마운트 해제하지 않고 플러그를 뽑은 후 데이터 손실에 대해 반복적으로 불평합니다. 머신에서 우분투 14.04 LTS를 실행합니다. 자동 마운팅이 활성화되었습니다.

플러그를 뽑기 전에 안전하게 제거하는 것을 기억하는 데 지쳤으므로 마운트 된 USB 드라이브를 뽑을 때마다 Ubuntu에 경고 메시지를 표시하고 싶습니다.

드라이브가 여전히 마운트되어있는 경우 제거시 udev실행 되는 규칙을 추가하려고 생각했습니다 notify-send. 제거 할 때 USB 드라이브가 마운트되었는지 어떻게 알 수 있습니까?


그래서 당신은 자동 마운트가 가능하다고 말했지만 "udev 규칙을 실행 한 USB가 마운트되었는지 어떻게 알 수 있습니까?" . 이제 제거 할 때 USB 마운트 상태 또는 마운트 해제 상태를 결정해야한다고 생각합니다. 나는 개인적으로 df -a | grep 'sd[b-z]' 명령으로 usb의 마운트 / 마운트 해제 시간을 모니터링하는 시작 스크립트를 사용하여 이것에 접근합니다 . udev 규칙은 제거 날짜를 일종의 로그로 보낼 수 있습니다. 스크립트가 제공 한 제거 시간이 udev 규칙의 시간과 일치하면 (최소 몇 분, 지연 시간이있을 수 있음) USB가 마운트되지 않았습니다.
Sergiy Kolodyazhnyy 2016 년

2
로깅 목적으로 작성한 스크립트도 있습니다. paste.ubuntu.com/11748191는 이 생각처럼 당신은 내가 대답으로이를 게시 할 수 있다면,하지만 난 개인적으로이 두 가지 의견을 제안보다는 작업 솔루션을 고려
세르지 Kolodyazhnyy

답변:


4

나는 Fabby의 접근 방식이 마음에 들지만 사람들에게이 나쁜 습관에 대해 가르치는 것이 좋습니다 (제어 기계에서 항상 작동하지는 않습니다). 여기에 설명 된대로 OSX 기능과 유사합니다 .

안전한 제거인지 알기 위해 사용할 수있는 약간의 차이가 있습니다.

  • 안전하지 않은 제거에서 디스크 노드 ( NOT partition node )에 udev 변수 ID_PART_TABLE_TYPE=dos가 설정되었습니다 .sdxsdxY

  • 안전하게 제거되지 않은 곳

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 규칙 만들기 (change 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)를 사용할 수 있습니다 . 파티션 마운트 / 마운트 해제, 디스크 플러그 / 플러그 분리에 필요한 모든 정보가 있습니다 ...

참조 / 출처 : 젠투 위키 : Udisk-USB_Thumb_Drive_Example


1
Fabby의 접근 방식이 마음에 들지만 이것이 내가 찾던 것입니다! 이제 udisksDBUS 에서 이벤트 를 수신 한 다음 메시지 대화 상자 표시 등을 처리 하는 Python 스크립트를 작성할 계획입니다 .
RenWal

8

불행히도, 그것은 Micro $ oft가 실제로 옳은 일입니다 : USB 제거 ... 그리고 당신은 당신이 할 때까지이 문제를 계속할 것입니다 :

  1. 자동 마운팅 비활성화

    사용자가 수동으로 마운트해야하는 경우 분리하도록 교육하는 것이 더 쉬울 것입니다.

  2. USB 디스크의 모든 캐싱을 끄는 udev 규칙 생성 ...


2
+1-캐시를 비활성화하면 문제를 줄이는 데 도움이됩니다. 쓰기 중에 장치의 플러그를 뽑지 않는 한 (일반적으로 장치의 LED가 켜지거나 깜박임) 괜찮습니다.
Nathan Osman

좋아, 그것은 컴퓨터 쪽에서 잘 작동합니다. 그러나 마운트를 해제 할 때 캐시를 비활성화하거나 동기화 플래그를 설정하면 플래시 칩이 빨리 소모되지 않습니까? 이 USB 드라이브는 모두 VFAT이며 Linux가 테이블을 포함하는 섹터를 착용하여 FAT 테이블을 업데이트하는 데 매우 공격적이라고 들었습니다.
RenWal

난 단지 구입 SLC의 스틱을 아직 관계없이 파일 시스템의 날 어떤 다이 없었어요 ... (그리고 나는 단지 2가)
Fabby

@RenWal :이 사이트에서 답변을 수락 한 적이 없습니다.이 텍스트 왼쪽의 회색 ☑을 클릭하는 것을 잊지 마십시오. 예,이 답변은 유효합니다!
Fabby

1
FWIW에서 Windows는 동일한 이유로 FAT 형식의 USB 드라이브에서 쓰기 캐시를 비활성화하므로 드라이브의 추가 마모가 덜 악한 것으로 보입니다.
thomasrutter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.