柳大的Linux讲义·基础篇(2)Linux文件系统的inode

《柳大的Linux讲义·基础篇》来自柳大的CSDN博客,转载请注明原文链接:http://blog.csdn.net/poechant/article/details/7214926


   要想理解Linux文件系统,首先要理解的就是inode。什么是inode?往下看吧。


1Linux文件系统的最基本数据结构:inodeblock

1)背景

   由于Linux系统是多用户多的,所以文件系统类型多样化是在所难免的。从ext2开始,是将文件属性和文件内容分开存储的,分别由inodeblock来负责。


2inode

   用于存储文件的各属性,包括:

    - 所有者信息:文件的ownergroup

    - 权限信息:readwriteexcite

    -时间信息:建立或改变时间(ctime)、最后读取时间(atime)、最后修改时间(mtime);

    - 标志信息:一些flags

    - 内容信息:typesize,以及相应的block的位置信息。

   注意:不记录文件名或目录名,文件名或目录名记录在文件所在目录对应的block里。


3block

   用来存储文件的内容。


4)创建目录或文件

   当创建一个目录时,文件系统会为该目录分配一个inode和至少一个block。该inode记录该目录的属性,并指向那块block。该block记录该目录下相关联的文件或目录的关联性和名字。

   当创建一个文件时,文件系统会为该文件分配至少一个inode和与该文件大小相对应的数量的block。该inode记录该文件的属性,并指向block

   如果一个目录中的文件数太多,以至于1block容纳不下这么多文件时,Linux的文件系统会为该目录分配更多的block

   (各block之间形成链表?)


5)读取目录或文件

   当我们告知操作系统一个文件的路径后,操作系统是如何找到这个文件的呢?首先操作系统会调用文件系统的相应接口,接下来:

   递归说法:当读取一个文件或目录X时,提供给文件系统的是一个路径P。文件系统会先读取X所在的目录Dinode_d(注意这里,其实是这一操作的递归过程),通过inode_d获得其对应的block_d,在block_d中通过已知的X的名称,查询到Xinode_x

    迭代说法;如果读取的是/x1/x2/x3/x4/x5这个文件,则先读取根目录的inode_root,然后找到inode_root对应的block_root,在block_root中根据x1这个名字找到x1对应的inode_x1,然后找到inode_x1对应的block_x1,在block_x1中根据x2这个名字找到inode_x2,再找到block_x2,然后根据x3找到inode_x3,再block_x3,根据x4找到inode_x4,再block_x4,再根据x5找到inode_x5,再block_x5,就读取到我们要的x5的内容了。


2、分区

1)分区结构

    分区(partition)在被Linux的文件系统(比如ext2)格式化的时候,会分成inode tableblock table两部分,且大小都是固定的。该分区的所有inode都在inode table里,所有block都在block table里。


2)块大小

    ext2允许的block size1024bytes2048bytes4096bytes


3inode大小

    ext2一般默认给inode预设的大小为128bytes


4)预设分区

    一个T bytes的分区,设定每个blockB bytes,每个inodeI bytes。如果假设平均每个文件占用两个block的话,那么inode的数量就应该设定为T/(2B+I)个,即inode tableT*I/(2B+I) bytesblock tableT*B/(2B+I) bytes。所以一个分区的文件系统所能容纳的文件数量,被限制于该分区的文件系统的inode area中的inode数。

    如果一个分区大小为1GB,每个block4KB,一个inode128B,并假设平均每个文件占用2block。那么inode的数量为1GB/(8KB+128B)=129055.5,即129055。那么inode table的大小为129055*128B=15.75MB。所以按照这样的规划,如果一个1GB的磁盘,那么格式化后,就已经有15.75MB被使用了。

   大文件应用场景:block设置的小一些,inode设置的多一些。比如新闻组、BBS等。

   小文件应用场景:block设置的大一些,inode设置的少一些。比如图片分享网站。


3、查看本机的文件系统信息

   使用dumpe2fs命令可以查看分区的文件系统的相关信息。比如我在我的一台测试机上查看sda1,可以输入:

dumpe2fs /dev/sda1


   会得到如下内容,一些信息已经标注在注释里了。


1)文件系统基本信息


#该分区的文件系统的名称

Filesystem volumn name: MAIN


#上次的挂载点

Last mounted on: <not available>


#文件系统的通用唯一标识符

Filesystem UUID: <none>


#文件系统的

Filesystem magic number: 0xEF53


#修订版本号

Filesystem revision #: 1 (dynamic)


Filesystem features: has_journal needs_recovery

Filesystem flags: signed_directory_hash

Default mount options: (none)


#文件系统状态

Filesystem state: clean


#发生错误后的行为

Errors behavior: Continue


#操作系统

Filesystem OS type: Linux


2)结构信息


#Inode总数

Inode count: 1313312


#Block总数

Block count: 1313305


#保留block

Reserved block count: 65665


#空闲block

Free blocks: 979164


#空闲inode

Free inodes: 1298415  


#第一个block的编号

First block: 0


#block的大小

Block size: 4096


#fragment的大小

Fragment size: 4096


#每个groupblock数是32K

Blocks per group: 32768


#每个groupfragment数是32K

Fragments per group: 32768


#每个groupinode

Inodes per group: 32032


#每个groupinode blocks

Inode blocks per group: 1001


3)访问信息


#上次挂载时间

Last mount time: Wed Jan 25 00:32:14 2012


#上次写时间

Last write time: Wed Jan 24 00:32:14 2012


#挂载数

Mount count: 11


#最大挂在数

Maximum mount count: 20


#上次检查文件系统时间

Last checked: Sat Oct 31 22:52:33 2009


#检查文件系统时间间隔

Check intervalle: 15552000 (6 months)


#下一次检查文件系统的时间

Next check after: Thu Apr 29 22:52:33 2010


#对保留块有权限的用户ID

Reserved blocks uid: 0 (user root)


#对保留快有权限的组ID

Reserved blocks gid: 0 (group root)


#第一个inode

First inode: 11


#每个inode大小

Inode size:128


#日志inode

Journal inode: 8


#日志大小为32M

Journal size: 32M


4group信息 

Group 0: (Blocks 0-32767)

  Primary superblock at 0,Group descriptors at 1-1

  Block bitmap at 2 (+2), Inode bitmap at 3 (+3)

  Inode table at 4-1004 (+4)

  0 free blocks, 32019 free inodes, 2 directories

  Free blocks:

  Free inodes: 14-32032

Group 1: (Blocks 32768-65535)

  Backup superblock at 32768, Group descriptors at 32769-32769

  Block bitmap at 32770 (+2), Inode bitmap at 32771 (+3)

  Inode table at 32772-33772 (+4)

  3 free blocks, 32032 free inodes, 0 directories

  Free blocks: 33773-33775

  Free inodes: 32033-64064

Group 2: (Blocks 65536-98303)

  Backup superblock at 65536, Group descriptors at 65537-65537

  Block bitmap at 65538 (+2), Inode bitmap at 65539 (+3)

  Inode table at 65540-66540 (+4)

  3 free blocks, 32032 free inodes, 0 directories

  Free blocks: 66541-66543

  Free inodes: 64065-96096

Group 3: (Blocks 98304-131071)

  Backup superblock at 98304, Group descriptors at 98305-98305

  Block bitmap at 98306 (+2), Inode bitmap at 98307 (+3)

  Inode table at 98308-99308 (+4)

  3 free blocks, 32031 free inodes, 0 directories

  Free blocks: 99309-99311

  Free inodes: 96098-128128

Group 4: (Blocks 131072-163839)

  Backup superblock at 131072, Group descriptors at 131073-131073

  Block bitmap at 131074 (+2), Inode bitmap at 131075 (+3)

  Inode table at 131076-132076 (+4)

  0 free blocks, 32032 free inodes, 0 directories

  Free blocks:

  Free inodes: 128129-160160

...

Group 40: (Blocks 1310720-1313304)

  Backup superblock at 1310720, Group descriptors at 1310721-1310721

  Block bitmap at 1310722 (+2), Inode bitmap at 1310723 (+3)

  Inode table at 1310724-1311724 (+4)

  1580 free blocks, 32032 free inodes, 0 directories

  Free blocks: 1311725-1313304

  Free inodes: 1281281-1313312


    可见,各Group对应的blocks(注意每个block的大小是4096bytes

    - Group 00:       0(0x000000) -   32767(0x007FFF):    0K =  0 * 32K

    - Group 01:   32768(0x008000) -   65535(0x00FFFF):   32K =  1 * 32K

    - Group 02:   65536(0x010000) -   98303(0x017FFF):   64K =  2 * 32K

    - Group 03:   98304(0x018000) -  131071(0x01FFFF):   96K =  3 * 32K

    - Group 04:  131072(0x020000) -  163839(0x027FFF):  128K =  4 * 32K

    …

    - Group 40: 1310720(0x140000) - 1313304(0x147FFF): 1280K = 40 * 32K


    40group一共的大小,是40*32K*4KB = 5GB


4、文件系统结构

    结合上面命令的输出结果,一个分区一般含有多个block group,比如上面看到的40个。而每个block group都有superblockgroup descriptionblock bitmapinode bitmapinode tabledata blocks,比如上面的Backup Superblock占用1block4KB)、Group descriptors占用1block4KB)、Block bitmap占用1block1KB)、Inode bitmap占用1block1KB)、Inode table占用1001block512.5KB)。

    Superblock记录整个partitionblockinode的总量,已使用和未使用的inodeblock的数量,1block1inode的大小,filesystem的挂载时间/最后写入时间/最后检查时间、标示该文件系统是否被挂载的valid bit0标示未挂载,1标示已挂载)。是MBR中的Superblockbackup

    Group descriptors描述由何处开始记录数据,是MBR中的Group descriptorsbackup

    Block bitmap记录哪个block是空闲的。

    Inode bitmap记录哪个inode是空闲的。

    Inode table存放inode数据。

    Data blocks存放block数据。

    如下图:



(注:图取自《鸟哥的Linux私房菜》)


《柳大的Linux游记·基础篇》来自柳大的CSDN博客,转载请注明原文链接:http://blog.csdn.net/poechant/article/details/7214926

-

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钟超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值