キーを含むUSBスティックを挿入したときに自動的にマウントしたい暗号化されたパーティションがあり、スティックが取り外されたときにそれをアンマウント(およびマッパーを閉じる)したいと思います。 UbuntuKarmicを使用しています。
TrueCryptでこれを試みるプロジェクトがいくつかあるようです(たとえば、 http://sourceforge.net/projects/tc-wrapper/ )が、dmcrypt/LUKSに基づくものはありません。だから私はudevルールを書いて運試しをしようと思いました。多くの苛立たしい時間の後、私はこれを思いついた:
ACTION=="add", SUBSYSTEM=="block", ATTRS{model}=="Flash Disk", ATTRS{vendor}=="USB2.0", RUN+="/home/michael/trigger-mount.sh encrypted"
ACTION=="remove", SUBSYSTEM=="block", ENV{ID_VENDOR_ID}=="0204", ENV{ID_MODEL_ID}=="6025", RUN+="/home/michael/trigger-mount.sh encrypted"
それは機能しますが、いいことではありません。ここでの問題は、最初のルールが削除時に一致せず、2番目のルールが追加時に一致しないことです。
udevadm monitor --property
はこれを示しています(そして「追加」でもほとんど同じです)。
UDEV [1264556064.762870] remove /devices/pci0000:00/0000:00:02.0/usb2/2-4/2-4:1.0/Host47/target47:0:0/47:0:0:0/block/sde (block)
UDEV_LOG=3
ACTION=remove
DEVPATH=/devices/pci0000:00/0000:00:02.0/usb2/2-4/2-4:1.0/Host47/target47:0:0/47:0:0:0/block/sde
SUBSYSTEM=block
DEVNAME=/dev/sde
DEVTYPE=disk
SEQNUM=3512
ID_VENDOR=USB2.0
ID_VENDOR_ENC=USB2.0\x20\x20
ID_VENDOR_ID=0204
ID_MODEL=Flash_Disk
ID_MODEL_ENC=Flash\x20Disk\x20\x20\x20\x20\x20\x20
ID_MODEL_ID=6025
ID_REVISION=2.00
ID_SERIAL=USB2.0_Flash_Disk-0:0
ID_TYPE=disk
ID_INSTANCE=0:0
ID_BUS=usb
ID_USB_INTERFACES=:080650:
ID_USB_INTERFACE_NUM=00
ID_USB_DRIVER=usb-storage
ID_PATH=pci-0000:00:02.0-usb-0:4:1.0-scsi-0:0:0:0
DKD_MEDIA_AVAILABLE=1
DKD_PRESENTATION_NOPOLICY=0
MAJOR=8
MINOR=64
DEVLINKS=/dev/block/8:64 /dev/disk/by-id/usb-USB2.0_Flash_Disk-0:0 /dev/disk/by-path/pci-0000:00:02.0-usb-0:4:1.0-scsi-0:0:0:0
これには、両方の場合(追加、削除)の両方のルールに一致するために必要なすべてのデータが含まれているようです。
完全を期すために、ここにudevadm info -a -p /sys/block/sde/
の出力があります。
looking at device '/devices/pci0000:00/0000:00:02.0/usb2/2-4/2-4:1.0/Host48/target48:0:0/48:0:0:0/block/sde':
KERNEL=="sde"
SUBSYSTEM=="block"
DRIVER==""
ATTR{range}=="16"
ATTR{ext_range}=="256"
ATTR{removable}=="1"
ATTR{ro}=="0"
ATTR{size}=="512000"
ATTR{alignment_offset}=="0"
ATTR{capability}=="53"
ATTR{stat}==" 16 47 504 510 0 0 0 0 0 380 510"
looking at parent device '/devices/pci0000:00/0000:00:02.0/usb2/2-4/2-4:1.0/Host48/target48:0:0/48:0:0:0':
KERNELS=="48:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{device_blocked}=="0"
ATTRS{type}=="0"
ATTRS{scsi_level}=="3"
ATTRS{vendor}=="USB2.0 "
ATTRS{model}=="Flash Disk "
ATTRS{rev}=="2.00"
ATTRS{state}=="running"
ATTRS{timeout}=="30"
ATTRS{iocounterbits}=="32"
ATTRS{iorequest_cnt}=="0x41"
ATTRS{iodone_cnt}=="0x41"
ATTRS{ioerr_cnt}=="0x0"
ATTRS{modalias}=="scsi:t-0x00"
ATTRS{evt_media_change}=="0"
ATTRS{queue_depth}=="1"
ATTRS{queue_type}=="none"
ATTRS{max_sectors}=="240"
....
誰かがこれに光を当てることができますか?
以前の回答 ;でudevをオートマウンターとして使用する方法についていくつかの情報を書きました。それ(またはそれがリンクしているリソース)はあなたにいくらかの光を当てるかもしれません。
あなたの質問が正確に何であるかは私にはわかりません
個別の追加と削除のルールについて: [〜#〜] action [〜#〜] 一致を削除すると、それらを統合できる可能性がありますが、これにより、ルールが頻繁に実行される可能性があります。各ルールを明示的に一致させる方が良いと思います。または、さらに良いことに(以下のnmountセクションで説明されている理由により)、"remove"ルールを完全に削除します。
Devルールの [〜#〜] run [〜#〜] アクションについて: [〜#〜] run [ 〜#〜] uDevルールのアクションを完了する必要がありますすばやく。リンクした例を見てください。 twoスクリプトがあることがわかります--uDevは一方を呼び出し、もう一方をスピンオフして実際のマウントを実行し、最初のスクリプトが処理制御をuDevにタイムリーに戻すことを可能にします。すでにこれを行っている場合は、すばらしいです。そうでない場合は、同様の方法でスクリプトを微調整することを検討してください。
アンマウントについて:デバイスの取り外し時に自動的にアンマウントするのに多くの問題が発生し、最終的にnot"remove"ルールを使用することにしました。すべて。代わりに、"remove"ルールを置き換える別のアンマウンタースクリプトを作成しました。
これは、デバイスを物理的に取り外す前に、デバイスを閉じるのに必要なだけの時間をOSに与える必要があるためです。ファイルシステムを読み取り専用でマウントした場合、ドライブをヤンクすることは1つのことですが、完全な読み取り/書き込みファイルシステムは、可能な限りクリーンにマウント解除する必要があります。 (これは、Windowsの[ドライブを安全に削除する]オプションが行うことです。これは、ドライブをアンマウントするためのメカニズムですbeforeデバイスがシステムから物理的に削除されます。)
通常のファイルシステムでは、マウント時にsync
オプションを使用し、アンマウント時にumount -l
(レイジーアンマウント)を使用することで、いくつかのアンマウントを「適切に」機能させることができました。レイジーアンマウントは、ファイルシステムをすぐにデタッチするようにカーネルに指示しますが、ファイルシステムへの参照を後でビジー状態でなくなったときにクリーンアップします。この種の機能はありますが、完全なアンマウントを実行するほどデータの安全性は高くありませんbeforeデバイスを削除します。
同じ理由で、暗号化されたファイルシステムでレイジーアンマウントを機能させるのに問題があるかもしれません。デバイスマッパーは、標準のファイルシステムの問題に加えて、さらに複雑なレイヤーを追加します。これにより、暗号化されたファイルシステムが汚れたマウント解除に対してさらに敏感になるように思われます。 (ただし、暗号化されたFSの経験はあまりないので、許容できる可能性があります。)
うまくいけば、それはあなたにいくつかの指針を与えるでしょう。率直に言って、自動マウントの目的では、uDevは機能しますが、理想的ではありません。 HalEvtデーモン または新しいDeviceKitの方がおそらく適切でしょう。