UNIX V7を仮想マシン上で動かす手法のまとめ

# 概要
UNIX V7(Version 7 Unix, Seventh Edition Unix)とは、UNIXオペレーティングシステムにおける、初期の重要なリリースである。
Bourne Shellを始めとし、make, lint, awk, chroot, mallocなど、現代でも用いられる多くの重要なコマンド・機能が、V7で実装された。
そのため、UNIXの歴史上でも、非常に大きな意味を持つOSである。

AT&T社がライセンスを保有していたため、UNIX V7は本来はフリーソフトウェアではない。
だが、2002年にCaldera International社(現:SCO Group)によって、BSD Licenseの元で公開された。([参考1](http://qiita.com/gin_135/items/e16656a8fc461fd488ff#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE))
現在では、Web上で無償にて入手可能である。

UNIX V7は、本来PDP-11上で動作するOSであり、現代のコンピュータではシミュレータ等を用いなければ動かすことはできない。
しかし、Robert Nordier氏によって、x86への移植がおこなわれた。([参考2](http://qiita.com/gin_135/items/e16656a8fc461fd488ff#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE))
<br>

本記事では、Robert氏の成果物であるx86版の仮想マシンイメージを用いて、UNIX V7を仮想マシン上で動かす手法を述べる。


# 実行環境
今回は、x86仮想化ソフトウェアとして、VirtualBoxを用いる。

- Arch Linux(x86_64, 4.3.3-2-ARCH)
- VirtualBox(5.0.12)


# 作業手順
作業は、以下の手順でおこなう。

1. x86版仮想マシンイメージの準備
2. 仮想マシンの作成
3. UNIX V7の起動
4. UNIX V7の終了

- - -

### 1. x86版仮想マシンイメージの準備
まず、UNIV V7のx86版仮想マシンイメージを入手する。

仮想マシンのイメージは、Robert氏のWebサイト上で公開されている。
以下のURLからダウンロードページへアクセスし、ダウンロードすれば良い。
"V7/x86 Virtual Machine | Robert Nordier" [http://www.nordier.com/v7x86/vm.html](http://www.nordier.com/v7x86/vm.html)

以下、シェル上での操作である。

```sh
$ wget http://www.nordier.com/v7x86/releases/v7x86-0.8a-vm.zip
```

次に、ダウンロードしたファイルを展開する。
展開場所は、任意のディレクトリで良い。
ただし、アーカイブに含まれている"hd0.img"と"v7x86.vmdk"の2つのファイルは、同一のディレクトリに入れるようにする。

以下、シェル上での操作である。

```sh
$ unzip v7x86-0.8a-vm.zip
$ ls v7x86-0.8a-vm
README.txt
bochsrc
hd0.img
v7x86.vmdk
v7x86.vmx
v7x86intro.pdf
```

以上で、x86版仮想マシンイメージの準備は完了である。



### 2. 仮想マシンの作成・設定
次に、VirtualBoxにて、仮想マシンの作成と設定を進める。


VirtualBoxには、"vboxmanage"というCLI向け管理コマンドが用意されているため、それを用いて作成と設定を進める。
以下のコマンドを入力して、作成・設定をおこなう。
(VMの名称として用いている"UNIX_V7"は、任意のものに変更しても良い。変更した場合は、"UNIX_V7"を変更した名称に置き換えて実行すること。)

```sh
$ vboxmanage createvm --name "UNIX_V7" --ostype "Other" --register
Virtual machine 'UNIX_V7' is created and registered.
UUID: ************************************
Settings file: '/hoge/piyo/UNIX_V7.vbox'
$ vboxmanage modifyvm UNIX_V7 --memory 16
$ vboxmanage storagectl UNIX_V7 --name IDE --add ide
$ vboxmanage storageattach UNIX_V7 --storagectl IDE --device 0 --port 0 --type hdd --medium /path/to/v7x86-0.8a-vm/v7x86.vmdk
```

以上で、仮想マシンの作成・設定は完了である。

<!---
(本節では、写真を用いて解説をおこなう。)

始めに、各環境に準じた方法で、VirtualBoxを起動する。

2番目の作業として、仮想マシンの作成をおこなう。
<写真1>
今回は、V7用の仮想マシンを、新規に作成する。
VirtualBoxウィンドウ内の左上にある、"新規"ボタンをクリックすれば良い。
"新規"ボタンをクリックすると、作成する仮想マシンの詳細な設定をおこなうウィンドウが表示される。

3番目の作業として、作成する仮想マシンの名前とOSの種類の設定をおこなう。
<写真2>
この設定は、"新規"ボタンをクリックした際に表示されるウィンドウ上で進める。
名前は、好きなものを付けて良い。ここでは"UNIX_V7"とする。
OSの種類は、"タイプ:Other"、"バージョン:Other/Unknown"にする。
命名とOS種類の設定が完了したら、次の設定事項へ進む。

4番目の作業として、割り当てるメモリサイズの設定をおこなう。
<写真3>
V7が要求するメモリは、現代の贅沢なメモリでは非常に少ないため、割り当てるメモリサイズは特に変更する必要は無い。
ここでは、デフォルト値の64MBのままとする。
メモリサイズの設定が完了したら、次の設定事項へ進む。

5番目の作業として、仮想マシンディスクの設定をおこなう。
<写真4>
今回は、仮想マシンディスクとして、Robert氏が作成したディスクイメージを用いる。
まず、ダウンロードしたイメージを使用するために、"すでにある仮想ハードディスクファイルを使用する"をチェックする。
次に、イメージを選択するために、"すでにある仮想ハードディスクファイルを使用する"の右側にあるディレクトリマークをクリックする。
<写真5>

--->


### 3. UNIX V7の起動
そして、UNIX V7を起動する方法を述べる。

以下のコマンドを入力し、仮想マシンのUNIX V7を起動させる。

```sh
$ vboxmanage start UNIX_V7
```

UNIX V7が起動したら、以下の画面が表示される。
![01_start.png](https://qiita-image-store.s3.amazonaws.com/0/102349/63e9a809-4dcb-3c39-e97a-5c523d65494e.png)

ここで何も文字を入力せず、Enterキーのみを入力すれば、自動的にrootユーザとしてログインする。
![02_login.png](https://qiita-image-store.s3.amazonaws.com/0/102349/a21fc36f-c2f7-213e-a8c2-9e88c643b1c4.png)

この仮想マシンでは、一般ユーザとしてguestアカウントが用意されている。
guestとしてログインするには、一旦ログアウトする必要がある。
ログアウトするには、単純に端末上にてCTRL-Dを入力すれば良い。
CTRL-Dを入力後、ログインプロンプトへ移行する。
![03_logout.png](https://qiita-image-store.s3.amazonaws.com/0/102349/bdf57e39-7be5-1c4a-7088-0a0e3d835169.png)

なお、この仮想マシンにおけるrootの初期パスワードは"password"、guestの初期パスワードは""(無し)である。


以上で、UNIX V7の起動は完了である。
以降、自由に作業を進めることができる。

### 4. UNIX V7の終了
最後に、UNIX V7を終了させる方法を述べる。

UNIX V7では、コマンドプロンプトからOSを終了させる方法は存在しない。
よって、killコマンドによって、kill自身とinitを除いた全プロセスを終了させた後、仮想マシン自体を終了させる。

まず、仮想マシンのV7上でrootとしてログインし、以下のコマンドを入力する。
(UNIX V7上での入力)

```
# kill -1 1
# sync; sync
```

上記のコマンドを実行した後に、ホストマシン側で仮想マシンを終了させる。
ホストマシンでは、以下のコマンドを入力する。
(ホストマシンでの入力)

```sh
$ vboxmanage controlvm UNIX_V7 poweroff
```


以上で、UNIX V7の終了、および作業は全て完了である。


# 注意点
- rootアカウントでは、Backspaceによる1文字削除が出来ない。
    * UNIX V7では、端末上で1文字削除をする制御文字は、'#'に設定されている。([参考3](http://qiita.com/gin_135/items/e16656a8fc461fd488ff#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE))
    * そのため、入力を1文字削除したい場合は、'#'を入力する。
![04_backspace.png](https://qiita-image-store.s3.amazonaws.com/0/102349/0123c97b-f770-de87-8c26-10991a6a7e00.png)
    * 1文字削除をBackspaceに設定したい場合は、以下のコマンドを入力すれば良い。

    ```sh
    $ stty erase '^H'
    ```
    * なお、guestアカウントでは、Robert氏の作業により、上記の設定が初めから完了している。
- head, lessコマンドは存在しない。
- emacsは存在しない。
    * エディタは、edかviを使う。


# 参考にしたもの
1. UNIX is free! 〈[http://www.lemis.com/grog/UNIX/](http://www.lemis.com/grog/UNIX/)〉
    - UNIX V7のオリジナルのブートイメージの入手はこちらから。 >>  
    "Index of /Archive/PDP-11/Boot_Images" [http://www.tuhs.org/Archive/PDP-11/Boot_Images/](http://www.tuhs.org/Archive/PDP-11/Boot_Images/)
1. V7/x86 on VirtualBox | Robert Nordier 〈[http://www.nordier.com/articles/v7x86_vbox.html](http://www.nordier.com/articles/v7x86_vbox.html)〉
1. 『UNIXプログラミング環境』、Brian W. Kernighan Rob Pike 著、石田晴久 監訳、アスキー出版局


# 雑記
- UNIX V7の全ソースコードも、こちらのサイトにて公開されています。 >>  
"The Unix Tree" [http://minnie.tuhs.org/cgi-bin/utree.pl](http://minnie.tuhs.org/cgi-bin/utree.pl)
- 公開されたV7のイメージを使った遊び方については、こちらのサイトにリンクがまとめられています。 >> 
"Linuxだからできないなんて言わないよ 古代のハッカーたちの遺産で遊ぶ人たち" [http://tenten909.blog.shinobi.jp/other/%E5%8F%A4%E4%BB%A3%E3%81%AE%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC%E3%81%9F%E3%81%A1%E3%81%AE%E9%81%BA%E7%94%A3%E3%81%A7%E9%81%8A%E3%81%B6%E4%BA%BA%E3%81%9F%E3%81%A1](http://tenten909.blog.shinobi.jp/other/%E5%8F%A4%E4%BB%A3%E3%81%AE%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC%E3%81%9F%E3%81%A1%E3%81%AE%E9%81%BA%E7%94%A3%E3%81%A7%E9%81%8A%E3%81%B6%E4%BA%BA%E3%81%9F%E3%81%A1)
<br>

- これで、Advent Calendar『UNIXプログラミング環境』に向けた、ちゃんとした実習環境が整いますね...
    * 僕のAdvent Calendarはこれからだ(白目
<br>


- V7のawkは、現代のawk(nawk, mawk, gawk)とは動作が違うっぽい？
    * cat hoge.txt | awk 'NR <= 10'を実行しても、何も表示されない...
    * 謎だ...
- ^Dによるログアウト、鬱陶しいので常に無効に設定していたけれど...
    * V7では、exitもlogoutコマンドも存在しないので、^Dによるログアウトは重要だった。

- 今回はx86版を動かしてみたけれど、もちろんPDP-11エミュレータ上で動かすことも可能。
    * エミュレータは、SIMHがメジャーみたい。
    * 参考サイト >>  
    "PCメモ \[simh-pdp11\] Version 7 Unixをインストールする" [http://pcmemo.take-uma.net/unixv7/install-v7-1](http://pcmemo.take-uma.net/unixv7/install-v7-1)
    * でも、動作はすっごく遅かった...
    * (もしかしたら、僕が設定をミスっているのかもしれないけれど。)