1.1 linux 文件的存储
linux在建立文件系统时会将磁盘逻辑上规划成各个块,inode块 与block块 每一个块都对应一个号码(inode号 block号),在本文件系统中唯一 ,每个inode 块缺省为256 byte block块缺省为4K 。
[[email protected] ~]# 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
[[email protected] ~]#
创建目录时系统会分配至少一个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.txt的inode块,比对是否满足权限要求,符合会得到/data/test.txt的block号,找到block块读取内容。
如图:
由此可知:文件删除自是删除文件上级目录中对于该文件的一条记录。以使环节四中断,系统自然找不到 文件。
3.1 结合文件权限相互验证
实例1-1 删除/home/redhat/data/test 文件
此时对redhat用户对test文件具有读写执行权限
执行删除
没有权限无法删除
文件删除只是删除文件上级目录中对于该文件的一条记录,实际的操作对象是文件的上级目录的block块,需要对上级目录具有wx权限,
赋予data wx
此时data下以没有了 test
由于之前为test创建了一个硬链接 text,此时test并没有被删除,它的数据还是真实存在的,
删除的自是test的一个硬链接,若要真正删除需要删除文件所有的硬链接
文件所占有的inode与block 并不会清空,只是打上未使用的标记,当有文件写入时会覆盖标记的inode和block
以上删除的自是文件系统内的test,如果有程序在调用test 那么它的磁盘空间是不会释放的,需要停止程序,释放test的存储空间,这样才是删除test。
4.1 综上所述:
linux 是通过控制文件的link数来实现文件的删除。
link 指 文件的硬链接 i-nlink
以及进程调用的 i-count
只有两个同事不在时文件才会被删除
可使用lsof -d 查看使用文件的进程 一结束进程 释放文件空间。