2008年11月22日 星期六

Linux : block2mtd - SATA SSD/USB flash disk 模擬成MTD device

在一般的Embedded Linux中會用flash當作儲存裝置, 通常會使用MTD device來access底下的Flash. 而在MTD上面會選擇一些Flash file system如CarmFS, JFFS2, YAFFS, UBIFS等等.

最近在Flash disk上面, 又有新的硬體可以選擇, 那就是SATA SSD或USB flash disk. 不過對Linux來說, 這兩各硬體裝置, 他是把他們模擬成SCIS裝置, 所以在Linux下面是把他當作一般的硬碟來使用. 也就是說上面的檔案系統跑的是EXT2/EXT3.

但是EXT2/EXT3並不是設計給Flash而是給一般的硬碟使用. 因為Flash在物理特性上跟硬碟不一樣. 例如, Flash寫入是以Block為單位, 所以相同的資料要儘量放在一起, 以增加寫入的效率. 而硬碟就不需要考慮這樣的事情. 所以在SSD上面用EXT2多少會有點問題, 雖然廠商在controller上面有做一些機制. 但是不見得是最好的.

但是如果想要使用專門設計給Flash用的flie system, 就會遇到一各問題, 目前的flash filesystem都是架構於MTD device, 而SSD則是一般的block device. 所以在Linux Kernel就會有block2mtd的模組, 將block device模擬成MTD device.

1. 在Linux Kernel condifuration加入block2mtd

MTD_BLOCK2MTD = y


2. 將SSD/USB disk 轉成MTD device.

modprobe block2mtd block2mtd=/dev/sda1


3. 這時候我們就可以將JFFS2 Image寫入, 並且mount

dd if=jffs2.img of=/dev/mtd0
mount -t jffs2 /dev/mtdblock0 /mnt


如果想要在開機時, 就直接把SSD當作root filesystem. 可以加入下面的Kernel options

root=/dev/mtdblock0 rootfstype=jffs2 block2mtd.block2mtd=/dev/sda1


參考資料:
block2mtd usage info for Linux 2.6.16
Linux MTD SOP