探索文件系统:软硬链接的奥秘
目录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 Groupext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。Datablocks数据区存放文件内容。inode Tableinode表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 BitmapBlock Bitmap中记录着Data Block中哪个数据块已经被占用哪个数据块没有被占用。一个比特位表示一个块。GDTGroup 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 分辨出。本篇结束