history

青木日記 RSS

<前の日 | この月 | 次の日>

2004-11-20

RS/6000 7012-397; AIX 5.1L installation

長らく放置していた RS/6000 に AIX をインストールしよう。

実はこのマシンはマイクロチャネルアーキテクチャ (MCA) だ。 そんなわけで最新の AIX は動かない。 MCA で動作するのは AIX 5.1L が最後である。 この程度のマシンでは AIX 5 は辛いという噂もあるが、 Ruby をコンパイルするためにはソフトウェア環境の 鮮度が重要なのであえて 5.1 を選んだ。

さて、通常、鍵付き RS/6000 では次の手順を踏んで起動する (らしい)。

  • シリアルケーブルをつなぐ。コネクタは幅広のメス
  • キーを secure (鍵マーク) にする
  • 電源オン
  • 「200」が出るまで待つ
  • キーを service (スパナマーク) にする
  • 30 秒以内にリセットボタンを押す
  • シリアル 1 にシリアルコンソールが出る
  • "Exit Main Menu" を選ぶ
  • キーを normal (OK) にして Enter

だがインストール時はブートの手順がちがう。

  • キーを service (スパナ) にして起動
  • CD-ROM を入れる (起動するまでかなり間があるので注意)
  • メッセージが出たら「2」のキーを押して Enter

あとはメニューに従っていけばよい。

  • インストール中の言語の選択 (1 = 英語)
  • システムの構成 (1 = 既存システムにマージ、 2 = 新規 / 上書き、3 = バージョンアップ)

最初、ここでまちがって 1 を選んでしまった。 中古マシンだと何事もなく進むから困る。

RS/6000 7012-397; AIX 5.1L installation (2) システムの構成

「システムの構成」で 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 システムだとカーネルの種類が選べたりする。

RS/6000 7012-397; AIX 5.1L installation (3) インストール

あとはひたすら待つ。 途中でキーを NORMAL (OK) にしておくよう言われるので、まわしておく。 これをやっておくと作業終了後にリブートしてくれるらしい。

……まだだった。 AIX CD-ROM vol.5 を入れて Enter。 たぶん日本語環境だろうな。

RS/6000 7012-397; AIX 5.1L installation (4) インストール後

よーし終わったぜ!

リブートしたぜ!

ログインプロンプト出たぜ!

Console login: root[Enter]

Console login: root[Enter]

Console login: root[Enter]

Console login: root[Enter]

Console login: root[Enter]

来ました。お約束のトラブルが。 何度入力しても入力しても戻ってきてしまう。 しかもこれは端末がらみか……。すごい嫌なんですけど。

Google した結果、以下のことがわかった。

  • AIX で
  • 特定の機種で
  • シリアルコンソールからログインできなくなることがある

解決策はいろいろあるらしいので全部書いておく。

で、今回はシリアルコネクタ変換アダプタが原因だった。 Sun で動作実績がある別のコネクタを持っていたので これに変えてみたら、運よく動いてくれた。

もう、頼むよ本当に……。 シリアル関係はこれまでも何度かはまったんだよな。 安い変換アダプタとかはダメです。本当に。

RS/6000 7012-397; AIX 5.1L installation (5) システムの探索

あぁ、やっとログインできた。 とりあえずお約束の 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 なんだ。 そりゃまた大胆な。

RS/6000 7012-397; AIX 5.1L installation (6) 基本設定

基本的な構成は 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 がつながった。 これで勝ったも同然だ。

RS/6000 7012-397; AIX 5.1L installation (7) アプリケーション

あとはいつも通り。 sudo, zsh, ssh, cvs, gcc, bison, まで入れれば Ruby がビルドできる。はず。 続きはまた明日〜。

(02:26)

gets("")

(すでにパッチを出したあとだけど記録のため残しておく)

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)

Linux 本〜

AIX 入れたりパッチ書いたり、 Linux 本の原稿はどーしたんだと思われるかもしれませんがいいんです、 今日はたくさん書いたんです。

いやそれは嘘で文章はあんまり書いてはいないけど、たくさん作業したんです。 タグも付けたし全部文法チェックしたしプログラムのテストも書いたし文章も読み直したし。 だから大丈夫です! ええ! きっと今年中には出るよ! いや出ないけど! どっちだよ!

ねる。

(02:42)

本日のツッコミ(全2件) [ツッコミを入れる]
shelarcy (2004-11-21 14:26)

圏論勉強会来ませんでしたね。やっぱり日記に書き込まないとダメでしょうか?
http://www.sampou.org/cgi-bin/haskell.cgi?CategoryTheory%3a%b7%f7%cf%c0%ca%d9%b6%af%b2%f1&l=jp

青木 (2004-11-21 16:13)

いやー、ML 読んでるからわかってはいたんですが、
時間と金がないっす……。たぶん 1 月あたりには
なんとか。

名前
メールアドレス

<前の日 | この月 | 次の日>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|