どのプロセスがカメラを使用しているかを確認するのに "lsof /dev/video0"が十分ではないのはなぜですか?

どのプロセスがカメラを使用しているかを確認するのに "lsof /dev/video0"が十分ではないのはなぜですか?

質問5年前、このコマンドについては、lsofカムを使用してすべてのプロセスを監視するわけではないと主張しました。ただし、testcamの実行中にコマンドを実行すると、次のような結果が表示されます。

COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
firefox-b 3077  lax  mem    CHR   81,0           808 /dev/video0
firefox-b 3077  lax  143u   CHR   81,0      0t0  808 /dev/video0

どういう意味ですかDEVICE 81,0?ブロック81,0が表示されているのに、なぜ監視されないのか分かりません。

答え1

lsof /dev/video0開いているプロセスのみが一覧/dev/video0表示されます。管理者が次のコマンドを実行すると仮定します。

mknod /somewhere/else c 81 0

その後、プログラムはデバイスファイルを介してカメラデバイスを使用できます/somewhere/else。このアクセスは表示されませんが、表示されlsof /dev/video0ている場合は使用できませんlsof /somewhere/else

ルートのみデバイスノードを作成できます。一般的なシステムでは、/dev/video0これはWebカメラ用の唯一のデバイスファイルです。だから実際、lsof /dev/video0Webカメラにアクセスするすべてのプロセスが実際に一覧表示されます。

答え2

DEVICE 81,0ブロックをまったく参照しません。このブロックとともにTYPE CHR使用すると、そのデバイスがメジャー番号81とマイナー番号0の文字デバイスであることを示します。

では、/proc/devices文字デバイスのメジャー番号81がサブシステムに関連付けられていることがわかりますvideo4linux。マイナー番号は、適切であると判断されるように各サブシステムによって割り当てられます。この場合、マイナー番号は/dev/video0生成されたデバイス名に直接反映されますudev

伝統的に、UNIXシリーズシステムでは、人に馴染みのあるデバイス名ではなく、機械に優しいデバイス番号をデバイスのデフォルトの内部識別子として使用していました。フル/devディレクトリツリーとそのデバイスノードは、デフォルトでカーネルのファイルシステムドライバがデバイス名をデバイス番号に変換できるようにする1つの大きなルックアップテーブルです。まるでファイル内のポート番号(またはなど)の代わりに/etc/servicesポート名を使用できるのと同じです。それぞれ22または123などのデバイスノードには権限があり、デバイスドライバへの不適切なアクセスを制限するのにも役立ちます。sshntp

一般ユーザーとして実行すると、lsof自分のプロセスに関する情報のみを出力できます。一般ユーザーは他のユーザーのビジネスを垣間見ることはできません。他のユーザーのプロセスが何をしているかを見るには、root権限が必要です。

関連情報