关于IT运维技术的
最佳实践博客网站

理解 linux文件系统 中 inode与block 的关系

每个 inode与block 都有编号,其意义是:

  • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码;
  • block:实际记录文件的内容,若文件太大时,会占用多个 block 。

由于每个 inode与block 都有编号,而每个文件都会占用一个 inode,inode内则有文件数据放置的 block 号码。

inode具体包含的信息有

文件的字节数
文件拥有者的User ID
文件的Group ID
文件的读、写、执行权限
文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
链接数,即有多少文件名指向这个inode
文件数据block的位置

用stat命令,查看某个文件的属性以及inode信息

#语法:stat 文件名
[root@c65mini ~]# stat install.log.syslog 
  File: "install.log.syslog"
  Size: 3384        Blocks: 8          IO Block: 4096   普通文件
Device: 803h/2051d  Inode: 915715      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2014-04-21 20:52:58.022999102 +0800
Modify: 2014-04-21 20:55:24.096998922 +0800
Change: 2014-04-21 20:56:42.510998824 +0800

为什么看不到文件名呢?,因为Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。

#使用ls命令 -i参数查看文件名或目录名 来查看某文件或目录的inode对应的编号
[root@c65mini ~]# ls -ilh
总用量 6.7M
920626 -rw-r--r--  1 root root 1.6K 5月   4 09:32 111.tar.gz
918512 -rw-r--r--. 1 root root    0 4月  22 02:11 ab.txt
918508 -rw-------. 1 root root  936 4月  21 20:56 anaconda-ks.cfg
918505 -rw-r--r--  1 root root 183K 4月  23 14:04 beian.zip
920202 drwxr-xr-x  4 root root 4.0K 5月   4 01:07 ceshi
919394 -rw-r--r--  1 root root  212 5月   4 00:13 ceshi.tar.gz
920627 -rw-r--r--  1 root root 1.9K 5月   4 00:28 ceshi.zip.bz2
920189 -rw-r--r--  1 root root 3.0K 4月  23 13:37 check.pyc
920191 -rw-r--r--  1 root root 260K 4月  23 13:38 curl.exe
920215 -rw-r--r--  1 root root    0 5月   4 00:01 dasda.gz
920211 -rw-r--r--  1 root root    0 5月   1 20:58 filec.sh
920214 -rw-r--r--  1 root root  100 5月   1 21:03 filesh.sh

因此,如果能够找到文件的inode的话,那么自然就会知道这个文件所放置数据的block编号,当然也就能够读出该文件的实际数据了。这种文件系统的特性,效率非常高。这种特性就是索引式文件系统。如同查字典,看书的目录找内容一个道理,简单高效。

文件系统一开始就将 inode与block规划好了,除非重新格式化(或者利用resize2fs等命令变更文件系统大小),否则 inode 与 block 固定后就不再变动。

由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。

  1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
  2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。
  3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统是无法从inode号码得知文件名

block 是用来放置文件内容数据地地方

在 Ext2+文件系统中所支持的block大小有1K,2K及4K三种而已。在格式化时block的大小就固定了,且每个 block 都有编号,以方便 inode 的记录。

由于 block 大小的差异,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同

block与容量的关系

注意:实际生产环境block大小已经都是4k了,block实际使用的几个规则需要注意。

  • block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
  • 每个 block 内最多只能够放置一个文件的数据;
  • 如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
  • 如果文件小于 block ,则该 block的剩余容量就不能够再被使用了(磁盘空间会浪费)。

Linux运维面试题:

一个100M的磁盘分区,写入1K的文件或写入1M的文件,分别可以写入多少个?

分析:换算单位100M=1024000K ,1M=1024K 一个block=4K

如果写入1K的文件,由于1K的文件远小于1个block的大小,1个block就可以存一个1K的文件,所以1024000/4=25600 个文件.

如果写入1M的文件,优于1M的文件远大于1个block的大小,1个block存不下一个1M的文件,
因此,1M的文件需要1024/4=256个block块来存1M的文件,所以100M的空间最多能存1024000/256=400个文件.

假设你的Ext4文件系统使用 4K block ,而该文件系统中有 10000 个小文件,每个文件大小均为 50bytes, 请问此时你的磁盘浪费多少容量?

分析:单位换算,一个block大小为 4K=4096 bytes 远大于一个文件的大小50bytes

  因此一个block就浪费了 4096-50=4046,10000个文件就浪费10000*4046=40460000bytes
  换算单位:浪费了38M左右的容量。

总结: 大的 block 可能会产生较严重的磁盘容量浪费, 小的 block,那么大型文件将会占用数量更多的 block ,而 inode 也要记录更多的 block编号,此时将可能导致文件系统不良的读写效能。

block块可以用mkfs.extN -b 来制定快的大小, 每个block块最多可存放一个文件,所以一般block块的大小设置要根据我们服务器的应用了设置, 如果这个服务器较多用来存放一些多的小文件,那就可以把block块的大小设置的小一些,不至于浪费空间, 而当存放的都是大数据时就需要把block设置的大些,这样可以减少对磁盘block的读取次数,也可以减少inode的记录负担。

inode与block 的关系

block越大,inode越少,适合存储大文件的文件系统; block越小,inode越多,适合存储文件多而小的文件系统。

系统运行时,inode和block会在修改后内存与磁盘做一个同步,我们用ls -li列出来的内容这是内存中的暂存,所以有时候系统非正常的关机会导致block和inode的不同步问题。

资料参考:

https://vbird.dic.ksu.edu.tw/linux_basic/0230filesystem.php#indexed_allocation
https://www.ruanyifeng.com/blog/2011/12/inode.html
https://rilee.blog.51cto.com/467020/311962

赞(0)
未经允许不得转载:菜鸟HOW站长 » 理解 linux文件系统 中 inode与block 的关系

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址