zoukankan      html  css  js  c++  java
  • 文件系统简单理解与实操(ext4)

    一、理论部分

    首先建议读一下这篇简单有趣的文章:《这破玩意儿叫文件系统

    总结起来就是下面两张图:

       

    除此之外,ext4文件系统还有group表即GDT(块组描述符表)

    最终的文件系统模型是:

    ====================================================================

    所以要找到/var/log/messages的过程是:

    1. 找到根文件系统的块组描述符表所在的blocks,读取GDT(已在内存中)找到inode table的block号
    2. 在inode table的block中定位到根"/"的inode,找出"/"指向的data block。
    3. 在"/"的datablock中记录了var目录名和指向var目录文件inode的指针,并找到该inode记录,inode记录中存储了指向var的block指针,所以也就找到了var目录文件的data block。
    4. 在var的data block中记录了log目录名和其inode指针,通过该指针定位到该inode所在的块组及所在的inode table,并根据该inode记录找到log的data block。
    5. 在log目录文件的data block中记录了messages文件名和对应的inode指针,通过该指针定位到该inode所在的块组及所在的inode table,并根据该inode记录找到messages的data block。
    6. 最后读取messages对应的datablock。

    简言之:找到GDT-->找到"/"的inode-->找到/的数据块读取var的inode-->找到var的数据块读取log的inode-->找到log的数据块读取messages的inode-->找到messages的数据块并读取它们。

    二、实践

    准备:虚拟机增加一块盘sdb;有一个5G分区sdb1,文件系统为ext4,挂载在/media。/media下有个文件:/media/log

    实验:通过inode查询log,就相当于cat /media/log 背后的操作,便于理解上面查看/var/log/messages那段话

    首先要获取文件系统的基本信息:dump2fs  /dev/sdb1

      block size=4k  一个块的大小是4k

      inode size=256B  一个inode的大小是256B,所以一个块有4K/256B=16个inode

      group0的 Inode table at 673-1184 (+673)  即块号(673-1184)存放的是inode和数据块

    根的inode是从2号inode开始的(inode1被用作统计坏块了: Inode 1 is used to keep track of any bad blocks on the disk)

    [root@shenlin ~]# stat /media  (这里/media就是sdb1的根)
    File: ‘/media’
    Size: 4096 Blocks: 8 IO Block: 4096 directory
    Device: 811h/2065d Inode: 2 Links: 4
    Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)

    每个块的地址是从(0x0000~0x1000)

    综上inode2在第673号block,偏移量offset=(inode-1)*256B=256B换算成16进制就是0x0100;即inode2的范围是(0x0100~0x0200)

    使用:dd if=/dev/sdb1 bs=4096 skip=673|hexdump -C -n 4096  显示第673号块的二进制数据

    根据inode的定义(参见inode结构体),该inode指向的块是00 00 22 a1 (从右往左)换算成十进制是8865号块

     dd if=/dev/sdb1 bs=4096 skip=8865 |hexdump -C -n 4096

     根据inode的定义,找到log的inode号为0c转换成十进制为:12

    inode12的地址偏移量是(12-1)*256B=2816 转换成十六进制是0xb00,即inode12在第673号block,地址范围是(0xb00~0xc00)

    inode12指向的数据块地址为00008281,转换为十进制33409

    至此,我们成功通过inode找到了log文件!

    参考链接:

    https://blog.csdn.net/Chasing_Chasing/article/details/82260641

    https://www.cnblogs.com/sstjustdoit/p/10135281.html

    https://www.sohu.com/a/229842067_467784

    https://zhidao.baidu.com/question/1116212835792844459.html

  • 相关阅读:
    中文分词技术
    布隆过滤器(Bloom Filter)详解
    真正理解Mysql的四种隔离级别
    从内核文件系统看文件读写过程
    如何评价腾讯开源的消息中间件TubeMQ?
    零拷贝(Zero-copy)及其应用详解
    深入了解RabbitMQ
    (四)下载利器aria2
    (三)轻量级文件服务器filebrowser
    log4j 2整理
  • 原文地址:https://www.cnblogs.com/qiantang/p/15117163.html
Copyright © 2011-2022 走看看