web-dev-qa-db-ja.com

Udevイベントキューへのイベントの追加

私のudevルールの1つは、USBストレージデバイスの削除時にスクリプトを実行します。このスクリプトは、一般的なクリーンアップを実行し、ストレージデバイスのマウントポイントディレクトリを削除します。問題は、このロジックをC++アプリケーションからプログラムでトリガーできるようにしたいことです(USBフラッシュドライブがホットスワップで取り外されたときではなく、手遅れになっているようです)。

これを実現する正しい方法は、udevイベントキューにイベントを直接追加することのようです。 udevadmを使用して目的のアクションを実行できますが、libudevライブラリに同等のAPIが表示されません。

udevadm trigger --action=remove --property-match=DEVNAME=/dev/sda1

Dbus経由でudevにアクセスしてこれを実現する方法はありますか?これを可能にするライブラリはありますか?これは最終的にudevがどのように機能するかではなく、udevに実行させるのではなく、アプリケーションでブロックデバイスをアンマウントしてクリーンアップする必要がありますか?

3
C. Zach Martin

探しているのは、/syssysfsファイルシステム内のuevent疑似ファイルのようです。

そのファイル("remove"など)にコマンドを書き込むことにより、カーネルはそれらをデバイスイベントのユーザースペースハンドラー(udevd)に転送します。

したがって、次のスニペットと同等の処理を実行すると(例ではシェルを使用)、/dev/sda1デバイスのudev削除を要求して必要な処理を実行できます。

# echo -n "remove" >/sys/class/block/sda1/uevent

Libudev API(たとえば、 dev_device_get_syspath(3) を使用して、特定のデバイスの正しいsysfsパスを見つけることができます。

kobject の下にカーネル側からいくつかのドキュメントがあります。

devdのmanページ の「systemd-udevdがカーネルueventsをリッスンする」など、udevのドキュメントで「uevents」についての言及も見つかります。

しかし、sysfsのuevent疑似ファイルに関するドキュメントはどこにもないようです...

1
filbranden