/sys 疑似ファイルシステム
/sys はカーネルが認識しているデバイスやドライバ、バスの構造を階層的に公開する疑似ファイルシステムです。/proc が主にプロセスやシステム全体の情報を扱うのに対し、/sys はハードウェアとカーネルオブジェクトの関係を整理して見せます。ブロックデバイスの一覧は /sys/block 以下、各種ハードウェア属性は /sys/devices 以下にあり、項目によっては値を書き込んで挙動を変えられるものもあります。lsblk のようなツールも、内部ではこの /sys の情報を読み取って表示を組み立てています。
/proc がカーネルやプロセスの『状態』をのぞく窓だとすれば、/sys はカーネルが認識しているハードウェアやドライバの『構造』を整理して見せてくれる窓です。これも /proc と同じく、ディスク上に実体を持たない疑似ファイルシステムで、sysfs と呼ばれます。Linuxカーネルは、デバイス・ドライバ・バスといった内部オブジェクトを kobject という統一的な仕組みで管理していて、その関係性を階層的なディレクトリツリーとして外から見えるようにしたものが /sys です。歴史的には、procfs にハードウェア情報まで雑多に詰め込まれて見通しが悪くなった反省から、デバイス周りを整理して受け持つ場所として sysfs が後発で導入された、という経緯があります。2.6系のカーネルで本格的に整備され、それ以降のデバイス管理の土台になっている、比較的新しめの仕組みです。
/sys のおもなディレクトリ構成
/sys の直下には、見る切り口の違ういくつかのディレクトリが用意されています。中心となるのが /sys/devices で、ここにシステム上のすべてのデバイスが、実際の接続トポロジ(どのバスにぶら下がっているか)に沿った階層で並びます。/sys/block には、sda や nvme0n1 といったブロックデバイス(ディスク類)が、/sys/class にはデバイスを役割ごとに分類した一覧(ネットワークインタフェースなら net、電源なら power_supply、など)が置かれます。/sys/bus にはバスの種類別(pci、usb など)に、そこに接続されたデバイスとドライバが整理されています。同じ1つのデバイスが、devices では物理的な接続順で、class では役割別で、bus ではバス別で、と複数の切り口からシンボリックリンクでたどれるようになっているのが sysfs の特徴です。
属性ファイルを読む — そして一部は書ける
/sys の各デバイスのディレクトリの中には、そのデバイスの性質を表す小さなファイル(属性ファイル)がたくさんあります。たいていは1つのファイルに1つの値が入っており、cat で読めます。たとえばネットワークインタフェースのMACアドレスは /sys/class/net/eth0/address を、リンク状態(接続されているか)は /sys/class/net/eth0/operstate を読むと分かります。ブロックデバイスなら、ディスクのサイズ(512バイト単位のセクタ数)が /sys/block/sda/size に、回転ディスクかSSDかの区別が /sys/block/sda/queue/rotational に入っている、といった具合です。sysfs が procfs と大きく違うのは、これらの属性に書き込んで、その場でハードウェアやドライバの挙動を変えられるものがある点です。たとえば一部のシステムでは、画面の明るさを /sys/class/backlight/.../brightness に数値を書き込んで調整したり、CPUの動作モードを /sys/devices/system/cpu/.../cpufreq 以下の属性で切り替えたりできます。組込み開発では、GPIO(汎用入出力ピン)を /sys 経由で操作してLEDを点けたりセンサーを読んだりする手法が古くから使われてきました(現在はより新しいインタフェースへの移行も進んでいます)。読むだけなら一般ユーザでもできますが、書き込みには多くの場合管理者権限が必要になる点も押さえておきましょう。
/proc と /sys の役割分担
ここで両者を整理しておきましょう。ざっくり言えば、/proc(procfs)はプロセスやシステム全体の状態を、/sys(sysfs)はデバイス・ドライバ・バスといったカーネルオブジェクトの構造を担当します。CPUの種類やメモリ量、稼働中のプロセスを見たいなら /proc、いまどんなデバイスがどのバスにつながっていてドライバが何かを見たいなら /sys、と覚えておくと迷いません。もっとも、両者は厳密に排他というわけではなく、CPUに関する情報は /proc/cpuinfo にも /sys/devices/system/cpu/ 以下にもあるなど、重なる部分もあります。重要なのは、設計思想として『プロセス系は proc、デバイス系は sys』という住み分けがある、という点です。
よくある誤解と実務の使いどころ
よくある誤解は、/sys に並ぶファイルをテキストエディタで開いて自由に書き換えられる設定ファイルのように扱ってしまうことです。これらはカーネルが動的に提供するインタフェースであり、書き込みは即座にハードウェアの挙動に反映される(そして再起動で消える)ものが多いので、設定の永続化とは性質が異なります。また、書き込み可能な属性であっても、不適切な値を入れると機器が不安定になることもあるため、意味を理解せずに値を変えるのは避けるべきです。実務では、デバイスがカーネルに正しく認識されているかの確認、組込み機器でのハードウェア制御、ネットワークインタフェースのリンク状態の確認などで重宝します。普段使う lsblk や lspci といったコマンドも、内部ではこの /sys の情報を読み取って人間に分かりやすい形に整えて表示しているので、lsblk の結果が腑に落ちないときに /sys/block を直接たどってみる、といった一段深い調査の入り口にもなります。とくに新しい周辺機器をつないだのに認識されない、というような場面では、/sys 以下にそのデバイスのディレクトリが現れているかどうかを確かめることが、カーネルがそもそも機器を見つけているのかを判断する手がかりになります。組込みのように専用ツールが乏しい環境ほど、この『カーネルが見せてくれる構造を直接たどる』力が効いてきます。