Tech Sketch Bucket of Technical Chips by TIS Inc.

LinuxでLispMachine(OpenGenera)を動かす

Pocket

OpenGeneraは1990年代にあったsymbolicsのLispMachine環境をDEC ALPHA上で実行可能にしたものです。
このOpenGeneraをLinux 64bit環境上で動作可能にするエミュレータが2006年作成されました。
今回はこのOpenGenera環境をUbuntu上で立ち上げるまでの話をします。
この記事をまとめている際に古いUbuntu環境を結構きれいに再構築できる方法が提供されていることにも気づいたのでそのことを紹介しています。

最初にあえて古いUbuntu環境が必要になった話をしておきます。

Ubuntu10.04以降ではOpenGeneraの起動中にX window をハングアップさせてしまいます。
マウスカーソルは生きてはいますが、マウスクリックや通常キーボードなどの入力は受け付けられない状態になってしまいます。
実際にはmidiffer keyの設定するプログラムの仕様が変更になったの原因でした。

Ubuntu8.04以降ではOpengeneraは起動でき通常のLispプログラミング等は行えるのですが、少なくとも一部のコマンド
(OpenGeneraを停止させる:Halt Genera や 実行時環境を保存する:Save World)などが正常に動作しません。
ということで今回は正常に動作すると思われる最後の版のUbuntu7.10を用いることにしました。

現在自分の手元では直近のLTS版であるUbuntu 14.04上で正常に動作させることができています。
新しいUbuntu上で動かすための話は、また今度にでもしたいと考えています。

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

1.ハードウェア

64Bit Ubuntuが起動可能なPC もちろんディスプレイ、キーボード・マウス、ネットワークなど

2.OSインストールメディア

Ubuntu7.10 Desktop 64bit版を準備してください。
Desktop版でなくてもx winidowなど必要なモジュールを追加すればserver版でも大丈夫です。
http://old-releases.ubuntu.com/releases/7.10/
からISOイメージを取得してインストールCD等を用意してください。

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

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

OSのインストールからOpenGeneraの起動まで

1.Ubuntu7.10 Desktop 64bit版を立ち上げる

別に特別なことではなく、用意したISOメディアで起動してHDDにインストールするだけの話なので、ここでは特に書きません。

要注意:
・この7.10は古いGRUBしか対応していないので新しい版と共存はできません。
・2014年9月報告のbashの脆弱性には当然ながら修正対応されていません。

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

https://help.ubuntu.com/community/EOLUpgrades/Gutsy に従って
/etc/apt/sources.list を更新して
その後次のコマンドでこの変更を反映します。

$ sudo aptitude update && sudo aptitude safe-upgrade

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

・Ubuntu7.10上ではNFS Serverは最初のアクセス時に非常に遅かったり、失敗したりすることがあります。
・参考にしたサイトではNISサービスも必要との記述がありますが、現状なくても動作しています。

 

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

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

4.OpenGeneraを起動する

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

$ sudo ./genera

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

genera

 新しいx window system上でハングアップする原因を確認する

ハングアップ原因を確認するために、Opengeneraが実行されているホストとは別ホストに画面を出力してみます。
この方法として次の2つの方法があります。
方法1:OpenGenera起動ファイルであるgeneraに対して -displayで他のホストを指定して出力する
方法2:OpenGenera環境上で Start X Screen コマンドを用いて他のホストに出力する
しかしながら、方法1は同一マシン上の場合と同様にハングアップしてしまうので 方法2の話をします。

1.画面を表示する側のUbuntu上での設定変更

Ubuntuのx windowの標準設定では他のホストからのアクセスは不可なので受け付けられるように設定する

画面を出力したいホスト上でXのリモート接続を可能にする

Display Manergerによって設定の仕方は異なります。
gdmの場合の設定

$ sudo vi /etc/gdm/gdm.conf
DisallowTCP=false

lightdmの場合の設定方法

$ sudo vi /etc/lightdm/lightdm.conf
xserver-allow-tcp=true

・参考にしたサイトでは/etc/X11/xinit/xserverrcファイルも修正が必要との記述がありますが、現状なくても動作しています。

 

X windowのポートの状態を確認する


$ netstat -an | grep 6000
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN

OpenGeneraを入れたUbuntuマシンのIPアドレスからの接続を許可する


$ xhost + OpenGeneraを入れたUbuntuマシンのIPアドレス
access control enabled, only suthorized clients can connect
OpenGeneraを入れたUbuntuマシンのIPアドレス

要注意:
この設定ではOpenGeneraを入れたUbuntuマシンからは全開放な状態で必ずしも安全な状態ではありません。

正常に出力できるかをOpenGeneraを入れたUbuntuマシン上で確認する


$ xeyes -display 画面出力したいマシンのIPアドレス:0.0

2.OpenGeneraを起動する側のUbuntu上での設定変更

tun上のOpenGeneraから通信がこのUbuntu以外の他のホストにも通信できるように設定します。

$ sudo iptables -A FORWARD -i tun+ -j ACCEPT
$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$ sudo sysctl -w net.ipv4.ip_forward=1

要注意:
この設定ではOpenGeneraからUbuntuマシンを通して任意のマシンと通信可能になります。

3.OpenGenera上でStart X Screen コマンドの実行

ここでは具体的な話はしませんが、symbolicsのgenera環境では多くのソースが参照可能な状態で提供されます。
このことでデバッガから容易にソースを確認して対応することが可能になります。
symbolicsのGenera環境では常にエラー処理のためのコンディションハンドラが動作しており、
エラーなどが発生した際にはインタラクティブなデバッガが起動され、
その場でコードの確認・再コンパイル(自動再リンク)を実施したり、
その場で強制的に再実行や強制的にリターンしたりなどを行うことができます。

ここではエラーの発生した関数のソースを確認して、その後強制的にエラーを起こした関数からリターンして対応した例を示します。
この例では実際にエラーを起こした関数の処理を無視して、その後そのまま処理を継続したことになります。
genera_X_1

上記イメージは Start X Screen コマンドを実行しエラーが発生した状態

genera_X_2

上記イメージは frameを移動して XLIB:SET-MODIFIER-MAPPING で :Edit Funtion を実行

genera_X_3

上記イメージは Zmacs上でのXLIB:SET-MODIFIER-MAPPING が表示されている状態

MODIFIER-MAPPINGを変更する際にエラーが発生して、その状況でハングアップしていました。
ここではエラーを無視してそのまま変更を反映しないで継続させてみることにします。
genera_X_5

上記イメージは XLIB:SET-MODIFIER-MAPPING を強制リターンした状態

genera_X_6

上記イメージは 結果として リモートマシン上に画面が開いた状態

終わりに

今回は古いUbuntu上で動作するように作成されていたOpenGeneraを動作可能な古い版を用意して動作させる話をしました。
今回の話の様に古い版を使用するためにはOSだからだけでなく、その時提供されていた追加可能なモジュールも含めて用意する必要がよくあります。
昔は自分でその全部を持っておかなければならなかったですが、こん回話したように元々サイト側でファイルの提供があれば容易に再現可能になります。
残し忘れたモジュールとかもなく、本当に便利になりました。 もうサポートが切れていてセキュリティ的には問題があるので気を付けて使うようにしましょう。

【OpenGenera関連で参考にしたサイト】

http://www.advogato.org/person/johnw/diary/12.html
http://www.cliki.net/VLM_on_Linux
https://github.com/ynniv/opengenera
http://www.textfiles.com/bitsavers/pdf/symbolics/genera/Open_Genera_User_s_Guide.pdf

【x window関連で参考にしたサイト】

http://d.hatena.ne.jp/orangehat/20090214
http://linux2.g.hatena.ne.jp/lnznt/20120517/1337262139
http://www.it-folder.com/indexd.php?document=linux_trouble_xserver&docdir=2007

【モジュール等を取得したサイト】

http://old-releases.ubuntu.com/releases/7.10/
https://help.ubuntu.com/community/EOLUpgrades/Gutsy
http://www.unlambda.com/download/genera/

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