家庭内 LAN その 1 (97/04/11)

なんかすっっっげぇ〜、ひさしぶりのような気がする。たぶん気のせいじゃな いんだろうけど。:-)

ここのところ、やりたいことはあっても、実際には特に管理関係ではいじって なかったので書くことがなかったんです。でも、このたびウチにももう一台 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 modulesmake modules_install を実行してモジュールをインストールしました。

そしてできたよ、できましたよ。私の新しい cipher が、

kernel 2.0.30 だ!

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.30linux_22.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 dhcp05
127.0.0.1localhost のまま。192.168.0.1cipher の IP アドレスとして使用するようにしました。 192.168.0.10 から 192.168.0.15DHCP を入れた場 合に備えて、一応設定しておきます。

次に /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 をリブートしてちゃんと設定されてい るか確認しよう。確認にはコマンド ifconfignetstat を 使用します。

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 だからか、libc5.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.clib/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
というようになりました。

今日はルンルンのスィッチオフ。

戻る