長らく放置していた RS/6000 に AIX をインストールしよう。
実はこのマシンはマイクロチャネルアーキテクチャ (MCA) だ。 そんなわけで最新の AIX は動かない。 MCA で動作するのは AIX 5.1L が最後である。 この程度のマシンでは AIX 5 は辛いという噂もあるが、 Ruby をコンパイルするためにはソフトウェア環境の 鮮度が重要なのであえて 5.1 を選んだ。
さて、通常、鍵付き RS/6000 では次の手順を踏んで起動する (らしい)。
だがインストール時はブートの手順がちがう。
あとはメニューに従っていけばよい。
最初、ここでまちがって 1 を選んでしまった。 中古マシンだと何事もなく進むから困る。
「システムの構成」で 2 を選ぶと System Settings、Primary Language、Advanced Option の三つが設定できる。
System Settings では新規インストールかマージインストールかを選択。
Primary Language はロケールの選択。 日本語は Japanese (PC) と Japanese (EUC) がある。 Japanese (PC) がデフォルトっぽいが、今回は EUC を選んでみた。 UTF-8 の場合はインストール後に設定しなければならない。
Advanced Option ではインストールするパッケージの選択と、 Trusted なんとかを入れるかどうかが選べる。 PCI システムだとデスクトップ環境が選べたり、 64bit システムだとカーネルの種類が選べたりする。
あとはひたすら待つ。 途中でキーを NORMAL (OK) にしておくよう言われるので、まわしておく。 これをやっておくと作業終了後にリブートしてくれるらしい。
……まだだった。 AIX CD-ROM vol.5 を入れて Enter。 たぶん日本語環境だろうな。
よーし終わったぜ!
リブートしたぜ!
ログインプロンプト出たぜ!
Console login: root[Enter]
Console login: root[Enter]
Console login: root[Enter]
Console login: root[Enter]
Console login: root[Enter]
来ました。お約束のトラブルが。 何度入力しても入力しても戻ってきてしまう。 しかもこれは端末がらみか……。すごい嫌なんですけど。
Google した結果、以下のことがわかった。
解決策はいろいろあるらしいので全部書いておく。
で、今回はシリアルコネクタ変換アダプタが原因だった。 Sun で動作実績がある別のコネクタを持っていたので これに変えてみたら、運よく動いてくれた。
もう、頼むよ本当に……。 シリアル関係はこれまでも何度かはまったんだよな。 安い変換アダプタとかはダメです。本当に。
あぁ、やっとログインできた。 とりあえずお約束の uname を打っとく。
# uname -a AIX localhost 1 5 000******00
……謎の文字列 (一部は伏せる) が返ってきた。
# pwd / # ls .sh_history etc lpp sbin unix audit home mnt tftpboot usr bin lib opt tmp var dev lost+found proc u
普通? いや、「u」って見たことないな。
# ls -l 合計 91 -rw------- 1 root system 98 Nov 20 08:39 .sh_history drwxr-x--- 2 root audit 512 Apr 10 2003 audit lrwxrwxrwx 1 bin bin 8 Nov 20 07:13 bin -> /usr/bin drwxrwxr-x 5 root system 2048 Nov 20 07:57 dev drwxr-xr-x 19 root system 2560 Nov 20 07:57 etc drwxr-xr-x 4 bin bin 512 Nov 20 07:33 home lrwxrwxrwx 1 bin bin 8 Nov 20 07:13 lib -> /usr/lib drwx------ 2 root system 512 Nov 20 07:13 lost+found drwxr-xr-x 34 bin bin 1024 Nov 20 07:51 lpp drwxr-xr-x 2 bin bin 512 Apr 10 2003 mnt drwxr-xr-x 6 root system 512 Nov 20 07:19 opt dr-xr-xr-x 1 root system 0 Nov 20 08:39 proc drwxr-xr-x 3 bin bin 512 Nov 20 07:15 sbin drwxrwxr-x 2 root system 512 Nov 20 07:24 tftpboot drwxrwxrwt 3 bin bin 1024 Nov 20 07:58 tmp lrwxrwxrwx 1 bin bin 5 Nov 20 07:13 u -> /home lrwxrwxrwx 1 root system 21 Nov 20 07:47 unix -> /usr/lib/boot/unix_up drwxr-xr-x 30 bin bin 1024 Nov 20 07:55 usr drwxr-xr-x 19 bin bin 512 Nov 20 07:33 var
/u は /home なのか。user の u かな。
ちょっと思ったんだが、シンボリックリンク一つでも OS ごとに ずいぶん違うもんだな。たしか Solaris は bin -> ./usr/bin になっていた。 Tru64UNIX は bin -> usr/bin だった。で AIX は /usr/bin と。 ちなみに俺は Tru64 スタイルが好き。
# w 08:44AM 稼働時間 47 分, 1 ユーザ, 負荷平均: 0.01, 0.03, 0.05 User tty login@ idle JCPU PCPU what root tty0 08:28AM 0 0 0 w # ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 07:56:36 - 0:00 /etc/init root 2450 1 0 07:57:08 - 0:00 /usr/sbin/syncd 60 root 3142 4160 0 07:57:30 - 0:00 /usr/sbin/inetd root 3490 4160 0 07:57:36 - 0:00 /usr/sbin/dpid2 root 3710 1 0 07:57:08 - 0:00 /usr/lib/errdemon root 3940 4160 0 07:57:20 - 0:00 /usr/sbin/syslogd root 4160 1 0 07:57:15 - 0:00 /usr/sbin/srcmstr root 4686 4160 0 07:57:27 - 0:00 /usr/sbin/portmap root 4964 4160 0 07:57:33 - 0:00 /usr/sbin/snmpd root 5192 4160 0 07:57:24 - 0:00 sendmail: accepting connections root 5940 4160 0 07:57:39 - 0:00 /usr/sbin/hostmibd root 6716 4160 0 07:57:46 - 0:00 /usr/sbin/rpc.lockd root 6970 4160 0 07:57:43 - 0:00 /usr/sbin/biod 6 root 7230 1 0 07:57:47 - 0:00 /usr/sbin/cron root 7532 1 0 08:20:41 0 0:00 -ksh root 7750 1 0 07:57:56 - 0:00 /usr/sbin/uprintfd root 8054 4160 0 07:57:52 - 0:00 /usr/sbin/qdaemon root 8268 4160 0 07:57:56 - 0:00 /usr/sbin/writesrv root 9042 4160 0 07:57:59 - 0:00 /usr/sbin/rsct/bin/ctcasd root 9292 1 0 07:57:56 lft0 0:00 /usr/sbin/getty /dev/lft0 imnadm 9546 1 0 07:57:56 - 0:00 /usr/IMNSearch/httpdlite/httpdl root 9806 1 0 07:57:56 - 0:00 /usr/lpp/diagnostics/bin/diagd root 10064 4160 0 07:57:59 - 0:00 /usr/sbin/rsct/bin/rmcd -r root 10356 7532 5 08:44:04 0 0:00 ps -ef root 11612 4160 0 07:58:04 - 0:02 /usr/sbin/rsct/bin/IBM.ERrmd root 12128 4160 0 07:58:04 - 0:00 /usr/sbin/rsct/bin/IBM.CSMAgent root 12386 4160 0 07:58:13 - 0:01 /usr/sbin/rsct/bin/IBM.AuditRMd
システムを入れるたびに sendmail を止めてまわらないといけないんだよなー、めんどいなー。
ああそれから、BackSpace が効かないのが Linux の宿命だ。 そういうときは
# stty erace '^?'
で黙らせる。
ネットワークも見ておこう。
# ifconfig -a lo0: flags=e08084b<UP,BROADCAST,LOOPBACK,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT> inet 127.0.0.1 netmask 0xff000000 broadcast 127.255.255.255 inet6 ::1/0 tcp_sendspace 65536 tcp_recvspace 65536 # netstat -a -f inet Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) tcp4 0 0 *.daytime *.* LISTEN tcp 0 0 *.ftp *.* LISTEN tcp 0 0 *.telnet *.* LISTEN tcp4 0 0 *.smtp *.* LISTEN tcp4 0 0 *.time *.* LISTEN tcp4 0 0 *.sunrpc *.* LISTEN tcp4 0 0 *.smux *.* LISTEN tcp 0 0 *.exec *.* LISTEN tcp 0 0 *.login *.* LISTEN tcp 0 0 *.shell *.* LISTEN tcp4 0 0 *.klogin *.* LISTEN tcp4 0 0 *.kshell *.* LISTEN tcp4 0 0 *.rmc *.* LISTEN tcp4 0 0 *.writesrv *.* LISTEN tcp4 0 0 loopback.49213 *.* LISTEN tcp4 0 0 *.32770 *.* LISTEN tcp4 0 0 *.32771 *.* LISTEN tcp4 0 0 *.wsmserve *.* LISTEN tcp4 0 0 loopback.smux loopback.32769 ESTABLISHED tcp4 0 0 loopback.32769 loopback.smux ESTABLISHED tcp4 0 0 loopback.32770 loopback.32772 ESTABLISHED tcp4 0 0 loopback.32772 loopback.32770 ESTABLISHED udp4 0 0 *.daytime *.* udp4 0 0 *.time *.* udp4 0 0 *.sunrpc *.* udp4 0 0 *.snmp *.* udp4 0 0 *.syslog *.* udp4 0 0 *.ntalk *.* udp4 0 0 *.32770 *.* udp4 0 0 *.32773 *.*
へー、tcp/tcp6 じゃなくて tcp4/tcp なんだ。 そりゃまた大胆な。
基本的な構成は install_assist がやってくれる。
# install_assist 端末タイプの設定 端末が正しく初期化されていません。端末タイプを入力して ENTER を 押してください。英語以外の言語をサポートしていない端末タイプも あります。 ibm3101 tvi912 vt330 ibm3151 tvi920 vt340 ibm3161 tvi925 wyse30 ibm3162 tvi950 wyse50 ibm3163 vs100 wyse60 ibm3164 vt100 wyse100 ibmpc vt320 wyse350 lft sun +---------------------メッセージ------------------------ | 次画面が読み取り不可能な場合、Break (Ctrl-c) キーを 88 ヘルプ ? | 押して、この画面に戻ってください。 99 終了 | | >>> 選択 []:
うわ、嫌なかんじ。vt100 で日和っとくか……。
だめだ。ファンクションキーが全部きかない。
そんなことはなかった。 ESC + 数字キーで同じ結果になるようだ。
うーん、ライセンス入力から先に進まない。 何やってんだろう。
SEGV しやがった orz
回線を切断してもう一回やりなおす。
やっとコツがわかってきた。 Ctrl-H で消去、Enter で実行、左上に OK と出てたら ESC-3 で戻る、 を繰り返せばいいようだ。 なんて出来の悪いソフトウェアだ。 このへんは Tru64 が一番優秀だったなあ。
で、なんとかがんばってネットワークを動かす。 このマシンはイーサネットが二つあって、 しかも表に出てるやつは二つめの en1 のほうだった。 実にまぎらわしい。
# ifconfig -a en1: flags=e080863<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT> inet 192.168.1.43 netmask 0xffffff00 broadcast 192.168.1.255 lo0: flags=e08084b<UP,BROADCAST,LOOPBACK,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT> inet 127.0.0.1 netmask 0xff000000 broadcast 127.255.255.255 inet6 ::1/0 tcp_sendspace 65536 tcp_recvspace 65536
またデフォルトでは telnet が IPv6 でしか動いていなかったので、 inetd.conf をいじって tcp6 → tcp に変更した。 その後は refresh -s inetd でリロードできるらしい。
これでどうだっ。
~ % telnet rs7012 Trying 192.168.1.43... Connected to rs7012. Escape character is '^]'. telnet (rs7012) AIX Version 5 (C) Copyrights by IBM and by others 1982, 2000. login:
よし、telnet がつながった。 これで勝ったも同然だ。
あとはいつも通り。 sudo, zsh, ssh, cvs, gcc, bison, まで入れれば Ruby がビルドできる。はず。 続きはまた明日〜。
(02:26)
(すでにパッチを出したあとだけど記録のため残しておく)
gets("") が gets(nil) と同じになっているっぽい。
~/c/ruby % (echo a; echo; echo b; echo) | ruby-1.8.1 -e 'p STDIN.gets("")' "a\n\n" ~/c/ruby % (echo a; echo; echo b; echo) | ./ruby -e 'p STDIN.gets("")' "a\n\nb\n\n"
報告しようと思ったが、[ruby-core:03771] と同じみたいなので様子を見ることにする。
ちょっとだけ追ってはみたんだけど、 rb_io_getline() の次のとこをちゃんと抜けていないらしい、てとこで脱落。
while ((c = appendline(fptr, newline, &str)) != EOF && (c != newline || RSTRING(str)->len < rslen || (rspara || rscheck(rsptr,rslen,rs)) || memcmp(RSTRING(str)->ptr+RSTRING(str)->len-rslen,rsptr,rslen)));
……と言いつつも追ってしまうやつ。
この条件をわかりやすく書きなおすとこうなる。
for (;;) { c = appendline(fptr, newline, &str); if (c == EOF) break; if (c == newline) { if (RSTRING(str)->len >= rslen) { if (rspara && rscheck(rsptr, rslen, rs)) { if (memcmp(RSTRING(str)->ptr + RSTRING(str)->len - rslen, rsptr, rslen)) break; } } } }
なるほど。rscheck のとこが間違ってるな。 ここが if (rspara || rscheck(rsptr, rslen, rs)) にならないといけない。 意図を考えるとたぶんこうだろう。
while ((c = appendline(fptr, newline, &str)) != EOF) { if (c == newline) { if (RSTRING(str)->len < rslen) continue; if (!rspara) rscheck(rsptr, rslen, rs); if (memcmp(RSTRING(str)->ptr + RSTRING(str)->len - rslen, rsptr, rslen) == 0) break; } }
newline (= rs の最後の文字) が読み込めるまで読んで、 str の末尾が rs に等しいか memcmp でチェックする。 ただし str.length < rs.length のときは読み込みを続行し (continue)、 rs が変化したときは例外にする (rscheck)。
make test, make test-all は通るみたいだな。
# ちなみになんでこのバグに気付いたかと言うと tdiarygrep が動かなかったからで、 tdiarygrep を使ったのは RS/6000 の起動方法を検索するためだった。
(02:31)
AIX 入れたりパッチ書いたり、 Linux 本の原稿はどーしたんだと思われるかもしれませんがいいんです、 今日はたくさん書いたんです。
いやそれは嘘で文章はあんまり書いてはいないけど、たくさん作業したんです。 タグも付けたし全部文法チェックしたしプログラムのテストも書いたし文章も読み直したし。 だから大丈夫です! ええ! きっと今年中には出るよ! いや出ないけど! どっちだよ!
ねる。
(02:42)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
圏論勉強会来ませんでしたね。やっぱり日記に書き込まないとダメでしょうか?
http://www.sampou.org/cgi-bin/haskell.cgi?CategoryTheory%3a%b7%f7%cf%c0%ca%d9%b6%af%b2%f1&l=jp
いやー、ML 読んでるからわかってはいたんですが、
時間と金がないっす……。たぶん 1 月あたりには
なんとか。