Solaris 9をディスクレスにする

YAMAMORI Takenori ●yamamori

■Solaris 9 インストール CD-ROM を、Linux で完全マウントする■


普通にマウントしてもその全容が読み出せない、Solaris のちょっと特殊なインストール CD-ROM を、Linux 上でマウントする方法を解説します。Solaris のディスクレスインストール時にも役立つはずです。
●Solaris のインストール CD-ROM の特殊性

Solaris の CD-ROM は、単なる iso9660(+RockRidge) のファイルシステムではなく、その先頭部分に Sun のディスクラベルが書かれていて、通常のハードディスクと同じように複数のスライス(SunOS パーティション)を持った、ある意味特殊な CD-ROM です。その中には、Solaris の ufs フォーマットのスライスもあります。

このため、Solaris のインストール CD-ROM を、Linux などからマウントしても、iso9660(+RockRidge) でフォーマットされた部分しかマウントされず、ufs フォーマットの部分はマウントされません。このことが、特に Solaris 9 で問題になります。

○Solaris 9 特有の問題

上記の ufs フォーマットのスライスには、Solaris のインストーラ自身がマウントする root ファイルシステムが一式入っています。

Solaris 8 以前では、この ufs スライスと同じものが、iso9660 スライスの Solaris_*/Tools/Boot ディレクトリ以下に収められており、NFS サーバ側で ufs スライスをマウントしなくても、iso9660 スライスをマウントするだけで Solaris をネットワークインストールすることができました。

しかし、Solaris 9 では、iso9660 スライスの Solaris_9/Tools/Boot ディレクトリは、ufs スライスのルートディレクトリへのシンボリックリンクに変わってしまいました。

このように変更されても、ブートサーバが同じ Solaris マシンであり、vold を使って CD-ROM をマウントしていれば問題ありません。しかし、Solaris 以外の UNIX マシンをブートサーバとしたい場合、何らかの方法で 問題の ufs スライスを読み出す必要があります。


●Linux で Solaris 9 のインストール CD-ROM をマウント

ここでは、Linux を使って Solaris 9 (SPARC版)の「Software 1 of 2」の CD-ROM を、 その ufs スライスを含めてマウントする方法を説明します。

○Linux の fdisk を使った Sun ディスクラベルの読み出し

Linux の fdisk コマンドは強力です。fdisk は、通常は Fdiskパーティションテーブルを認識して動作しますが、実は Sun のディスクラベルにも対応しており、今回の例のように Solaris のインストール CD-ROM については、その Sun のディスクラベル情報を表示することができます。

●Linux の fdisk で「Solaris 9 Software 1 of 2」CD-ROM のディスクラベル情報を表示

$ uname -sm
Linux i686     ← 確かに、Linux の Intel 機

$ fdisk -l /dev/cdrom  ← そのまま fdisk を実行

Disk /dev/cdrom (Sun disk label): 1 heads, 640 sectors, 2048 cylinders
Units = cylinders of 640 * 512 bytes

     Device Flag    Start       End    Blocks   Id  System
/dev/cdrom1   r         0       888    284160    4  SunOS usr   ← iso9660
/dev/cdrom2   r       888      1742    273280    2  SunOS root  ← ufsスライス 
/dev/cdrom3          1742      1746      1280    0  Empty
/dev/cdrom4          1746      1750      1280    0  Empty
/dev/cdrom5          1750      1754      1280    0  Empty
/dev/cdrom6          1754      1758      1280    0  Empty

上図のように確かに Sunディスクラベルが読み出せました。上図で形式的に /dev/cdrom1 と表示されている部分が、Solaris での s0 スライスに相当します。(番号がひとつずれます)


○スライスのオフセットの計算

Sunディスクラベルは読み出せましたが、この CD-ROM の ufs スライスは、このままではマウントできません。上記の図で /dev/cdrom2 と表示されている部分が ufs スライスですが、/dev/cdrom2 というデバイスは実際には存在せず、単に fdisk コマンド上で形式的に表示されているに過ぎません。

そこで、このディスクラベル情報から、ufs スライスの開始位置を手で計算し、その値をオフセットとして Linux のループバックデバイス経由でマウントするようにします。

このオフセット値は、
「開始シリンダ」×「ヘッド数」×「セクタ数」×「512バイト」
となります。この例での 「Solaris 9 Software 1 of 2」では、


  888 * 1 * 640 * 512 = 290979840(byte) 

となり、290979840 が求めるオフセット値です。
(もちろん、このオフセット値は実際の CD-ROM のバージョンよって異なります)


○オフセットを指定して ufs スライスをマウント

Linux で、ファイルシステムを、ブロックデバイスの先頭からではなく、途中からマウントしたい場合は、ループバックデバイスを経由して、そのオプションでオフセット値を指定することにより行ないます。

オフセット値は、mount コマンドのオプションとしても指定でき、この場合、

  mount -o loop,offset=290979840  …ほかのオプションは省略…

とすればよいことになります。

さらに、マウントされるファイルシステムが Solaris の ufs ですが、Linux では Linux 以外の OS のファイルシステムにもかなり広範囲に対応しており、この場合は、

  mount -t ufs -o ufstype=sun  …ほかのオプションは省略…

とすればマウントできます。

ここでは Solaris 9 の CD-ROM を用いているため、マウントポイントが Solaris 上のものと同じになるように、s0 s1 というマウントポイントを作成することにします。

以上を踏まえた実行例を以下に示します。

●オフセットを指定して Solaris 9 CD-ROM の ufs スライスをマウント

$ cd /mnt
$ su
# mkdir s0 s1                               ← マウントポイントを作る
# mount -r -t iso9660 /dev/cdrom /mnt/s0    ← まず iso9660 のマウント
# mount -r -t ufs -o loop,ufstype=sun,offset=290979840 /dev/cdrom /mnt/s1 
# exit                                      ↑ 問題の、ufs スライスのマウント

$ df /mnt/s0 /mnt/s1                        ← df で、マウント状況を確認
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/hdc                284160    284160         0 100% /mnt/s0
/dev/hdc                256710    236076         0 100% /mnt/s1

これで「Solaris 9 Software 1 of 2」の CD-ROM が iso9660 のみならず ufs スライスを含めてマウントされました。

本当に正常にマウントされているかどうか、問題の Solaris_9/Tools/Boot のシンボリックリンクがちゃんと解決しているかどうかを確認してみましょう。

●マウントされた Solaris 9 CD-ROM の確認

$ cd /mnt/s0/Solaris_9/Tools   ← 問題のディレクトリに移動

$ ls -l                                            Boot はシンボリックリンク
total 96                                                ↓
lrwxrwxrwx    1 root     bin            11 Apr 16 03:23 Boot -> ../../../s1
-rwxr-xr-x    2 root     daemon      59586 Apr 15 14:54 add_install_client
-rwxr-xr-x    2 root     sys          1325 Apr 15 14:54 dial
-rwxr-xr-x    2 root     daemon      18599 Apr 15 14:54 rm_install_client
-rwxr-xr-x    2 root     daemon      13045 Apr 15 14:54 setup_install_server 

$ cd Boot     ← 問題のシンボリックリンクをたどってみる
$ /bin/pwd
/mnt/s1       ← 確かに s1 に移動できた

$ ls -l       ← s1 の下の root ファイルシステムを表示
total 30
drwxr-xr-x    2 root     sys           512 Apr 16 03:39 a
lrwxrwxrwx    1 root     bin             9 Apr 16 04:21 bin -> ./usr/bin
drwxr-xr-x    2 root     sys           512 Apr 16 03:39 cdrom
drwxr-xr-x   10 root     sys          1024 Apr 16 04:21 dev
drwxr-xr-x    3 root     sys           512 Apr 16 04:21 devices
drwxr-xr-x   29 root     sys          3072 Apr 16 04:21 etc
drwxr-xr-x    9 root     sys           512 Apr 16 04:21 kernel
lrwxrwxrwx    1 root     bin             9 Apr 16 04:21 lib -> ./usr/lib
drwxr-xr-x    2 root     sys           512 Apr 16 03:33 mnt
drwxr-xr-x    2 root     sys           512 Apr 16 03:33 opt
drwxr-xr-x   43 root     sys          1536 Apr 16 04:20 platform
dr-xr-xr-x    2 root     root          512 Apr 16 03:33 proc
-rw-r--r--    1 root     bin             0 Apr 16 03:36 reconfigure
drwxr-xr-x    3 root     sys          1024 Apr 16 04:21 sbin
drwxrwxrwt    4 root     sys           512 Apr 16 04:22 tmp
drwxr-xr-x   23 root     sys           512 Apr 16 04:19 usr
lrwxrwxrwx    1 root     bin            14 Apr 16 04:13 var -> ./tmp/root/var
drwxr-xr-x    3 root     bin           512 Apr 16 04:22 webstart

以上のようにしてマウントされた、Solaris 9 のインストール CD-ROM をネットワークインストールなどに利用することができます。ここでは s0, s1 のスライスのみをマウントしましたが、s2 以降のスライスについても、同様にオフセット値を計算して、ufs ファイルシステムとしてマウントすることができます。ただし、s2 以降のスライスは、順に sun4c, sun4m, sun4d, sun4u のブートブロックが installboot されたスライスであり、CD-ROM から直接ブートする場合に必要なものです。ネットワークインストールに必要なのは、s0, s1のスライスです。

To『Solaris 9をディスクレスにする』[index]


To 謎の処理系 SunOS 4.1.4 with Linux/FreeBSD[Home]
yamamori