Tech Sketch Bucket of Technical Chips by TIS Inc.

LinuxでLispMachine(OpenGenera)を動かす(その2)

Pocket

2014年12月1日に公開した「LinuxでLispMachine(OpenGenera)を動かす」の続きです。
今回は普通にはOpengeneraの起動できないUbuntuの直近のLTS版の14.04上で動かす話をします。

起動できなくなってしまったのは、Xwindowの動きが古い版とはことなり イベントが発生するようになり それを受け取って処理する仕組みを必要になったことが主な原因です。

その前に前回の記事では前世紀の1990年代の話だったのであまりにわからない言葉だったみたいなので軽く説明しておきます。
詳しくはウィキペデイア等でも調べてみてください。
LispMachineとはプログラミング言語のひとつであるLispを実行するためのコンピュータです。
symbolicsはMIT AIラボをスピンオフで設立された米国のコンピュータメーカーの一つでしたが既に倒産してしまっています。
Generaは上記symbolics社がLispMachine用に作成したOSの名称です。
DECはディジタル・イクイップメント・コーポレーション (Digital Equipment Corporation)の略称。科学技術分野で活用された米国のコンピュータメーカー、1998年にコンパックに買収され、そのコンパックも2001年にヒューレット・パッカード(HP)に買収され現在に至ている。
ALPHAは 上記DEC社 の64ビットRISC命令セットアーキテクチャCPUの名称です。
最後にOpenGeneraは上記GeneraというOSをsymbolicsのCPU以外のDEC ALPHA上にポーティングしたOSの名称です。
 

実際にインストールを開始する前に準備しておくもの

1.ハードウェア、OS

 64Bit Ubuntuが起動可能なPC もちろんディスプレイ、キーボード・マウス、ネットワークなど
 Ubuntu14.04 Desktop 64bit版を準備してください。

※今回はXwindowをハングアップさせてしまう可能性があるので【付録:B】にその対応の仕方も簡単に書いてあります。

2.OpenGeneraのインストールモジュール snap4.tar.gz

 エミュレータを作成したMr.Brad Parkerのサイトから実行モジュールである
 http://www.unlambda.com/download/genera/snap4.tar.gz
 を入手します。
このモジュールは前回と同じものです。

OpenGeneraの起動できる Worldを作成する

Ⅰ.前回のUbuntu7.10の環境がある場合

①Opengeneraを起動する
②ハングさせる関数をダミーに置き換える

※同じキーが別のmodifierに指定された場合、以前は無視していましたが、
新しい版ではエラーとなって処理が中断してしまいます。
xlib:set-modifier-mappingをダミーにすることで無理やりmodifierを再設定しなくしています。
x上のmodifierを再設定しなくてもLisp環境上でのmodifierは設定されるので
基本的な動きに問題はほとんどありません。

③Save Worldで環境を保存する

要注意:
 ・ここで作られたLispイメージはUbuntu14.04上でもXwindowのハングアップはさせなくなります。
 しかしながらUbuntu14.04上ではSave Worldをすることができません。
 ・次の示すxlib:close-display関数をダミーするとUbuntu7.10上でも正常にSave Worldが完了しなくなりますが、
 Ubuntu14.04上でもSave Worldでファイル自体は作成することができます。
 

※ウィンドウを閉じようとしている際の通知(WM_DELETE_WINDOW)がウィンドウマネージャから届くがこれを処理しないと次のようなエラーが発生しています。
XIO: fatal IO error 35 (Resource temporarily unavailable) on X server ":0.0"
after 16 requests (16 known processed) with 0 events remaining.
xlib:close-displayをダミーにすることでウィンドウを閉じること自体を無理やり無視するようにしています。
Halt GeneraでOpenGeneraを停止するときは、プロセスが終了するのでウィンドウもエラーを発生させながら閉じられているみたいです。

Ⅱ.前回のUbuntu7.10の環境がない場合

本当は前回の話の正常にOpenGeneraが動く環境でWorldと呼ぶLispイメージを保存して置けば良いのですが、
前回の環境がない状態ですこし綱渡り的にデバッグ環境を利用して対応することにします。

1.Ubuntu14.04 Desktop 64bit版を起動する

別に特別なことではない、ここでは特に書きません。
特別にOpenGeneraのために新しくUbuntuを用意する必要はありません。

要注意:
 ・仮想TUNを使用するのだ実行にはsudoできるユーザである必要があります。
 ・Ubuntuのバージョンは14.04でなくてもほぼ同様に作業はできると思います。

2.作業がしやすいようにtimeサービスを止めておく

timeサービスからの応答がない場合に画面で現在時刻の入力することになります。
ところが今回のOpenGenera環境ではその入れられた時刻を内部に再設定する機能が作られていないために
デバッガに落ちてしまいます。 途中で止めて関数を入れ替えるのにこのデバッガ上で行います。

3.snap4を取得して配置する

symbolicsというフォルダ上にsnap4の中身ファイル展開します。
このフォルダ名は編集しなければならない量を減らすためだけで別にsymbolicsにしなくても大丈夫です。
起動設定ファイルである .VLMファイルの内容を整えます。
これから作成するLispイメージファイル Inc-Genera-8-5.vlod
を指定した状態にします。

4.OpenGeneraを起動しデバッガに落とす

symbolics フォルダでOpenGeneraの起動ファイルを実行します。

$ sudo ./genera -ids yes -w ../symbolics/Genera-8-5.vlod

するとOpengeneraが起動され次のColdLoad画面が表示されます。

U14-01

ここで手で現在時刻を入力する YYYY-MM-DD HH:MM JST 
すると日時情報の値は正常に渡ったあとでデバッガに入ります。

5.問題を発生している関数をダミーにして環境を保存する

ここで次の関数を再定義します。

なぜこの2つの関数をダミーにしたかは前の「Ⅰ.前回のUbuntu7.10の環境がある場合」のそれぞれの関数をダミーにしているところに書いているので
読んでみていただけると幸いです。


U14-03


デバッガに対して
:Return 
と入力して デバッガに入った TIME:SET-CALENDAR-CLOCK
からReturnするかと問われるので それにY と答えます。

U14-05

残念ながら、Save Worldが正常に完了しない障害の対応はLisp環境側ではなく
Linux上の起動ファイルであるgeneraというモジュールを修正しないといけません。
一部で修正済みの版がありますが、提供元がないため今回はこのまま話をすすめます。

起動設定ファイルで指定した名前のファイルを作成します

Save World Incrimental Host:../symbolics/Inc-Genera-8-5.vlod

次の画面の様に書き出したところで処理は停止してしまいます。

U14-08


別の端末画面を開いて ../symbolics/Inc-Genera-8-5.vlod のファイルができているかを確認して
止まってしまっているプロセスをkillして終わらせてください。

U14-09

6.OpenGenera起動するのに必要なモジュールをUbuntuに追加する

ここの内容は前回のUbuntu7.10の時と基本的同じ内容です。

1) openbsd-inetd

 OpenGenera起動時に現在時刻をudp上のtimeサービスで取得するために必要になっています。

$ sudo apt-get install openbsd-inetd
/etc/inetd.conf ファイルの次行のコメントアウトしてudp timeサービスが起動されるようにします。

time dgram udp wait root internal

openbsd-inetを再起動します。

$ sudo /etc/init.d/openbsd-inetd restart

参考にしたサイトではtcp timeサービスやdaytimeサービスなども必要な記述がありますが、実際に使っているのはudp timeサービスだけです。
OpenGenara起動時に現在時刻を手入力できるモジュールを修正すればこのサービスも不要にできます。

2) nfs-kernel-server(またはnfs-user-server)

 ソースやデータの参照や保存先としてLinux側のファイルシステムを利用します。その際に必要なNFS Serverの機能です。
 FTP Serverでもほとんど機能は実現できますが、一部の機能が動作しません。
 OpenGenera環境を起動するだけには必須ではありませんが、OpenGenera環境上にはファイルシステムを持っていないので
 ファイルに保存したり、ファイルを参照したりするには必ず必要になります。
 ここでは一番単純に今回インストールしたUbuntu上のファイルを使用する場合の例を示します。


$ sudo apt-get install nfs-kernel-server

/etc/exports ファイルを編集してOpenGeneraの10.0.0.2からのアクセスを認める設定をする。


/ 10.0.0.2(rw,no_root_squash,sync,subtree_check)

要注意:
この設定ではOpenGenaraからは全てのフォルダが参照・書込み可能になっています。

上記設定を反映するためにnfs-kernel-serverを再起動します。

$ sudo /etc/init.d/nfs-kernel-server restart

正しく設定されているかどうかを確認します。

$ showmount -e localhost
Export list for localhost
/ 10.0.0.2

7.保存をした環境を立ち上げる

先ほどの起動設定ファイルに記述したファイルで作成したので一番単純に


$ sudo ./genera


U14-11

【付録A】generaプロセスを停止する方法

99999の数字は そのすぐ上のコマンドで得た ./genera が動いているプロセス番号です。

ps -aux | grep genera
sudo kill -9 99999

【付録B】UbuntuでXwindowがハングした場合の対応

①control alt F1 でtty1を呼び出す
②上のAの手順でgeneraプロセス停止させる
③control alt F7 でX window環境に戻る

【付録C】timeサービスを起動しないで対応する方法

1)手で現在時刻を入力する YYYY-MM-DD HH:MM JST
2)デバッガに対して :Return

【おまけ1】CentOSでのOpenGeneraの実行

12月の記事を公開した後にubuntu以外Linuxでも試してみようとしたところ

CentOS 5.11

既にサポート停止となっているUbuntu7とは違って2017年3月までサポート予定のCentOS 5.11でも前回説明したと同様に動作可能でした。
time サービスには xinetdを使用し、
nfsサービスは OSと一緒に設定します。
ファイヤウォールの設定を忘れずに行わないとサービスは起動していても使えなかったりします。

CentOS 6.6

今回Ubuntu14と同様にx-windows関連の対応が必要となっています。
当然ながら普通に起動するとXwindowがハングアップ状態になってしまいます。

CentOS 7

どうももっといろいろなことが起きているらしい状況です。
キー入力が途中で受け付けられなくなったり、色の名称としてFORGRANDというのが指定されていないとエラーになったりしてうまく動作しません。

【おまけ2】デバッガコマンドを紹介

symbolicsではctl-,meta-,super-などモディファヤキーを用いて使うの普通だったが
元々symbolicsキーボードは非常に変わっていて,とかほかのキーボードには無いキーがあり
それらとの兼ね合いともあって必ずしも思い通り動かないのでコマンドも含めて紹介しておく。


実行を継続するためのコマンド

:Return

c-R 現状のフレームを終わらせます。戻り値が必要な場合は入力が必要になります。

:Reinvoke

c-m-R 現状のフレームを再実行させます。

:Proceed

そのまま継続をすすめるか、以前のデバッガ状態に戻します。

:Abort

c-Z 処理をAbortさせて終わらせます。

DBG: 関数 現状のフレームの参照・変更が行えます

(DBG:ARG n) 引数にアクセスできます。

(DBG:LOC n) ローカル変数にアクセスできます。

(DBG:VAL n) 戻り値にアクセスできます。

SETF を用いることで値を置き換えることができます。

エンジニア採用中!私たちと一緒に働いてみませんか?