ユーザーがUSBサムドライブを安全に取り外したときに警告する


13

ユーザーは、アンマウントせずにUSBサムドライブを取り外した後、USBサムドライブ上のデータの損失について繰り返し不満を述べます。マシンでUbuntu 14.04 LTSを実行します。自動マウントが有効になっています。

プラグを抜く前に安全な取り外しを行うことを覚えているのにうんざりしているので、マウントされたUSBドライブが抜かれたときにUbuntuにアラートを表示させたいと思います。

ドライブがまだマウントされている場合、削除時にudev実行notify-sendされるルールを追加することを考えました。USBドライブが取り外されたときにマウントされたかどうかを確認するにはどうすればよいですか?


自動マウントが有効になっているとおっしゃいましたが、「udevルールを実行したusbがマウントされたかどうかを確認するにはどうすればよいですか?」。今、私はあなたが削除時にUSBの状態を決定する必要があることを意味すると思う-マウントまたはアンマウント。私は、df -a | grep 'sd[b-z]' コマンドを使用してusbのマウント/アンマウント時間を監視するだけのスタートアップスクリプトを使用して、個人的にこれにアプローチします。udevルールは、削除日を何らかのログに送信できます。スクリプトによって指定された削除の時間がudevルールの削除の時間と一致する場合(少なくとも数分、秒が遅延する可能性がある場合)、USBはマウントされませんでした。
セルギーKolodyazhnyy

2
また、ロギング用に作成したスクリプトもあります。paste.ubuntu.com/11748191 あなたはこのアイデアのように、私は答えとしてこれを投稿することができますが、私は個人的にはむしろ作業溶液よりも、これらの2つのコメントの提案を検討している場合
Sergiy Kolodyazhnyy

回答:


4

私はFabbyのアプローチが好きですが、この悪い習慣について人々に教えることは良いことです(彼らは常に制御されたマシンで動作していません)。これは、ここで説明するOSX機能に似ています

安全な削除であるかどうかを知るために使用できる小さな違いがあります。

  • 安全でない削除でID_PART_TABLE_TYPE=dosは、udev変数が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に接続するスクリプト(python)を使用できます。パーティションのマウント/アンマウント、ディスクのプラグ/アンプラグについて必要な情報がすべて揃っています...

リファレンス/ソース: Gentoo Wiki:Udisks-USB_Thumb_Drive_Example


1
Fabbyのアプローチは好きですが、これが私が探していたものです!現在udisks
DBUS

8

残念ながら、それはMicro $ oftが実際に非常に正しいことです。USBの取り外し...そして、あなたがこの問題を抱え続けるのはあなたまでです:

  1. 自動マウントを無効にする

    ユーザーが手動でマウントする必要がある場合、マウント解除するようにトレーニングする方が簡単です。

  2. USBディスク上のすべてのキャッシュをオフにするudevルールを作成します ...


2
+1-キャッシュを無効にすると、問題を軽減できます。書き込み中にデバイスのプラグを抜かない限り(通常はデバイスのLEDが点灯/点滅します)、大丈夫です。
ネイサンオスマン

さて、それはコンピュータ側でうまくいくでしょう。しかし、キャッシュを無効にしたり、マウント時に同期フラグを設定したりすると、フラッシュチップはすぐに焼き切れませんか?これらのUSBドライブはすべてVFATであり、LinuxはFATテーブルの更新に非常に積極的であると聞きました-テーブルを含むセクターを摩耗させます。
-RenWal

SLCスティックのみを購入し、ファイルシステムに関係なく、まだダイを使用していません...(そして、2つしかありません)
-Fabby

@RenWal:このサイトで回答を受け入れたことがないので、このテキストの左側にある灰色のclickをクリックすることを忘れないでください。つまり、この回答は有効です。
ファビー

1
FWIW、Windowsは、同じ理由で、デフォルトでFATフォーマットのUSBドライブの書き込みキャッシュを無効にします。そのため、ドライブの余分な摩耗は、より小さな悪とみなされたと思います。
-thomasrutter
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.