【Linux】文件系统

        之前讲述的是一个被打开的文件,操作系统会通过进程来管理打开的文件。如果一个文件没有被打开,那么这个文件是磁盘中存储的。

文件 = 文件内容 + 文件属性 ——>磁盘上存储的文件 = 存文件的内容 + 存文件的属性,再磁盘中:

  • 文件的内容 = 数据块
  • 文件的属性 = inode

总的来讲,Linux的文件在磁盘中存储,是将属性和内容分开存储的。

认识硬件——磁盘

磁盘的物理构成

        磁盘是一种用于存储数据的物理设备,能够长期保存信息。磁盘分为机器磁盘(HDD)和固态硬盘(SSD)。

  • 机械磁盘:容量大、成本低、读写速度快,一般适合大容量存储。
  • 固态硬盘:基于闪存技术,读写速度快,功耗低,但是价格较高且写入寿命有限,一般适用于需要高速读写的场景,如操作系统,游戏或者数据库。

磁盘是电脑中的唯一的机械设备,也是一个外设。

关于磁盘的一些扩展知识,数据通过改变磁盘片上磁性颗粒的极性来存储。盘片旋转时,磁头移动到目标磁道,完成读写操作。

  • 磁头是一面一个
  • 磁头和盘面是不接触的
  • 磁盘是永久性存储介质,内存是临时性存储介质,内存在断电后数据会丢失。

磁盘的存储构成

从主轴向外扩展由很多的同心圆,每一个同心圆都是一个磁道。每一个磁道存在着无数的扇区。

  • 磁盘被访问的最基本单元是扇区——512字节/4KB
  • 可以将磁盘看作是无数个扇区构成的存储介质

要把数据存储到磁盘,首先需要定位扇区,如何定位:

  • 首先确定是哪一个盘面,本质是定位哪一个磁头(磁头和盘面是1:1)
  • 其次确定是哪一个磁道
  • 再确定是哪一个扇区

【说明】磁头在左右摆动时,就是在确定磁道和柱面。当磁头确定好之后,盘片开始旋转就是在确定扇区。对于磁盘来说

  • 磁盘运动越少,效率越高
  • 磁盘运动越多,效率越低

所以,在软件设计时,设计者一定需要有意识的将相关数据放在一起。


Cylinder Header Sector——>CHS寻址方式

对磁盘进行逻辑结构

        对磁盘进行逻辑抽象可以理解为磁带,当磁带卷起来就类似于磁盘的同心圆结构。此时可以在逻辑上将其延展开,类似于是线性的。

类似的,磁盘也可以抽象成线性的。

最后一个磁盘会被分为以扇区为基本单位的数组,任意一个扇区都有下标。

已知扇区编号(下标)58888,有6个盘面,每个盘面有50个磁道,每个磁道400个扇区。则根据扇区编号可以逆推出该扇区是在第3个盘面,第48个磁道中第378个扇区。

  • 逻辑扇区地址(LBA地址)与物理地址(CHS地址)互相转换。

回归到硬件

        在计算机中,不仅仅CPU有”寄存器”,其他设备例如外设、磁盘也有寄存器。

磁盘中的寄存器:

  • 控制寄存器——发送读/写信号,即IO方向
  • 数据寄存器——数据
  • 地址寄存器——地址(LAB地址)
  • 状态寄存器——检查状态是未就绪还是已经就绪。

理解文件系统

        为了管理一个较大的磁盘空间,操作系统会将这部分磁盘空间分割成几部分来管理,类似于:

struct partion
{
    int start;
    int end;
}

struct partion part[5];

为了管理这个200GB分区,将这个200GB硬盘分区划分为一个个的block。

  • Boot Block:会记录操作系统中启动的信息,操作系统在哪个位置,磁盘被划分为几个分区,总的来说就是开机相关的字段。这个Boot Block不仅仅在这个分区存在,在其他分区也可能会存在。当这个分区的Boot Block不小心被销毁,可以在其他分区的Boot Block查找备份。
  • Block Group:文件系统会根据分区的大小再细划分为数个Block Group,而每个Block Group都有着相同的结构组成。

而每个Block Group就是文件系统,只需要将一个Block Group管理好,整个分区就可以管理好,整个分区管理好,那么这个磁盘文件就可以管理好,这种管理方式称为分治。

  • 超级块(super Block):存放文件系统本身的结构信息。
  • GDT(Group Descriptor Table):描述的是整个分组的情况

下面是存储数据的内容:

  • Data blocks:存储文件内容的区域,将扇区以块的方式呈现出来。块的大小一般是1024、2048或者4096字节,一般是4096字节也就是4KB,也被称为文件系统的块大小。一般而言每一个块只有自己的数据。
  • inode Table:单个文件的所有属性,一般大小是128字节。一般而言,一个文件一个inode,所以一定会存在多个inode。每一个inode都会用唯一的编号。

【说明】文件的属性中,不包含文件文件的名称,只会知道文件的编号。

指令:ls -li

【功能】查看文件的属性及inode编号

// inode属性信息
#define NUM 15
struct inode
{
    以下是部分可能的属性信息:
    // inode number;
    // 文件属性
    // 权限    
    // 引用计数
    // 拥有者
    // 所属组
    // ACM时间
    // int block[num];
}

通过inode属性中的block数组可以查找到存储文件内容的区域

  • 块位图(Block Bitmap):Data blocks中存储着多少个块,这里就会存储多个bit位。bit位中0/1来记录Data Blocks中哪个数据块被占用,哪个数据块没有被占用。bit位的位置和块号映射。bit位的内容表示该块没有被使用。

【注意】删除一个块的内容的时候,不需要将块中的内容清空。只需要将块位图中的bit为置为0即可。

  • inode位图(inode Bitmap):bit位的位置和inode编号映射起来,来表示inode是否空闲可以使用。

下面理解前两个区域:

  • GDT(Group Descriptor Table):块组描述符,描述整个分组的基本属性信息。

【注意】Block Bitmap和inode Bitmap主要描述Data blocks以及inode Bitmap中哪些被使用,哪些没有被使用,也就是分配情况。而GDT则是描述总结这些信息一共有多少块,哪些块使用,哪些没有被使用,也就是基本信息。

  • 超级块(Super Block):存放文件系统本身的基本信息看,里面包含的是整个分区的基本使用情况。记录的信息主要有:block和inode的总量,未使用的block和inode的数量,一共block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。

【注意】Super Block不需要在每一个分组中都存在。

        

【结论】每一个分区在被使用之前,都必须提前先将部分文件系统的属性信息提取设置进对应的分区中,方便后续使用这个分区或者分组——这种提前写入属性信息的方式——>格式化。

指令:stat [filename]

【功能】查看文件的属性信息

【说明】Linux系统中,一个文件,一个inode,每一个inode都有自己的inode编号(只在自己的分区内全部有效,即inode的设置是以分区为单位的,不能跨分区),inode表示文件的所有属性,但是文件名不属于inode内的属性。

新建一个文件,系统要做什么?

【答】创建一个文件会先通过路径查找应该在哪一个分组开始创建,然后通过GDT找到在这个分组中是否存在空闲的区域,然后设置inode编号与inode Bitmap建立联系,确定文件的大小,在Block Bitmap中确定没有使用的块,最后再在inode Table中填写属性信息,在Data Blocks中填写内容。

理解目录

        上面所有的文件系统的操作都是基于inode的,但是正常在使用文件的时候都是通过文件名称的,而从来没关心过inode。

Linux下一切皆文件,目录也是文件,目录也有自己的属性和inode编号。

  • 目录文件 = 目录内容 + 目录属性
  • 目录也有Block数据块,里面存放的是该目录下,文件的文件名 和 对应文件的inode编号的映射关系.

问题:为什么同一个目录下不能有同名文件?

【答】一个目录下,存在唯一的文件内容,在这个文件内容中,文件名和inode编号是一 一对应的。

问题:目录下没有w权限时,是不能创建文件的?

【答】没有w权限,当想要创建文件的时候,无法在该目录文件下进行inode编号与文件名直接的映射。

问题:目录下没有r权限时,无法查看该目录下的文件?

【答】没有r权限,无法读取该目录下文件名与inode编号的映射关系,也就在底层找不到该文件,查看不到该文件的内容.

问题:目录下没有x权限时,无法进入该文件?

【答】没有x权限,系统被禁止读取目录文件与inode的映射关系,也就无法打开该文件。

理解软硬链接

 指令:ln [filename] [name]

【功能】代表建立硬链接

指令:ln -s [filename] [name]

【功能】ln代表建立链接,-s选项代代表soft,即建立软链接

【结论】

  1. 软链接是一个独立的文件,因为其具有独立的inode。
  2. 硬链接不是一个独立的文件,因为其没有独立的inode。

硬链接

  • 所谓建立硬链接,本质其实就是在特定目录的数据块中新增 文件名 和 指向文件的inode编号的 映射关系。
  • 任意一个文件,无论是目录还是普通文件,都有inode编号;每一个inode内部,都有一个叫做引用计数的计数器,这个引用计数所表明的是有多少个文件指向该inode的。
  • 目录里面保存的是文件名与inode编号的映射关系,在目录中可以存在多个文件名映射同一个inode

文件名1:inode 11223344

文件名2:inode 11223344

文件名3:inode 11223344

文件名4:inode 11223344

【注意】当需要删除一个文件的时候,需要通过inode编号查找该引用计数,删除文件只是将引用计数-1,当引用计数为0的时候才会删除文件。

软链接

  • 软连接是一个独立的文件,有独立的inode编号,也有独立的数据块,其数据块里面保存的是指向文件的路径
  • 删除软链接的文件不影响源文件,但是删除源文件会影响软链接的文件。
  • 软链接相当于快捷方式

【说明】软连接在Windows环境中类似于桌面快捷方式,通过快捷方式查找源文件。

指令:unlink [soft-link-filename]

【功能】取消软链接

软链接应用场景

  • 安装好一个软件时,想要打开程序需要在一串路径中才能打开程序,通过软链接创建快捷方式,以此来方便打开程序
  • 在Linux环境中,安装好一个程序,想要打开这个程序,需要在特定目录下打开该程序,只需要在/usr/bin/目录下设置一个该程序的软链接,即可通过指令的方式打开该程序。

硬链接应用场景

  • 文本文件的硬链接数是1
  • 目录文件的硬链接数是2,第一组映射关系是该目录名与inode编号的映射关系,第二组映射关系是当进入该目录后,存在一个 . 表示当前目录,即该目录名下面的.目录与inode的映射关系。
  • 目录文件下都会存在 .. 表示上级目录,表示该目录的上级目录文件与该目录下的 .. 的inode建立映射关系。

  • 在该目录下每多创建一个目录,都会多一个 .. 文件,也就会多一个硬链接数,所以一个目录文件的硬链接数 = 该目录下的目录文件数量 + 2。

【总结】硬链接通常用来进行路径定位,采用硬链接可以进行目录间的切换。

【注意】Linux不允许用户给目录建立硬链接,会在系统中造成环路问题。

补充知识

补充1:磁盘与物理内存之间的交互

补充2:操作系统如何管理内存?

        操作系统不仅仅能够看到虚拟进程空间,也是能看到内存的物理地址的。操作系统在管理内存时先描述,再组织。

struct page
{
    // page页必要的属性信息
}

struct page mem_array[1048576];

通过设置结构体的方式,对内存的管理变成了对数组的管理,且数组是存在下标的,则物理内存也就有了页号的概念,找到4kb对于的page,就可以在系统中找到对应的物理页框。在系统中,所有申请内存的动作,都是在访问page数组。

补充3:Linux中,每一个进程打开每一个文件都要有自己的inode属性和自己的文件页缓冲区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值