ここのところ、やりたいことはあっても、実際には特に管理関係ではいじって なかったので書くことがなかったんです。でも、このたびウチにももう一台 PC を購入しちゃったんで、家庭内 LAN を構築してみようと思う。ひさびさに Linux のカーネルパッチ (2.0.30) も出たことだしね。
新たに購入した PC は IBM の aptiva J51 です。しかぁし、こいつは理由あって Windows95 専用で す。
というわけで(何がだ!)、とりあえず物理的に継ぎ、Network カードを Linux に認識させる為にカーネルを再構築して、その後に DHCP サー バを Linux に入れてみます。つまり、これで Windows95 に対しては、 動的に IP アドレスを与えます。
まずは物理的な接続。Linux のほうは Laneed (ELECOM) の LD-NE20/2T です。 これは NE2000 互換品です。Windows95 のほうは 3COM の 3C509B-TP です。ま た二つの PC 間はハブは使用しないでクロスケーブルを使用します。たった二 台を継ぐのにハブはもったいないのでね。:-)
まず二つの PC の箱を開けて Network カードを差し込む。んでもって箱を閉 じて、クロスケーブルで継いで、PC を二台とも立ち上げてみる。
Windows95 のほうは PnP なので勝手にドライバを読み込み始 めた。でも Linux のほうは流石にそうはいかない。カーネルを再構築しなけ れば Network カードを認識はしてくれない。
ここだけ 見ると Windows95 のほうが楽かも しれないなぁ…。
さて、カーネルの再構築をしますか。もちろん最近出た 2.0.30 のパッチを当 ててね。
まずはカーネルのソースにパッチをあてる。
cipher:~# ls -l patch-2.0.30.gz -r--r--r-- 1 root root 293692 Apr 9 21:15 patch-2.0.30.gz cipher:~# file patch-2.0.30.gz patch-2.0.30.gz: gzip compressed data, deflated, original filename, last modified: Wed Apr 9 01:05:18 1997, max compression, os: Unix cipher:~# gzip -dc patch-2.0.30.gz | (cd /usr/src/; patch -p0 -s)続いてソースディレクトリの名前を変更しときましょ。
cipher:~# cd /usr/src/ cipher:~# ls -ld linux* lrwxrwxrwx 1 root root 12 Feb 9 22:19 linux -> linux-2.0.29 drwxr-xr-x 15 root root 1024 Apr 10 21:39 linux-2.0.29 cipher:~# mv linux-2.0.29 linux-2.0.30 cipher:~# ln -fs linux-2.0.30 linux cipher:~# ls -ld linux* lrwxrwxrwx 1 root root 12 Apr 10 21:40 linux -> linux-2.0.30 drwxr-xr-x 15 root root 1024 Apr 10 21:39 linux-2.0.30さて次は make config をかける。これは今までと同じで、私はログを 残したい一心で make config を選択してしちゃってます。あと kernel をどのように構築するかですが、今回から Network カードも 組み込みます。また後に IP Masquerade もやりたいので、それも組み込みま す。それ以外は基本的には今迄通りです。もちろん RAMDISK もサポー トにいれます。
構築自体はいつもと同じです。
最初に make mrproper をして、一度徹底的なクリーンをしてから make config を実行しています。その後、make dep;make clean をしてから make zdisk を実行して一度 floopy に 新しい kernel を入れてます。最後に make modules と make modules_install を実行してモジュールをインストールしました。
そしてできたよ、できましたよ。私の新しい cipher が、
cipher:~# uname -a Linux cipher 2.0.30 #1 Fri Apr 11 20:48:58 JST 1997 i586 cipher:~# cat /proc/version Linux version 2.0.30 (root@cipher) (gcc version 2.7.2.1) #1 Fri Apr 11 20:48:58 JST 1997さて、では lilo に追加しましょ。
cipher:~# mv /usr/src/linux/arch/i386/boot/zImage /vmlinuz_2.0.30 cipher:~# chmod 400 /vmlinuz_2.0.30 cipher:~# vi /etc/lilo.conf cipher:~# /sbin/lilo -v LILO version 19, Copyright 1992-1996 Werner Almesberger Reading boot sector from /dev/hda Merging with /boot/boot.b Boot image: /vmlinuz_2.0.30 Added linux * Boot image: /vmlinuz_2.0.0 Added linux_2 Boot other: /dev/hda1, on /dev/hda, loader /boot/chain.b Added dos /boot/boot.0300 exists - no backup copy made. Writing boot sector.上記のラベル linux が今入れた 2.0.30 で linux_2 は 2.0.0 です。今となっては要らないんですが、名残りということで、 一応残しているんです。f(^^;
ちなみに以下が私の /etc/lilo.conf です。
# LILO configuration created by QuickInst 0.17 Fri Nov 1 23:19:45 JST 1996 # # Start LILO global section boot = /dev/hda compact delay = 30 # optional, for systems that boot very quickly vga = normal # force sane state # ramdisk = 0 # paranoia setting, but old options append = "mem=96M" # appends the options (memory size) # End LILO global section # ###### # Linux 2.0.30 bootable partition config begins image = /vmlinuz_2.0.30 root = /dev/hdb2 label = linux read-only # Non-UMSDOS filesystems should be mounted read-only for checking ###### # Linux 2.0.0 bootable partition config begins image = /vmlinuz_2.0.0 root = /dev/hdb2 label = linux_2 read-only # Non-UMSDOS filesystems should be mounted read-only for checking # Linux bootable partition config ends ###### # DOS bootable partition config begins other = /dev/hda1 label = dos table = /dev/hda # DOS bootable partition config ends ######今迄は Windows95 をデフォルトにしていましたが、もう一台の PC が Windows95 専用となった今、Linux がデフォルトになっています。
さて、言ってみれば、ココまでは前準備。
では、家庭内 LAN のために Network カードがちゃんと認識できているかを確 認しましょう。立ち上げたときのメッセージ、もしくはコマンド dmesg で確 認できます。
私の場合は
NE*000 ethercard probe at 0x300: 00 60 52 03 2f d7 eth0: NE2000 found at 0x300, using IRQ 3.というメッセージが出ていました。ちなみに
cipher:~# cat /proc/interrupts 0: 7769312 timer 1: 21065 keyboard 2: 0 cascade 3: 784 NE2000 4: 18209 + serial 12: 16035 PS/2 Mouse 13: 1 math error 14: 152298 + ide0 15: 0 + ide1となっていますので、IRQ は 3 を使用して、認識しているみたいです。 私の場合はモデムは ttyS0 (cua0) を使用していますので構いませんが、 ttyS1 (cua1) を使用していたら、もしかしたらモデムで使用する serial の IRQ とぶつかったかもしれませんね。
Network カードが認識できていることが確認できたら、次は実際に IP アドレ スを与えてみる。設定の為に修正するファイルは /etc/hosts と /etc/rc.d/rc.inet1 と /etc/networks だ。ちなみに私の Linux では DNS サーバは動かしていません。(近いウチにするかもし れないけど…)
まずは /etc/hosts から。
cipher:~# grep '^[^#]' /etc/hosts 127.0.0.1 localhost 192.168.0.1 cipher.king.or.jp cipher www.king.or.jp 192.168.0.10 dhcp00.king.or.jp dhcp00 192.168.0.11 dhcp01.king.or.jp dhcp01 192.168.0.12 dhcp02.king.or.jp dhcp02 192.168.0.13 dhcp03.king.or.jp dhcp03 192.168.0.14 dhcp04.king.or.jp dhcp04 192.168.0.15 dhcp05.king.or.jp dhcp05127.0.0.1 は localhost のまま。192.168.0.1 を cipher の IP アドレスとして使用するようにしました。 192.168.0.10 から 192.168.0.15 は DHCP を入れた場 合に備えて、一応設定しておきます。
次に /etc/rc.d/rc.inet1 である。
cipher:~# grep '^[^#]' /etc/rc.d/rc.inet1
HOSTNAME=`cat /etc/HOSTNAME`
/sbin/ifconfig lo 127.0.0.1
/sbin/route add -net 127.0.0.0
IPADDR="192.168.0.1" # REPLACE with YOUR IP address!
NETMASK="255.255.255.0" # REPLACE with YOUR netmask!
NETWORK="192.168.0.0" # REPLACE with YOUR network address!
BROADCAST="192.168.0.0" # REPLACE with YOUR broadcast address, if you
# have one. If not, leave blank and edit below.
/sbin/ifconfig eth0 ${IPADDR} broadcast ${BROADCAST} netmask ${NETMASK}
/sbin/route add -net ${NETWORK} netmask ${NETMASK}
えっと、これは、つまり、今迄は一台だけだったので
HOSTNAME=`cat /etc/HOSTNAME` /sbin/ifconfig lo 127.0.0.1 /sbin/route add -net 127.0.0.0しか行なわなかったのだが、これからは
/sbin/ifconfig eth0 192.168.0.1 broadcast 192.168.0.0 netmask 255.255.255.0 /sbin/route add -net 192.168.0.0 netmask 255.255.255.0の二行も実行されるようにする。さて、次に /etc/networks だ。これ は絶対に必要なモノではない。つまり設定しなくてもとりあえず問題はないだ ろう。
cipher:~# grep '^[^#]' /etc/networks loopback 127.0.0.0 localnet 127.0.0.0 privatenet 192.168.0.0さて、これで OK のハズ。一度 Linux をリブートしてちゃんと設定されてい るか確認しよう。確認にはコマンド ifconfig と netstat を 使用します。
cipher:~# /sbin/ifconfig -a
lo Link encap:Local Loopback
inet addr:127.0.0.1 Bcast:127.255.255.255 Mask:255.0.0.0
UP BROADCAST LOOPBACK RUNNING MTU:3584 Metric:1
RX packets:3229 errors:0 dropped:0 overruns:0
TX packets:3229 errors:0 dropped:0 overruns:0
eth0 Link encap:10Mbps Ethernet HWaddr 00:60:52:03:2F:D7
inet addr:192.168.0.1 Bcast:192.168.0.0 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:143 errors:0 dropped:0 overruns:0
TX packets:663 errors:0 dropped:0 overruns:0
Interrupt:3 Base address:0x300
cipher:~# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
privatenet * 255.255.255.0 U 1500 0 0 eth0
loopback * 255.0.0.0 U 3584 0 0 lo
cipher:~# netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.0.0 0.0.0.0 255.255.255.0 U 1500 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 3584 0 0 lo
よ〜し、ちゃんと認識できているじゃない。エライ、エライ。では、このまま DHCP サーバの立ち上げまでやっちゃおっと。おっと、 コレを設定する前に net-tools-1.32-alpha.tar.gz を入れておく必要 があるんだった。
Linux のカーネルが 2.0.0 になったとき、/proc/net のエン トリも変更になっているので、1.2.13 からバージョンアップしてきた 私の場合は、本来 net-tools-1.32-alpha.tar.gz はとっくにインストー ルしてなければならなかったんです。今迄は特に問題なかったんで古いままで した。
良い機会だからインストールしちゃいます。なお Slackware 3.1 等の 最初からカーネルが 2.0.x の場合は、たぶん net-tools-1.32-alpha.tar.gz は既にインストールされているハズで すので、新たにこれをインストールする必要はないです。
まずは展開から。モノは /tmp に展開します。
cipher:~# ls -l net-tools-1.32-alpha.tar.gz -r--r--r-- 1 root root 132279 May 27 1996 net-tools-1.32-alpha.tar.gz cipher:~# tar xfz net-tools-1.32-alpha.tar.gz -C /tmp cipher:~# cd /tmp/net-tools-1.32-alpha/ cipher:~# ls CHANGES README configure.sh lib patches COPYING TODO hostname.c man rarp.c INSTALLING arp.c ifconfig.c netstat.c route.c Makefile config.in ipfw.c nlsインストールは
cipher:~# make cipher:~# make installで OK です。なお最初に色々と質問が出て来ます。私は良く判っていないので すが、とりあえず全て y にしてみました。
ところが、私の場合は少しソースを修正しなければコンパイルできずにエラー となってしまいました。カーネルが 2.0.30 だからか、libc が 5.4.13 だからかだと思うんですが、良く分りません。とりあえず 失敗したところは
gcc -O2 -Wall -fomit-frame-pointer -I. -I/tmp/net-tools-1.32-alpha -c masq_info.c -o masq_info.o In file included from masq_info.c:40: /usr/include/linux/ip_fw.h:253: field `timer' has incomplete type make[1]: *** [masq_info.o] Error 1でした。ソースと include ファイルを見てみると、どうやら <linux/ip_fw.h> の前に <linux/timer.h> がい るみたいです。修正したファイルは netstat.c と lib/masq_info.c の二つです。
--- netstat.c~ Sat May 18 03:27:44 1996 +++ netstat.c Sat Apr 12 14:30:56 1997 @@ -66,6 +66,7 @@ #include <linux/tcp.h> #include <linux/udp.h> #include <linux/if.h> +#include <linux/timer.h> #include <linux/ip_fw.h> #include "net-support.h" #include "pathnames.h" --- masq_info.c~ Fri Mar 22 19:12:39 1996 +++ masq_info.c Sat Apr 12 14:28:49 1997 @@ -37,6 +37,7 @@ #include <linux/tcp.h> #include <linux/udp.h> #include <linux/if.h> +#include <linux/timer.h> #include <linux/ip_fw.h> #include "net-support.h" #include "pathnames.h"これで無事にコンパイルとインストールができました。
でもって、おまちかねの DHCP サーバのインストールです。モノは DHCPD-BETA-5.15.tar.gz を使用しました。これは ftp://ftp.isc.org/isc/dhcp/ にあります。というか、私のときはありました。
それと DHCP サーバのインストールについては、 Linux DHCP Server & Client Install memo を見てみることを御勧めします。
ではでは、早速インストールしちゃいます。まずは /tmp に展開。
cipher:~# tar xfz DHCPD-BETA-5.15.tar.gz -C /tmp cipher:~# cd /tmp/DHCPD-BETA-5.15/ cipher:~# ls Makefile.dist convert.c dhcpxlt.c options.c README db.c dhctoken.h osdep.h RELNOTES dhclient.c dispatch.c packet.c TODO dhcp.c doc print.c alloc.c dhcp.h errwarn.c raw.c bootp.c dhcpd.8 hash.c site.h bpf.c dhcpd.c hash.h socket.c cdefs.h dhcpd.cat8 includes tables.c cf dhcpd.conf inet.c tree.c configure dhcpd.conf.5 inet.h tree.h conflex.c dhcpd.conf.cat5 memory.c upf.c confpars.c dhcpd.h nit.c次に configure を実行します。
cipher:~# ./configure System Type: linuxで、make なんですが、そのままだと -g でコンパイルされちゃ います。私の場合は make のオプションに DEBUG=-O2 を付け ました。
cipher:~# make DEBUG=-O2 cc -O2 -c dhcpd.c -o dhcpd.o cc -O2 -c dhcp.c -o dhcp.o cc -O2 -c bootp.c -o bootp.o cc -O2 -c conflex.c -o conflex.o cc -O2 -c confpars.c -o confpars.o cc -O2 -c db.c -o db.o cc -O2 -c options.c -o options.o cc -O2 -c errwarn.c -o errwarn.o cc -O2 -c convert.c -o convert.o cc -O2 -c tree.c -o tree.o cc -O2 -c memory.c -o memory.o cc -O2 -c alloc.c -o alloc.o cc -O2 -c print.c -o print.o cc -O2 -c hash.c -o hash.o cc -O2 -c tables.c -o tables.o cc -O2 -c inet.c -o inet.o cc -O2 -c dispatch.c -o dispatch.o cc -O2 -c bpf.c -o bpf.o cc -O2 -c packet.c -o packet.o cc -O2 -c raw.c -o raw.o cc -O2 -c nit.c -o nit.o cc -O2 -c socket.c -o socket.o cc -O2 -c upf.c -o upf.o cc -o dhcpd dhcpd.o dhcp.o bootp.o conflex.o confpars.o db.o options.o errwarn.o convert.o tree.o memory.o alloc.o print.o hash.o tables.o inet.o dispatch.o bpf.o packet.o raw.o nit.o socket.o upf.o cc -O2 -c dhclient.c -o dhclient.o cc -o dhclient dhclient.o options.o errwarn.o convert.o tree.o memory.o alloc.o print.o hash.o tables.o inet.o dispatch.o bpf.o packet.o raw.o nit.o socket.o upf.o cc -O2 -c dhcpxlt.c -o dhcpxlt.o cc -O2 -c xconflex.c -DOLD_LEXER cc -o dhcpxlt \ dhcpxlt.o errwarn.o convert.o tables.o inet.o xconflex.o \ hash.o alloc.o \で、あとは
cipher:~# make install
install dhcpd /usr/sbin; chmod 755 /usr/sbin/dhcpd
if [ ! -d /usr/man/man8 ]; then \
mkdir /usr/man/man8; \
chmod 755 /usr/man/man8; \
fi
if [ ! -d /usr/man/man5 ]; then \
mkdir /usr/man/man5; \
chmod 755 /usr/man/man5; \
fi
if [ ! -d /var/dhcpd ]; then \
mkdir /var/dhcpd; \
chmod 755 /var/dhcpd; \
fi
install dhcpd.cat8 \
/usr/man/man8/dhcpd.8
install dhcpd.conf.cat5 \
/usr/man/man5/dhcpd.conf.5
でインストール完了です。さて、この DHCP サーバを使用する為には
いくつか設定しなければなりません。まずは /etc/dhcpd.conf の設定
から。
cipher:~# cat /etc/dhcpd.conf
# dhcpd.conf
#
server-identifier cipher.king.or.jp;
option domain-name "king.or.jp";
option domain-name-servers 192.168.0.1;
shared-network CIPHER {
option subnet-mask 255.255.255.0;
default-lease-time 6000;
max-lease-time 72000;
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.10 192.168.0.15;
option broadcast-address 192.168.0.255;
option routers 192.168.0.1;
}
}
続けて /etc/dhcpd.leases を作成しておきます。
cipher:~# touch /etc/dhcpd.leasesそして route で 255.255.255.255 を付けておきます。
cipher:~# /sbin/route add -host 255.255.255.255 dev eth0もし、この route の実行が失敗したら、それは古い net-tools を使用しているかもしれません。バージョンを確認してみ てください。
というわけで、準備は完了。DHCP サーバを起動します。
cipher:~# /usr/sbin/dhcpdでは、ちゃんと DHCP が動いているか、Windows95 で確認しま しょう。たがいに ping を打ってみたり、Windows95 からメー ルを出してみたり、Linux から POP3 でメールを取得できるかを確認 しましょう。
確認ができたら、/etc/rc.d/rc.inet1 に
/sbin/route add -host 255.255.255.255 dev eth0 /usr/sbin/dhcpdを追加します。これにより私の /etc/rc.d/rc.inet1 は
cipher:~# grep '^[^#]' /etc/rc.d/rc.inet1
HOSTNAME=`cat /etc/HOSTNAME`
/sbin/ifconfig lo 127.0.0.1
/sbin/route add -net 127.0.0.0
IPADDR="192.168.0.1" # REPLACE with YOUR IP address!
NETMASK="255.255.255.0" # REPLACE with YOUR netmask!
NETWORK="192.168.0.0" # REPLACE with YOUR network address!
BROADCAST="192.168.0.0" # REPLACE with YOUR broadcast address, if you
# have one. If not, leave blank and edit below.
/sbin/ifconfig eth0 ${IPADDR} broadcast ${BROADCAST} netmask ${NETMASK}
/sbin/route add -net ${NETWORK} netmask ${NETMASK}
/sbin/route add -host 255.255.255.255 dev eth0
/usr/sbin/dhcpd
というようになりました。今日はルンルンのスィッチオフ。