2004年5月アーカイブ

EXT3ファイルシステム

現在 RED HAT Linux はバージョン9がリリースされている状態で、古いバージョンの話題で恐縮であるが カーネルのアップデートとEXT3ファイル利用する設定変更を行ってみた。

自宅のサーバマシンは Red hat Linux 7.1 である。このバージョンの Red hat はファイルシステムに ext2 というのが用いられている。以前はこのサーバマシンに SETI@Home の Unix クライアントバージョンを インストールして地球外知的生命体探査(SETI)の解析プログラムを24時間絶え間なく走らせていた。 ところが、CPUの発熱かメモリの不足(?)か何か原因は知らないが数ヶ月に一度ぐらいの割合で カーネルパニックを起こしその時にはコンソールにその SETI のプログラム名が表示されてる。 原因は不明なのだが、結局 SETI のクライアントプログラムを停止すれば全く不具合は発生しないので現在は停止させている。

で、このような不正終了を起こした場合には電源を切って再起動するしかなくなるわけだが、 大抵の場合、私が職場に出勤している場合に起こるので家の者(*1)に復旧作業をさせるわけである(^^; 「rootでログインして、パスワードは****でぇ、そこでああしてこうして…」

(*1) 中学生の息子 > 小学生の息子 > カミさん ( > は作業依頼の優先順位...)

このような場合電源を入れただけでは正しく起動せず、起動途中で停止した状態になってしまう。 なのでシングルユーザでログインし(linux 1)、fsck コマンドでファイルの整合性をチェック、修正してからでないと 起動しない。このような作業を携帯電話を使って指示してやると通話料金もかさむ。(作業者が不慣れなため) 前々からどうにかならないかなと思っていたんである。 ext3ファイルシステムだと自動的に不整合が修正されるというのを風の噂には聞いていたため(Red hat7.2以降) 最新の Red hat 9 をインストールしたいとは思っていたんだが、 OSのインストールはともかく、各種アプリのインストールと設定の復元が大変なため躊躇していた。

ext3ファイルシステムについて

インターネットでいろいろ調べるとカーネルのアップグレードとユーティリティプログラムを アップデートすると Red hat 7.1 でもext3ファイルシステムの導入が可能ではないかと思うようになった。
事前準備
まずは現在のシステムのブートフロッピーを作成する。
以前に作成したものは残っているが、何時のか分からないので一応作ってみた。


# fdformat /dev/fd0H1400        --> 1.44MB指定
# mkbootdisk --device /dev/fd0 2.4.2-2 --> 現在のカーネルバージョン
rpm でインストールしようとしているので一応 /boot をバックアップする。


# cd /
# cp -pr boot boot.bkup --> まあ不要かも知れないが…念のため
lilo.conf で lba32 を指定する。
私のサーバの場合 /boot は専用パテ-ションを使用していない。 そのためカーネルアップデートすると 1024シリンダ以降にファイルが作成されて起動しなくなるかも知れない(^^; いや、本当は /パテーション(/dev/hda1)に 2G しか割り当ててないので有り得ないことではあるのだが… まあ、邪魔になるわけじゃなし、設定変更した。


boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=250
message=/boot/message.ja
lba32 --> ここがデフォルトでは linear になっている。
default=linux
  .
  .
  .
念には念を入れてディスクを丸ごとバックアップする。

以前は Antidote for PC Hard Drive Data Copier という安価なバックアップ専用ソフトを使用して バックアップしてたのだが、結構時間がかかるそのため最近では mirrordir というソフトを使って cron による自動バックアップを行っている。 そのための起動スクリプトを実行することによってバックアップした。そのやり方は別途紹介する。
アップデートのためのファイルを用意する
e2fsprogsパッケージのアップデート

extファイルシステムをext3に変更するツール群一式を以下のページから入手する
★ Red Hat Linux 7.1 i386
e2fsprogs-1.26-1.71.i386.rpm
e2fsprogs-devel-1.26-1.71.i386.rpm


2.4 kernelパッケージのアップデート 2.4アップデートカーネル一式を以下のページから入手する
★ Red Hat Linux 7.1 i386
kernel-2.4.20-24.7.i386.rpm

と思ったのだがRed hat にはページはあるもののファイルがすでに存在しないようだ。 なので google からファイルだけを探してみた。 すると rpm を検索するドイツのサイト rpmseek.com というところが見つかり、そこを利用して検索した。 rpm でインストール使用とすると私の場合以下のパッケージも必要であるということが分かり同様に検索した。


832426 dev-3.3-4.i386.rpm
10729 filesystem-2.1.0-2.1.noarch.rpm
336255 initscripts-5.84.1-1.i386.rpm
176773 iptables-1.2.8-8.72.3.i386.rpm
12662023 kernel-2.4.20-28.7.i386.rpm
29194 mkinitrd-3.2.6-1.i386.rpm
208818 modutils-2.4.18-3.7x.i386.rpm
アップデートパッケージのインストール
レッドハットのホームページで記述されていたバージョンよりも若干新しいバージョンをダウンロードしてしまったようだが、 まあ、バックアップもあることだしやってみようということでこれらのファイルを使ってインストールしてみた。 コンパイルオプションなどが全く不明なわけで多少気持ち悪いものがあるが、 そもそも最初のインストール(古いカーネル)でどういったオプションでコンパイルされているのを理解している わけではないから、まあ似たようなものだろうということで…(^^;

# rpm -Fvh *.rpm

起動用の img ファイルを作成する。

# mkinitrd /boot/initrd-2.4.20.img 2.4.20-28.7

次に /etc/lilo.conf を変更する。


boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=250
message=/boot/message.ja
lba32
default=linux

image=/boot/vmlinuz-2.4.2-2
label=linux.040515
read-only
root=/dev/hda1
image=/boot/vmlinuz-2.4.20-28.7
label=linux
read-only
root=/dev/hda1
initrd=/boot/initrd-2.4.20.img

/sbin/lilo を実行してシャットダウン、起動して確認してみる。

# uname -ra
Linux lxsrv2 2.4.20-28.7 #1 Thu Dec 18 11:23:36 EST 2003 i686 unknown

というわけでちゃんと起動するし、OKそうである。
ext3ファイルシステムへのコンバート
ウチのサーバのパテーション構成は以下の通りである。


[root@lxsrv2 kernel]# df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hda1 2071384 175532 1790628 9% /
/dev/hda5 5162796 1006240 3894300 21% /home
/dev/hda6 2071384 1253276 712884 64% /usr
/dev/hda7 1035660 157936 825116 17% /var
none 127948 0 127948 0% /dev/shm
/dev/hda9 9131740 7307512 1360356 85% /samba
[root@lxsrv2 kernel]#

シングルユーザでログインし
# tune2fs -j /dev/hda9 などとしてファイルシステムを ext3に変換する。

/etc/fstab の ext2 を ext3 に変更して再起動する。

# df -T としてファイルシステムを確認する。


[root@lxsrv2 kernel]# df -T
Filesystem Type 1k-blocks Used Available Use% Mounted on
/dev/hda1 ext3 2071384 175532 1790628 9% /
/dev/hda5 ext3 5162796 1006240 3894300 21% /home
/dev/hda6 ext3 2071384 1253280 712880 64% /usr
/dev/hda7 ext3 1035660 157948 825104 17% /var
none tmpfs 127948 0 127948 0% /dev/shm
/dev/hda9 ext3 9131740 7307512 1360356 85% /samba
[root@lxsrv2 kernel]#
ということで RED HAT7.1 でカーネルとユーティリティのアップデートで 見事ファイルシステムが ext3 に変換されていることが確認されました。 あとは、カーネルパニックを起こし、不正終了後の再起動がうまくいくことを確認するのみです…違うか(^^;

ダイナミックDNSとは?
 最近はダイナミックDNSというのも一般化してきたと思うので、皆さん御存知とは思うが簡単に説明する。あなたが http://www.******.com/ などとブラウザのアドレスバーに入力してリターンキーを押すと該当のドメインのホームページが出力される。当たり前だと思うかもしれないが実は裏では "www.******.com" という文字列が数値に変換されている。何で数値に変換する必要があるのか?コンピュータのIPアドレスというのは実は数値で表現されているからだ。ためしに

http://3540913925/

と打ち込んで見て欲しい。Yahoo!Japanのホームページが表示されたでしょ?(2004/5/13現在)
表示されない?その場合はアドレスが変わっているのかも知れませんね。DOSプロンプトから

nslookup www.yahoo.co.jp


と打ち込むとIPアドレス(AAA.BBB.CCC.DDD)が得られるので (AAA * 256 * 256 * 256) + (BBB * 256 * 256) + (CCC * 256) + DDD を計算してみてください。

 さて、このように本当は数値だけでホームページを見ることができるのです。だからドメイン名なんて必要ないといえばないんです。(^^;
でも覚えられないでしょ?携帯電話だってたった11桁の番号(しかも最初3桁はほぼ固定)なのに覚えられるのならアドレス帖機能なんて必要ないですよね。人間にとってわかりやすい名称を使うというのがドメイン名ということです。コンピュータには数値しか理解できず、それでは困るので数値に変換しているわけです。この変換の仕組みがDNS(ドメインネームシステム)です。

 ではダイナミックDNS(DDNS)とは何なのか?企業や研究所や政府機関などはそれぞれのIPアドレスは固定になっています。だから www.******.co.jp <--> ***.***.***.*** という相互変換した値は常に同じわけです。一般の人がサーバーを立ち上げたいとした場合、固定IPアドレス契約をすれば簡単です。しかし、固定IPアドレス契約は費用も余計にかかるため、個人サーバやちょっとした実験などに使いたい場合は勿体ないです。そういった場合にDDNSを利用すればよいわけです。一般的にプロバイダと個人で契約した場合(個人向けダイヤルアップやADSL、FTTHなど)に割り振られるグローバルIPアドレスは動的なものです。ある場合は AAA.BBB.CCC.DDD だけど 次に接続した場合は EEE.FFF.GGG.HHH になります。プロバイダが保持しているグローバルIPアドレスには限りがあるため、接続ごとに空いたIPアドレスを貸し出しているわけです。

 たとえばあなたが yourdomain.com というドメイン名を持っているとしましょう。しかし固定のIPアドレスが無い場合にはDNSサーバにIPアドレスを登録することはできません。しかしダイナミックDNSという仕組みを使えばこれが可能になるのです。つまり「IPアドレスが変わった」->「それをDNSサーバに登録する」というのをその都度行えば良いのです。普通のDNSと一緒じゃん?と思ったあなたは鋭い!普通のDNS登録だって同じことをすればいいだけじゃん。いや、確かにその通りなんですが何が違うのか?ダイナミックDNSの場合はそのIPアドレスの情報の有効期限が1分とか10分とか極端に短く設定されているんです。普通のDNSの場合有効期限が日の単位で設定されています。つまりドメイン名をIPアドレスに変換しようとした場合に有効期限が長いため、古い情報が返されてしまう場合があるんです。その場合には非固定アドレスだと当然アクセスできなくなります。固定IPの場合は結局同じIPアドレスですからそれでも問題は発生しないわけです。

 そんなわけで、IPアドレスが変わった場合に自動的にDNS登録を行うプログラムがあればいちいち人間が登録しなくてもすみます。WWWサーバやMailサーバにしている場合は夜中でもアクセスがあるわけなので人手に頼った作業は現実的ではないでしょう。サーバがWindowsの場合は専用のプログラムが用意されているようですがOSがLinuxだとなかなか存在しないようです。( Dice というのがLinuxに対応しているようです)このプログラムが環境的にうまく動く方はそちらを使ってもらってもいいと思いますが、何か問題のある方や動作が見えないのは嫌だという方(笑)は以下のスクリプトを使ってもらってもいいです…(^^;

Dynamic Do!.jp を使ってみる
Dynamic Do!.jp というダイナミックDNS提供業者のDNS更新スクリプトを書いてみます。Dynamic Do!は2年以上使用していますが安定度抜群です。数少ない障害時の情報も公開されており信頼できます。個人的にはお勧めです。

更新スクリプトは以下の方針で作成します。
・出来るだけ ddo.jp のサーバに負荷をかけないようにする。
・自分のIPアドレスはルーターにアクセスして取得する。(別スクリプト)
・IPアドレスが変更になった時だけ更新を行うようにする。
・取得したIPアドレスは一時ファイルに保存する。
・動作ログを /var/log/messages に保存する。
・cron で定期起動する。
・ddo.jp へのアクセスには テキストブラウザ lynx を使用する。

Dynamic Do!.jp 用DNS更新スクリプト


#!/bin/bash

#
# DDNS更新リクエストを送った場合の応答の例
#
# [1]Dynamic DO!.jp
# SUCCESS: *******.ddo.jp <= [ ***.***.***.*** ]
# IPアドレス更新完了.
# ※IPアドレスに変更がありませんため、パスワードはチェックしておりません
# 。
# 2004/05/12 15:02:48
#
#References
#
# 1. http://ddo.jp/
#

TO="-connect_timeout=180"
MYDOMAIN="*******.ddo.jp"  <-- あなたのドメイン名を指定します。
PASSWORD="*************"   <-- パスワードを指定します。

# メッセージにはスペースコード(空白)は入れないこと
MESSAGE="You_are_part_of_MilkyWay_galaxy_too." <-- ダミーファイルに書き込むメッセージ(何でもよい)

# 前回取得のIPアドレス
IPFILE="/tmp/${MYDOMAIN}.ipaddress"

# ルーターのグローバルIPアドレスを取得
# 取得失敗したら "ERR" を返すようにしてください。
REMOTEIP=`/usr/local/etc/DDNS/warpstar.pl` <-- グローバルIPアドレスを取得します。

# 自グローバルIPアドレスが取得できない場合はコメントを外す。
# ただ、これを呼び出すと「サーバに負荷をかけないようにする」というポリシーに反しますので
# できるだけグローバルIPアドレスを自分でどうにか取得してください。
#
#REMOTEIP=`/usr/local/bin/lynx -dump 'http://ddo.jp/remote_addr.php' | grep '.' | awk '{print $1}' | cut -b 13-`
#

# 前回IPアドレス記録ファイルが存在しなかった場合
# ダミー文字列を入れたファイルを作成する。
# don't insert space code
# echo で出力する中には空白を含めないこと!
#
if [ ! -f "$IPFILE" ]; then
echo "$MESSAGE" > "$IPFILE"
fi

# グローバルIPアドレス取得失敗時は即終了する
# warpstar.pl ではグローバルIP取得失敗時に "ERR" を返す
if [ $REMOTEIP == "ERR" ]; then
echo "$MESSAGE" > "$IPFILE"
KEKKA="could not retrieve global IP address"
/usr/bin/logger -p daemon.info -t $MYDOMAIN $KEKKA
exit 0
fi

# 前回グローバルIPアドレスと今回アドレスが異なる場合
# DDNSの更新を試行する
if [ x"$REMOTEIP" != x`cat "$IPFILE"` ]; then

RESULT=`/usr/local/bin/lynx -dump \
"http://ddo.jp/dnsupdate.php?dn=${MYDOMAIN}&pw=${PASSWORD}" \
| head -10 | grep '<=' | awk {'print$1'}`

if [ $RESULT == "SUCCESS:" ]; then
KEKKA="IP address update SUCCESS.(^o^)v"
echo "$REMOTEIP" > "$IPFILE"
else
KEKKA="IP address update FAIL.(; ;)"
fi

# 結果をログに出力する。
/usr/bin/logger -p daemon.info -t $MYDOMAIN [$REMOTEIP] $KEKKA

fi

インストール&動作設定
 インストールって言っても、どこか適当なところ(ここの例では /usr/local/etc/DDNS)に置いて cron で起動してください。注意すべきは Dynamic Do!.jp無料登録のドメインは1ヶ月間更新がないと使われてないと判断されるのでしょう「アカウント削除」になってしまいます。このスクリプトが完璧に動いている&あなたのADSLなりFTTHが安定度抜群で1ヶ月間IPアドレスが変わらなかった場合、「DNS登録作業」が行われないので削除されてしまいます。そのため、まあ数日に1回ぐらいは強制的に登録するようにしておけばいいでしょう。そのためには、前回IPアドレス記録ファイルを定期的に削除してやれば良いです。

root ユーザになってファイル権限を700にします。その上で crontab -e コマンドで cron に登録します。登録し終わったら :wq で終了します。(そこまで言わんでいい?)

以下の cron 例は10分毎にIPアドレスをチェックして変更があれば登録する。また毎日23:59にファイルを強制削除することによって1日1回の強制登録を行う例です。ファイル名は(yourdomain.ddo.jp.sh です。)/var/log/messages に動作ログが残っているので確認してください。


# for yourdomain.ddo.jp DynamicDNS update
*/10 * * * * /usr/local/etc/DDNS/yourdomain.ddo.jp.sh
59 23 * * * rm -f /tmp/yourdomain.ddo.jp.ipaddress

*Dynamic Do!.jp を説明したページと同じ事が書いてあるとお思いのあなたに…。
下のスクリプトの部分は全く違いますので、御容赦を…(^^;

ダイナミックDNSとは?

 最近はダイナミックDNSというのも一般化してきたと思うので、皆さん御存知とは思うが簡単に説明する。あなたが http://www.******.com/ などとブラウザのアドレスバーに入力してリターンキーを押すと該当のドメインのホームページが出力される。当たり前だと思うかもしれないが実は裏では "www.******.com" という文字列が数値に変換されている。何で数値に変換する必要があるのか?コンピュータのIPアドレスというのは実は数値で表現されているからだ。ためしに

http://3540913925/

と打ち込んで見て欲しい。Yahoo!Japanのホームページが表示されたでしょ?(2004/5/13現在)
表示されない?その場合はアドレスが変わっているのかも知れませんね。DOSプロンプトから

nslookup www.yahoo.co.jp


と打ち込むとIPアドレス(AAA.BBB.CCC.DDD)が得られるので (AAA * 256 * 256 * 256) + (BBB * 256 * 256) + (CCC * 256) + DDD を計算してみてください。

 さて、このように本当は数値だけでホームページを見ることができるのです。だからドメイン名なんて必要ないといえばないんです。(^^;
でも覚えられないでしょ?携帯電話だってたった11桁の番号(しかも最初3桁はほぼ固定)なのに覚えられるのならアドレス帖機能なんて必要ないですよね。人間にとってわかりやすい名称を使うというのがドメイン名ということです。コンピュータには数値しか理解できず、それでは困るので数値に変換しているわけです。この変換の仕組みがDNS(ドメインネームシステム)です。

 ではダイナミックDNS(DDNS)とは何なのか?企業や研究所や政府機関などはそれぞれのIPアドレスは固定になっています。だから www.******.co.jp <--> ***.***.***.*** という相互変換した値は常に同じわけです。一般の人がサーバーを立ち上げたいとした場合、固定IPアドレス契約をすれば簡単です。しかし、固定IPアドレス契約は費用も余計にかかるため、個人サーバやちょっとした実験などに使いたい場合は勿体ないです。そういった場合にDDNSを利用すればよいわけです。一般的にプロバイダと個人で契約した場合(個人向けダイヤルアップやADSL、FTTHなど)に割り振られるグローバルIPアドレスは動的なものです。ある場合は AAA.BBB.CCC.DDD だけど 次に接続した場合は EEE.FFF.GGG.HHH になります。プロバイダが保持しているグローバルIPアドレスには限りがあるため、接続ごとに空いたIPアドレスを貸し出しているわけです。

 たとえばあなたが yourdomain.com というドメイン名を持っているとしましょう。しかし固定のIPアドレスが無い場合にはDNSサーバにIPアドレスを登録することはできません。しかしダイナミックDNSという仕組みを使えばこれが可能になるのです。つまり「IPアドレスが変わった」->「それをDNSサーバに登録する」というのをその都度行えば良いのです。普通のDNSと一緒じゃん?と思ったあなたは鋭い!普通のDNS登録だって同じことをすればいいだけじゃん。いや、確かにその通りなんですが何が違うのか?ダイナミックDNSの場合はそのIPアドレスの情報の有効期限が1分とか10分とか極端に短く設定されているんです。普通のDNSの場合有効期限が日の単位で設定されています。つまりドメイン名をIPアドレスに変換しようとした場合に有効期限が長いため、古い情報が返されてしまう場合があるんです。その場合には非固定アドレスだと当然アクセスできなくなります。固定IPの場合は結局同じIPアドレスですからそれでも問題は発生しないわけです。

 そんなわけで、IPアドレスが変わった場合に自動的にDNS登録を行うプログラムがあればいちいち人間が登録しなくてもすみます。WWWサーバやMailサーバにしている場合は夜中でもアクセスがあるわけなので人手に頼った作業は現実的ではないでしょう。サーバがWindowsの場合は専用のプログラムが用意されているようですがOSがLinuxだとなかなか存在しないようです。( Dice というのがLinuxに対応しているようです)このプログラムが環境的にうまく動く方はそちらを使ってもらってもいいと思いますが、何か問題のある方や動作が見えないのは嫌だという方(笑)は以下のスクリプトを使ってもらってもいいです…(^^;

Value-Domain を使ってみる
Value-Domain ですが、実はダイナミックDNS専用の業者さんではありません。どちらかというとドメイン名登録代行の業者という感じです。ホームページには「ドメイン総合サービス」って書いてあります。

で、ここを使うとどんなことができるか?「独自ドメイン取得&ダイナミックDNS」
おお、それは凄い!!でも登録料とか維持費とか高いんじゃないの?と思うでしょう?普通。でもね、驚くほど安いんですよ。たとえばあなたが *********.com という好きなドメインを取得したとして、年間1000円以下なんですよ。私の場合、ここ見つけてすぐに独自ドメインで別サイトの 運営をダイナミックDNSで始めましたが1年ぐらいになりますが安定しています。 私の場合はそういう運用の仕方ですが、他にもレンタルサーバとかいろいろあるみたいです。 何か、宣伝モードになってますね(^^;

更新スクリプトは以下の方針で作成します。
・出来るだけ value-domain のサーバに負荷をかけないようにする。
・自分のIPアドレスはルーターにアクセスして取得する。(別スクリプト)
・IPアドレスが変更になった時だけ更新を行うようにする。
・取得したIPアドレスは一時ファイルに保存する。
・動作ログを /var/log/messages に保存する。
・cron で定期起動する。
・value-domain へのアクセスには テキストブラウザ lynx を使用する。
・更新サーバは1~5まであるため、時刻によって適当にアクセスを散らせる。
Value-Domain 用DNS更新スクリプト


#!/bin/bash

NUM=`date | grep 'JST' | awk '{print $4}' | cut -b 4-4`

# 更新サーバは複数あるため時刻によって 1~5 まで振り分けるようにしてあるが
# そもそも dyn.value-domain.com/cgi-bin/dyn.fcg にアクセスすれば自動的に
# 負荷分散してアクセスするようになっている。そのため NUM の値を入れる必要はない(^^;
# まあ、どっちか好きな方にしてください。
# 自動負荷分散するには NUM="" としてください。
#
if [ $NUM = '0' ]; then
NUM=""
fi

SUBDM="dyn$NUM"
TO="-connect_timeout=180"


# 自グローバルIPアドレスを取得する。
# この場合は自分のルーター(NEC WR7600H) から…
REMOTEIP=`/usr/local/etc/DDNS/warpstar.pl`
#echo "remoteip = $REMOTEIP"

# 自グローバルIPアドレスが取得できない場合
# しかし、よそ様のスクリプトを勝手に使わないように…。
#
#REMOTEIP=`/usr/local/bin/lynx -dump 'http://ddo.jp/remote_addr.php' | grep '.' | awk '{print $1}' | cut -b 13-`
#

# CGI Script
CGI=value-domain.com/cgi-bin/dyn.fcg

# domain / password
DOMAIN="**********.com" <-- 自分のドメイン名
PASS="*************" <-- パスワード
MESSAGE="You_are_part_of_MilkyWay_galaxy_too." <-- あなたのお気に入りの言葉

IPFILE="/tmp/${DOMAIN}.ipaddress"

if [ ! -f "$IPFILE" ]; then
echo "$MESSAGE" > "$IPFILE"
fi

if [ $REMOTEIP == "ERR" ]; then
echo "$MESSAGE" > "$IPFILE"
KEKKA="could not retrieve global IP address"
/usr/bin/logger -p daemon.info -t $DOMAIN $KEKKA
exit 0
fi

if [ x"$REMOTEIP" != x`cat "$IPFILE"` ]; then

HOST="@"
URL="http://${SUBDM}.${CGI}?d=${DOMAIN}&p=${PASS}&h=${HOST}&i=${REMOTEIP}"
RESULT1=`/usr/local/bin/lynx ${TO} -dump $URL | head -10 | grep 'status' | awk '{print $1}'`
/usr/bin/logger -p daemon.info -t ${HOST}.${DOMAIN} ipaddress=$REMOTEIP server=$SUBDM $RESULT1

HOST="www"
URL="http://${SUBDM}.${CGI}?d=${DOMAIN}&p=${PASS}&h=${HOST}&i=${REMOTEIP}"
RESULT2=`/usr/local/bin/lynx ${TO} -dump $URL | head -10 | grep 'status' | awk '{print $1}'`
/usr/bin/logger -p daemon.info -t ${HOST}.${DOMAIN} ipaddress=$REMOTEIP server=$SUBDM $RESULT2

if [ $RESULT1 == "status=0" ]; then
if [ $RESULT2 == "status=0" ]; then
echo "$REMOTEIP" > "$IPFILE"
fi
fi

fi
exit 0

インストール&動作設定
 インストールって言っても、どこか適当なところ(ここの例では /usr/local/etc/DDNS)に置いて cron で起動してください。 まあ数日に1回ぐらいは強制的に登録するようにしておけばいいでしょう。そのためには、前回IPアドレス記録ファイルを定期的に削除してやれば良いです。

root ユーザになってファイル権限を700にします。その上で crontab -e コマンドで cron に登録します。登録し終わったら :wq で終了します。(そこまで言わんでいい?)

以下の cron 例は10分毎にIPアドレスをチェックして変更があれば登録する。また毎日23:59にファイルを強制削除することによって1日1回の強制登録を行う例です。ファイル名は(yourdomain.com.sh です。)/var/log/messages に動作ログが残っているので確認してください。


# for yourdomain.com Value-Domain update
*/10 * * * * /usr/local/etc/DDNS/yourdomain.com.sh
59 23 * * * rm -f /tmp/yourdomain.com.ipaddress

ダイナミックDNS
自宅は電力系のFTTHなのでブロードバンドルータ(NEC WR7600H)以下に複数PCを接続している。でその中の1台をLinuxをOSとしてWWWサーバ&MailサーバとしてダイナミックDNSを使用してインターネットに公開している。

ダイナミックDNSとしては Dynamic DO!.jp という条件によっては無料で使用できる業者のものを使用している。私の場合、無料とは言え安定度は抜群で、メールサーバへダイナミックDNSを使用しても、もうかれこれ2年以上になるが全く問題ない。

さて、御存知のようにダイナミックDNSというのは一般のプロバイダ配下にあるインターネットユーザのパソコンのグローバルIPアドレスをDNSに登録して、ドメイン名で参照させようというものである。これができると、インターネットに向けてWWWサーバやMailサーバ、対戦ゲームなどを行う時に接続者(友人やWEBページ閲覧者)がIPアドレスを知らなくてもよいというものである。

そのためには、ブロードバンドルータのもつグローバルIPアドレスをDDNS業者のDNSに登録してやらなければならないわけだが、固定IPアドレスで契約してないほとんどの一般人にとって非固定でクルクル変わるIPアドレスをその都度、手動で登録する作業は苦痛以外の何物でもないだろう。そういう場合にこそコンピュータ自身で自動化登録させるべきである。 実は Dynamic DO!.jp の場合、該当のマシンからホームページにアクセスするだけでグローバルIPアドレスが登録できるため(ユーザID、パスワードは引数)該当マシンではグローバルIP自体を知る必要はない。だから、Linuxの場合Lynxや WGETなどをCronで定期的に起動し自動アクセスさせてやれば、まあそれはそれでまったく問題ないといえばないのである。(^^;

で、表題のスクリプトが何で必要か?
んーーー。やっぱり無料で使わさせて頂いている(舌噛みそう…)業者さんのサーバに負荷をかけたくないですね。定期的に登録作業といっても10分毎なんかに呼び出したりするとやっぱり相手に迷惑でしょう?かと言って1日に1回とか6時間に1回とかだったら、迷惑度合いは低いけれど、今度は自分の方が不都合発生しますね。グローバルIPアドレスが変更になってもその時間が来るまでは登録されないわけで、その間インターネットからはアクセス不能になってしまいます。(そうそう、Dynamic DO!.jp さんの場合一ヶ月間の間DNS更新がなければアカウント削除されてしまうので最低でも一ヶ月に一回は更新の必要がある。)

というわけで自前で自分のグローバルIPアドレスが取得できれば、それを保存しておいて次回取得時に比較して違っている場合にのみ業者さんへの登録作業を行うということができるわけです。

今回はNECアクセステクニカから発売されているWR7600H(54M無線ルータ)という機種からグローバルIPアドレスを取得してみましょう。最初はLynxで通常の設定画面(内蔵WWWサーバ)にアクセスしてグローバルIPアドレスを取得しようとしたんですがグローバルIPアドレスを表示している画面が無い!?…どうなっとんじゃ。表示モードを拡張モードにすればあるようだけど、一発でアクセスできそうもないので止めました。というわけで TELNET アクセスできないか調べたところ2ちゃんねるに情報が転がっていました。以下は telnet で接続した場合のアクセス表示例です。 余談ですが、Basic認証のかかっているWWWサーバへアクセスする場合以下の様にすれば認証を通過できます。
http://userid:password@192.168.*.*/
userid はユーザ名、password はパスワード * は伏字
NEC WR7600H にTelnetでアクセスしたところ


# telnet 192.168.**.**
Trying 192.168.**.**...
Connected to 192.168.**.**.
Escape character is '^]'.

Telnet Server 1.10 All rights reserved.
login : admin
Password:

### Welcome To WARPSTAR ###
>show info wan 22
ENTRY NO ..... 22
IP ADDRESS ..... 220.***.***.190
SUBNET MASK ..... 0. 0. 0. 0
DNS SERVERS
IP ADDRESS1 ..... 219.***.***.**8
IP ADDRESS2 ..... 219.***.***.**7
AC INFORMATION
AC NAME ..... *****
SERVICE NAME ..... (empty)
>

マニュアルに「Telnetサーバ」があるということはどこにも書いてなかった(たぶん)ですけど、以前使っていたISDNルータにも同様の機能があったので、あるんじゃないかと思ってはいました。実際アクセスしてみると応答はあったんですが、コマンドが分からなかったのでそのままになってました。以前のISDNルータではヘルプコマンドがあったので、適当に調べながらできたんですがそうもいきませんでした。2chの情報により上記のような情報が得られることが判明しました。IPアドレスは一応アスタリスクで隠してます。(ローカルIPアドレスの部分は隠したってあまり意味はないとは思うが…まあ一応…)

で、ここからグローバルIPアドレスを取得するわけですが「明らかに2行目のやつ」ですね。これを正規表現を用いて抜き出して見ましょう。

NEC WR7600H グローバルIPアドレス取得スクリプト


#!/usr/bin/perl

use Net::Telnet();

$lines ="";
$wp_host = '192.168.**.**'; <-- ルータのIPアドレス
$wp_user = 'admin'; <-- ルータ管理者アカウント名(固定)
$wp_pass = '*********'; <-- ここには自分のパスワードを入れてね

$t=new Net::Telnet(Timeout => 10);
$t->open($wp_host);
$t->waitfor('/login :.*$/');
$t->print("$wp_user");
$t->waitfor('/Password:.*$/');
$t->print("$wp_pass");
$t->waitfor('/>.*/');

$result = "ERR\n";
$t->print("show info wan 22");
($lines)=$t->waitfor('/>.*/');

foreach $_ (split(/\n/, $lines)) {
if(/^( +)(IP ADDRESS +)(\.+ )( *)([0-9]*\.)( *)([0-9]*\.)( *)([0-9]*\.)( *)([0-9]*)/) {
$result = "$5$7$9$11\n";
}
}
if($result == "0.0.0.0") {
$result = "ERR\n";
}
print $result;
$t->close;
exit

IPアドレスの部分は以下のようなフォーマットなんですが、数値部分が3桁無い場合は△△8などとスペースが入ってしまいます。(△=スペース)スペースコードが入っていると後の処理で不都合が発生する場合があるので取り除くよう正規表現で指定してあります。また以下のようなフォーマットの出力が得られなかった場合や出力IPアドレス結果が "0.0.0.0" となった場合は文字列 "ERR" というのを返却する仕様としてあります。 "0.0.0.0" は WARPSTAR の場合WAN側ケーブルを抜いてこのスクリプトを走らせると得られます。必要に応じて変更してください。


IP ADDRESS ..... ***.***.***.***
このスクリプトファイルに warpstar.pl という名称を与えオーナー root で権限を700 にする。動作確認は #./warpstar.pl でやってみてください。標準出力にグローバルIPアドレスが出力されるはずです。これだけでも必要とされる人はいると思うので公開(というほどのものでもないが…)します。ダイナミックDNSと組み合わせるスクリプトは別のページに書きます。

そのスクリプトは
Dynamic DO!.jp 用 とValue Domain 用 です。
Value Domain の方は有料ですが格安独自ドメインでしかもDDNS運用ができるというものです。有料と言っても種類によっては年間1000円以下で独自ドメイン取得&運用できます。

液晶テレビ

| コメント(0)

ekishotv.jpg

ずっと使っていたテレビが壊れて映らなくなったので、思い切って液晶テレビを買ってしまった(^^;ソニーの20インチのやつだ。大画面でもないし、デジタル対応はおろか、衛星チューナーすら搭載されてないやつだ。どうせ、この辺は田舎なのでデジタル化は遥か先の話だから関係ない。もしかしたら、エリア外かも知れない。おいおい、テレビもエリア外かよ(^^;

ウェブページ

  • about
Powered by Movable Type 5.2.10

このアーカイブについて

このページには、2004年5月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2003年8月です。

次のアーカイブは2004年6月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。