minix3

女房が、季節外れのブドウを買って来た。JAが都内へ出荷出来ないので地元に還元したかと思ったら違った。季節が日本と正反対のオーストラリアからの輸入品。ひと房178円とか。随分安いな。国産品と大違い。

大違いの理由は、日本のそれより酸っぱい事。へたが黒くなるぐらいになれば、甘くなるよと言う常識は通じず。いつまで待っても酸っぱい。

怒った女房はミキサーで粉砕。茶漉しで種を取り除き、炭酸水で割って、蜂蜜を加えてジュースにしちゃった。

水増ししたおかげで、4杯分になった。天然果汁のジュースの巻でした。

install minix3 in qemu

minix3なんてのが思い出されてしまったので、debina(32Bit)機で試してみる。qemu上ね。 stable版をDownloadから落としてきたよ。ISOは圧縮されてるんで、bzip2 -d で展開した。そしてインストールは済ませた。けど、コンソール画面が以外に小さくて、年寄りには無理。(後で気が付いた事であるが、ズームイン機能で、画面を拡大出来る)

debian:minix$ qemu-system-i386 -m 512 -serial pty disk &
[1] 2643
debian:minix$ char device redirected to /dev/pts/2 (label serial0)

そこで、例の手(仮想シリアルデバイス)のお世話になる。後少しだけ目を細めて我慢。 そう、minix3側で、シリアル回線を有効にするんだ。

# less /etc/ttys
 :
ttyc2           "/usr/libexec/getty default"    minix   on secure
tty00           "/usr/libexec/getty default"    vt100   on secure
#tty00          ""              unknown off secure

冒頭のttyc3をtty00に変更。minixなんて端末は多分誰も知らないので、 vt100に変更。次のオリジナルtty00はコメントアウト。そして、kill -HUP 1 する。そうすると、initが再実行されて、tty00で待ち構えるようになる。 後は、リナ側から cu -l /dev/pts/2 すれば良い。

# df -h
Filesystem          Size       Used      Avail %Cap Mounted on
/dev/c0d0p0s0       128M        35M        93M  27% /
none                  0B         0B         0B 100% /proc
/dev/c0d0p0s2        13G       585M        12G   4% /usr
/dev/c0d0p0s1       3.1G        33M       3.0G   1% /home
none                  0B         0B         0B 100% /sys

こんな状態になった。次は、ファイルのやり取りとかを考慮して、minix3側にsshdを起動しておこう。どういう名前でパッケージになってるか?

Setting Up SSH

こんなのが見つかったので、指示に従う。

# pkgin update
# pkgin install openssh
calculating dependencies... done.

nothing to upgrade.
2 packages to be installed: tcp_wrappers-7.6.4 openssh-6.6.1 (1673K to download,
 4262K to install)

proceed ? [Y/n] y
downloading packages...
tcp_wrappers-7.6.4.tgz              100%   80KB  80.4KB/s  80.4KB/s   00:00
openssh-6.6.1.tgz                   100% 1592KB 318.5KB/s  76.3KB/s   00:05
installing packages...
installing tcp_wrappers-7.6.4...
installing openssh-6.6.1...
openssh-6.6.1: copying /usr/pkg/share/examples/rc.d/sshd to /usr/pkg/etc/rc.d/ss
hd
openssh-6.6.1: copying /usr/pkg/share/examples/openssh/moduli to /usr/pkg/etc/ss
h/moduli
openssh-6.6.1: copying /usr/pkg/share/examples/openssh/ssh_config to /usr/pkg/et
c/ssh/ssh_config
openssh-6.6.1: copying /usr/pkg/share/examples/openssh/sshd_config to /usr/pkg/e
tc/ssh/sshd_config
===========================================================================
$NetBSD: MESSAGE.urandom,v 1.1 2002/02/05 04:17:31 jlam Exp $

You will need a working /dev/urandom.  Please make sure you have a kernel
compiled from a config file containing the line:

        pseudo-device   rnd
===========================================================================
pkg_install warnings: 0, errors: 0
reading local summary...
processing local summary...
updating database: 100%
marking openssh-6.6.1 as non auto-removable

なんかpkginってNetBSDな人が一生懸命に拡販してたパッケージャシステムだな。GPLを嫌ってBSDライセンスを選ぶなら、汎用品として適切なんだろうね。

# ps ax | grep sshd
 1091   ?  0:00 /usr/pkg/sbin/sshd
 1100  00  0:00 grep sshd

動いているな。後は、useradd -m -d /home/sakae sakae とかして、自分の居所を確保すればいいな。あれ? 大事なソースが入っていないぞ。どうした事か? ソースは何処?って彷徨ってみると、

MINIX 3 Frequently Asked Questions を経由して、 Official MINIX sourcesを紹介された。先端のソースかな。

新しいワインは新しい革袋に入れろの例え通り、minix3の先端に行く事にする。

minix 3.4 on VirtualBox

開発版とやらを入れてみた。OSの種類は Other Linux(32)を選んで無事に入った。

minix$ uname -a
Minix minix 3.4.0 Minix 3.4.0 (GENERIC) i386
minix$ df -h
Filesystem          Size       Used      Avail %Cap Mounted on
/dev/c0d0p0s0       128M        56M        72M  43% /
none                  0B         0B         0B 100% /proc
/dev/c0d0p0s2       9.6G       1.7G       8.0G  17% /usr
/dev/c0d0p0s1       2.2G        24M       2.2G   1% /home
none                  0B         0B         0B 100% /sys
none                  0B         0B         0B 100% /dev/pts

全体像はこんなもの。ソース込みね。

minix$ du -sh /usr/src
736M    /usr/src

ソースもユーザーランド込みなんで、とっても小ぶりな仕様だ。

minix$ cc -v
clang version 3.6 (branches/release_36 237755)
Target: i386-elf32-minix
Thread model: posix

ccはgccじゃなくてclangってのがBSDライセンスを的確に表しているな。それはいいんだけど、gdbが無い。pkgにも無い。開発が間に合わなかったから?

ftp://ftp.minix3.org/pub/minix/packages/

まて、無理して先端にこだわる必要は無いぞ。静かにstable版を入れておく方が無難かもよ。 後で入れ替えておくかな。

stable版の一歩手前

残念ながらstable版(3.3.0)には、ソースが何故か付いていなかった。そこで、一つ前の版を試しに入れてみた。

$ uname -a
Minix 10.0.2.15 3.2.1 i686

こんなバージョンだ。

$ ls /usr/src
LICENSE      commands     drivers      kernel       sbin         tools
Makefile     common       etc          lib          servers      usr.bin
benchmarks   dist         external     libexec      share        usr.sbin
bin          distrib      gnu          man          sys
build.sh     docs         include      releasetools test

ソースは同梱されてた。NetBSD陣営のご協力を賜り、大分移植されてるっぽい。えせNetBSDと見做してもいいかな。まて、本物のemacsが何処にも無いぞ。しょうがないのでmgって言う模造品を入れた。

$ pkgin search emacs
exctags-5.8 =        Exuberant (feature-filled) tagfile generator for vi, emacs and clones
mg-20090107 =        Small, fast, public domain EMACS style editor
vile-9.7nb3          VI Like Emacs.  a vi `workalike`, with many additional features
zile-2.3.17          Emacs-like text editor

=: package is installed and up-to-date
<: package is installed but newer version is available
>: installed package has a greater version than available package

tagファイルを作るやつも入れたけど、色が付かないemacsもどきじゃ、ソース閲覧に難がありそう。ならば、大幅に譲歩してminix本のソースをしっかり読む方向に転換しようか。

book版

古い版minix 1.1 のやつは提供されてるけど、動かすのに苦労しそう。ならば、3版用の簡単に動きそうなのを試すか。bookバージョンを取ってきた。まずは中身拝見。

ISO版の中身

-r-xr-xr-x  1 root  wheel   378299 Jan  1  1970 BOOKSRC.TGZ*
-r-xr-xr-x  1 root  wheel  1474560 Jan  1  1970 BOOTFLOP.IMG*
-r-xr-xr-x  1 root  wheel     3233 Jan  1  1970 INDEX.TXT*
-r-xr-xr-x  1 root  wheel   847535 Jan  1  1970 LISTING.PDF*
-r-xr-xr-x  1 root  wheel  2623738 Jan  1  1970 LISTING.PS*
-r-xr-xr-x  1 root  wheel  1144723 Jan  1  1970 LISTING.TXT*
-r-xr-xr-x  1 root  wheel   100192 Jan  1  1970 PRESZ134.ZIP*
-r-xr-xr-x  1 root  wheel     4084 Jan  1  1970 README.TXT*
-r-xr-xr-x  1 root  wheel    24137 Jan  1  1970 SETUP.PDF*
-r-xr-xr-x  1 root  wheel    46445 Jan  1  1970 SETUP.PS*

さすが、ちゃんとしてた。ソースを固めたやつとか、付録のなってるソースリストとか、インストールする前に確認出来る。

下記は、ソースの内容。本の解説範囲が提供されてますって事だな。

drwxr-xr-x  8 sakae  wheel   512 Oct 15  2005 drivers/
drwxr-xr-x  5 sakae  wheel   512 Oct 15  2005 include/
drwxr-xr-x  3 sakae  wheel  1024 Oct 15  2005 kernel/
drwxr-xr-x  6 sakae  wheel   512 Oct 15  2005 servers/
drwxr-xr-x  2 sakae  wheel   512 Oct 15  2005 tools/

debian機のqemu内に入れる事にした。インストール中に、disk内のR/Wチェックが行われる。これにめっぽう時間がかかるんで、C-c を押してスキップしよう。 フルのソースに大物のemacs 21.4 とかが含まれていて、これのインストール(勿論バイナリーも)にめっぽう時間がかかる。気長に待とうホトトギス。

ネットワークはNICを認識するもDHCPでアドレスを取得出来ず。しょうがないのでシリアルを活かす事にした。ttysじゃなくて、/etc/ttytab を変更する事になる。

$ cat /etc/ttytab
  :
ttyc2           minix           getty
tty00           vt100           getty
#tty00          unknown

設定が終わったら、再起動。kill -HUP 1 では、動かなかったぞ。NetBSDみたいにはいかないのね。

$ uname -a
Minix minix 3 1.0 i686

こんなバージョンになった。

etc

例によって、少し資料収集。

minix3.1.4をqemu環境にインスコしたので色々遊ぶ

minix 七誌の開発日記

オペレーティングシステムのカーネル動作の可視化

楽しいね。

そして、KVMとかを使うと、速くなるとな。

# cd /usr/src/tools/
# time make image
      :
     text     data      bss      size
    19568     3144    29808     52520  ../kernel/kernel
    19504     2360    48616     70480  ../servers/pm/pm
    42624     5556  5316124   5364304  ../servers/fs/fs
     4352      616     4696      9664  ../servers/rs/rs
    26144     4996    44192     75332  ../drivers/tty/tty
     4784      764     3012      8560  ../drivers/memory/memory
     5904      504    63276     69684  ../drivers/log/log
    23680    10776    10932     45388  AT:../drivers/at_wini/at_wini
    11328     1944     7276     20548  BIOS:../drivers/bios_wini/bios_wini
    10352     1480     4144     15976  FLOPPY:../drivers/floppy/floppy
     7088     2284     1356     10728  ../servers/init/init
   ------   ------   ------   -------
   175328    34424  5533432   5743184  total
      35.93 real      16.91 user      14.73 sys

これが普通のやつ。

Debian KVMで仮想化環境構築 を、Debian(64-Bit)に入れる。そして、qemu-system-i386を使って起動してたのを、kvmに して起動する。

Could not access KVM kernel module: No such file or directory
qemu-system-x86_64: failed to initialize KVM: No such file or directory

起動するはずなんだけど、エラーである。調べてみると、kvm-intelがちゃんと入ってるってあったので、

sakae@pen:/tmp/minix-3.1.0$ locate kvm-intel
/usr/lib/modules/4.19.0-8-amd64/kernel/arch/x86/kvm/kvm-intel.ko

ほら、この通り、Intel入ってる、状態である。よその人はちゃんと動いているんだけどな。 30秒考えて、VMWare上のCPU設定で、Intel VT-xEPTを有効にしてあげたら、無事に起動した。

で、気になる実行結果だが、逆に遅くなってしまった。ちゃんと動いている所では、5秒ぐらいでコンパイルが完了するそうだ。悔しいので失敗の理由を考える。

kvmってのはCPUが提供してる、仮想化支援機構。VMWareが既にDebianを動かすのに使ってしまっている為、ゲストOS側(正確にはqemu)では利用出来ない。よって、仮想化支援をシュミレートしてるんだ。だから遅くなるのさ。残念至極。

book版で、/etc/inet.conf の所が、fxpになってた。ネットワークが動いていない。別のNICとして、lanceを選んでみた。minix 3.2.1でちゃんと動いていたって根拠の無い理由。

これで、起動時にdhcpdがあたかも、IPを貰おうとしてるんだけど、結果は失敗してる。ならば自分で設定してみろ。

# ifconfig -I /dev/ip -h 10.0.2.14 -n 255.255.255.0
# ifconfig -v
/dev/ip: address 10.0.2.14 netmask 255.255.255.0 mtu 1500
# ping xxx.xxx.xxx.xxx
write: Destination not reachable

IPを自前で設定してpingするも、到着せず。デフォルトゲートウェイはどうやって設定すんの? そんなのはソースに書いてあるでしょ。

TODO

ソース嫁、本も読め。

sakae@pen:~$ ls minix-3.1.0/
boot  disk  src-1.1  src-3.1.0
sakae@pen:~$ qemu-img info minix-3.1.0/disk
image: minix-3.1.0/disk
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 320M
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

ソースを手軽にdebian上で読めるように用意した。初期の版と3版用。

find . -name '*.[chs]' | xargs etags

これで、本の付録を行ったりきたりの苦行から逃れられる。

$ cat .emacs.el
(global-font-lock-mode t)
(column-number-mode t)
(define-key mode-specific-map "v" 'view-mode)

ついでに、軽くemacsの設定もしておく @minix

restart() なんてのがkernel/main.cに出て来るんだけど、所在不明。探したら、_restart って言うアセンブラーになってた。見つからない時は、冒頭にアンダーバーを入れて再検索。 こういうのをバッドノウハウって言うんだろうね。

それから、minixが入ったdiskの容量が300Mぐらいなんで、手軽に/tmpに転送して、思う存分いたずら出来る。どんないたずらかって?

rm -rf / したらどうなるって言う定番のやつとか、haltさせないで、いきなり電源SWをブチュっと切ったら、次回の起動時にどうなるとか、etc,etc。

cat /dev/mem したらどうなるとか。色々とメモリー内容が表示されて、まだまだ続くようなんで、C-c したら、Panicってくれたぞ。

MINIXの30年の歴史から学んだこと

こんな楽しい回想録が見つかった(超お勧め)。オイラーが持ってる第一版の本は、1990年の購入。30年で一緒だね。改めて読み直してみると面白いな。 読みふけって、更新が疎かになるかも。