Solaris 10(x86)をインストールしてみよう |
||
| YAMAMORI Takenori ●yamamori@kt.rim.or.jp | ||
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
-----