• ext4文件系统由文件的inode号定位其inode Table


    在ubuntu中(以16.06为例),stat filename 可以查看文件的inode数值,但是如何确定该inode项具体在哪个块组下的inode Table中不是那么容易,接下来通过一步步计算来获取该inode具体在哪个块组下的inode Table的第几项。

    1.首先可以通过dumpe2fs查看当前ext4文件系统的结构信息,命令为

     

    1. dumpe2fs /dev/sdax             其中sdax为linux系统分区    


    可获取如下类似信息:

     

    1. Filesystem volume name:   <none>    
    2. Last mounted on:          /    
    3. Filesystem UUID:          0fbdfdd4-80ea-4962-84e8-9173c5ef1cb5    
    4. Filesystem magic number:  0xEF53    
    5. Filesystem revision #:    1 (dynamic)    
    6. Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize    
    7. Filesystem flags:         signed_directory_hash     
    8. Default mount options:    user_xattr acl    
    9. Filesystem state:         clean    
    10. Errors behavior:          Continue    
    11. Filesystem OS type:       Linux    
    12. Inode count:              6037504    
    13. Block count:              24146432    
    14. Reserved block count:     1207321    
    15. Free blocks:              20876199    
    16. Free inodes:              5787665    
    17. First block:              0    
    18. Block size:               4096    
    19. Fragment size:            4096    
    20. Reserved GDT blocks:      1018    
    21. Blocks per group:         32768    
    22. Fragments per group:      32768    
    23. Inodes per group:         8192    
    24. Inode blocks per group:   512    
    25. Flex block group size:    16    
    26. Filesystem created:       Sun Jan  8 01:10:30 2017    
    27. Last mount time:          Sat Feb 18 11:26:16 2017    
    28. Last write time:          Sat Feb 18 19:26:08 2017    
    29. Mount count:              150    
    30. Maximum mount count:      -1    
    31. Last checked:             Sun Jan  8 01:10:30 2017    
    32. Check interval:           0 (<none>)    
    33. Lifetime writes:          31 GB    
    34. Reserved blocks uid:      0 (user root)    
    35. Reserved blocks gid:      0 (group root)    
    36. First inode:              11    
    37. Inode size:           256    
    38. Required extra isize:     28    
    39. Desired extra isize:      28    
    40. Journal inode:            8    
    41. First orphan inode:       2250909    
    42. Default directory hash:   half_md4    
    43. Directory Hash Seed:      4c440967-7d09-4b9b-b3be-74a8d8bc47ca    
    44. Journal backup:           inode blocks    
    45. Journal features:         journal_incompat_revoke    
    46. Journal size:             128M    
    47. Journal length:           32768    
    48. Journal sequence:         0x0001f82e    
    49. Journal start:            1    


    根据这些信息,和文件的inode号,基本就可以定位该文件的inode信息具体在哪个块组中以及该块组的inode Table的第几项。

     

    例如

     

    1. root@heaven:~# stat test    
    2.   File: 'test'    
    3.   Size: 5           Blocks: 8          IO Block: 4096   regular file    
    4. Device: 805h/2053d  Inode: 2228474     Links: 1    
    5. Access: (0664/-rw-rw-r--)  Uid: ( 1000/  heaven)   Gid: ( 1000/  heaven)    
    6. Access: 2017-02-18 16:22:31.496609901 +0800    
    7. Modify: 2017-02-18 16:22:07.728197004 +0800    
    8. Change: 2017-02-  



    可知test文件的inode 号为2228474.

    1. (2228474-1)/8192(一个块组的inode数)=272,即该inode 落在第272块组内 
    2. (2228474-1)%8192=249,即为该inode在某个inode Table的第249项
    3. 272×32768(一个块组共有32768块)=8912896,得该文件inode落在第272块组的起始块为8912896


    8912896只是第272块组的起始块,要想进一步定位该块组的inode Table具体偏移位置,还需了解对于ext4文件系统来说一个标准的块组的布局顺序。这可以通过dumpe2fs命令查看。

    由于我的ubuntu 下的ext4文件系统的块组的block Bitmap、inode Bitmap以及inode Table是每16个块组为单位放在16个块组的首块组中,比如0-15块组的所有block Bitmap、inode Bitmap以及inode Table均放在第0块组内,16-31块组的block Bitmap、inode Bitmap以及inode Table均放在第16块组内。我们知道block Bitmap和inode Bitmap占一个block,而inode Table 占固定大小的blocks(我的为512blocks)。而272刚好是16的倍数,所以块组的布局如下:

     

    1. 8912896至8912911为16个block Bitmap  
    2. 8912912至8912927为16个inode Bitmap  
    3. 8912928至8912928+511第272个块组的inode Table

    所以从8912928开始偏移oxf900处即为test文件inode全部信息存放处。通过dd命令截取从8912928开始的512块,命令如下:

     

    1. dd if=/dev/sda5 ibs=4096 skip=8912928 count=512 of=inode_table  



    从0000f900开始数,偏移第60字节处为0xc7f5 5300,即为test文件数据块指针,由于ext4采用小端存储,所以实际应该是0x0053f5cf,通过debugfs命令可以验证,如下:

     

    1.          Triple Indirect Block    [0] 

    至此,已经完成从一个文件的inode 追踪到起anode Table 的全过程。

    Original Link: http://blog.csdn.net/yiqiaoxihui/article/details/55683328

  • 相关阅读:
    第5课.异步通知
    第4课.poll机制
    第3课.Linux异常处理体系结构
    第2课.字符设备驱动程序的开发
    第1课.Linux驱动的概述
    [Linux驱动]字符设备驱动学习笔记(二)———实例
    [linux驱动]linux块设备学习笔记(三)——程序设计
    [Linux驱动]字符设备驱动学习笔记(一)
    [linux驱动]proc学习笔记(一)
    [linux驱动][Linux内存]DMA学习笔记一
  • 原文地址:https://www.cnblogs.com/oskb/p/8027670.html
Copyright © 2020-2023  润新知