Version 7 UNIXとは、DECのPDP-11で動いていたUNIXです。AT&Tベル研究所製の初期のUNIXシリーズの直系のバージョンで、1979年にリリースされました。
V7は現在、フリーソフトウェアとして公開されており、こちらからブートイメージを入手することができます。また、x86への移植活動もあり、VM用のディスクイメージが公開されていたりします。
古いUNIXを触ってみたくなったので、古いハードウェアをシミュレートしてくれるエミュレータ simh を導入して遊んでみることにしました。
下準備
まずは必要なものを揃えます。simh は、dpkg系のパッケージ管理システムを採用しているディストリビューション上で次のようにしてインストールします。
$ sudo aptitude install simh
次に、V7のイメージをダウンロードし、解凍しておきます。
$ mkdir /tmp/v7
$ cd /tmp/v7
$ wget http://ftp.fibranet.cat/UnixArchive/PDP-11/Boot_Images/v7_rl02_1145.gz
$ gunzip v7_r102_1145.gz
$ ls
v7_rl02_1145
$
設定
V7用の設定ファイルを書きます。
$ cat > uv7
set cpu 11/45
set rl0 RL02
att rl0 v7_rl02_1145
set rl1 RL02
att rl1 rl1.dsk
att tm0 tm0.tap
boot rl0
$
4行目の最後のカラムに書いている「v7_r102_1145」は、ダウンロードして解凍したV7のディスクイメージです。
実行
さっそく実行してみます。ホスト側とゲスト側を区別する為、ホスト側には「host$」プロンプトを用います。
host$ pdp11 uv7
PDP-11 simulator V3.8-1
Disabling XQ
Overwrite last track? [N]
@
最後のトラックを上書きするか?と聞かれましたが、とりあえず標準の「N」と答えておきました。この「@」プロンプトの場面はきっとPDP-11の組込みブートローダなんでしょう。ブートします。
@boot
New Boot, known devices are hp ht rk rl rp tm vt
:
ブートデバイスを聞いてきますので、次のように入力します。
rl(0,0)rl2unix
mem = 177856
#
プロンプトが「#」に変更され、シングルユーザモードでV7が使えるようになりました。ここで、C-dをタイプしてマルチユーザモードに移行します。
Restricted rights: Use, duplication, or disclosure
is subject to restrictions stated in your contract with
Western Electric Company, Inc.
Thu Sep 22 05:50:55 EDT 1988
login:
見慣れたログイン画面が登場しました。とりあえずrootでログインします。パスワードは「root」です。
login: root
Password:
You have mail.
#
無事、ログインすることができました。
シェルの使い方
stty
speed 300 baud
erase = ‘#’; kill = ‘@’
even odd -nl echo -tabs
sttyコマンドを実行してみると、古いUNIX入門の本にあるように、訂正は「#」記号、破棄は「@」記号にバインドされているようです。
バックスペースなどはかなり基本的な画面制御文字だと思うんですが、テレタイプ端末も現役で動いていた当時の事情を考えると、ビデオ表示端末のような書き換え可能な表示媒体をもつデバイスにしかできない「バックスペース」ではなく、より多くのデバイスに可能な「#」による訂正の方が都合が良かったんでしょう。
実際にタイプした文字を訂正するには、以下のようにします。
la#s
これは「ls」を間違って「la」とタイプしてしまったので、「#」で直前の1文字を訂正して、正しい「s」をタイプしたところです。「la#s」でシェルには「ls」と解釈されます。また、
pqd##wd
「pwd」を「pqd」とタイポした場合、「##」で2文字訂正して、正しい「wd」をタイプすることにより、「pwd」と解釈されています。
現在の入力を全て破棄するには、
asdf@
のように、「@」記号を用いれば破棄されて新しいプロンプトに移ります。
終了
haltもshutdownコマンドも入っていない為、simh側から終了させます。ファイルシステムに変更を加えた場合、デバイスとの同期をとるためにsyncコマンドを打ちます。
sync;sync;sync
# 次に、C-eをタイプしてsimhのコンソールに移行します。
Simulation stopped, PC: 002306 (MOV (SP)+,177776)
sim> exit
Goodbye
host$
ここで、「exit」とタイプすると終了することができます。
man pageを見れるようにする
初期状態では/tmpが存在しない為、manページを表示しようとすると次のように怒られます。
man sh
Cannot create temp file.
そこで、/tmpを作成しておきましょう。
mkdir /tmp
chmod 777 /tmp
man sh
これでmanページが見れるようになりますが、ページャが入っていません。やはりビデオ表示端末向けのツールは、まだ充実していないようですね。
ユーザの追加
初期状態では、ユーザ情報は次のとおりになっています。
cat /etc/passwd
root:VwL97VCAx1Qhs:0:1::/:
daemon:x:1:1::/:
sys::2:2::/usr/sys:
bin::3:3::/bin:
uucp::4:4::/usr/lib/uucp:/usr/lib/uucico
dmr::7:3::/usr/dmr:
シャドウ・パスワードが登場する前なので、/etc/passwdに素直に(ハッシュ化された)パスワードが記載されていますね。7行目の「dmr」というユーザ名は、先日逝去されたUNIXの開発者デニス・リッチー博士の愛称です。実際に運用されていた頃からデフォルトで入っていたのかもしれませんが、そうでなくとも、フリーソフトとして公開される際に、彼に敬意を称して追加されたのかもしれません。
`echo dyama::8:3::/usr/dyama: >> /etc/passwd`
畏れ大くも、dmr博士の次にアカウントを追加してみました。さらにホームディレクトリも設定します。
cd /usr
mkdir dyama
chown dyama dyama
ls -l
total 11
drwxrwxr-x 3 bin 128 Sep 22 05:45 dict
drwxrwxr-x 2 dyama 32 Sep 22 06:18 dyama
drwxrwxr-x 5 bin 416 Sep 22 05:46 games
drwxrwxr-x 3 sys 496 Sep 22 05:42 include
drwxrwxr-x10 bin 528 Sep 22 05:43 lib
drwxrwxr-x11 bin 176 Sep 22 05:45 man
drwxrwxr-x 3 bin 208 Sep 22 05:46 mdec
drwxrwxr-x 2 bin 80 Sep 22 05:46 pub
drwxrwxr-x 6 root 96 Sep 22 05:45 spool
drwxrwxr-x13 root 208 Sep 22 05:42 src
#
当時のファイルシステム階層では、ユーザのホームディレクトリは/homeではなく、名前のとおり/usrに格納されていたと古い本で読みました。慣例に習って設置しました。
一度、C-dをタイプしてログアウトします。
#
login: dyama
$
「login:」と出てきたので、先ほど追加したユーザ名「dyama」をタイプします。パスワードを設定していない為、聞かれることなく一般ユーザプロンプト「$」が表示されました。
エミュレータ上のアカウントなのでこのままでもいいんですが、とりあえずパスワードを設定します。
$ passwd
Changing password for dyama
New password:
Retype new password:`
これでパスワードが変更されたはずです。試しに「hogehoge」と入力しています。
$ su
Password:
cat /etc/passwd | grep dyama
dyama:7N.C0KCSdg3aI:8:3::/usr/dyama:
#
パスワードカラムに、ハッシュ化されたパスワード文字列が追加されたことが分かります。
Cプログラムを書いてみる
ccが入っていますので、C言語でプログラムを組むこともできます。ビジュアル・エディターが入っていない為、catコマンドで標準入力からダイレクトにファイルを書いていきたいと思います。
先に述べましたとおり「#」記号が訂正にバインドされているので、まずは#を正しく入力できるように設定を変更してあげます。
$ stty erase ?
$ stty
speed 300 baud
erase = ‘?’; kill = ‘@’
even odd -nl echo -tabs
$
sttyコマンドで訂正を「#」から「?」に変更しました。続いてコーディングです。
$ cat > test.c
#include
int main()
{
printf(“hello, world\n”);
return 0;
}
$ cat test.c
#include
int main()
{
printf(“hello, world\n”);
return 0;
}
[/bash]
コーディングができたら、catで確認してみてください。訂正が「?」になっていれば、プリプロセッサの「#include」は正しく入力できているはずです。
$ stty erase #
$ stty
speed 300 baud
erase = ‘#’; kill = ‘@’
even odd -nl echo -tabs
忘れないうちに訂正を「#」に戻しておきます。
あとは、ccコマンドでコンパイルを行なって出力されたファイルを実行します。
$ cc test.c
$ ls
a.out
test.c
$ ./a.out
hello, world
$
上記のように「hello, world」が表示されたら成功です。