Sysfs

sysfsはLinuxカーネル2.6によって提供される仮想ファイルシステムである。sysfsはデバイスやドライバについての情報をカーネルモデルからユーザ空間へエクスポートし、設定のためにも使われる。BSDシステムにある sysctl機構に似ているが、分離した機構の代わりにファイルシステムとして実装されている。
歴史.
2.5開発サイクル中、バージョン2.4における以下のいくつかの欠点を修正するために、Linuxドライバモデルが導入された。
sysfsはデバイスツリーにある情報をエクスポートするように設計されており、それはもはやprocfsを散らかさないと考えられる。sysfsはPatrick Mochelによって実装された。Maneesh Soniは後に大きなシステム上におけるメモリ使用量を減らすためにsysfsの外部記憶装置パッチを書いた。
sysfsは元々ramfsに基づくインメモリのファイルシステムである。ramfsはLinux 2.4.0が安定化されていた頃に実装された。ramfsは当時新しかった VFSレイヤーを使って単純なファイルシステムを実装することがどれほど易しいのかだけを示したので、簡潔さの見本だった。単純さとVFSの使用のために、良いベースを提供し、他のインメモリベースのファイルシステムがそこから派生した。
sysfsは元々ddfs (Device Driver Filesystem) と呼ばれており、始め、実装されているとき新しいドライバモデルをデバッグするために作成された。以前はデバイスツリーをエクスポートするためにprocfsを使うことでデバッグが行われていたが、リーナス・トーバルズからの強い要請の下で、ramfsに基づく新しいファイルシステムに変えられた。新しいドライバモデルが2.5.1あたりでカーネルにマージされるときまで、少しだけより説明的になるようdriverfsに名前が変えられた。
2.5開発の次の年の間、デバイスモデルとdriverfsの下部構造機能は他のサブシステムに有用であると分かり始めた。kobjectが中心的なオブジェクト管理機構を提供するために開発され、サブシステムにとらわれないということを表すためにdriverfsはsysfsに名前が変更された。
技術的概観.
ドライバモデルツリーに追加された個々のオブジェクト（ドライバ、クラスドライバを含むデバイス）に対して、sysfs内にディレクトリが作られる。親と子の関係は（物理的な配置を反映して）/sys/devices/の下のサブディレクトリに反映される。サブディレクトリ/sys/bus/はシンボリックリンクが置かれており、どのようにデバイスが異なるバスに所属しているのかを反映している。/sys/block/がブロックデバイスを含む一方で、/sys/class/はネットワークのようなクラスによって分類されたデバイスを表している。
デバイスドライバやデバイスに対して、属性を作ることができる。これらは単純なファイルである。（重いパース処理が必要なprocfs内の一部のファイルとは異なり）それらは単一の値のみを含んだり単一の値を設定したりできるようにすべきであるということになっている。これらのファイルはデバイス個別のデバイスドライバのサブディレクトリに表れる。属性グループを使うことで、属性で満たされたサブディレクトリも作成できる。
いくつかのバス.
PCI.
PCIデバイスについての情報をエクスポートする
USB.
USBデバイスとUSBホストの両方を含む
S/390 バス.
S/390 アーキテクチャが他に見つからないデバイスを含んでいるとき、特別なバスが作成される。
sysfsとユーザ空間.
sysfsはudevやHALのようなハードウェアとドライバ（カーネルモジュール）についての情報にアクセスするためのいくつかのユーティリティによって使われる。スクリプトは以前procfsを通して得られた情報にアクセスするために書かれてきており、一部のスクリプトは属性を通してデバイスドライバやデバイスを設定する。