linux 文件删除详解




1.1 linux 文件的存储

    

linux在建立文件系统时会将磁盘逻辑上规划成各个块,inode 与block 每一个块都对应一个号码(inode block号),在本文件系统中唯一 ,每个inode 块缺省为256 byte  block块缺省为4K


[root@Centos-1 ~]# dumpe2fs /dev/sda1|egrep  -i "block count|Inode count|block size|inode size"

dumpe2fs 1.41.12 (17-May-2010)

Inode count:              51200

Block count:              204800

Reserved block count:     10240

Block size:               1024

Inode size:           128

[root@Centos-1 ~]#


创建目录时系统会分配至少一个inode 块和block块,创建一个档案时文件系统会分配至少一个inode与相当于档案大小的 block  

inode块存储目录或文件的属性,如下:

  •    owner/group

  •    read/wirte/excute

  •  type

  •  ctime    atime     mtime

  •  size

  •  flag(ID)

  •  pointer  (指向该文件对应的block)

   

block块则存储文件的数据内容:   

              对于目录:block 存储该目录下的文件结构并为每一个文件名做一条指向该文件inode的链接(通过inode号表示)。

              对于文件:block存储文件真正的内容数据,

注意:文件的block内并不存放文件名


2.1 文件的读取

读取文件这是读取文件的block快的内容,系统是怎么找到block的呢?

以读取/data/test.txt 为例:

首先系统会去/ 找到文件上级目录即/data 对应的inode号,通过inode号找到inode块。inode块中记录了此目录的属性,系统会验证是否满足/data 的权限要求,若符合会得到/data

对应的block号,找到block块,block块中记录了其下文件及目录对应的inode号,找到/data/test.txtinode块,比对是否满足权限要求,符合会得到/data/test.txtblock号,找到block块读取内容。


如图:

           
  

linux 文件删除详解_文件删除


由此可知:文件删除自是删除文件上级目录中对于该文件的一条记录。以使环节四中断,系统自然找不到  文件。



3.1 结合文件权限相互验证

  

实例1-1  删除/home/redhat/data/test  文件

linux 文件删除详解_linux_02


此时对redhat用户对test文件具有读写执行权限

执行删除

linux 文件删除详解_文件删除_03


没有权限无法删除

 

文件删除只是删除文件上级目录中对于该文件的一条记录,实际的操作对象是文件的上级目录的block块,需要对上级目录具有wx权限,

linux 文件删除详解_文件删除_04


赋予data wx

linux 文件删除详解_linux_05


此时data下以没有了 test

由于之前为test创建了一个硬链接 text,此时test并没有被删除,它的数据还是真实存在的,

删除的自是test的一个硬链接,若要真正删除需要删除文件所有的硬链接


linux 文件删除详解_linux_06


     文件所占有的inode与block 并不会清空,只是打上未使用的标记,当有文件写入时会覆盖标记的inode和block



以上删除的自是文件系统内的test,如果有程序在调用test  那么它的磁盘空间是不会释放的,需要停止程序,释放test的存储空间,这样才是删除test。


4.1 综上所述:



linux  是通过控制文件的link数来实现文件的删除。

    link 指  文件的硬链接   i-nlink 

                以及进程调用的 i-count

               只有两个同事不在时文件才会被删除



linux 文件删除详解_文件删除_07

可使用lsof  -d  查看使用文件的进程 一结束进程 释放文件空间。