ubuntu下修改yaffs2文件系统镜像文件
来源:互联网 发布:淘宝分流最多设置多少 编辑:程序博客网 时间:2024/06/06 14:20
原地址:http://www.tjworld.net/wiki/Linux/Kernel/SimulateNandMtdDevice
对原博客的修改:将写mtd设备命令:sudo dd if=system.img of=/dev/mtdblock0 改成sudo nandwrite -a -o /dev/mtd0 system.img
Simulate NAND MTD Device
When working on embedded devices, especially Android-based smart-phones, tablets, and similar, it is sometimes useful to be able to create, modify, and examine binary images created for the device’s NAND Flash storage. This is usually a Memory Technology Device (MTD).
YAFFS
Many Android devices use YAFFS/YAFFS2 (Yet Another Flash File System) for the recovery, system, and data partition images. YAFFS/YAFFS2 are friendly to the wear characteristics of Flash devices and implement - in the case of YAFFS2 - a fully sequential log-based file-system (A log-based file system means that every write to the device is to the next free location and any changes to existing files are implemented by markers that indicate patches to the original file, rather than over-writing or freeing the original location in a random-access process such as is used by ext2/3/4, vfat, and so on).
Building YAFFS
YAFFS is not part of the mainline Linux kernel yet, so it has to be built separately. Fortunately this a simple operation: fetch the code, configure it for multi-version support, and make:
git clone git://www.aleph1.co.uk/yaffs2cd yaffs2ln -s yportenv_multi.h yportenv.hmake make -C /lib/modules/2.6.38-8-generic/build M=/home/all/SourceCode/yaffs2 modules make[1]: Entering directory `/usr/src/linux-headers-2.6.38-8-generic' CC [M] /home/all/SourceCode/yaffs2/yaffs_mtdif.o CC [M] /home/all/SourceCode/yaffs2/yaffs_mtdif2_multi.o CC [M] /home/all/SourceCode/yaffs2/yaffs_mtdif1_multi.o CC [M] /home/all/SourceCode/yaffs2/yaffs_packedtags1.o CC [M] /home/all/SourceCode/yaffs2/yaffs_ecc.o CC [M] /home/all/SourceCode/yaffs2/yaffs_vfs_multi.o CC [M] /home/all/SourceCode/yaffs2/yaffs_guts.o CC [M] /home/all/SourceCode/yaffs2/yaffs_packedtags2.o CC [M] /home/all/SourceCode/yaffs2/yaffs_tagscompat.o CC [M] /home/all/SourceCode/yaffs2/yaffs_checkptrw.o CC [M] /home/all/SourceCode/yaffs2/yaffs_nand.o CC [M] /home/all/SourceCode/yaffs2/yaffs_nameval.o CC [M] /home/all/SourceCode/yaffs2/yaffs_allocator.o CC [M] /home/all/SourceCode/yaffs2/yaffs_bitmap.o CC [M] /home/all/SourceCode/yaffs2/yaffs_attribs.o CC [M] /home/all/SourceCode/yaffs2/yaffs_yaffs1.o CC [M] /home/all/SourceCode/yaffs2/yaffs_yaffs2.o CC [M] /home/all/SourceCode/yaffs2/yaffs_verify.o CC [M] /home/all/SourceCode/yaffs2/yaffs_summary.o LD [M] /home/all/SourceCode/yaffs2/yaffs2multi.o Building modules, stage 2. MODPOST 1 modules CC /home/all/SourceCode/yaffs2/yaffs2multi.mod.o LD [M] /home/all/SourceCode/yaffs2/yaffs2multi.ko make[1]: Leaving directory `/usr/src/linux-headers-2.6.38-8-generic'
We now have the yaffs2multi.ko kernel module ready to install:
sudo make mi make -C /lib/modules/2.6.38-8-generic/build M=/home/all/SourceCode/yaffs2 modules_install make[1]: Entering directory `/usr/src/linux-headers-2.6.38-8-generic' INSTALL /home/all/SourceCode/yaffs2/yaffs2multi.ko DEPMOD 2.6.38-8-generic make[1]: Leaving directory `/usr/src/linux-headers-2.6.38-8-generic'
The module can now be loaded like any other module, and has parameters we might want to use:
modinfo yaffs2multi filename: /lib/modules/2.6.38-8-generic/extra/yaffs2multi.ko license: GPL author: Charles Manning, Aleph One Ltd., 2002-2011 description: YAFFS2 - a NAND specific flash file system srcversion: 614E40AFECA0383D5D06FA4 depends: mtd vermagic: 2.6.38-8-generic SMP mod_unload modversions 686 parm: yaffs_trace_mask:uint parm: yaffs_wr_attempts:uint parm: yaffs_auto_checkpoint:uint parm: yaffs_gc_control:uint parm: yaffs_bg_enable:uint
Mount YAFFS images
One thing that can’t be done (yet) with YAFFS is something many Linux hackers are used to doing - mounting a file-system image on the loop file system:
sudo mount -t yaffs2 -o loop system.img
this failed to work as expected
This silently fails to do what is expected. What we have to do is create a NAND/MTD device simulator in memory large enough to contain the image we wish to mount.
NAND Simulator
There is a technique, however, that can achieve the same end result - albeit not as cleanly. It depends upon the kernel having been built with the mtdblock, nandsim and other supporting modules. A typical Ubuntu kernel will have these modules available. This example creates a 256MB NAND device using 512-byte erase-blocks, copies the contents of the system.img YAFFS partition image into it, then mounts it so the file system can be accessed like any other.
For larger devices, the system may not have enough memory to adequately back the simulated device with RAM, therefore it is possible to tell nandsim to use a file as the backing store. I’ve done that here for a 256MB device:
sudo modprobe mtdblocksudo modprobe nandsim first_id_byte=0x20 second_id_byte=0x71 cache_file=/tmp/nandsim.binsudo modprobe yaffs2multicat /proc/mtd dev: size erasesize name mtd0: 10000000 00004000 "NAND simulator partition 0"#sudo dd if=system.img of=/dev/mtdblock0 sudo nandwrite -a -o /dev/mtd0 system.img 463650+0 records in 463650+0 records out 237388800 bytes (237 MB) copied, 11.0737 s, 21.4 MB/smkdir -p mnt/systemsudo mount -t yaffs2 /dev/mtdblock0 mnt/systemls -l system total 56 drwxr-xr-x 2 tj tj 12288 2011-06-10 03:26 app drwxr-xr-x 2 tj tj 4096 2011-06-10 03:26 bin -rw-r--r-- 1 tj tj 4598 2011-06-10 03:26 build.prop drwxr-xr-x 5 tj tj 4096 2011-06-10 03:26 customize drwxr-xr-x 11 tj tj 4096 2011-06-10 03:26 etc drwxr-xr-x 2 tj tj 4096 2011-06-10 03:26 fonts drwxr-xr-x 2 tj tj 4096 2011-06-10 03:26 framework drwxr-xr-x 6 tj tj 4096 2011-06-10 03:26 lib drwxr-xr-x 4 tj tj 4096 2011-06-10 03:26 media drwxr-xr-x 6 tj tj 4096 2011-06-10 03:26 usr drwxr-xr-x 2 tj tj 4096 2011-06-10 03:26 xbin
The size of the NAND device can be set by changing the ID bytes passed to the nandsim module on loading. I have these in a modprobe.conf file at /etc/modprobe.d/nandsim.conf:
# Simulate a 256MB 512-byte erase-block sized MTD device backed by a file on disk, not RAMoptions nandsim first_id_byte=0x20 second_id_byte=0x71 cache_file=/tmp/nandsim.bin
A range of useful sizes can be set, and there is a YAFFS test script that details many of them in the YAFFS source-code in the script linux-tests/initnamdsim:
#!/bin/shmodprobe mtdmodprobe mtdblockcase $1 in 16MiB-512 ) modprobe nandsim first_id_byte=0x20 second_id_byte=0x33 ;; 32MiB-512 ) modprobe nandsim first_id_byte=0x20 second_id_byte=0x35 ;; 64MiB-512 ) modprobe nandsim first_id_byte=0x20 second_id_byte=0x36 ;; 128MiB-512 ) modprobe nandsim first_id_byte=0x20 second_id_byte=0x78 ;; 256MiB-512 ) modprobe nandsim first_id_byte=0x20 second_id_byte=0x71 ;; 64MiB-2048 ) modprobe nandsim first_id_byte=0x20 second_id_byte=0xa2 third_id_byte=0x00 fourth_id_byte=0x15 ;; 128MiB-2048 ) modprobe nandsim first_id_byte=0xec second_id_byte=0xa1 third_id_byte=0x00 fourth_id_byte=0x15 ;; 256MiB-2048 ) modprobe nandsim first_id_byte=0x20 second_id_byte=0xaa third_id_byte=0x00 fourth_id_byte=0x15 ;; 512MiB-2048 ) modprobe nandsim first_id_byte=0x20 second_id_byte=0xac third_id_byte=0x00 fourth_id_byte=0x15 ;; 1GiB-2048 ) modprobe nandsim first_id_byte=0xec second_id_byte=0xd3 third_id_byte=0x51 fourth_id_byte=0x95 ;; * ) echo "No nand config specified. Need one of:" echo " 16MiB-512, 32MiB-512, 64MiB-512, 128MiB-512, 256MiB-512, 64MiB-2048, 128MiB-2048, 256MiB-2048, 512MiB-2048, 1GiB-2048" return 1esaccat /proc/mtd
- ubuntu下修改yaffs2文件系统镜像文件
- 一步一步制作yaffs/yaffs2根文件系统(五)---生成yaffs/yaffs2镜像文件及下载到开发板
- 一步一步制作yaffs/yaffs2根文件系统--生成yaffs/yaffs2镜像文件及下载到开发板
- 一步一步制作yaffs/yaffs2根文件系统(五)---生成yaffs/yaffs2镜像文件及下载到开发板
- 一步一步制作yaffs/yaffs2根文件系统(五)---生成yaffs/yaffs2镜像文件及下载到开发板
- 一步一步制作yaffs/yaffs2根文件系统(五)---生成yaffs/yaffs2镜像文件及下载到开发板
- 一步一步制作yaffs/yaffs2根文件系统(五)---生成yaffs/yaffs2镜像文件及下载到开发板
- 利用busybox制作yaffs2 根文件系统镜像
- Uboot烧写内核镜像和yaffs2文件系统
- 制作并烧写 cramfs和yaffs2文件系统镜像
- 制作yaffs2文件系统映像文件
- linux 2.6.10下添加yaffs2文件系统
- 解析jffs2文件系统镜像文件
- 创建 修改镜像文件
- ubuntu挂在镜像文件
- android: 制作system.img(yaffs2) 镜像
- android: 制作system.img(yaffs2) 镜像
- 制作system.img(yaffs2) 镜像
- POJ3624
- 8_25 设置用户id或组id的程序绝对不能再调用system函数。安全漏洞
- JS实现货币格式化、货币繁体汉字化
- nginx与HA
- Eclipse转IDEA遇到的问题
- ubuntu下修改yaffs2文件系统镜像文件
- Linux学习20_每天一个linux命令(9):touch 命令
- CodeForces-588A Duff and Meat
- IT成长之路必学技能
- MySQL5.6安装步骤(windows7/8_64位)
- 脚本新选择——用C做脚本
- MVC原理小结
- SELinux深入理解
- vmstat 命令