armadillo-JにDHCPサーバを移行。

やる暇無くて、ずっとPendingしていた、玄箱で稼働させていたISC DHCPサーバからArmadillo-JにDHCPサーバを移行する計画を昨日今日で重い腰上げてやっとこさ完了。Debian Sidのudhcpのソースパッケージを持ってきて、ソースツリーをArmadillo-J用のツリーに突っ込んでクロスコンパイルしてarmadillo-Jに突っ込んだ。

環境構築

アットマークテクノのサイトにある通り。 Armadillo-Jのダウンロードサイト から下記を取得。

ソースコード展開

Kernelソースのリンクのやり方を間違えていたので最初、ちゃんとビルドできずにハマった。シンボリックリンクの名前が、”linux-2.4.22.x”という形式でないとちゃんとビルドできなかったので、そのまんま、その形でリンクを張った。

$ tar zxf atmark-dist-20060801.tar.gz
$ tar zxf linux-2.4.22-uc0-aj5.tar.gz
$ cd atmark-dist-20060801
$ ln -s ../linux-2.4.22-uc0-aj5 linux-2.4.22.x

クロスツールチェーンの導入

$ cd ../
$ sudo sh ./arm-elf-tools-20030314-fix20060808.sh

ビルド

現在、Armadillo-Jは、ブート後も簡単に変更分を反映できるように普通のBaseイメージにせずに、JFFS2ファイルシステムにしているのだが、プロダクトの選択時 [1] に、Armadillo-J.JFFS2を選択すると、ビルドに失敗する。なので、プロダクト選択時には”Armadillo-J.Base”を選択した。Baseで作成されたイメージを固める前のファイルをJFFS2を使っているArmadillo-Jに持っていってもちゃんと動く。make configの選択肢は ユーザマニュアル に沿ってやれば良し。

取り合えず、ちゃんとビルド出きることを確認する。

$ cd atmark-dist-20060801
$ make config
$ make dep all

udhcpのソースパッケージ取得

確認を取れたら、Sidのudhcpのソースパッケージを取得する。今回、udhcpdを選択したのは下記理由。

  • Atmark-distには、NETtel DHCP Server [2] とISC DHCP Server [3] が含まれているのだが、前者は、MACアドレスを指定してIPアドレスを固定させる方法がない。

後者はソースツリーに含まれてはいるもののデフォルトではビルドができない。そもそもデカすぎる。ということで、Debianから組込システム向けのDHCPサーバであるudhcpを取得してビルドしたわけである。

$ cd ..
$ apt-get source udhcp
$ cp -i udhcp-0.9.8cvs20050303/ atmark-dist-20060801/user/udhcp

ビルド用設定ファイルの修正

atmark-dist-yyyymmdd/user/ディレクトリ以下に、ソースコードを突っ込んだだけではビルドできない。なので、以下のファイルを修正する。ncursesのメニュー形式でコンパイルするので、選択出きるようにするわけである。

  • atmark-dist-20060801/config/config.in
$ diff -u config.in.org config.in
--- config.in.org   2006-08-16 19:11:04.000000000 +0900
+++ config.in       2008-06-01 19:29:43.000000000 +0900
@@ -291,6 +291,7 @@
 bool 'brcfg'                       CONFIG_USER_BRCFG_BRCFG
 bool 'bridge utils'                CONFIG_USER_BRCTL_BRCTL
 bool 'dhcpcd'                      CONFIG_USER_DHCPCD_DHCPCD
+bool 'udhcp'                       CONFIG_USER_DHCPD_UDHCP
 if [ "$CONFIG_USER_DHCPCD_DHCPCD" = "y" ]; then
    bool '  dhcpcd link-local support'      CONFIG_USER_DHCPCD_LLIP
 fi
  • atmark-dist-20060801/user/Makefile
$ diff -u Makefile.org Makefile
--- Makefile.org    2006-06-10 19:52:27.000000000 +0900
+++ Makefile        2008-06-01 19:30:05.000000000 +0900
@@ -72,6 +72,7 @@
 dir_$(CONFIG_USER_DHCPCD_DHCPCD)            += dhcpcd
 dir_$(CONFIG_USER_DHCPCD_NEW_DHCPCD)        += dhcpcd-new
 dir_$(CONFIG_USER_DHCPD_DHCPD)              += dhcpd
+dir_$(CONFIG_USER_DHCPD_UDHCP)              += udhcp
 dir_$(CONFIG_USER_DIALD_DIALD)              += diald
 dir_$(CONFIG_USER_DISCARD_DISCARD)          += discard
 dir_$(CONFIG_USER_DISCARD_ECHO)             += discard

これで後はビルド時 [4] に上記を選択するようにする。その辺はユーザガイドを参照のこと。

実行ファイルをアップロード

udhcpは実はちゃんと最後までビルドできないのだが、実行ファイル自体はatmark-dist-20060801/user/udhcp/以下にちゃんとできる。なので、ファイルをArmadillo-JへFTPでアップロードする。

udhcpdの設定

udhcpdは/binディレクトリ以下に配置し、アクセス権を変更する。

# mv -i /home/guest/pub/udhcpd /bin/
# chown root:root /bin/udhcpd
# chmod 755 /bin/udhcpd

udhcpdの設定ファイルを作成する。udhcp/sample/udhcpd.confを使うのが楽。以下のように設定する [5]

start                192.168.0.20    #default: 192.168.0.20
end          192.168.0.254   #default: 192.168.0.254
interface    eth0            #default: eth0
max_leases   254             #default: 254
remaining    yes             #default: yes
auto_time    7200            #default: 7200 (2 hours)
decline_time 3600            #default: 3600 (1 hour)
conflict_time        3600            #default: 3600 (1 hour)
offer_time   60              #default: 60 (1 minute)
min_lease    60              #defult: 60
lease_file   /var/lib/misc/udhcpd.leases     #defualt: /var/lib/misc/udhcpd.leases
pidfile      /var/run/udhcpd.pid     #default: /var/run/udhcpd.pid
opt  dns     192.168.0.2 192.168.0.3
option       subnet  255.255.255.0
opt  router  192.168.0.254
option       domain  hoge.org
option       lease   864000          # 10 days of seconds
static_lease xx:xx:xx:xx:xx:xx 192.168.0.100
static_lease xx:xx:xx:xx:xx:xx 192.168.0.101
static_lease xx:xx:xx:xx:xx:xx 192.168.0.102
static_lease xx:xx:xx:xx:xx:xx 192.168.0.103
static_lease xx:xx:xx:xx:xx:xx 192.168.0.104
static_lease xx:xx:xx:xx:xx:xx 192.168.0.105

起動してみる

今回、ライブラリはuClibsを指定してコンパイルしていたのだが、バックグラウンドジョブは対応していないらしく、フォアグラウンドで実行させねばならん。なので、一番最後に実行される起動スクリプトとして下記を用意した。

# cd /etc/rc.d/rc.start/
# ls
rc.40.network   rc.70.inetd     rc.80.thttpd    rc.89.sntp      rc.99.ledctrl
# cp -ip rc.80.thttpd rc.99.udhcpd
# vi rc.99.udhcpd
#!/bin/sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin

echo -n "Starting udhcpd: "
mkdir -p /var/lib/misc/
exec udhcpd  /etc/udhcpd.conf
if [ $? = 0 ]; then echo "done"; else echo "failed"; fi

# mv -i rc.99.ledctrl rc.98.ledctrl

これでhalt後に起動かければDHCPサーバとして動く。停止させる時は、”kill -9”で無理やり停止させないといけないのがイケてなくてアカンなぁ。この辺は改善余地アリだなぁ。

[1]AtmarkTechno-Productsの選択時
[2]atmark-dist-20060801/user/dhcpd/
[3]atmark-dist-20060801/user/dhcp-isc/
[4]make menuconfig, make dep allを実行する
[5]コメントは省略