一、环境准备:

1、ubuntu系统安装f2fs-tools:sudo apt-get install -y f2fs-tools

2、使用系统loop设备进行实践操作:

dd if=/dev/zero of=device bs=4K count=51200 //200M
losetup /dev/loop0 device      //寻址可用的loop设备
mkfs.f2fs -l f2fs /dev/loop0   //格式化此loop设备
mount -t f2fs /dev/loop0 ./f2fs_mp //挂载到f2fs_mp文件夹

  

3、获取挂载初始状态:dd if=/dev/loop0 of=f2fs_test,可以通过UE打开f2fs_test查看。

4、新建如下文件,以及对应的inode:

  root@ubuntu:/home/yinpeng/f2fs_mp# ls -i

  91 1.c     92 2.txt     87 a.txt     93 bio.c

二、磁盘布局分解:

1、superBlock:

  F2FS文件的起始地址向后偏移0x400字节,寻址当前地址为所述超级块SuperBlock的起始地址。

在内存的存储方式是小端存储,有两个superblock如下:

对应的结构体信息如下:

struct f2fs_super_block {

__le32 magic;                        /* Magic Number */

0xF2F52010

__le16 major_ver;                /* Major Version */

0x01

__le16 minor_ver;                /* Minor Version */

0x0B

__le32 log_sectorsize;                /* log2 sector size in bytes */

0x09

__le32 log_sectors_per_block;        /* log2 # of sectors per block */

0x03

__le32 log_blocksize;                /* log2 block size in bytes */

0x0C

__le32 log_blocks_per_seg;        /* log2 # of blocks per segment */

0x09

__le32 segs_per_sec;                /* # of segments per section */

0x01

__le32 secs_per_zone;                /* # of sections per zone */

0x01

__le32 checksum_offset;                /* checksum offset inside super block */

0x00

__le64 block_count;                /* total # of user blocks */

0xC800

__le32 section_count;                /* total # of sections */

0x5C

__le32 segment_count;                /* total # of segments */

0x63

__le32 segment_count_ckpt;        /* # of segments for checkpoint */

0x02

__le32 segment_count_sit;        /* # of segments for SIT */

0x02

__le32 segment_count_nat;        /* # of segments for NAT */

0x02

__le32 segment_count_ssa;        /* # of segments for SSA */

0x01

__le32 segment_count_main;        /* # of segments for main area */

0x5C

__le32 segment0_blkaddr;        /* start block address of segment 0 */

0x0200

__le32 cp_blkaddr;                /* start block address of checkpoint */

0x0200

__le32 sit_blkaddr;                /* start block address of SIT */

0x0600

__le32 nat_blkaddr;                /* start block address of NAT */

0x0A00

__le32 ssa_blkaddr;                /* start block address of SSA */

0x0E00

__le32 main_blkaddr;                /* start block address of main area */

0x1000

__le32 root_ino;                /* root inode number */

0x03

__le32 node_ino;                /* node inode number */

0x01

__le32 meta_ino;                /* meta inode number */

0x02

__u8 uuid[16];                        /* 128-bit uuid for volume */

***

__le16 volume_name[MAX_VOLUME_NAME];        /* volume name */

F2FS

__le32 extension_count;                /* # of extensions below */

0X0001B

__u8 extension_list[F2FS_MAX_EXTENSION][F2FS_EXTENSION_LEN];/* extension array */

0x00

__le32 cp_payload;

//0x0

__u8 version[VERSION_LEN];  /* the kernel version */

//4.9.117+ #4 SMP PREEMPT Sat May 25 01:40:39 CST 2019

__u8 init_version[VERSION_LEN]; /* the initial kernel version */

//4.9.117+ #4 SMP PREEMPT Sat May 25 01:40:39 CST 2019

__le32 feature;         /* defined features */

//0x0

__u8 encryption_level;      /* versioning level for encryption */

//0x0

__u8 encrypt_pw_salt[16];   /* Salt used for string2key algorithm */

//0x0

struct f2fs_device devs[MAX_DEVICES];   /* device list */

//0x0

__le32 qf_ino[F2FS_MAX_QUOTAS]; /* quota inode numbers */

//0x0

__u8 hot_ext_count;     /* # of hot file extension */

//0x0

__u8 reserved[310];     /* valid reserved region */

//0x0

__le32 crc;         /* checksum of superblock */

//0x0

} __packed;

2checkpoint:

checkpoint的数量也有两个:

struct f2fs_checkpoint {

__le64 checkpoint_ver;                /* checkpoint block version number */

0x1052B10E

__le64 user_block_count;        /* # of user blocks */

0x7A00

__le64 valid_block_count;        /* # of valid blocks in main area */

0x13

__le32 rsvd_segment_count;        /* # of reserved segments for gc */

0x15

__le32 overprov_segment_count;        /* # of overprovision segments */

0x1F

__le32 free_segment_count;        /* # of free segments in main area */

0x56

__le32 cur_node_segno[MAX_ACTIVE_NODE_LOGS];

0x0.1.2.0xFFFFFFFF.FFFFFFFF.FFFFFFFF.FFFFFFFF.FFFFFFFF

__le16 cur_node_blkoff[MAX_ACTIVE_NODE_LOGS];

0X2F.10.2.0x00. 0x00. 0x00. 0x00. 0x00. 0x00

__le32 cur_data_segno[MAX_ACTIVE_DATA_LOGS];

0x03. 0x47. 0x16. FFFFFFFF. FFFFFFFF. FFFFFFFF. FFFFFFFF. FFFFFFFF

__le16 cur_data_blkoff[MAX_ACTIVE_DATA_LOGS];

0X85. 0x1AB. 0x00. 0x00. 0x00. 0x00. 0x00. 0x00

__le32 ckpt_flags;                /* Flags : umount and journal_present */

0x01C4

__le32 cp_pack_total_block_count;        /* total # of one cp pack */

0x04

__le32 cp_pack_start_sum;        /* start block number of data summary */

0x01

__le32 valid_node_count;        /* Total number of valid nodes */

0x05

__le32 valid_inode_count;        /* Total number of valid inodes */

0x05

__le32 next_free_nid;                /* Next free node number */

0x61

__le32 sit_ver_bitmap_bytesize;        /* Default value 64 */

0x40

__le32 nat_ver_bitmap_bytesize; /* Default value 256 */

0x40

__le32 checksum_offset;                /* checksum offset inside cp block */

0x0FF

__le64 elapsed_time;                /* mounted time */

0x019289

unsigned char alloc_type[MAX_ACTIVE_LOGS];

0x00

unsigned char sit_nat_version_bitmap[1];

0x00

} __packed;

3、SIT:

0xC01 >> 10 =  3 type

0xC01 & 0x3FF =  1

/** Note that f2fs_sit_entry->vblocks has the following bit-field information.* [15:10] : allocation type such as CURSEG_XXXX_TYPE* [9:0] : valid block count*/
struct f2fs_sit_entry {__le16 vblocks;                            /* reference above */__u8 valid_map[SIT_VBLOCK_MAP_SIZE]; /* bitmap for valid blocks */__le64 mtime;                            /* segment age for cleaning */
} __packed;

dump.f2fs    -s    0~-1    f2fs_test_2

root@ubuntu:/home/yinpeng# cat dump_sit

segment_type(0:HD, 1:WD, 2:CD, 3:HN, 4:WN, 5:CN)

segno:       0        vblocks:  1        seg_type:3        sit_pack:2

//1segment = 512 block

00  10  00  00  00  00  00  00  00  00  00  00  00  00  00  00

00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00

00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00

00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00

segno:       1        vblocks:  2        seg_type:4        sit_pack:2

用户层的数据从0x100000开始:

1000000 + 1*2MB(segmet size) + (8*5 + 3) * 4Kb(block size) =

0x1000000 + 0x200000 + 0x2B000 = 0x122B000

0x18 = 0x00011000

00  00  00  00  00  18  00  00  00  00  00  00  00  00  00  00

00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00

00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00

00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00

segno:       2        vblocks:  0        seg_type:5        sit_pack:2

segno:       3        vblocks:  1        seg_type:0        sit_pack:2

0x1000000 + 3 * 2MB + (14*8 + 4) * 4kb = 74000

0x1000000 + 0x600000 + 74000

0x08 = 0x00001000

00  00  00  00  00  00  00  00  00  00  00  00  00  00  08  00

00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00

00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00

00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00

segno:       4        vblocks:  0        seg_type:1        sit_pack:2

segno:       5        vblocks:  0        seg_type:1        sit_pack:2

从上面的分解,可以看到通过如下流程可以找到DataBlock的地址:

Superblock -> NAT -> inode number  ->  datablock

4.NAT

struct f2fs_nat_entry {__u8 version;     /* latest version of cached nat entry */__le32 ino;     /* inode number */__le32 block_addr;    /* block address */
} __packed;struct f2fs_nat_block {struct f2fs_nat_entry entries[NAT_ENTRY_PER_BLOCK];
} __packed;

dump.f2fs   -n   0~-1    f2fs_test_2

root@ubuntu:/home/yinpeng# cat dump_nat

nid:    3        ino:    3        offset:    0        blkaddr:      4111 //0x122A 000        pack:2

nid:   87        ino:   87        offset:    0        blkaddr:      4651 //0x122B        pack:2

nid:   91        ino:   91        offset:    0        blkaddr:      4652 //0x122C        pack:2

nid:   92        ino:   92        offset:    0        blkaddr:      4653 //0x122D        pack:2

nid:   93        ino:   93        offset:    0        blkaddr:      4654 //0x122E        pack:2

5、DataBlock:


root@ubuntu:/home/yinpeng# dump.f2fs -a 0~-1 f2fs_test_2

root@ubuntu:/home/yinpeng# cat dump_ssa

/* a summary entry for a 4KB-sized block in a segment */
struct f2fs_summary {__le32 nid;        /* parent node id */union {__u8 reserved[3];struct {__u8 version;       /* node version number */__le16 ofs_in_node;    /* block index in parent node */} __packed;};
} __packed;

参考博客:

https://blog.csdn.net/SweeNeil/article/details/91897016

作者:frank_zyp
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文无所谓版权,欢迎转载。

F2FS文件系统二 实验分析f2fs文件系统相关推荐

  1. 文件系统(二)—如何设计一个文件系统

    前面一章主要学习了文件系统的存储和分配方式的理论知识,本章接着理论知识,如何设计一个文件系统(本章不涉及任何代码实现),其主要的内容包括如下: 如何一步步设计一个文件系统,了解文件系统由那些组成 当我 ...

  2. 使用BusyBox制作根文件系统的理论分析

    以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 一.inittab文件介绍 #first:run the system script file ::sysinit:/etc/init.d/ ...

  3. 操作系统实验四:文件系统

    一.实验目的 1.熟悉Linux文件系统的文件和目录结构,掌握Linux文件系统的基本特征: 2.模拟实现Linux文件系统的简单I/O流操作:备份文件. 二.实验环境 Linux系统 三.实验内容 ...

  4. 【AWSL】之Linux文件系统与日志分析(inode、恢复EXT类型的文件、恢复XFS类型的文件)

    序言 这里我主要介绍Linux文件系统与日志分析 文件系统与日志分析 序言 一.inode与block 1. 概述 ①inode的内容 ②inode号码 ③文件存储 ④inode的大小 ⑤inode的 ...

  5. Linux文件系统与日志分析(inode、inode节点耗尽故障处理、文件备份和恢复、日志文件管理)

    Linux文件系统与日志分析 一.inode和block概述 1.文件和扇区 2.块(block) 3.文件数据 二.inode(索引节点) 1.inode的内容 2.inode的号码 3.inode ...

  6. linux 虚拟文件系统 源码,Linux内核源代码情状分析-虚拟文件系统

    Linux内核源代码情景分析-虚拟文件系统 我们先来看两张图: 第一张是VFS与具体文件系统的关系示意图: 第二张是Linux文件系统的层次结构: 特殊文件:用来实现"管道"的文件 ...

  7. Linux——(渗透理解)文件系统与日志分析

    文件系统与日志分析超简单 一.Linux系统中的 inode 与 block 1.1 inode 和 block 1.2 查找文件对应的inode(内容) 1.3 inode的大小 inode总结 二 ...

  8. linux文件系统和日志分析!

    linux文件系统和日志分析 一.inode和block block(块) inode(索引节点) inode的元信息 简述文件的读取过程 inode的特殊作用 stat命令 二.硬链接与软链接 硬链 ...

  9. linux开发 | 根文件系统构建实验及过程详解

    <2.uboot和系统移植-第19部分-2.19.根文件系统构建实验及过程详解> 第一部分.章节目录 2.19.1.根文件系统的构建路线 2.19.2.busybox的移植实战 2.19. ...

  10. 日志文件系统及性能分析

    一.概述 所谓日志文件系统是在传统文件系统的基础上,加入文件系统更改的日志记录,它的设计思想是:跟踪记录文件系统的变化,并将变化内容记录入日志.日志文件系统在磁盘分区中保存有日志记录,写操作首先是对记 ...

最新文章

  1. 清华大学精密仪器系:智能传感器太重要了!
  2. python 爬带端口的网站_程序员带你爬取爬虫最爱扒的网站数据。快来看!
  3. 多分类问题中混淆矩阵(Confusion Matrix)的Matlab画法
  4. BZOJ3083: 遥远的国度(树链剖分)
  5. HTML基础第四讲---图像
  6. esp8266手机端app_OKEX手机端APP提币教程(附视频)
  7. 如何种植屡获殊荣的青豆
  8. jboss入门_JBoss Forge NetBeans集成–入门
  9. C# winform 窗体怎么隐藏标题栏,不显示标题栏
  10. php 二维数组传递给 js 问题解决记录
  11. Salesforce.com + AutoCAD WS集成研究集锦
  12. 第四季-专题10-字符设备驱动模型
  13. excel文件下载下来损坏 js_javascript-下载XLSX损坏
  14. VS2019+DCMTK3.6.6环境配置
  15. Quartus-II实现D触发器的三种方式
  16. Python人工智能学习路线(长篇干货)
  17. ES6--Reflect
  18. 修改游戏服务器ip,修改游戏 服务器ip地址
  19. 微信企业号接入微信支付
  20. 不同介质中的运动目标检测(虚拟潜望镜)

热门文章

  1. 智鹰科技——无人机线路巡检系统商业计划书
  2. AD9371+ZYNQ结构中JESD204B IP核的AXI_STREAM接口数据结构
  3. 快递100码json
  4. 北京联通IPTV机顶盒管理密码
  5. 大数据工程师简历_大数据毕业生简历该怎么写?
  6. labview支持python免费_ni labview 2018
  7. sm3 算法java_java sm3加密算法
  8. 踩坑内核参数tcp_tw_recycle
  9. Android JS 通过X5WebView相互调用详解
  10. python中pdfplumber解析pdf_Python中pdfplumber如何提取pdf中的表格数据