🐧 Linux 総合学習プラットフォーム
OS内部/起動の仕組み ・ 上級

/sys 疑似ファイルシステム

/sys はカーネルが認識しているデバイスやドライバ、バスの構造を階層的に公開する疑似ファイルシステムです。/proc が主にプロセスやシステム全体の情報を扱うのに対し、/sys はハードウェアとカーネルオブジェクトの関係を整理して見せます。ブロックデバイスの一覧は /sys/block 以下、各種ハードウェア属性は /sys/devices 以下にあり、項目によっては値を書き込んで挙動を変えられるものもあります。lsblk のようなツールも、内部ではこの /sys の情報を読み取って表示を組み立てています。

/proc がカーネルやプロセスの「状態」をのぞく窓だとすれば、いまつながっているハードウェアの「構造」を見せてくれるのが /sys だ。カーネルが認識しているハードウェアやドライバの関係性を、整理して見せてくれる窓である。

これも /proc と同じく、ディスク上に実体を持たない疑似ファイルシステムで、sysfs と呼ばれる。

💡
ポイント/proc はプロセスやシステムの「状態」、/sys はデバイス・ドライバ・バスの「構造」を見せる。役割が分かれている。

Linuxカーネルは、デバイス・ドライバ・バスといった内部オブジェクトを kobject という統一的な仕組みで管理している。その関係性を階層的なディレクトリツリーとして外から見えるようにしたものが /sys だ。

なぜこんな窓がわざわざ用意されたのか。歴史的には、procfs にハードウェア情報まで雑多に詰め込まれて見通しが悪くなった反省から、デバイス周りを整理して受け持つ場所として sysfs が後発で導入された、という経緯がある。

2.6系のカーネルで本格的に整備され、それ以降のデバイス管理の土台になっている、比較的新しめの仕組みだ。

🧭 同じデバイスを複数の切り口からたどる

/sys の直下には、見る切り口の違ういくつかのディレクトリが用意されている。

中心となるのが /sys/devices で、ここにシステム上のすべてのデバイスが、実際の接続トポロジ(どのバスにぶら下がっているか)に沿った階層で並ぶ。

同じデバイス/sys/devices接続順(物理)/sys/blockディスク類/sys/class役割別(net等)/sys/busバス別(pci等)1つのデバイスを4つの切り口からたどれる

/sys/block には、sda や nvme0n1 といったブロックデバイス(ディスク類)が、/sys/class にはデバイスを役割ごとに分類した一覧(ネットワークインタフェースなら net、電源なら power_supply、など)が置かれる。/sys/bus にはバスの種類別(pci、usb など)に、そこに接続されたデバイスとドライバが整理されている。

🔗
たとえ同じ1冊の本を、著者別・ジャンル別・出版社別の3つの棚から探せる図書館のようなものだ。実体は1つ、入り口が複数ある。

おもしろいのは、同じ1つのデバイスを複数の切り口からたどれる点だ。devices では物理的な接続順で、class では役割別で、bus ではバス別で、とシンボリックリンクでたどれるようになっている。この多面性こそ sysfs の特徴である。

📄 小さなファイルを読み、書いて動かす

/sys の各デバイスのディレクトリの中には、そのデバイスの性質を表す小さなファイル(属性ファイル)がたくさんある。たいていは1つのファイルに1つの値が入っており、cat で読める。

ネットワークインタフェースのMACアドレスは /sys/class/net/eth0/address、リンク状態は /sys/class/net/eth0/operstate を読むと分かる。

たとえばネットワークインタフェースの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を点けたりセンサーを読んだりする手法が古くから使われてきた。

組込み開発では、GPIO(汎用入出力ピン)を /sys 経由で操作してLEDを点けたりセンサーを読んだりする手法が古くから使われてきた(現在はより新しいインタフェースへの移行も進んでいる)。

読むだけなら一般ユーザでもできるが、書き込みには多くの場合管理者権限が必要になる点も押さえておきたい。

🗂 /proc と /sys の住み分け

ここで両者を整理しておく。ざっくり言えば、/proc(procfs)はプロセスやシステム全体の状態を、/sys(sysfs)はデバイス・ドライバ・バスといったカーネルオブジェクトの構造を担当する。

💡
ポイントCPUの種類・メモリ量・稼働プロセスを見たいなら /proc、どんなデバイスがどのバスにつながりドライバが何かを見たいなら /sys。

CPUの種類やメモリ量、稼働中のプロセスを見たいなら /proc、いまどんなデバイスがどのバスにつながっていてドライバが何かを見たいなら /sys、と覚えておくと迷わない。

もっとも、両者は厳密に排他というわけではない。CPUに関する情報は /proc/cpuinfo にも /sys/devices/system/cpu/ 以下にもあるなど、重なる部分もある。

重要なのは、設計思想として「プロセス系は proc、デバイス系は sys」という住み分けがある、という点だ。

⚠ つないだ機器が認識されないとき

よくある誤解は、/sys に並ぶファイルをテキストエディタで開いて自由に書き換えられる設定ファイルのように扱ってしまうことだ。

つまずき/sys の属性は即座にハードウェアへ反映され(再起動で消える)、不適切な値は機器を不安定にすることもある。意味を理解せず変えない。

これらはカーネルが動的に提供するインタフェースであり、書き込みは即座にハードウェアの挙動に反映される(そして再起動で消える)ものが多いので、設定の永続化とは性質が異なる。また、書き込み可能な属性であっても、不適切な値を入れると機器が不安定になることもあるため、意味を理解せずに値を変えるのは避けるべきだ。

実務では、デバイスがカーネルに正しく認識されているかの確認、組込み機器でのハードウェア制御、ネットワークインタフェースのリンク状態の確認などで重宝する。

普段使う lsblk や lspci といったコマンドも、内部ではこの /sys の情報を読み取って人間に分かりやすい形に整えて表示している。だから lsblk の結果が腑に落ちないときに /sys/block を直接たどってみる、といった一段深い調査の入り口にもなる。

とくに新しい周辺機器をつないだのに認識されない、というような場面では、/sys 以下にそのデバイスのディレクトリが現れているかどうかを確かめることが、カーネルがそもそも機器を見つけているのかを判断する手がかりになる。

組込みのように専用ツールが乏しい環境ほど、この「カーネルが見せてくれる構造を直接たどる」力が効いてくる。

この項目に出てくる用語

sysfs (/sys)しすえふえす
カーネルが認識するデバイスやドライバの構造を階層的に公開する疑似ファイルシステム。
カーネルかーねる
OSの中核。ハードウェアとソフトウェアの間に立ち、メモリ・プロセス・デバイスを管理する。

関連コマンド

lsblkcat

▶ 学習アプリでこの続きを学ぶ・演習する