Linux-文件之inode

一、什么是空洞文件?


+=======+-------+====+

start        end        a         b   


  1. 定义:从文件结尾到新写入的文件之间的这段空间被称之为:文件空洞,如上图中从end到a之间的一段就是文件空洞。

  2. 空洞文件必须满足2个条件:

    (1)写文件时超出文件结尾

    (2)超出之后继续写文件

  3. lseek()系统调用可以改变文件的偏移量,但如果程序调用使得文件偏移量跨越了文件结尾,然后再执行I/O操作,将会发生什么情况? read()调用将会返回0,表示文件结尾。令人惊讶的是,write()函数可以在文件结尾后的任意位置写入数据

  4. 文件空洞不会占用任何磁盘块,当在文件空洞中写入了数据时,文件系统才会为之分配磁盘块。空洞的存在意味着一个文件名义上的大小可能要比其占用的磁盘存储总量要大(有时大出许多)。向文件空洞中写入字节,内核需要为其分配存储单元,即使文件大小不变,系统的可用磁盘空间也将减少。

  5. 常用命令如下,可见du命令可以查看一个文件准确的占用磁盘空间的大小,ls -l 命令不准确

ls -l aaa.txt        查看文件逻辑大小,包含了空洞文件的大小

du -c aaa.txt     查看文件实际占用的blok块数量

du -h aaa.txt     查看文件实际占用的磁盘块空间大小,与命令du -c会一一对应 

du -h --max-depth=1 /home/admin

od -c aaa.txt     查看文件存储的ascii内容 



二、文件inode是什么?


  1. 文件存储是以块为单位的,文件创建者、创建日期、文件大小、链接数(即有多少文件名指向这个inode)等元数据存储在inode中,中文叫索引节点,总之,除了文件名以外的所有文件信息,都存在inode之中

  2. inode与存储数据的文件是一一对应的

  3. 硬链接,如下图所示文件名2、文件名3都是文件名1的硬链接,多个文件名指向同一个inode,删除任意一个文件名,不会影响其他文件名访问文件,建立硬链接


ln 原文件 目标文件


文件名1-------------+

                               \|/

文件名2 ---------> inode ---------->   数据

                               /|\

文件名3------------- +



    4. 软连接,如下图所示,文件名2是文件名1的软链接,文件名2的文件中存储了访问数据1的路径,两个文件名指向不同的inode。所以当文件名1被删除后,文件名2中存储的路径也就无法访问了,建立软链接


ln -s 原文件 目标文件


文件名1---------->inode1 ---------->  数据1

                              

文件名2 --------->inode2 ---------->   数据2(存储了访问数据1的路径)


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

(1) 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。

(2)移动文件或重命名文件,只是改变文件名,不影响inode号码。

(3)打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

    6. 常用命令如下

stat  ./aaa.txt        查看文件的inode信息,如硬链删除一个,其链接数就会减一

ls -i ./aaa.txt         查看某个文件的inode号

df -i                       查看文件分区inode的使用情况



三、df与dh的区别


  1. df命令可以显示目前所有文件系统的可用空间及使用情形,  du查询文件或文件夹的磁盘使用空间。

  2. 如果有一个进程在打开一个大文件的时候,这个大文件直接被rm 或者mv掉,则du会更新统计数值,df不会更新统计数值,还是认为空间没有释放。直到这个打开大文件的进程被Kill掉。

  3. 客户那里一台主机出了问题,df -h比du -h大了15G,邪门的很,google了一下。发现差异有两种:

    (1)meta data导致不一致,但是相差应该不会很大。顶天百M左右,就是i-node那些元数据占用掉的。

    (2)root删除应用程序正在调用的打开的文件,通常是清理日志的时候,直接删除,而这时句柄文件仍然存在。在df -h仍然显示空间未被释放。最终确认是客户误删除了太大的日志文件。导致问题出现。重启应用程序即可


lsof  /home/admin | grep deleted      查看当前被打开的但又被删除的文件,这是df命令显示磁盘空间被大量占用的原因



四、磁盘空间问题解决思路

df -h

du -h --maxdepth=1 /home/admin     观察两者统计的磁盘消耗大小差异是否很大

lsof  /home/admin | grep deleted        观察是否有被删除的仍然占用磁盘空间的文件,如果有,则需要重启对应的进程

df -i                                                      观察inode的消耗情况,如果消耗太多也许是创建了较多的软链接



参考文章:

https://blog.csdn.net/shenlanzifa/article/details/44016537

http://www.cnblogs.com/mickole/p/3182033.html

http://ruanyifeng.com/blog/2011/12/inode.html

http://blog.sina.com.cn/s/blog_465311c101013gkh.html

https://blog.csdn.net/guoguo1980/article/details/2324454

https://blog.csdn.net/u013256816/article/details/60778709


更多精彩文章欢迎关注微信公众号:漫谈技术

Linux-文件之inode_第1张图片

你可能感兴趣的:(Linux-文件之inode)