libsysfs

11月6日に、libsysfs-0.3.0がアナウンスされた。libsysfsはsysfsと密接に関わりながら、カーネル2.6での新しいhotplugやudevと密接に関わるライブラリである。libsysfsはまた、サンプル・ソースコードやコマンドとともにsysfsutilsパッケージを構成しているので、併せて解説する。

IBMでLinux開発に従事している Ananth N Mavinakayanahalliから、11月6日にLKMLで次のようなアナウンスがあった。

我々はsysfsutilsパッケージの一部としてlibsysfs v0.3.0をリリースした。パッケージはhttp://linux-diag.sourceforge.net/からダウンロードすることができる。変更は次のものを含んでいる。

  • 「ブロック」サブシステムのサポート。”block”は今後、sysfsの”class”と見なされる。
  • 共有化と静的なライブラリをビルドする機能
  • 固定の「書込み」アトリビュートのサポート。
  • API使用法を実証するために「テスト」ルーチンを少し追加した。
  • ヘッダは今後、/usr/include/sysfsにインストールされる。
  • PCIネームのデコード・サポート。

libsysfsおよび他の診断ユーティリティについて議論するためのメーリングリストは以下にある。

http://lists.sourceforge.net/lists/listinfo/linux-diag-devel

目的

libsysfsの目的は、sysfsによって表されるシステム・デバイス情報を獲得するために、一貫して安定したインタフェイスを提供することである。ライブラリでは、ディレクトリやファイルを読み取るようにファイルシステム情報を取得するための、機能を備えている。さらにまたsysfsに現れる”bus”、”class”やデバイス・ツリーとともに働くルーチンを含んでいる。

要求機能

ライブラリは次の要求を満たすことになっている。

  • アプリケーションで構築するための、安定したプログラミング・インタフェイス。
  • デバイスのエラーログ分析(ELA)サポートのための、重大製品データ(VPD)情報を検索する機能。(ELAはデバイスドライバおよびデバイス・バス・アドレス情報を提供する)
  • sysfsによって表されたすべてのシステム・デバイスとその情報へのアクセスの提供。
  • sysfsの現在のマウントポイントを見つける機能の提供。
  • udevがデバイスのメジャー番号、マイナ番号を取り出すための機能の提供。

概要

libsysfsは共通の要求から生まれて育ってきた。sysfsとシステム・デバイスへのアクセスを必要とするいくつかの開発中アプリケーションがある。udevはhotplugイベントで、sysfsデバイス・パスを獲得して/devノードを作成する必要がある。診断クライアントではシステム・デバイスをすべてリストする必要がある。エラーログ解析の一部では、フェイルするデバイスのVPD情報の獲得が要求される。われわれは、各アプリケーションがディレクトリやファイルの読み込みに関するsysfsの”own access”を作成するよりも、一つのライブラリ・インタフェイスに分割した。

libsysfsは、アプリケーション構築のための安定性も提供していく。sysfsは現在、コールバックやファイル名のための標準が強化されていないが、ファイル名はバスまたはクラスに依存するので変わることがある。sysfsは現在開発中であり、さらに変更されている。libsysfsはsysfsがその間に、アプリケーションに対する安定したインタフェイスを供給することになる。

ライブラリは、sysfsのように、”bus”、”class”やトポロジによって、アプリケーションにデバイスを提供する。ライブラリは、ディレクトリやファイルと同様に機能する。PCIバスについてデバイスに問い合わすと、デバイスをスキャンするか読むためにバスを「開き」、完了した時バスを「閉じる」。デバイスを検索する機能に加えて、ライブラリはさらにsysfsマウントポイントを得るような、ユーティリティー機能を提供する。

以上がlibsysfsの概要であるが、ライブラリを使用して実際に何ができるかは、2003年7月7日にlibsysfsの最初のバージョンを発表した際の、Daniel Stekloffの投稿が分かり易いので、以下に紹介する。

libsysfs v0.1.0

私はsysfsを包含して作成した小さなライブラリ、libsysfsを発表する。小さなライブラリ・パッケージの最初の版は、以下のsysutils(訳注:sourceforgeでメンテナンスされる前は、sysfsutilsではなくこの名前であった)である。

ライブラリは、sysfsの中のシステム・デバイス情報へのアクセスを必要とする、いくつかのアプリケーションの要求から成長した。我々は、各アプリケーションに”own access”ルーチンを作成させることではなく、共通コードのライブラリを提供するほうがよいと思った。Greg KHのudevアプリケーション(devfsのためのユーザ・スペース置換)はsysfsアクセスを必要とするアプリケーションのうちの1つである。グレッグのオリジナルのアナウンスは次に見ることができる。

http://marc.theaimsgroup.com/?l=linux – kernel&m=105003185331553&w=2
(訳注: このメール、及びhotplugとudevに関しては、HotPlugudevとdevfsudevの概要で解説している)

ライブラリはdeviceやbusの固有機能はインプリメントしないが、ジェネリックなsysfs中に現れるbus、class、deviceへの単純なアクセスを提供する。ライブラリが含まれているsysutilsパッケージには、sysfsおよびシステム・デバイス情報へのアクセスを容易にする願いをこめた、次の2つの小さなコマンドが用意されている。

systool

systoolは”bus”、”class”、または”device root”内のsysfsのdeviceをリストするコマンドである。以下の出力例では、”device root”のpci2以下の全てのデバイスを示している、各デバイスに続く親子関係はインデント付で示している。

[stekloff@… stekloff]$ systool -r pci2 
Root Device Tree: pci2 
   pci2 Host/PCI Bridge 
         02:01.1 Adaptec AIC-7899P U160/m (#2) 
               host1 aic7xxx 
                     1:0:8:0 SCSI Processor 
                           1:0:8:0:gen SCSI Processorgeneric 
                     1:0:0:0 SCSI Direct-Access 
                           1:0:0:0:gen SCSI Direct-Accessgeneric 
         02:01.0 Adaptec AIC-7899P U160/m 
               host0 aic7xxx

lsbus

lsbusは、単にsysfsバス情報を見るための小さなコマンドである。この出力例では、PCIドライバおよびそれらのデバイスをすべて示している。

[stekloff@… stekloff]$ lsbus -D pci 
Bus: pci 
Drivers: 
  aic7xxx 
        Devices: 
                02:01.0 
                02:01.1 
  RZ1000 IDE 
  PIIX IDE 
  eepro100 
  pcnet32 
        Devices: 
                00:05.0 
  serial 
  agpgart-via 
  agpgart-sis 
  agpgart-intel 
  agpgart-amdk7 
  agpgart-ali