Linux は、デバイスノードと呼ばれる特別なファイルシステムオブジェクトを通じて、多くのカーネルデバイスインターフェースを公開します。通常は /dev 以下にあり、便利なシンボリックリンクや通信エンドポイントも同じ場所に置かれます。デバイスノードを開くと、通常ファイルに保存されたバイト列ではなく、カーネルドライバーへアプリケーションが接続されます。
デバイス · レッスン 1
/dev ディレクトリ
Linux が `/dev` 以下のノードを通じて、デバイスインターフェースと疑似デバイスを公開する仕組みを学びます。
`/dev` を調べる
デバイスを参照解除したり読み取ったりせず、ディレクトリを一覧表示します。
$ ls -l /dev
項目は、物理ストレージ、端末、入力インターフェース、論理デバイス、カーネルが提供する疑似デバイスなどを表します。すべてのハードウェア部品にユーザーから見える専用ノードが必要なわけではなく、一つのデバイスが複数のリンクやインターフェースで表される場合もあります。
長形式一覧の先頭文字は、ファイルシステムオブジェクトの種類を示します。キャラクターデバイスノードは c、ブロックデバイスノードは b です。これらの種類とメジャー番号、マイナー番号は後のレッスンで扱います。
プログラムが /dev 以下のデバイスノードを開くと、何が起こりますか?
疑似デバイス
物理ハードウェアに対応せず、カーネルサービスを提供するノードもあります。/dev/null は書き込まれたデータを受け取り、破棄します。
$ command > /dev/null
よく使うほかの例には、ゼロのバイト列を生成する /dev/zero や、カーネルの乱数サブシステムを通じてランダムなバイト列を提供する /dev/urandom があります。それぞれ固有の動作を持つため、ファイル名だけから挙動を推測してはいけません。
/dev/null は書き込まれたデータをどうしますか?
動的なデバイス管理
現代の Linux システムでは、カーネルが支える devtmpfs が、デバイスの出現に応じて基本的なデバイスノードを作成できます。udev などのユーザー空間デバイスマネージャーはイベントを処理し、権限と所有者を適用し、便利なシンボリックリンクやポリシーに基づく名前を作成します。正確な役割分担はシステムによって異なります。
/dev/disk/by-id/ や /dev/disk/by-uuid/ 以下のような安定したリンクは、ハードウェア構成や検出順によって変わり得る /dev/sda のような検出順依存の名前より、設定で安全に使える場合があります。
設定で /dev/sda より /dev/disk/by-id/... を選ぶ利点は何ですか?
安全に操作する
標準ツールでデバイスノードを開けるからといって、任意の読み書きが安全とは限りません。読み取りによって機密性の高い入力やストレージが露出する場合があり、ディスク、端末、ファームウェアのインターフェースへ書き込むと、データの破損やユーザーへの妨害を引き起こす可能性があります。そのため、デバイスノードへのアクセスは、権限、グループ、ACL、ケーパビリティ、サービスによる仲介で制限されます。
まず読み取り専用の検出ツールを使い、正確なノードとデバイス識別情報を確認してから、デバイス固有の文書に従ってください。大切なシステムで、未知の /dev 項目へデータをリダイレクトして実験してはいけません。
未知のデバイスノードへ任意のデータを書き込むべきでないのはなぜですか?
管理された環境で読み取り専用の調査を行うには、Linux でハードウェアデバイスを調査するを利用してください。
レッスン完了
/dev ディレクトリ を完了しました
/dev を、カーネルに接続された稼働中のインターフェース群として説明できるようになりました。
デバイスノードと通常ファイルを区別する。
/dev/nullなどの疑似デバイスを認識する。動的なノードと永続リンクをデバイス管理に関連付ける。
デバイスへの直接アクセスはインターフェース固有であり、破壊的になり得ると理解する。