loopデバイスが足りない
PCで大量の情報をダウンロードして、SquashFSやcramfsで固めてZaurus(SL-C3000)で持ち歩く、こんなことを繰り返すと、いつの間にか多数のイメージファイルが溜まってしまう。
斯く言う自分も以下のイメージファイルを持ち歩いている。
内容 | ファイル名 | FSタイプ |
---|---|---|
ワークドライブ | ext2-1.img | ext2 |
開発環境 | dev_img-1.3-2 | cramfs |
Python 2.4 | python24.sqfs | squashfs |
PHPマニュアル 2009-03-20 | php_manual_ja.sqhs | squashfs |
GM_Lite地図データ | gm_lite.sqfs | squashfs |
ところが、OS起動時に作成されるloopデバイスは2つしかないため、/etc/fstabに登録して起動時にマウントできるのは数が限られている。
そこで、rcスクリプトの仕組みを使ってOS起動時にイメージファイルのマウントを実行するシェルスクリプトを作成し、これをパッケージ化した。
download:boot-mntloop_0.1-1_arm.ipk
パッケージによってインストールされる/etc/rc.d/init.d/mntloopがシェルスクリプトである。
マウント処理は/etc/fstabの「#|」で始まるレコードしたがって実行される。
行頭の「#|」の2文字以降に続く各フィールドの形式は、以下の例のように通常の/etc/fstabと同じである。
# 次の行はOS起動時にマウントされる /dev/hda2 /hdd2 ext3 rw,noatime 0 2 # 次の行は単なるコメントアウト #/dev/hdb1 /hdd4 ext3 rw,noatime 0 2 # 次の行はmntloopによってマウントされる #|/hdd3/dev_img-1.3-2 /mnt/dev cramfs loop,ro,noatime 0 0 # 次の行はmntloopによってFSのチェックとマウント #|/hdd3/ext2-1.img /mnt/usr ext2 loop,rw,noatime 0 2
mntloopには以下の4通りの使用方法がある。
- mntloop start
/etc/fstabに「#|」で始まる全てのレコードに従ってマウント処理を実行する。
ただし、4番目のフィールドにnoautoが設定されていると処理をスキップする。
OS起動時にはこの方法で実行される。 - mntloop stop
/etc/fstabに「#|」で始まる全てのレコードに従ってアンマウント処理を実行する。
ただし、4番目のフィールドにnoautoが設定されていると処理をスキップする。
OS停止時にはこの方法で実行される。 - mntloop mount
指定されたtargetを/etc/fstabの「#|」で始まるレコードの1番目と2番目のフィールドから検索し、一致したレコードに従ってマウント処理を実行する。 - mntloop umount
指定されたtargetを/etc/fstabの「#|」で始まるレコードの1番目と2番目のフィールドから検索し、一致したレコードに従ってアンマウント処理を実行する。
download:boot-fsck_0.2-1_arm.ipk