超小型 FreeBSDマシンを作る

UNIX Magazine *1 2000年 10月号の特集 「いつでも使えるインターネット」の中で
Linuxを使った超小型の ルータが紹介されていました。 外観が 3.5inch FD 8枚分
*2くらいの大きさ(小ささ)の中に 2 Ether を持った PC/AT互換機です。
小さいながらも 普通(!?)のPC/AT互換機ですから これに FreeBSDを インストールし
て設定を行えば、超小型の FreeBSDを使ったルータ として使うことができます。さ
らにNATを機能させて使うことも可能 です。

ここでは 2000年10月に購入した SPモデルを SP/32モデル(エンジニアリング サンプ
ル版)にアップグレードした LAMB-RT-01 に FreeBSD 4.3-RELEASE をインストールす
る手順を紹介します。他のモデルでも同じ様に インストールできると思います。

子羊ルータ LAMB-RT-01 とは

Linux を使った超小型のルータとは ワイルドラボ社の 子羊ルータ LAMB-RT-01 シリ
ーズです。現在は、 標準モデル, SPモデル, SP/32モデルとあり, 標準モデル以外は
IBM製 のMicroDrive を搭載したモデルがある様です。また 組み込み用とした モデ
ルも用意されているそうです。購入は 同社の Web経由でオンライン で可能です。
(最新の情報は ワイルドラボ社さんのページで確認して ください)
外形は 93x91x30(mm) (取扱説明書より)と小さく 側面に Serial port x 1, 背面に
10BaseT Ether x 2, ステータスLED, SHUTDOWN SW, 電源コネクタが あります。電源
は ACアダプタ経由で +5V (ACアダプタの最大出力は 1.7A) が供給されます。インス
トールされている Linuxを使っている場合、 ステータスLED は shutdown などをす
るときに その進行状況を知らせるた めのもので、 SHUTDOWN SW を押すと shutdown
シーケンスに入り、 電源を切って良い状態になると 消灯する様になっている様です
。*3 他に SW等はなく、電源を切るには shutdown したのち AC アダプタを抜い て
切ります。

LAMBの中身がどうなっているか、見てみます。以下の写真は 私がSPモデルを 購入し
たときのものです。変更されている場合があるかもしれません。
 [PHOTO1] 左の写真は ケースのフタを開けたところです。 写真の下側が 正面側で
          、16MB のCF に Linux が入っている様です。 CF の右側に 上下に並んで
          いる chipが NIC 用のchipで NE2000互換 (RTL8019AS) と書いてあります
          。
          FreeBSD では ed* デバイスとして認識されます。
 [PHOTO2] ケースから メインの基板を取り出し、その裏側の写真です。 基板の裏に
          は DIMMタイプのソケットがあります。 そこに実装 されているのがドイ
          ツ製の PC/AT互換のモジュールということ です。
          PC/AT互換機のメインボード部分は ここまで小さくなったのですね...
 [PHOTO3] DIMMソケットに実装されているCPUモジュールを取り出してみます。 右側
          に AMDのロゴの入ったモジュールが見えます。 これが CPUだと 思います
          。左側には シールが貼られた IC があります。 おそらく チップセット
          の ASICなのではないか、と思います。
          SP/32モデルでは FPU機能が追加されています。
 [PHOTO4] CPUモジュールの裏側の写真です。RAM らしい ICが実装されて います。
          これが 16MBのメインメモリ用の ICだと思います。
          SP/32モデルでは 32MBに容量アップされています。
 [PHOTO5] 再び 組み立ててケースに収めます。 これでいろいろ遊んでみるには
          16MB という容量は少なすぎる と思います。という訳で 別途購入してお
          いた Microdrive (340M) を入れてみました。
          写真を撮影した当時は 340MBでしたが、現在は 1GBモデルにしています。
 [PHOTO6] このマシンは FDDがなく、IDEは CF用が 1ch しかありません。 さらに、
          NICも network boot に対応していません。 唯一起動可能な ドライブは
          CF (or Microdrive) しかありません。 従って このマシン単体では どん
          な OSもインストールする ことが不可能 ということになります。 そこで
          PCMCIA I/F を持った Note PCなどで予め OS を CF (Microdrive) に書き
          込み、それを 差し込んで 起動させるという方法を採ります。
          途中の手順は あと回しにして、 とりあえず FreeBSD を Microdrive に
          書き込み、 Serial console の状態に設定して 起動させてみた結果です
          。
          無事 Serial console で起動し、login できる状態に なっています。

dmsgの結果

まず、アップグレードする前、SPモデルとして使っていた当時のdmesgです。 既に当
時のCPUモジュールは手元にないので、当時の記録のままです。 当時は 340MBの
Microdrive で FreeBSD 3.5-RELASE をインストールしていました。
CPU は AMD 486として認識されています。取扱説明書にも i486互換/66MHz と記載さ
れているので、正しく認識されているのでしょう。
内蔵の NIC も それぞれ ISAバス上に ed0, ed1 として認識されて います。 IP ア
ドレスを割り振って 他の PCと通信させてみたところ、 ちゃんと通信もできました
。

      # dmesg
      Copyright (c) 1992-1999 FreeBSD Inc.
      Copyright (c) 1982, 1986, 1989, 1991, 1993
              The Regents of the University of California. All rights reserved.
      FreeBSD 3.5-RELEASE #4: Sun Oct  1 11:08:24 JST 2000
          root@??????.ryuchi.org:/usr/src/sys/compile/COMPAT
      Timecounter "i8254"  frequency 1193182 Hz
      CPU: AMD Unknown (486-class CPU)
        Origin = "AuthenticAMD"  Id = 0x4a4  Stepping = 4
        Features=0x0
      real memory  = 16777216 (16384K bytes)
      avail memory = 14106624 (13776K bytes)
      Preloaded elf kernel "kernel" at 0xc0273000.
      Probing for PnP devices:
      Probing for devices on the ISA bus:
      sc0 not found
      ed0 at 0x300-0x31f irq 10 on isa
      ed0: address 00:30:f5:00:3b:21, type NE2000 (16 bit)
      ed1 at 0x200-0x21f irq 3 on isa
      ed1: address 00:30:f5:00:3b:20, type NE2000 (16 bit)
      atkbdc0 at 0x60-0x6f on motherboard
      atkbd0 irq 1 on isa
      psm0 not found
      sio0 at 0x3f8-0x3ff irq 4 flags 0x10 on isa
      sio0: type 16550A, console
      wdc0 at 0x1f0-0x1f7 irq 14 on isa
      wdc0: unit 0 (wd0): 
      wd0: 342MB (700560 sectors), 695 cyls, 16 heads, 63 S/T, 512 B/S
      vga0 not found
      npx0 on motherboard
      npx0: 387 emulator
      RTC BIOS diagnostic error 20
      changing root device to wd0s1a
      stray irq 7
      #

     irq 7は LPTの割り込みですね。カーネルを構築するときに lpt のデバイ
     スを組み込まなかったため stray しているのでしょう。

SP/32モデル(エンジニアリングサンプル版)にアップグレードして FreeBSD
4.3-RELEASE をインストールしたあとの dmesg です。 アップグレードサービス で
は CPUモジュールがエンジニアリングサンプルでしたので、SP/32モデル とは異なる
かもしれません。 CPU は AMD 486として認識され、内蔵の NIC も それぞれ ISAバ
ス上に ed0, ed1 として認識されています。

      > dmesg
      Copyright (c) 1992-2001 The FreeBSD Project.
      Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
              The Regents of the University of California. All rights reserved.
      FreeBSD 4.3-RELEASE #4: Sun Oct 14 22:22:21 JST 2001
          root@??????.ryuchi.org:/usr/src/sys/compile/NUKU
      Timecounter "i8254"  frequency 1189200 Hz
      CPU: AMD Enhanced Am486DX4 Write-Back (486-class CPU)
        Origin = "AuthenticAMD"  Id = 0x494  Stepping = 4
        Features=0x1
      real memory  = 33554432 (32768K bytes)
      avail memory = 30097408 (29392K bytes)
      Preloaded elf kernel "kernel" at 0xc02a8000.
      md0: Malloc disk
      npx0:  on motherboard
      npx0: INT 16 interface
      isa0:  on motherboard
      ata0 at port 0x1f0-0x1f7,0x3f6 irq 14 on isa0
      sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
      sio0: type 16550A, console
      ed0 at port 0x300-0x31f iomem 0xd8000 irq 10 on isa0
      ed0: address 00:30:f5:00:3b:21, type NE2000 (16 bit)
      ed1 at port 0x200-0x21f irq 3 on isa0
      ed1: address 00:30:f5:00:3b:20, type NE2000 (16 bit)
      IP packet filtering initialized, divert enabled, rule-based forwarding disabled, default to deny, logging disabled
      ad0: 1027MB  [2088/16/63] at ata0-master BIOSPIO
      Mounting root from ufs:/dev/ad0s1a
      stray irq 7
      >

     stray irq 7は LPTの割り込みですね。カーネルを構築するときに lpt の
     デバイスを組み込まなかったためです。 今回は Keyboard などのデバイ
     スも 外してしまったので、さらにすっきりした dmesg になっています。

FreeBSDマシンとして

FreeBSDからみれば、これはごく普通のPC/AT互換機です。ちょっと違うのは、 FDD,
Keyboard, Video(MDA/CGA/VGAなど)がなかったり, HDDが Compact Flash (または
Microdrive)になっているなどのちょっとだけ特殊な事情があるだけで、 他は i386
アーキテクチャCPU (AMD 486)を採用し ISAバスを持っている PC/AT 互換機です。
FreeBSD で使うときも Serial console で使えば普通のPC/AT互換機 として使えます
。
そのスペックとしては 下記の様な感じです。

                          SPモデル                 SP/32モデル
      CPU        i486/66MHz (SX互換らしい)  5x86互換/133MHz (FPU内蔵)
      メモリ     16MB                       32MB
      HDD        Compact Flash 16MB (Microdrive対応)
      FDD        None
      キーボード None
      ビデオ     None
      シリアル   1ch
      パラレル   1ch (コネクタは実装されていない)
      NIC        NE2000 互換 x2

FreeBSDのインストール

このマシンは FreeBSDをインストール作業で必須とも言える Video, Keyboard, FDD
または CD-ROMドライブを持っていません。従って単体ではインストールすることが
出来ません。 そこで、 PCMCIAスロットを持った ノートパソコンなどを使って
Compact Flash (または Microdrive 以下 まとめて CFと略)に FreeBSDをインストー
ルしてから それを LAMBに移す 方法でインストールします。 また 付属の16MBでは
かなり工夫しないと容量的に無理ですから (できれば)128MB以上の 容量をもつCFを
使うことになります。
今回は 1GBタイプの IBM製 Microdrive をつかいました。またインストール先は、
SP/32 (エンジニアリングサンプル版)にアップグレードした LAMB ですが、他のモデ
ルでも同じ 手順で可能なはずです。

CFへのインストール

PCMCIAスロットをもった PC/AT互換機の ノートパソコンなど(PCMCIAスロットがある
デスク トップパソコンでもOK 以下あわせて ノートパソコンと表記します)を使って
FreeBSD を 普通にインストールします。(なお、インストールに使うノートパソコン
に FreeBSDがイン ストールされている必要はありません)

CD-ROMから起動できるタイプのノートパソコン
     ノートパソコンの CD-ROMドライブに FreeBSDのインストール用CD-ROMを、
     PCMCIAスロットにCFを入れた状態で 起動させます。
CD-ROMから起動できないタイプのノートパソコン
     CD-ROMに入っている起動用フロッピディスクのイメージファイルから 起動用フ
     ロッピディスクを作成します。作成したフロッピディスクから 起動させます。
     また インストール途中で fixit のFDが必要になります ので、忘れずに作成し
     ておいてください。

無事にFreeBSDのインストーラーが起動したら、メニューに従ってインストールしま
す。 ここで下記の点に注意してインストールしてください。

   * 後ほどカーネルの再構築が必要になるので 必ずカーネルのソースもインストー
     ル する
   * インストール作業をするときは fdiskやインストール先に指定するHDを ノート
     パソコン本体のHDと間違えない様にする
   * インストール先になる CF がどのデバイスで認識されているかチェックしてお
     く

これらの点に注意して 自分の好み、使用する目的にあわせてインストールすればOK
です。

      付属のCF(16MB)では、付属のインストーラを使ってインストールすることは
      不可能です。 しかし 16MBもの容量があれば (限定的な用途に限られますが)
      充分に使えると思います。 具体的には、既に FreeBSDがインストールされて
      いるノートパソコンの PCMCIAスロット に入れて disklabel の作成、newfs
      して、ブートローダ、カーネル(16MBのCFで開発環 境の構築は不可能ですか
      ら 予め作成しておく)や必要なファイルのコピーを行うという 方法でも可能
      です。 (以前、16MBのCFでカーネルと周辺の一部のファイルまでコピーして
      single user mode まで立ち上がることを確認したことがあります)

インストール直後の調整

CFへのインストールが正常に終了したら、 fixit を使って、起動に必要なパラメー
タを 調整します。 インストーラは 当然の様に FreeBSDをインストールしたノート
パソコンの 環境にあわせて設定が行われてしまいます。しかし 実際には違うマシン
で利用すること になるためにそのまま LAMBに移しても多くの場合でうまく起動でき
ません。LAMBで起動 できる様にするための調整が必要となります。LAMBで起動する
と CFは ad0 として認識 されます。例えば ノートパソコン上で ad4 として認識さ
れた場合、これを修正しない とルートファイルシステムがマウントされず、正常に
起動できません。(ad0でインストール できた場合は 2〜4は不要です) ネットワーク
が使えない場合の唯一のコンソール接続口 であるシリアルコンソールが使える様に
修正します。

  1. CFを /mnt にマウントします。 ad4 で認識されていた場合は 下記の様にしま
     す

     mount /dev/wd4s1a /mnt

  2. groupファイルと パスワード関連のファイルを /etc への シンボリックリンク
     を作成します

     cd /etc
     ln -s /mnt/etc/group
     ln -s /mnt/etc/pwd*.db

  3. /etc/fstab のデバイス名のところを ad?xxx から ad0xxx に書き換えます。
     また CD-ROMへの参照があれば削除します。(通常 noautoなので そのままでも
     大丈夫だと思いますが...)

     vi /etc/fstab
     (全てのデバイス名 ad?xxx を ad0xxx に書き換えます)

  4. /dev/ad0* のデバイスを作り直します。

     cd /mnt/dev
     sh MAKEDEV ad0 (またはall)
     (ad0s1a 〜 f が作成されたことを確認します)

  5. シリアルコンソールになる様に /boot/loader.conf を作成します。具体的には
     console="comconsloe" を追加します。

     echo 'console="comsonsle"' >> /mnt/boot/loader.conf

  6. 起動後に getty が com1: (ttyd0) からの login を受け付ける様に /etc/ttys
     を修正します。

     vi /mnt/etc/ttys
     (ttyd0 の行の 'dialup off' の部分を 'unknown on' に書き換えます)

ここまで出来たら, インストーラに戻り, インストールを終了します。

LAMBで起動させる

インストールが完了した CFを LAMBにセットして起動させます。 本体のシリアルポ
ートに クロスケーブルなどで シリアル端末に接続します。 (デフォルトでの)通信
条件は 下記の通りです。

      通信速度 9600bps
      データ長 8bit
      パリティ なし

LAMBに電源を繋ぐと シリアル側に起動メッセージが表示され、com1: (ttyd0) から
login できる様になるはずです。もしうまくできない場合、ケーブルや接続, fixit
などを使って CFの /boot/loader.conf, /etc/fstab, /etc/ttys などを 確認します
。

カーネル再構築

デフォルトのままでは NICが使えず、また内蔵タイマが大きく狂うので、 カーネル
を再構築します。
NICの設定に関するパラメータを設定する。下記の設定では本体の GLOBAL側が ed0,
LOCAL側が ed1 となります。

      ed0 at isa? port 0x300 irq 10 iomem 0xd8000
      ed1 at isa? port 0x200 irq 3 iomem 0xd8000
     注) sio1 を必ず 消すこと。 sio1 の irq 3の設定が ed1と重複するため
     。
     その他 不要なデバイスは消し, 目的に応じて調整する。下記は カーネル
     コンフィグレーションファイルの一例です。(ipfw を使うための設定が追
     加されています)

      machine         i386
      cpu             I486_CPU
      cpu             I586_CPU
      ident           LAMB
      maxusers        64

      #makeoptions    DEBUG=-g                #Build kernel with gdb(1) debug symbols

      options         INET                    #InterNETworking
      options         INET6                   #IPv6 communications protocols
      options         FFS                     #Berkeley Fast Filesystem
      options         FFS_ROOT                #FFS usable as root device [keep this!]
      options         SOFTUPDATES             #Enable FFS soft updates support
      options         MFS                     #Memory Filesystem
      options         MD_ROOT                 #MD is a potential root device
      options         NFS                     #Network Filesystem
      options         NFS_ROOT                #NFS usable as root device, NFS required
      options         PROCFS                  #Process filesystem
      options         COMPAT_43               #Compatible with BSD 4.3 [KEEP THIS!]
      options         UCONSOLE                #Allow users to grab the console
      options         KTRACE                  #ktrace(1) support
      options         SYSVSHM                 #SYSV-style shared memory
      options         SYSVMSG                 #SYSV-style message queues
      options         SYSVSEM                 #SYSV-style semaphores
      options         P1003_1B                #Posix P1003_1B real-time extensions
      options         _KPOSIX_PRIORITY_SCHEDULING
      options         ICMP_BANDLIM            #Rate limit bad replies
      options         KBD_INSTALL_CDEV        # install a CDEV entry in /dev

      options         IPFIREWALL
      options         IPDIVERT

      device          isa

      # ATA and ATAPI devices
      device          ata0    at isa? port IO_WD1 irq 14
      device          ata
      device          atadisk                 # ATA disk drives

      # Floating point support - do not disable.
      device          npx0    at nexus? port IO_NPX irq 13

      # Serial (COM) ports
      device          sio0    at isa? port IO_COM1 flags 0x10 irq 4

      # ISA Ethernet NICs.
      device          ed0     at isa? port 0x300 irq 10  iomem 0xd8000
      device          ed1     at isa? port 0x200 irq 3   iomem ?

      # Pseudo devices - the number indicates how many units to allocate.
      pseudo-device   loop            # Network loopback
      pseudo-device   ether           # Ethernet support
      pseudo-device   sl      1       # Kernel SLIP
      pseudo-device   ppp     1       # Kernel PPP
      pseudo-device   tun             # Packet tunnel.
      pseudo-device   pty             # Pseudo-ttys (telnet etc)
      pseudo-device   md              # Memory "disks"
      pseudo-device   gif     4       # IPv6 and IPv4 tunneling
      pseudo-device   faith   1       # IPv6-to-IPv4 relaying (translation)

      # The `bpf' pseudo-device enables the Berkeley Packet Filter.
      # Be aware of the administrative consequences of enabling this!
      pseudo-device   bpf             #Berkeley packet filter

内蔵タイマの調整を行うために src/sys/i386/isa/clock.c の中で 定義されている
TIMER_FERQ の値を 1189200 に変更 します。 下記は FreeBSD 4.3-RELEASE でのパ
ッチです。他の版では 行の位置が違うかもしれません。

      --- clock.c.orig        Thu Apr 19 08:17:41 2001
      +++ clock.c     Sun Oct 14 21:56:30 2001
      @@ -135,7 +135,7 @@
       int    statclock_disable;
       u_int  stat_imask = SWI_CLOCK_MASK;
       #ifndef TIMER_FREQ
      -#define TIMER_FREQ   1193182
      +#define TIMER_FREQ   1189200
       #endif
       u_int  timer_freq = TIMER_FREQ;
       int    timer0_max_count;

ここまで出来たら、普通にカーネルの再構築を行います。

     cd src/sys/i386/conf
     config 
     cd ../../compile/
     make depend
     make
     make install

カーネルの再構築, インストールができたら 再起動します。 dmesg などを見て NIC
が認識されているか確認します。
あとは 普通にFreeBSDマシンとして使えますので、FreeBSDのドキュメントなど を参
照しながら設定すれば NATルータなどに使用することが可能です。
私は NATルータ、DHCP サーバ、smtp サーバなどに 利用しています。
----------------------------------------------------------------------------
 *1 (株)アスキー UNIX Magazine

 *2 有限会社ワイルドラボでは FD 7枚分と紹介されていますが、私の手元のFDで比
    べたら 8枚分でした

 *3 私は Linuxを起動させて使ったことがないので、実際のところは知りません
    (^^;

NetBSD のインストールについては itojun さんの解説が LAMBの BBSに掲載されてい
ます。

参考文献など

   * UNIX Magazine 2000年 10月号
   * 有限会社ワイルドラボ
   * FreeBSD Handbook
   * FreeBSD Handbook (日本語訳版)

免責 このページの内容は 私が LAMBに FreeBSDをインストールしたときのことをベ
ースに 記述しています。 LAMBでFreeBSDの動作を保証するものではなく、また この
ページを 利用したことによる責は負いません。 実際にインストールするときは各自
の責任にて お願いします。
----------------------------------------------------------------------------
                                                    email: ryuchi@ryuchi.org
                      $Id: lamb.html,v 1.8 2001/11/18 02:38:09 ryuchi Exp $