古いPCをルータにする上でネックになるのは信頼性です。その中でも最も信頼のおけないのはハードディスクでしょう。わが家のルータは486DX-33MHz(IBM PSV2045)という骨董品です。今の所は内蔵の340MハードディスクにVine Linux1.1をインストールして使っていますが、年代物のためそのうちクラッシュに見舞われるのは必至(^^)です。
そこで、1FDルータを試作してみました。お粗末な代物ですが、皆様のたたき台にと思って公開してみます。
1フロッピールータの作り方
Plamo Linux 1.43のブートディスクに含まれるinitrd.gzに変更を加えていきます。DownloadPlamoのインストールディスクはFATのイメージなので、mount -t msdos /dev/fd0 /somewhereして下さい。
initrd.gzを/tmpにコピーし、gzip -d initrd.gzとして展開します。
できたinitrdをmount -t ext2 /tmp/initrd /hoge -o loopとして/hogeにマウントします
(Kernel configurationでloop back device = y or mとする必要がありますが、たいていのディストリビューションではデフォルトのままでOKです)。これ1枚でいろんなことができるLinuxですから、たくさんのファイルがありますが、ルータとしてはほとんど不要なので思い切って捨てましょう。そうしないとipfwadmなどが追加できません。
デフォルトではinsmodやipfwadmなど、大事なファイルがないので追加します。
ブートディスクにあるライブラリはld.soとlibc.so.4.7.6だけなので、makeの時staticなバイナリを作らないとライブラリが足らんと怒られます。insmodはVineのディストリビューションにinsmod.staticというのがなぜかあるので、これをそのまま使っています。
staticなipfwadmをMakeする方法は以下のとおりです。
Makefileを
CC = gcc -static
に変更。
あとは、普通にmakeするだけです。staticなバイナリであるかどうかは、ldd hogeすればわかります。
ネットワークの設定に関係するファイルは、/etc/rcと/rc.d/rc.inet1の二つです。
mnt以下にはinitrdのイメージが展開されているので、ファイルを追加・削除します。
その後、umount /mnt --> gzip -c initrd >initrd.gzとして元に戻します。MS-DOSの起動ディスクに、initrd.gzとvmlinuzをコピーします。
loadlin vmlinuz initrd=initrd.gz root=/dev/ram0 ether=5,0x300,eth0 ether=3,0x280,eth1で起動します。
実験機のNICはISAのNE2000コンパチで、一枚目がIRQ=5, IO=300、二枚目がIRQ=3、IO=280となっています。
もちろん、IRQやIOは自分の環境に合わせて変更して下さい。
うまくいったら、autoexec.batに書き込みましょう。/etc/rcは以下のとおりです。
#!/bin/sh # remove /etc/mtab* so mount creates the /etc/mtab file /bin/rm -f /etc/mtab* /etc/nologin /var/run/utmp echo -n "" >> /etc/utmp echo -n "" >> /etc/utmp /bin/mount -av -t nonfs /bin/rm -f /usr/spool/uucp/LCK* /bin/rm -f /auto/run/* #NICの初期化 #NE2000はカーネルに組込み済 #/sbin/insmod /lib/modules/2.0.36/net/tulip.o #/sbin/insmod /lib/modules/2.0.36/net/3c509.o #/sbin/insmod /lib/modules/2.0.36/net/ne2k-pci.o #/sbin/insmod /lib/modules/2.0.36/net/wd.o if [ -x /etc/rc.d/rc.inet1 ]; then #ホストネームの設定 /bin/hostname -S router.takasaki.com #ネットワークの初期設定のスクリプトを実行 /bin/sh /etc/rc.d/rc.inet1 fi /bin/mount /proc /proc -t proc 1> /dev/null 2> /dev/null #ip_masq_の追加 /sbin/insmod /lib/modules/2.0.36/ipv4/ip_masq_cuseeme.o /sbin/insmod /lib/modules/2.0.36/ipv4/ip_masq_ftp.o /sbin/insmod /lib/modules/2.0.36/ipv4/ip_masq_irc.o /sbin/insmod /lib/modules/2.0.36/ipv4/ip_masq_quake.o /sbin/insmod /lib/modules/2.0.36/ipv4/ip_masq_raudio.o /sbin/insmod /lib/modules/2.0.36/ipv4/ip_masq_vdolive.o/etc/rc.d/rc.inet1は以下のとおりです。# Attach the loopback device. /sbin/ifconfig lo 127.0.0.1 /sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo #eth0の設定 IPADDR01="192.168.0.200" NETMASK01="255.255.255.0" NETWORK01="192.168.0.0" BROADCAST01="192.168.0.255" #eth1の設定 IPADDR02="192.168.5.200" NETMASK02="255.255.255.0" NETWORK02="192.168.5.0" BROADCAST02="192.168.5.255" #default gatewayの設定 GATEWAY="192.168.0.10" #ルーティングテーブル /sbin/ifconfig eth0 ${IPADDR01} broadcast ${BROADCAST01} netmask ${NETMASK01} /sbin/ifconfig eth1 ${IPADDR02} broadcast ${BROADCAST02} netmask ${NETMASK02} /sbin/route add -net ${NETWORK01} netmask ${NETMASK01} eth0 /sbin/route add -net ${NETWORK02} netmask ${NETMASK02} eth1 if [ ! "$GATEWAY" = "" ]; then /sbin/route add default gw ${GATEWAY} netmask 0.0.0.0 metric 1 fi
以上の方法で作ったたたき台のファイルは以下にあります。
initrd.gz.config(Kernel configのサンプル)
vmlinuz (Kernel2.0.36):NICは私の環境に合わせてISAのNE2000のみ組み込みです。 あと数種類(tulip.o 、3c509.o、ne2k-pci.o、wd.o)はmoduleになっています。
最低限のルータとしての機能は確認してあります。他に良いアイデアがありましたらお教え下さい。まとめ
pingとnetstatがない、おまけにsyslogもないのでなんとかしたい。
gcc -staticでmakeすると途方もなく大きなファイルになるので入れられない(涙)
とりあえずルーターとしての働きはします。あとはipfwadmでファイアーウォールの設定をするだけです。実用にはなりますが、いまいちまとまりがない(^^) あくまでも素人の行った実験とご理解ください。
もっとよくできた1FDルータ
FloppyfwというDebian-Kernel2.2.12ベースの素晴らしい1フロッピールータもあります。こちらの方が完成度も高くおすすめですが、私のような素人にはいじりにくいのが欠点?です。
このページの日本語版を作成しました。作者のThomasさんの許可を得てここに置いてあります。
第3回高知Linuxユーザ会・ 第11回高知ネットワーク研究会
1999.12.11
全てのソフトウェアはSlackware, Plamo Linux, Vine Linuxの配布ファイルであり、私には著作権はありません。
エーアイムック231「楽しくやがて哀しきジャンクの世界:ジャンクの花園」
p121-122に紹介されている「フロッピーオンリーのルータを作る」を全面的に参考にしました。
1999.12.11