18日目 その1

あまり書くことがなかったので、前回の5日目からいっきに飛んで18日目dirコマンド。
OS自作本の中ではFDをFAT12でフォーマットしてbootpackのイメージとかはそこにファイルとして保存してたので、dirコマンドではFDイメージを素直にFAT12と解釈して読み込むという実装になっている。
しかし自分は今までイメージを直接FDに書きこんできたため、要はFAT12を前提としているOS自作本のままのdir実装は使えない。さてどうしたもんか…

いまからFAT12に変更するのはあまりおもしろくないし、せっかくLinux上で作ってるのでなんかソレっぽい方法を取りたいってことで、以下の方針に決定。

  1. ループバックマウントを使用してext2のイメージファイルを作成
  2. イメージファイルをFDに書き込み
  3. メモリに展開されたイメージファイルからディレクトリ、ファイルを取得


さっそくext2イメージの作成から。
まずは100kB程度のファイルを作成。

$ dd if=/dev/zero of=root_fs bs=1k count=100
100+0 records in
100+0 records out
102400 bytes (102 kB) copied, 0.000674 seconds, 152 MB/s

root_fsという名前の102kBゼロ埋めファイルができました。


つぎにファイルをext2でフォーマット

$ /sbin/mke2fs root_fs
mke2fs 1.39 (29-May-2006)
root_fs is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
16 inodes, 100 blocks
5 blocks (5.00%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
16 inodes per group

Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

今回はブロックサイズその他のオプションはすべてデフォルト値に。


カレントディレクトリにmntというディレクトリを掘ってそこにroot_fsをループバックマウント。

$ mkdir ./mnt
$ mount -o loop root_fs ./mnt


dfでみると確かにマウントされてるのがわかる。
(ここでは/tmp以下で上記操作をおこなった)

$ df
(中略)
/tmp/root_fs               93        14        74  16% /tmp/mnt

あとは./mntに好きなようにファイルを格納してやればOK