inode — 关于Linux文件的存储

参考文章 :

  1. http://www.ruanyifeng.com/blog/2011/12/inode.html
  2. http://www.cnblogs.com/vamei/p/3506566.html
  3. http://linux.vbird.org/linux_basic/0230filesystem.php#harddisk-inode

inode

Linux文件系统中,每个文件都有一个inode与之对应。inode中包含一个文件的元信息,比如文件字节数,文件拥有者, 文件读写权限等。可以用stat命令来查看一个文件的元信息,比如

stat Makefile
#>   文件:"Makefile"
#>   大小:1983        块:8          IO 块:4096   普通文件
#> 设备:817h/2071d    Inode:5381531     硬链接:1
#> 权限:(0664/-rw-rw-r--)  Uid:( 1000/  xuyang)   Gid:( 1000/  xuyang)
#> 最近访问:2016-04-13 15:52:24.026285434 +0800
#> 最近更改:2016-03-20 10:53:15.879924757 +0800
#> 最近改动:2016-03-20 10:53:15.903924878 +0800
#> 创建时间:-

inode 的大小

inode本身也会消耗硬盘空间,系统在格式化的时候,把硬盘分为了两个区间,一个是INODE区域,一个是数据区。

查看一个硬盘分区的inode总数和已经使用的数量,使用df命令:

df . -i
#> 文件系统         Inode 已用(I) 可用(I) 已用(I)% 挂载点
#> /dev/sdb7      6553600  668976 5884624      11% /

查看每个inode节点的大小:

sudo dumpe2fs -h /dev/sdb7 | grep "Inode size"
#> dumpe2fs 1.42.12 (29-Aug-2014)
#> Inode size:            256

根据以上输出,可知/dev/sdb7上总共有6553600个inode,即650万,也就是在这张盘上最多可以存储这么多文件。如果 这么多inode用完了,但是磁盘还没有用完,那么也不能新建文件了。

那么上面这种情况会不会发生呢?

sudo dumpe2fs /dev/sdb7  | head -50
#> dumpe2fs 1.42.12 (29-Aug-2014)
#> Filesystem volume name:   <none>
#> Last mounted on:          /
#> Filesystem UUID:          67a219d3-5462-4434-8c97-90f9dccf5432
#> Filesystem magic number:  0xEF53
#> Filesystem revision #:    1 (dynamic)
#> 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
#> Filesystem flags:         signed_directory_hash 
#> Default mount options:    user_xattr acl
#> Filesystem state:         clean
#> Errors behavior:          Continue
#> Filesystem OS type:       Linux
#> Inode count:              6553600
#> Block count:              26214400
#> Reserved block count:     1310720
#> Free blocks:              5428870
#> Free inodes:              5885133
#> First block:              0
#> Block size:               4096
#> Fragment size:            4096
#> Reserved GDT blocks:      1017
#> Blocks per group:         32768
#> Fragments per group:      32768
#> Inodes per group:         8192
#> Inode blocks per group:   512
#> Flex block group size:    16
#> Filesystem created:       Fri Feb 19 18:50:10 2016
#> Last mount time:          Thu Apr 14 08:38:27 2016
#> Last write time:          Thu Apr 14 16:38:24 2016
#> Mount count:              70
#> Maximum mount count:      -1
#> Last checked:             Fri Feb 19 18:50:10 2016
#> Check interval:           0 (<none>)
#> Lifetime writes:          256 GB
#> Reserved blocks uid:      0 (user root)
#> Reserved blocks gid:      0 (group root)
#> First inode:              11
#> Inode size:            256
#> Required extra isize:     28
#> Desired extra isize:      28
#> Journal inode:            8
#> First orphan inode:       5381281
#> Default directory hash:   half_md4
#> Directory Hash Seed:      037ccdf7-ea99-4f3e-ad64-c89e442d87ab
#> Journal backup:           inode blocks
#> Journal features:         journal_incompat_revoke
#> 日志大小:             128M
#> Journal length:           32768
#> Journal sequence:         0x00061afa
#> Journal start:            9721

我们看到Block count = 2621万。二者相除: block_count / Inode_count = 4

平均下来每个inode占用四个block(block size = 4096),也就是4K × 4 = 16K。 也就是说平均文件的大小为16K。

如果系统中有太多的小文件(比如小于4K的文件),那么很可能发生inode用完而block没有用完的情况。

文件的存储方法

上面看到每个文件对应与一个inode,而每个inode中会记录文件的元信息以及该文件所占用的block索引。但是每个inode的 大小只有256bytes,如果一个文件的大小有400M,那么它所占用的block数就是400M/4K = 40万,只靠这256bytes是远远不够的, 在这种情况下,inode会使用block来记录index数据。如下图所示:

如图中所示,前面inode会直接记录block的index,而后面的三个index记录的不是直接的数据index,而是指向存储index的数据 块。而最后一个更是使用了三层index,这样使得单个文件的内容可以变得很大。但总归,一个文件系统定下来之后,它所能存储的 最大文件大小是确定的。

因为以上这种存储方式,文件特别大的时候,访问也会变慢。



本文地址: http://www.bagualu.net/wordpress/archives/6297 转载请注明




发表评论

电子邮件地址不会被公开。 必填项已用*标注