rvtlを使った 1FDLinux
rvtl は Linux 上で動作する Tiny Basic インタプリタですが、init プロセスとして使うことで
1FD Linux を簡単に実現できます。Windowsマシンもフロッピーディスク(FD)から起動して Linux ベースの
Tiny Basic 専用マシンとすることができます。単に /sbin/init を /bin/rvtl へのシンボリックリンクにして、
カーネル起動後に直接 rvtl を起動して実現しています。名前は VTLinux とすることにします。
ここでは SYSLINUX 3.08を利用しています。
Linux カーネルは、2.6.11 を Pentium 以上で使用できるようにコンパイルしたものを使用しています。カーネルのサイズは1,362,692バイトとフロッピーディスクに収めるには限界の大きさです。USB、シリアルATA、フレームバッファ、reiserfs、ext3、udf、vfat、ntfs が使えるようにコンパイルしています。
Windows 環境でも FD からブートできれば、rvtl を簡単に試すことができます。
ダウンロードとFDへの書き込み
rvtl3fd2.img.gz (1,396KB)をダウンロードします。
Linux を使っている場合は以下のように展開後、dd を使って FD に書き込みます。
gzip -d rvtl3fd2.img.gz dd of=/dev/fd0 if=rvtl3fd2.img
Windows の場合は WinZip や lhaca をつかって解凍し、 大抵の Linux ディストリビューションに付属している DOS用のユーティリティの rawrite.exe で次のように してフロッピーに書き込みます。
E:\>rawrite Enter disk image source file name: rvtl3fd2.img Enter target diskette drive: a: Please insert a formatted diskette into drive A: and press -ENTER- :
コマンドラインからの操作が苦手な方は、RawWrite for windowsで図のように指定して FD に書き込みます。
rvtl2fd2.img を 「Image file」のテキストボックスで指定して 「Write」ボタンを押すだけです
実行
こうしてできたFDで起動するとスクリーンに以下のように表示されます。
Very Tiny Linux rvtl 3.02 https://www.mztn.org/ linux-2.6.11 (usb vfat ntfs reiserfs sata) VESA Mode depth | color | 640x480 800x600 1024x768 1280x1024 ------+-------+--------+---------+---------+--------- 15bit | 32k | 310 313 316 319 16bit | 64k | 311 314 317 31A 32bit | 16M | 312 315 318 31B cat |ca tmp.txt sync |sy ls |ls /vtl chroot |cr tmp cd |cd tmp exec |ex /sbin/init chmod |cm 644 tmp.txt pivot_root |pv /mnt /mnt mkdir |md tmp swapon |so /dev/hda3 mv |mv tmp tmp2 swapoff |sf /dev/hda3 umount |um /mnt rmdir |rd tmp rm |rm tmp pwd |cw mount |mo /dev/hda1 /mnt vfat |mo /dev/hda1 /mnt reiserfs |mo /dev/hda1 /mnt ext2 |mo /dev/hda1 /mnt ext3 |mo /dev/scd0 /mnt iso9660 r |mo /dev/scd0 /mnt udf |mo none /proc proc Loading linux............ Loading initrd.gz..... Press <RETURN> to see video modes available, <SPACE> to continue or wait 30 secs
RETURN キーを押すと指定可能なモードが表示されますが、これらはキャラクターモードなので 317(1024x768) を入力して、RETURN キーを押します。 ペンギンが表示されたらフレームバッファが使える状態です。FDから起動すると1分近く 時間がかかりますが、起動画面の下半分に表示される Linux のコマンドと rvtl のコマンド との対応を覚えておきましょう。
Linuxのカーネルから直接起動(プロセスIDが1)された場合、rvtl は /etc/init.vtl というファイルが 存在すると、それをロードします。今回のFDイメージの /etc/init.vtl では次のようにしています。
|mo none /proc proc / |mo /dev/fd0 /home vfat / |ca /proc/filesystems / |ca /proc/mounts / , /bin/rvtl
まず最初に proc ファイルシステムをマウントして、/proc 以下のファイルからシステムの情報を 取得できるように用意します。次に FDを /home にマウントしています。/home/save はファイルを セーブするためのディレクトリです。/proc/filesystems と /proc/mounts を表示した後、最後に 子プロセスとして /bin/rvtl を起動しています。
「<000C>」とプロンプトが表示されたら、フレームバッファを使った簡単なサンプルを実行してみましょう。 USB 接続のハードディスクが接続されているような場合は、デバイスを認識した表示と rvtl の 表示が混ざってしまう場合があります。プロンプトが表示されなくて停止しているように見える場合は RETURN キーを押してください。/vtl/line.vtl は画面に水平線と垂直線とランダムなラインを1万本づつ 交代に、計9万本を描画します。最後に紫色で画面クリアして実行時間を表示して終了します。 プログラムのロードは「>=」です。セーブは逆向きの「<=」を使います。 ファイル名を入力する場合は、TAB キーでファイル名補完できます。 上下の矢印キーで入力行のヒストリー機能が働きます。
<000C> |cd /vtl <000C> >="fb_demo.vtl" <000C> #=1
マシンの速度に依存しますが、数秒で9万本のラインが表示され、その後1分間で3種類の パターンが移動します。プログラムをリスト表示するには、「<000C> 0」 のようにプロンプトの 後で 0 を入力します。コンソールでは日本語が表示できないためコメント部分が文字化け しますが、気にしないで下さい。ctrl-S で一時停止、ctrl-Q で表示の再開ができますが、 「1+」「1000-2000」のように範囲指定のリスト表示が可能です。
次のサンプル (/vtl/reverse.vtl) を試す前に /vtl/fb_demo.vtl をメモリからクリアします。 NEW コマンドは「&=0」です。
<000C> &=0 <000C> >="/vtl/reverse.vtl" <000C> #=1
左上と右下のピクセルから順に交換することで画面が逆転します。コンソールから使う場合、 日本語キーボードではキートップの表示と入力される記号が異なります。英語の101キーボード の配列になっています。日/英のキーボードの対応関係を表示するには次のように入力してください。
<000C> , /bin/key.vtl US 101 ~ ! @ # $ % ^ & * ( ) _ + ` 1 2 3 4 5 6 7 8 9 0 - = P { } p [ ] L : " | l ; ' \ M < > ? m , . / JP 106 ! " # $ % & ' ( ) = ~ | 1 2 3 4 5 6 7 8 9 0 - ^ \ P ` { p @ [ L + * } l ; : ] M < > ? _ m , . / \ <000C>
キー入力される文字が下段、シフトキーを押して入力される文字が上段に表示されます。 上半分がコンソールから入力される記号で、下半分が日本語キーボードのキートップの表示 になります。
「, /bin/key.vtl」は 「,="/bin/key.vtl"」の省略形で rvtl が子プロセスとして外部コマンド を起動します。子プロセスの実行が終了すると rvtl に戻ります。/bin/key.vtl は rvtl の プログラムをコマンドとして使う (シェルスクリプトと同じ) 例です。 「|ca /bin/key.vtl」 として /bin/key.vtl の内容を確認してみてください。
<000C> , /bin/rvtl RVTL v.3.02 2005/06/05, Copyright 2002-2005 Jun Mizutani RVTL may be copied under the terms of the GNU General Public License. <000D> <000D> ~ <000D>
この例は、子プロセスとして rvtl を起動し、「~」で終了しています。プロンプトの番号が 変化しています。この番号はプロセス ID を16進数表示したものです。2度目に起動した rvtl が別プロセスとして動作していることがわかります。プロンプトが<0001> の時に rvtl を終了するコマンド「~」を実行すると、init プロセスが終了してしまうため、 カーネルパニックになってしまいます。 「, /bin/rvtl」で起動して、子プロセスで rvtl を 実行するほうが安全です。特に、グラフィックのプログラミング (フレームバッファを使う) で フレームバッファのメモリ外をアクセスするバグがある場合、実行時に「Segmentation Fault」 で rvtl が終了してしまうことがあります。 子プロセスで rvtl を実行すると開発中のプログラムを失うことがなくなります。
rvtl のプログラムをセーブ
1FDLinux はフロッピーの容量を最大限利用することが普通です。今回の rvtl を使う 1FDLinux (VTLinux) は、FD に 120 キロバイト以上の空きがあります。
「|mo /dev/fd0 /mnt vfat」として起動したFDをマウントして、プログラムを保存することができます。 同様に下の表のようにいろいろな形式のファイル形式をマウントして読み書きすることができます。 (デバイスファイル名は適当に読み替えて下さい。)
proc | |mo none /proc proc |
CD-ROM | |mo /dev/hdc /mnt iso9660 r |
Windows | |mo /dev/hda1 /mnt vfat |
USB-HDD | |mo /dev/sda1 /mnt vfat |
ext2 | |mo /dev/hda3 /mnt ext2 |
ext3 | |mo /dev/hda3 /mnt ext3 |
reiserfs | |mo /dev/hda7 /mnt reiserfs |
NTFS | |mo /dev/hda7 /mnt ntfs r |
UDF | |mo /dev/hda7 /mnt udf r |
リブート
シャットダウンやリブートコマンドはありません。ハードディスクをマウントしている場合は |sy で sync するか、アンマウント(|um) してから電源断、またはキーボードから Ctrl+Alt+Delete でリブートしてください。
構成
VTLinux にはエディタとしてアセンブリ言語で作成されている e3 を採用しています。また asmutils から cp と mknod を借用しています。asmutilsには他にも多くの 「小さい」コマンドが含まれていますから必要ならば追加してください(後述)。
jm:/home/jun/# gzip -dc rvtl3fd2.img.gz >rvtl3fd2.img jm:/home/jun/# mount -t vfat -o loop rvtl3fd2.img /mnt jm:/home/jun/# cd /mnt jm:/mnt# ls -lt jm:/mnt# ls -lt total 1408 -rwxr-xr-x 1 root root 1186 2005-06-03 22:12 boot.txt -rwxr-xr-x 1 root root 67013 2005-06-03 22:06 initrd.gz -r-xr-xr-x 1 root root 9420 2005-06-03 13:49 ldlinux.sys -rwxr-xr-x 1 root root 1362692 2005-06-03 23:16 linux -rwxr-xr-x 1 root root 181 2005-06-03 22:12 syslinux.cfg
VTLinux のフロッピーディスクには上のようなファイルがあります。linux は Linux カーネルです。 それ以外はSYSLINUX 用の設定ファイルになっています。
VTLinux で使ったバイナリは次の 7つです。calc、stackdump、ws は こちら を参照してください。今回、rvtlのバイナリは /usr/bin に置いて、/bin にはシンボリックリンク を置いています。
#ls -l bin lrwxrwxrwx 1 jun users 15 Jun 3 22:08 rvtl -> ../usr/bin/rvtl -rwxr-xr-x 1 jun users 763 Jul 20 2002 cp -rwxr-xr-x 1 jun users 398 Jul 20 2002 mknod -rwxr-xr-x 1 jun users 34 Jul 13 2002 proc.vtl -rwxr-xr-x 1 jun users 664 Jul 13 2002 key.vtl -rwxr-xr-x 1 jun users 12778 Jun 17 2002 e3 -rwxr-xr-x 1 jun users 3668 Apr 20 2001 calc -rwxr-xr-x 1 jun users 1308 Apr 20 2001 stackdump -rwxr-xr-x 1 jun users 640 Apr 20 2001 ws # ls -l usr/bin total 20 -rwxr-xr-x 1 root root 18696 2005-06-05 00:26 rvtl
initrd.gz (イニシャル RAM ディスク) の作成法
VTLinux の initrd.gz は特別なツールなどは使用しないで次のようなコマンドを使用して作成しました。 MS-DOSフォーマットのフロッピーディスクに SYSLINUX 2.06 を使用したディスクに対して Linux カーネル (vmlinuz) と initrd.gz をコピーしています。
# (1) RAMディスク用のファイルを準備 dd if=/dev/zero of=initrd bs=1k count=4096 # (2) ファイルをext2でフォーマット /sbin/mke2fs -F -m 0 initrd # (3) もし何かマウントしていたらアンマウント umount /mnt # (4) 用意したファイルをループデバイスとしてマウント mount -o loop -t ext2 initrd /mnt # (5) 不要なディレクトリを削除 rm -r /mnt/lost+found # (6) 用意していたファイルシステムをコピー cp -a FD/* /mnt # (7) ファイルリストを出力 ls -lR /mnt/* >~/lslR.txt # (8) ループデバイスをアンマウント umount /mnt # (9) RAMディスク用のファイルを圧縮 gzip -9 initrd
initrd.gz の変更
initrd.gz の内容を変更する場合は次のようにします。フロッピーディスクから適当なディレクトリに initrd.gz をコピーしておいて次の操作でフロッピーディスクの内容を変更します。
# (1) RAMディスク用のファイルを展開 gzip -d initrd.gz # (2) 展開したファイルをループデバイスとしてマウント mount -o loop -t ext2 ./initrd /mnt # (3) /mnt 以下のファイルに対して必要な操作を行う cp xxx /mnt # (4) RAMディスク用のファイルを圧縮 gzip -9 initrd
フロッピーディスクに initrd.gz をコピーして完了。/etc/init.vtl を変更すれば FD や CD から ブートして、直接アプリケーション(例えばゲーム) を起動することもできます。