unixで実現するインターネットサーバ(Free BSD編)

INDEXはこちらinnはこちら


PC unixとしては、FreeBSDをはじめ人気のlinuxなど色々なOSが存在する。
しかしインターネット系のアプリケーションはBSD系が得意なようで、だいたいのソフトはBS
で事が足りる。
もっともLinux人気は大したもので、アプリケーションによってはLinuxが先行する気配も出てきている。
今回は、FreeBSD(2.1.6R)を使ったインターネットサーバ構築のお話だ。
最近はNECのPC98シリーズ用のFreeBSDも登場しているから、特殊なことをやらないのであれば古い98が生き返るチャンスかも知れない。
(apache位は動くと思う)ただし、98にインストールするのはAT互換機にインストールするより数倍は手間のかかる作業になることは確実だ。


Free BSDを使う
現時点(Jan.,1998)では、2.2.5以上の正式リリース版が出ていると思う。
2.1.7以上では、Pentium Proネーティブモードがサポートされたほか、数々の変更が加えられているはずである。
新規インストールには、最新版をお薦めしたい。
(自信のある人はβリリースでも)インストールなどに関しては、他のサイトに豊富な情報があるので多くは触れない。
また、最近は日本語インストーラも登場しているしFreeBSDのCD-ROM付き書籍も数種類出版されているので、それを買ってくれば手間がない。
購入時にはバージョンに注意しよう。
同じ名前の本でも、明らかに古い(長期在庫?)バージョンのCDが付属している場合がある。
日本語インストーラに関して、私は未だに使ったことがないのだが説明は日本語に越したことはないから新規インストールする人には強い見方になるはずだ。
(ただし、上記書籍には付属していないと思うから、欲しい人は別途入手すべし))インストール時に、パーティションの切り方で苦労する(分からない?)事が多いようなので、この点を少々説明しよう。
unixと言うシステムは、ディスクの物理的台数とかディレクトリ構造によらずパーティションによってディスク内部のエリア分けを行っている。
そのパーティションは、ディスク1台に対して8個まで設定可能だ(a〜h) この分け方に関しても色々意見があるようだが、私はSunOSで手慣れた方法と共通化している。
それは、a=/ , b=swap , c=(これは全体と決まっている) , h=/usr , g=/home である。
そのほかにXWindowを別パーティションに分ける場合もあるし、e=/var とする場合もある。
特に2台以上のハードディスクが接続されている場合には、2台目の a=/var , b=/tmp などと設定する事もあるわけだ。
(a,b,c以外は自由って事)(SunOSなどでは、スワップパーティションを2台のディスクに分けることでパフォーマンスが向上するし、同時に/tmp
をメモリ中に(仮想)マウントすればさらに速くなる。

ちなみに、1台のIDEハードディスクを使って動かしているPCのパーティションは以下のようになっている。
(RAMは64MB,ヘビーな環境用ではありません)
wd0
a / 32MB
b (swap) 130MB
c
d
e /var 100MB
f
g /home 600MB
h /usr 600MB
ここではIDEディスクを使用しているが、wwwサーバやNewsサーバのようにハードディスクアクセスが多い用途にはSCSIディスクの使用をお勧めしたい。
最も問題が少ない(と,思う)のはAdaptecの2940xxシリーズだ。
これはバスマスタタイプなので、CPUを割り込み処理から解放してくれる。


その1:WWW Server
インターネット関連機能の目玉といえば、WWWサーバだ。
ここでは、全世界でのシェアNo1と言われるフリーのソフト、APACHEをインストールすることにする。
このAPACHE,ソースが公開されているし、色々なオプションモジュールが用意されており商用サイトでの使用実績も多いと言われている。
FreeBSDのCD-ROMの中には、apacheのバイナリが含まれている。
(portsにある)インストール時にインストーラ任せで組み込んでも良し、後からCD-ROMをマウントしてコピーしても良い。
gzipで解凍してtarで展開すれば、そのものズバリが組み込まれるから、設定ファイルを書き換えるだけで実行にこぎ着けられる。
設定ファイルは通常だと(CD-ROMに含まれるものはソースファイルがないものがあり、作成されるディレクトリ名に違いがあるものも存在する)./confの中に作成されているはずである。
まずは、./confディレクトリで3つのconfigファイルを編集する。
これらファイルをエディタで開いて見れば、設定例とともに説明が書いて有るので決して難しい設定ではない。
詳しくはこちらにゆずる。
設定が終了したら、httpdを実行すればよい。
これでhttpサーバが稼働する。
前記configファイルで設定されたディレクトリが、wwwホームディレクトリとなり,同様に(通常は)index.htmlが最初に読み込まれるhtmlファイルである。
個人の実験用とする場合は特に他の設定は必要ないが、よりヘビーな環境(イントラなど)で使用する場合はKernel configurationを変更すべきだと思う。
変更点は以下の通りmaxusers 256 # Network options. NMBCLUSTERS defines the number of mbuf clusters and # defaults to 256. This machine is a server that handles lots of traffic, # so we crank that value. options NMBCLUSTERS=4096 # mbuf clusters at 4096 options CHILD_MAX=512 # maximum number of child processes options OPEN_MAX=512 # maximum fds (breaks RPC svcs) これらを変更してKernelを作り直せば完了だ。
ところでWebサーバが必要とするハードウエアだが、cgiを動かさないのであれば486クラスのCPUと16MB程度のメモリで十分である。
もしも多くのユーザをサーバ内に収容し、cgiを許可する場合にはCPUパワーよりもメモリを多く実装すべきである。
例えば2Mバイトのデータ処理を行うcgiだと、スクリプトの書き方にもよるが数十メガバイトのメモリを消費するケースもある。
もちろんPerlが動作している間はCPUパワーも多く消費する。
もしもswapが起きるとすると、その間のユーザプログラム処理速度は低下し−>次々にcgiのリクエストがかかり−>スワップが多発し−>パフォーマンスが低下する,と言う悪循環に陥る。
Pentium 200MHzクラスのCPUであれば、256MB以上のメモリを確保しておきたい。
(最近のチップセットは64MB以上のメモリに対してL2キャッシュが効かない場合があるので注意)

その2:perlインタプリタ
wwwサーバが動き始めたら、perlを入れてみたくなるだろう。
そう、cgiを使うためのインタプリタだ。
これのインストールはapacheよりは少しだけ手間がかかる。
理由は、使用するシステムに合わせてコンパイルしなくてはならないからだ。
これもFreeBSDのインストール時に組み込めば手間はない。
最新のPerlが欲しい場合はソースを持ってきてコンパイルするか?portsをチェックしてみよう。
perlのソースはこちらで入手可能だ。
ファイルをダウンロードしたら、適当なディレクトリで解凍する(たとえば/usr/localに置いて、gzi
-d perl-5.003.tar.gz)そして、tarで展開する(tar xvf perl-5.003.tar)とperl5.003ディレクトリが作成されて、各種ファイルができあがる。
さて、コンパイル作業だ。
1.sh Configure -de
  (optionの -desは非問い合わせモードの設定)2.mak
3.make tes
4.make instal
の順番で実行する。
FreeBSDの場合は、まず間違いなくノーエラーで終了するはずだ。
いくつかのワーニングと、大量のメッセージが出力されるが気にしない。
(4)まで終了すると/usr/bin/perl が出来上がっているはずである。
ここまでの時間はPentium Pro-200で3分程度である。
後はcgiファイルからperlを呼ぶだけでよい。
デーモンではないから特別実行させる等の作業は必要ない。


その3:bind
これもFreeBSDのインストール時に自動的に組み込まれているはずである。
バージョンもそこそこ新しいはずだから、無理に組み替える必要はないと思う。
まあbindをインストールする場合でも、ほとんどMakefileを触らずにコンパイルできるはずだからあまり心配はいらない。
しかし、DNS自体の設定を行わなくてはいけない。
インストールに比較すると、数倍面倒なこの作業はこちらで説明する。


その4:pppd
シリアルポートを使用して、pppを行おうとするときに使用するのがpppdやiij-pppだ。
ダイアルアップ接続のスタンダードはiij-pppに移行している感がある。
しかし、ダイアルインサーバとして動作させるならpppdの方がよいのではないかと思う。
標準の2ポートシリアルで2回線分(当たり前),拡張シリアルを使用することもできるが、注意すべき点は、シリアル速度と割り込みリソースだ。
115.2Kbpsのシリアルを、拡張カード2枚を挿して合計6回線も確保すると処理速度的に厳しいかも知れない。
そこで、インテリジェントタイプのマルチシリアルカードを使ってpppを実装してみた。
pppd自体は、FreeBSDに実装されているものを使用する。
設定ファイルは/etc/ppp の中に、options 及び options.ttyname の2種類を用意する。
まずはoptionsの設定ファイルだ。
/etc/ppp/options の中身netmask 255.255.255.0 proxyar
name hostnam
domain mydomai
crtsct
115200 mode
+pa
-cha
logi
-detac
次に、options.ttynameを設定する。
例えば、標準シリアルポート(com1)だと、options.ttyd0になり、拡張シリアルカードの場合にはoptions.ttyc0などになるはずだ。
/etc/ppp/options.ttyd0 の中身myhost.xxx.xxx.xxx remotehost.xxx.xxx.xxx
この一行である。
例えば、自分のマシンのIPアドレスが192.168.100.50で、pppで接続してきた先に与えるアドレスが192
168.100.100の場合には、192.168.100.50 192.168.100.100 と書けばよい。
さらに、pppdの実行を/etc/ttysで行わせるため、以下のように編集する。
ttyd0 "/usr/sbin/pppd" dialup o
これでttyd0に対するpppdが実行されたはずだ。
(変更後はkill -1 1 をやること)同様に、10ポート有れば10ポート分のpppdを実行させる。
これで、Win95相手にppp接続が可能になり特別なスクリプトを必要とせず認証が行われる。

ダイアルアップサーバはWin95での実行できるしWinNTを使う手もある。
しかし、Win95やWinNTを動作させるためにはPentium級のCPUと最低でも16MBのRAMが必要だ。
それに対してFreeBSDなら486DX2-66程度のCPUに8MBもRAMが積んで有れば十分動作する。
ファイル転送に関してもマイクロソフトネットワークのようにオーバヘッドが重くないftpを使えば、電話回線を使ってのファイル転送は非常に楽に行える。
また、Telnetでログインすればダイアルインサーバをリブートしたり設定を変更するのも簡単だ。


その5:マルチシリアルカードを使う
PC用マルチシリアルカードは、数社から発売されている。
8ポート以上のもので有れば、殆どはインテリジェントタイプでありRISC CPU等が搭載されていると思う。
さてFreeBSD用として何が良いかであるが、Cyclom-8Yと言うものがある。
コイツはFreeBSD2.x以上で有れば、標準カーネルのみで対応してくれる。
つまり、特別なドライバが不要なわけだ。
カーネルリメークについては色々なサイトで紹介されているだろうし、簡単なのでここでは省略するが、/usr/src/sys/i386/conf/GENERIC ファイルに、次の一行を加えてコンパイルするだけである。
device cy0 at isa? tty irq 10 iomem 0xd4000 iosiz 0x2000 vector cyint
上記設定例では、IRQ=10,Memory=0xd4000 に設定している。
一つ注意する点は、BIOS設定でこのメモリエリア(d4000)を有効にする事とcacheしないようにする事である。
この設定が間違っていると、原因不明(って、原因は設定なんだけど)のハングアップなどに悩まされる事になる。
カーネルリメークが終われば、デバイスファイルの作成に入る。
標準デバイスのttyd0,ttyd1,cuad0.....などは/devディレクトリに有るはずだが、Cyclom-8Y用のttyc0〜ttyc7(8ポート分)は新たに作らなくてはいけない。
なんだ、じゃあさっそくMAKEDEVで..と思った方、それでは出来ない。
MAKEDEVは元があって、そこから各種デバイスを作るものだからだ。
(FreeBSDのバージョンによってこのあたりは異なるようである)答えは、mknodを使うのだ。
mknod ttyc0 0 0(0番目のデバイスの場合)mknod cuac0 0 0 と、14回繰り返す。
その後/dev/MAKEDEV ttyc0 , /dev/MAKEDEV cuac0 としてデバイスファイルを生成するわけだ。
そして、これらポートのイニシャライズは/etc/rc.serialで行われるから、/etc/rc.serialのCyclom用のコメントアウトされた一行を生かせば、再起動時にイニシャライズされて使用可能になる。
/etc/rc.serial (修正部分のみ)# Initialize all ports on Cyclades-8y
modem c c 0 1 2 3 4 5 6 7 ここまで来れば、後は標準のttyd0などと全く同様に使用できる。
マルチチャネルのBBSも組めるし、プライベートな(イントラに毛の生えた?)wwwサーバも電話回線でアクセスできる。


おまけ
カーネルリメークのやり方は、/usr/src/sys/i386/con/GENERIC を適当な名前に変えてコピーする。
cp GENERIC com_server (ここでは、仮にcom_serverと言う名前とした)コピーしたcom_serverを編集して、余計な部分(CPUタイプなど)をコメントアウトする。
他にも不要なSCSIやNetworkデバイスなども、どんどんコメントアウトしよう。
これによってカーネルサイズはかなりコンパクトになるはずだ。
また、Cyclim-8Yなどの必要なドライバオプションを書き込むことも忘れてはいけない。
FreeBSD起動時の画面をよく観察しながら、エラーの出ている行をメモしてそれらを削除すればだいたい良いはずである。
エディットが完了したら/usr/sbin/config com_serve
で、configするとcom_serverと言う名前のディレクトリが作成されてコンパイルの準備が整う。
まずはそのディレクトリに移動する。
cd ../../compile/com_serve
移動したら、次の2つのコマンドを実行する。
make depen
mak
これで、com_server ディレクトリにkernelが出来上がる。
(数分かかる)このkernelを使用してrebootすればよいのだが、もし間違ったkernelが出来上がっていると二度とブート出来なくなってしまう。
安全のために、コピーを作っておこう。
cp /kernel /kernel.or
そして、kernelを入れ替える。
cp kernel /kerne
注:kernelをcpで"/"にコピーするのは余りやらないようです。
  make install を行うことによって      chflags noschg /kernel       mv /kernel /kernel.orig       cp kernel /kerne
      chflags schg /kerne
  これらの事を全部行ってくれます。
上記作業が済んだら、神に祈って?リブートする。
sync;sync;reboo
無事に立ち上がったろうか?どこかで引っかかって、待てども立ち上がらない場合にはコピーしておいたオリジナルカーネルを使用して立ち上げる。
ブート時のboot の、プロンプトに対してwd(0,a)/kernel.org (wdはハードディスクのデバイス名、SCSIの場合には違うよ)で、起動した後kernelを修正しよう。