硬盘的最小存储单位是 扇区(sector),每个扇区可以存储512个字节。
操作系统在读取硬盘中的数据时,并不是每次单一扇区进行读取,而是一次性读取多个扇区,即一次性读取一块数据,这种由多块扇区组成的块(block),是文件的最小存储单位,最常见的块大小为4KB,也就是8个扇区(sector)。
硬盘除了存储的文件以外,还存储着和文件有关的数据信息,如:文件创建日期,大小,权限等信息,我们把除了原文件以外的这些和文件相关的信息称为元数据。
Linux系统可以简单的分为inode table 和data area。其中inode table中存有inode,而每个inode记录着文件的元数据。
元数据存储在inode table中。文件实际内容存储在data block区块中,而硬盘还有一个超级区块(superblock),超级区块会记录整个文件系统的整体信息,如:inode 和block的总量,使用量,剩余量等。
1. inode
硬盘中存储文件的元数据区域称为inode。一个文件有着与之对应的inode,记录着此文件所在的block号码。
inode也会占用磁盘空间。在磁盘格式化时,操作系统会自动将磁盘划分为两个区域,一个为数据区,一个为inode区。整个磁盘的总量由inode和磁盘空间共同决定,若是inode区域被使用完,则这个磁盘即使有剩余空间也无法再写入文件。
2. block
存储着文件的实际内容,block的大小可以自己设定。
若文件太大,则一个文件会占用多个block,文件读取效率会降低。
若文件很小,而block又大,则block剩下的空间将会被浪费,磁盘利用率会降低。
3. superblock
记录着文件的整体信息。包括inode和block的总量,使用量,剩余量等信息。
[root@root tmp]# touch file
[root@root tmp]# ls
file
[root@root tmp]# stat file
File: "file"
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 802h/2050d Inode: 524313 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-03-18 04:37:30.098703162 +0800
Modify: 2020-03-18 04:37:30.098703162 +0800
Change: 2020-03-18 04:37:30.098703162 +0800
如上:/tmp目录下创建一个空文件。然后通过stat “file” 来查看文件的信息。
其中:
File :文件名 Block:块 IO Block:系统一次性读取的数据大小(字节) regular empty file 普通空文件
Size:文件大小 Inode :节点号 Links :链接数
Access:访问权限 Uid :属主 GId:属组
Access:最近一次访问时间
Modify:最近一次修改时间
Change:最近一次改变时间。会随着Access和Modify改变而改变。
4. 文件读取流程
若是要读取/tmp/file
首先先去访问/目录下的tmp的inode信息,找到tmp中存放的file文件的inode,从而找到磁盘中的file文件。
5. 文件删除原理
硬链接:一个文件可以有多个有效的路径名,是文件的另一个入口,当一个文件有多个硬链接时,只有将所有的硬链接文件和源文件删除,才会彻底删除源文件
[root@root tmp]# touch file
[root@root tmp]# echo hello > file
[root@root tmp]# ls
file
[root@root tmp]# ln file file_hard
[root@root tmp]# ls
file file_hard
[root@root tmp]# rm -f file
[root@root tmp]# ls
file_hard
[root@root tmp]# cat file_hard
hello
软链接:软链接文件存放着源文件的路径。源文件删除时,软链接文件依然存在,但不能再访问源文件。
[root@root tmp]# touch file
[root@root tmp]# ls
file
[root@root tmp]# ln -s file file-sys
[root@root tmp]# ls
file file-sys
[root@root tmp]# echo hello > file
[root@root tmp]# cat file-sys
hello
[root@root tmp]# rm -f file
[root@root tmp]# cat file-sys
cat: file-sys: 没有那个文件或目录
Linux是通过控制link的数量来删除文件的。只有当一个文件不存在任何的link时,文件才会被删除,而一般来说,每个文件都有2个link计数器:i_count 和i_link 。
i_count :当前文件被调用的次数(内存计数器)。
i_link :当前文件硬链接的数量(磁盘引用计数器)。
删除命令rm只能删除硬链接的数量,即i_link的数量,若当一个文件正在被调用时,rm命令删除了i_link,文件无法被找到,单调用此文件的进程仍然会正常运行,仍然能从此文件中读取内容甚至写入内容。当进程终止,即i_count为零,此文件的inode会被释放,磁盘空间下次再次利用时会直接覆盖。
------------------------------------------------------------------------------------------------------- 返回目录