Linux&FreeBSD ハードウェア設定

YAMAMORI Takenori ●yamamori

■SCSIカードをあとから増設

●Vine 1.1の場合


SCSIカードに限らず,ネットワークカード,サウンドカード, グラフィックカードなどをあとから追加した場合は,そのカードのチップに対応する ドライバをロードする必要があります. ドライバは,多くの場合はOSに付属していると思いますが, 場合によってはダウンロードでの入手が必要だったり,あるいは Linux用のドライバは存在しないこともあるでしょう.
ここはWebなどの情報も大いに参考になると思います. Webをいろいろ探索するうちに,LinuxやFreeBSD関係のブックマークも自然に増えて いくことでしょう.各種サーチエンジンをうまく利用したりするうちに, ドライバに関する情報もいろいろと得られるのではと思います.
ちょっとずるい方法ですが,Linux用として新規に マシンやカード類を購入する場合は, Linuxのプレインストールマシンに使われているカード類を見て, 逆に「これらはLinuxで使える」のだと判断することも出来ると思います.

さて,それでは今,新たにSCSIカードを追加したとして, このカードに対応するドライバは何でしょうか? …わかりません…というか,最初からSCSIカードを挿した状態で Vineなどをインストールすると,たいていはインストーラが自動的に ドライバを捜し出して,適切な設定を行なってくれているため, あとから追加した場合には困ってしまったりするのです.

それならば,面倒なのでOSごと再インストールしてしまえ…と, ついなりがちです. (もっとも,redhat系のインストールは10分〜20分くらいで 出来てしまい,また,インストール過程の理解にもなるため, 必ずしも悪い方法とは思いませんが)

○Vine のインストーラを使って認識させる

追加したSCSIカードに対応するドライバが何かわからない場合, ちょっと緊張する方法ですが,以下のようにして試してみるという方法があります.

いったんマシンをシャットダウンして Vine 1.1のインストーラを起動し,画面を
インストール」→「カスタム
と選んで進めて下さい. するとこの次の,Disk Druidの画面に行く前に, SCSIカードの自動検出が行なわれるのです. ここではこれ以上インストーラを進めないように注意して, 左[Alt]+[F2]でシェルのプロンプトに切替え, そこでlsmodコマンドを実行して以下のような表示を確認して下さい. ドライバがモジュールとしてロードされているのがわかります.
(なお,この後,インストーラ本体の画面を進めない限り, すでにインストールされているシステムに影響はありません)

・インストーラ上のシェルでlsmod
bash# lsmod
Module:       #pages:  Used by:
aic7xxx          23            0
ncr53c8xx        12            0
isofs             5            1

上の例は,AHA-2940Uと,53c875の載ったカードの,計2枚のSCSIカードを 挿したマシンにおいて試してみた結果で,ここではドライバとして, aic7xxxncr53c8xxが使用されていることがわかります.
(isofsはCD-ROMのファイルシステムのドライバですのでここでは関係ありません)

○モジュールを手動でロードしてみる

ドライバ名がわかったので,OSをブートし直し, これらのモジュールを手動でロードしてみましょう. その結果は以下のようになりました.

AHA-2940Uの場合:
# /sbin/modprobe aic7xxx
scsi0 : Adaptec AHA274x/284x/294x (EISA/VLB/PCI-Fast SCSI) 5.1.7/3.2.4
       <Adaptec AHA-294X Ultra SCSI host adapter>
scsi : 1 host.

53c875の場合:
# /sbin/modprobe ncr53c8xx
ncr53c875-0: resetting, command processing suspended for 2 seconds
ncr53c875-0: enabling clock multiplier
ncr53c875-0: Downloading SCSI SCRIPTS.
scsi1 : ncr53c8xx - revision 3.1e
scsi : 2 hosts.
ncr53c875-0: command processing resumed

このように,手動でモジュールをロードすれば,その後すぐSCSIデバイスを 使うことができます.ここで,すでにSCSIのハードディスクやCD-ROMが つながっている場合は,以下のように生データを読んでみることもできます. いきなりマウントするのではなく,まずこのようにして確認するといいと思います.

# od -c /dev/sda | head    ← SCSI ハードディスクの場合
# od -c /dev/scd0 | head   ← SCSI CD-ROMの場合

これらのモジュールを,ブート時(rootファイルシステムのマウント前)に ロードするために,以下の設定を行ないます.

# vi /etc/conf.modules
  (以下の2行を追加)
alias scsi_hostadapter aic7xxx
alias scsi_hostadapter1 ncr53c8xx
(SCSIカードが2枚あるため,2枚目には scsi_hostadapter1という名前を使って記述します)

initrd の作成

OSのインストール時に,IDEしか存在していなかった場合は, initrd(初期RAMディスク)が作られていないと思いますが, SCSIを使う場合は,以下のようにmkinitrdコマンドを使って, SCSIモジュールの入ったinitrdを作成します.

mkinitrdinitrd作成:
# /sbin/mkinitrd -v -f /boot/initrd-2.0.36-3vl3.img 2.0.36-3vl3
Using modules:  scsi/aic7xxx.o scsi/ncr53c8xx.o
Using loopback device /dev/loop0
/bin/ash.static -> /tmp/initrd.598/bin/sh
/sbin/insmod.static -> /tmp/initrd.598/bin/insmod
/lib/modules/2.0.36-3vl3/scsi/aic7xxx.o -> /tmp/initrd.598/lib/aic7xxx.o
/lib/modules/2.0.36-3vl3/scsi/ncr53c8xx.o -> /tmp/initrd.598/lib/ncr53c8xx.o
Loading module aic7xxx with options 
Loading module ncr53c8xx with options
(わかりやすいように-vオプションも付けています)

次にこのinitrdlilo.confに登録します.

lilo.confinitrdを登録:
# vi /etc/lilo.conf
  …略…
image=/boot/vmlinuz-2.0.36-3vl3
        label=linux
        root=/dev/hda2
        initrd=/boot/initrd-2.0.36-3vl3.img  ← この1行を追加
        read-only
  …略…

最後に忘れずにliloを実行します.

# /sbin/lilo

なお,kernel 2.2.12でも試してみましたが,こちらでは, /etc/conf.modules に必要なモジュールを記述した状態で /dev/sda や /dev/scd0 などのデバイスをアクセスしようとすると, SCSIモジュールが自動的にロードされるのを確認できました.

もし,SCSIハードディスクから直接ブートする必要がない (rootファイルシステムとしては使わない)とか, あるいはCD-ROM(CD-R),MOなどのリムーバブルSCSI機器のみを使う場合は, この状態のままでも使えると思います.

SCSIハードディスクをrootファイルシステムにする場合は, カーネルが / をマウントする時点で, すでにSCSIドライバがカーネルにロードされていなければならないため, やはりinitrdを作成するか, あるいはドライバをカーネルに静的に組み込んでおく必要があります.

なお筆者は,せっかくモジュールが使えるなら, できる限りモジュールにすることを好みますので, SCSIドライバについても,カーネルの再構築の際には, 主なものはすべてモジュールとして作成しておき, SCSIカードの追加,交換時には/etc/conf.modulesの 記述の変更,initrdの再作成等で済むようにしています.

・関連コラム:■ initrd の中身を見てみよう


●FreeBSD 3.2の場合

FreeBSDの場合,GENERICカーネルに主要なSCSIドライバがすでに 組み込まれているため,カードを挿してブートするだけで 認識されてOKだと思います. 実際に試してみたところ,ブート時のメッセージ(あとで dmesgコマンドを使っても見られます)に以下のような表示が出ました.

・AHA-2940U: ブート時にahc0として認識
ahc0: <Adaptec 2940 Ultra SCSI adapter> rev 0x00 int a irq 11 on pci0.9.0
ahc0: aic7880 Single Channel A, SCSI Id=7, 16/255 SCBs

・53c875: ブート時にncr0として認識
ncr0: <ncr 53c875 fast20 wide scsi> rev 0x03 int a irq 10 on pci0.10.0
(2枚同時に挿してもOKでした)

なお,GENERICカーネルではなく,すでに現状のマシンに合わせて 不要ドライバの削除を済ませたカーネルを作ってチューニングされている方は, ここでは新しいSCSIカードを認識できなかったかも知れません. しかし,そのような方の場合は,すでに何をやるべきかご存知のはずなので, ここではあえて説明は不要でしょう.


To「Linux&FreeBSD ハードウェア設定」index


このページは、技術評論社 Linux×BSD HYPER PRESS Vol.2秋号、『もう困らない!Linux&FreeBSD ハードウェア設定テクニック』 の原稿を元に、Web 用に再構成したものです。
To 謎の処理系 SunOS 4.1.4 Home
yamamori