一、Linux文件系统
磁盘的组成
磁盘设备可包括一个或多个物理盘片,每个盘片分一个或两个存储面(见图a),每个盘片上有若干个磁道,磁道之间有必要的间隙。每条磁道又被从逻辑上划分成若干个扇区,软盘大约有8至32个扇区,硬盘则多达数百个,图b显示了一个磁道分成8个扇区的布局情况。一个扇区称为一个盘块(或数据块),各扇区之间保留一定的间隙。
文件存储在硬盘上,硬盘的最小存储单位叫做扇区sector,每个扇区存储512个字节,操作系统在读取硬盘数据时,并不是一个一个扇区去读取,而是按照多个扇区,也就是一次性读取一块数据,这种由扇区组成的块(block)是文件存取最小单位,最常见的块大小为4KB,即8个连续的sector组成一个block。
文件的数据都存在块上,我们知道一个文件除了存储的数据以外还有一部分数据,我们称为元数据,如文件创建
日期,大小等等,这种存放元数据的区域我们称为inode。
block、inode、superblock
- block:实际记录文件的内容,若文件太大时,会占用多个区块。
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的区块号码。
- superblock:记录文件系统的整体信息,包括inode与block的总量、使用量、剩余量,以及文件系统的格式与相关信息等。
inode中包含文件的元数据,可以通过stat命令查看文件的元数据
[root@localhost ~]# stat file3
文件:"file3"
大小:21 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:817643 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2020-07-20 11:54:42.601694824 +0800
最近更改:2020-07-20 11:54:30.550645950 +0800
最近改动:2020-07-20 11:54:30.550645950 +0800
创建时间:-
inode也会消耗磁盘空间,在磁盘格式化时,操作系统会自动将磁盘分为两个区域,一个数据区,一个inode区,存放inode所包含的信息,整个磁盘的可以使用容量由inode和磁盘空间共同决定,当inode消耗完之后,磁盘空间还有剩余也无法存储数据。
读取文件流程:(以/etc/fstab文件为例)
挂载点的意义
每个文件系统都有独立的inode、区块、超级区块等信息,这个文件系统要能够链接到目录树才能被我们使用。将文件系统与目录树结合的操作称为挂载。
挂载点一定是目录,该目录为进入该文件系统的入口。因此并不是你有任何文件系统都能使用,必须要挂载到目录树的某个目录后,才能够使用该文件系统。
二、删除原理
rm命令
参数 | 作用 |
---|---|
-f | 强制删除,忽略不存在的文件,从不给出提示 |
-i | 交互式删除,删除时给出提示 |
-r | 递归删除目录下面文件以及子目录的文件 |
-R | 同r |
-v | 显示运行时详细信息 |
软链接与硬链接
硬链接:
[root@localhost ~]# ln /tmp/hello ./hellol
-
具有相同Inode节点号的多个文件是互为硬链接文件。
-
删除硬链接文件或者删除源文件任意之一,文件实体并未被删除。 因为你将任何一个文件名删除,其实inode与区块都还是存在的。只要inode有链接,就不会被清理掉,因此更安全。
-
只有删除了源文件及所有对应的硬链接文件,文件实体才会被删除。
-
当所有硬链接文件及源文件被删除后,再存放新的数据会占用这个文件的空间,或者磁盘fsck检查的时候,删除的数据也会被系统回收。
-
硬链接文件就是文件的另一个入口。
-
可以通过给文件设置硬链接文件,来防止重要文件被误删。
-
硬链接文件可以用rm命令删除。
-
对于静态文件(没有进程正在调用的文件)来说,当对应硬链接数位0(i_link),文件就被删除。i_link的查看方法(ls -
l结构的第三列就是)
软链接:
[root@localhost ~]# ln -s /tmp/hello ./hellor
-
软链接类似windows的快捷方式(可以通过readlink查看其指向)。
-
软链接类似一个文本文件,里面存放的是源文件的路径,指向源文件实体。
-
删除源文件,软链接文件依然存放,但是无法访问指向的源文件路径内容了。
-
失效的时候一般是红字白底闪烁提示。
-
软链接和源文件是不同类型的文件,也是不同的文件。inode号也不相同。
-
删除软链接文件可以用rm命令。
当源文件为一个目录时,链接文件也会是目录;当源文件为文件时,链接文件也会是文件。
目录链接:
- 对于目录,不可以创建硬链接,但可以创建软链接
[root@localhost ~]# ln /tmp/file1 ./file1
ln: "/tmp/file1": 不允许将硬链接指向目录
我是这样理解的,假设可以创建硬链接:
每当创建一个目录,会有两个目录随即被创建:
[root@localhost ~]# mkdir file1
[root@localhost ~]# ls -a file1
. ..
#.指向当前目录,..指向父目录
file1的父目录是家目录,那么问题来了:。与。。互为硬链接的话,“。。”应该指向file1目录还是~目录?
- 目录的硬链接不能跨越文件系统
- 每个目录下面都有一个硬链接“.”号,和对应上级目录的硬链接“…”。
- 在父目录里面创建一个子目录,父目录的链接数增加1(子目录里都有…来指向父目录)。但是在父目录里创建文件,父目录的链接数不会增加。
删除原理
Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2个link计数器:i_count 和 i_nlink。
i_count的意义是当前文件使用者(或被调用)的数量,i_nlink 的意义是介质连接的数量(硬链接的数量);可以
理解为i_count是内存引用计数器,i_nlink是磁盘的引用计数器。
当一个文件被某一个进程引用时,对应i_count数就会增加;当创建文件的硬链接的时候,对应i_nlink数就会增
加。
对于删除命令rm而言,实际就是减少磁盘引用计数i_nlink。
这里就会有一个问题,如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,那么会出现什么结果呢?
当用户执行rm操作删除文件后,再执行ls或者其他文件管理命令,无法再找到这个文件了,但是调用这个删除的文件的进程却在继续正常执行,依然能够从文件中正确的读取及写入内容。这又是为什么呢?
这是因为rm操作只是将文件的i_nlink减少了,如果没其它的链接i_nlink就为0了;但由于该文件依然被进程引用,因此,此时文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_nlink及i_count都为0的时候,这个文件才会真正被删除。也就是说,还需要解除该进程的对该文件的调用才行。