ThinkPad X22 を自宅サーバに

4/2/05 作成

目次

はじめに
準備など
HTTP サーバ
メールシステム
ML サーバ
キックイン

はじめに

数日前、自宅サーバ (Dual Pentium III 自作機) が原因不明のハングを起しました。 この前ハングしたのがいつだったか覚えてないくらい FC-1 はとても安定しているのですが、何しろこの自作機は 5 年くらいにもなる。 その間四六時中走っていた訳で「さすがにもうトシ」なのかも。

一方、一年あまりにわたって愛用してきたというか「使い倒し」てきた ThinkPad X22 ですが、バッテリがへたってきたのか、普通に使っていても 1 時間あまりしか持たなくなりました。 しかし、これでもサーバのバックアップ電源としては充分な訳だし、 その上、コンパクト、低消費電力と、サーバとしてはうってつけなのでは、 と思えてきました。(それ程、斬新な思い付きではないですが。) たまに sleep から目覚めてくれない事や、sleep の後 "keyboard rate" が極端に遅くなるといった今だに克服できない「制限事項」も、 サーバとしてなら、何の問題もないはず。 なので、 一度完全にこちらの方にサーバ機能を移してみようと思いたったのでした。

このページの Linux on ThinkPad X22 にあるように、既に FC-1 が動いているので、現在のデスクトップ機から設定とデータを移せば良いはず、 くらいに軽く考えていたのですが、やってみると結構梃摺りました。 特にメールがらみは、後から継ぎ足す形で色々拡張してきたので、 温泉旅館状態。どう動いているのか思い出すのに時間がかかる始末。

ともあれ、自作デスクトップ機 (以下では goliath) から、ThinkPad (同 falcon) へ機能を移す事が当面の目標です。 しかもその間、できるだけ外部からは goliath をこれまでどおりサーバとして働かせようという魂胆でした。 というか、ルータの DMZ 機能を使っているので、それを falcon に向けるまでは、外部からは全く同じように元のサーバ (goliath) が見えているはず、というだけの事ですが。また、INI = "/etc/rc.d/init.d" です。


準備など

falcon では FC-1 が legacy になって以降のアップデートをしていませんでした。 どうしたものかちょっと考えましたが、とりあえず、Apache と kernel だけは最新のものにしておく事に。
kernel-2.4.22-1.2199.4.legacy.nptl
httpd-2.0.51-1.6.legacy 
また、Python も 2.4.1 に上げておきました。

自身へリモートログインを許す login server とするために、sshd をインストールして起動。 また以降のインストール作業に使うために sshd をパスワードの入力なしに使えるようにしておきました。 (ssh-keygen でできる $HOME/.ssh/id_rsa.pub を他方の host の $HOME/.ssh/authorized_keys にコピーする。)

falcon の local IP アドレスを DHCP による取得から、固定アドレスとします。 また、DynDNS へルータの現在の global IP アドレスを設定するルーチンを falcon に移しておきます。(crontab での起動はまだしない。) ipcheck.py homepage によると、現時点 (4/2/05) での ipcheck.py の最新バージョンは 0.226 だとか。


HTTP サーバ

これまでも、falcon に時々肩代りさせていたので、作業は比較的スムースでした。
  1. goliath の /var/www/cgi-bin, /var/www/html 以下を falcon に copy (rsync -Cauv を使う。)

  2. 現在複数の virtual hosts を立てていて、/var/www/html の他、 /home/user/public_html などを、DocumentRoot にしている。なので、 falcon にもそれらの user account を作って、その下に public_html を作り、goliath からそこへ rsync -Cauv でコピーする。

  3. goliath の /etc/httpd/conf/httpd.conf を falcon にコピー。ただし、virtual server の指定をより一般的なものに変えた。(すなわち、IP address を取り払った。)
    <VirtualHost 192.168.0.2> => <VirtualHost *:80> 
    ここで、httpd を reload。

  4. /dev/shm 以下の counter CGI のためのキャッシュファイルの類をコピー。 立ち上げ時にこのディレクトリを作るために、/etc/rc.d/rc.local にスクリプトを追加。また、それらのファイルを 30 分ごとに save するエントリを crontab に追加。

  5. まず、falcon の /etc/hosts を編集して、www.otacky.jp 他が自分自身の IP address を指すようにして、自身の lynx, Firefox 等で試験。

  6. 次に goliath の /etc/hosts を編集して、www.otacky.jp 他が、falcon の IP を指すようにして、goliath の Mozilla から試験。

  7. また、ルータの DMZ を一時的に falcon に向けて、外部から httpd にアクセスできる事を確認しておく。(すぐ元に戻して、以降の作業中も goliath をサーバとして働かせる。)

Mail System

MTA として Postfix を使い、それに加えて procmail, fetchmail, imapd 等からなるシステムを実現します。
  1. インストールされていなければ、Postfix の RPMS をインストール。 ("# yum install postfix") falcon の sendmail を削除 (rpm -e) し、postfix を run-level 3 で起動するように設定。 (そうなってなければ。)

  2. /etc/postfix/main.cf を編集する。サーバにするので、お約束の myhostname だけではだめで、次の個所を変更する。
    myhostname = falcon.otacky.jp
    inet_interface = all
    mydestination = $myhostname, localhost.$mydomain, \
                                        $mydomain 
    ここで、postfix をスタート。("# $INI/postfix start")

  3. falcon の中から、user@falcon.otacky.jp, user@otacky.jp などに mail コマンドでメールを送ってみて、配送される事を確認する。(見るのにも mail コマンドを使う。)

  4. fetchmail を yum でインストール。$HOME/.fetchmailrc
    # Configuration created by fetchmailconf
    set postmaster "xxxxx"
    set bouncemail
    set no spambounce
    set properties ""
    poll pop.jb3.so-net.ne.jp with proto POP3
    user 'xxxxx' there with password 'xxxxx' is 'xxxxx' here 
    を goliath からコピーしてくる。ISP から POP3 でメールを取ってきてみる。 こちら (falcon の spool) に入ったメールは無くなる訳ではないが、念のために、goliath から fetchmail して空にしておき、ISP のアカウントへ mail コマンドでテストメールを送って試験した。

  5. procmail をインストール (yum)。goliath の $HOME/.forward と $HOME/.procmailrc をコピーしてくるか編集する。 例えば、それぞれ次のようにする。
    "|exec /usr/bin/procmail"    
    MAILDIR=Mail/ML
    :0
    * ^X-ML-Name: connect24h
    connect24h/.
    
    :0
    * ^X-BeenThere: python-ml-jp
    python-ml/.
    
    :0
    * ^X-BeenThere: mmjp-users
    mmjp-users/. 
    $HOME/Mail/ML の下に connect24h 等のディレクトリが実際にないと仕分けしてくれない。

    例によって、テストメールを ISP のアカウントに送って、それらを fetchmail し、正しく仕分けられている事を確認する。 (テストメールには当然ながら、ヘッダに

    X-BeenThere: mmjp-users 
    のような行が必要。)

  6. imapd をインストール (yum)。/etc/xinetd.d/imap を編集して、disable = no としてから、xinetd をリスタート (これを忘れやすい:-)。自身と goliath の上の Wanderlust で、imap フォルダを作って実際にアクセスして試験。

  7. spambayes-1.0.4 を Source Forge のソースからインストール。 詳細は「環境自慢」を参照。ついでに、Python も 2.4.1 にしておいた。 フィルタのデータベースを training してから、spam や ham mail のサンプルを使って
    cat spam_sample_1 | /usr/local/bin/sb_filter > result 
    等とし、result に入る結果ファイルの
    X-Spambayes-Classification: ham; 0.01 
    の行を確認して、それらしい結果とスコアになっているか確認しておく。次いで、 .procmailrc の先頭に
    :0 fw:hamlock
    | /usr/local/bin/sb_filter.py
    
    :0
    * ^X-Spambayes-Classification: spam
    spam/. 
    のエントリを加える。

ML (メーリング・リスト) サーバ

mailman-2.1.6b4 をインストールしました。 1/13/03 のインストールメモは若干古くなっているので、改めて、インストールからのメモを残しておきます。
  1. mailman というユーザとグループを作る。
    # /usr/sbin/groupadd mailman
    # /usr/sbin/useradd -g mailman mailman
    # /usr/sbin/usermod -G mailman,wheel,...  your_login 
    your_login は作業者の account。-G の後には副グループを列挙する事。 yourlogin のプロセスを一旦全部殺さないと (すなわち logout しないと) この変更は反映されない事に注意。
  2. /usr/local/mailman というディレクトリを作り、その owner と owner group をともに mailman にして、かつ、そのパーミッションを
    # chmod a+rx,g+ws    
    とする。
  3. ソースを展開したディレクトリへ行って、
    % ./configure --with-cgi-gid=apache 
    で configure。後は、% make, # make install。ついでに、
    % cp scripts/mailman /etc/init.d/mailman
    % chkconfig --add mailman 
    として、再起動時に Mailman が自動的に立ち上がるようにしておく。

  4. /usr/local/mailman を cwd にして、
    # bin/check_perms -f   
    % bin/mmsitepass 

    /etc/httpd/conf/httpd.conf に次の記述を加える。

    ScriptAlias /mailman/ "/usr/local/mailman/cgi-bin/"
    Alias /pipermail/ "/usr/local/mailman/archives/public/"
    ここで、"# $INI/httpd reload"。
  5. また、/etc/postfix/main.cf の
    alias_maps = hash:/etc/postfix/aliases
    alias_maps = hash:/etc/postfix/aliases, \
                       hash:/usr/local/mailman/data/aliases
    と書き変えて (実際は一行)、"# $INI/postfix reload"。

  6. ブラウザで http://www.otacky.jp/mailman/admin を開き、mailman-test なるテスト用 ML を作る。会員を your_login@otacky.jp としておく。(mailman という ML を作ったら、何でもかんでも mailman で「わけわか」になりそうだったので:-)

  7. "# $INI/mailman start" で Mailman を起動。("bin/mailmanctl start" よりこちらが好き。) mailman-test@otacky.jp にメールを送ってみる。 うまく配送される事が確認できたら、Mailman を stop (重要!)。

  8. /usr/local/mailman/ の下の、data, lists, archives を rsync -Cuav で、コピーする。すなわち、
    # rsync -Cuav goliath:/usr/local/mailman/data/ \
           /usr/local/mailman/data
    などとする。(実際は一行)

  9. ブラウザで上記のページへ行き、それぞれの ML が正しく転送されているか確認する。

  10. Mailman を start して、転送されたテスト用 ML にメールを送ってみて配送されるかどうか確認する。


Kick-in

いよいよ、実稼働に入ります。
  1. falcon を reboot してみて、自動で全てのサーバが正しく立ち上がるかどうか確認する。

  2. goliath の postfix と mailman を停止。falcon の mailman も停止。

  3. /usr/local/mailman/{data|list|archive} をもう一度 rsync。 その後、falcon の mailman を起動。

  4. ルータの DMZ を falcon に向ける。この時点から、otacky.jp は falcon が担う。

  5. (counter.cgi のキャッシュファイル群を sync。)

  6. goliath 側の crontab を停止する。
    % crontab -r
    # crontab -u mailman -r
  7. falcon 側で対応する crontab をスタート
    % cd
    % crontab -r crontab.table
    % cd /usr/local/mailman
    # crontab -u mailman cron/crontab.in
    この crontabl.table は例えば
    */10 * * * * /usr/bin/fetchmail > /dev/null 
    10 7 * * * /usr/local/bin/sb_mboxtrain.py -d .hammiedb\
        -g Mail/inbox -s Mail/spam > /dev/null
    HOME=/home/user/DynDNS
    */15 * * * * python DynDNS/ipcheck.py -l -q --syslog \
        -r checkip.dyndns.org:8245 -c --acctfile account \
        > /dev/null 
    のようなエントリを含んでいる。(実際はいずれのエントリも一行。) 最初のエントリは、10分ごとに、POP3 でメールを取ってくるためのもの。 次は、spambayes のトレーニングのため、最後は DynDNS へ自分のグローバルアドレスをセットするためのもの。
  8. RBL.JP で第三者中継チェック。
    All tests performed, no relays accepted.
    と言ってもらえたので、とりあえず「踏み台」になる可能性は低いだろう。

Valid HTML 4.01! 207/1,091,284
Taka Fukuda
Last modified: 2010-03-27 (Sat) 16:22:01 PDT