目录
1.文件系统
1.1 磁盘物理存储结构
1.2 磁盘逻辑存储结构
1.3 inode编号
2. 软硬链接
2.1 软链接
2.2 硬链接
2.3 目录文件的软硬链接
1.文件系统
在一台电脑中,大部分文件都不是被打开的,这些文件都在磁盘中进行保存。已经打开的文件需要管理,没有被打开的文件同样需要管理,所以需要文件系统。
1.1 磁盘物理存储结构
磁盘是一种用于存储数据的硬件设备,通常分为机械硬盘(HDD)和固态硬盘(SSD)两大类。机械硬盘通过旋转的磁性盘片和磁头读写数据,而固态硬盘则使用闪存芯片,没有机械部件。因为大容量磁盘比较便宜,大型公司还是使用磁盘,我们这里讲解一下磁盘的结构。
磁盘的主要组成部分:
- 盘片(Platter):表面覆盖磁性材料的圆形金属片
- 磁头(Head):读写数据的电磁组件
- 磁道(Track):盘片上的同心圆环
- 扇区(Sector):磁道的最小存储单元(通常512字节或4K)
- 柱面(Cylinder):所有盘片同一磁道组成的立体结构
一个盘面可以有很多个同心磁道,一圈磁道可以有很多扇区,扇区是磁盘最小的存储单元。
如果我们想向一个扇区写入,我们寻址的过程是这样的:
- 确定盘面
- 确定磁盘
- 确定扇区
1.2 磁盘逻辑存储结构
我们把磁盘抽象成连续的线性空间。
那我们如何寻找一个扇区呢,我们可以给每个扇区编号,比如1~100000第一面,100001~200000第二面,对磁盘的管理就变成了对数组的管理。
操作系统中,可以按照扇区为单位进行存取,也可以基于文件系统,按照文件块为单位进行存取。一个文件块可以有多个扇区组成,这样可以更好的应用空间局部性原理,就可以理解为什么说磁盘是块设备了,即按照块的大小从磁盘中读取数据。
1.3 inode编号
文件系统时如何实现并找到我们的文件的呢?文件系统为每个文件分配一个inode编号,通过inode编号进行查找。
Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的,
- Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。
- Datablocks:数据区存放文件内容。
- inode Table(inode表):struct inode inode_table[N]
inode Table中有很多inode结构体,一般情况下一个文件一个inode,且在整个分区具有唯一性。不同分区可以装不同的操作系统。
struct inode
{大小,权限,拥有者,所属组,修改时间,inode编号,引用计数;int blocks[N];
}
inode存放文件的属性信息,Data blocks中存放文件的内容。其中inode编号不同表示不同文件,其中 block[N] 表示所用块的下标,N一般不会太大,比如N是15时,0~10使用直接映射,11~12使用二级映射,13~14使用三级映射,可以跨组存储。
- inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
- 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。一个比特位表示一个块。
- GDT,Group Descriptor Table:块组描述符,描述块组属性信息,有兴趣的同学可以深入了解。
- 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏。超级块不是每个块组都有,一般只有3~4个块组有。
用户使用操作系统时使用的是文件名,而内核只使用inode编号,所有我们的目录文件中存储的就是该目录下文件与inode编号的映射。
inode编号同一分区内唯一,不同分区inode编号可以相同,那么操作系统如何判断相同inode编号的文件在那个分区的呢?
- 访问文件时都是需要知道该文件的目录,不同目录创建时会通过挂载知道属于哪个分区。
2. 软硬链接
通过 ln -s 指令可以为文件建立软链接,不加 s 为文件建立硬链接。
ln -s 文件名 链接名
2.1 软链接
为log建立软连接,通过 ls -l -i 可以看到文件第一个属性是inode编号。
ln -s log log.soft.link
可以看到文件和其软链接inode编号不同,可以判断出这是两个不同的文件,软链接是一个独立的文件。软链接内容是指向目标文件的路径,类似于windows的快捷方式。
软链接的文件属性是 l,说明是链接文件。
2.2 硬链接
为hello文件创立一个硬链接。
ln hello hello.hard.link
可以看到普通文件与其硬链接inode编号相同,硬链接不是一个独立的文件,且文件属性是 - ,普通文件。
那硬链接是什么呢?硬链接是在指定的的目录内部添加一组映射关系(文件名<-> inode编号)。inode编号相同,访问磁盘时也是访问相同的inode。
第三个属性就是该文件的硬链接数,当一个文件的硬链接数是0时,该文件才算是真正地被删除。在文件系统层面,inode内部有引用计数,表明有几个文件名与inode编号有映射关系。
2.3 目录文件的软硬链接
创建一个新文件和一个新目录
mkdir newdir
touch newfile
可以发现新普通文件的硬连接数时1,而新目录的硬连接数是2。我们可以通过 ls -a,可以看到 . 和 .. 两个隐藏目录文件,. 代表当前目录,.. 代表上一级目录。本级的 newdir 和 newdir 中的 . 都指向该目录,所以新建目录的硬连接数是2,当 newdir 中每新建一个目录,newdir 的硬链接数都会加1,因为在 newdir 中新建的目录中都有 .. 指向 newdir 。
. 与 .. 都属于目录的硬链接,但是用户是不能给目录文件建立硬链接。因为在执行一些查找命令时会通过目录查找,会陷入循环,且硬链接文件是普通文件,可能绕过权限检查,当然还存在其他等等问题。
用户是可以为目录建立软链接的,因为软链接可以通过文件属性 l 分辨出。
本篇结束!