Linux中的文件Linux中的文件分为用户数据和文件元数据。Linux中的文件数据是以块为单位存储的(一个普通块的大小为4KB,即8个连续的扇区组成一个块块),文件的元数据,如文件的创建者、文件的创建日期等文件以及文件的大小等存储在称为inode的区域中。中文翻译索引节点。Linux通过链接数来控制文件删除。只有当一个文件没有任何链接时,该文件才会被删除。通常,每个文件有2个链接计数器:i_count和i_nlink。i_count和i_nlink可以从VFSinode结构中找到:structinode{structhlist_nodei_hash;结构list_headi_list;结构列表头i_sb_list;结构列表头i_dentry;unsignedlongi_ino;//索引节点数atomic_ti_count;//引用计数器unsignedinti_nlink;//硬链接数i_count:当前文件用户(或调用)数i_nlink:媒体连接数(硬链接数)。当某个文件被某个进程引用时,对应的i_count数会增加;当创建一个文件的硬链接时,相应的i_nlinks的数量会增加。对于删除命令rm,实际上是减少了磁盘引用计数i_nlink。如果文件正在被某个进程调用,比如系统正在写入日志文件,执行了rm操作,虽然在目录下看不到日志文件,但实际上并没有删除文件,i_count不为0,可以通过df统计发现磁盘还没有被释放。当只有i_nlink和i_count为0时,文件将被删除。du和df的统计结果不一致。du:diskusage通过搜索文件计算每个文件的大小,然后累加得到的值。du将统计指定目录下的所有文件、目录和文件。它的依据是文件系统确实可以看到这样的文件。也就是说我们在文件系统中能看到的文件都会被du统计出来。df:diskfree通过文件系统获取空间大小信息。df(df命令通过查看文件系统的磁盘块分配图获取总块数和剩余块数)这要从程序写文件的方式说起。如果进程想要向文件写入内容,它将获得一个指针。然后写入指针指向的文件(磁盘区)。如果指向的文件由于某些原因(可能是人为的)被删除了,但是(writecall)不知道文件是否还在,它会继续往里面写,不管文件是否存在,磁盘块仍在被写入使用。所以因为文件没了,du无法统计写入的磁盘块,但是因为写入进程还在,磁盘空间还没有释放,所以df可以统计,所以df统计的结果比du大很多。使用proc目录恢复删除的文件上面说到进程占用的日志文件的rm操作并没有真正删除。既然还没有真正删除,那如何恢复呢。[root@ky35zask]#rm-rfinfo.log[root@ky35zask]#ls-lrtinfo.logls:无法访问info.log:Nosuchfileordirectoryin/proc[pid]/fddirectory,saveFiles由所有进程打开。也就是说,虽然我们已经无法从文件系统层面找到被删除的文件,但是我们仍然可以在proc目录下找到该文件的文件句柄。1、找到占用日志文件的进程号[root@ky35zfd]#lsof|grepinfo.logjava8337root53wREG253,15281444660/ask/info.log(删除)2.进入/proc/pid/fd目录[root@ky35zask]#cd/proc/8337/fd3。在proc目录下找到文件的文件句柄[root@ky35zfd]#ls-ltl-wx------1rootroot64Nov111:3148->/ask/info.log4。直接复制文件句柄[root@ky35zfd]#cp/proc/8337/fd/48/ask/info.log
