下载解压源码:
ftp://ftp.infradead.org/pub/mtd-utils/mtd-utils-1.2.0.tar.bz2
http://www.zlib.net/zlib-1.2.3.tar.gz
http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz
2,编译安装zlib:
tar xzvf zlib-1.2.3.tar.gz
cd zlib-1.2.3
CC=arm-linux-gcc ./configure --shared --prefix=/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/
make
sudo make install
这里配置指向 /tools/gcc-3.4.5-glibc-2.3.6/arm-linux/ 目录,这是交叉编译器的路径
,生成的文件会自动安装在 /tools/gcc-3.4.5-glibc-2.3.6/arm-linux/ [include,lib] 目录下。
在include目录生成zlib.h和zconf.h,lib目录下生成 libz.so.1.2.3 等。
3,编译安装lzo:
tar xzvf lzo-2.03.tar.gz
cd lzo-2.03
CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/
make
make install
在/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/include目录下生成了一个 lzo 的文件夹,里面有很
多.h 文件。在 /tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib 目录下生成了liblzo.a的库文件。
4,编译mtd-utils
tar xzvf mtd-utils-1.2.0.tar.bz2
cd mtd-utils-1.2.0
1) 修改Makefile,更改 CROSS
CROSS=arm-linux-
把第46行的 make -C $(BUILDDIR)/ubi-utils
修改为 make -C ubi-utils
把第51行的 make -C $(BUILDDIR)/ubi-utils clean
修改为 make -C ubi-utils clean
2) make WITHOUT_XATTR=1
编译完成后,在 arm-linux目录下生成了 mkfs.jffs2 ,用如下命令查看文件:
#file mkfs.jffs2
mkfs.jffs2: ELF 32-bit LSB executable, ARM, version 1, for GNU/Linux 2.4.3,
dynamically linked (uses shared libs), not stripped
可知:交叉编译成功。
注意:这个mkfs.jffs2是在arm体系的cpu中运行的,在x86中并不能运行。
gcc版本为 4.3.x以上,编译不通过,请参考 http://patchwork.ozlabs.org/patch/12689 ,打补丁
本人非常不幸的将gcc版本升级到了4.3,打了这个补丁后还有个错误,需要修改 ubimirror.c 中 main
函数中最后的一个地方,如下:
if( rc ){
err_buf[sizeof err_buf - 1] = '\0';
fprintf(stderr, "%s\n", err_buf); /* 修改这行 */
if( rc < 0 )
rc = -rc;
}
后记:为目标板制作jffs2文件系统image方法:
如果host是x86的,target是arm,要在host上为target制作jffs2文件系统,应该使用host的mkfs.jffs2工具,
而不是使用target的mkfs.jffs2工具。host的mkfs.jffs2工具可以采用不交叉编译的方法得到(直接使用gcc
编译得到),或者使用命令安装: sudo apt-get install mtd-tools
------------------------------------------------------------------------------------------------------------------
下载:
或者使用命令:
块大小0x40000 256k
jffs2分区总空间0x500000即5M
当然生成的jffs2.img并没有一下子分配5M,还是实际大小0xc0000
Make a JFFS2 file system image from an existing directory tree
Options:
-p, --pad[=SIZE] 用16進制來表示所要輸出檔案的大小,也就是root.jffs2的size。
很重要的是, 為了不浪費flash空間, 這個值最好符合flash driver所規劃的區塊大小。
如果不足则使用0xff来填充补满。
-r, -d, --root=DIR 指定要做成image的源資料夾.(默认:当前文件夹)
-s, --pagesize=SIZE 节点页大小(默认: 4KiB)
-e, --eraseblock=SIZE 设定擦除块的大小为(默认: 64KiB)
-c, --cleanmarker=SIZE Size of cleanmarker (default 12)
-m, --compr-mode=MODE Select compression mode (default: priortiry)
-x, --disable-compressor=COMPRESSOR_NAME
Disable a compressor
-X, --enable-compressor=COMPRESSOR_NAME
Enable a compressor
-y, --compressor-priority=PRIORITY:COMPRESSOR_NAME
Set the priority of a compressor
-L, --list-compressors Show the list of the avaiable compressors
-t, --test-compression Call decompress and compare with the original (for test)
-n, --no-cleanmarkers 指明不添加清楚标记(nand flash 有自己的校检块,存放相关的信息。)
如果挂载后会出现类似:
CLEANMARKER node found at 0x0042c000 has totlen 0xc != normal 0x0
的警告,则加上-n 就会消失。
-o, --output=FILE 指定輸出image檔案的文件名.(default: stdout)
-l, --little-endian 指定使用小端格式
-b, --big-endian 指定使用大端格式
-D, --devtable=FILE Use the named FILE as a device table file
-f, --faketime Change all file times to '0' for regression testing
-q, --squash Squash permissions and owners making all files be owned by root
-U, --squash-uids 将所有文件的拥有者设为root用户
-P, --squash-perms Squash permissions on all files
--with-xattr stuff all xattr entries into image
--with-selinux stuff only SELinux Labels into jffs2 image
--with-posix-acl stuff only POSIX ACL entries into jffs2 image
-h, --help 显示这些文字
-v, --verbose Verbose operation
-V, --version 显示版本
-i, --incremental=FILE Parse FILE and generate appendage output for it
生成的rootfs.img可通过u-boot直接烧写至nand flash:
nand erase 0x200000 0x3e00000//擦写
tftp 0x30000000 rootfs.img//下载
nand write.jffs2 0x200000 $(filesize)//烧入
(二) 在linux的PC上挂载jffs2根文件系统映像
因为jffs2是构建于MTD设备上的文件系统,所以无法通过loop设备来挂载,但是可以通过mtdram设备来挂载。mtdram是在用RAM实现的MTD设备,可以通过mtdblock设备来访问。使用mtdram设备很简单,只要加载mtdram和mtdblock两个内核模块即可。这两个内核模块一般的linux内核发行版都有编译好的,直接用modprobe命令加载。
(3).这时将出现MTD设备/dev/mtdblock0,使用dd命令将jffs2根文件系统拷贝到/dev/mtdblock0设备中。
这之后就可以到/mnt/mtd目录查看、修改挂载的jffs2根文件系统了,修改后的jffs2根文件系统可以通过dd命令拷贝为一个jffs2的映像文件