zoukankan      html  css  js  c++  java
  • 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 ");
      return -1;
     }

     v = volume_find("rootfs_data");  // 查找rootfs_data 所在的卷
     if (!v) {
      fprintf(stderr, "no rootfs_data was found ");
      return -1;
     }

     mp = find_mount_point(v->blk, 1);   // 查找挂载点
     if (mp) {
      fprintf(stderr, "%s is mounted as %s, only erasing files ", v->blk, mp);
      foreachdir(mp, handle_rmdir);
      mount(mp, "/", NULL, MS_REMOUNT, 0);     // 重新挂载
     } else {
      fprintf(stderr, "%s is not mounted, erasing it ", 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

  • 相关阅读:
    RESTful API 介绍,设计
    golang web框架设计7:整合框架
    golang web框架设计6:上下文设计
    golang web框架设计5:配置设计
    golang web框架设计4:日志设计
    golang web框架设计3:controller设计
    golang web框架设计2:自定义路由
    golang web框架设计1:框架规划
    深入理解golang: channels
    服务端高并发分布式十四次架构演进之路
  • 原文地址:https://www.cnblogs.com/rohens-hbg/p/5604548.html
Copyright © 2011-2022 走看看