X68000とRaspberry Piをシリアル接続してX68000にネット環境を構築する

2000年前後のX68000用のLANカードが出回りだした頃の、Linuxサーバ相手にやってたことを、改めてRaspberry Pi(以下RasPi)を使ってやってみました。ざっくりと仕組みを説明すると、RasPiをPPPサーバにして、X68000からPPPで接続するということです。モデムを使ってインターネットプロバイダにダイアルアップ接続するのを自宅でやってるようなものですね。ここではftpを使ってX68000とRasPiの間でファイルのやり取りを出来るようにしてみます。

ネットに過去の事例があり、それらを参考にさせて頂きました。特にMitsukyさんのページは大変参考になりました。ありがとうございます。あの頃のWebページは、かなり消えてしまっているので、今でも残っているページは本当にありがたいです。

前提条件

RasPiをインターネットに接続できる環境に設置する必要があります。また、RasPiのIPアドレスを固定させてください(RasPiを再起動しなければDHCPで割り当てられたIPアドレスを一時的に使い回してもいいです)。また、何かしらの方法でパッケージをインストール出来る手段があれば、RasPiをインターネットに繋がなくても構いません。

rasPiの基本的な設定は各自で。タイムゾーンとか文字コードとかセキュリティ周りの各種設定とか。以下の説明では、セキュリティ周りについては一切触れません。また、問題点の切り分けのため、各種認証も行わない簡易な設定にしていますから、その点はご注意ください。

必要な機器

USBシリアル変換には、手元に転がっていたcorega CG-USBRS232R ケーブルという製品を使いました。

この製品でなくても、変換器内でFT232RというICを使っているものであればRasPiにつなぐだけで自動的に認識されるのでOkです。世の中に出回ってるUSBシリアル変換器の多くはFT232Rを使っていると思うので大丈夫でしょう(無責任)。

X68000側のRS-232C端子はDSUB 25ピンメスです。クロス接続にすることと、互いの端子のオスメスに注意してください。

RasPiのGPIO端子にはシリアル通信用の端子があり、それを使えば、USBシリアル変換器は不要になりますし、貴重なUSBポートを塞がずに済みます。RasPiのGPIOポートは3.3Vなので、X68000のRS-232C端子(12V)に直結させないでください。電圧変換が必要になります。

RasPiを有線ケーブルでLANに繋いでいますが、無線LANでも構いませんし、X68000とRasPiの間でファイルのやり取りをするだけであれば、最初の設定以降はRasPiをLANに繋ぐ必要はありません。

RasPiのインストールから初期設定

必要最低限の設定だけしてみます。

公式サイトからイメージファイルをダウンロードします。

Win32 Disk ImagerでSDカードに書き込みます。

RaspPiにHDMIケーブルとキーボードを繋いでからUSB電源ケーブルをつないで起動します。この時点で、LANケーブルをつないでおいてもいいです。

メニューが表示されるので、Expand Filesystemを選んでEnterキーを押します。これで、SDカードの空き領域を全てOS用に割り当てます。

Finishを選んで再起動します。

ユーザ:pi、パスワード:raspberryでログインします。

RasPiのUSBシリアルを確認

まず、RasPiをシャットダウン(sudo halt)して電源を落とします(電源ケーブルを外す)。それから、USB変換器をRasPiのUSBポートに接続して、RasPiを起動します。USBなんだからRasPiを起動したままでも変換器を接続できそうなものですが、私が所有している変換器を動作中のRasPiに挿し込んだら落ちました。

RasPiにログインします。

lsusbコマンドを実行して、USBシリアル変換器が認識されているかどうか確認します。

私の変換器は、Device 004: ID 07aa:002a Corega K.K.として認識されているようです。

USBシリアル変換はlinux上では/dev/ttyUSB0としてアクセス出来ますが、どのユーザでも使えるというわけではありませんから、その辺を確認します。 /dev/ttyUSB0のグループはdialoutで、piユーザはdialoutグループに所属しているのでOKですね。所属していないようならusermodで適当に設定してください。

WindowsとRasPiでシリアル通信してみる

問題切り分けをし易いように、まずはWindowsとRasPiでシリアル通信の動作確認をしてみます(やらなくてもOKです)。お互いをクロスケーブルでつなぎます。windows側は毎度おなじみのTeraTermを起動してシリアルポートを選択します。

RasPiからWindowsに文字列を送る確認をします。Windows側では何もしなくてよいです。

cat > /dev/ttyUSB0
hello windows

WindowsからRasPiに文字列を送る確認をします。最初に、RasPiを受信待機状態にします。

cat < /dev/ttyUSB0

Windows側(TeraTerm)から何か文字列を送ると(送る時はEnter)、RasPi側に表示されます。

X68000とRasPiでシリアル通信してみる

環境設定の違いがあると厄介なので、初期状態のHUMAN68K 3.02とRAM 2MbyteのX68000 SUPERを使ってみます。X68000とRasPiの間の通信速度は最初のうちは9600bpsにしておきます。

X68000側のRS-232Cの速度を、switch.xかspeed.xを使って9600bps, 8bit, stop1, xon/offにしておきます。

Raspberry Pi側のシリアルポートの速度を9600bpsにした方がいいのだと思いますが(stty < /dev/ttyUSB0 9600とか)、その辺は適当にやってくれるようで気にしなくていいみたいです。

RasPiからX68000に文字列を送る確認をします。最初にX68000を受信待機状態にしておきます。

type AUX0 (もしくはAUX)

RasPi側から、適当に文字列を送ります。

cat > /dev/ttyUSB0
hello X68000

X680000からRasPiに文字列を送る確認をします。最初に、RasPi側を受信待機状態にします。

cat < /dev/ttyUSB0

X68000から、文字列を送ります。

echo hello_RasPi > AUX0 (もしくはAUX)

RasPiをネットにつなぐ

LANケーブルを接続してネットにつなぎます。まずは、RasPiをアップデートしておきます。

sudo apt-get update
sudo apt-get upgrade

ついでにファームも更新しておくといいかも。

sudo rpi-update

DHCPでIPドレスが割り当てられていると思うのでifconfigで確認します。

私が利用しているネット環境では、RasPiに割り当てられたIPアドレスは192.168.17.15でした。ここらでRasPiの固定IPの設定をするといいと思います(ググってね)。

RasPiの環境設定

pppdをインストールします。

sudo apt-get install ppp

X68000で使うファイルの用意

下記のファイルをダウンロードします。

ファイルがたくさんあって、どれを使うのかわかりにくいのですが、最低限必要なファイルとコピー先をまとめてみました。

[BSIO021.LZH]
bsio.x → \bin

[pppxr5.lzh]
conf.ppp → \etc
ppp.sys → \sys
ppp.x → \bin

[xipb5.lzh]
xip.x → \bin

[TCPPACKA.LZH]

bin\ping.x → \bin
bin\ftp.x → \bin
etc\hosts → \etc
etc\networks → \etc
etc\protocols → \etc
etc\services → \etc

どうやって上記のファイルをX68000に持っていくのかですが、その説明を始めると結構な分量になるので、各位調べてください(ひどいな)。そもそもそれが出来るのであれば、X68000とRasPiをつなげる意味が無いような気はしますが。X68000とRasPiをクロスケーブルで接続出来ているのであれば、X68000 LIBRARYの「クロスケーブルで直結する」方法でファイルを送る事が出来ると思います(最低限、X68000側にhuman68k起動ディスクとX-BASICが必要になります)。

ファイルをフロッピーディスクにコピーしていると、フロッピーディスクの空きが足りなくなると思うので、\sys\float3.x、\sys\float4.x、\sys\prndrv.sys等々の使わなそうなファイルを片っ端から消します。

X68000の環境設定

[config.sys]

PROCESS = 4 10 50

他のプロセスを動かすことも考えて最初の数字を10とかの大きめの値にしておくとよいかも。

ppp.sysを追加します。

DEVICE=C:\SYS\ppp.sys

この時点ではもうHuman上でAUXを使うためのRSDRV.SYSは不要になりますから、削除して構いません。

autoexec.bat

環境変数の設定

set PPP=\ETC
set SYSROOT=\
set HOST=x68k

最低限のconfig.sysとautoexec.bat

[config.sys]
FILES     = 30
BUFFERS   = 20 1024
LASTDRIVE = Z:
PROCESS   = 10 10 15
DEVICE    = \SYS\FLOAT2.X
DEVICE    = \SYS\IOCS.X
DEVICE    = \SYS\ppp.sys

[autoexec.bat]
ECHO OFF
PATH A:\;A:\SYS;A:\BIN;
SET PPP=\ETC
SET SYSROOT=\
SET HOST=x68k

[\etc\conf.ppp]

ppp.xが参照するconf.pppに以下の内容を追加します。IPアドレスの部分は各自の環境に合わせてください。

raspi:
	set debug phase
	disable vjcomp
	deny vjcomp
	disable lqr
	deny lqr
	disable pred1
	deny pred1
	disable chap
	disable pap
	deny chap
	deny pap
	set openmode active
	set speed 9600
	set ifaddr 192.168.17.68 192.168.17.15
	dial

[\etc\networks]

私のネット環境では、RasPiに割り当てられたIPアドレスは192.168.17.15でしたので、192.168.17の部分を追加します。

192.168.17	private-net

[\etc\hosts]

IPアドレスとホスト名を対に定義したファイルに追加します。X68000のIPアドレスは適当に192.168.17.68にしました。

127.0.0.1	localhost		localhost
192.168.17.15	raspberrypi		raspberrypi
192.168.17.68	x68k			x68k

起動してみる

X68000をディスクから起動して待機状態になったら、

bsio
xip
ppp raspi

の順に起動します。

続いてRasPi側で

sudo /usr/sbin/pppd /dev/ttyUSB0 9600 local 192.168.17.15:192.168.17.68 noauth

を実行します。IPアドレスの箇所は、RasPiのIPアドレス:X68000側のIPアドレスです。

接続が成功すると、X68000の画面に色々と表示されて、コマンド待機状態になります。

X68000側で

ping 192.168.17.15

を実行して、RasPiにパケットが届くかどうかを確認します。

ppp接続を終了する時は、

ppp

をもう一度実行してください。これをやらずにX68000をリセット/電源OFFすると、RasPi側のプロセスが残ったままで、次から困ることがあります(プロセスをkillすればいいですが)。

ftpしてみる

いまどきftpですか?という感じはしますが、X68000からLANを通してファイルをやり取りする方法はこれくらいしかないですし、これで充分とも言えます。

RasPiにvsftpdをインストールします。

sudo apt-get install vsftpd

vsftpdを止めておきます。

sudo service vsftpd stop

設定ファイルを編集します。

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf_ORG
sudo nano /etc/vsftpd.conf

設定項目が多いのですが、これだけ書き換えれば一応OKです。行の先頭に#が付いている場合は取り除いてください。

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022

vsftpdを起動します。

sudo service vsftpd start

X68000側でftp.xを起動して、ユーザー名:pi、パスワード:raspberryで接続します。RasPi側の/home/piディレクトリが見えているので、あとはファイルをやり取りし放題!

ftp.xが問題なく動くようでしたら、Mitsukyさんftpf.xもお勧めです。

あとはRasPi側でファイル共有設定をして、MacやWindowsでRasPiの共有フォルダに直接アクセスすれば、X68000とのファイルのやり取りがより簡単になりますね。

速度遅いよ!

9600bpsもあれば充分じゃないですか!ボクがパソコン通信をし始めた頃はですね、1200baudのモデムでですね、いや、300baudだったかな(以下、昔話が1時間ほど続く)

設定を変えると少しだけ速くなります。

X68000側では、\etc\conf.pppの

set speed 9600

set speed $C

に書き換えます。

RasPi側では、pppdを立ち上げる時の引数を9600→38400にします。

sudo /usr/sbin/pppd /dev/ttyUSB0 38400 local 192.168.17.15:192.168.17.68 noauth

実際、どの程度の速度が出るのか、ftpでの転送後の表示で確認してみました。

bos.pdxを圧縮したbos.lzhファイル(235661Byte)の受信で試してみたのですが、9600bpsでは278秒(0.828KByte/s)だったものが、38400bpsでは115秒(2KByte/s)になります。3倍くらい速くなりそうなものですが、これには別の理由があって、フロッピーディスクへの書き込み速度が足を引っ張っているのです。

試しに、ハードディスクへファイルを保存するようにしてftpで同じファイルを受信してみたところ、69秒(3.58KByte/s)まで短縮されました。

Neptune-XやNereidの転送速度に比べたら遅いのですが(参考:http://ohsatan2012.web.fc2.com/x68/hard/x68nx_diary.html)、入手性の難しい(そして高い)ものよりも、手軽で安価RasPiを使った結果としては充分な速度だと思います。

NFSはどうなの

結論としては動きませんでした。原因はよくわかりません。一応、手順を残しておきます。

RasPiにnfsをインストールします。

sudo apt-get install nfs-common nfs-kernel-server

共有するディレクトリを適当に作成します。

sudo mkdir /share
sudo chmod 777 /share → (ディレクトリの所有権/アクセス権がこれでいいのか不安だけど)

共有設定をします。/etc/exportsファイルに1行通過します。

sudo nano /etc/exports
/share 192.168.17.0/24(rw,sync,all_squash,no_subtree_check)

nfsを有効にします。

sudo update-rc.d rpcbind enable
sudo update-rc.d nfs-common enable
sudo update-rc.d nfs-kernel-server enable

再起動します。

sudo reboot

X68000側でnfs.xを起動します

nfs.x 192.168.17.15:/share

注意点ですが、ppp.xとnfs.xはメモリを大量に消費します。2Mのマシンだとnfs.xを常駐させた段階で空きメモリがほとんどなくなるので何も出来ないです。あと、twentyoneが必要みたいで、これを組み込むと空きメモリは50KByteほどになります。

nfsを組み込むことで、Yドライブとして、RasPiの/shareディレクトリが見えるようになります。ただ、ファイルをコピーしようとすると「システム内部でエラーが発生しました」と出てしまいます。

ファイル自体は作成されるのですが、中身の読み込み&書き込みができなくて、ファイルサイズが0です。削除やリネームはできます。

RasPi側で確認してみるとファイルが出来ているのですが、やはりファイルサイズが0です。ログをみるとread/writeの処理が動いてないみたいです。X68000のメモリが足りないのか、NFSのバージョン違いによるものなのか、設定方法の不備なのかわかりません。

X68000からインターネットにつながらないの?

それに意味があるのかわかりませんが、X68000からインターネットへつないでみたい気持ちはわかります。ただ、今の時代に、telnetやftpするのはお勧めできませんから、VPNで暗号化した経路を使うとか、その辺の事がわからなければ、やらないほうがいいかもしれません。

ここまでの設定では、X68000からのパケットはRasPiまでしか届きません。その先にあるルータ(私の環境では192.168.17.1)にpingしても反応がないのです。RasPi側で、PPP接続されたクライアントからのパケットをフォワードするような設定をすればインターネットにつなげられます。pppの設定はさっぱりわからないので適当にやってみましたが、なんか色々と危うい気がしなくもないです。

Raspi側の設定ですが、pppの設定ファイルが/etc/ppp/optionsにありますから、これを書き換えます。#でコメントアウトされている箇所2つを有効にする(#を消す)だけです。

netmask 255.255.255.0
proxyarp

Linux PPP HOWTOの14.2 どのオプションを指定すべき?では、defaultrouteとIPアドレスの指定も必要なようですが、RasPiに最初から入っているoptionsファイルでは、上記2箇所だけの修正でOKでした。

PPPの設定を変えただけではパケットの転送は出来ないので、次のコマンドを実行します。

sudo sysctl -w net.ipv4.ip_forward=1

※上記のip転送設定はRasPiを再起動すると無効になるので(sudo sysctl -w net.ipv4.ip_forward=0の状態に戻る)、常に有効にするなら、/etc/sysctl.confを適切に書き換えてください。ただ、セキュリティ上、こんな雑な設定だとアウトだと思いますからお勧めしません。

この状態で、X68000側からルータにpingして反応があればRasPi側の設定は成功です。ipアドレス直打ちであれば、X68000からインターネット上のサーバにアクセスできます。

続けてX68000側でDNSを参照するようにします。これにはinetdconf.xが必要で、TCPPACKA.LZHに入っています。

inetdconf +dns 8.8.8.8

GoolgeのDNSを使わせてもらいます。まさかX68000からGoogleのサービスを利用する事になるとは。あと、もしかすると、inetdconf +router 192.168.17.1みたいな設定も必要かもしれませんが、私の環境では不要でした。

これでping www.yahoo.co.jpとか実行してみると、反応があるはずです。

Webサイトの閲覧には、LynxかWebXpressionかVWXが使えますが、今時のサイトを表示するのは無理じゃないかなーと思います。

わからないこと

設定についてのメモ書き

\etc\conf.pppに追加した内容の意味

raspi:
	set debug phase
	disable vjcomp
	...

最初の「raspi:」が、ppp.xを起動する時の引数に該当する。ppp.x raspiを実行すると、\etc\conf.pppに書かれているraspi以降のコマンドが実行されるという仕組み。空行までが実行範囲なので見やすくするために空行を入れないように。

要りそうだけど要らないファイル