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です。

 

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

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

2011年10月19日水曜日

UBIFS使ってみた その2

続き。
実際にUBIFSを使う方法です。

まずは環境。

kernelがUBIやUBIFSに対応していないとお話にならないので、kernelのmake menuconfigで内容の確認です。
↓ の2つが有効になってれば大丈夫だと思います。

---------------------------------------------------------
Device Drivers --->
    Memory Technology Device (MTD) support --->
        UBI – Unsorted block images --->
            <*> Enable UBI

File systems --->
    Miscellaneous filesystems --->
        <*> UBIFS file system support
---------------------------------------------------------

それから、image作成したり、formatしたりと操作するために、mtd-utilsに内包されている、ubi-utilsが必要になります。

ソースをmtd-utilsのrepositoryからdownloadして、Host用とTarget用の二種類makeして作成してください。

出来上がったものをHostとTargetのPathが通ってるところにコピーしてください。

 

UBIの使い方。

UBIを介してMTDにアクセスする為には、ubiattachでubiのdeviceを作成 and MTDと関連付けをしてあげる必要があります。

例えば、/dev/mtd1に対してattachする場合は、
# ubiattach /dev/ubi_ctrl –m 1
を実行すると、/dev/ubi0が作成されます。

/dev/ubixのxは、defaultだとattach順になりますが、-d optionを使用すると任意の番号になります。

UBIはvolumeというpartitionみたいなものをdevice毎に持ってます。
/dev/ubi0の中に複数のファイルシステムを作り、管理することが可能です。

例えば”testfs”という名前のvolumeを作成するにはubimkvolを使って、
# ubimkvol /dev/ubi0 –N testfs –m
と実行すると、/dev/ubi0_0が作成されます。

mountする際は、/dev/ubi0_0を指定しても大丈夫ですが、volume名を指定してもmountできます。
# mount –t ubifs ubi0:testfs /mnt
こんな感じです。

volumeを消したい時はubirmvol、MTDとの関連付けを外したい時はubidetachを使用します。

ただUBIを使いたいだけだったらこれだけでも十分だとは思いますが、やっぱり組込で開発していると、予め作成したimageファイルを書き込むのが一般的だと思います。

imageの作成方法や書き込み方はUBIFSの作成の仕方と一緒に書こうと思っていますが、なんだか文章が長くなってしまったので、続きは後ほどその3に書きます。

 

・・・お昼休み終わっちゃってるし (;・∀・)

2011年10月18日火曜日

UBIFS使ってみた その1

約1年ぶりの更新です。

1年前に腰を壊して以来、ずーっと放置してました(-_-;)
おかげで、英英辞典のやつは3日坊主になってますね・・・。

ぼちぼちゆっくりと更新していきまする。

 

さて、表題のUBIFSの話。

UBIFSはUBI専用のファイルシステムで、
”UBIFS may be considered as the next generation of the JFFS2 file-system.”
多分JFFS2の次の世代(後継と読んだ方がいいのかな?)になると考えてるらしい、MTD (Memory Technology Device) 用のファイルシステムです。

ではUBIとは何か?というと、”Unsorted Block Images”の略で、MTDと各ファイルシステムの間に入って、データを順番にではなく色んな場所に分けて書き込み(ウェアレベリング)をしてくれるものです。

Flash Memoryって簡単に言うと、コンデンサの周りを絶縁体で固めて漏電しないようにした物の集合体みたいなもので、書き込みする時は電子を貫通させてるんですね。
何回も貫通させてると劣化して書きこめなくなっちゃうんです。
同じところばっかり書き換えしていると、部分的に劣化してしまったりします。

よくPCで使用されているFATやNTFS等は部分的に壊れて(bad block)読めなくなってしまうと、他の様々なファイルも読めなくなっちゃいます。

SSD等は中に入ってるコントローラがウェアレベリングしてくれてるので大丈夫なんですが、NANDをそのまま使う組込の世界では、ファイルシステムで吸収してあげないといけないのですね。

そこで生まれたのがJFFS2やYAFFS2といったウェアレベリング対応のファイルシステムで、UBIはその機能をMTDとファイルシステムの間に入れることで、どんなファイルシステムでも使えるようにしよう!としたもの・・・だと思います。

でもFTLじゃないよ!!”UBI is not a Flash Translation Layer” って公式の説明には書いてありましたw

↓ は公式サイトにあるDocumentから持ってきた図。

ubi

 

困った事に、簡単な説明を書いただけで随分と長めの文章になってしまったので、使い方等は明日書こうかなと思います。

備忘録になるので忘れずに!
意外と過去の自分の記事って自分に役立つなぁって開発中に思いました。