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 から ブートして、直接アプリケーション(例えばゲーム) を起動することもできます。