jffs2reset 实现分析
在脚本 reset2default中看到如下内容:
#!/usr/bin/lua
local hwm = require "hwm"
hwm.myexec("jffs2reset -y")
os.exit(0)
不知道 jffs2reset 的功能,百度一下,发现介绍的也很少,在此,自己研究一下。
首先,执行命令 “jffs2reset -y”, 可以得到如下结果:
root@hbg:/# jffs2reset -y
/dev/mtdblock3 is mounted as /overlay, only erasing files
可以得知,执行结果后,/dev/mtdblock3的内容被擦除。
查看分区
root@hbg:/# cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 00040000 00010000 "u-boot"
mtd1: 00010000 00010000 "u-boot-env"
mtd2: 00e30000 00010000 "rootfs"
mtd3: 00a10000 00010000 "rootfs_data"
mtd4: 00150000 00010000 "kernel"
得知,mtd3中的内容为 rootfs_data, 也就是设备的相关配置部分。
查看jffs2reset的源代码(位于fstools-2015-02-25.1中):
文件为 jffs2reset.c
int main(int argc, char **argv)
{
     if (!strcmp(*argv, "jffs2mark"))
         return jffs2_mark(argc, argv);
     return jffs2_reset(argc, argv);     // 带的参数为“-y”,因此走这个分支
}
查看函数 jffs2_reset, 可得如下:
static int
jffs2_reset(int argc, char **argv)
{
 struct volume *v;
 char *mp;
 if (ask_user(argc, argv))   // 查看默认参数是否为"-y", 若否,则需要打印使用信息
  return -1;
 if (find_filesystem("overlay")) {    // 查找overlay所在的分区
  fprintf(stderr, "overlayfs not found\n");
  return -1;
 }
 v = volume_find("rootfs_data");  // 查找rootfs_data 所在的卷
 if (!v) {
  fprintf(stderr, "no rootfs_data was found\n");
  return -1;
 }
 mp = find_mount_point(v->blk, 1);   // 查找挂载点
 if (mp) {
  fprintf(stderr, "%s is mounted as %s, only erasing files\n", v->blk, mp);
  foreachdir(mp, handle_rmdir);
  mount(mp, "/", NULL, MS_REMOUNT, 0);     // 重新挂载
 } else {
  fprintf(stderr, "%s is not mounted, erasing it\n", v->blk);
  volume_erase_all(v);
 }
 return 0;
}
其中,find_filesystem("overlay")时调用的在 /proc/filesystems 中查找
root@hbg:/# cat /proc/filesystems 
nodev   sysfs
nodev   rootfs
nodev   bdev
nodev   proc
nodev   tmpfs
nodev   debugfs
nodev   sockfs
nodev   pipefs
nodev   anon_inodefs
nodev   devpts
        squashfs
nodev   ramfs
nodev   jffs2
nodev   overlayfs
nodev   mtd_inodefs
        ext3
        ext2
        ext4
        ntfs
        vfat
root@hbg:/#
而 mp = find_mount_point(v->blk, 1); 则是查找 /proc/mounts, 其中v->blk 的值为 overlay
root@hbg:/# cat /proc/mounts 
rootfs / rootfs rw 0 0
/dev/root /rom squashfs ro,relatime 0 0
proc /proc proc rw,noatime 0 0
sysfs /sys sysfs rw,noatime 0 0
tmpfs /tmp tmpfs rw,nosuid,nodev,noatime 0 0
/dev/mtdblock3 /overlay jffs2 rw,noatime 0 0
overlayfs:/overlay / overlayfs rw,relatime,lowerdir=/,upperdir=/overlay 0 0
tmpfs /dev tmpfs rw,relatime,size=512k,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
debugfs /sys/kernel/debug debugfs rw,noatime 0 0
后记:
起始相当于命令 :
mtd -r erase rootfs_data
                    
                
                
            
        
浙公网安备 33010602011771号