2011年10月20日木曜日

UBIFSを使ってみた その3

続き。

UBIFSのImageを作成する方法です。

FilesystemのImage自体は、他のFilesystemと同じで、mkfsを使用します。
# mkfs.ubifs –r rootfs_dir –x none –m 2048 –e 129024\
   –c 4096 –o rootfs.ubifs
これでrootfs_dirっていう名前のディレクトリの中身をrootfs.ubifsっていう名前のimageにします。

-mはminimum I/O unit sizeでFlashの書き込みサイズを入れる。
-eはlogical erase block sizeでFlashのブロックサイズ(消去)を入れる。
-cはmaximum logical erase block countでFlashのブロックの数を入れる。
ということで、↑の例は2Kずつアクセスできる512MBのNANDになります。

 

さて、FilesystemのImageを作った後に、このImageをUBI用に変換しなければいけないんです。
そのためにubinizeを使用します。

まずは、↓のようなconfigファイルを作って適当な名前(rootfs_ubi.cfg)で保存する。
-----------------------------------------------------------------
[rootfs-volume]
mode=ubi
image=rootfs.ubifs
vol_id=0
vol_size=128MB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
-----------------------------------------------------------------
その後、ubinizeを使ってUBI用に変換してあげる。
# ubinize –o rootfs.img –m 2048 –p 128KiB –s 512 rootfs_ubi.cfg
これで、rootfs.imgという名前のUBI用Imageが完成します。

 

完成したImageを書き込む為には、Target上でubiformatを使います。
# ubiformat /dev/mtd0 –f rootfs.img
これで、mtd0をUBIにしてrootfs.imgを書き込んだ状態になります。

# ubiattach /dev/ubi_ctrl –m 0
をすると、/dev/ubi0_0が既に出来てるはずです。

 

作ったubifsをrootfsとして起動したい場合、起動時のcommandに”ubi.mtd=0 root=ubi0:rootfs”を追加すると、mtd0をubi0としてattachして、mountしてくれます。

u-bootの場合は、環境変数bootcmdに追加すればOKです。

 

ざっと、こんな感じです。

きっと、未来の私が確認しにくることでしょう(`・ω・´)

5 件のコメント:

  1. はじめまして。突然ですが質問させていただきます。

    mkfs.ubifsの-cオプションで4096を指定されていますが、
    これで512MBのrootfsになりましたでしょうか?

    4044を指定したところdfコマンドで表示されたrootfsのサイズは
    461MBでした。
    ubifsについていまいちよくわかっていないのですが、
    圧縮されているためこのように少なく表示されるのでしょうか?

    返信削除
  2. はじめまして!
    まさかの新規コメントでビックリしました(^_^;)

    -cオプションは、ファイルシステムの最大サイズ(正確にはボリュームサイズ)を、LEB(Logical Erase Block)単位で入れます。

    最大サイズなので、実際に作成するimageのサイズとは異なります。

    例では512MBのNANDと書いてますが、ボリュームサイズと間違えてますね(・・;)
    暇な時に直しておきます。
    それまではコメント欄でご容赦を。

    ちなみに、圧縮は-xで指定が無い限りはLZOになるはずです。
    例では"-x none"なので、圧縮してません。

    オプションを変えれば、zlibやfavor LZOに変更できると思います。

    返信削除
  3. ご返信ありがとうございます。

    ubifsにはオーバーヘッドがあるようですね。
    http://processors.wiki.ti.com/index.php/UBIFS_Support#Calculations

    私の環境では
    SP = 128KB
    SL = 126KB
    P = 505MB / 128 = 4040
    B = 40.4
    なので計算すると約484MBのrootfsとなるはずなんですが、
    実際は461MBなんですよね。。
    計算ミスなのかなんなのか。。

    返信削除
  4. 何か話が合わないと思ったらdfでしたね(^_^;)
    imageのサイズと勘違いしました、失礼。

    ということは、mkfs.ubifsで作成したものをubinizeしてるはずなので、その際にvol_sizeで指定した値がdfで表示されるサイズになると思います。

    ご存知の通りoverheadがあるため、Flashの最大サイズ=ボリュームサイズには出来ないはずなので、ubinize時に若干小さい値を入れてると思いますよ。
    # autoresizeで少し変わるかも

    計算式については、ubiのdocumentに載ってるんですが、使用する時にそこまでこだわってもいなかったのですみませんが適当です(・・;)

    返信削除
  5. http://www.linux-mtd.infradead.org/faq/ubifs.html#L_mkfubifs
    >The configuration file also sets the "autoresize" volume flag,
    >which means that the volume will be automatically enlarged by UBI
    >to have the maximum possible size when it runs for the first time.

    "autoresize"を指定するとMAXまで拡大されるようですね。
    vol_sizeに490MiBを指定してみましたが、dfで表示したrootfsのサイズは
    461MBのままでした。

    Flash ROMの空き容量がひっ迫していたため増やそうとしたのですが、
    不要ファイル削除で空き容量を確保できそうです。

    どうもありがとうございました。
    ubifsに関する日本語の情報は少ないため、今後も参考にさせていただきます。

    返信削除