メモのページ - チラシの裏メモ 3枚目

通信技術や気になった事を黙々とメモし続ける

MINIXでFTPサーバを立ち上げてみた

家で片付けをしていたら、OSの教科書として名高い「オペレーティングシステム 設計と理論およびMINIXによる実装 第2版」(1998年、Andrew S. Tanenbaum, Albert S. Woodhull著)が出てきた。購入後ずっと放置のままだが、MINIX2.0が収録されているという付属のCD-ROMは何故か無かった。しかし今やMINIX2.0の仮想アプライアンスが存在する事は知っている為、MINIX2.0.4をAndroidタブレットにデプロイし、本を読み進めながら少しづつMINIXに触れてみる事にした。今回はMINIX 2.0.4をAndroidタブレットにデプロイし、FTPサーバとして動かしてみた。

MINIX 2.0.4に触れて、気分だけでも1990年代末期(その頃は大学生)にタイムスリップ!


MINIXとは?
オランダのアムステルダム自由大学の教授でありIEEEのフェローであるAndrew S. Tanenbaum教授によって開発、1987年にリリースされた、UNIX(UNIX version 7)互換の教育用のOSである。
マイクロカーネルが採用されている為、カーネルのサイズは非常に小さい。またシステム自体もCentOSやUbuntuはおろかXが無いAlpine Linuxよりも小さく、自分のAndroidタブレットで稼働しているMINIXでさえ34MBしかない。

今回の記事のネタであるMINIXバージョン2は1997年に2.0がリリースされた。
MINIX 2.0はx86版とSPARC版が提供され、POSIX.1への準拠やIntel386のサポートやTCP/IPの実装等、少しづつだが実用的な物に近付いていった。
MINIXは今も開発が継続されバージョン3がTanenbaum教授らによって公開されているが、MINIXバージョン2は本家版だけでなく、MINIXバージョン2の共同開発者であるAlbert S. Woodhull氏により仮想アプライアンス版を公開している。


当方の環境
・ホスト機:Androidタブレット VASTKING KingPad SA8 / Android OS 10
・エミュレータ:Limbo PC Emulator 2.0.10
・ゲストOS:MINIX 2.0.4
・ソフトウェアキーボード:Androidアプリ「Hacker's Keyboard」
Limbo PC Emulatorという、VirtualBoxのAndroidアプリ版のようなツールにてMINIXを動かす。


MINIXのデプロイ
今回は、Albert S. Woodhull氏が公開している仮想アプライアンス版を使用する。
以下はMINIX本体のファイルのダウンロードからMINIXが動作可能になるまでの流れ。

1. minix204vmwp01.zipを下記リンク先からダウンロード。
https://minix1.woodhull.com/pub/demos-2.0/VMWarePlayer/ Minix 2.0.4 Virtual Machine for VMWare Player

2. ダウンロードしたファイルminix204vmwp01.zipを展開。
VMware WorkstationやVMware Playerで動かす場合は展開して生成されたファイルをそのまま使用。
Limbo PC Emulator等QEMU環境で動かす場合やVirtualBoxで動かす場合は、mx204d0.vmdkだけ使用。

3. mx204d0.vmdkのファイル形式をvmdkからqcow2に変換。
当記事ではAndroidタブレットにインストールされているLimbo PC Emulatorというツールの中で仮想アプライアンスとしてMINIXを動作させる為、qcow2ファイルに変換する。
VMware WorkstationやVirtualBoxにて動作させる場合は、vmdkファイルのままでよい。
Windows環境ではqemuコマンドもしくはNHCというツール(https://euee.web.fc2.com/tool/nhc.html#nhc)で、macOSの環境ではqemuコマンドでqcow2ファイルに変換する。
自分の場合、Windows10のPCにてNHCを使用し変換した。

4. mx204d0.qcow2をデプロイ。
WindowsPCからAndroidタブレットにmx204d0.qcow2をコピー。
当記事ではLimbo PC Emulatorの設定の詳細は割愛。Limbo PC Emulatorの設定に関しては以下を参照。
自分の場合、仮想RAMは128MB、NICはpcnetをアサインした。
https://debslink.hatenadiary.jp/entry/20200418/1587204948

VMware WorkstationやVMware Playerの設定に関しては以下を参照。
https://minix1.woodhull.com/pub/demos-2.0/VMWarePlayer/

Limbo PC Emulatorにて外部からのFTPのアクセスを受け付けるには、Network設定のHost Forwardの欄にて以下を入力する。
よって、このFTPサーバにアクセスする際はポート番号22221を指定する必要が有る。

hostfwd=tcp::22221-:21

Limbo PC Emulatorの設定が完了したら、画面内上部の三角ボタンをタッチしデプロイを開始。

5. MINIXの起動完了後、ログインプロンプトが表示される。
rootでログイン。パスワードは無し。
Login as root and run 'setup' to install Minix.の表示が有るが、既にHDDにインストールされた状態である為、setupコマンドの実行の必要は無い。
さあ、これでMINIXを持ち歩く事が可能になった。ゲストOSだけど...

1990年代のリバイバル?全くもって実感無し。ディレクトリ構成は今時のLinuxと少し違う程度で、黒の背景に無機質な白い文字列はLinuxやBSDと同じだから。


FTPサーバの設定
ここから、外部との通信の為の設定およびFTPサーバの設定に入る。

1. TCP/IP通信の設定
MINIX2ではデフォルトでTCP/IPの通信が出来ないようなので、まずはTCP/IPの通信が可能な状態にする。
/usr/src/kernel/lance.cファイルを開き、以下の0x142を0x0043に修正。
※/usr/src/kernel/lance.cファイル内の796行目

  }

  out_word(ioaddr+LANCE_ADDR, 0x0);
  (void)in_word(ioaddr+LANCE_ADDR);
  out_word(ioaddr+LANCE_DATA, 0x142);  /* start && enable interrupt */

  return;
}

2. /usr/serv.accessファイルを開き、telnet ftp: +* log;をtelnet ftp: + log;に修正。
/usr/serv.accessファイル自体はls /usrで見えないものの、viコマンドで開く事が出来る。

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

3. /usr/etc/rcファイルを開き、# daemonize tcpd ftp in.ftpdの行頭の#を削除し、FTPのサービスが立ち上がれる状態にする。

if [ "$net" ]
then
    if [ -f /etc/rc.net ]
    then
        # Let a customized TCP/IP initialization script figure it ou
        . /etc/rc.net
    else
        # Standard network daemons. Be sure network is secure before
        # enabling those that are initially disabled here.
        daemonize dhcpd -d3
        daemonize nonamed
        # daemonize talkd
        # daemonize tcpd shell in.rshd
        # daemonize tcpd login in.rlogind
        daemonize tcpd telnet in.telnetd
        # daemonize tcpd ftp in.ftpd
        fi
    fi

4. 上記3を修正し終えたら、/usr/src/toolsディレクトリに移動しカーネルを再構築。
エラーを吐かずDone.が出力されたら、カーネルの再構築およびインストールは完了。

# cd /usr/src/tools
# make hdboot
:
:
exec sh mkboot hdboot
cp image /dev/c0d0p0s0:/minix/2.0.4r0
Done.
#

5. shutdown -r nowコマンドを実行しMINIXを再起動。
ホスト機側のHWスペックにも依るが、再起動自体はすぐに完了する。

# shutdown -r now

6. 今の状態ではパスワード無しでログイン可能である為、rootアカウントのパスワードを設定。

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

7. ftpサーバ用のアカウント「ftpuser」を作成。外部からftpサーバにログインする際、このアカウントを使用する事とする。
ついでに、ftpuser用のパスワードも設定。

# adduser ftpuser other /usr/ftpuser
cpdir /usr/ast /usr/ftpuser
chown -R 50:3 /usr/ftpuser
echo ftpuser::0:0::: >>/etc/shadow
echo ftpuser:##ftpuser:50:3:ftpuser:/usr/ftpuser: >>/etc/passwd
:
# passwd ftpuser
Changing the shadow password of ftpuser
New password:
Retype passowrd:
#

8. Linuxの場合、一般ユーザに割り当てられるディレクトリは/home配下であるが、MINIX2の場合は/usrディレクトリ配下となる。
今回は、ftpuserユーザ用のディレクトリを公開用として設定する。
公開ディレクトリを/usr/ftpuserから/usr/ftp/pubに変更する為、/etc/passwdファイルを修正。
以下の行の/usr/ftpuserを/usr/ftp/pubに修正する。

# vi /etc/passwd
:
|nobody:*:9999:99::/tmp:
|ftpuser:##ftpuser:50:3:ftpuser:/usr/ftpuser:

9. 公開ディレクトリ/usr/ftp/pubの所有者および権限を修正する。
以下の設定により、ftpuserのアカウントでアクセスしたユーザは、公開ディレクトリ内のファイルのダウンロードだけでなくファイルのアップロードも可能となる。
外部からのアクセスの確認用として、README.txtファイルを作成した。

# chown ftpuser:other /usr/ftp/pub
# chmod -R 777 /usr/ftp/pub
# touch /usr/ftp/pub/README.txt
#
# ls -la /usr/ftp/pub
total 2
drwxrwxrwx 2 ftpuser   other        32 May 20  2006  .
drwxr-xr-x 6 root      operator     96 May 20  2006  ..
-rw------- 1 root      operator    920 Feb 16 22:36  README.txt
#

10. MINIXを再起動。
起動時のStarting daemons: のログにて、ftpのサービスが立ち上がった事が確認出来る。

# shutdown -r now
:
:
Minix 2.0.4  Copyright 2001 Prentice-Hall, Inc.

Executing in 32-bit protected mode

at-d0: QEMU HARDDISK

Memory size = 130504K    MINIX = 379K    RAM disk = ok   Available = 130125K

Hardware real-time clock says:
Wed Feb 16 22:51:28 EST 2022
/dev/c0d0p0s2 is read-write mounted on /usr

Multiuser startup in progress.
eth_card#0: AMD Lance/PCI (1022/2000) at 0.3.0
eth_card#0: using I/O address 0xc000, IRQ 11
eth_card#0: PCnet/PCI-II 79C970A at C000:11
Starting daemons: update cron dhcpd nonamed telnet ftp.

Login as root and run 'setup' to install Minix.

Minix  Release 2 Version 0.4

10.0.2.15 login:

11. FTPサーバへの接続確認。
MINIXの起動が完了したところで、MacBook AirにてFTPクライアントツールCyberduckを立ち上げ、Androidタブレットにて動作するMINIXのFTPサーバにアクセス。
公開ディレクトリ内のファイルREADME.txtが見える事が確認出来、MINIXのFTPサーバ化は成功した。
※画像をクリックすると拡大表示します



今回はここまで。
妻(大学の同期)と話をしながらMINIX2に触れた。BGMは当時ヒットしていたUnderworldやMassive Attackだったがその頃はまだ存在していなかったYouTubeで流していた事と、周囲に有る物は1990年代末期には無かった物だらけで、気持ちだけでもタイプトリップ...なんてものは容易な事ではなかった。
しかし、OSの勉強自体は今後も進めていこうと思う。
 
2023/10/9追記
MINIXの開発は停止しているようで、開発版のバージョン3.4.0rc6が2017年5月に公開されて以降、更新が止まっている。
https://srad.jp/story/23/07/04/1355204/ MINIXはもう死んでいる?
 
 
参照サイト
http://www.ne.jp/asahi/it/life/it/more/minix/minix_2.html MINIX 2をインストールする
https://qiita.com/nsan/items/2d1cd59d7c977be4ae4e MINI2 のネットワークをVirtualBoxで動かしてみた
https://minix1.woodhull.com/pub/demos-2.0/VMWarePlayer/ Minix 2.0.4 Virtual Machine for VMWare Player
https://www.amazon.co.jp/dp/4894710471/ オペレーティングシステム―設計と理論およびMINIXによる実装
https://www.minix3.org/ MINIX 3
https://sourceforge.net/projects/limbopcemulator/ Limbo PC Emulator
 
BGM
https://www.amazon.co.jp/dp/B000006045/ Massive Attack - Mezzanine
https://www.amazon.co.jp/dp/B000003RHD/ Underworld - Second Toughest in the Infants
https://www.amazon.co.jp/dp/B000006TNS/ The Prodigy - The Fat of the Land