MINIX2 のネットワークをVirtualBoxで動かしてみた

初めまして、Qiita初投稿のnsan と申します。 よろしくお願いします。

タネンバウム教授の Minix はLinux の元になったＯＳとして有名で、私もアスキー出版の「MINIXオペレーティング・システム」のMINIX 1.5 をPC-9801にインストールして勉強しました。
思えば、初めて大規模なプログラムを見た経験でした。 さすがに先生がコードまで書かれているので一貫性があってわかりやすく、C言語のプログラムの書き方がよくわかります。 現在も同様のOSがあれば良いのですが、Linuxは複雑になってしまい良い材料が無いように思います。

ここでは、MINIX 2.0.4 のTelnetとFtp をVirtualBox下で動かすことが出来たので共有したいと思います。 LANのドライバを変更してＯＳ本体のカーネル再構築をしています。 MINIXではOSのソースコードだけでなく、ash やawk などのコマンドもソースコードが付いているので、ＯＳの仕組みが知りたい人には最適と思います。 C言語のコンパイラについては、Amsterdam Compiler Kit をベースにした物に変更されたのでソースコードは無いです。
素直にVMWare Player を使わないのは、非商用利用のメッセージが煩わしいためです。 IT関係の仕事をしていると、どこまでが非商用か判断つかず勧めづらいので、フリーのVirtualBoxを使っています。

本家のMINIX 2.0 だとLANカードがNE2000なのでVirtualBoxでネットワークが使えないです。  ショートカットして、VMWare用のディスクイメージを以下のサイトからダウンロードします。
https://minix1.woodhull.com/pub/demos-2.0/VMWarePlayer/
minix204vmwp01.zip をクリックしてダウンロードしてください。 ZIPファイルを解凍して、mx204d0.vmdk だけ利用するので、ディレクトリ「%HOMEPATH%\"VirtualBox VMs"」などにコピーしてください。

##仮想マシン作成

- OS タイプ Other バージョンは DOS
- メモリ 32MB VRAM 9MB HDD 500MB の提示されたサイズでよいです
- 要するに IDE のディスクコントローラー、フロッピーのコントローラーがついていれば問題ないです

ディスクを先ほどのファイル mx204d0.vmdk に変更します。 最近のVirtualBox はVMWare用のディスクファイルもそのまま利用できるようになりました。
![virtualbox-minix-disk.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/56d21d76-d45c-bf41-e034-def2af0837ea.gif)

ネットワーク設定で割り当てを、「ホストオンリーアダプター」 、高度をクリックして展開し、アダプタータイプを「PCnet-PCI Ⅱ(Am70C970A)」に変更します。
![virtualbox-minix-net.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/83239519-bae4-9383-917b-b4869661f608.gif)

#起動します
ここで、＝ をタイプする必要がありますが、英語キーボード前提なので日本語キーボード利用の場合は、＝の右隣の［＾］を押下します。
![virtualbox-minix-on.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/111af0b3-0f0a-b0c6-db08-62b1a1385451.gif)

DHCPでアドレス 192.168.56.101 を取得して起動しますが、ネットワークが使えません。
![virtualbox-minix-login.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/c277b5b7-0dc7-b179-31a9-f435f6491a42.gif)

コンソールからroot でログインできます。 また、以下のコマンドでログイン後に日本語キーボードに変更できます。
```loadkeys /usr/lib/keymaps/japanese.map```

TCP/IPネットワークが使えないのは、LANカードドライバ(lance.c)の初期化ビットが違っているようなので修正します。 みつけるのに２週間ほどかかりました。

```
# cd /usr/src/kernel 
# vi lance.c
```
以下のように、/usr/src/kernel/lance.c の796行目で、0x142 を 0x0043 に変更します。

```
796:  out_word(ioaddr+LANCE_DATA, 0x0043);   /* start && enable interrupt */
```

/usr/src/tools に移動し、カーネルの再コンパイルを行うため，make hdboot を実行して、再起動します

```
# cd /usr/sec/tools
# make hdboot
#
# shutdown -r now
```

Telnetでログインするためには、パスワードが必要です。

```
# passwd
Changing the shadow password of root
New password:
Retype password:
```

/etc/serv.access の内容が間違っています。 
```telnet ftp: +* log;``` で* が使えなくて全て禁止になっているので、 * を削除して以下のようにします。

```
# /etc/serv.access
# 2006-05-21
# See the serv.access(5) man pages to learn how to edit this file
# to make your system safe on the network.

# this is insecure! replace with something more specific asap
telnet ftp: + log;

# this is better, keep outsiders out
# telnet ftp: +*.local log;
```

viなど使用する場合に、画面サイズが80文字、24行に決め打ちなので、コマンドプロンプトのウィンドウサイズを変更します。
![virtualbox-minix-cmd.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/6cbb47ec-967f-6a14-f672-7a5cf64d7b2a.gif)

Telnetします。 IPアドレスは、VirtualBoxの環境設定によって違う事があります。

```
C:\Users\temp> telnet 192.168.56.101
```

![virtualbox-minix-telnet.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/4c8eccac-d94a-fc51-48b4-3f3c8b851e35.gif)

ftpd は、shell script ```/usr/etc/rc``` でコメントアウトされているので、66行目先頭の# を削除して再起動すれば利用できますが、demonaize はshell script の関数なので、コマンドラインから起動できません。 ftpが使えるとWinSCPのEditorで編集も出来るので便利です。 /usr/etc/rc はstartup script /etc/rc から呼ばれています。

```shell:/usr/etc/rc
51 |    if [ "$net" ]
52 |    then
53 |        if [ -f /etc/rc.net ]
54 |        then
55 |            # Let a customized TCP/IP initialization script figure it ou
56 |            . /etc/rc.net
57 |        else
58 |            # Standard network daemons. Be sure network is secure before
59 |            # enabling those that are initially disabled here.
60 |            daemonize dhcpd -d3
61 |            daemonize nonamed
62 |            # daemonize talkd
63 |            # daemonize tcpd shell in.rshd
64 |            # daemonize tcpd login in.rlogind
65 |            daemonize tcpd telnet in.telnetd
66 |            # daemonize tcpd ftp in.ftpd
67 |        fi
68 |    fi
69 |
:set number
```

シャットダウンするのは、```shutdown -h now``` です。 d0p0s0> プロンプトが出たら電源オフして構いません
![virtualbox-minix-shutdown.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/160faa5f-bce5-1ffc-3b46-bd30a3c8bd30.gif)

以上、少しでもみな様の参考になれば幸いです。