一、什么是空洞文件?
+=======+-------+====+
start end a b
定义:从文件结尾到新写入的文件之间的这段空间被称之为:文件空洞,如上图中从end到a之间的一段就是文件空洞。
空洞文件必须满足2个条件:
(1)写文件时超出文件结尾
(2)超出之后继续写文件
lseek()系统调用可以改变文件的偏移量,但如果程序调用使得文件偏移量跨越了文件结尾,然后再执行I/O操作,将会发生什么情况? read()调用将会返回0,表示文件结尾。令人惊讶的是,write()函数可以在文件结尾后的任意位置写入数据
文件空洞不会占用任何磁盘块,当在文件空洞中写入了数据时,文件系统才会为之分配磁盘块。空洞的存在意味着一个文件名义上的大小可能要比其占用的磁盘存储总量要大(有时大出许多)。向文件空洞中写入字节,内核需要为其分配存储单元,即使文件大小不变,系统的可用磁盘空间也将减少。
常用命令如下,可见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内容
df与dh的区别
df命令可以显示目前所有文件系统的可用空间及使用情形, du查询文件或文件夹的磁盘使用空间。
如果有一个进程在打开一个大文件的时候,这个大文件直接被rm 或者mv掉,则du会更新统计数值,df不会更新统计数值,还是认为空间没有释放。直到这个打开大文件的进程被Kill掉。
客户那里一台主机出了问题,df -h比du -h大了15G,邪门的很,google了一下。发现差异有两种:
(1)meta data导致不一致,但是相差应该不会很大。顶天百M左右,就是i-node那些元数据占用掉的。
(2)root删除应用程序正在调用的打开的文件,通常是清理日志的时候,直接删除,而这时句柄文件仍然存在。在df -h仍然显示空间未被释放。最终确认是客户误删除了太大的日志文件。导致问题出现。重启应用程序即可
lsof | grep deleted 查看当前被打开的但又被删除的文件,这是df命令显示磁盘空间被大量占用的原因 |