硬盘中文件的管理
一、关于inode编号
在Linux中输入 ls -i 命令可查看inode编号(加-l选项可以看详细信息)
从上图中我们可以看到各文件的inode编号,硬链接数以及其文件大小。其中这里的文件大小指的是文件内容大小,我们知道:文件=属性+内容,属性包含最后修改时间,权限,拥有者等等…,故而实际上该文件在硬盘中存储所需空间比图片的数大(因为不仅要保存内容还要保存属性)
Linux把文件属性和文件内容分开存储,其中文件属性也叫元信息,而inode是任何一个文件的属性集合,Linux中几乎每一个文件都有一个inode,为了区分不同的inode,从而有了inode编号
inode和文件内容都是在磁盘中存储的
二、磁盘相关知识
i. 磁盘的特性
- 磁盘就是通过磁性进行读写功能的设备,断电后保存的文件不会丢失。硬盘是磁盘中的一种,硬盘是电脑主要的存储媒介之一
- 硬盘的读写速度慢,不适合做频繁小量访问
- 硬盘有两种寻址模式,一种就是C/H/S(Cylinder/Head/Sector)寻址模式,另一种是更优的LBA模式,全称为Logic Block Address(即扇区的逻辑块地址)
- 可将磁盘空间想象为线性的,对其进行分区管理,要对各个区格式化,写入管理信息(由文件系统决定)
ii. 磁盘的空间分布
其中Boot Block上记录了每个Block group块组的起始结束位置,这里面还可以找到操作系统代码
三、详解磁盘中的一个Block Group
-
文件的内容存储于上图的Data Blocks中,Data Blocks内部又被划分成很多个小块
-
inode Table里有很多个inode,每一个inode以结构体存储于上图的inode Table中,为128字节/256字节,里面记录了inode ID,拥有者,创建时间,大小,权限,文件的时间戳,硬链接数等属性信息(也叫做元信息),还包含了一个blocks数组,数组每个下标对应于Data Blocks内部被划分的小块。注意:inode内包含了硬链接数(硬链接表示有多个文件名指向同一个inode),但是不包含文件名,文件名被保存在该文件所属目录中。
-
Super Block 和 Group Descriptor Table
这两个不是每一组都有,起整体的统计作用:
其中Super Block统计了整个块inode使用了多少个,还剩多少个,Data Blocks内部的小块使用了多少个,还剩多少个;一个block和inode的大小;Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
Group Descriptor Table:块组描述符,用于描述块组属性信息 -
Block Bitmap 和 inode Bitmap
Block Bitmap通过位图来反映Data Blocks内部的小块具体是哪几个使用了和哪些没使用
inode Bitmap通过位图来反映具体是哪几个inode使用了和哪些没使用
四、磁盘视角看文件操作
i.创建一个文件(未写入数据)的过程
- 遍历inode Bitmap位图找到未被使用的inode位,然后在inode Table申请对应的空间,写入相关属性信息
- 在其所属目录的内容块中记录文件名和inode编号(目录相关知识下文再阐述)
ii.写入数据的过程
- 先获得这个文件的inode,再遍历Block Bitmap位图获取Data Blocks内未使用的小块
- 在inode结构体中的blocks数组记录下来
- 往Data Blocks内对应的小块写入数据
iii.删除一个文件要做什么
- 先找到这个文件的inode
- 在Block Bitmap位图去除inode结构体中的blocks数组使用的空间,即修改位图
- 在inode Table位图修改这个inode对应的位,释放该位
五、关于目录的知识
首先,我们要明确Linux下一切皆文件的思想,故而我们研究目录是以文件视角看待,即分析它的属性和内容
- 属性:保存了权限,所属组,修改时间和它自己的inode编号等…
- 内容:是当前目录下的文件名以及文件对应的inode编号
通过tree命令可以查看目录的结构,然后cd命令进入dir目录,输入ls -i 命令可查看inode编号
由此我们得到的结论是:一个文件的文件名并不保存在它的inonde属性集合里,而是保存在它所属目录的内容中
进一步地我们以此视角重新看目录的rwx权限
- 进入一个目录需要x权限:本质把当前进程的工作目录改成当前目录
- 读取一个目录需要r权限:打印出当前目录下的文件名相当于读取目录的数据区,即读权限
- 在目录创建文件需要w权限:创建文件需要把文件名和inode编号写到目录的数据区,即写权限
六、新视角看Linux命令
-
输入命令 ls 发生了什么
根据当前目录的inode编号找到它的内容块,并将这里面存储的文件名打印出来,此处并不用访问到文件的inode -
输入命令 ls -l 发生了什么
根据当前目录的inode编号找到它的内容块,得到这里面存储的文件名,并根据这些文件的inode编号再去找它们的inode,获得它们的属性:权限,所属组,大小,修改日期,最后再打印出来
七、再审视文件操作
- 引入目录后再分析创建文件并写入数据的过程
在inode Bitmap申请一个未被使用的inode,然后在inode Table申请对应的空间,写入相关属性信息,再在Block Bitmap申请Data Blocks内未使用的小块,建立好这些小块与inode结构体中的blocks数组的对应关系,然后再写入数据。然后把当前inode编号和文件名填写到其所属目录的内容块中
八、软硬链接
i.软硬链接的命令
-
软链接命令:ln -s 原文件名 新文件名
通过此命令可将新文件名软链接到原文件名,新文件名保存的是原文件名的路径,相当于Windows中生成了一个新的快捷方式,通过./新文件名 也能运行程序,注意该“快捷方式”本身自己就是一个新的文件,有着全新的inode编号 -
硬链接命令:ln 原文件名 新文件名
通过此命令可将后者文件硬链接到前者,inode编号不变,通过./新文件名 也能运行程序
ii.软硬链接的区别
- 软链接生成的文件是一个独立的文件,有自己的inode编号,而硬链接没有独立的inode编号,与原文件的相同
- 软链接生成的文件相当于快捷方式;硬链接本质没有创建文件,只是再提供了一个和原文件inode编号具有映射关系的文件名,并将其写入到当前目录的内容块中,相当于取别名
iii.硬链接的作用
- 方便目录之间通过相对路径的方式相互跳转,即 . 和 . . ,如通过cd . . 命令可以快速回到上级目录
- 删掉一个硬链接的目录/文件名不会影响其他的目录/文件名,相当于只是删掉了别名
- 通过看一个目录的硬链接数知道它有多少个子目录,每个目录内都有一个 . 文件夹,表示该目录自身,所以一个目录的硬链接数>=2
举个例子:当前有两个文件夹分别为dir和hs,输入 ls -i -l 命令可查看到两个目录的硬链接数都是2,其中dir文件夹的inode编号为1311612123,我们进入dir文件夹,输入相关命令可以看到有一个 . 文件夹,它的inode编号也是为1311612123,即 . 文件夹是dir文件夹的硬链接 如果在dir目录内再创建个newdir,我们会发现dir的硬连接数会变成3,因为多了 . . ,而 . . 是指向上级目录即dir的,newdir中的 . . 对应的inode编号与dir的inode编号相同