Pocket BSD をインストールしたよ

やっと, ドコモバ(以下 モバモバ とも書きます) に PocketBSD をインストールしました.

0. 方針: 第三世代のポケビユーザー!?

1. CFカード

2. インストール

3. 48M だと何ができるか?

4. FreeBSD 母艦がないときの足りないファイルの導入

5. PPP ついでに IP Masquerade

6. 各アプリケーションのもろもろ

7. 最小の!?メール環境に挑戦


0. 方針: 第三世代のポケビユーザー!?

メーリングリストなどでも, たまに話題になるようですが, 「聖典」(PocketBSDインストールキット)が出てから, タコな末端ユーザーでも, 非常に簡単に PocketBSD の世界を 楽しむことができるようになったようです. 現に, わしはそういうユーザーでして, こういう奴がありがたく PocketBSD を使わせていただくためには心がけというものが必要でしょう. ここで, 第一世代のポケビユーザーとは, 開発者のたけむらさんをはじめとして, 果敢にもモバイルギアに FreeBSD を移植された開拓者の皆様, 第二世代のポケビユーザーとは, 聖典が生まれる以前にポケビに注目して, アプリを書いたり, 人柱になられたり, 環境を整えて来るのに貢献された 方々です. そこで, 第三世代の我々は, タコではあるが, いつか何かの お役に立てるかもしれないと思いつつ, とりあえずこんなに快適に モバイルギアで UNIX 環境が手に入るので, ありがたく使わせて いただこう, というスタンスで参りたいと思います. この世の中に, 既に聖典は存在するわけですから, ポケビを愛用して いくに当たって聖典は必須になります. 買わないとバチがあたります. というか, 聖典がないと, かなり苦しいでしょう. わし思うに, この聖典は「Linux を256倍楽しむ方法」(アスキー)の情熱と, 「Linux 入門」(トッパン)の情報量とを兼ね備えた, 素晴らしい本だと 思います. どうして Linux 本ばかり例に出すんだ?というのは, わしが今まで FreeBSD はあんまり知らないからというだけの理由です.

ということで, これから書いていくことは, 聖典の記述を前提とします. そんな, あんた, 一から書いていくだけの技量があればわしも本を 書きますって.

ということで, 本体の購入にあたっての tips も 聖典に書いてありますので, 基本的に省略. ちなみに, わしは 聖典の神託どおり, 「ドコモバ ワールド」の掲示板を通して ドコモバを入手しました.

1. CFカード

PocketBSD では 唯一のPCMCIAスロットに, HDD の代わりにコンパクトフラッシュ (CF)かFlashATAカードをさして, システムを構築します. ということで, 容量が大きければ大きいほど良いのでしょうけれど, お財布と相談. ポケビ本には, 最低20M, 推奨32M以上と書いてあります. 只今, 32M のCFカードは9800円くらい. でも, どうも 32M だと gcc を入れるすき間はなさそうなので, ぎりぎり奮発して 48M にしました. 99年7月の頭の時点で, T-ZONEミナミ(本店?)で Hagiwara Syscom の CF 48 M で 15,000円でした. こいつは安い. が, PocketBSD での動作実績が怪しげ だったので, おとなしく SanDisk の 48M を17,300円で購入しました. タコは金で安心を買うわけですな. (って2300円の違いだが. ) うーむ, 本体からケーブルからCFカードまで, 全部含めて 4万程度で モービルな UNIX 環境が手にはいるんだから, 素晴らしい時代です.

いやぁ, 大型汎用機 (わしの場合は日立 MP5800 など) から手のひらサイズの ドコモバまで, 文字どおり同じアプリケーションソフト (emacs とかさ) を使えるようになっているというのが, PocketBSD の第一の特徴だと思うのです. 携帯端末を使うときだけ DOS というのは, なんだか悲しくありませんか?

2. インストール

インストールは聖典どおり, むちゃくちゃ簡単でした. 素晴らしいインストーラを作って下さった方に感謝. もっとも, わしの母艦は PC Card スロットのないデスクトップの Linux & Win95 BOX なので, インストーラはシリアル接続で 母艦の「Mg Station」の「登録ソフト」で行いました. 転送が遅いため, 待ち時間 (約2時間!) はかったるいですが, まぁ待つだけです.

3. 48M だと何ができるか?

現在, 私の CF に広がる PocketBSD の世界はこんな感じです.

Filesystem  1K-blocks     Used    Avail Capacity  Mounted on
/dev/wd0a       30607    19943     8216    71%    /
procfs              4        4        0   100%    /proc
/dev/wd0s1       5630     1495     4135    27%    /dos
これに, swap が 8 Mくらいです.

入れているものは,

《インストールパッケージ》
・admin・ppp・apm・diag・pkg

《エディタなど》
・nemacs (nemacs-canna-3.3.2.mini.tgz) (やっぱ軽い nemacs でしょう)
・canna (ja-Canna-3.2.2.mini.tgz) (辞書の共有)

《作業環境》
・mgterm (mgl-1.5より) (-w の謎)
・jless (ja-less-332.tgz)
・tcsh
・mg-tools (mg-tools-0.2)

《開発環境・ライブラリ》
・gcc (gcc-2.7.2.1-mini.tgz)
・make (gmake-3.76.1.tgz)
・libjpeg (jpeg-6a.tgz) (ヘッダも忘れずコピー)
・libgif (giflib-3.0.tgz) (ヘッダも忘れずコピー)
・libncurses (libncurses.so.3.1)
・libmytinfo (libmytinfo.so.2.0)

《ネットワーク》
・netfront (NetFront-2.0-demo) (友達に自慢するにはこれが一番!) スクリーンショット

・ncftp (ncftp-2.4.2.tgz) (母艦とのやりとりには必須) スクリーンショット
・MH (ja-mh-6.8.3-mini.tgz) (これ, 使いなれてるけど容量がでかい. そこで)
・smpost+mh-e (smpost-current.tgz) (軽くて素晴らしい)
・w3m (w3m-beta-990625) (上に同じく)

《ユーティリティ》
・読書 (reading-1.0.1-src.tar.gz) (これも, 自慢になります)
・タスク(taskmg-1.4.2-src.tar.gz) (使いこなせてないけど. . )
・mil (mgl-1.5 から)
・nkf (ja-nkf-1.62.tgz) (reading では euc しか使えないため)

《ソース》
・mgl (mgl-1.5.tgz)
・mnw (mnw-1.1.tgz)

《ゲーム》
・jnethack (ja-nethack-3.2.2-mini.tgz)
  (/usr/local/lib/jnethackdir/jnethack を strip すると小さくなる)
  スクリーンショット(昇天の瞬間!)
・mkobo
・shisen
こんだけ入って Used で 20Mくらいというのは, なんだか感動ですね. メモリはどれくらい使うかというと,

  UID   PID  PPID CPU PRI NI   VSZ  RSS WCHAN  STAT  TT       TIME COMMAND
    0     0     0   0 -18  0     0    0 sched  DLs   ??    0:00.92  (swapper)
    0     1     0   2  10  0  1960   12 wait   Is    ??    0:01.11 /sbin/init -
    0     2     0  13 -18  0     0   12 psleep DL    ??    0:50.05  (pagedaemon
    0     3     0   2  28  0     0   12 psleep DL    ??    0:06.45  (vmdaemon)
    0     4     0   1  28  0     0   12 update DL    ??    0:03.69  (update)
    0    30     1  62  18  0  1924   12 pause  Is    ??    0:00.04 adjkerntz -i
    0    78     1   3   2  0  1932   84 select Is    ??    0:30.21 syslogd
    3   134     1  10   2  0  1056    0 select IW    ??    0:08.20 /usr/local/s
    0   139     1   0  18  0   196  108 pause  Ss    ??  204:45.68 /usr/local/s
  102   527   526   7  18  0   580    0 pause  IWs   p0    0:02.97 -csh (tcsh)
  102   549   527 165   3  0  1684    0 ttyin  IW+   p0    0:22.77 /usr/local/l
  102   466   465   2  18  0   596  356 pause  Ss    p1    0:06.61 -csh (tcsh)
  102   512   466   7  29  0  1648  144 -      TW    p1    0:20.27 nemacs
  102   560   466  11  30  0   632  268 -      R+    p1    0:00.11 ps -axl
    0   515     1  12   3  0  1944    0 ttyin  IWs+  v0    0:00.21 /usr/libexec
  102   464     1  11  18  0   584    0 pause  IWs   v1    0:02.83 -tcsh (tcsh)
  102   465   464   4   2  0   248  400 select S+    v1   64:32.11 mgterm
  102   523     1   0  18  0   576    0 pause  IWs   v2    0:03.25 -tcsh (tcsh)
  102   526   523  12   2  0   248  324 select S+    v2    0:43.33 mgterm -f 10
$SHELL = tcsh で, mgterm を二枚開いて, 片方で jnethack , 片方で nemacs+canna でこの文章を 書いていると, それでも 2M ほど swap は残ります. でも, さすがに「かな」キーで両者を移動するとクソ重いですね. .

4. FreeBSD 母艦がないときの足りないファイルの導入

ネット上に公開されているパッケージなどは, FreeBSD 母艦が存在することを 前提にしているため, FreeBSD 2.2.5 からそのままコピーしてきただけで 使えるツール類は自前で用意しなければいけませぬ. たとえば, gcc のミニパッケージを導入しても, make がないので, make コマンドがきかない(あたりまえか), make があっても ar がなかったり, といった感じです. そして, たとえば ncftp を導入するためには ncftp-2.4.2.tgz という パッケ−ジがあって, これは分かりやすいのですが, ncftp に必要な libncurses.so のように基本的なファイルは FreeBSD では「配布ファイル」に含まれています. 一つ一つが tgz として固められているわけではないのです. こいつらは, まとめて聖典の CD-ROM の /cdrom/2.2.5-Release/bin/ 以下に 入っています. これを取り出す方法ですが, 自分の Linux BOX の 適当なディレクトリで
cat /cdrom/2.2.5-Release/bin/bin.* | tar zxf -
てな感じで, だだーっと展開できました. 全部で 80MByte強あります. tar コマンドを上手に使うと, 目的のファイルだけ取り出せますが. まぁ, 母艦のディスクに余裕があれば, だーっと広げておいても 良かろうかと思います. その下の bin/ には, /bin が, usr/ の下には /usrが, ってな 感じでおいしそうなファイルがごろごろしています. これで, FreeBSD をまともにインストールしなくても, バイナリを もらって来ることができます.

5. PPP ついでに IP Masquerade

せっかくインターネットに接続している母艦(だけどLinux)が あるわけですから, モバからもシリアルケーブルを通して 世の中に出ていきたいです. ドコモバの場合, 公衆回線を通して プロバイダ等にPPP接続するのは携帯経由になるので, バカ高です. メールの確認, 野球の試合結果の確認, くらいに しておきたい. ということで, 聖典付属の netfront が活躍するのは 母艦にシリアル接続するときなので, シリアルのPPP接続は必須. もっとも, 母艦のつながっているネットワークの IP アドレスを 簡単に割り当てて貰えない場合は Linux では IP Masquerade を使います. *1) FreeBSD でも同様の機能を実現できるようですが, わしは知りません. 構成はこんな感じです.
*1) PPxP パッケージを使ったら, カーネルの IP Masquerade 機能は 必要ありません. ただし, userlink のモジュールが必要になります. 最近 (2000 年 1 月), 自宅の母艦を Debian にした機会に PPxP に乗り換えました. その方法も, また今度まとめます.


とにかく, ネットワークの設定はなんでもそうですが, 接続がうまくいかない場合は, 問題を切り分けないといけませぬ. モバイルギアの場合は UNISHELL で「PC接続」と「パソコン通信」の 二つのソフトがありますので, ハードウェアが動作するかどうかは この二つで最初に確認するのが常套手段かと思います. わしは, 母艦側のシリアル端子が「COM3」なのに Linux で「/dev/ttyS0」を 叩こうとしたりして, 無駄な時間を費しました(笑).

PocketBSD 側の設定

これは, 聖典に書いてあるとおりでいきました. すなわち, /etc/ppp/ppp.conf を以下のように書きます.

default:
 set device /dev/cuaa1
 set speed 14400 
 set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \"\" ATE1Q0\\N3%C1 OK-AT-OK \\dATDT\\T TIMEOUT 60 CONNECT"
 set openmode active
 set timeout 300

nifty:
 set phone 03-5744-XXXX
 set authname NIM-ABC01234
 set authkey PASSWORD
 set login "TIMEOUT 30"
 accept pap
 accept chap
 dial

provider:
 set phone 03-5768-XXXX
 set authname USERID
 set authkey PASSWD
 set login "TIMEOUT 30"
 accept pap
 accept chap
 dial

mother:
 set dial ""
 set login ""
 set line /dev/cuaa0
 set speed 57600
 set timeout 0
 set openmode active
 dial
nifty: は Infoweb 用, provider: は別のプロバイダ, mother: は母艦(Linux BOX)との接続用です. 携帯電話を通すプロバイダへのダイアルアップには, speed 14400 程度でないと接続できませんでした. そりゃそうか. わしは, 246-net と Infoweb で問題なく接続できています. それから, /etc/ppp/ppp.linkup も

nif:
 add 0 0 HISADDR
 shell cp /etc/ppp/resolv.conf.nif /etc/resolv.conf
provider:
 add 0 0 HISADDR
 shell cp /etc/ppp/resolv.conf.provider /etc/resolv.conf
mother:
 add 0 0 HISADDR
 shell cp /etc/ppp/resolv.conf.mother /etc/resolv.conf
として, DNS を決める resolv.conf を接続先ごとに書き換えるようにしています. これで, root になって

# ppp mother
とすると, 母艦への接続ができます. これを mgterm 上で行うと パケットのロスがなくなるのは聖典の記述どおりです.

Linux 側の設定

上のネットワークの構成図を見ていただけるとわかりますが, 基本的に モバモバ を接続する母艦は Linux BOX (デスクトップのSlack3.4改 Kernel 2.0.37)です. Linux 母艦はインターネット(UT-NET)に ほぼ常時, 接続されています. FreeBSD 母艦(デスクトップの 2.2.5)も あるんですが, これは研究室の後輩がいないときに, おもむろに Floppy からブートする「幻の母艦」です(笑). 夏休みだけ海辺で開業するカレー屋さんみたいなものですな. 当然というか, モバモバごときに(失礼) IP アドレスを割り振って 貰えないのですが, モバモバから外の世界に出て行きたい. 最初は, 研究室の後輩のマシンの IP アドレスをモバモバが頂いて, そのマシンがネット上に存在しないときにモバモバを Linux 母艦に接続するという, 「幻のモバモバ」だったのですが, これだとどうにも不便. だいたい, 一番の用途は FreeBSD 母艦との接続で, IPアドレスを「共有」している後輩のマシンにだけ FreeBSD がのってるんだし. ということで, IP Masuquerade の登場です. もっとも, IP Masuquerade に関するネットや書籍上の情報は, 「NIC二枚挿し」が基本だったり, 一枚の NIC に家庭内LANが ぶらさがっていて Linux BOX はダイアルアップでインターネットに 接続されている, といったパターンなので, 今回の「シリアル接続」では どうすりゃいいんだ, と思ったのですが, 意外と簡単でした.

・カーネルが IP Masuquerade 対応になっているか?

まず, Linux BOX のカーネルが IP Masuquerade に対応している 必要があります. このためには, IP Forwarding などにも対応している 必要があるようです. わしはタコなので,
Linux ネットワーク 小山裕司ほか トッパン ISBN4-8101-8961-9
の説明そのままにカーネルを再構築しました.

# ipfwadm -F -l
IP firewall forward rules, default policy: deny
type  prot source               destination          ports
# ipfwadm -F -p masq
# ipfwadm -F -l
IP firewall forward rules, default policy: accept/masquerade
こうなれば, IP masquerade は使えているようです.

・では, 古典的に pppd を動かす.

Linux IP Masquerade mini HOWTO および Linux PPP HOWTO の 30章(PPP をヌルモデム(シリアル直結)で使うには) を参考に以下のように, pppd の起動, IP masuquerade の設定を 行いました. シリアル接続はモデムを使わない分, 楽なんですね.

# pppd -detach crtscts lock proxyarp 192.168.1.1:192.168.1.2 /dev/ttyS2 57600
# ipfwadm -F -p deny
# ipfwadm -F -a masquerade -S 192.168.1.2/32 -D 0.0.0.0/0
(IPアドレスは例です. ) これで, まず PocketBSD 側で先ほどのように

# ppp mother
として, 次に Linux 母艦側で上の pppd 等のコマンドを実行すると, PocketBSD 側では

# ppp mother
User Process PPP. Written by Toshiharu OHNO.
Using interface: tun0
Interactive mode
Dial attempt 1 of 1
dial OK!
login OK!
ppp ON localhost> Packet mode.
ppp ON localhost> 
PPP ON localhost> 
PPP が大文字になれば, 成功です. これで, PocketBSD 側からは ping だろうが telnet だろうが通ります. DNS サーバは, PocketBSD で PPP の設定をしたときに /etc/resolv.conf に書き込んでいるので, DNS の参照もできるでしょう. 母艦側の netstat -r の出力は

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.1.2     *               255.255.255.255 UH     1500 0          0 ppp0
localnet        *               255.255.254.0   U      1500 0          0 eth0
loopback        *               255.0.0.0       U      3584 0          0 lo
default         157.XXX.XXX.X   0.0.0.0         UG     1500 0          0 eth0
(IPアドレスは例です. ) てな感じです.