忍者ブログ
PCメモ
PC関係のメモ、気付いたこと。 simhとChromium OSをいじって遊んでいます。 Chromium OSのカスタムビルドを配布しています。(http://chromiumosde.gozaru.jp) twitter: @zui22904336 PGP fingerprint: 45FC 0E47 A68A FA06 02FE 2BEF B72C C6E6 F9FF 1C19
Admin / Write
2014/02/22 (Sat) 17:13

前々回前回とsimhのPDP-11エミュレータを使ってUNIX V7をインストールしました。
今回はこのUNIX V7に別のマシンからtelnetでログインできるようにしてみます。

前々回インストールしたSoftware KitのUNIX7と前回のインストールテープから入れたものとでは構成が結構違っています。今回はSoftware Kitから入れたほうを使って作業します。


カーネルソースのダウンロード


  外部からtelnetできるようにするためには、通信用のデバイスが必要ですが、今のままでは使えません。使えるようにするためにはカーネルの再構築を行う必要があります。

ただ、カーネルの再構築には当然カーネルソースが必要ですが、Software KitのUNIX V7にはカーネルソースが入っていません(テープイメージから入れたほうには最初からソースが入っています)。そのため、まずソースをダウンロードしてくる必要があります。

 ソースファイルを含めたUNIX V7の全ファイルは以下のコマンドでダウンロードします。作成されるディレクトリ階層が深いので上に持ってきます。

linux$ wget -r -np -nH ftp://ftp.ics.es.osaka-u.ac.jp/pub/mirrors/UnixArchive/PDP-11/Trees/V7/
linux$ mv pub/mirror/UnixArchive/PDP-1/Trees/V7/ .
linux$ cd V7

UNIX V7のソースはいくつかの場所で公開されていますが、Software KitのUNIX V7は磁気ディスクにRL02を使っているため、/usr/sys/confの下にrltmconfというファイルがあるものを用意する必要があります。このrltmconfがないソースアーカイブが多いので注意が必要です。

ソースへのパッチ


今回はDZ11 Terminal Multiplexerというというデバイスを有効にします。ただ、そのためには一部のソースにパッチを当てます。具体的には、カーネル再構築の設定を行う/usr/sys/conf/mkconfでデバイスdzを扱えるようにします。以下にその内容を示します。

45a46
> 	"dz",
248a250,259
>         "dz",
>         0, 300, CHAR+INTR,
> 	"	dzin; br5+%d.\n	dzou; br5+%d.",
>         ".globl _dzrint\ndzin:  jsr     r0,call; jmp _dzrint\n",
> 	".globl	_dzxint\ndzou:	jsr	r0,call; jmp _dzxint\n",
> 	"",
>         "       dzopen, dzclose, dzread, dzwrite, dzioctl, nulldev, dz_tty,",
> 	"",
>         "int    dzopen(), dzclose(), dzread(), dzwrite(), dzioctl();\nstruct	tty	dz_tty[];",
> 


このパッチの元ネタは以下のサイトで公開されているものです。

http://www.ljosa.com/~ljosa/v7-dz11

ただ、このサイトのパッチは前回使ったテープイメージ(Keith_Bostic_v7)のソース用に作られており、今回使うソースとはちょっと行番号がずれているので手直ししています。
このパッチをmkconf.c.diffという名前で保存しておきます。

続いて、ダウンロードしたソースファイルにこのパッチを当てます。

linux$ cp ./usr/sys/conf/mkconf.c ./usr/sys/conf/mkconf.c.org
linux$ patch ./usr/sys/conf/mkconf.c < mkconf.c.diff 
patching file ./usr/sys/conf/mkconf.c
linux$

カーネルソースをテープイメージに格納する


パッチを当てたら、カーネルソースが置かれている./usr/sysの内容をtarで固めて、simhのテープイメージに変換します。テープイメージの作成には前回の記事で使ったtapewriteコマンドを使います。

linux$ (cd ./usr/sys; tar --format=v7 -cf - .) | tapewrite > src.tap


作成したテープイメージsrc.tapはUNIX V7の実行環境があるディレクトリにコピーしておきます。


UNIX V7の起動とソースイメージのコピー



テープイメージがができたので、このテープの内容をUNIX V7に持っていきます。
そのため、起動用の設定ファイルを少し書き換えます。新しい設定ファイルの内容は以下の通りです。

linux$ cat boot.ini
set cpu 11/45
set cpu 256k
set rl0 RL02
att rl0 unix_v7_rl.dsk
set rl1 RL02
att rl1 rl1.dsk
att tm0 src.tap
boot rl0


追加したのは磁気ディスクrl1と磁気テープtm0の定義です。rl1は読み込むソースの展開先として使います。tm0はさっき作ったカーネルソースのテープイメージを読み込むために使います。

では、この 設定でUNIX V7を起動していきます。

linux$ pdp11 boot.ini

PDP-11 simulator V3.9-0
Disabling XQ
RL: creating new file
Overwrite last track? [N]   ← ディスクを追加したので聞いてきます。そのままEnter
@boot
New Boot, known devices are hp ht rk rl rp tm vt 
: rl(0,0)unix
mem = 177856
# (Ctrl-D)

Restricted rights: Use, duplication, or disclosure
is subject to restrictions stated in your contract with
Western Electric Company, Inc.
Thu Sep 22 17:55:15 EDT 1988

login: root
Password:
You have mail.
# 


では追加したrl1にファイルシステムを作ってマウントし、テープイメージを読み込みます。

# mkdir /mnt
# /etc/mkfs /dev/rl1 5000   ←値は適当
size = 1600
m/n = 3 500
# /etc/mount /dev/rl1 /mnt
# cd /mnt
# mkdir usr
# cd usr/
# mkdir sys
# cd sys
# tar xvf /dev/mt0


これで/mnt/usr/sysの下にカーネルソースができました。


カーネル再構築


続けて、デバイスdzが使えるようにカーネル再構築の設定を行います。まず、カーネル再構築用のツールであるmkconfをさっきパッチを当てたソースで再コンパイルします。

# cd /mnt/usr/sys/conf
# mv mkconf mkconf.org
# cc mkconf.c -o mkconf

続いてデバイスdzを組み込むための設定ファイルを作ります。もともとある設定ファイルrltmunixにデバイスdzを追加します。

# cat > unixconf
dz
(Ctrl-d)
# cat rltmconf >> unixconf
# cat unixconf
dz
rl
tm
root rl 0
swap rl 0
swplo 18000
nswap 2480


設定ファイルにdzが入ったので、この設定ファイルを使ってカーネルを再構築します。

# mkconf < unixconf
# make

日付をきちんと設定していないので、すでにunixがあるというエラーが出るかもしれません。そのときはunixと.oファイルを消して再度makeします。 これで、/mnt/usr/sys/conf/unixにビルドした新しいカーネルができます。
このカーネルなら外部からの接続を受け付けられますが、まだ少し準備が必要です。

デバイスファイルの作成


まず/dev配下に外部端末用のttyファイルを作ります。その前に、c.cファイルの中にdzのメジャー番号が書かれているのでまずそれを調べます。

# cd /mnt/usr/sys/conf
# cat c.c
略
       dzopen, dzclose, dzread, dzwrite, dzioctl, nulldev, dz_tty,      /* dz = 19 */


この例ではdzのメジャー番号は19です。この行にはdzopen、dzcloseなどの名前が書かれていますが、再構築する前のc.cではこの行がすべてnodevになっています。
メジャー番号がわかったのでデバイスファイルを作ります。とりあえず今回は3つ作っておきます。

# cd /dev
# /etc/mknod tty00 c 19 0
# /etc/mknod tty01 c 19 1
# /etc/mknod tty02 c 19 2
#


続いて/etc/ttysファイルを編集して、今作ったデバイスを有効にします。/etc/ttysのtty0?の行はいずれも00で始まっていますが、これを12で始まるように書き換えます。

# cat /etc/ttys
14console
00tty00
00tty01
00tty02
00tty03
00tty04
00tty05
00tty06
略
# ed /etc/ttys
266
2,4s/00/12/
w
266
q
# cat /etc/ttys
14console
12tty00
12tty01
12tty02
00tty03
00tty04
00tty05
00tty06
略


最初は"10tty??"にしていましたが、これだと外部からつないだときのレスポンスがかなり悪くなります。いろいろ対策を探していたのですが、2ケタ目が0だと端末との通信速度が300~1200ボーとして扱われるということがわかりました。ここを2にすることで9600ボーの端末として扱われ、レスポンスが劇的に改善しました。

では、カーネルを置き換えていったん終わらせます。

# cd /
# mv unix unix.org
# cp /mnt/usr/sys/conf/unix .
# sync;sync;sync
# 
Simulation stopped, PC: 002306 (MOV (SP)+,177776)
sim> q
Goodbye
linux$ 


起動時にdzを有効にするために、simhの設定ファイルを書き換えます。

linux$ cat boot.ini
set cpu 11/45
set cpu 256k
set rl0 RL02
att rl0 unix_v7_rl.dsk
set rl1 RL02
att rl1 rl1.dsk
set dz 7b lines=32   ← 追加
att dz -am 4096  ← 追加:ポート4096で待ち受ける
boot rl0

待ち受け用ポート番号は環境に応じて適当に指定します。待ち受けポートはiptablesの設定で外部からの接続を受け付けるようにしておく必要があります。では、この設定を使ってbootします。

linux$ pdp11 boot.ini

PDP-11 simulator V3.9-0
Disabling XQ
Listening on port 4096 (socket 6)  ← この行が出ることを確認する
Modem control activated
Auto disconnect activated
@boot
New Boot, known devices are hp ht rk rl rp tm vt 
: rl(0,0)unix
mem = 175808
# Restricted rights: Use, duplication, or disclosure
is subject to restrictions stated in your contract with
Western Electric Company, Inc.
Thu Sep 22 19:54:23 EDT 1988

login: root
Password:
You have mail.
#

無事にブートしたので、別のマシンから接続してみます。今回はWindowsマシンのTeraTermからtelnetでlinuxマシンのポート4096につないでみます。
無事につながりました。

 
今回はここまで。

[関連記事]



ランキングに参加してみました。クリックしていただければ嬉しいです。

にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

パソコン ブログランキングへ

拍手[0回]

PR


2014/02/22 (Sat) 00:59
前回はsimhのページからダウンロードできるSoftware Kitを使ってPDP-11エミュレータにUNIX V7をインストールしましたが、実際にはインストールしたというよりは、インストール済みディスクを持ってきてつないだ、というのが正解かな、という感じです。

せっかくならWindowsのインストールCDから入れるのと同じようにインストールメディアから入れてみよう、ということで、今回はインストールテープイメージからのUNIX V7インストールに挑戦します。

PDF形式のUNIX V7のマニュアルが、開発元であるベル研究所のページからダウンロードできます。

http://plan9.bell-labs.com/7thEdMan/bswv7.html

マニュアルは3つに分かれていますが、セットアップの手順はこのうちのv7vol2b.pdfに書かれています。「Setting Up Unix」という章です。とりあえずここに書かれている手順で作業していきます。

テープイメージのダウンロード


UNIX V7のテープイメージはThe Unix Heritage SocietyのUnix Archiveからダウンロードできます。日本のミラーサイトのURLは以下の通りです。

ftp://ftp.ics.es.osaka-u.ac.jp/pub/mirrors/UnixArchive/PDP-11/Distributions/research/Keith_Bostic_v7/

ここにあるf0.gz~f6.gzの7つのファイルとfilelist、すべてをどこか適当な場所にダウンロードします。

テープイメージをsimhの形式に変換する。


ダウンロードしたテープイメージのファイルですが、そのままでは使えません。simhで読み込める形に変換する必要があります。
ただ、この変換に必要なツールはsimhには含まれておらず、いろいろな方がばらばらに作っているみたいです。

今回は こちらのブログで公開されていたものをお借りしたいと思います。こちらのツールは、テープイメージに含めるファイルのブロックサイズを個別に指定でき、しかもgzファイルをそのまま読み込めるのでとても便利です。

公開されている2つのソース、tapewrite.cとmaketapeを自分のマシンにおいて、tapewrite.cはコンパイルします。maketapeには実行権を付けます。
linux$ cc -o tapewrite tapewrite.c
linux$ chmod a+x maketape

つづけて、maketape用の設定ファイルを作ります。設定ファイル の内容は以下の通りです。
linux$ vi tape-unixv7.conf
f0.gz	512
f1.gz	512
f2.gz	512
f3.gz	512
f4.gz	512
f5.gz	10240
f6.gz	10240
linux$

各行の左はテープイメージに書き込むファイル名、右側はブロックサイズです。このブロックサイズの情報は一緒にダウンロードしたfilelistに書かれています。
ファイルができたら以下のようにしてテープイメージファイルを作ります。
linux$ ./maketape tape-unixv7.conf unixv7.tap
f0.gz bsize=512
f1.gz bsize=512
f2.gz bsize=512
f3.gz bsize=512
f4.gz bsize=512
f5.gz bsize=10240
f6.gz bsize=10240
linux$

これでunixv7.tapという名前のファイルができていればOKです。このテープイメージを使ってインストールを行います。

インストール


準備が整ったので、pdp11エミュレータを起動します。Setting Up Unixを見ると最初の起動時にマシン語のプログラムを打ち込む必要があるようなので、設定と一緒にあらかじめファイルに書いておきます。
linux$ vi install.ini
set cpu 11/45
set rp0 RP04   ← 磁気ディスクの種類の設定
att rp0 rp04-0.dsk ← 仮想磁気ディスクファイルの名前
att tm0 unixv7.tap ← インストールテープの割り当て
d cpu 100000 012700
d cpu 100002 172526
d cpu 100004 010040
d cpu 100006 012740
d cpu 100010 060003
d cpu 100012 000777
e cpu 100000-100013


前回Software Kitでインストールしたときは磁気ディスクの種類としてRL02を指定しましたが、今回インストールするテープにはRL02用のカーネルやブートストラップが含まれていませんので、このテープで利用可能なRP04を指定します。

ディスクの内容はこれからのインストールで作成していきますので、仮想磁気ディスクファイルには存在しない適当な名前を指定すればOKです。

準備が整ったら起動します。

linux$ pdp11 install.ini

PDP-11 simulator V3.9-0
Disabling XQ
RP: creating new file
Overwrite last track? [N]   ← そのままEnter
100000:	012700
100002:	172526
100004:	010040
100006:	012740
100010:	060003
100012:	000777
sim> 

simhのプロンプトが出たら、プログラムを100000番地から実行します。必要な処理をしてCPUループになるので、数秒待ってCtrl-Eで止め、今度は0番地から実行します。
sim> run 100000
(数秒待ってからCtrl-E)
Simulation stopped, PC: 100012 (BR 100012)
sim> run 0
Boot
:
: が出力されたらテープからブートします。この工程で磁気ディスクに空のファイルシステムを作ります。2つほど聞かれるので、マニュアルの通りに入力していきます。
: tm(0,3)
file sys size: 5000
file system: hp(0,0) ← ここはrpではなくhp
isize = 1600
m/n = 3 500
Exit called
Boot
: 
磁気ディスクのRP04はsimhのプロンプトではrpですが、ここでの指定はhpとなるようです。
また:が出るので、再びテープから起動します。今度は今作った空のファイルシステム上にUNIXのルートファイルシステムをリストアします。
: tm(0,4)
Tape? tm(0,5) ← ルートファイルイメージが格納されているテープ上のファイル(f5.gz)
Disk? hp(0,0)  ←リストア先の磁気ディスク
Last chance before scribbling on disk.  ← ここは単にEnterを入力
End of tape
Boot
: 

マニュアルには数分かかるとありますが、数秒で終わってしまいます。この辺は最新のハードディスクと大昔のテープの差でしょうか。
これで磁気ディスク上にルートファイルシステムができました。このルートファイルシステム上のカーネルを使って起動を行います。
: hp(0,0)hptmunix
mem = 177344
# 

無事、シングルユーザモードで起動しました。引き続き、マニュアルの記述に従って、カーネルのリネームおよびスペシャルファイルの作成を行います。前回つかったSoftware Kitのものと異なり、こちらのUNIX V7はシングルユーザモードでの入力が全部大文字になります。
# PWD
/
# MV HPTMUNIX UNIX
# CD /DEV
# MAKE RP04
/ETC/MKNOD RP0 B 6 0
/ETC/MKNOD SWAP B 6 1
/ETC/MKNOD RP3 B 6 6
/ETC/MKNOD RRP0 C 14 0
/ETC/MKNOD RRP3 C 14 6
CHMOD GO-W RP0 SWAP RP3 RRP0 RRP3
# MAKE TM
/ETC/MKNOD MT0 B 3 0
/ETC/MKNOD RMT0 C 12 0
/ETC/MKNOD NRMT0 C 12 128
CHMOD GO+W MT0 RMT0 NRMT0
# 

Software Kitの時と異なり、ここで/dev/swapも自動で作られます。続けて、/usr用のファイルシステムを作り、データをリストアします。
# /ETC/MKFS /DEV/RP3 153406
ISIZE = 49088
M/N = 3 500
# DD IF=/DEV/NRMT0 OF=/DEV/NULL BS=20B FILES=6
202+80 RECORDS IN
202+75 RECORDS OUT
# RESTOR RF /DEV/RMT0 /DEV/RP3
LAST CHANCE BEFORE SCRIBBLING ON /DEV/RP3.  ← Enterを入力
END OF TAPE
# 

作成したファイルシステムを/usrにマウントして中身を確認します。
# /ETC/MOUNT /DEV/RP3 /USR
# LS /USR
DICT
DMR
DOC
GAMES
INCLUDE
LIB
MAN
MDEC
PUB
SPOOL
SRC
SYS
TMP
# 


最後の仕上げとして、ブートストラップブロックを磁気ディスクの先頭に書き込みます。
# DD IF=/USR/MDEC/HPUBOOT OF=/DEV/RP0 COUNT=1
0+1 RECORDS IN
0+1 RECORDS OUT
# 

これで一通り作業は終わりました。Ctrl-dを押してシングルユーザモードを抜けます。
# (Ctrl-d)
RESTRICTED RIGHTS: USE, DUPLICATION, OR DISCLOSURE
IS SUBJECT TO RESTRICTIONS STATED IN YOUR CONTRACT WITH
WESTERN ELECTRIC COMPANY, INC.
WED DEC 31 19:26:01 EST 1969

login: root
Password:      ← ここもroot
You have mail.
# 

マルチユーザモードでログインできたことを確認したらいったん終わらせます。
# sync
# sync
# sync
# (Ctrl-E)
Simulation stopped, PC: 002306 (MOV (SP)+,177776)
sim> q
Goodbye
linux$
これで一通りインストール作業は終わりました。
では、ちゃんとインストールできたかどうか確認します。今インストールした磁気ディスクから起動してみます。起動用の設定ファイルは以下のようになります。

linux$ cat UV7.ini 
set cpu 11/45
set cpu 256k
set rp0 RP04
att rp0 rp04-0.dsk
boot rp0

linux$ pdp11 UV7.ini  ← 起動

PDP-11 simulator V3.9-0
Disabling XQ
boot     ← プロンプトは何も出ませんが、ここでbootと入力
Boot
: hp(0,0)unix
mem = 177344
# (Ctrl-d)
RESTRICTED RIGHTS: USE, DUPLICATION, OR DISCLOSURE
IS SUBJECT TO RESTRICTIONS STATED IN YOUR CONTRACT WITH
WESTERN ELECTRIC COMPANY, INC.
WED DEC 31 19:26:34 EST 1969

login: root
Password:
You have mail.
# 

Software Kitでインストールしたときは、最初の"boot"と打ち込むところでプロンプトとして"@"が出るのですが、こちらでは何も出ません。ちょっとびっくりしますが気にせずbootと打ち込めば、あとはSoftware Kitの時と同じように起動できました。

今回はここまで。

[関連記事]



ランキングに参加してみました。クリックしていただければ嬉しいです。
にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

パソコン ブログランキングへ

拍手[0回]



2014/02/19 (Wed) 22:27
今回は前回インストールしたsimhを使って、Version 7 UNIX(以降UNIX V7)をインストールしてみます。

UNIX V7は現在ではフリーソフトになっているようで、だれでも自由に入手できます。

今回はSimhのサイトで公開されているSoftware Kitを使ってみます。これはインストール済みの仮想ディスクイメージなので、ダウンロードすればすぐ使えます。

ダウンロードURLは

http://simh.trailing-edge.com/kits/uv7swre.zip

です。ダウンロードしたら適当な場所に展開します。

linux$ unzip uv7swre.zip
linux$ ls
AncientUnix.pdf  README.txt  unix_v7_rl.dsk


このunix_v7_rl.dskがインストール済みの仮想磁気ディスクイメージですので、これを使って起動します。simhのpdp11エミュレータを起動して以下のように入力していきます。
linux$ pdp11

PDP-11 simulator V3.9-0
sim> set cpu 11/45  ← CPUの種類の指定
Disabling XQ
sim> set cpu 256k   ← CPUメモリサイズの指定
sim> set rl0 RL02   ← 装置名rl0の種類をRL02にする(RLはカートリッジ磁気ディスク)
sim> att rl0 unix_v7_rl.dsk ← 装置名rl0に仮想ディスクファイルunix_v7_rl.dskを割り当てる
sim> boot rl0     ← 装置名rl0からブートする
@

ここで打ち込むset, attなどのコマンドおよびrl0などのパラメータの説明は、
http://simh.trailing-edge.com/pdf/pdp11_doc.pdf
に書いてあります。

@が表示されたら、bootと入力します。
@boot
New Boot, known devices are hp ht rk rl rp tm vt 
:

: が表示されたら、ブートするカーネルの指定を行います。以下のように指定します。
: rl(0,0)rl2unix
mem = 177856
#

#のプロンプトはシングルユーザモードでUNIXが起動したことを表します。 ここで、磁気ディスクと磁気テープのデバイスファイルを作っておきます。
# cd /dev
# make rl
/etc/mknod rl0  b 8 0
/etc/mknod rl1  b 8 1
/etc/mknod rrl0 c 18 0
/etc/mknod rrl1 c 18 1
chmod go-rw rl0 rl1 rrl0 rrl1
# make tm
/etc/mknod mt0 b 3 0
/etc/mknod rmt0 c 12 0
/etc/mknod nrmt0 c 12 128
chmod go+w mt0 rmt0 nrmt0

/tmpがないので作っておきます。ないとmanコマンドがエラーになるようです。
# mkdir /tmp

さらにswapデバイスを作成し、カーネルを"unix"という名前でコピーします。これはpsコマンドを動かすのに必要なんだそうです。この作業は最初は抜けていました。ほかにも抜けていることがあるかもしれません。
# /etc/mknod swap b 8 0
# cp /rl2unix /unix
# (Ctrl-dを入力)

Ctrl-dを押すとシングルユーザモードが終わってマルチユーザモードに移行します。 ここでおなじみのloginプロンプトが出ますので、ユーザ名、パスワードともにrootでログインします。
Restricted rights: Use, duplication, or disclosure
is subject to restrictions stated in your contract with
Western Electric Company, Inc.
Thu Sep 22 05:49:30 EDT 1988

login: root
Password:
You have mail.
# 

これでめでたくUNIX V7が起動できました。

終了ですが、UNIX V7にはshutdownコマンドがありませんので以下のようにします。

# sync
# sync
# sync
# (Ctrl-E)← エミュレータを停止する
Simulation stopped, PC: 002306 (MOV (SP)+,177776)
sim> q  ← エミュレータを終了する
Goodbye
linux$ 

今回は起動時のエミュレータの設定を手動で打ち込みましたが、あらかじめ以下のようなファイルを作っておくと、次回以降、設定内容をpdp11エミュレータに自動で読み込ませることができます。
linux$ vi boot.ini

set cpu 11/45
set cpu 256k
set rl0 RL02
att rl0 unix_v7_rl.dsk
boot rl0

linux$ pdp11 boot.ini

PDP-11 simulator V3.9-0
Disabling XQ
@ ← ここでbootと打ち込むところから
New Boot, known devices are hp ht rk rl rp tm vt 
: rl(0,0)unix

カーネルをunixという名前でコピーしたので、2回目以降は上のようにrl(0,0)unixで起動できるようになります。 2回目以降はシングルユーザモードでは特にやることはありませんので、#が表示されたらすぐにCtrl-dを押してマルチユーザモードに移行すればOKです。
今回はここまで。
 
[関連記事]


ランキングに参加してみました。クリックしていただければ嬉しいです。
にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

パソコン ブログランキングへ

拍手[0回]



  HOME
プロフィール
HN:
zui
性別:
非公開
PR
忍者カウンター
忍者ブログ [PR]