2015年11月22日

Raspberry Pi 2 で RadioShark2(その2)

Raspberry Pi 2 で RadioShark2(その1)からの続き。

libhidapiに関して検索すると、HID API for Linux, Mac OS X, and Windowsを発見した。
 #というか、日本語で書かれたページが出てこない(^^;
上記ページと、hidapi APIを見ながら、しばし後悔(^^;

サンプルプログラムも付いているのでなんとかなるだろうと、久々にviでCのソースをいじる。
 #これまた、5年以上振りだと思う(^o^;

悪戦苦闘すること数時間。
なんとかコンパイルエラーがなくなるところまできたが、linkするファイルがわからない。
以前のバージョンのshark2.c

gcc -g -o shark2 -lhid shark2.c
でコンパイルできたが、
今回は-lhidapiではダメだった。

インストールされたパッケージ名をもう一度よく見て、-lhidapi-libusbにしたところ、
なんとかコンパイルが通った(^^;;

その後、ちょこちょこ実行時エラーを修正し、なんとかLEDの制御が出来るレベルまできたのが下記。

/* This souce code written my Michael Rolig (email: michael_rolig@alumni.macalester.edu)
* This can be considered to be in the public domain
*/

/* Modified for Radio Shark2 2007-05-11
* This source code is written by Hisaaki Shibata (email: shibata@luky.org)
* Original Shark2 controll code in Delphi is written by
* Kawabe (email: mail.kwb@gmail.com)
* This can be considered to be in the public domain.
*/

/* Modified for Radio Shark2 on Raspberry Pi 2 with hidapi.h 2015-11-22
* This source code is written by Hisaaki Shibata (email: shibata@luky.org)
* This can be considered to be in the public domain.
*/

#define DEBUG false /* Set true for copious debugging output */
#define SHARK_VENDID 0x077d /* Griffin's Vendor ID */
#define SHARK_DEVID 0x627a /* The radioSHARK2's Device ID */

#define READ_EP 0x5 /* libhidapi read command? */
#define WRITE_EP 0x5 /* libhidapi write command? */
#define SEND_PACKET_LENGTH 7 /* size of an instruction packet: shark2=7 */

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "hidapi/hidapi.h"

void usage(int argc, const char** argv) {
printf("%s <command> <arg>\n\tchange state of radioSHARK2\n\n", argv[0]);
printf("commands:\n"
" -fm <freqeuncy> : set FM frequency, e.g. '-fm 80.7'\n"
" -am <frequency> : set AM frequency, e.g. '-am 730'\n"
" -blue <intensity> : turn on blue LED (0-127) '-blue 127'\n"
" -red <0/1> : turn on/off red LED '-red 1'\n");

/* Declare variables used later */
hid_device *handle;
struct hid_device_info *devs, *cur_dev;

devs = hid_enumerate(0x0, 0x0);
cur_dev = devs;
while (cur_dev) {
printf("Device Found\n type: %04hx %04hx\n path: %s\n serial_number: %ls",
cur_dev->vendor_id, cur_dev->product_id, cur_dev->path, cur_dev->serial_number);
printf("\n");
printf(" Manufacturer: %ls\n", cur_dev->manufacturer_string);
printf(" Product: %ls\n", cur_dev->product_string);
printf("\n");
cur_dev = cur_dev->next;
}
hid_free_enumeration(devs);

}

int main(int argc, const char** argv) {

/* Declare variables used later */
int ret;
hid_device *handle;
struct hid_device_info *dev;

/* Build the instruction packet to send to the shark */
unsigned char PACKET[SEND_PACKET_LENGTH] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
unsigned short encodedFreq;
float freq;
unsigned int intensity;

if (argc == 3) {
if (strcmp(argv[1], "-fm") == 0) {
/* Tune to an FM frequency */
PACKET[0] = 0x81;
encodedFreq = 0;
freq = atof(argv[2]);
encodedFreq = ((freq * 10 * 2) - 3 );
PACKET[1] = (encodedFreq >> 8) & 0xFF;
PACKET[2] = encodedFreq & 0xFF;
PACKET[3] = 0x33;
PACKET[4] = 0x04;
PACKET[5] = 0x00;
PACKET[6] = 0x28;
if (DEBUG) {
printf("band = fm\n");
printf("freq = %.1f\n", freq);
printf("encoded freq = 0x%x\n", (unsigned int)encodedFreq);
}
} else if (strcmp(argv[1], "-am") == 0) {
/* Tune to an AM frequency */
PACKET[0] = 0x81;
encodedFreq = 0;
freq = (float)atoi(argv[2]);
encodedFreq = ((unsigned short)freq * 4 ) + 16300;
PACKET[1] = (encodedFreq >> 8) & 0xFF;
PACKET[2] = encodedFreq & 0xFF;
PACKET[3] = 0xF3;
PACKET[4] = 0x36;
PACKET[5] = 0x00;
PACKET[6] = 0x24;
if (DEBUG) {
printf("band = am\n");
printf("freq = %d\n", (unsigned int)freq);
printf("encoded freq = 0x%x\n", (unsigned int)encodedFreq);
}
} else if (strcmp(argv[1], "-blue") == 0) {
/* Adjust the blue LED */
intensity = atoi(argv[2]);
PACKET[0] = 0x83;
PACKET[1] = (char)intensity;
} else if (strcmp(argv[1], "-bblue") == 0) {
/* Adjust the blue LED's pulsing rate */
intensity = atoi(argv[2]);
PACKET[0] = 0xA1;
PACKET[1] = (char)intensity;
} else if (strcmp(argv[1], "-red") == 0) {
/* Toggle the red LED */
intensity = atoi(argv[2]);
if (intensity) PACKET[0] = 0x84;
else PACKET[0] = 0x84;
PACKET[1] = (char)intensity;
} else {
/* Bad command - display the program's usage instructions */
usage(argc, argv);
exit(1);
}
} else {
usage(argc, argv);
exit(1);
}

/* Initialize the hid library */
ret = hid_init();
if (ret != 0) {
fprintf(stderr, "hid_init failed with return code %d\n", ret);
return 1;
}

/* Open the shark */
dev = hid_enumerate(SHARK_VENDID, SHARK_DEVID);
handle = hid_open(SHARK_VENDID, SHARK_DEVID, 0);
if (handle == NULL) {
fprintf(stderr, "hid_open failed with return code %d\n", handle);
return 1;
}

/* Send the instruction packet constructed above to the Shark */
ret = hid_write(handle, (char*)PACKET, SEND_PACKET_LENGTH);
if (ret == -1) fprintf(stderr, "hid_write failed with return code %d\n", ret);

/* Close the shark */
hid_close(handle);

/* Close the hid object */
hid_free_enumeration(dev);

return 0;
}


上記をshark2-hidapi.cに置いている。
 #サンプルコードからまるっともらってきたりしてゴミが残っていたり、
 #見直しも何もできていないけど(^^;

これを

gcc -g -o shark2-hidapi -lhidapi-libusb shark2-hidapi.c

でコンパイルし、
shark2-hidapi -red 1

とやると、赤いLEDが点灯した(^O^)

サウンド出力はまだ確認していないけど、、LEDが制御できたのなら、チューナーも動いているはず。

もう今日は寝る!

続く。

    

Raspberry Pi 2 で RadioShark2(その1)

こっそり(?)、ヤフオクでRadioShark2をもう1台手に入れた。

 #現在、El CapitanでRadioShark2が動かない(対策その1)に書いているように
 #Mac miniにRadioShark2をつないで、FM福岡を録音しているが、
 #どうせならRaspBerry Pi 2で録音できるようにしたいと考え、
 #入手したものだ。
 #今やっている録音は中断できないので、もう1台ということで(^^;;;

LinuxでRadio Shark2 (その3:一応出来た編)に書いているように、
LinuxでのRadioShark2のコントロールは、もう8年ほど前になんとかできているので、
これを使えば一発だろうと考えた(^^)。

Raspberry Pi 2の4つもあるUSB端子に入手した2台目(二代目?)RadioShark2を接続してみた。

/var/log/syslogを見ると、
 #syslogなんて、何年振りに見るだろう(^^;;;;;

Nov 23 00:40:30 hispi kernel: [53265.439196] usb 1-1.2: new full-speed USB device number 7 using dwc_otg
Nov 23 00:40:30 hispi kernel: [53265.547632] usb 1-1.2: New USB device found, idVendor=077d, idProduct=627a
Nov 23 00:40:30 hispi kernel: [53265.547650] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Nov 23 00:40:30 hispi kernel: [53265.547660] usb 1-1.2: Product: radioSHARK
Nov 23 00:40:30 hispi kernel: [53265.547671] usb 1-1.2: Manufacturer: Griffin Technology, Inc.

てな感じに、きちんと認識されている。

さすが、Linux(^^)

これは思った通り楽勝だと思い、shark2.cをコンパイルしてみようとしたが、
そもそもlibhid.hのインクルードすらできない(@_@;;

うーん、と悩んでapt-cache search libhidでそれらしいパッケージを探してみた。

root@hispi:/home/pi# apt-cache search libhid
libhidapi-dev - Multi-Platform library for communication with HID devices (development files)
libhidapi-hidraw0 - Multi-Platform library for communication with HID devices (hidraw backend)
libhidapi-hidraw0-dbg - Debugging symbols for libhidapi-hidraw0
libhidapi-libusb0 - Multi-Platform library for communication with HID devices (libusb backend)
libhidapi-libusb0-dbg - Debugging symbols for libhidapi-libusb0
libhidrd0 - runtime library for parsing and generating USB HID reports
libhidrd0-dbg - detached debugging symbols for libhidrd0
libhidrd0-dev - development files for parsing and generating USB HID reports

「これだな」ということで、apt-get install libhidapi-devを実行すると、他にもあれこれインストールされた。
関係しそうなのは下記。

root@hispi:/home/pi# apt-show-versions |grep libhid
libhidapi-dev:armhf/jessie 0.8.0~rc1+git20140201.3a66d4e+dfsg-3 uptodate
libhidapi-hidraw0:armhf/jessie 0.8.0~rc1+git20140201.3a66d4e+dfsg-3 uptodate
libhidapi-libusb0:armhf/jessie 0.8.0~rc1+git20140201.3a66d4e+dfsg-3 uptodate

さて、これでコンパイル...とやってみたが、エラーだらけ(^^;;;
これも予想していたので、/usr/include/hidapi/hidapi.hを見てみたら、
なんとがっさりhid.hと中身が変わっていた(@o@;;

うーん、続く

    

2006年9月20日

mtawsasin.pl更新

最近、Wide character in null operation line xx
と言うのが出てamazonからうまく情報を引っ張ってこれないことが多かったので、ちょっと調べてみた。
コード変換関連であることはわかるのだが、なんだろう。

perl5.8.xになってからJcodeではなくEncodeというのが標準になっていたらしい(^^;

Jcodeで書いていたのを、そのままEncodeで書き直した。
それだけ。

参考にさせていただいたのはこちら。
http://www.bugbearr.jp/?Perl%2FUnicode

続きも読む "mtawsasin.pl更新"
    

2005年11月19日

Xen-2.0.7

@IT: 仮想化技術の大本命「Xen」を使ってみよう 〜 インストール & Debian環境構築編 〜
Xen Users' Manualを参考に、Debian Sarge上にxen-2.0.7-install-x86_32.tgzをインストールしてみた。

足かけ2日間(実働4時間程度)で何とか動いた。

#某師匠に色々言っている手前、自分自身でも時間を割いて、
#わずかずつでもテクニカルな取り組みも実施中よん。

続きも読む "Xen-2.0.7"
    

2005年1月13日

Cubeを描く POVRAY編(その6)Mengerのスポンジ

本日、手元にUnix User 2005.2が届いた。

Book Reviewは別途書くとして、「よしだともこのルート訪問記」が100回を迎えたようだ。
おめでとうございます。
ただ、次回で最終回らしく、ちょっと寂しい。

さて、100回は京都大学大学院の立木秀樹助教授の研究室だった。

コンピュータだ、ネットワークだの話はあまりなかったのだが、非常に興味を引く内容があった。

どこかで見たような形のイラストがあった。それがメンガーのスポンジである。

続きも読む "Cubeを描く POVRAY編(その6)Mengerのスポンジ"
    

2005年1月10日

Cubeを描く POVRAY編(その5)

これも馬鹿でかいので、見ない方がいいかも。

下の画像は相当でかいアニメーションGIFにリンクしてますので、ご注意を。

続きにも画像を置いていますが、小さめのものにしています。

続きも読む "Cubeを描く POVRAY編(その5)"
    

2005年1月 9日

Cubeを描く POVRAY編(その4)

もう一つ、animation。

重いので、見たくない人は続きを見ないで。

cube-anim-2.gif

aviにもしてみた。
cube-anim-2.avi

続きも読む "Cubeを描く POVRAY編(その4)"
    

Cubeを描く POVRAY編(その3)

アニメーションgifを作ってみた。

作り方は下記。

続きも読む "Cubeを描く POVRAY編(その3)"
    

Cubeを描く POVRAY編(その2)

その他、POVRAYで描いたもの。

ちょっとずついじりながら、イメージに近づけていった。
#試行錯誤も多いけど。

コマンドラインは
povray +Ipovtest-x.pov +Opovtest-x.jpg +W512 +H320 +V -D +X

以下、イメージデータが多いのでご注意。

続きも読む "Cubeを描く POVRAY編(その2)"
    

Cubeを描く POVRAY編(その1)

結局、昔ちょっとだけいじったことがあるPOVRAYでも描いてみた。
#povrayの記法はすっかり忘れてました。
#昔作った.povファイルも見つからないし。

Persistence of Vision Raytracerを感謝しつつに参照させていただき、最初に作ったのがこれ。

続きも読む "Cubeを描く POVRAY編(その1)"
    

2004年10月30日

いつも探してしまうperlでのファイル内文字列置換(その3)

いつも探してしまうperlでのファイル内文字列置換(その2)の続き?

よく考えたら(考えなくても(^^;)、複数行にマッチして、その行を特定のパターンに置き換えるだけなら、patchと言う強い武器があった。(ちょっと条件は付くが)

ここに、aaaa.txtと言うファイルがある。

<!--hogehoge-->
<!--hogehoge-end-->
この2つのタグの間に何かを挟みたいとする。
また、この2つのタグは対象ファイルに1回しか現れないとする。
対象ファイルが一つならすぐ修正だが、同じ変更を大量のファイルにやる場合が問題。

続きも読む "いつも探してしまうperlでのファイル内文字列置換(その3)"
    

2004年10月20日

MLへの新着メールのrssでの情報提供(その5)

MLへの新着メールのrssでの情報提供(その4)につっこみが入った。

ヘッダがUTF-8なのに、エンコードはJISなので、文字化けが起きているのはわかっていたが、手元のsageだと、ヘッダにあわせてUTF-8で送ると逆に化けていた。

もう面倒なので(^^;、bodyにあわせてヘッダを変えた。

コードをいじったのは、


my $rss = XML::RSS->new(encoding => 'ISO-2022-JP');

の部分のみ。

#まぁ、いいかぁ(^^;

    

2004年10月18日

MLへの新着メールのrssでの情報提供(その4)

rssを生成するスクリプト。
ほぼ頂き物そのままで、順番をいじっただけに近い(^^;

まずはテンプレート

<HTML>
[% ... %]
<TITLE>[% title %]</TITLE>
[% ... %]
<li><em>Date</em>: [% doc %]</li>
[% ... %]

perlスクリプトの方。
元の作者に敬意を表して、ttrss-multi.plと名付けた。
続きも読む "MLへの新着メールのrssでの情報提供(その4)"
    

2004年10月17日

MLへの新着メールのrssでの情報提供(その3)

MLへの新着メールのrssでの情報提供(その2)の続き。

まだ手を入れなければならないところがあるが、試験的に動かしてみた。

http://search.luky.org/index.rdf

    

2004年10月13日

straceの変な使い方

rsyncとかtarでvオプションをつけずにどでかいファイルの操作を行っているときに、
今どこまで進んだのかわからなくて、いらいらすることがたまにある。

#よくあるかも。

screen内でvオプション付きで動かしたりすれば良いんだろうが
うっかり忘れたときに何をやっているか調べるのにstraceを使ったりする。

#邪道だろうなぁ。

いつまで経っても終わらないプロセスのPIDをpsなどで確認して、


strace -p PID

をやると、大体の状況がつかめる。

#ctrl-Cで終わろうね。

    

2004年10月 3日

GV-1394TVでのキャプチャ(その2)

GV-1394TVからffmpegで直接mpeg2/4がとれないかなぁと試してみた。

hcube:/home/DV# ffmpeg -dv1394  dada.avi
ffmpeg version 0.4.9-pre1, build 4718, Copyright (c) 2000-2004 Fabrice Bellard
  built on Sep 12 2004 09:27:55, gcc: 3.3.4 (Debian 1:3.3.4-11)
Failed to initialize DV interface: Invalid argument
Could not find video grab device
うーん、なんじゃそれ。

ffmpeg-cvs-2004-07-12/libavformat/dv1394.cを見てみた。

    /* Open and initialize DV1394 device */
    video_device = ap->device;
    if (!video_device)
        video_device = "/dev/dv1394/0";
    dv->fd = open(video_device, O_RDONLY);
    if (dv->fd < 0) {
        perror("Failed to open DV interface");
        goto failed;
    }

    if (dv1394_reset(dv) < 0) {
        perror("Failed to initialize DV interface");
        goto failed;
    }
openはうまくいっていて、その次が問題みたいだ。

dv1394_reset()を見てみると、

/*
 * The trick here is to kludge around well known problem with kernel Ooopsing
 * when you try to capture PAL on a device node configure for NTSC. That's
 * why we have to configure the device node for PAL, and then read only NTSC
 * amount of data.
 */
static int dv1394_reset(struct dv1394_data *dv)
{
    struct dv1394_init init;

    init.channel     = dv->channel;
    init.api_version = DV1394_API_VERSION;
    init.n_frames    = DV1394_RING_FRAMES;
    init.format      = DV1394_PAL;

    if (ioctl(dv->fd, DV1394_INIT, &init) < 0)
        return -1;

    dv->avail  = dv->done = 0;
    return 0;
}
PALとして埋め込んでみるみたいだし、動いているのかなぁ(^^;。


続きも読む "GV-1394TVでのキャプチャ(その2)"
    

GV-1394TVでのキャプチャ(その1)

UnixUser 2004.06の続きみたいなもの。
やっといじってみた。

「■第1特集 Linuxで多チャンネル同時録画」に載っていた
gv1394tv_ctrl_min.cは、sid環境下のlibraw1394-devとlibavc1394-devとの組み合わせでは
うまくコンパイルできなかった。

仕方なく、同雑誌付録CD-ROMのなかからlibraw1394_0.9.0.tar.gzlibavc1394-0.4.1.tar.gzを作った上でやってみたところ、うまくできた。

そしてうまく動いた。作者に感謝。

できたバイナリをgv1394tv_ctrlにおいとこう。
いい加減なMakefileも、ついでに。

    

2004年5月18日

mtawsasin.pl書き直すかなぁ

mtawsasin.pl 暫定公開していますが、その後ちょっとだけ手を入れています。
#小さな拡張と、細かなバグ取りだけです。
#まだ公開していません。

細かい変更するよりも、perl5の勉強兼ねてNet::Amazonを使ってさっくりと書き直すかなぁと考えています。

#やっぱりPerl5になっていろいろ拡張されたところにはついていけてないなぁ(^^;

Googleの方もNet-Googleを使えば、書ける人にはサクッと書けそうですね。

    

2004年5月10日

mtawsasin.pl 暫定公開

下記のようなものが出力できるMTのPluginを暫定公開します。

もうすぐ、prog/MTAwsAsin/に置きます。

小汚い部分があるので、腕に覚えがある方は、手直しして送って下さい。

追記:2004-05-16 21:20:40

も買うかなぁ。

    

plugin test(3) mtawsasin.pl

テストのため、
【booklog-biz】
すべてpluginでのリンク貼りに書き直してみた。

#もともとのASINが間違っているものなども発見して、意味があったかな(^^;
#価格なんて表示するまいかとも思ったのだが、あればあるで判断基準になって良いな。

ソースをきれいに直してくれる人がいれば、こっそりお渡しします。
きれいになった後で公開しようかな(^^;

    

2004年5月 9日

plugin test(2) mtawsasin.pl

洋書の場合のテスト
<MTAwsAsin asin="0393041530">

DVDの場合のテスト
<MTAwsAsin asin="B0000C0FK4">

CDの場合のテスト
<MTAwsAsin asin="B00003OTFK">

もとにしている「ねぎ師匠」の設計が良いので いじるポイントは分かりやすい。
しかし、いじって行くにつれてどんどん汚くなっている(^^; 続きも読む "plugin test(2) mtawsasin.pl"
    

plugin test mtawsasin.pl

作りかけのMT用のpluginのtestです。

bodyに書いているのは
<MTAwsAsin asin="4121001362">
の一行だけで、下のテーブルが出てくる作り。

カバーイメージがないと、下記の様にまだきちんと動かない。
対策案はあるので、時間が出来たら。←超Ad hocに対応しました(^^;

続きも読む "plugin test mtawsasin.pl"
    

plugin test

pluginを作ってみた。
と言っても、

mtmanual_programmatic.html

に書いているものそのものである。動くかな?

これ↓がpluginの出力
Uptime: <$MTServerUptime$>

続きも読む "plugin test"
    

2004年5月 8日

MT Process Tags Plugin test

MTのエントリー(body)にMTのタグを記述しても通常は無視される。

MT-plugins.orgでproccess Tagpluginを発見したので、導入してみた。

例えばbodyに
<$MTVersion$>
と書くと、現在の私のMTのバージョンに変更されるはずである。

ここに書いてます→「<$MTVersion>」

なんでこんなことをやっているかというと、
Amazon Web Service(AWS) を Movable Typeで使う方法。に書かれていることと、ほぼ同じようなことをしようと思ってである。

ただ、MTAmazonは機能が豊富すぎて単なるリンクを貼るにはかえって面倒なので、
ねぎ師匠のHyperNikkiSystem 用 ISBN タグ拡張リリースと同じことが出来れば良いなと。

    

2003年12月13日

Linuxのすすめ 〜 オープンソースソフトウエアの持つ意味 〜

本記事はKurume・Tosu Internet Conference 「The Journal of Internet」 Volume4,2000に掲載していただいた記事部分です。
既に3年以上前の話ですが、改めて書いておきます。

1. はじめに
最近ではLinuxと言う言葉をご覧になった方は多いと思います。Linuxは日本語では「リナックス」とか「リヌクス」などと発音されることが多いですが、その実体はコンピュータのハードウエアの動作を司るオペレーティングシステム(以下OSと略します)の中核をなすカーネル(日本語で言えばまさに「核」)です。 続きも読む "Linuxのすすめ 〜 オープンソースソフトウエアの持つ意味 〜"
    

2003年12月 1日

柴田(ひ)食堂福岡店

http://his.luky.org/ftp/pub/mirrors/
特にご愛顧頂いておりますlinux関連のweb/ftpのミラーサービスを継続してご提供いたします。httpでもアクセスできます。

Julius-users ML
lc99で話題になったLinuxなどで動作するフリーの高性能音声認識エンジンJuliusに関して議論するメーリングリストです。

のむら@ソニーさん作のPanasonic kxl-810 CD-ROM patch
うちでは安定して動いています。のむらさんありがとう(^^)

Linux usersのための新着情報ML
毎日3回、ring servers, ftp.rpmlinux.com,Linux新着情報ftpサイトなどでミラーしている各種Linux関連ソフトウエアのアップデート情報を配信するMLです。

Linux関連ドキュメント検索のフィードバック結果
現在は手動更新のため、ちょっと古いです(^^;。見せ方などのご意見募集中。

pppでのプロバイダ接続情報
LinuxからpppでISPに接続しているのであれば、設定情報を教えてください。
現在集まっているプロバイダの接続情報はppp-setting.eucでご覧いただけます。情報のご提供者に感謝m(_|_)m

OpenBlockS Usersの部屋
ちっちゃなPowerPCベースのLinux boxであるOpenBlockSの情報交換の場所です。

「幸せな家庭内LANへのメモ 〜 ADSL, rp-pppoe, ipchains, ipmasqadm, Dynamic DNS 〜」
自宅で行っているADSL関連の設定情報です

    

小料理1

ちょっとしたスクリプトです。自分で忘れないように置いときます。

rmdupfile.sh dir_name
あるディレクトリ(上記のdir_name)配下の重複しているファイルを削除するためのrmコマンドを表示するスクリプト。
そのままパイプでshellにつなげば実行できるが、一度表示してから確認してやる方が良いときもある。
同一かどうかはmd5sumの値を比較して判断している。

rmdupmail.sh FolderName
~/Mail/配下のMH形式の特定のフォルダ(上記のFolderName)内の重複しているメールを削除するためのrmコマンドを-i付きで実行するスクリプト。
同一かどうかはimgrepコマンドを利用している。

cd dir; dir2dot.sh
特定のディレクトリ配下の深い階層下のファイル名を、階層のディレクトリ名を.でつないだ名前に変換するmvコマンドを表示するスクリプト。
作業したいディレクトリにcdしてから実行。
スクリプト内のgsub()内の文字列は適宜変更して利用。
そのままパイプでshellにつなげば実行できるが、一度表示してから確認してやる方が良いときもある。

cat file | maddrm.pl
あるファイルからメールアドレスらしき文字列を削除するperl script。あくまでも「らしき」文字列のため、使う環境/対象ファイルに注意必要。

mklslist.sh
ls-lR.htmlを生成するためのスクリプト。
あまりのadhocさに公開がためらわれたが、遂に公開(^^;

rmbanner.sh dir_name
インターネット上を徘徊して収集したイメージデータを特定のディレクトリ(上記のdir_name)配下に蓄えているときに、そのイメージデータの中からバナー広告らしきイメージデータを捜し出して削除するrmコマンドを表示するスクリプト。
バナーかどうかの判断はパーフェクトにはできないが、identifyコマンドの出力するイメージの形状を利用。
そのままパイプでshellにつなげば実行できるが、一度表示してから確認してやる方が良いときもある。

    

2003年11月10日

TV record with iEPG on Linux box

新規作成 Ver.0.1 shibata@luky.org 2003-11-10 01:14:27

概要

インターネットTVガイドテレビ王国で利用可能な iEPGを利用したテレビ予約の仕組みです。
出来るだけ簡単な実装を心がけています。

基本的な構成

Server boxの構成

  • CPU: Pentium 2.4C GHz (オーバスペックかなぁ)
  • MEM: 1GB (これも、充分すぎるけど)
  • HDD: 120GB x 2 (ディスクはいくらあっても足りない...)
  • Video Capture card: SAA7134 card (ちょっとでも画質を良くと言う考えから...)
  • Sound card: Intel on-board
  • OS: Debian GNU/Linux sid
  • Sound subsystem: alsa
  • Video subsystem: ffmpeg
  • その他の要件:
    • インターネットからメールが送受信できること
    • atコマンド

Client boxの構成

  • OS: Debian GNU/Linux sid
  • Web Browser: galeon
  • その他の要件:
    • インターネットへメールが送信できること

基本的な動作の流れ

  • Linuxで動作させているクライアントPC上のWebブラウザでiEPGのリンクをクリックする。
  • その、クリックでダウンロードされるiEPGのデータをクライアントPCからサーバPCにメールで送信する。
  • サーバPCでは、受け取ったメールをスクリプトに食わせる。
  • そのスクリプトで、atコマンドでffmpegを用いた録画スクリプトの起動指定をおこなう。

今回の実装

Client side

クライアント側は、WebブラウザでiEPG情報をダウンロードする。
例えば、インターネットTVガイドでは 番組表の[iEPG]のマークをクリックすることで、
下記のようなデータがダウンロード出来る。

 Content-type: application/x-tv-program-info; charset=shift_jis
 version: 1
 station: TVQ
 year: 2003
 month: 11
 date: 09
 start: 05:00
 end: 06:00
 program-title: 演歌◇健康

上記のデータにより、(一部の情報を補ってあげれば)録画予約設定に
必要な情報が得られることが分かる。
あとは、この情報を自動的にサーバ側に登録する仕組みを作れば良い。

よって、クライアントサイドで、上記のmime情報を自動的に
処理するスクリプトをブラウザ側に登録する。
下記のスクリプトは/usr/local/bin/iepg.shとして置いておく。

 #!/bin/sh
 #    iepg.sh  2003.11.09 Hisaaki Shibata<shibata@luky.org>
 #
 nkf -e $1 |mail -s iEPG icommand@server.uriuri.com

いかにも「そのまんま」なスクリプトである(^^;

Subject:やメールの送信先は、適宜変更する必要がある。

次に、 Content-type: application/x-tv-program-infoのデータをダウンロードするときに
このスクリプトが自動的に起動するようにする必要がある。
galeonの場合は、~/.galeon/mimeTypes.xmlに

 <mimeitem name="application/x-tv-program-info" action="2" helper="/usr/local/bin/iepg.sh" helperNeedsTerminal="0" helperTakesUrl="0" alwaysUse="1"/>

などと記述すれば良い。

mailの送信先を自分のアドレスにしてみて、テストをすると良いでしょう。
尚、上記を見て気づかれたと思うが、iEPGのフォーマットさえ守れば、
人間がメールを送っても同じ事が出来る。
同じチャネルで連続して録画したいときなどは、独自にメールを作成して
送ればいいでしょう。

Server side

サーバ側は、クライアント側から送信されたメールを処理して、
しかるべき時刻に録画コマンドを起動する処理をおこなう必要がある。

/etc/aliasesに下記のような記述を追加し、root権限でnewaliasコマンドを実行する。

 icommand: "|/usr/local/bin/icommand.sh"

つまり、icommand@server.uriuri.com宛のメールが届くと、
そのメールの内容をicommand.shの標準入力に流し込んで起動すると言う設定である。

/usr/local/bin/icommand.shの内容を下記に示す。

 #!/bin/sh
 #    icommand.sh  2003.11.09 Hisaaki Shibata<shibata@luky.org>
 #
 
 nkf -e $1 |sed 's/:/ /g'|awk '
 /station  KBC/		{channel=1;bc="KBC";}
 /station  NHK総合/	{channel=3;bc="NHK";}
 /station  RKB/		{channel=4;bc="RKB";}
 /station  NHK教育/	{channel=6;bc="NHKedu";}
 /station  TNC/		{channel=9;bc="TNC";}
 /station  TVQ/		{channel=19;bc="TVQ";}
 /station  FBS/		{channel=37;bc="FBS";}
 /year /			{year=$2;}
 /month /		{month=$2;}
 /date /			{date=$2;}
 /start /		{startH=$2;startM=$3;}
 /end /			{endH=$2;endM=$3;}
 
 END	{if (endH >= startH) {
 	   len = (endH * 60 + endM - startH * 60 - startM) * 60 - 10;
 	 }else {
 	   len = ((24 + endH) * 60 + endM - startH * 60 - startM) * 60 - 10;
 	 }
 	printf("echo /usr/local/bin/va1000cap.sh %d %d \
 	/var/tmp/%s-%4d-%02d-%02d_%02d%02d\ > \
 	/tmp/%4d-%02d-%02d_%02d%02d.shn\
 	at -f /tmp/%4d-%02d-%02d_%02d%02d.sh\
        %02d%02d %4d-%02d-%02d\n,\
 	channel,len,\
 	bc,year,month,date,startH,startM,\
 	year,month,date,startH,startM,\
 	year,month,date,startH,startM,\
 	startH,startM,year,month,date);
       }
 '|sh

上記のスクリプトは、

  • /tmpにYear-Month-Date-HourMinute?.shというshell scriptを作成し、
  • そのscriptの中で/usr/local/bin/va1000cap.sh channel len outputfile.aviを指定している。
  • その後、atコマンドで/tmp上のスクリプトの定時起動を指定している。

この例は、福岡市の場合であり、テレビ局名とチェンネル番号は、
各地域毎に作り直す必要がある。

それにしても、こてこての泥臭さである(^^;

さて、上記スクリプトでさらに起動されているva1000cap.shの内容を下記に示す。

 #! /bin/sh
 # va1000cap.shby Hisaaki Shibata <shibata@luky.org>.
 
 NAME=va1000cap.sh
 DATE=`date +%Y%m%d%H%M`
 /usr/sbin/alsactl -f /home/shibata/asound.state restore
 
 /usr/bin/v4lctl setchannel $1
 
 /usr/bin/ffmpeg -f avi -vcodec msmpeg4v2 -hq -acodec mp3 -y -b 1200 -ab 128 -r 30 -s 384x288 -cropbottom 6 -cropleft 4 -cropright 4 -ar 22050 -ac 2 -t $2 $3-c$1-$DATE.avi
 
 exit 0


出力AVIファイル名の指定などに冗長なところがあるが、指定した時刻と、
実際に動作した時刻を比較するためのものであり、必要に応じていじっていただきたい。

また、この程度のスクリプトであれば、別途作成せず、
直接icommand.shで記載しても良いと思う。

SA7134のボードでのキャプチャの設定やffmpegに関しては、おいおい追記する。
Last modified: Mon Nov 10 02:55:12 JST 2003     

2003年9月22日

SHARP Mebius MURAMASA PC-MV1-VC1覚え書き

SHARP Mebius MURAMASA PC-MV1-VC1覚え書き/(柴田ひ) 2003-09-22 (月) 00:23:14

  • Intel chip以外のノートPCは初めてだったので、いろいろ楽しめてます。
    • デスクトップだと、古くはAMD 5x86-133やCyrix 686、自宅のBBIQゲートウエイにVIA-C3を使ったVIA-EPIAなどを使っていて、決してIntelべったりではないのですが。
    • このノートPCはAMD Athlon XP-M 1500+と言うやつで、ヨドバシで3番目に安かったので決めました。ちなみに1番と2番目に安かったのは、薄っぺらいmuramasaの方。
  • 無線LANが内蔵されていると思ったら、マニュアルを読むとオプションだった。ヨドバシの店員は内蔵していると言ってたような気がしたんだけど...
    • オプションが搭載できると思われる底面のカバーの下には、ミニPCIスロットがあり、モデムらしいモジュールがあった。
    • いろいろやってもカーネルで認識されずに悩んでいのだが、マニュアルを先に見ておくんだった(^^;
  • 初期のディスクレイアウトには謎のパーティションがあった。たぶん、マニュアルの記述などから推測すると、HDDからのリカバリを行うためのデータが入っているのだと思われる。
    • 買ってすぐにユーザ登録もせずにリカバリCDの作成を行ってすぐにfdiskでWindowsXPのパーティションを消してLinuxを入れた。
    • 下記のパーティションのうち、1,2はLinuxを入れるときにfdiskでで切り直した、3はオリジナルのままである。
 Disk /dev/sda: 255 heads, 63 sectors, 4864 cylinders
 Units = cylinders of 16065 * 512 bytes
 
   Device Boot    Start       End    Blocks   Id  System
 /dev/hda1   *         1      4012  32226358+  83  Linux
 /dev/hda2          4013      4226   1718955   82  Linux swap
 /dev/hda3          4227      4864   5124735   de  Dell Utility

  • 内蔵HDDは日立製DK23EA-40であり、40GB、4200rpm、消費電流0.5Aであった。
  • 上記HDDを日立製DK23FB-60 (60GB、5400rpm、消費電流0.6A)に交換した。
    • Webであれこれ調べたが、どこのねじを外せば良いのか良くわからなかった。よって、仕方なく底面のねじをすべて外した。
    • HDDの場所は、回転音や温度などから、左手のパームレストの下だと予想していたためキーボード手前のパームレストをいじっていたところ、そこだけパカッと外れた。今にして思えば、パームレストの下のねじだけ外せば良かった。
    • HDDには、金属(ステンレス製と思われる)カバーとコネクタ部分にコネクタ形状変更をさせるような延長コネクタがついていた。
    • 金属カバーは、底面のねじで固定されており、ゆっくり引き出すとHDDごと本体から取り外せた。
    • カバーとHDDの4本のねじを外して、延長コネクタもゆっくり外した。
    • 交換するHDDを同様にカバーに取り付け、ケースに挿入した。
    • 後はねじを締めておしまい。
    • ブート時のBIOSでも60GBと認識されていた。
  • 交換後のパーティションは以下の通り。ディスクが大きくなったこともあり、話のネタにリカバリCDからWindows XP Home editionを戻してみた。一応きちんと動いている。
    • パーティション3は、元のHDDをUSB2.0インタフェースの外付けケースにつっこんだ後でddにてコピーしている。
    • swapはこんなに大きくしたくなかったのだけど、パーティション1と2を適当に割り当てていていた関係で、このようなサイズになった。
 Disk /dev/hda: 255 heads, 63 sectors, 7296 cylinders
 Units = cylinders of 16065 * 512 bytes
 
    Device Boot    Start       End    Blocks   Id  System
 /dev/hda1   *         1      1275  10241406    7  HPFS/NTFS
 /dev/hda2          1276      6374  40957717+  83  Linux
 /dev/hda3          6375      7012   5124735   de  Dell Utility
 /dev/hda4          7013      7296   2281230   82  Linux swap
  • 再インストールはDebianの素にしようかとも思ったけれど、頂き物のARMA2.1があるので、これにしました。Atokも入っていて、それなりに幸せ。
    • ただし、ARMAの素のカーネル(2.4.18も2.4.19も)のままだと、apmかacpi周りが何となくおかしく、CPU-FANのあたりから「キーン」という音がでるものの、回転していない状況になる。非常に高温になり危険な状態だったので、ブロアスプレーで冷やしながら、インストール実行。
      • 最初は、HDDを交換したときに、FAN近辺をいじってしまって物理的に何か接触していて回らなくなったのかとビビッたが、リブート時のBIOS動作中は回転して、カーネルブートとともに回転が止まったので、ソフト的なものだとわかった。
      • ちなみに、HDD交換前の自前Makeしたカーネルでは、きちんとFANは回転していた。
    • インストール終了後、取り外したHDDからサクッと以前のカーネル、カーネルモジュールをコピーしてリブートさせたところ、FANも回って一安心。
  • 内蔵のデバイスはlspciによると、下記のようになっている。
 00:00.0 Host bridge: VIA Technologies, Inc. P/KN266 Host Bridge
 00:01.0 PCI bridge: VIA Technologies, Inc. VT8633 [Apollo Pro266 AGP]
 00:05.0 CardBus bridge: Ricoh Co Ltd RL5c475 (rev b8)
 00:05.1 FireWire (IEEE 1394): Ricoh Co Ltd: Unknown device 0551
 00:06.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C(rev 10)
 00:10.0 USB Controller: VIA Technologies, Inc. USB (rev 80)
 00:10.1 USB Controller: VIA Technologies, Inc. USB (rev 80)
 00:10.3 USB Controller: VIA Technologies, Inc. USB 2.0 (rev 82)
 00:11.0 ISA bridge: VIA Technologies, Inc. VT8233A ISA Bridge
 00:11.1 IDE interface: VIA Technologies, Inc. Bus Master IDE (rev 06)
 00:11.5 Multimedia audio controller: VIA Technologies, Inc. VT8233 AC97 Audio Controller (rev 50)
 00:11.6 Communication controller: VIA Technologies, Inc. AC97 Modem Controller (rev 80)
 01:00.0 VGA compatible controller: S3 Inc. VT8751 [ProSavageDDR P4M266] VGA Controller
  • 上記のうち、CardBus、FireWire、Ethernetは特になにも考えずに認識されている。
  • AudioはOSSでは今ひとつ動きが変(irqの処理がおかしいのか、短い音声データの再生でも音が鳴り終わらずに、とぎれとぎれになりながら長くなり続く。
  • 仕方がないので(?)alsaを入れている。snd-via8233(バージョンによっては、snd-card-via82xxかな?)で、音はなっている。
  • ARMA2.1の素のカーネルだと、IDEコントローラもきちんと認識されず、内蔵HDD、内蔵DVD/CD-RWドライブもPIO転送になってしまいます。これもカーネルを作り直して、/etc/init.d/ideを書き直せば大丈夫。このように書いています。
 #!/bin/sh
 # this script was generated by ogl-tools
 
 case "$1" in
    start)
        echo "Setting IDE devices ..."
        /sbin/hdparm -c 1 -d 1 -m 16 -X 69 /dev/ide/host0/bus0/target0/lun0/disc
        /sbin/hdparm -c 1 -d 1 -m 16 -X 69 /dev/ide/host0/bus1/target0/lun0/cd
        ;;
    stop)
        ;;
    restart)
        echo "Reloading IDE setting..."
        /sbin/hdparm -c 1 -d 1 -m 16 -X 69 /dev/ide/host0/bus0/target0/lun0/disc       
        /sbin/hdparm -c 1 -d 1 -m 16 -X 69 /dev/ide/host0/bus1/target0/lun0/cd
        ;;
    *)
        echo "Usage : /etc/init.d/ide {start|stop|reload}"
        ;;
 esac
 exit 0
  • DMAをありにして、ディスクの回転数もちょっと速くなったおかげか、HDD交換前より何となくレスポンスが良くなった気がする。
  • 問題はVGAコントローラである。Xはvesaドライバで動くものの、アクセラレーションが全く効かないのでブラウザでのスクロールなどは、のたっとした感じ。
    • S3 ProSavageなので、何とかなりそうな気がしているけど、まだ手を出していない。
    • S3用のXサーバだと、「そんなチップは知らないよ」と言うメッセージで認識してくれない。
    • ちょっと探してみると、こんなのがあるらしい。 http://www.probo.com/timr/savage40.html
    • Debian woodyではXFree86-4.2.xが動いているため、 http://www.probo.com/timr/xf42sav-27t.tgz をダウンロードし、展開してしかるべきところに置いてみた。
    • /etc/X11/XF86config-4のDevice Sectionだけを下記のように書き換えました。
 Section "Device"
     Identifier  "Card0"
 #    Driver      "vesa"
     Driver      "savage"
     BusID       "PCI:1:0:0"
     Screen      0
     VendorName  "VIA"
     BoardName   "VT8751 [ProSavageDDR P4M266]"
 EndSection
  • リブートしてXが無事立ち上がった(^^)。LCDがちょっとちらつき気味で、明らかに挙動が変わっている。/var/log/XFree86.0.logも確認したところ、
 (--) PCI:*(1:0:0) S3 unknown chipset (0x8d04) rev 0, Mem @ 0xe8100000/19, 0xf0000000/27

とでてくるが、その後の方で

 (II) LoadModule: "savage"
 (II) Loading /usr/X11R6/lib/modules/drivers/savage_drv.o
 (II) Module savage: vendor="The XFree86 Project"
        compiled for 4.2.1, module version = 1.1.27
        Module class: XFree86 Video Driver
        ABI class: XFree86 Video Driver, version 0.5

とあり、無事読み込まれた模様。

  • ブラウザを開いて、スクロールさせてみるが、サクサクしており、いい感じになりました。
    

2003年1月14日

network block deviceの実験

OBSSを使って題記の実験をしてみました。

修理から戻ってきてDebianをインストールしたOBSSをnbdのクライアントにして、
自宅LAN内のPentium4マシン(これもDebian)をnbdのサーバにしてみました。

また、それだけではおもしろくないので、nbdサーバ側は2つのサービスをあげて
それをsoftware RAID 1でmountしてみています(^^;


<サーバの設定>
まず、サーバ側の設定ですが、apt-get install nbd-serverの後の質問に答えますが、
最終的には/etc/nbd-serverを設定すればいいようです。
とりあえず、実験サーバでは下記のようにしています。


NBD_PORT[0]=7777
NBD_FILE[0]=/home/nbd-export1
#NBD_SERVER_OPTS[0] is unset, but can contain -r, -m, -c or -a.

NBD_PORT[1]=7778
NBD_FILE[1]=/home/nbd-export2
#NBD_SERVER_OPTS[1] is unset, but can contain -r, -m, -c or -a.

#See nbd-server(1) for their meanings
#
#If you don't want this file to be rewritten after installation or upgrade,
#uncomment the following line:
#AUTO_GEN=n


/home/nbd-export1と/home/nbd-export2は下記のようにして作っています。

# dd if=/dev/hda of=/home/nbd-export1 bs=2k count=1M
# cp /home/nbd-export1 /home/nbd-export2

その後、 /etc/init.d/nbd-server startでサービスが動き出します。
ps -axwwで見るとこんな感じ。


12512 ? S 0:00 /bin/nbd-server 7777 /home/nbd-export1
12513 ? S 0:00 /bin/nbd-server 7778 /home/nbd-export2
12514 ? S 0:24 /bin/nbd-server 7777 /home/nbd-export1
12515 ? S 0:26 /bin/nbd-server 7778 /home/nbd-export2

ちなみに、サーバのIPアドレスは192.168.0.100としています。


<クライアントの設定>
次にOBSS側でクライアントの設定です。
こちらもapt-get install nbd-clientの後の質問に答えますが、
設定ファイルは/etc/nbd-clientです。

実験マシンではこんな感じ。


# If you don't want to reconfigure this package after installing, uncomment
# the following line:
AUTO_GEN="n"
#
# Name of the first used nbd /dev-entry:
NBD_DEVICE[0]=/dev/nd0
#
# Type; s=swap, f=filesystem (with entry in /etc/fstab), r=raw (no other setup
# than to run the client)
NBD_TYPE[0]=f
#
# The host on which the nbd-server process is running
NBD_HOST[0]=192.168.0.100
#
# The port on which this client needs to connect
NBD_PORT[0]=7777
#
# The second networked block device could look like:
NBD_DEVICE[1]=/dev/nd1
NBD_TYPE[1]="f"
NBD_HOST[1]="192.168.0.100"
NBD_PORT[1]="7778"

/dev/nd0と/dev/nd1は以下のようにして作りました。
# mknod /dev/nd0 b 43 0
# mknod /dev/nd1 b 43 1

ここで/etc/init.d/nbd-client startでクライアントとして動き出しますが、
fsckが出来ないとか何とか文句を言われますが、無視して次へ(^^;

#file systemを作っていないから、文句言われて当然なので。


<クライアントでのsoftware RAIDの設定>
さらに、OBSS側でsoftware RAIDの設定をします。
apt-get install raidtools2を行った後に、/etc/raidtabを作ります。
実験OBSSでは以下のような感じ。


# raid-1 configuration
raiddev /dev/md0
raid-level 1
chunk-size 16
nr-raid-disks 2
nr-spare-disks 0

device /dev/nd0
raid-disk 0

device /dev/nd1
raid-disk 1

その後、
# mkraid /dev/md0
でうまく動けばサーバとクライアント間でネットワークのやりとりが発生し、
HUBのActiveランプが点滅を始めると思います。

これは、RAID1の構築(ディスク間の同期合わせ)を行っているためです。
この進み具合は cat /proc/mdstatを実行すればわかります。

同期合わせを行っているのもかまわずに(^^;、
# mke2fs /dev/md0
を行います。

#実はOBSをクライアントにした場合もやってみたのですが、
#このmke2fsでエラーになりました。原因調査予定。

同期合わせはこの間も進んでいますが、そのうち終わって/proc/mdstatを見ると
以下のようになるはずです。


Personalities : [raid1]
read_ahead 1024 sectors
md0 : active raid1 [dev 2b:01][1] [dev 2b:00][0]
2097088 blocks [2/2] [UU]

ここまで来たら(来る前でも良いのですが)、mountしてみましょう。
# mount -t ext2 /dev/md0 /mnt/

mount後のdfの結果はこんな感じです。


# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda1 38198332 25646976 10610960 71% /
/dev/md0 2064144 1362136 597156 70% /mnt

#70%にもなっているのは、すでにファイルをコピーした後だからです。
#ちゃんとしたコピー時間は計っていません(^^;


<考察>
この例では、通常のファイルシステムに使っていますが、
nbdはswapにも使えるようなので、CFだけで組んでいるOBSSでも
かなりいろんなことが出来るようになると思います。

また、今回は1台のサーバに対してsoftware RAID1にしていますが、
これを2台に分けるとか、片方をlocal device、もう片方をremote deviceに
するなど行えば、none shared storageタイプのactive-standby構成の
クラスタも組めるのではないかと思っています。

#OBSSでここまでやるべきかと言うと、ちょっと疑問ですが(^^;

今後はnfsとの性能比較などもしてみたいと思います。


<参考文献>
/usr/src/linux/Documentation/nbd.txt
http://www.it.uc3m.es/~ptb/nbd/

    

2002年8月20日

USB 1.1 vs USB 2.0 Benchmark

「USB 1.1 vs USB 2.0 Benchmark 〜 Storage deviceの場合 〜」

http://his.luky.org/doc/usb-bench.html

Ver0.3 2002-08-20 Copyright(C) 2002, Hisaaki Shibata/柴田 尚明@福岡市
shibata@luky.org

LinuxでUSBインタフェースを利用して外付HDDを接続してみました。 外付HDDそのものは「USB 2.0対応」と明記されていたので、 手元のノートPC内蔵のUSB 1.1と PC card の USB 2.0 インタフェースに 接続して非常に簡単な性能比較を行なってみました。

ご意見は、柴田までメールでお願いします。
尚、本ドキュメントは全文丸ごとであればどこへでも転載可能/リンク可能です(^^)


目次

0 .来歴・トピックス
1 .経緯
2 .関連情報/参考文献
3 .用意したhardware
4 .用意したsoftware
5 .性能測定
6 .いくつかの問題点
7 .TODO
8 .謝辞


0.来歴・トピックス

[次へ][目次へ]

2002-08-20 Ver. 0.3

  • CardBus USB2.0インタフェースカードのチップ記述追加
  • PCI USB2.0インタフェースカード経由の性能測定結果追記
2002-08-17 Ver. 0.2
  • 写真やリンク追加
2002-08-16 Ver. 0.1
  • 新規作成


1.経緯

[次へ][前へ][目次へ]

「ディスクが足りない。」この問題は、いつまでたっても付きまといます。 たとえノートPCの内蔵ディスク容量が1年毎に倍になったとしても、 何故か足りません。
私がメインで業務に利用しているノートPC Hitachi FLORA 220FX も 内蔵ディスク容量が20GBと一昔前では考えられないほどの容量になっても、 気がつくと使用率が90%を超しています。
これでは日々降り注ぐ添付ファイル付のメール豪雨を乗り切る事は出来ません(^^;

と、言う理由でUSB接続の外付HDDを購入する事にしました(^^;;
外付ケースにはどれも一長一短あったのですが、ドライブベイタイプとしても使えるものが比較的安く、しかも USB 2.0とあったので、購入してみました。

ついでと言っては何なのですが、ノートPC内蔵インタフェースであるUSB 1.1経由と、CardBusのUSB 2.0アダプタ経由で性能比較を行なってみました。


2.関連情報/参考文献

[次へ][前へ][目次へ]


3.用意したhardware

[次へ][前へ][目次へ]

性能を計った事もあり、ある程度正確にモデル名を示すようにします。

  • ノートPC 日立FLORA 220FX NP2のPentium III 750MHzモデル
  • 2.5インチハードディスクケース Century CDC25U2/35I左側が上蓋で、右側がHDDを内蔵したケースです。
    尚、このカードのUSBコントロールチップは、lspciの結果NEC製らしい事がわかりました。
    hong:/home/shibata# lspci 
    00:00.0 Host bridge: Intel Corp. 440BX/ZX - 82443BX/ZX Host bridge (rev 03)
    中略
    00:0a.0 CardBus bridge: Texas Instruments PCI1410 PC card Cardbus Controller (rev 02)
    中略
    02:00.0 USB Controller: NEC Corporation USB (rev 41)
    02:00.1 USB Controller: NEC Corporation USB (rev 41)
    02:00.2 USB Controller: NEC Corporation: Unknown device 00e0 (rev 01)
      
  • 2.5inch HDD IBM Travelstar 40GN(IC25N040ATCS04) 40GB 4200rpm
  • USB2.0 CardBus PC Card RatocREX-CBU2

FLORA 220FX NP2は USB1.1インタフェースを内蔵しているのですが、USB2.0は非対応であるため、 CardBusのUSB2.0インタフェース REX-CBU2 を利用しました。

CDC25U2/35Iへの給電は、USBのバスパワーが基本なのですが、足りない場合に備えてPS/2インタフェースから5Vを取り出すケーブルが添付されています。今回もこのケーブルを利用しました。

尚、 CDC25U2/35I の中にはHDDのATAインタフェースに接続する小さな基板 が入っているだけのシンプルなものです。
その基板上には in-system と書かれたインタフェース変換らしいチップが載っていました。
探してみたところ、CypressのISD300A1のようです。


4.用意したsoftware

[次へ][前へ][目次へ]

4.1 Linux ディストリビューション

どのようなディストリビューションでもいいと思います。
今回はDebian GNU/Linux 3.0(woody)で行ないました。

4.2 linux-2.4.19.tar.bz2 or later

2.4.19からUSB2.0(ehci)が正式サポートされた事もあり、 ソースからmakeしたカーネルを利用しました。


5.性能測定

[次へ][前へ][目次へ]

5.1 ls -lR

USB経由でfsck,mke2fsを行なった外付HDD上に数万個以上のファイルをコピーし ました。ノートPCにmountした上でmountしたトップディレクトリから


# time ls -lR|tail
を実行した結果を示します。
multi user modeで動作させたままでしたが、 他には特段重たいプログラムは動かしていない状態での測定です。

USB 1.1 USB 2.0
real 14m49.500s
user 1m10.140s
sys 0m19.560s
real 9m11.731s
user 1m10.800s
sys 0m20.150s
このテストでは、USB2.0の場合はUSB1.1に比べて約1.6倍高速化されました。

5.2 find and cat

同じく100kbytes程度の数千個以上のファイルがある外付HDD上の ディレクトリ上で


# time find . -type f -exec cat {} \; > /dev/null
を実行した結果を示します。
multi user modeで動作させたままでしたが、 他には特段重たいプログラムは動かしていない状態での測定です。

USB 1.1 USB 2.0
real 24m52.944s
user 1m52.160s
sys 0m22.390s
real 4m7.810s
user 1m52.460s
sys 0m23.360s
このテストでは、USB2.0の場合はUSB1.1に比べて約6.0倍高速化されました。

尚、それぞれのテストはUSB1.1→USB2.0の順番で実施しましたが、 USB1.1のテスト終了後に外付ドライブは一度unmountし、別のmount pointに マウントした後に測定しています。
また、find & catでのusb2.0でのテストの後にもう一度usb1.1でテストを 行ないましたが、real で3秒程度の差しかなく、ファイルバッファの影響は 排除できているのではないかと判断します。

ディスクを同じくIBMの Travelstar シリーズの IC25N020A に変更し、Pentium III 673MHz x 2の自作SMPマシンに GIGABYTEのUSB2.0インタフェースカードである GC-USB20N に変更して同じファイル群での性能測定も行ないました
ドライブそのものは一世代前のものなので、性能は低くなるかと 思ったのですが、まずはその結果を以下に示します。

USB 2.0
real 2m7.539s
user 0m8.080s
sys 0m14.160s
CPUパワーがあるのが効いたのか、PCIバスのUSB2.0インタフェースカードが 効いたのか、Note PCにCardBusインタフェースの更に2倍程度の性能に なっています。


6.いくつかの問題点

[次へ][前へ][目次へ]

CardBusのUSB2.0インタフェースカードは、以前のカーネルではきちんと認識してくれなかったのですが、linux-2.4.19ではすんなり認識しehci-hcdモジュールが組み込まれたのですが、USB2.0インタフェースを利用した後にCardBusを抜去すると、カーネルごと固まってしまいます(^^;
手動でehci-hcdモジュールをrmmodした後に抜去すると問題ありません。
もう少し調査してみようと思います。


7. TODO

[次へ][前へ][目次へ]

7.1 必ずやる

(1)bonnie++などの ベンチマークソフトウエアを用いて、内蔵HDDも含めた比較を行ないます。
(2)ファイルサイズを変えてみてテストを行なう。

7.2 気が向いたら...

(1)その他のマシンでも測定してみる。 (2)ファイルサイズ別のアクセス結果をグラフの形でまとめる。

7.3 お金があったら...

(1)IEEE1394インタフェースの外付HDD箱との比較をしてみたいが、 箱を買うお金が...

8.謝辞

[次へ][前へ][目次へ]

私がLinuxを使えるようにしてくださったすべての方に感謝いたします。
また、この文書作成にあたっては、JFをはじめとする多くのドキュメントを参考にさせて頂いています。ありがとうございますm(_|_)m

以上
[玄関へ] [総本店へ]
Last modified: Tue Aug 20 02:43:15 JST 2002     

2002年5月18日

Happy Linux Home-LAN with ADSL, rp-pppoe, ipchains, ipmasqadm, Dynamic DNS

「幸せな家庭内LANへのメモ 〜 ADSL, rp-pppoe, ipchains, ipmasqadm, Dynamic DNS 〜」

http://his.luky.org/doc/adsl.html

Ver0.3 2002-05-18 Copyright(C) 2002, Hisaaki Shibata/柴田 尚明@福岡
shibata@luky.org

Linuxを家庭のゲートウエイとしてADSLでInternet接続する場合の各種設定に関してメモにまとめました。
思い返せば1996年5月に
「IP masqueradeとkerneldによるon-demand PPPで幸せな家庭内LANへのメモ」 からはや5年経ち、Internetへの接続環境も大きく変わりました。
当時は個人での常時接続は一部のリッチなユーザのものでしたが、現在は月額数千円でMbitオーダの接続回線が手軽に使えるようになりました。
これらをより使いこなすためにLinuxを使って簡単に設定できるところをまとめます。
ご意見は、柴田までメールでお願いします。
尚、本ドキュメントは全文丸ごとであればどこへでも転載可能/リンク可能です(^^)


目次

0 .来歴・トピックス
1 .経緯
2 .関連情報/参考文献
3 .用意したhardware
4 .用意したsoftware
5 .動作確認をしたもの
6 .いくつかの問題点
7 .TODO
8 .謝辞


0.来歴・トピックス

[次へ][目次へ]

2001-09-16 Ver. 0.1

  • 新規作成
2001-10-09 Ver. 0.2
  • 誤記訂正/ADSL種別の記述追加
2002-05-16 Ver. 0.3
  • 誤記訂正とその後の経過を追記

1.経緯

[次へ][前へ][目次へ]

家庭内LANもすっかり定着・安定してきたわが家ですが、ここ5〜6年の間に 外部接続は28.8kbpsでのモデム接続からISDNによるオンデマンドダイヤルアップ、 さらにはフレッツISDNによる常時接続へと進化してきました。

これらの進化は、接続時間を伸ばして常時接続にするという方向での進化でした。 家庭内のクライアント向けのサービスとしては、多少遅くても常時接続が出来ている と言うことが重要であり、ほぼ要求を満たすものでした。

一方、外部へのサービスを行うというニーズに対しては、ある程度高速な接続が必要であり、外部の太いネットワークに接続されているところにサーバをハウジングしなければなかなか難しいものでした。

しかしここに来て、ADSL、CATV、無線接続、FTTHといった高速接続環境も広く普及が始まっています。
こうなると、自宅のサーバを公開することも夢ではなくなりました。
ハウジング先に「リセットスイッチを押してくださいm(_|_)m」とお願いすることも 必要ありませんし、ディスクを増やすのも自由自在です。
#お金が続く限りにおいてですが(^^;

この文書では、サーバ公開をする上で必要な各種設定についてLinuxで実現する方法を順に示していきます。
手順としては、まず接続(PPPoE)、家庭内を守るファイヤーウォール(ipchains)、 サーバを公開する方法(ipmasqadm)、公開したサーバにhost名を割り振る方法(BINDでのDynamic DNS)と言う流れで説明します。
間違いや、より良い方法などありましたら教えてください。


2.関連情報/参考文献

[次へ][前へ][目次へ]


3.用意したhardware

[次へ][前へ][目次へ]

  • 複数台のPC+NIC
  • HUB
  • UTP Cable
  • ADSL modem

実際の自宅のネットワーク構成(の一部(^^;)を下図に示します。
ちなみに、わが家はもともとISDNを引いており、ADSLを引く機会に、若干のコスト低減をもくろんで、メタル回線に戻そうとしたのですが、電話番号が変わると言われたため、そのままISDNを残しています。(タイプ2接続と呼ばれているものです。)

タイプ2だとISDNとの干渉が問題になるかとも心配したのですが、今のところ退官できるような不具合は全くありません。

割り当てられるIPアドレスが、接続都度変更になるのは何とかしてほしいけど...
ADSL modemはNTT西日本のレンタルであり、modemとマシンA(hets)の間は10B-Tですが、家庭内は100B-Tです。
家庭内LANを使う場合、プライベートaddress空間を使うべきですね。 私は、192.168.0.0/24を使っています。
今回の主役は、ゲートウェイとなっている下図中のノートPC機であるマシンA(hets)です。


Internet<-->ISP
             |
            NTT
             |
        [ADSL modem]
             |
             |eth0
      .------+-----.                               .------------.
      |A    NIC    |                               |B           |
      |            |eth1                           |            |
      |         NIC+--------------+  +-------------+NIC         |
      |Note PC     |192.168.0.123 |  | 192.168.0.12|            |
      `------------'hets          |  |             `------------'hat
                                  |  |
      .------------.           .--+--+--.          .------------.
      |C           |           |        |          |C           |
      |         NIC+-----------+        +----------+NIC         |
      |            |           | HUB    |          |            |
      |            |           `--------'          |            |
      `------------'hawk                           `------------'hill

各マシンの概略仕様はそのうち追記します。
すべてLinuxを使っています。ライセンス上の問題は何もありません(^^)。


4.用意したsoftware

[次へ][前へ][目次へ]

以下のソフトウエアや設定は、ADSL modemに接続されたマシンAで実施します。

4.1 Linux ディストリビューション

どのようなディストリビューションでもいいと思います。
最近、「楽だなぁー」と思うのはVineです。redhat用の豊富なrpmが使える上に、 debianで確立されたaptが使えます。
rpmの取得には堀尾さん@北九州が砂場で運営している ftp.rpmlinux.com がおすすめですね。
いじり倒すなら相変わらずSlackwareかPlamoだと思います。 Debianもきっちり作るにはおすすめです。

最近の自宅内のマシンはほとんどがDebian/Gnu Linux woodyになってしまいました。
一度apt-getの楽さを知ってしまうと「もう他ではだめ」なのかも知れません(^^; (2002-05-18)

4.2 linux-2.2.19.tar.bz2 or later

2.4系のカーネルは、自宅内の実験マシンでは既に実用的に使えていますが、 ゲートウェイとして安定的に使うのは、自分の慣れの意味もあり2.2系にしました。
カーネルはディストリビューション付属のものではなく、自前で再構築しています。

カーネルも自宅内のマシンのほとんどは2.4.xです。(2002-05-18)

4.3 rp-pppoe-3.3 or later

PPPoEの実装はいくつかありますが、2.2系列で良く使われるのはrp-pppoeです。
本家は http://www.roaringpenguin.com/pppoe/ です。
lukyでも公式にミラーしていて http://roaringpenguin.luky.org/pppoe/ からもとれます。
redhat系のディストリビューションをお使いであれば、rpmを持ってきてそのまま

rpm -i
するか、srpmを持ってきて
rpm --rebuild
としてrpmをつくってからインストールしてください。
tar.gzのソースを持ってきた方はtar xvfzした後に、展開されたディレクトリにcdして
./go
で構築できます。
実は、NTT西日本はフレッツADSLを契約すると各OS用の接続キットを CD-ROMに詰め込んで送ってくれて、Linux用のPPPoEのキットもソース込で 付いてくるのですが、MTUの設定関連でアクセスできないWebサイトがあるとか いろいろと不都合があり、結局はrp-pppoeに落ち着きました。
今では安定して動いています。

次に以下の設定fileを作ります。
専用の adsl-setup と言うコマンドでもある程度作れます。
詳しくは how-to-connect.txt を見てみましょう。

/etc/ppp/options.pppoe

lock
noipdefault 
holdoff 10	# wait 10 secs before trying to reopen connection

lcp-echo-failure 4	# Connection is timedout after 4 failed echo requests
lcp-echo-interval 0	# Send an lcp echo request every 30 secs.
mtu 1454	#required PPP transmit frame size for PPPoE to fit in 1500
mru 1454	#required PPP receive frame size for PPPoE to fit in 1500
receive-all	#permits some flexabililty in converting ethernet frames
noauth		#AC will not have to authenticate itself to your system
#nopcomp	#RFC-2516 pcomp NOT RECOMMENDED. If they ask, ok to allow.
noaccomp 	#RFC-2516 MUST NOT ask for ACFC

/etc/ppp/pppoe.conf

コメント行は除きました。
ETH='eth0'
#「ユーザID」と「ISPのドメイン名」は各人の設定に合わせてね
USER='ユーザID@ISPのドメイン名'
DEMAND=no
DNSTYPE=SPECIFY
USEPEERDNS=no
# 「DNS1」「DNS2」もISPから指定があったサーバのIPアドレスに合わせてね
DNS1=10.0.0.1
DNS2=10.0.0.2
CONNECT_TIMEOUT=30
CONNECT_POLL=2
ACNAME=
SERVICENAME=
PING="."
CF_BASE=`basename $CONFIG`
PIDFILE="/var/run/$CF_BASE-adsl.pid"
SYNCHRONOUS=no
CLAMPMSS=1412
LCP_INTERVAL=20
LCP_FAILURE=3
PPPOE_TIMEOUT=80
FIREWALL=NONE
LINUX_PLUGIN=
PPPOE_EXTRA=""
PPPD_EXTRA=""

/etc/ppp/pap-secrets

このファイルのオーナはroot、パーミッションは600すね。
# PAP secrets file
# Format:
#name	remote	secret
"ユーザID@ISPのドメイン名"	*	"パスワード"

/etc/ppp/chap-secrets

このファイルのオーナもroot、パーミッションは600すね。
# CHAP secrets file
# Format:
#name	remote	secret
"ユーザID@ISPのドメイン名"	*	"パスワード"

とりあえず、この状態でredhat系ならば

chkconfig --add adsl
その他の場合は
/usr/sbin/adsl-start
で接続するはずです。
redhat系以外の場合は /etc/rc.d/rc.local の最後の方にでも /usr/sbin/adsl-start を追記すると良いでしょう。

接続状態での/sbin/ifconfigの結果は以下のようになります。
尚、ADSL modem側のNIC(Eth0)のIPアドレスは、この場合あまり意味がありません。 (と、言うかifupしなくても良いようです。)

eth0      リンク方法:イーサーネット  ハードウェアアドレス 00:80:C8:87:53:3B 
          inetアドレス:10.0.0.1 ブロードキャスト:10.0.0.255 マスク:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:103766133 errors:0 dropped:0 overruns:0 frame:0
          TX packets:88349239 errors:0 dropped:0 overruns:0 carrier:0
          衝突(Collisions):1709 TXキュー長:100 
          RX bytes:734847061 (700.8 Mb)  TX bytes:916605863 (874.1 Mb)
          割り込み:9 ベースアドレス:0x300 
eth1      リンク方法:イーサーネット  ハードウェアアドレス 00:E0:98:05:05:6D 
          inetアドレス:192.168.0.123 ブロードキャスト:192.168.0.255 マスク:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:75336055 errors:3 dropped:1806 overruns:0 frame:489
          TX packets:91333879 errors:0 dropped:0 overruns:0 carrier:0
          衝突(Collisions):0 TXキュー長:100 
          RX bytes:1423775122 (1357.8 Mb)  TX bytes:1926202346 (1836.9 Mb)
          割り込み:10 ベースアドレス:0x340 

lo        リンク方法:ローカルループバック  
          inetアドレス:127.0.0.1マスク:255.0.0.0
          UP LOOPBACK RUNNING  MTU:3924  Metric:1
          RX packets:166174 errors:0 dropped:0 overruns:0 frame:0
          TX packets:166174 errors:0 dropped:0 overruns:0 carrier:0
          衝突(Collisions):0 TXキュー長:0 
          RX bytes:10578912 (10.0 Mb)  TX bytes:10578912 (10.0 Mb)

ppp0      リンク方法:Point-to-Pointプロトコル  
          inetアドレス:61.xxx.yyy.zzz P-t-P:211.aaa.bbb.ccc マスク:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1454  Metric:1
          RX packets:2082098 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1799927 errors:0 dropped:0 overruns:0 carrier:0
          衝突(Collisions):0 TXキュー長:10 
          RX bytes:2090397793 (1993.5 Mb)  TX bytes:192075749 (183.1 Mb)

psの状況も示します。

  PID TTY      STAT   TIME COMMAND
    1 ?        S      0:41 init [3]
[中略]
 1968 ?        S      0:00 /usr/sbin/pppd pty /usr/sbin/pppoe -p 
            /var/run/pppoe.conf-adsl.pid.pppoe -I eth0 -T 80 -U  -m 1412
            noipdefault noauth default-asyncmap defaultroute hide-password
            nodetach local mtu 1492 mru 1492 noaccomp noccp nobsdcomp
            nodeflate nopcomp novj novjccomp user ユーザ名@ISPドメイン名
            lcp-echo-interval 20 lcp-echo-failure 3
 1969 ?        R     35:42 /usr/sbin/pppoe -p /var/run/pppoe.conf-adsl.pid.pppoe
            -I eth0 -T 80 -U -m 1412
[以下省略]


4.4 ipchains 1.3.10 or later

Linuxのポートフィルタもipfw -> ipfwadm -> ipchainsと進化しています。
2.4系のカーネルではさらに機能豊富なiptablesを使うようです。
2.2系のカーネルを採用したほとんどのディストリビューションで ipchainsは採用されているようなので、インストールに関しては省略します。

シンプルな設定に関しては2 .関連情報/参考文献に 示してある文献を参考にして設定すれば十分でしょう。
以下は、私がマシンAで設定しているものです。
穴を見つけたら、教えてください(^^;

#!/bin/sh
#
# fire wall setting on hets.luky.org /etc/rc.d/rc.ipchains
# last updated: 2001-04-21 Hisaaki Shibata 
# last updated: 2001-02-15 Hisaaki Shibata 
# original:     2000-07-09 Hisaaki Shibata 

#<参考文献>
# Linux IPCHAINS-HOWTO by Rusty Russell
#        v1.0.8, Tue Jul 4 14:20:53 EST 2000 
# http://www.linuxdoc.org/HOWTO/IPCHAINS-HOWTO.html
#
# Top Ten Blocking Recommendations Using ipchains
#           Paul Tiedemann  August 8, 2000
# http://www.sans.org/infosecFAQ/firewall/blocking_ipchains.htm
#
# TrinityOS: A Guide to Configuring Your Linux Server for
#           Performance, Security, and Managability
#           David A. Ranch, dranch@trinnet.net  October 15, 2000
# http://www.ecst.csuchico.edu/~dranch/LINUX/TrinityOS/cHTML/\
# TrinityOS-101500c.html
#
# 森岡さんの設定
# Message-Id: <20010120120521084.OZC.13014.t-mta2.odn.ne.jp@mta2.odn.ne.jp>
 
#<ネットワーク接続図>
#   Flets ADSL経由で The Internet へ
#               |
#          ppp0 | Dynamic Address Assign 0.0.0.0/255.255.255.255
#         +-----+-----+
#         |           |
#         |           | eth0
#         |           +----- PPPoE用インタフェース(ADSLモデムへストレート接続)
#         |           | 10.0.0.1/255.0.0.0
#         |           |
#         +-----+-----+
#          eth1 | 192.168.0.123/255.255.255.0
#               |
#           家庭内部LANへ

#<下記のipchainsの設定ポリシー>
# 

# ・input chainsは、必要なもののみACCEPTにして、それ以外は最後にDENY。
# ・output chainsは、全てACCEPTにする。(つまりdefaultのまま)
#
# 
# ・PPPoE-LANに対してはipmasqueradeもroutingも行わない
# ・全てDENYにする。
#
# 
# ・内部LANに対してはroutingを行う
# ・input chainsは、必要なもののみACCEPTにして、それ以外は最後にDENY。
# ・input chainsで許可したアクセスで且つ外部LANへのforward chainsは、
#   全てACCEPTにする。
# ・output chainsは、全てACCEPTにする。(つまりdefaultのまま)

#
#IPCHAINS="/sbin/ipchains -v "
IPCHAINS=/sbin/ipchains

# 結局、1024: 以降の全てが、リモートホストの短命ポート
# reph_portとは、remote ephemeral portの略
reph_port=1024:
echo "local ephemeral port=" $reph_port

#
# ping -bに答えない
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts  
# Enable bad error message protection
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# ipmasqのためにroutingする
echo 1 > /proc/sys/net/ipv4/ip_forward
# source routing禁止
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 0 > /proc/sys/net/ipv4/conf/default/accept_source_route
# IP defrag
echo 0 >/proc/sys/net/ipv4/ip_always_defrag
# TCP SYN Cookie Protection
echo 1 >/proc/sys/net/ipv4/tcp_syncookies
# source address 確認
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f
done
# ICMP Redirect 受付けない
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo 0 > $f
done
# source routed packets 受付けない
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 > $f
done
# spoofed, source-routed, redirect packets のロギング
for file in /proc/sys/net/ipv4/conf/*/log_martians; do  
  echo "1" > $file
done

####################################################
# 2001.06.02 shibata@luky.org
/sbin/insmod ip_masq_ftp
/sbin/insmod ip_masq_irc
/sbin/insmod ip_masq_raudio
/sbin/insmod ip_masq_portfw

####################################################
#
# リモートからのオペレーションチョンボを行ったときに
# 困るので(^^;、default policyはACCEPTにしておく。
# (堅くしたい人はDENYにしてもいいけど)
# また、再設定時にも有効になるようにルールをフラッシュする。
$IPCHAINS -X
$IPCHAINS -P input ACCEPT
$IPCHAINS -F input
$IPCHAINS -P output ACCEPT
$IPCHAINS -F output
$IPCHAINS -P forward ACCEPT
$IPCHAINS -F forward

# まず最初に、スクリプト起動時に筒抜けになるのを防止するため、
# local loop back以外の全ての入口を閉じて forwarding も禁止する。
# 最後にこのinput chainをdeleteしないと何もできなくなる(^^;
# こうするべきであるが、スクリプトにチョンボがあって最後まで行かないと
# 困るので、初期ポリシーは素通しにしておく。

# local loop backに関しては全開
$IPCHAINS  -A input -i lo -j ACCEPT

# 全ての戻りtcpパケット(localの短命ポート向けでSYNが立っていないもの)は許可
# ソースポートも縛る方がいいかもしれないが、コネクションが確立していない
# はずなので、これでよしとする
# ftpのPASVモードについては、もっと下の方で許可している
# ログ残さない
$IPCHAINS -A input -p tcp --dport $reph_port ! -y -j ACCEPT

# for home network
# eth1がsourceで、192.168.0.0/24からのもの
$IPCHAINS -A input -s 192.168.0.0/24 -i eth1 -j ACCEPT

# IP spoofing防止 (local loop back , private addr., local link ddr.)
# 下記の192.168.0.0/16からのパケットで、eth1からの正しいものは
# 直上のルールでACCEPTされているから、ここで弾かれるのはspoofing
# みてる暇がないのだが、統計情報取得のためログ取ってステ
$IPCHAINS -A input -b -s 127.0.0.0/8 -j DENY -l
$IPCHAINS -A input -b -s 10.0.0.0/8 -j DENY -l
$IPCHAINS -A input -b -s 172.16.0.0/12 -j DENY -l
$IPCHAINS -A input -b -s 169.254.0.0/16 -j DENY -l
$IPCHAINS -A input -b -s 192.168.0.0/16 -j DENY -l
$IPCHAINS -A input -b -s 240.0.0.0/5  -j DENY -l
$IPCHAINS -A input -b -s 255.255.255.255/32  -j DENY -l

# IP spoofing防止 (内部LAN)
# eth1 からで、ソースアドレスが 192.168.0.0/24以外のパケットはログ取ってステ
$IPCHAINS -A input -s ! 192.168.0.0/24 -i eth1 -j DENY -l

# やたら来るものもログ取って捨てる
# UDP echo Broadcast
$IPCHAINS -A input -p udp --dport 7 -j DENY -l
# Incoming NETBIOS Broadcast
$IPCHAINS -A input -p udp --dport 137:139 -j DENY -l
# Incoming RIP Broadcast
$IPCHAINS -A input -p udp --sport route --dport route -j DENY -l
# Incoming BOOTP Broadcast
$IPCHAINS -A input -p udp --dport bootps:bootpc -j DENY -l
# ICMP router discovery
$IPCHAINS -A input -p icmp --sport 9:10 -j DENY -l
# SUNRPC
$IPCHAINS -A input -p tcp --dport 111 -j DENY -l

# 全てのネットワークに対して開放するサービス
# ICMPは限定して通す
# ICMP echo
$IPCHAINS -A input -p icmp --sport 0 -j ACCEPT
# ICMP destination unreachable
$IPCHAINS -A input -p icmp --sport 3 -j ACCEPT
# ICMP source quench
$IPCHAINS -A input -p icmp --sport 4 -j ACCEPT
# ICMP echo request
$IPCHAINS -A input -p icmp --sport 8 -j ACCEPT
# ICMP time exceeded
$IPCHAINS -A input -p icmp --sport 11 -j ACCEPT
# ICMP parameter problem
$IPCHAINS -A input -p icmp --sport 12 -j ACCEPT

# IGMP
$IPCHAINS -A input -p igmp -j ACCEPT

# 全てのネットワークに対して開放するサービス
# ssh,DNS,www,https,smtp,ftp,ftp-data,auth,rsync,ntp,snmp,irc

# ftp-data 20 (tcp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 20 ! -y -j ACCEPT -l
$IPCHAINS -A input -p tcp --sport 20 --dport $reph_port -j ACCEPT
# for pasv transfer mode
$IPCHAINS -A input -p tcp --sport $reph_port --dport $reph_port ! -y -j ACCEPT

# ftp 21 (tcp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 21 -j ACCEPT -l

# ssh 22 (tcp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 22 -j ACCEPT

# 禁止だけど、一応エントリだけ書いておく
#   # telnet 23 (tcp)
#   $IPCHAINS -A input -p tcp --sport $reph_port --dport 23 -j ACCEPT

# smtp 25 (tcp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 25 -j ACCEPT

# time 37 (tcp+udp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 37 -j ACCEPT
$IPCHAINS -A input -p udp --sport $reph_port --dport 37 -j ACCEPT

# domain 53 (tcp+udp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 53 -j ACCEPT
$IPCHAINS -A input -b -p udp --sport $reph_port --dport 53 -j ACCEPT
$IPCHAINS -A input -p udp --sport 53 --dport 53 -j ACCEPT

# www 80 (tcp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 80 -j ACCEPT

# pop-3 110 (tcp)
# ssh経由でlocalhostからのみ許可なので、エントリだけ書く
# localhostからは、何でもありなので、書かない。
#$IPCHAINS -A input -p tcp --sport $reph_port --dport 110 -j ACCEPT

# auth 113 (tcp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 113 -j ACCEPT

# ntp 123 (tcp+udp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 123 -j ACCEPT -l
$IPCHAINS -A input -p udp --sport $reph_port --dport 123 -j ACCEPT -l
$IPCHAINS -A input -p tcp --sport 123 --dport 123 -j ACCEPT -l
$IPCHAINS -A input -p udp --sport 123 --dport 123 -j ACCEPT -l

# snmp 161 (tcp+udp)
#$IPCHAINS -A input -p tcp --sport $reph_port --dport 161 -j ACCEPT
#$IPCHAINS -A input -p udp --sport $reph_port --dport 161 -j ACCEPT

# snmp-trap 162 (udp)
#$IPCHAINS -A input -p udp --sport $reph_port --dport 162 -j ACCEPT

# irc 194 (tcp+udp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 194 -j ACCEPT
#$IPCHAINS -A input -p udp --sport $reph_port --dport 194 -j ACCEPT

# https 443 (tcp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 443 -j ACCEPT

# rsync 873 (tcp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 873 -j ACCEPT

# ircd 6660-6668 (tcp+udp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 6660:6668 -j ACCEPT
#$IPCHAINS -A input -p udp --sport $reph_port --dport 6660:6668 -j ACCEPT

# 家庭用ipmasq
$IPCHAINS -A forward -s 192.168.0.0/24 -d 0/0  -j MASQ

# 最後に、上記のchainsに該当しない input パケットを全てDENYする。
# forward パケットもDENYする。
# ログを残す
$IPCHAINS -A input -i ! lo -j DENY -l
$IPCHAINS -A forward -j DENY -l

# end of rc.ipchains

4.5 ipmasqadm-0.4.2 or later

ipmasqで囲ったプライベートアドレス空間上のサーバを外部に公開する方法として ipmasqadmを使ったポート転送(port forwarding)を使う方法があります。
man pageにもport forwardingに関して詳しい記述はないですが、簡単な使い方は /usr/sbin/ipmasqadm portfw -h を実行すると、下記のように表示される。

Usage: portfw -a -P PROTO -L LADDR LPORT -R RADDR RPORT [-p PREF] add entry
       portfw -d -P PROTO -L LADDR LPORT [-R RADDR RPORT]         delete entry
       portfw -f                                                  clear table
       portfw -l                                                  list table
       portfw  -n                                           no names

PROTO is the protocol, can be "tcp" or "udp"
LADDR is the local interface receiving packets to be forwarded.
LPORT is the port being redirected.
RADDR is the remote address.
RPORT is the port being redirected to.
PREF  is the preference level (load balancing, default=10)
単純なポートの転送だけでなく、重みをつけて複数の転送を定義できることも わかります。

ここでは、外部からマシンAのポート80(www)へのアクセスに対して、 家庭内のマシンB(192.168.0.12)のポート80へ単純に転送する、 つまりマシンBを外部に公開する例を示します。
コマンドレベルだと以下のようになります。

/usr/sbin/ipmasqadm portfw -f
/usr/sbin/ipmasqadm portfw -a -P tcp -L ppp0のIPアドレス 80 -R 192.168.0.12 80

しかし、これをこのままスクリプトに埋め込むことはできません。
と言うのも私が契約しているISPはADSLユーザに対して固定IPアドレスを割り振らず、 接続毎にダイナミックにIPアドレスを割り振るため、接続都度IPアドレスが 変わるからです。
また、こちらから故意にISPへの接続を切らない場合でもどういうタイミングだか わかりませんが、接続が切られる事があります。 再接続後は全く別のIPアドレスが割り振られています。
(再接続するようなrp-pppoeの設定にしているからまだ良い方なのですが)

ISPから割り振られたIPアドレスは /usr/sbin/ifconfig ppp0を実行すると、 下記のように表示されますので、これをipmasqadmの引数として渡せば良さそうです。

ppp0      リンク方法:Point-to-Pointプロトコル  
          inetアドレス:61.xxx.yyy.zzz P-t-P:211.aaa.bbb.ccc マスク:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1454  Metric:1
          RX packets:2091425 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1809497 errors:0 dropped:0 overruns:0 carrier:0
          衝突(Collisions):0 TXキュー長:10 
          RX bytes:2092322201 (1995.3 Mb)  TX bytes:193103042 (184.1 Mb)

最も手間をかけずにやるときは、私はsedやawkをshellと組み合わせて使います。
例えば、下記のような感じです。

#!/bin/sh
echo "/usr/sbin/ipmasqadm portfw -f" > /tmp/ipmasqfw.sh
LANG=c /sbin/ifconfig ppp0|grep inet|\
sed 's/ *inet addr:/\/usr\/sbin\/ipmasqadm portfw -a -P tcp -L /;
     s/ P-t-P.*/ 80 -R 192.168.0.12 80/;' >> /tmp/ipmasqfw.sh

. /tmp/ipmasqfw.sh
/bin/rm -f /tmp/ipmasqfw.sh

もっと最適化したやり方があるとか、本当はテンポラリなファイルを作らない方が 良いとか、セキュリティ上/tmpじゃない方が良いとか、エラー時にはそれなりの 報告をするとかいろいろありますので、その辺りのチェック/変更を加えれば 尚良いかと思います。

また、ftpサーバを公開したい場合のコマンドラインは

/usr/sbin/ipmasqadm portfw -f
/usr/sbin/ipmasqadm portfw -a -P tcp -L ppp0のIPアドレス 20 -R 192.168.0.12 20
/usr/sbin/ipmasqadm portfw -a -P tcp -L ppp0のIPアドレス 21 -R 192.168.0.12 21
となります。これらも設定したい方はちょっとした変更で応用できます。


4.6 BIND-8.2.4 or later

今までの所で家庭内LANのサーバを外部に公開するまでは出来ましたが、 ダイナミックに割り振られるIPアドレスをどうやって人に伝えるのかという 問題があります。
また、IPアドレスをURIとして人に伝える事ができたとしても、 次のタイミングでIPアドレスがわかることがあるので、 ドキュメントとして残すことはできません。
これらを解決する方法としてDynamic DNSと言うものがあります。

世の中にはDynamic DNSのサービスを無償で提供しているプロバイダもあるようですが、 ドメイン名はそのプロバイダのものであり、サブドメイン部分またはホスト名部分だけ が自前のものであるのは、私はちょっと頂けません。

外部にDNSに関して自由になるサーバがある事が前提(^^;になりますが、自前でDynamic DNSサーバをあげてみましょう。
最近のBINDは非常に簡単にDynamic DNSが実現できます。

まず、静的なIPアドレスを持つDNS サーバをあげてみましょう。
以下のような設定を例とします。
より詳細な設定に関しては
2 .関連情報/参考文献 bind-8 のインストールメモ などを参照してください。

/etc/named.conf

options {
	directory "/etc/named.db";
	/*
	 * If there is a firewall between you and nameservers you want
	 * to talk to, you might need to uncomment the query-source
	 * directive below.  Previous versions of BIND always asked
	 * questions using port 53, but BIND 8.1 uses an unprivileged
	 * port by default.
	 */
	// query-source address * port 53;
};
// 
// boot file for name server
// 
// NOTE: unconverted directive 'type domain source host/file backup file'

zone "." {
	type hint;
	file "named.root";
};

// NOTE: unconverted directive 'domain luky.org'

zone "localhost" {
	type master;
	file "localhost.d";
};

zone "0.0.127.IN-ADDR.ARPA" {
	type master;
	file "localhost.rev";
};
zone "UriUri.com" {
	type master;
	file "uriuri.com.zone";
	allow-update { 127.0.0.1; 211.8.90.175;};
	allow-transfer { any; };
	allow-query { any; };
};
上記のポイントは allow-update のエントリです。
zone ファイルのエントリ更新を許可する host の IP アドレスを記述します。
この例では localhost の IP アドレスと、その DNS サーバのIPアドレスを記述しています。
(あちこちから勝手に更新されてはひどいことになりますので。)

固定アドレスで割り当てるzoneファイルは下記のように普通に作成します。

/etc/named.db/uriuri.com.zone

;BIND DUMP V8
$ORIGIN com.
UriUri	172800	IN	MX	10 hoop.uriuri.com.	;Cl=2
	172800	IN	NS	hoop.uriuri.com.	;Cl=2
	172800	IN	SOA	hoop.uriuri.com. root.hoop.uriuri.com. (
		2001091007 7200 1800 1209600 172800 )	;Cl=2
$ORIGIN UriUri.com.
hoop	172800	IN	MX	10 hoop.uriuri.com.	;Cl=2
	172800	IN	A	211.8.190.175	;Cl=2
localhost	172800	IN	A	127.0.0.1	;Cl=2
mail	172800	IN	MX	10 hoop.uriuri.com.	;Cl=2
www	172800	IN	CNAME	hoop.uriuri.com.	;Cl=2
hets	1200	IN	A	61.xxx.yyy.zzz	;Cl=2
ns	172800	IN	CNAME	hoop.uriuri.com.	;Cl=2
ftp	172800	IN	CNAME	hoop.uriuri.com.	;Cl=2
上記のうち、hetsの行は、Dynamic DNSによって付け加えられたエントリーです。

動的なエントリの追加削除はnsupdateコマンドで実現できます。
試しに上記のサーバにloginして実行してみます。

root@hoop(6)$ nsupdate
> update delete hets.uriuri.com A
> update add hets.uriuri.com 300 A 61.xxx.yyyy.zzz
> 

update addの後は、空リターンを実行し、その後はctrl-dで抜けます。

エラーも出なくてうまく行っているようだったら、nslookupしてみます。

root@hoop(14)$ nslookup 
Default Server:  hoop.uriuri.com
Address:  211.8.190.175

> hets.uriuri.com
Server:  hoop.uriuri.com
Address:  211.8.190.175

Name:    hets.uriuri.com
Address:   61.xxx.yyy.zzz

> exit
良い感じですね。

念のためlogも見てみます。
この場合のlogは/etc/named.db/uriuri.com.zone.logになります。

;BIND LOG V8
[DYNAMIC_UPDATE] id 47831 from [211.8.190.175].4991 at 1000640318 (named pid 1346):
zone:	origin UriUri.com class IN serial 2001091007
update:	{delete} hets.uriuri.com. IN A 
update:	{add} hets.uriuri.com. 300 IN A 61.xxx.yyy.zzz
きちんと出来ているようです。

後は、ADSLゲートウェイとなっているマシンA側のIPアドレス割り当てに変更が あったときに、DNSサーバ上で上記コマンドを実行すれば良いことがわかります。

ここで問題になるのは、二つの点です。
どうやってIPアドレスが変わったことを検知するのかという事と、変更後のIPアドレス を持つマシンAからDNSサーバ上でnsupdateを実行するかという事です。

これに関するスマートな解は ねぎ式: Dynamic DNS で固定ホスト名にして遊ぼう に書かれていますので、これを利用する方が良いでしょう。

私も、先に知っていれば上記のやり方をそのままパクっていたと思いますが、 私はもっと泥臭いやり方でやってます(^^;

まず、マシンA側でIPアドレスの変更を検知する方法ですが、 cronで1分毎にppp0に割り当てられているIPアドレスをチェックしています。
検知方法自体はipmasqadmのところで実現していますから、 これをちょっと修正すれば良いことがわかります。
具体的にはcrontabに下記のような記述をしています。

* * * * * /home/shibata/check_ip.sh

check_ip.shは以下のようなものです。すごく泥臭いですね(^^;

/home/shibata/check_ip.sh

#!/bin/sh
/bin/mv -f /tmp/pppoe_ip.now /tmp/pppoe_ip.old
/sbin/ifconfig ppp0|grep inet > /tmp/pppoe_ip.now
diff /tmp/pppoe_ip.old /tmp/pppoe_ip.now > /tmp/pppoe_ip.diff
if [ -s /tmp/pppoe_ip.diff ]; then
/bin/mail -s hets.pppoe-ip_change 携帯電話のメールアドレス < /tmp/pppoe_ip.diff
RSYNC_PASSWORD=hogehoge /usr/bin/rsync -av -e ssh /tmp/pppoe_ip.now nameduser@hoop.euqset.org::named)
fi
echo > /dev/null
#end

アドレスに変更があると、携帯電話にメールが来るようにしています。
これは、一応知っておきたいという事と、携帯からさらに普通のe-mailに 転送することで、どういうタイミングでアドレスの再割り当てが発生しているかの ログを残すためです。
さらに、DNSサーバ側にはrsyncでファイルを転送しています。
(メールでの転送からprocmail私に変えようかとも思って途中まで出来ているのですが、 ねぎ式を越えるのはなかなか難しそう。)

もちろんDNSサーバ側ではrsync --daemonを動かしておく必要があります。
ここではrsyncを動かすのに必要な/etcrsyncd.confの例だけを示しておきます。

/etc/rsyncd.conf

#
# /etc/rsyncd.conf 
# for hoop.uriuri.com
#

#global
uid = nobody
gid = nogroup
use chroot = no
max connections = 2
syslog facility = local5
pid file = /var/run/rsyncd.pid

[named]
path = /home/named
comment = hoop.uriuri.com /home/named
read only = no
hosts allow = 61.0.0.0/8,hoop.uriuri.com
auth users = nameduser
secrets file = /etc/rsyncd.secrets

さて、DNSサーバ側では以下のような設定にしてます。これまた泥臭い(^^;
まず、crontabです。

* * * * *       /home/named/dnsup.sh

上記で起動しているdnsup.shも示します。

dnsup.sh

#!/bin/sh
/bin/cat /home/named/hets.uriuri.com-templ > /home/named/hets.uriuri.com-ip
/bin/cat /home/named/pppoe_ip.now|\
sed 's/.* addr:/update add hets.uriuri.com 300 A /;
     s/ *P-t-P.*//'>>/home/named/hets.uriuri.com-ip
echo  >>/home/named/hets.uriuri.com-ip

/usr/bin/nslookup hets.uriuri.com hoop.uriuri.com|tail -2|head -1|sed 's/Address: *//' > /home/named/dns.now
/bin/cat /home/named/pppoe_ip.now|sed 's/.* addr://;s/ *P-t-P.*//' > /home/named/dns.next
/usr/bin/diff /home/named/dns.now /home/named/dns.next > /home/named/dns.diff

if [ -s /home/named/dns.diff ]
then
 /usr/bin/nsupdate /home/named/hets.uriuri.com-ip
 /usr/bin/nslookup hets.uriuri.com hoop.uriuri.com|\
  mail -s "hets.uriuri.com IP change" shibata@luky.org
else
echo >/dev/null
fi


5.動作確認をしたもの

[次へ][前へ][目次へ]

  • 家庭内LANの複数のhostから外部アクセスが出来ている
  • IPアドレス割り当ての変更があったことがDynamic DNSに反映される
  • 家庭内LAN上のWebサーバが、外部から参照できる

6.いくつかの問題点

[次へ][前へ][目次へ]

手間ひまをかけるよりも、安価な家庭用のブロードバンドルータと呼ばれるものが 出てきている(^^;


7. TODO

[次へ][前へ][目次へ]

7.1 必ずやる

(1)Dynamic DNSでのIPアドレス変更通知方式をもう少しまともにしたい
メールでの通知を行う方法も実施しました。簡単なので今は省略。(2002-05-18)
(2)外部向けのサーバの構築を急ぐ。具体的にはストリーミング系のサービスを行いたい。
こちらも、一時期自宅にUSBカメラを置いて灰皿と温度計を監視し、灰皿から煙が立ち上っていないか、またPC内の温度が上がりすぎていないかを外部から監視できるようにしていました。(2002-05-18)

7.2 気が向いたら...

(1)プロキシ(squid)やIRCエージェント(plum)、時刻同期サーバ(xntpd)なども 動かしているので、これらも追記するか別文書にまとめる。
(2)現在ノートPCで実現しているゲートウエイをOpenBlockSに移行する。
OpenBlockSでも動いたのですが、移行が面倒なのでそのままにしています。
また、その後B-Fletsに移行したのを期に専用BBルータであるCentury Systems社XR-300に移行しました。
XR-300のハード構造はOpenBlockSSと同じであり、OSもLinuxで動いています。iptablesの定義などもそのまま行けるので楽しちゃいました。(2002-06-18)
(3)bootable CD-ROMとFDの組合わせで今回の仕組みを実現する。
XR-300に移行しちゃったので、なしですm(_|_)m (2002-06-18)
(4)外部からのアタックレポートを公開する。
これはやめとこ(^^; (2002-06-18)

7.3 お金があったら...

(1)Bフレッツに移行。
実は既に申し込み済です。(2001-10-09)
上記に書いたように、現在B-Flets + XR-300環境です。
でもお金はありません(^^;; (2002-06-18)

8.謝辞

[次へ][前へ][目次へ]

私がLinuxを使えるようにしてくださったすべての方に感謝いたします。
また、この文書作成にあたっては、JFをはじめとする多くのドキュメントを参考にさせて頂いています。ありがとうございますm(_|_)m

尚、今回のADSL対応サーバ構築においては、九州ギガポッププロジェクト:qgpopにおけるADSL実験として、複数ISPでの比較をする機会を頂きました。
特にqgpopリーダの平原様と、ISITにてADSL実験を取纏めて下さった大部様に感謝の意を表します。

以上
[玄関へ] [総本店へ]
Last modified: Sat May 18 11:48:22 JST 2002     

1997年9月13日

mini Watch Dog Timer with Linux

「遠くのサーバも柴犬に見張らせれば大丈夫(^^)」

Ver 0.2 Copyright(C) 1997, Hisaaki Shibata

柴田 尚明@福岡

shibata@opost1.netspace.or.jp

何らかの要因、例えば電源の瞬断などでハングアップしてしまったリモートにあるLinuxboxに対して、自動でハードウエアリセットしたり電源を落としたりして復旧させる仕組みを考えています。
公開してご意見を伺い、出来ればもうちょっと改良したいと思っておりますm(_|_)m。
続きも読む "mini Watch Dog Timer with Linux"
    

1997年5月 2日

Happy Linux Home-LAN with IP masquerade and kerneld

「IP masqueradeとkerneldによるon-demand PPPで幸せな家庭内LANへのメモ」

Ver0.91 Copyright(C) 1996,1997 Hisaaki Shibata

柴田 尚明@福岡

shibata@opost1.netspace.or.jp

Linuxに特有のIP masqueradeとkerneldによるon-demand PPPが
ある程度動きましたので設定の際に行った項目をメモにまとめます。
我が家におけるIP masqueradeの最大のメリットは

「端末型ダイヤルアップの契約で、ネットワーク型ダイヤルアップとほぼ同等の使い勝手が楽しめる」

ことにあります。皆さんも楽しんでください(^o^)/

ご意見は、fj.os.linuxかメールでお願いします。

メールの方が圧倒的にレスポンスがいいはずです(^^)
尚、本ドキュメントは全文丸ごとであればどこへでも転載可能/リンク可能です(^^)


目次

0 .来歴・トピックス
1 .経緯
2 .関連情報
3 .用意したhardware
4 .用意したsoftware
5 .動作確認をしたもの
6 .いくつかの問題点
7 .そのうちやること
8 .謝辞
9 .付録A(作成/修正ファイル一覧)
10.付録B(家庭内ハードウエア仕様一覧)


0.来歴・トピックス

[次へ][目次へ]

1997/5/1 Ver. 0.91

  • linux-2.0.30での機能を追加
1996/11/4 Ver. 0.9 1996/9/21 Ver. 0.8
  • 各Softwareのバージョンアップ対応
  • 2 .関連情報に荒木さんリンク追加
  • pppdのタイムアウト記述修正(^^;
1996/9/1 Ver. 0.7
  • 各Softwareのバージョンアップ対応
  • MN128ハングアップ対策(/etc/ppp/ip-down)記述追加
  • 作成/修正ファイル一覧追加
1996/8/26 Ver. 0.6
  • 各Softwareのバージョンアップ対応
  • 全項目見直し
  • 家庭のISDN化\(^o^)/
  • BIND、sambaも動いた。次はINNとDHCP(^^)
1996/6/17 Ver. 0.5
  • 目次追加
  • 関連URL追加(星野さん、梶原さん、JF)
  • 最新バージョンでの確認
  • ISDN化計画発動
  • その他、細部修正

1996/5/31 Ver. 0.4

  • HTML化
  • /etc/hostsエントリ追加による不必要なダイアルアップ解決追加

1996/5/29 Ver. 0.3

  • /etc/rc.d/rc.inet1でのdefaultroute設定について記述追加
  • /etc/hostsエントリ追加による不必要なダイアルアップ解決
  • ipfwadm-2.1.tar.gzでの確認済み

1996/5/18 Ver. 0.2

  • NNTP,pop 動作確認追加
  • ftp動作方法追加 #Thanks to すずき@JAIST様
  • 一部ソフトウエアのNew Versionでの確認
  • その他、絵の追加や細部の語句・記述変更

1996/5/15 Ver. 0.1 新規作成


1.経緯

[次へ][前へ][目次へ]

自作AT互換機の常で、自己増殖機能により我が家のPCが3台(FullTower, DeskTop, SubNote)になったことをきっかけに、家庭内LANを始めることにしました。

#Ver 0.6時点では新規導入したMiniTowerを子供用ゲーム機にして、お古となったDeskTopをLinux専用サーバとし、計4台に増殖しました(^^;
しかし、ISPのLAN型dial-upの契約料は高いし、routerを買うお金もない。 さらにはISDNでもない、の三重苦(^^;によりあきらめておりました。

#Ver 0.6時点で我が家もISDN+テレホーダイ化しました(^o^)。OCNまでの短い命かもしれませんが....
ちょうどその頃Linux-MLでIP masqueradeが話題になり、情報を集めてみると 「まさに求めていたもの」で、早速取り掛かることにしました。
#Linux-MLでは、その後も技術的な情報がやり取りされてます。


2.関連情報

[次へ][前へ][目次へ]

IP masqueradeについてはhttp://www.kt.rim.or.jp/~akira/にやまだあきらさんのわかりやすい解説が有ります(^^)

また、最近拡充されたものとしては、
梶原 健司さんのhttp://gandalf.doshisha.ac.jp/~kaji/ip_masq/とか、
星野 明さんのhttp://www.st.rim.or.jp/~akhoshi/ipmasq.html、そして荒木さんのhttp://www.mizuno.riec.tohoku.ac.jp/~yasu/linux/ipmasq/が有りますのでこちらもぜひご覧になってくださいm(_|_)m

その他にもNET-2/3-HOWTOに解説が有ります。こじまみつひろさんの和訳もGoodです。

on-demand dial-upに関しては、dialdを使う方法もあるとのことで、そのうち気が向いたら挑戦してみます。(かなり気は向いてるけど)

#と、言いながらkerneldに満足してしまい、dialdまでいたってませんm(_|_)m。
拡充計画は

BIND+samba(済)->INN->DHCP

へ移って行きました(^^;
さらに、pppd-2.3.xでは、それ自体でon-demand dialupの機能が追加になっているようです。これももう少しβ版が安定してきたら手を出すかもしれません。
linux-2.0.0にするときに気を付ける物としてはこじまみつひろさんが訳され、吉山さんがHTML化したものがhttp://jf.gee.kyoto-u.ac.jp/JF/v2.0/Changes-2.0.htmlに有りますのでじっくり読むのが良いと思います。

また、私が使い出したMN128に関するpppのchatスクリプトについてはhttp://www.st.rim.or.jp/~kanada/ISDN/connection-scripts.htmlに金田泰さんの実例がございます。


3.用意したhardware

[次へ][前へ][目次へ]

  • 複数台のPC+NIC
  • HUB
  • UTP Cable
  • modem(アナログ回線時)
  • TA(ISDN時)
  • remote電源制御装置
                                                         ISP-->Internet
                                                          |
.------------.                     .------------.        NTT
|192.168.0.1 |                     |192.168.0.5 |         |
|         NIC+----------+  +-------+NIC    16550+-->TA-->DSU
|            |          |  |       |            | (MN128)
| Silk       |          |  |       | Silver     |
`------------'FullTower |  |       `------------'DeskTop
      (Win95/3.1/Linux) |  |                     (Linux)
                        |  |
.------------.       .--+--+--.      .------------.
|192.168.0.2 |       |        |      |192.168.0.3 |
|         NIC+-------+        +------+NIC         |
|            |       | HUB    |      |            |
| Silvia     |       `--------'      | Echos      |
`------------'MiniTower              `------------'Note
              (Win95)                        (Linux/Win95)

家庭内LANを使う場合、プライベートaddress空間を使うことがお勧めです。私は、192.168.0.0/24を使いました。

#さすがにclass C x 1で足りない家庭内LANはないかと(^^;
  • 外付けTA付DeskTop機(Silver)が192.168.0.5
  • カミサン用FullTower御仕事機(Silk)が192.168.0.1
  • 子供用MiniTowerゲーム機(Silvia)が192.168.0.2
  • OS-BSでLinuxとWin95をboot selectし、AL-mail+WinVNで読み書きしているSubNote機(Echos)が192.168.0.3
各マシンの概略仕様は上記のリンクをつついてください。
家庭内のLAN接続は取り回しが容易なUTP(10B-T)ケーブルにてHUBで接続しています。
#ちなみに、今日現在ではDHCPサーバが、Silver上で動き出しており、クライアントがLinuxの場合でもWin95の場合でも動的にIPアドレスを割り振ってくれるようになりましたので、上記のIPアドレスのまま動いているのはSilverだけとなりました(^^)。
この内容はそのうちアップデートしてこの文書にも反映させます。
今後は、このon-demand機能を利用して、真夜中のテレホーダイタイムにNetNewsを自動取り込みすることを考えていますが、まだINNの設定ができてません(^^;
いろいろと教えてもらっていることもありますので、がんばりたいと思っています。
しかし、別の事にも手を出しておりまして、shutdown時の電源OFFや、外部からのダイアルアップで、自動的にPC本体の電源をいれること事などをやっております。 これにつきましては、ある程度実用になりそうなので梨もーと電源制御のところをご覧ください。

4.用意したsoftware

[次へ][前へ][目次へ]

4.1 Slackware 3.2

network関連のpackage(N)は入れましょう。

#Slackaware 3.1に3.2を上書きinstall(って言うのかな?)を行った場合は、その後に不都合が生じる場合があります。
#具体的にはkernelの再構築が出来ないようです。
#そういう時は/usr/binの中を削除してから再installしましょう(^^;

4.2 linux-2.0.30.tar.gz

Linux-2.0.30からは、kernelのコンフィグレーションにもよりますが、今までIPmasqueradeされたネットワーク上から外部のネットワークに対して不可能であったpingなどのICMPを使ったやり取りなども実行可能になっているようです。
しかも、各種パッチが統合されており、kernelの再構築とipfwadmの設定だけでIPmasqueradeが利用できるようになっています。ぜひ試してみてください。

その他、2.0.xに向けて必要なものも集めました。

IP masqueradeを使えるようにする'make config'内容はやまださんのページや、NET-2/3-HOWTO、ipfwadmのarchive内のdocumentに書かれてます。

#このメモをupdateしたときにも簡単に触れるつもりでしたが、
#和訳されたChangesができたのでそちらをご覧ください。
#ところで、2.0.0リリースおめでとう!
#でもAIC-7850では新しいaic7xxxドライバは不安定(-_-)。
PIONEERのCD-ROMがboot時にエラーをだしまくるのでサブマシンのCD-ROMドライブ(PLEXTER)と入れ替えて対策しました(^^;

私の標準手順は以下です。('# 'はpromptのつもりです。)

# cd /usr/src/linux
# make mrproper
# make menuconfig
#ここでIP masqueradeが使えるようにする。どの項目をYにするかは2 .関連情報をご覧ください。
# make dep && make clean && make zImage && make modules && make modules_install # cd /usr/src/linux/arch/i386/boot # /sbin/rdev -R zImage 1 # cp zImage /zImage.x.yy.z
このあと、/etc/lilo.confを修正して、boot時に今まで動いていたkernelと新しいkernelを選択できるようにします。
例えば私の場合は、

# cat /etc/lilo.conf

#fileの中身やコマンドの出力を示す場合は、以下で示します

# LILO configuration file
# generated by 'liloconfig'
#
# Start LILO global section
boot = /dev/sdb1
#rootパーティションにinstallしてます。
#boot selecterはOS-BSがお気に入りです。


#compact        # faster, but won't work on all systems.
delay = 50
vga = normal    # force sane state
ramdisk = 0     # paranoia setting
# End LILO global section
# Linux bootable partition config begins
image = /zImage.x.yy.z
  root = /dev/sdb1
  label = linux
  read-only # Non-UMSDOS filesystems should be mounted read-only for checking
# Linux bootable partition config ends
# Linux bootable partition config begins
image = /zImage.2.0.29
  root = /dev/sdb1
  label = linux.old>
  read-only # Non-UMSDOS filesystems should be mounted read-only for checking
# Linux bootable partition config ends

そして、
# /sbin/lilo
でliloを入れて、kernelの再構築はおわりです。

尚、家庭内LANで使うときには/etc/rc.d/rc.inet1でdefaultroute(gateway host)でNIC側を選択している場合は、設定行をコメントアウトしておきましょう。
そうしないと、せっかくpppでのlinkが確立しても外に出て行けなくなってしまいます。

#複数のセグメントを持つ大規模家庭内LANユーザの方(^^;は
#話が変わってきますが。

4.3 modules-2.0.0.tar.gz

kerneldを動かすためのもので、中のDocumentが役に立ちます。
本家はhttp://www.pi.se/blox/modules/index.htmlです。
構築は
# make all && make install
でおしまいでした。
#どうも、モジュールを新しくしたタイミングだと思うのですが
#sendmail-8.7.5が/etc/rc.d/rc.Mのなかでハングするように
#なりました(T_T)ので元に戻しました。

上記が終わったらarchive内のrc.hintsを元に/etc/rc.d/rc.Mにkerneldとdepmod、modprobeの起動scriptを追加します。

#簡単なので省略m(_|_)m

次に以下のppp設定fileを作ります。

# cat /etc/ppp/ip-up

#!/bin/sh
#ファイルの先頭行にこれを書いて、なおかつ実行可能フラグを立てないと #うまく行きません。これのせいでずっとハマッてました(^^;
echo UP `date` >> /tmp/PPP-LOG
#ダイヤルアップ開始時間を記録します
sendmail -q
#送信用のqueueに溜まっているmailをflushするため
kill `cat /tmp/request-route`
#kerneldのrouting programのprocessを削除する
#/sbin/insmod ip_masq_ftp
後述するIPmasquerade下でftpを行うためのおまじないでしたが、以下の4行に置き換えてます。だから今はコメントあうとしてます。
/sbin/depmod -a /sbin/modprobe ip_masq_ftp.o /sbin/modprobe ip_masq_raudio.o /sbin/modprobe ip_masq_irc.o

次にarchive内のrequest-route.shを元に以下のfileを作ります。

#どうせDNSを引きに行くのでちょっと内容をサボってます
# cat /sbin/request-route

#! /bin/sh
LOCK=/tmp/request-route
UP=/tmp/request-up
PATH=/usr/sbin:$PATH #for ppp-2.2*
export PATH
pppd
echo `date` > $UP
#家庭内LANからのon-demandダイヤルアップであることの足跡を残してます。外部からのダイヤルインではこのファイルができないはずで、それによって制御を変えるようにしてます
sleep 60 &
#この値はいろいろとチューニングの余地があるようです
sleepid=$! echo $sleepid > $LOCK wait $sleepid rm -f $LOCK

4.4 ppp-2.2.0f.tar.gz

iij-pppでもよかったのですが、慣れの関係でこちらにしました(^^;

#上記にも示しましたが、ppp-2.3.xのβテストが始まってます。
#pppd単体でon-demand dialupが出来るようになっているらしいです(^^)
私の標準手順は
# cd /usr/local/src/ppp-2.2.0f
# ./configure
# make kernel
# make

#make前にppp用のlock fileのPATHを修正してました
#mgettyを使う場合です。今はmgettyの方を修正しています
#mgettyを使うのは外から自宅にdial-upするからです(^^)
# make install

このあと、以下の設定fileを作ります。

#どうせ一つのISPにしかアクセスしないでしょうから
#/etc/ppp/optionsで設定値を書いちゃいます。

# cat /etc/ppp/options


debug
lock
modem crtscts /dev/ttyS3 38400

#私のモデムはSilkのCOM4です #最近買ったTA(MN128)はSilverのCOM1につながってます #COM1の時は/dev/ttyS0ですね(^^) #さらに現時点では、remote電源制御の絡みがあり、TAはCOM2(/dev/ttyS1)につながっています。COM1は電源OFF制御装置(^^;がつながりました。
#また/etc/rc.d/rc.serialでspd_vhi設定をして、DTE速度を115200bpsにしてます。
#setserialの最新バージョンは1.12のようです。
#また、SMC系のマルチI/O制御chipはDTE速度を115.2k以上に設定できるらしく、
#Win95のドライバはfjにポストされてました。
#ドライバが置いてあるftpサイトはhttp://www.yk.rim.or.jp/~gigo/over115K/です。
大きな期待がかかるのがこのドライバの作者の友人がsetserialに
#このコードを統合するつもりだとの事です(^^)。
noipdefault netmask 255.255.255.0 defaultroute idle-disconnect 140
#pppのトラフィックが140秒間ないとpppdが落ちる設定です。
#このドキュメントのVer0.7まで間違った記述をしており、
#参照された方にはご迷惑をおかけいたしましたm(_|_)m
domain joy.netspace.or.jp
#上の行は、不要かもしれません
name silk
#上の行は、不要かもしれません。
connnect /etc/ppp/ppp-on-script




実際に電話をかけるのは以下の部分の設定です。

(1)Rockwell系のv.34 modemの場合
# cat /etc/ppp/ppp-on-script


#!/bin/sh

# 各行末のバックスラッシュ(\)に気を付けてね
# 最終行だけバックスラッシュによる改行のエスケープ不要
exec /usr/sbin/chat -v TIMEOUT 2 ABORT '\nBUSY\r' \ ABORT '\nNO ANSWER\r' ABORT '\nRINGING\r\n\r\nRINGING\r' \ '' AT \ 'OK-+++\c-OK' ATH0 \ TIMEOUT 30 \ OK ATDT電話番号 \ CONNECT '' \ ogin:--ogin: \\dユーザID \ assword: パスワード

PAPやCHAPのISPへは/etc/ppp/pap-secretsや/etc/ppp/chap-secretsを記述すれば、上記のCONNECTの行まででOKのばずです。

#その時は、最後の行末の\をはずしてね
#また、PAPの時は/etc/ppp/optionsに+uaなどの記述が必要です。

#尚、+uaの記述は推奨されているものではなくpppd-2.3.x以降では
#サポートされない事が有りそうなので、/etc/ppp/*-secretsを使用した方が
#よさそうです。

(21)MN128(非同期38.4k)の場合
http://www.st.rim.or.jp/~kanada/ISDN/connection-scripts.htmlの金田泰さんの実例をみてね。

尚、金田さんが書いているMN128のppp終了後のハングアップに関しては/etc/ppp/ip-downの後半のchatを起動する部分を下記のようにする事で、回避できています。
また、電源制御関連や、ダイヤルアップしていないときには不要なmoduleを削除する事も追加しました。

# cat /etc/ppp/ip-down


#!/bin/sh
#
# This is part 2 of the ppp-on script. It will perform the connection
# protocol for the desired connection.
#
if [ -f /tmp/request-up ]; then		#家庭内LANからのダイアルアップならば
        /bin/rm -f /tmp/request-up
        echo DOWN `date` >> /tmp/PPP-LOG  #コネクションを切った時間をlogに取る。
else			#外部からのダイヤルインによるpppの起動のときは。
        sync
        sync
        sync		#転ばぬ先のsync三回(^^;
        /sbin/shutdown -r now	#おもむろにshutdownを動かす。
        sleep 60
        exit 1		#正常にshutdownが動いていれば、ここには来ないはず。
fi
#if [ `w|wc -l` -lt 3 ]; then	#外部からのダイヤルイン判定の残骸
#       sync
#       sync
#       sync
#       /sbin/shutdown -r now
#fi
/sbin/rmmod ip_masq_ftp.o	#不要なモジュールの取り外し
/sbin/rmmod ip_masq_raudio.o
/sbin/rmmod ip_masq_irc.o
#				#MN128ハングアップ対策
exec /usr/sbin/chat -v          \
        TIMEOUT         3                               \
        ABORT           '\nLINE OFF\r'                  \
        ABORT           '\nBUSY\r'                      \
        ABORT           '\nNO ANSWER\r'                 \
        ABORT           '\nRINGING\r\n\r\nRINGING\r'    \
        ''              ATZ

また、DNS関連の記述は以下のようにしています。

# cat /etc/resolv.conf
domain joy.netspace.or.jp
nameserver 192.168.0.5
#そうです。我が家の中にもDNSサーバが立ちあがったんです(^^; #これについては婆印度と産婆(^^;を見てください

nameserver aaa.bbb.ccc.ddd

#ISPが推奨しているDNS serverのIP addressですね

ここまでで、rebootすれば「そのLinux機上で」
$ telnet sotono.host.or.jp
とか
$ mnews -Dsotono.NNTP.server.or.jp
とかで勝手にダイヤルアップを始めるはずです(^^)

V#ISDN+テレホーダイとかだと快適ですねぇ。
#テレホーダイなら繋ぎっぱなしにする?(^^;
#他の人にも回線あげなきゃ(^^)

ダイヤルを始めているときのプロセスの状況は以下のようです。

# ps -x
  PID TTY STAT  TIME  COMMAND
    1  ?  S     0:16  init[5]
[中略]
  111  ?  S     0:00  sh /sbin/request-route aaa.bbb.ccc.ddd
  114  S3 S     0:00  pppd
  115  ?  S     0:00  sleep 40
  116  S3 S     0:00  /usr/sbin/chat -v TIMEOUT 3 ABORT \nNO AN...
[以下省略]

上記のaaa.bbb.ccc.dddはDNS ServerのIP addressになることが多いでしょう。


4.5 ipfwadm-2.3.tar.gz

4.5.1 基本的な設定

LInux-1.3.xのあるバージョン以降からipfwではなく、これ(ipfwadm)を使うようです。
本家本元はhttp://www.indyramp.com/masq/です。
ipfwadmは
# make install
で出来ます。

私が探した限りではipfwadmの設定に関する記述はアーカイブ内のmanファイルにしかありませんでした。

#NET-2/3-HOWTOにあるように、ipfwとは記法が異なります。
私の設定は、以下です。
# tail -5 /etc/rc.d/rc.inet1

/sbin/ipfwadm -F -b -o -a masquerade -P all -S 192.168.0.0/24 -D 0.0.0.0/0

# End of rc.inet1

ここまでで、Dial-up routerと化したLinux機が出来上がりです(^^)

#RT100iはNATとやらに対応しているようですが
#複数のプライベートIP addressを一つのグローバルIP adressに
#変換する事はできないようですから、こいつはGoodです。
#しかしYAMAHAもRT100iのNATをエンハンスさせてIPmasqueradeのような機能を
#考えているようです(^^)

家庭内LAN上の全PCはdefaultrouteを192.168.0.5に向けます。
また、家庭内LAN上の全PCの/etc/hostsファイル上には全LAN内hostのエントリを追加しましょう。(DNSがあがっている現在は不要である事を確認していますが)

#さもなくば、LAN内でのtelnet/ftpなどでダイヤルアップを始めてしまいます(^^;
また、Win95の場合はNetBEUIをunloadしておかないとWin95起動時にパケットをはいてダイヤルアップを始める事があるようです
そのLAN上のhostでWinVNなどを動かすと、dial-up routerであるsilverがダイヤルを始めるはずです(^^)

4.5.2 ftpのための設定

すでに示していますが、ftpを行う場合は以下の設定の追加が必要でした。

/etc/ppp/ip-upの中に
/sbin/insmod ip_masq_ftp
を追加しました。

#これって、本来のkerneldの使い方じゃないような気がします。
#on-demandでloadできる正しい使い方をご指導ください。
この設定で、悩んでいたftpがちゃんと動作するようになりました(^^)Ver0.6
さらにip-upをdepmodを使うやり方に変更しました(^^)Ver0.9

もう一つftpをきちんと動かすためにはパッチがいる事が判明いたしました(^^;。

小さなftpやhttpだと問題にならないのですが、大きなファイルをanonymous FTPサイトから持ってきていると、きちんと終了しない事があります。この場合はhttp://www.hwy401.com/achau/ipmasq/ip_masq_ftpalive.patch.gzやftp.linux.or.jpなどからip_masq_ftpalive.patch.gzを持ってきてカーネルソースにパッチを当ててください。
パッチの当てかたは普通のカーネルパッチと同じだとおもいます。

Linux-2.0.30では、不要です。


5.動作確認をしたもの

[次へ][前へ][目次へ]

家庭内LAN上のhostからIP masqueradeを利用して動作したものを示します

  • AL-mailによるWin95からのメールの送受信(SMTP,POP3)
  • WinVNによるWin95からのNewsの購読、投稿(NNTP)
  • telnet
  • WWW(HTTP)
  • netscapeなどのbrowserからの(httpでくるんだ)匿名ftp
  • ncftpを使った匿名ftp(^0^)
  • 駄目かと思ったけどすんなり動いたWin95上でのMS-NetMeeting(ユーザロケーションサービスはだめみたい(--;)
  • linux-2.0.30環境でWin95からIPmasquerade外部へのping

6.いくつかの問題点

[次へ][前へ][目次へ]

6.1 ftpできない(最終的に解決)


-> ip_masq_ftpのmoduleをinsmodでロードすることで解決(^^)@Ver0.2
-> と、思ったら、又できなくなってしまった(T_T)@Ver0.4
なぜだろう???
0.6
-> /etc/ppp/ip-upをきちんと作り直す(chmod u+xと#!/bin/shをいれる)事で解決(^^;

6.2 不要なdial-upが始まる事がある(解決->復活?)


Note上のmailer(AL-Mail)を動かしてLAN上の192.168.0.1に対して接続しようとすると、なぜかDNSを引き(?)行っているようでdial-upを始めてしまう。
#IP addressでSMTP server/POP3 serverとしてsilverを指定しても
その後の調査で、mailerやpopperには関係なくDNSを引きに行っているような状態が出ています(T_T)
#どうもWin95が何らかのタイミングでDNSを引くようです(^^;
->IP masqueradeを起動しているマシン(silk)の/etc/hostsにNote PCの
FQDNもどきのエントリを追加して何者からのアクセスかをsilkに
教えてやることで、DNSを引きにいかなくなった(^^)
0.5
->LAN内でのtelnet/ftpでもダイヤルアップを行うことが発覚し、
LAN内のすべてのhostを/etc/hostsのエントリに追加することで対策した。

0.6
->BINDを家庭内LANで運用を始めたところ、silver起動時の1回のみダイヤルアップが発生している。引き続き調査中。

6.3 回線が切れないISPがある(解決)



#port53でした。問い合わせたらRIPでした。(--;
idle-timeoutを5秒ぐらいにすると切れてくれるけど、これでは使い物にならない(T_T)
別のISPではそのようなことがなく、時間通りに切れてくれる。
受けるパケットは無視するようにできないかなぁ。
->dialdではできるそうです。
ISPにRIPにしないように改善をお願いしているところです。
->対策終了し、無事切れるようになりました(^o^)

7. そのうちやること

[次へ][前へ][目次へ]

7.1 必ずやる

(1)要所にリンクを貼り付けて、必要なもの(ファイルや文書)を取れるようにする。
->これをもって、一応m(_|_)mやった。

(2)問題点をFIXして、どこかのサイトにこの文書を置く。
->期間限定ですが、置きました。

#引き続き、引き取っていただけるところをお待ちしております。
#ご意見や情報を頂きたいのですが、よろしくお願いいたします。

7.2 気が向いたらやる

(1)絵やなんかを入れてわかりやすくする。->簡単なのを入れた(^^;

(2)dialdを使った方法を追加する。 -> ftpが解決してから->pppd-2.3.xに移行するためなしm(_|_)m

(3)Linux-MLでの技術的な裏付け情報を付録で追加
-> 私が理解してから(^^; ->いまだに把握できていない(^^;

7.3 お金があったらやる

(2)古いNote PCを入手し、PCMCIAのISDN cardとEther cardを

入れて、UPS付き(電池)低消費電力のdial-up routerを作っちゃう。

#私が持っておりますYAMAHAのPCMCIA ISDN cardのドライバ情報を
#お待ちしていますm(_|_)m
デバイスドライバを開発するための情報はここに有ります。
とりあえず入手して読みはじめたのですが素人に手が出るかどうか分かりません。どなたか共同してやりませんか?
御興味のある方はメールでお願いします。m(_|_)m

このドライバ開発に関しては、小さなMLが立ち上がり、細々ながらドライバ開発が始まっております。引き続きメンバーを求めておりますので、このアドレスまで参加希望者はメールをください。
ドライバがかけなくてもPC30iを持っていればβテストやドキュメント整備が出来るなどの特典;-)があります。


8.謝辞

[次へ][前へ][目次へ]

私がLinuxを使えるようにしてくださったすべての方に感謝いたします。

特に、この文書作成にあたっては、Linux-MLの方々と、JFによるドキュメント、および関連のドキュメントがなければできないものでした。ありがとうございます。m(_|_)m

以上

[入り口へ] [Akkoame Home Page]


9.付録A(作成/修正ファイル一覧)

[次へ][前へ][目次へ]

この所、ディスク障害だとか、人為的チョンボとかで再installをする機会が多くて(^^;、 どのファイルをバックアップ取っとけば良いかわからなくなるんで、この際(自分のために)まとめとくものです。

(1)install時
(2)ppp+kerneld+IP_masquerade設定時
(3)BIND設定時
(4)Apatch設定時
(5)INN設定時
(6)samba設定時
[入り口へ] [Akkoame Home Page]


10.付録B(家庭内ハードウエア仕様一覧)

[前へ][目次へ]


[玄関へ] [総本店へ]     

1997年2月23日

Remote Power control with Linux

「電話で電源いれましょ。shutdownで電源おとしましょ。」

Ver0.2 Copyright(C) 1996, Hisaaki Shibata

柴田 尚明@福岡

shibata@opost1.netspace.or.jp

Linuxでのshutdown時に自動でPCの電源を落とし、また、外部からの電話着信で自動的にPCの電源が入るものを作りはじめました。
ある程度動いてますので、公開してご意見を伺い、もうちょっと改良したいと思っておりますm(_|_)m。
ご意見は、fj.os.linuxなどの関連NewsGroupか
メールでお願いします。

メールの方が圧倒的にレスポンスがいいはずです(^^)
尚、本ドキュメントは全文丸ごとであればどこへでも転載可能/リンク可能です(^^)


目次

0 .来歴・トピックス
1 .経緯
2 .関連情報
3 .用意したhardware
4 .用意したsoftware
5 .動作確認をしたもの
6 .いくつかの問題点
7 .そのうちやること
8 .謝辞


0.来歴・トピックス

[次へ][目次へ]

1996/11/6 Ver. 0.2

  • パーツリスト追加
  • メインボードのキット情報追加
  • INSの実験結果追加(T_T)
1996/11/4 Ver. 0.1
  • 新規作成
  • アナログ回線での着信時電源ONおよび、空きCOMポートを利用したshutdown時の電源OFF確認

1.経緯

[次へ][前へ][目次へ]

ATX機が自動で電源を落とせる話を聞いたり、某社のPCではモデムに着信があると電源を入れることができるという話を聞くたびに、良いなぁ〜と思っておりました。

また、会社から家に仕事のファイルを持ち帰って作業をして(^^;、そのまま忘れて会社に来たりしたことがあり、カミサンにPCの電源を入れてもらってダイヤルインしたりすることもありました(^^;;;;;;が、そうそう毎度は頼めません(^^;。

うちのサーバ機はCRTがついていないので、カミサンにはshutdown時の電源OFFのタイミングがわかりにくいという話もあります。
そういう時は普通ATX機を買うのかもしれませんが、そんなお金はないです(T_T)し、ATXのマザーと電源の相性問題(?)もまだまだあると聞いてますので、買うにしてもしばらく待ちたいところです。
で、現在使っているAT機で電源の制御をソフトウエアから行えるように無い知恵を絞ってみました。
予算は5千円以内で済ますことを目標にしました。
#ま、目標は、あくまで目標(^^;


2.関連情報

[次へ][前へ][目次へ]

ATXの電源制御仕様ってどこかに落ちてないでしょうか?
www.teleport.com/~atx/からたどっても、ろくなものは見つけられませんでした(T_T)


3.用意したhardware

[次へ][前へ][目次へ]

  • LinuxがinstallされたPC/AT互換機(シリアルポートが二つ必要)
  • modem(アナログ回線時)
  • TA(ISDN時)
  • 今回自作のリモート電源制御装置(^o^)

リモート電源制御の回路図に関しては下記をご覧ください。


    回路図と解説

  • メインボードとパワー(電源)ボードです。
  • 基本的には単純なセットリセットのフリップフロップがあるだけで、そのフリップフロップの状態でリレーを動かすシンプルなものです。
    パワーボード上のマニュアルスイッチはON(上)-OFF(中立)-ON(下)の3個所で止まるタイプのレバースイッチで、ON(上)で強制セットとなり、電源ONとなります。
    逆にON(下)では強制リセットとなり、電源OFFです。
    OFF(中立)の位置では、外部からの情報でON/OFFするautoモードです。
    #なお、このメインボードの回路が二つ分入ったものが4cm x 5cm程度のコンパクトな基板となり市販のキットとして1800円で販売されてます。
    大阪日本橋の「ワンダーキット」と言う会社のものです。
    問い合わせ先は〒556大阪市浪速区日本橋4-4-1
    TEL(06)644-4447 FAX(06)644-4448です。
    私は福岡の「カホパーツセンター」で購入しました。注意する点として、このキットにはVcc(電源電圧)が5Vのものと12Vのものがあることです。私は回路図でお分かりのように5V版を使用しました。
    私は、上記のメインボードと、パワーボード(3端子レギュレータとパイロットLED付き)とACアダプタを分解して(^^;取り出したトランス込みで、3.5"FDが10枚入るアクリルケースに詰め込んでます。そのうち写真もお見せしますね(^^;

  • セット(電源ON)ボードです。
  • モデムとPCのCOMポート(私の場合はCOM2)の間に挟まる形のものです。
    したがって図上の右側のコネクタと左側のコネクタはオス/メスになっています。
    また、すべての信号線はそのままストレートで接続しています。
    電源ONはモデムへの着信時にモデム側から出力されるCI信号のレベルの変化を見ることに因っています。外部への影響を最小限にすることと、レベルコンバータの役目をかねて、フォトカプラを使っています。
    フォトカプラに直列につないでいる抵抗値は適当です(^^;が、一応電圧レベルは規格内に入っています。
    この基板の大きさは4cm x 3cm程度です。

  • リセット(電源OFF)ボードです。
  • PCの使用していないCOMポート(私の場合はCOM1)につなげます。
    電源OFFはCOMポートからデータを出力する際に変化するDTR信号のレベルの変化を見ることに因っています。フォトカプラ周りの回路はセットボードと同じです
    この基板の大きさも4cm x 3cm程度です。

  • 各ボードの結線
  • 適当に、そこらに転がっていた撚り対線を使っています(^^;

で、パーツリストをまとめると。以下のようになります。
#線材とかパイロットLED+LED用抵抗などは省略してますm(_|_)m
MainNameCountsMemo
1HD4140131CMOS-SSI
22SC9451Tr
31S15883Diode
41μF1Condenser
510μF1Condenser
64.7kΩ4Resister
747kΩ3Resister
8100kΩ1Resister
9G6C-11171Relay
10Universal board15cm x 4cm
PowerNameCountsMemo
1AC/DC Conv.1DC5V output
2Switch1on-off-on toggle
3Universal board13cm x 2cm
SetNameCountsMemo
19pin RS-232-C Conn. female1board mount type
29pin RS-232-C Conn. male1board mount type
3TLP521-11Photo-coupler
4470Ω1Resister
5Universal board14cm x 3cm
ResetNameCountsMemo
19pin RS-232-C Conn. female1board mount type
2TLP521-11Photo-coupler
3470Ω1Resister
4Universal board14cm x 3cm

4.用意したsoftware

[次へ][前へ][目次へ]

以下のppp設定fileを作ります。(on-demand pppの設定で既に書いてますので、関連する記述のみ示します。)

4.1 /etc/ppp/ip-up

# cat /etc/ppp/ip-up #!/bin/sh
#ファイルの先頭行にこれを書いて、なおかつ実行可能フラグを立てないと #うまく行きません。これのせいでずっとハマッてました(^^;
echo UP `date` >> /tmp/PPP-LOG
#ダイヤルアップ開始時間を記録します


4.2 /etc/ppp/ip-down

ip-downはshutdown時には動かないのですね。PPP-LOGを見て判明しました。 shutdown時にpppdが動いている場合は、LOGファイルに落ちた時間をかき出すようにした方が、より正確になりますね。 # cat /etc/ppp/ip-down

#!/bin/sh
#
# This is part 2 of the ppp-on script. It will perform the connection
# protocol for the desired connection.
#
if [ -f /tmp/request-up ]; then		#家庭内LANからのダイアルアップならば
        /bin/rm -f /tmp/request-up
        echo DOWN `date` >> /tmp/PPP-LOG  #コネクションを切った時間をlogに取る。
else			#外部からのダイヤルインによるpppの起動のときは。
        sync
        sync
        sync		#転ばぬ先のsync三回(^^;
        /sbin/shutdown -r now	#おもむろにshutdownを動かす。
        sleep 60
        exit 1		#正常にshutdownが動いていれば、ここには来ないはず。
fi
#if [ `w|wc -l` -lt 3 ]; then	#外部からのダイヤルイン判定の残骸
#       sync
#       sync
#       sync
#       /sbin/shutdown -r now
#fi

4.3 /sbin/request-route

# cat /sbin/request-route

#! /bin/sh
LOCK=/tmp/request-route
UP=/tmp/request-up
PATH=/usr/sbin:$PATH #for ppp-2.2*
export PATH
pppd
echo `date` > $UP
#家庭内LANからのon-demandダイヤルアップであることの足跡を残してます。外部からのダイヤルインではこのファイルができないはずで、それによって制御を変えるようにしてます
sleep 60 &
#この値はいろいろとチューニングの余地があるようです
sleepid=$! echo $sleepid > $LOCK wait $sleepid rm -f $LOCK

4.4 /etc/rc.d/rc.6

slackware3.1でshutdown時に動くrc.6の終わりの方に/dev/cua0(COM1)へのデータ出力をechoにて行います。
# tail -15 /etc/rc.d/rc.6

  # See if this is a powerfail situation.
  if [ -f /etc/power_is_failing ]; then
    echo "Turning off UPS, bye."
    /sbin/powerd -q
    exit 1
  fi

sleep 15 ;echo off >/dev/cua0

  echo "$message"
  [ ! -f /etc/fastboot ] && echo "On the next boot fsck will be FORCED."
  $command -f


5.動作確認をしたもの

[次へ][前へ][目次へ]

動作したものを示します

  • shutdownによる電源OFF
  • 外部からのmodem着信による電源ON

6.いくつかの問題点

[次へ][前へ][目次へ]

何と言ってもISDNでの自宅へのダイヤルアップIP接続です。 TAがオフフックしていないようなのでいかんともし難いです。情報をお待ちしています。


7. そのうちやること

[次へ][前へ][目次へ]

7.1 必ずやる

(1)ISDNでの着信電源ON確認
これ、やってみたんですが、うまく行ってません。YAMAHAのPC30iをグレ電につないで自宅のMN128にダイヤルしたのですが、まず、電話(といっていいのかな?)をとってくれません(?_?)。MN128の設定が悪いのだとは思いますが、なんだか引越しのどさくさでMN128のマニュアルが見つからなくて(^^;困っております。MN128で64k同期の着信できている方は、ATコマンドでの初期設定を教えてくださいm(_|_)m

7.2 気が向いたらやる

(1)ATXの電源OFF制御仕様が判れば、ボードを作ってみたい。

7.3 お金があったらやる

(1)ボードのマスクを起こしちゃう...キットがあるから無駄だな(^^;

8.謝辞

[次へ][前へ][目次へ]

まお、今回の電源制御は基本的にすべてRS-232-Cで行ってます。このあたりの情報はFA-NET-MLの皆さんと、alm-hokkai藪中さんから頂いております。
ありがとうございます。m(_|_)m

以上


[玄関へ] [総本店へ]