Solaris 10(x86)をインストールしてみよう |
||
YAMAMORI Takenori ●yamamori |
Solaris 10のインストールCDのうち,1枚目のSoftware CD1は, 単なるISO 9660のCDではなく,少し特殊な構造になっています. 実際,CD1のISOイメージファイルのサイズが650MB近くあるのに, ISO 9660のファイルシステムは200MB強程度しかなく, 不思議に思った方も多いことでしょう.
Solaris 10 x86版のSoftware CD1の構造を下図に示します. ISO 9660では,ファイルシステムの先頭から32Kバイトは空きエリアですが, x86版のCDでは,この空きエリアに,ハードディスクと同様の配置で ブートローダやfdiskパーティションテーブルなどが書き込まれています. これらの中にはSunディスクラベルも存在し,このSunディスクラベルによって, おもに2つのスライスが定義されています. そのひとつが通常のISO 9660ファイルシステムで, もうひとつがSolarisのUFSファイルシステムです. このUFSのファイルシステムは,ISO 9660のあとに存在します.
このCDを,Linuxなどで普通にISO 9660(RockRidge拡張つき)でマウントすると, ISO 9660の部分のみがマウントされ,UFSの部分は読めません. このため,CD内のSolaris_10/Tools/Bootというシンボリックリンクが, ../../../s0という存在しないUFS上のディレクトリを指したままになっています. (ただし,DVDではSolaris_10/Tools/Boot以下にもファイル一式が存在します)
・図 Solaris 10 x86版Software CD1の構造 0x0000 +--------------------------------+ | ブートローダ(CD起動用) | | fdiskパーティションテーブル | 0x0200 +--------------------------------+ | ブートローダ(pboot) | 0x0400 +--------------------------------+ | Sunディスクラベル | | | 0x0800 +--------------------------------+ | ブートローダ(bootblk) | : : | | 0x8000 +--------------------------------+ | ISO 9660 PVD | | | : : | ISO 9660ファイルシステム本体 | : : : : | | ?????? +--------------------------------+ | Solaris UFSファイルシステム | | | : : : : | | +--------------------------------+
このUFSファイルシステムの開始位置がわかれば, Linux上からも適切なオプションを付けてマウントできるはずです. 本来ならSunディスクラベルを読み出して,開始位置を求めるべきですが, これをLinux上で行なうのは少々困難です. そこで,やや強引な方法ですが,ISO 9660の終了位置から, 2Kバイトずつオフセットをずらしながら試行錯誤でマウントを 行なうという方法を紹介します.
ISO 9660の終了位置は,cdrecord(cdrtools)付属のisoinfoコマンドで表示される ボリュームサイズから計算できます.そこで,下図のように, シェルのuntil文をコマンドラインに直接入力して,オフセット位置を探りながら マウントを行なえば,適切なオフセットのところでUFSファイルシステムが マウントされるのです.マウント後,試しに,lsやdfコマンドを実行して, その様子を確認することができます.
・図 Linux上でx86版Software CD1のUFSファイルシステムをマウント ----- $ isoinfo -i /dev/cdrom -d | grep size ← ISO 9660のボリュームサイズを求める Volume set size is: 1 Logical block size is: 2048 ← セクタサイズは2Kバイト Volume size is: 109872 ← 合計109872セクタ $ expr 2048 \* 109872 ← 2048×109872を計算する 225017856 ← ボリュームサイズは225017856バイト $ su ← rootになる # mkdir /mnt/s0 ← マウントポイントを作成 # n=225017856 ← オフセットの初期値 ↓until文でマウントの試行錯誤 # until mount -r -t ufs -o loop,ufstype=sunx86,offset=$n /dev/cdrom /mnt/s0 > do ← ループの開始 > n=`expr $n + 2048` ← オフセットに2Kバイトを加算 > echo $n ← 現在のオフセットを表示 > done ← ループの終了 …省略… ← ループ中,多数のエラーメッセージが出る 225114112 ← このオフセットで試行 ↓しかしマウントエラー mount: wrong fs type, bad option, bad superblock on /dev/loop0, or too many mounted file systems 225116160 ← このオフセットで試行 # ← シェルのプロンプトに戻れば正常にマウントされている # ls /mnt/s0 ← 試しにlsコマンドを実行 ↓このようなファイルが見える a boot dev etc lib opt proc sbin tmp var bin cdrom devices kernel mnt platform reconfigure system usr # df /mnt/s0 ← 試しにdfコマンドを実行 ↓確かにマウントされている Filesystem 1k-blocks Used Available Use% Mounted on /dev/cdrom 363852 353448 0 100% /mnt/s0 -----