IBM ThinkPad 560 に Debian をインストール

Last Updated at $Date: 2005/12/04 03:47:19 $.

注意事項
目次

作業記録

以前,この ThinkPad 560 には,Slackware をインストールして利用していたのだが,液晶のバックライトの故障によって現役引退を余儀なくされた. 今回は,このマシンを下宿の dial-up router として復活させようと言うプロジェクトである.

PCMCIA

Linux-2.4 以降は,PCMCIA ドライバとして, kernel に付属している版と, 従来から pcmcia-cs という名称で単独配布されている版の2つが利用できる. 通常は,どちらを利用しても大差ないのだが,ThinkPad 560 の場合は事情が異なる.

まず,ThinkPad 560 の PCMCIA bridge には,Cirrus CL6729 が使われているらしい.

$ /sbin/lspci | grep PCMCIA
00:13.0 PCMCIA bridge: Cirrus Logic CL 6729 (rev e2)

しかし,pcmcia-cs の付属文書(README-2.4)には以下のように記述されている.

PCI-to-PCMCIA bridges that are not CardBus capable, like the Cirrus PD6729, are not supported at all by the kernel PCMCIA drivers.

微妙に型番が異なっているが,現実には問題の PD6729 と認識されているので, kernel 付属の PCMCIA ドライバ群は利用できないと予想される.

$ dmesg | grep Cirrus
  Cirrus PD6729 rev 00 PCI-to-PCMCIA at slot 00:13, port 0x3e0

そのため,pcmcia-cs 由来の PCMCIA ドライバを利用するように設定した. ただし,デフォルトの設定では,IRQ の取得が正常に行われず, 以下のエラーメッセージが頻繁に出力される.

$ dmesg | tail -1
eth0: interrupt(s) dropped!

この現象は,/etc/default/pcmcia に以下の設定を追加して,IRQ を明示的に指定すると解決できた.

PCIC_OPTS="poll_interval=100 irq_list=3,10"
On-demand Dial UP

以前は diald + pppd で実現されることが多かったが, pppd-2.3 以降の pppd は単独で on-demand dial up の機能を持っているので, これを利用する設定を行うことにした.

  1. 最初に,適当に pppconfig コマンドを実行して,通常の接続を行えるようにする.
    # pppconfig
    # adduser user dialout
    # adduser user dip
    % pon
    
  2. On-demand dial up 用の provider 設定を追加する.
    # cd /etc/ppp/peers
    # cp -p provider ondemand-provider
    # patch -p0 <<__EOF__
    --- provider	Mon Apr  1 23:52:31 2002
    +++ provider-ondemand	Fri May 17 00:18:22 2002
    @@ -15,3 +15,8 @@
    
     usepeerdns
    
    +demand
    +idle 90
    +holdoff 60
    +active-filter 'not udp port ntp'
    +
    __EOF__
    

    この設定は,以下の意味を持つ.

    demand
    自動接続機能を有効にする
    idle 90
    無通信状態が90秒間続くと,接続を切断する
    holdoff 60
    切断後,60秒間は再接続を行わない
    active-filter 'not udp port ntp'
    NTP に関するパケットを無視. つまり,NTP に関するパケットが流れていても,無通信状態と見なす.
  3. このように設定した後で,ondemand-provider への接続を開始すると, pppd は常駐しても,実際の接続は行われない.この状態で, 外部ホストへの通信を行うと,自動的に接続を開始するはずである.

なお,無通信状態で正常に通信が終了することを確認しておくこと. 念のため,/etc/cron.weekly/ppplog というスクリプトで,1週間単位で接続記録を集計するようにした. 詳しくは,スクリプトの付属文書を参照.

iptables

以下のような設定で,フィルタリングと内部ネットワークの masquerading を行うようにした.

# private network から出て行くものをマスカレードする
iptables -t nat -A POSTROUTING -s 192.168.89.0/255.255.255.0 -j MASQUERADE

# ppp から入って来るパケットで新規と無効のものを入力とフォワードで禁止する
iptables -t nat -A INPUT -i ppp+ -m state --state NEW,INVALID -j DROP
iptables -t nat -A FORWARD -i ppp+ -m state --state NEW,INVALID -j DROP

# 内部ネットワークから外部に接続する udp / icmp パケットを禁止
iptables -t filter -A FORWARD -o ppp+ -p ! tcp -j DROP

# ppp から出ていくもので,新しい接続を開始するパケットの記録を残す.不用
# 意な自動発呼の原因を追求するため.
iptables -A FORWARD -o ppp+ -m state --state NEW -j LOG
iptables -A OUTPUT -o ppp+ -m state --state NEW -j LOG

# IP フォワーディングを ON にする
echo 1 > /proc/sys/net/ipv4/ip_forward

/etc/default/iptables を編集し,設定が保存できるようにして,以下のコマンドを実行.

/etc/init.d/iptables save_active
DNS

dnsmasq を使って,内部ネットワークのマシンが参照できる DNS cache server を用意した. また,このサーバーの /etc/hosts に内部ネットワークのホスト名を列挙しておくと, 内部ネットワークのホスト名解決にも使うことができる.

今回の場合,dnsmasq が参照するネットワークデバイス(eth0)は, PCMCIA で管理されているネットワークカードであるため, デフォルトの起動順序(PCMCIA の初期化以前に dnsmasq が起動される)では適切に動作しない. そのため,以下のように dnsmasq の起動順序を変更した.

# update-rc.d -f dnsmasq remove
# update-rc.d -f dnsmasq defaults 21

また,/etc/ppp/ip-up.d/0dns-up/etc/ppp/ip-down.d/0dns-down に細工して,/etc/resolv.conf の代わりに /etc/resolv.conf-dnsmasq を作成するように変更した.

DHCP

特に問題なし./etc/dhcp3/dhcpd.conf をコメントにしたがって編集していけば良い.

Dynamic DNS

現時点では特に関係はないが,将来,常時接続に移行したときのために, homeip.net で適当なドメインを入手して,ddclient をインストールしておいた.

MTA

exim などの queue の処理を network の構成が変化したとき(= dhcpd がアドレスを割り当てたとき)に実行したい, という考えが起きたので,少し設定を工夫した.

  1. /etc/syslog.conf を編集して, DHCP の状態が変わったら,/var/log/dhcpd.info が更新されるようにする.
    --- syslog.conf 2002/11/18 13:08:07     1.1
    +++ syslog.conf 2002/11/18 13:17:42
    @@ -32,6 +32,11 @@
     news.notice                    -/var/log/news/news.notice
    
     #
    +# For dhcpd (Check log-facility option in /etc/dhcp3/dhcpd.conf)
    +#
    +local7.info                    -/var/log/dhcpd.info
    +
    +#
     # Some `catch-all' logfiles.
     #
     *.=debug;\
    
  2. /var/log/dhcpd.info が変更されたら, queue が処理されるように,以下のコマンドを実行.
    perl /usr/local/sbin/polling.perl -f /var/log/dhcpd.info /usr/sbin/runq
    
  3. /etc/cron.d/exim を編集して, cront で exim の queue を処理しないようにする.
    % diff -u exim.orig /etc/cron.d/exim
    --- exim.orig   Tue Mar  5 08:05:40 2002
    +++ /etc/cron.d/exim    Tue Nov 19 00:55:57 2002
    @@ -1,4 +1,4 @@
     # /etc/cron.d/exim: crontab fragment for exim
    
     # Run queue every 15 minutes
    -08,23,38,53 *     * * *     mail   if [ -x /usr/sbin/exim -a -f /etc/exim/exim.conf ]; then /usr/sbin/exim -q ; fi
    +#08,23,38,53 *     * * *     mail   if [ -x /usr/sbin/exim -a -f /etc/exim/exim.conf ]; then /usr/sbin/exim -q ; fi
    

詳しくは,スクリプトの付属文書を参照.


設定ファイル集


リンク集


[Top] / [Debian Tips] / [ThinkPad X31,X20,s30,560 / Portage SS3330]