• Linux——文件系统


    ✅<1>主页::我的代码爱吃辣
    📃<2>知识讲解:Linux——文件系统
    ☂️<3>开发环境:Centos7
    💬<4>前言:上期我们了解了文件在内存中得组织方式,那么文件在磁盘中又是如何管理得呢?

    目录

    一.磁盘物理的结构

    二.磁盘的逻辑结构

    三.文件系统

    四Linux文件属性

    五.软硬链接

    1.软链接

    2.硬链接


    一.磁盘物理的结构

    磁盘是我们计算机上唯一的一个机械设备。

     说明:

    1. 这里的盘片有好几层,双面,每一面都会有一个磁头。
    2. 盘面上很多的微型磁体,使用磁体的N/S极,存储0/1数据。

    抽象图:

    说明:

    1. 可以将每一个盘面看成上述的一个抽象图,一圈圈的排布的。
    2. 每一圈叫做一个磁道。
    3. 每一圈的磁道,有多个小扇形组成,叫做扇区。
    4. 多个磁道在竖直方向上形成一个面,叫做柱面。
    5. 一般的磁盘每一个扇区,存储大小512字节。

    磁盘如何定位:

    1. 每一个磁头(head)都有一个编号,依次可以定位到一个面。
    2. 根据上下多个磁道形成的柱面,结合磁道(cylinder)的半径可以准确的定位到一个柱面。
    3. 一个磁道(sector)上的扇区都是有编号的。

    总结:

    我们成中定位方式定位一个扇区叫做:CHS定位法。

    一个普通文件(属性+数据)无非就是占用一个或者多个扇区,来进行自己的数据存储的!

    二.磁盘的逻辑结构

    上面我们得知,磁盘定位一个扇区,可通过CHS方式定位。

    那么操作系统内部是不是使用的CHS方式定位一个扇区的呢?不是

    因为操作系统要想做到解工作,如果我们换了一套硬件磁盘存储方案,操作系统又要跟着改。

    即便是一个扇区已经有了512字节,单位IO的基本数量也是很小的,而在OS内部依次IO的基本单位是块——4KB(可以调整),所以OS一定要有一套自己的方案,来进行块级别的访问。

    在OS看来:

    OS以4KB(块)进行IO的,一个OS级别的文件块要包含8个扇区。

    操作系统是使用数组对块的组织,那么OS对磁道的也会抽象数组。数组的每一个成员就是一个扇区。

    此时定位一个扇区,就可以直接使用数组下标了。

    定位任意一个块也是同样使用数组下标的特性来定位。

    我们成这种定位一个方式叫做LBA。

    操作系统也会提供LBA转CHS的算法,支持逻辑地址转换成物理地址。

    三.文件系统

    Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。 

    Boot Block:

    1. 一个block的大小是由格式化的时候确定的,并且不可以更改。可以设定block大小为1024、2048或4096字节。上图中启动块的大小就是用Boot Block来确定的。

    Block Group:

    1. ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。 

    超级块(Super Block):

    1. 存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。
    2. Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。
    3. 从Super Block存储的结构信息结合分租来看,其实Super Block存储的信息应该都是一样的,但是Super Block是每一个分组都会有的一份。
    4. 目的是返防止Super Block被破坏。去过某一个分组的Super Block出现故障,可以使用其他分组的Super Block来进行修复。

    Group Descriptor Table:

    1. 块组描述符,描述块组属性信息。

    Date Blocks:

    1. linux下是将文件的属性和数据分开存储的,Date Blocks就是文件数据存储地。
    2. 一个文件属性大小都是固定的,数据是不固定的往往也是占据空间最大的。
    3. 一个分组中占据空间嘴大的也是Date Blocks,Date Blocks有很多个块(4KB)组成。

    Block Bitmap:

    1. Date Blocks中有很多的块,而且块是使用数组的方式进行组织的。
    2. Block bitmap是一个位图结构,Date Blocks中每一个块的下标,都对应着BIock bitmap的一个位置,用于记录块是否被使用。

    inode Table:

    1. 一般而言,一个文件内部的所有数据会被放进Date Blocks,而内部的属性的集合一般会有一种特性的结构来存储,我们叫做inode结点。
    2. 且每一个文件都会有一个inode结点,inode结点内部存储了在该分区内标识该文件的唯一编号,我们称之为inode编号,也就是对应文件的属性ID。
    3. 所以即使是一个分区内部都会有很多的文件,也就会有会多的inode结点,一个group,需要有一个地方专门存放这些结点,这个存储结点的地方我们称之为inode Table,inode表。

    inode Bitmap:

    1. 一个分组的inode结点数往往是固定的,所以我们需要能标识每一个inode结点是否被使用了,inode Bitmap每一个bit位就是标识一个inode是否被使用。

    四Linux文件属性

    我们使用ls -l的时候看到的除了看到文件名,还看到了文件元数据:

    从左往右依次是:权限模式,硬连接数,文件按的拥有者,文件的所属组,文件大小,最后修改时间,文件名。

    其实这个信息除了通过这种方式来读取,还有一个stat命令能够看到更多信息:

    stat [文件名]

     我们能够清楚的看到:

    1. File:文件名。
    2. Size:文件大小。
    3. Blocks:文件所占块数。
    4. IO Block:块大小。
    5. Inode:inode编号。
    6. Links:硬连接数。
    7. Access:最近访问时间(不会立即更新)。
    8. Modify:最近修改内容时间(立即更新)。
    9. Change:最近修改属性时间(立即更新)。

     创建一个新文件主要有一下4个操作:

    1. 存储属性

    • 内核inode Bitmap先找到一个空闲的inode节点(这里是inode标号:263466)。内核把文件信息记录到inode结点存储待inode Table中。

    2. 存储数据

    • 该文件需要存储在三个磁盘块,内核Block Bitmap找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推,将inode Bitmap对用的位图位置信息修改。

    3. 记录分配情况

    • 文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表

    4. 添加文件名到目录

    • 新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(inode编号:263466,文件名:abc)添加到目录文件。文件名和inode编号之间的对应关系将文件名和文件的内容及属性连接起来。

    五.软硬链接

    我们可以使用命令展示文件的inode:

    ls -li

    1.软链接

    软链接是通过名字引用另外一个文件。

    制作一个软连接:

    测试代码和文件:

    测试代码:

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. cout << "hello c++ and linux" << endl;
    6. cout << "hello c++ and linux" << endl;
    7. cout << "hello c++ and linux" << endl;
    8. return 0;
    9. }

     使用命令建立软链接:

    ln -s [原文件] [链接文件]

    软连接的作用:

    在windows下,如果下载了某一个软件,通常在桌面有一个启动程序的快捷方式,这样我们就不用再到安装目录下区找驱动程序了。

    再Linux如果我们有一个文件在一个很深的目录下,使用起来会不方便,我们就可给这个文件一个软链接。

     软连接的本质:

    说明:

    1. inode是文件的唯一标识。
    2. 链接文件个源文件inode不一样说明他们就不是一个同一个文件。
    3. 之所以链接文件可以找到源文件,看似和源文件一模一样,是因为链接文件内部存储了源文件的指向。

    2.硬链接

    硬链接是通过inode引用另外一个文件。

     制作一个硬链接:

    制作一个硬链接使用命令:

    ln [源文件] [链接文件名称]

    链接文件的本质:

    没有建立硬链接之前:

    建立硬链接之后:

    说明:

    1. 普通文件的硬链接数就是1。
    2. 文件的inode和链接文件的inode相同。
    3. 说明他们两个是同一个文件。
    4. 硬链接的个数从1变成2。
    5. 文件名不是唯一的,但是文件名再所在当前文件夹和inode是一 一对应的。

    目录的硬链接:

    尝试给目录添加硬链接:

    注意:

    硬不能给目录添加硬链接。

    既然不能给目录添加硬链接,那我们还有研究的价值吗?OS系统允许州官放火,不允许百姓点灯。OS自己可以给目录添加硬链接,用户不能给目录添加硬链接。

    见一见目录的硬链接:

     说明:

    1. 新建一个文件夹,起始的硬链接就是2。
    2. 除了自己本身之外还有一个链接文件。
    3. 这个文件就是该文件夹下的 . 文件。
    4. 自然 . 文件的inode也就和该目录相同了。
    5. 同理 .. 文件inode就和newdir的上级目录的inode相同。
    6. newdir的上级目录除了newdir里面的 .. 之外,还有newdir所造当前目录的 . 文件的硬链接。
  • 相关阅读:
    Linux-System V信号量
    【统计DataFrame中每列非空值的个数】
    GPO:组策略与系统配置
    mysql大数据量 分页查询优化
    分布式系统第三讲:全局唯一ID实现方案
    课设错误调试(二)var类型转换成integer类型
    基于LSTM-CNN的人体活动识别
    深入linux内核架构--slab分配器(建议收藏)
    程序员过不去的坎-算法篇
    CSS---border-image属性的使用心得
  • 原文地址:https://blog.csdn.net/qq_63943454/article/details/133185627