yaffs2 出现很多问题
cramfs
[zhangqing@localhost ~]$ sudo mkcramfs volume1 volume1_cramfs.img
Password:
warning: estimate of required size (upper bound) is 826MB, but maximum image size is 272MB, we might die prematurely
Directory data: 1356480 bytes
mkcramfs: filesystem too big
squashfs
sudo yum install mksqushfs*
应该是
sudo yum install squashfs*
五、生成一个cramfs
找到cramfs的toolchain。/mkcramfs -r $(FS1_DIR) $(FS_NAME).1
六、生成一个mksquashfs
找到squashfs的toolchain。/mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments -noI
收藏夹
製做squashfs檔案系統的指令很簡單,用法大致如下
%mksquashfs [source] [dest]
%mksquashfs ./fs squashfs.root
文章出处:DIY部落(http://www.diybl.com/course/6_system/linux/Linuxjs/20081117/151753.html)
Squashfs一般存放于nor flash中,但是也可以使用Nand flash存储squashfs文件系统,但是需要绕过坏块。
http://blog.csdn.net/lwzlemon/archive/2009/03/27/4030463.aspx
NAND for squashfs, 主要讲怎么在内核中增加BBT。
有个讲squashfs的官方网站,可能在收藏夹里面。
关于在android中添加squashfs的方法。
可选文件系统:
1. yaffs2
可读写
在新的nand flash上(确定没有坏块),使用最传统的
Debug kernel + flasherase_all mtd3 + tar xzvf
在启动后挂载yaffs2时仍然出现错误,怀疑是ecc的缘故。以后再试。
使用mkyaffs2image提示object arrays has not enough space,后换成mkfs.yaffs.x86,生成136M的镜像,但是在dnw到目标板上最后卡死。没有解决dnw下载大文件卡死的问题。已经确定不是内存不够的原因,有人说是电源不行,也已排除。
Squashfs
只读
最主要的是2.6.28的kernel没有squashfs的补丁。
使用mkfs.squash工具,生成squashfs的镜像,约300余M,大约1:3比率,也是存在无法dnw的问题,此问题可以用在debug kernel中flashcp –v 的方法解决,以后再试。
squashfs
sudo yum install mksqushfs*
应该是
sudo yum install squashfs*
找到squashfs的toolchain。/mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments -noI
Cramfs
只读
使用mkfs.cramfs工具,提示最大只能压缩为200M,而实际会有800M,失败。
cramfs
[zhangqing@localhost ~]$ sudo mkcramfs volume1 volume1_cramfs.img
Password:
warning: estimate of required size (upper bound) is 826MB, but maximum image size is 272MB, we might die prematurely
Ubifs
可读写
使用Debug kernel + flasherase_all mtd3 + tar xzvf 成功。
步骤如下:
4.1 在armsys6410的kernel中deviceàmtd-ànand选上[*] S3C NAND Hardware ECC。
4.2 制作debug kernel。
在armsys6410的menuconfig中选择initrd.img.cpio作为ramfs,编译。烧录到sd卡32个扇区,配合128M ram的sd bootloader。
使用下面命令行
flash_eraseall /dev/mtd3
ubiattach /dev/ubi_ctrl -m 3
ubimkvol /dev/ubi0 -N rootfs -s 1500MiB
mount -t ubifs ubi0_0 /mnt或mount -t ubifs ubi0:rootfs /mnt
拔出原2G卡,插入4G卡,有release的tar包,
Tar xzfv 0.1.2.tar.gz –C /mnt
因为根文件系统较大,解压缩需要30分钟时间。
Umount /mnt
Umount /home
4.3 烧入普通的kernel即可。
实际效果:
(initramfs):/# df -h
Filesystem Size Used Available Use% Mounted on
udev 34.6M 12.0K 34.6M 0% /dev
ubi0_0 1.4G 535.5M 867.1M 38% /mnt
使用flashcp -v和uboot下烧写ubifs.img需要注意下面一些参数:
我们的2G nand ubifs参数(在debug kernel里面获得):
Creating 4 MTD partitions on "NAND 2GiB 3,3V 8-bit":
0x00000000-0x00100000 : "bootloader"
0x00100000-0x00600000 : "recovery"
0x00600000-0x00900000 : "kernel"
0x00900000-0x80000000 : "filesystem"
UBI: attaching mtd3 to ubi0
UBI: physical eraseblock size: 262144 bytes (256 KiB)
UBI: logical eraseblock size: 258048 bytes
UBI: smallest flash I/O unit: 2048
UBI: VID header offset: 2048 (aligned 2048)
UBI: data offset: 4096
UBI: attached mtd3 to ubi0
UBI: MTD device name: "filesystem"
UBI: MTD device size: 2039 MiB
UBI: number of good PEBs: 8156
UBI: number of bad PEBs: 0
UBI: max. allowed volumes: 128
UBI: wear-leveling threshold: 4096
UBI: number of internal volumes: 1
UBI: number of user volumes: 1
UBI: available PEBs: 1975
UBI: total number of reserved PEBs: 6181
UBI: number of PEBs reserved for bad PEB handling: 81
UBI: max/mean erase counter: 2/1
Ubifs镜像烧录:
ubifs -r
-r, -d, --root=DIR build file system from directory DIR
-m, --min-io-size=SIZE minimum I/O unit size
-e, --leb-size=SIZE logical erase block size
通常是physical erased block size - 一个page(对于slc成立,对于mlc不成立)
subpage必须比mini io小,必须是2的n次方。
-c, --max-leb-cnt=COUNT maximum logical erase block count
-c 是总空间比如50M除以-e得到的结果
200 * 1024 * 1024 / 258048 = 812
256 NO
512 NO
2048 NO
mkfs.ubifs -r root -m 2048 -e 258048 -c 812 -o ubifs.img
ubinize -o ubi.img -m 2048 -p 256KiB -s 2048 /etc/ubinize.cfg
/etc/ubinize.cfg
[ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=200MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
这里面指定了volume size
主要实现损益均衡,逻辑擦除块、卷管理,坏块管理等。
由于采用了压缩方式,UBI文件系统占用的空间比yaffs要小,而且避免了nand flash中OOB数据的操作,使得移植变得简单,值得推荐.
1) 制作根文件系统,比如我们的根文件目录为rootfs
2) 生成ubi烧写映像
mkfs.ubifs -r rootfs -m 512 -e 15872 -c 7976 -o ubifs.img
3) 通过UBOOT制作UBI分区
目前最新的UBOOT已经支持UBI分区,进入UBOOT命令行
mtdparts default //加载默认分区表
- #define MTDPARTS_DEFAULT "mtdparts=nandflash0:320k(bootloader)," /
- "64k(params)," /
- "3m(kernel)," /
- "-(root)"
#define CONFIG_BOOTARGS "ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs console=ttySAC0 mem=64M init=/linuxrc"
内核的下载没有什么变化,不在叙述
- flash erase root //格式化分区,root为文件系统分区
- ubi part root //root分区作为ubi文件系统
- ubi create rootfs //创建UBI volume
- ubi write 0x30008000 rootfs 0x2f8000
现在UBI分区已经创建完毕,我们可以通过tftp等手段把ubifs.img下载到RAM中, 0x30008000 为下载的地址, 0x2f8000 为 长度,文件系统烧写完成,修改uboot中的内核启动参数为