通用文件模型

一、通用文件模型

        通常一个完整的Linux系统有数千到数百万个文件组成,文件中存储了程序、数据和各种信息。层次化的目录结构用于对文件进行编排和分组。

 1.ReiserFS(新型的文件系统) -->Reiser4

        它通过一种与众不同的方式----完全平衡树来容纳数据,包括文件数据、文件名、日志支持。它还可以支持少量磁盘和阵列,并能在上面继续保持很快的搜索速度和很高的效率。特点:先进的日志机制。日志机制保证了在每个实际数据修改之前,相应的日志已经写入硬盘,文件与数据的安全性有了很大的提高。

        高效的磁盘空间利用、独特的搜寻方式、支持海量磁盘、有意的性能、搜寻方式、空间分配和利用情况。

2.Ext4 -->Linux系统下的日志式文件系统,Ext3应用广泛

        更大的文件系统和更大的文件(Ext3文件系统最多支持32TB文件系统和2TB文件,实际比容量少很多,文件系统2TB和16GB文件。Ext4文件系统容量达到1EB,文件容量则达到16TB);更多的子目录数量;更多的块和i-节点数(Ext3文件系统使用32位空间,Ext4文件系统扩充到64位);多块分配;持久性性预分配;盘区结构;新的i-节点结构;日志检验功能;在线碎片整理。

3、XFS--> 高性能的日志文件系统:XFS 极具伸缩性、非常健壮

        数据完全性、可扩展性(最大支持文件大小为 9exabytes,最大文件系统尺寸为 18exabytes)、传输特性、传输带宽(单个文件系统测试,吞吐量最高达 7GB 每秒,对常见文件读写操作吞吐量可达 4GB 每秒)。
内核支持 40 多种文件系统,MS-DOS 的 FAT 文件系统,UFS(berkeley UNIX)、网络文件系统(coda 和 NFS)和虚拟文件系统(如 proc)。 

  1. XFS 文件系统特性

    • 基础定位:XFS 被定义为 “高性能的日志文件系统”,核心优势是伸缩性强健壮性高
    • 数据能力
      • 数据完全性:确保数据存储、读写过程中的完整性,减少数据丢失风险。
      • 可扩展性:支持超大文件和文件系统,最大文件大小达 9 exabytes(1 exabyte = 10²⁴字节),文件系统尺寸最大为 18 exabytes,适合大规模数据存储场景。
    • 传输性能
      • 单个文件系统测试中,吞吐量最高达 7GB / 秒;针对常见文件的读写操作,吞吐量也能达到 4GB / 秒,体现高效的数据传输能力。
  2. 内核支持的文件系统类型

    • MS-DOS 的 FAT 文件系统:早期广泛用于 Windows 系统的文件系统,兼容性强,适合存储小型文件。
    • UFS(Berkeley UNIX):UNIX 系统衍生的文件系统,常用于类 UNIX 系统(如 FreeBSD),具备高效的磁盘管理能力。
    • 网络文件系统:包括 coda 和 NFS(网络文件系统),用于跨网络共享文件,实现不同主机间的数据访问。
    • 虚拟文件系统(如 proc):不实际存储在磁盘上,而是映射系统运行时的资源(如进程信息),典型代表是 proc(记录系统进程状态、硬件信息等)。

三种文件系统对比如下:

 

文件系统类型一般分为三种:

1.基于磁盘的文件系统(Dish-based Filesystem)

2.虚拟文件系统(Virtual Filesystem)

3.网络文件系统(Network Filesystem)

        内核处理 文件的关键是inode,每个文件和目录都有且只有一个inode,其中包含元数据(如访问权限、上次修改的日期等)和指向文件数据的指针。

        

4.inode

        Linux内核文件系统最重要的数据结构是inode,则一个inode就代表一个文件,inode结构体保存文件的大小,文件的块大小、创建时间等各种参数。一个文件的inode只有唯一一个。

         文件存储在“块”当中,很显然我们必须要找到一个地方存储此文件的“元信息”,比如文件大小、文件作者、文件创建日期等。在存储文件元新息的区域就叫做inode(索引节点)。inode也会占用硬盘空间,所以我们在硬盘格式化的时候,操作系统自动将硬盘分为两个区域:一个是数据区,存放文件数据;另一个是inode区,存放inode所包含的信息。每个inode节点的大小一般是128字节或者256字节。

        我们可以通过df命令来查看硬盘分区查看硬盘分区的inode总数和已使用的数量:

         inode的成员可能分为两类:描述文件状态的元数据(比如访问权限、文件大小等);保存实际文件内容的数据段(指向数据的指针,文本文件用于保存文本)。

        查找起始于 inode,它表示根目录 /,对系统来讲必须总是已知的,该目录由一个 inode 表示,其数据段并不包含普通数据,而是根目录下的各个目录项,这些项可能代表文件或者其它目录,每个项由两个成员组成:该目录项的数据所在 inode 的编号;文件或目录的名称。
        系统中所有 inode 都有一个特定的编号,用于唯一地标识各个 inode。文件名称和 inode 之间的关联即通过该编号直接建立的,
        查找操作当中第一步查找子目录 usr 的 inode,这一步会扫描根 inode 数据段,直至找到一个名为 usr 的目录项,可以根据 inode 编号直接定位。

1. 根目录 inode:系统的 “总目录卡”

把 Linux 文件系统想象成一个大型图书馆,根目录/就像图书馆的 “总目录”。而根目录对应的 inode,就是这张 “总目录卡”。这张卡里不存书的内容(不是普通数据),而是记录了图书馆里有哪些 “小书架”(子目录)和 “书”(文件)—— 这些记录就是 “目录项”。每个目录项包含两个关键信息:

  • inode 编号:类似书架的唯一编号,标识这个目录或文件对应的 inode。
  • 名称:比如 “usr”“etc”,就像书架上的书名标签。

2. inode 编号:inode 的 “身份证”

系统里每个 inode 都有独一无二的编号,就像每个人的身份证号。通过这个编号,系统能精准找到对应的 inode。文件名称和 inode 的关联,全靠这个编号建立。比如,你知道一本书的名字,图书馆系统通过编号就能定位到对应书架(inode)。

3. 查找子目录的过程:给系统 “查目录卡”

当你要找/usr这个子目录时,系统就像在翻根目录的 “总目录卡”(扫描根 inode 的数据段)。一页页找,直到发现写着 “usr” 的目录项。找到后,通过目录项里的 inode 编号,就能直接定位到usr目录对应的 inode,就像通过书架编号找到具体书架一样。
整个过程就像:知道书名(usr)→ 查总目录卡(根 inode 目录项)→ 拿编号找书架(定位 inode),逻辑清晰又高效。

 

5.索引节点

        在文件系统中,每个文件对应一个索引节点,索引节点描述两类数据信息。

        文件的属性,也称为元数据(metadata);文件数据的存储位置。当内核访问存储设备上的一个文件时,会在内核中创建索引节点的一个副本。

1. 索引节点记录的两类 “核心信息”

  • 文件的属性(元数据)
    就像卡片上记录的 “书名、作者、出版社、页数、是否绝版” 等信息。对应到文件里,就是文件的权限(谁能读 / 写)、文件类型(是普通文件还是目录)、创建时间、修改时间、文件大小等 “描述性内容”,这些不直接是文件的实际数据,却能帮系统和用户快速了解文件 “基本档案”。
  • 文件数据的存储位置
    卡片上还会记录 “这本书放在图书馆几楼几号书架”。对应到文件系统里,inode 会记录文件的数据块存放在存储设备(如硬盘)的哪些具体位置,这样系统才能知道该去磁盘的哪里读取文件的真实内容。

2. 内核创建索引节点副本的作用

当 “图书馆工作人员(内核)” 需要访问一本书(文件)时,不会一直拿着原本的卡片(存储设备上的 inode)跑来跑去。而是先制作一张 “临时卡片”(在内核中创建 inode 的副本)。
这样做的好处是:内核可以快速在内核空间使用这张临时卡片处理文件相关操作(比如读取文件属性、定位数据位置),效率更高,也避免频繁读写存储设备上的原始 inode,就像工作人员用临时卡片记录信息,方便快速查阅和操作,用完后再同步回原卡片即可。

6.文件分类 

        普通文件、目录、符号链接、字符设备文件、块设备文件、命名管道(FIFO)、套接字(socket)。

        字符设备文件、块设备文件、命名管道(FIFO)、套接字(socket)这4中是特殊文件,这些文件只有索引节点没有数据。字符设备文件和块设备文件用来存储设备号,直接把设备号存储在索引节点中。

这些特殊文件虽只有索引节点(inode)却能处理数据,是因为它们的 “数据承载与操作逻辑” 不靠传统文件数据块,而是依赖内核其他模块,具体原理如下:

1. 字符设备文件、块设备文件

  • 核心逻辑
    设备文件的 inode 里存的不是数据,而是 设备驱动操作函数指针。比如读取字符设备文件时,系统通过 inode 找到对应驱动的读函数,直接操作硬件(如串口读取数据);写块设备文件时,通过 inode 关联的驱动写函数,把数据写入磁盘等硬件。
  • 数据去向
    数据不存文件系统的数据块,而是直接和硬件交互。例如,读串口设备文件,数据从串口硬件流入用户空间;写硬盘块设备文件,数据通过驱动写入硬盘物理扇区,和文件系统的 “文件数据存储” 机制完全不同。

2. 命名管道(FIFO)

  • 数据存储
    FIFO 的数据存于 内存缓冲区。创建 FIFO 文件时,内核分配一块内存作为管道队列。读操作从队列取数据,写操作向队列存数据。
  • inode 的作用
    inode 记录管道的元信息(如读写权限、队列状态),但不存实际数据。数据在内存管道中流转,比如两个进程通过 FIFO 通信,写进程把数据放内存队列,读进程从队列取,全程不依赖文件系统的数据块。

3. 套接字(socket)

  • 数据处理
    socket 文件的 inode 关联 网络协议栈。发送数据时,用户空间通过 socket inode 的操作接口,把数据交给网络协议栈(如 TCP/IP 模块),由协议栈处理封装、传输;接收数据时,协议栈把数据存入内核缓冲区,用户通过 socket 接口读取。
  • 无文件数据块
    数据全程在网络模块、协议栈缓冲区中处理,不存储在文件系统的数据块里,socket 文件仅作为内核网络功能的 “访问入口”,靠 inode 提供操作接口。

 

7.链接

        在Linux系统中有种文件是链接文件,可以为解决文件的共享使用。链接分为两种:一种是硬链接(Hard Link),另一种是软连接,也称为符号链接(Symbolic Link)。

        【硬链接】相当于给一个文件多取了一个名称,多个文件名称对应同一个索引节点,索引节点的成员i_nlink是硬链接的计数。

        【软链接】这种文件的数据是另一个文件的路径,软连接可对文件或者目录创建。

        索引节点的成员i_op指向索引节点操作命令inode_operations,i_fop指向文件操作集合file_operations。两者间的区别:inode_operations用来操作目录和文件属性,file_operations用来访问文件数据。

        硬链接:通过索引节点来进行链接,在Linux文件系统中,保存在磁盘分区中的文件不管是什么类型都会给他分配一个编号,这个编号被称为索引节点编号(inode index)。硬链接作用之一是允许一个文件拥有多个有效路径名称,这样用户就可以建立硬链接到重要文件,以防止“误删除”源数据。 

  1. “书的唯一编号”—— inode 编号
    图书馆里每本书(不管是小说、工具书,对应文件系统里的普通文件、特殊文件),都会被分配一个独一无二的编号(类似书的 ISBN 码),这个编号就是文件的 inode 编号。它贴在书里,是这本书的 “身份证”,记录着书的内容存放在图书馆的哪个位置(对应文件数据的存储位置)。

  2. “多个书签指向同一本书”—— 硬链接
    假设你有一本很重要的书《Linux 秘籍》,原本它放在书架 A,对应一个书签(文件名)。现在,你用硬链接创建另一个书签,标记为 “珍贵资料”。这个新书签和原来的书签,都指向《Linux 秘籍》的编号(inode 编号)。
    此时,这本书有了两个 “访问身份”,但实际内容还是同一批。

  3. “防误删” 的原理
    如果有人不小心撕了书架 A 的书签(删除文件名),只要 “珍贵资料” 这个书签还在,依然能通过它找到《Linux 秘籍》。因为两个书签关联的是同一个编号(inode),只要编号还在,书的内容就不会消失。
    对应到文件系统:硬链接让一个文件有多个文件名,但共享同一个 inode。删除其中一个文件名,只要还有其他硬链接存在,inode 就不会被真正删除,文件数据也会保留,起到 “防误删” 的作用。

        软连接:便于文件的管理,比如把一个复杂路径下的文件链接到一个简单路径下方便用户访问。

        节省解决空间不足,某个文件的文件系统空间已经用完,但是必须在该文件系统下创建一个新的目录并存储大量的文件,可以把另一个剩余空间比较多的文件系统中的目录链接到该文件系统当中,删除软链接并不会影响被指向的文件,但是被指向的文件被删除,相关的软连接就成了死链接。

1. 软连接的本质:一个 “路标文件”

  • 想象场景
    图书馆里有本珍贵的书《Linux 秘籍》,存放在 A 区 3 号书架。你想在 B 区 5 号书架 放一个 “路标”,上面写着:“《Linux 秘籍》 → A 区 3 号书架”。这个 “路标” 就是软连接。
  • 技术细节
    软连接是一个独立的文件,有自己的 inode 编号,但它的数据内容只是目标文件的路径(比如 A区3号书架)。内核访问软连接时,会先读取这个路径,再跳转到目标文件。

 

一、软链接规则的底层逻辑(用 “路标” 比喻)

  1. 存路径形式
    软链接就像一张写着 “目标文件地址” 的纸条。比如你在图书馆 A 区有本书,软链接就是一张纸条,上面写 “书在 A 区 3 排 5 号”。它本身是独立文件,只存路径,所以内核访问时,先读纸条内容,再找目标文件。

  2. 能跨文件系统
    硬链接依赖 “文件系统内的唯一房号(inode)”,但软链接像 “全城通用的导航地址”。无论目标文件在哪个 “小区(文件系统)”,只要路径写对,软链接都能指向,就像导航不管目的地在哪个城区,都能指路。

  3. 可链接不存在的文件
    软链接这张 “纸条” 只负责写地址,不检查目标是否存在。比如你先写 “未来会有一本《新书》在 A 区”,软链接允许先创建这个 “规划中的地址”。而硬链接必须先有真实存在的 “书(文件)”,才能复制它的 “房号(inode)”。

  4. 可对目录链接
    软链接指向目录,就像给大楼贴个 “楼内地图指引”,只是告诉用户 “目录在这里”,不会破坏系统结构。但硬链接若允许目录,会让目录结构像 “无限循环的迷宫”(比如 A 目录硬链接到 B,B 又硬链接回 A),系统无法管理,所以禁止。


二、硬链接规则的底层逻辑(用 “共享书籍” 比喻)

  1. 以副本形式存在但不占空间
    硬链接像给同一本书做多个 “书签”。书的内容(数据块)只有一份,多个书签(硬链接)共享书的内容,不产生新数据,所以不占额外空间。

  2. 不允许给目录创建硬链接
    目录结构是文件系统的 “楼层地图”,如果给目录创建硬链接,会让 “地图” 循环(如目录 A 硬链接到目录 B,目录 B 又关联回 A),系统像走进死循环的迷宫,无法正确遍历目录,因此直接禁止。

  3. 只能在同文件系统创建
    每个文件系统的 inode 编号是 “本小区房号”,不同文件系统的 “房号” 可能重复。硬链接依赖 inode 编号定位文件,跨文件系统时 “房号” 会混乱(比如两个小区都有 101 号房),所以只能在同文件系统内创建。

  4. 删除一个硬链接不影响其他
    inode 有一个 “被引用计数”,每创建一个硬链接,计数加 1。删除一个硬链接,只是计数减 1。只要计数 > 0,文件就像 “还有人借的书”,不会消失。只有所有硬链接都删除(计数归 0),文件才会被真正删除。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/982416.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek + 飞书多维表格搭建你的高效工作流

众所周知,大模型DeepSeek擅长于处理大规模语言模型推理任务,特别是在成本降低和思维链推理方面表现出色‌,我们一般把大模型必做我们的大脑,但是一个人不能只有大脑,还需要其他输入输出以及操作支配的眼耳鼻嘴手足等。…

微服务架构下的 Node.js

Node.js 在微服务架构中的特点 轻量级和高效性 Node.js 以其轻量级和高效的特点,非常适合构建微服务架构。它具有事件驱动和非阻塞 I/O 模型,能够在处理高并发请求时表现出色。这意味着 Node.js 可以同时处理大量的并发连接,而不会因为阻塞…

用DeepSeek-R1-Distill-data-110k蒸馏中文数据集 微调Qwen2.5-7B-Instruct!

下载模型与数据 模型下载: huggingface: Qwen/Qwen2.5-7B-Instruct HF MirrorWe’re on a journey to advance and democratize artificial intelligence through open source and open science.https://hf-mirror.com/Qwen/Qwen2.5-7B-Instruct 魔搭&a…

flask-定时任务

文章目录 前言一、APScheduler是什么二、APScheduler 主要功能:三、主要组成部分:四、典型使用场景:五、具体使用1.安装 APScheduler2.假设我们有一个需要五分钟请求一次http接口的任务1.定义一个scheduler.py去专门处理定时2.启动文件处理3.…

Python的Pandas和matplotlib库:让数据可视化贼简单

在数据爆炸的时代,数据可视化已成为数据分析的关键环节。Python 作为强大的编程语言,拥有众多用于数据可视化的库,而 pandas 库在其中扮演着重要角色。它不仅能高效处理和分析数据,还具备强大的数据可视化功能,让我们轻…

rabbitmq版本升级并部署高可用

RabbitMQ版本升级 先检查是否已经安装rabbitmq rpm -qa|grep rabbitmq|wc -l //如果结果是0,表示没有安装 rpm -e --nodeps $(rpm -qa|grep rabbitmq) //如安装了,则进行卸载 先检查是否已经安装erlang rpm -qa|grep erlang|wc -l //如果结果…

Electron-Forge + Vue3 项目初始化

本人对Electron的浅薄理解如下图所示 由上图可以,如果你需要开发一个electron应用,你得具备基本的前端开发经验。对于electron相关的知识,建议先了解下基本的窗口操作,比如新建窗口、关闭窗口等简单的操作,这些内容在…

pinginfoview网络诊断工具中文版

介绍 pinginfoview中文版本是一款实用的网络诊断工具,它专为中文用户设计,提供了方便易用的界面,使得在Windows环境下进行ping测试变得更加简单。该工具是由NirSoft开发的一款免费的桌面应用程序,尽管官方可能并未正式发布中文版…

DeepSeek R1 + 飞书机器人实现AI智能助手

效果 TFChat项目地址 https://github.com/fish2018/TFChat 腾讯大模型知识引擎用的是DeepSeek R1,项目为sanic和redis实现,利用httpx异步处理流式响应,同时使用buffer来避免频繁调用飞书接口更新卡片的网络耗时。为了进一步减少网络IO消耗&…

Go学习笔记:基础语法3

1. 常量 Go语言中的常量使用关键字const定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。 由于编译时的限…

010---基于Verilog HDL的分频器设计

文章目录 摘要一、时序图二、程序设计2.1 rtl2.2 tb 三、仿真分析四、实用性 摘要 文章为学习记录。绘制时序图,编码。通过修改分频值参数,实现一定范围分频值内的任意分频器设计。 一、时序图 二、程序设计 2.1 rtl module divider #(parameter D…

EX_25/3/6

1&#xff1a;是进度条通过线程自己动起来 myThread.h #ifndef MYTHREAD_H #define MYTHREAD_H#include <QThread>class myThread : public QThread {Q_OBJECT public:myThread(QObject* partennullptr);signals:void sig(int value);protected:void run();private:int…

客户端及时通讯系统(1)

编写核心数据结构 一、核心数据结构介绍二、将本地新项目推送到gitee已有仓库上三、代码实现3.1 核心数据结构成员变量设计和工具类设计 一、核心数据结构介绍 1&#xff09;用户信息&#xff08;UserTnfo&#xff09; 用户的属性 2&#xff09;会话信息&#xff08;ChatSess…

针对半导体行业招聘系统有哪些?

近年来&#xff0c;全球半导体产业迎来爆发式增长&#xff0c;芯片设计、制造、封装等环节对高技能人才的需求急剧攀升。然而&#xff0c;行业面临多重挑战&#xff1a;技术迭代快导致岗位要求动态变化、优质人才争夺激烈、传统招聘模式效率低下。以某头部半导体企业为例&#…

汽车智能钥匙中PKE低频天线的作用

PKE&#xff08;Passive Keyless Entry&#xff09;即被动式无钥匙进入系统&#xff0c;汽车智能钥匙中PKE低频天线在现代汽车的智能功能和安全保障方面发挥着关键作用&#xff0c;以下是其具体作用&#xff1a; 信号交互与身份认证 低频信号接收&#xff1a;当车主靠近车辆时…

清华大学DeepSeek赋能家庭教育【附下载链接】

核心要点&#xff1a; DeepSeek通过基础模型&#xff08;V3&#xff09;、深度思考模型&#xff08;R1&#xff09;及联网模型&#xff0c;为家庭教育提供分层支持&#xff1a;V3用于作业辅导&#xff0c;R1培养批判性思维&#xff0c;联网模型助力探究性学习。家长需遵循目标导…

是德科技十周年:以创新丈量未来,用科技赋能世界

是德科技成立十周年&#xff0c;以全球测试测量领域领军者的姿态&#xff0c;书写了一部突破与创新的发展史诗。作为从惠普、安捷伦深厚技术积淀中孕育而生的行业标杆&#xff0c;十年来是德科技始终站在科技浪潮之巅&#xff0c;构建起覆盖5G通信、人工智能、汽车电子、量子计…

Springboot 梳理

一、Springboot 特性 方便创建可独立运行的spring应用程序直接内嵌Tomcat等服务简化了项目的构建配置为spring及第三方库提供自动配置提供生产级特性无需生成代码或者进行xml配置 二、四大核心 自动配置起步依赖命令行界面Actuator - 生成级的特性 三、自动配置的实现原理 …

unity console日志双击响应事件扩展

1 对于项目中一些比较长的日志&#xff0c;比如前后端交互协议具体数据等&#xff0c;这些日志内容可能会比较长&#xff0c;在unity控制面板上查看不是十分方便&#xff0c;我们可以对双击事件进行扩展&#xff0c;将日志保存到一个文本中&#xff0c;然后用系统默认的文本查看…

GPIO相关寄存器

共七种寄存器用于控制GPIO GPIOx_CRL&#xff08;常用&#xff09; GPIOx_CRH&#xff08;常用&#xff09; GPIOx_IDR&#xff08;常用&#xff09; GPIOx_ODR&#xff08;常用&#xff09; GPIOx_BSRR&#xff08;常用&#xff09; GPIOx_BRR&#xff08;不常用&#x…