目次


ブート可能な IBM Power サーバーの ISO イメージの検出

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です:

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:

このシリーズの続きに乞うご期待。

はじめに

TCD-ROM をブートできることが極めて重要な意味を持つようになったのは、Microsoft Windows などのオペレーティング・システムが、フロッピー・ディスクに収めるにはあまりにも大きくなった 90年代中頃です。1994年に Phoenix Technologies と IBM が提案した仕様である ISO 9660 には、BIOS が CD-ROM を読み取ってブート手順を実行できるようにする方法が規定されました。現在、El Torito と呼ばれる ISO 9660 の拡張規格は、ブート情報のデータ・フォーマットを記述するのに最もよく使われている方法の 1 つとなっています。例えば Intel ファームウェアの大半は El Torito の仕様に従っています。

一方、IBM Power Systems では、このブート・プロシージャーに関する ISO 9660 の勧告に従っていません。IBM Power サーバーで ISO イメージをブートするには、ブート・メディアの ppc というディレクトリーに bootinfo.txt という名前のファイルが格納されていなければなりません。ファームウェアはこのファイルに含まれる指示に従ってイメージをブートします。

この違いによって、(Kimchi のような) VM マネージャーなどのソフトウェアには、複数のアーキテクチャー・イメージに対処しなければならない複雑さが加わる場合があります。試行錯誤 でイメージをブートするという方法は、選択肢にありません。また、イメージをマウントすれば、/ppc/bootinfo.txt ファイルの有無を知る手掛かりになりますが、マウント・プロセスには少なくも ISO イメージと同じディスク・サイズと特別な権限が必要となり、時間もかかります。代わりのソリューションとなるのは、ISO イメージをそのままバイトごとに読み込んで /ppc/bootinfo.txt ファイルを見つけることです。これが現実的なソリューションとなる理由は、すべての ISO ファイルは ISO 9660 ファイル・システムを実装し、メディア内のファイルを記述する標準的な手段を提供しなければならないためです。この記事ではこれ以降、サンプル・コードを紹介しながら、この代わりとなるソリューションを探っていきます。

次のセクションでは、すべての ISO ファイルで、アーキテクチャーの違いに関わらず使用されている ISO 9660 標準について説明します。それに続く以降のセクションでは、ISO 9660 勧告に従って、ISO ファイルに含まれる任意のファイルにアクセスする方法を取り上げます。この記事では Python 言語によるサンプル・コードも提供し、他のコーディング手法についても説明します。最後のセクションでは、この記事のまとめと、得られた結果の考察を行います。

ISO 9660 標準

ISO 9660 は、広範に採用されている標準であり、CD-ROM ディスクだけでなく、DVD ディスク、Blu-Ray ディスク、さらにはフラッシュ・ドライブでも採用されています。現在の要求に対しては厳しい制約があるものの (それらの制約は拡張規格で対処されています)、ISO 9660 ではメディア内にデータを保管して読み取るための比較的簡単な方法が規定されています。

ISO ファイルの先頭バイトから次の 32 KB までは、システム・エリア (system area) としてマークされており、使用されない領域となっています。システム・エリア (System Area) の後には複数のセクター (1 セクターは 2048 バイト。論理ブロックとも呼ばれます) があり、これらのセクターでイメージ内に存在するボリュームが記述されます。ボリュームのタイプと内容はそれぞれに固有ですが、いずれも同じレイアウトに従います。

図 1. ISO 9660 での汎用ボリューム記述子フォーマット
図 1. ISO 9660 での汎用ボリューム記述子フォーマット

ボリューム記述子のうち、とりわけ重要なのは、基本ボリューム (Primary Volume) とブート・レコード・ボリューム (Boot Record Volume) です。基本ボリューム (Primary Volume) には、ディレクトリーの場所、セクターの数、その他の情報を含め、ファイル・システムの残りの部分を読み取る方法に関する情報が含まれます。一方、ブート・レコード・ボリューム (Boot Record Volume) は、BIOS に対して ISO イメージの起動方法を指示します。El Torito 標準では、ブート・レコード・ボリューム (Boot Record Volume) がブート・カタログ (Booting Catalog) の場所を保持します。ブート・カタログ (Booting Catalog) とは、使用可能なブート・イメージの索引です。1 つのメディア内に複数のブート・イメージが存在することは可能であることから、この索引が必要となるわけです。ISO ファイルのボリューム・レコード・リストの終わりは、セット・ターミネーター・ボリューム (Set Terminator Volume) でマークされます。

図 2. ISO 9660 のボリュームとブート・カタログ
図 2. ISO 9660 のボリュームとブート・カタログ

ISO 9660 ファイル・システム内のファイルの検出

前のセクションで述べたように、基本ボリューム (Primary Volume) レコードには、その ISO に含まれるファイルに関する情報を格納します。これらの情報には、パス・テーブルのサイズと場所も含まれます。パス・テーブルには、メディア内に存在するすべてのレコードのリストが含まれます。パス・テーブル内のデータは、次のフォーマットになっています。

図 3. パス・テーブルのモデル
図 3. パス・テーブルのモデル
図 3. パス・テーブルのモデル

「length of directory identifier (ディレクトリー識別子の長さ)」は、「directory identifier (ディレクトリー識別子)」フィールドのサイズとなります。ほとんどの場合、「directory identifier (ディレクトリー識別子)」はディレクトリーの名前になっています。2 番目のフィールドは、ディレクトリーに関する追加情報を提供します。このフィールドは、ISO 9660 の一部の拡張規格で使用されます。「location of extend (拡張の場所)」は、このエントリーを表すディレクトリー・レコードの論理ブロックです。「directory number of parent directory (親ディレクトリーのディレクトリー番号)」は、親ディレクトリーを表す論理アドレスのポインターです。「padding (パディング)」フィールドは、「directory identifier (ディレクトリー識別子)」の長さが奇数である場合には存在し (このフィールドの値 は 0 です)、そうでない場合は存在しません。これは、各エントリーが偶数のバイト番号で開始されるようにするためのものです。

ISO 9660 ファイル・システム内のディレクトリーを見つけるにはパス・テーブルがあれば十分ですが、特定のファイルを見つけるには、対応するディレクトリー・レコードを検索しなければなりません。このレコードには、そのディレクトリー内の各ファイルとサブディレクトリーに関するすべての情報が保持されているからです。

図 4. ディレクトリー・レコードのモデル
図 4. ディレクトリー・レコードのモデル
図 4. ディレクトリー・レコードのモデル

この記事で分析する必要があるフィールドは以下のとおりです。

  • length of directory record (ディレクトリー・レコードの長さ): このエントリーのサイズ。
  • file flags (ファイル・フラグ): レジスターのタイプを表すバイト。サブディレクトリー、ファイル、隠しファイルなどのタイプがあります。1 つのエントリーに複数のフラグが含まれる場合があることに注意してください。
  • length of file identifier (ファイル識別子の長さ) と file identifier (ファイル識別子): ファイル/サブディレクトリーの名前を読み取るために使用します。
  • padding (パディング): レコードの長さが偶数の場合に存在します。

以上の情報があれば、/ppc/bootinfo.txt ファイルを検索して、ISO が Power Systems サーバー内でブート可能であるかどうかを判別するアルゴリズムを定義することができます。

図 5. /ppc/bootinfo.txt ファイルの検索アルゴリズム
図 5. /ppc/bootinfo.txt ファイルの検索アルゴリズム
図 5. /ppc/bootinfo.txt ファイルの検索アルゴリズム

このアルゴリズムを調整すれば、あらゆるファイルを検索することができます。このアルゴリズムは、パスの逆の順序でファイルを探し、検索対象のファイルを格納しているディレクトリーに到達するまで、すべてのディレクトリーを探しているだけに過ぎません。

この概念が実際にどのような形で実装されるかは、次のセクションで取り上げるサンプル・コードを見るとわかります。このサンプル・コードでは、IBM Power サーバーの ISO ファイルを開いて、それがブート可能であるかどうかを検出します。

Python による実装

以下に示すコードは、これまで説明した概念を実装した実際に動作するサンプル・コードです。この Python スクリプトは、パラメーターとして渡された ISO ファイルをロードして、イメージが Power Systems ファームウェアでブート可能であるかどうかを評価します。スクリプトのインライン・コメントを読むと、そのワークフローを理解できるはずです。このサンプル・コードは、私が Kimchi プロジェクトに提出したパッチを適用したものです。

detect_ppc_iso.py という名前のファイルの中身を保存してから、以下のコマンドを使用して、このファイルを実行してください。

$ python detect_ppc_iso.py <pc_iso>

detect_ppc_iso.py ファイルについては、「ダウンロード」セクションを参照してください。

その他の方法

前のセクションで紹介した実装は、ISO イメージ・ファイルを開き、そのイメージ・ファイルの中身を ISO 9660 標準に従ってバイトごとに読み取って、ブート可能な Power Systems ファイル /ppc/bootinfo.txt を見つけます。

別の手段としては、ISO ファイルを読み取って同じ結果を提供することができるオープンソースのライブラリーもあります。cdrkit がインストールされた一部の Linux ディストリビューションでは、isoinfo コマンドを使って ISO ファイルから関連情報を取得することができます。この情報に、Power Systems ファームウェアのブート・ファイルの存在に関する情報が含まれています。

リスト 1. isoinfo を使用して ISO ファイル内の /ppc/bootinfo.txt ファイルを検出する
$ isoinfo -i RHEL-7.0-20140507.0-Server-ppc64-dvd1.iso  -d

CD-ROM is in ISO 9660 format

System id: PPC

Volume id: RHEL-7.0 Server.ppc64

Volume set id: 

Publisher id: 

Data preparer id: 

Application id: GENISOIMAGE ISO 9660/HFS FILESYSTEM CREATOR (C) 1993 E.YOUNGDALE (C) 1997-2006 
        J.PEARSON/J.SCHILLING (C) 2006-2007 CDRKIT TEAM

Copyright File id: 

Abstract File id: 

Bibliographic File id: 

Volume set size is: 1

Volume set sequence number is: 1

Logical block size is: 2048

Volume size is: 1512366

Joliet with UCS level 3 found

Rock Ridge signatures version 1 found

$  isoinfo -i /var/lib/libvirt/images/RHEL-7.0-20140507.0-Server-ppc64-dvd1.iso  -x /ppc/bootinfo.txt

<chrp-boot> <description>Linux</description> 

<os-name>Linux</os-name> 

<boot-script>boot &device;:\ppc\chrp\yaboot</boot-script> 

(...)

最初のコマンドは ISO イメージの基本ボリューム (Primary Volume) 記述子を読み取り、そこに含まれる情報を取得します。2 番目のコマンドは、/ppc/bootinfo.txt ファイルを検索し、このファイルの中身を標準出力にダンプ出力します。

isoinfo コマンドやその他の代替手法を使用したほうが簡単かもしれませんが、その場合、OS への追加パッケージのインストールが前提条件となるため、将来的にそれらのパッケージへの依存関係が生じることになります。このようなライブラリーが提供する ISO 操作機能をソフトウェアで広範に利用するのでない限り、ISO ファイルが Power Systems サーバー上でブート可能であるかどうかを調べるというタスクには、前のセクションで紹介したコードで対応することができます。このコードは、オペレーティング・システムやプラットフォームの違いに関わらず機能し、依存するのは Python コア・ライブラリーだけです。

まとめ

この記事では、ISO イメージのブート・プロセスに関する Intel と IBM POWER とでの違い、ISO 9660 ファイル・システム内でファイルを見つける方法の概要、そしてその概念をデモンストレーションする実際のコードについて説明しました。最後に、代わりに使用できる方法を紹介しましたが、その方法に必要となるライブラリーとリソースは入手できないかもしれません。

この記事の内容から引き出せる 1 つの結論として、ロー・データで ISO イメージを広範に利用するソフトウェアには、サード・パーティー製のライブラリーやソフトウェアが推奨されます。他のタスク (ISO イメージをブートできるかどうかの検出など) については、そのタスクを行うための最小限の ISO 9660 プロトコルを実装し、サード・パーティー製ライブラリーには依存しないという利点を活かすことが可能です。Kimchi プロジェクトで実装しているのは、この方法です。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=996559
ArticleTitle=ブート可能な IBM Power サーバーの ISO イメージの検出
publish-date=02052015