一、通用文件模型
通常一个完整的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)。
XFS 文件系统特性:
- 基础定位:XFS 被定义为 “高性能的日志文件系统”,核心优势是伸缩性强和健壮性高。
- 数据能力:
- 数据完全性:确保数据存储、读写过程中的完整性,减少数据丢失风险。
- 可扩展性:支持超大文件和文件系统,最大文件大小达 9 exabytes(1 exabyte = 10²⁴字节),文件系统尺寸最大为 18 exabytes,适合大规模数据存储场景。
- 传输性能:
- 单个文件系统测试中,吞吐量最高达 7GB / 秒;针对常见文件的读写操作,吞吐量也能达到 4GB / 秒,体现高效的数据传输能力。
内核支持的文件系统类型:
- 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)。硬链接作用之一是允许一个文件拥有多个有效路径名称,这样用户就可以建立硬链接到重要文件,以防止“误删除”源数据。
“书的唯一编号”—— inode 编号
图书馆里每本书(不管是小说、工具书,对应文件系统里的普通文件、特殊文件),都会被分配一个独一无二的编号(类似书的 ISBN 码),这个编号就是文件的 inode 编号。它贴在书里,是这本书的 “身份证”,记录着书的内容存放在图书馆的哪个位置(对应文件数据的存储位置)。“多个书签指向同一本书”—— 硬链接
假设你有一本很重要的书《Linux 秘籍》,原本它放在书架 A,对应一个书签(文件名)。现在,你用硬链接创建另一个书签,标记为 “珍贵资料”。这个新书签和原来的书签,都指向《Linux 秘籍》的编号(inode 编号)。
此时,这本书有了两个 “访问身份”,但实际内容还是同一批。“防误删” 的原理
如果有人不小心撕了书架 A 的书签(删除文件名),只要 “珍贵资料” 这个书签还在,依然能通过它找到《Linux 秘籍》。因为两个书签关联的是同一个编号(inode),只要编号还在,书的内容就不会消失。
对应到文件系统:硬链接让一个文件有多个文件名,但共享同一个 inode。删除其中一个文件名,只要还有其他硬链接存在,inode 就不会被真正删除,文件数据也会保留,起到 “防误删” 的作用。
软连接:便于文件的管理,比如把一个复杂路径下的文件链接到一个简单路径下方便用户访问。
节省解决空间不足,某个文件的文件系统空间已经用完,但是必须在该文件系统下创建一个新的目录并存储大量的文件,可以把另一个剩余空间比较多的文件系统中的目录链接到该文件系统当中,删除软链接并不会影响被指向的文件,但是被指向的文件被删除,相关的软连接就成了死链接。
1. 软连接的本质:一个 “路标文件”
- 想象场景:
图书馆里有本珍贵的书《Linux 秘籍》,存放在 A 区 3 号书架。你想在 B 区 5 号书架 放一个 “路标”,上面写着:“《Linux 秘籍》 → A 区 3 号书架”。这个 “路标” 就是软连接。- 技术细节:
软连接是一个独立的文件,有自己的 inode 编号,但它的数据内容只是目标文件的路径(比如A区3号书架
)。内核访问软连接时,会先读取这个路径,再跳转到目标文件。
一、软链接规则的底层逻辑(用 “路标” 比喻)
存路径形式:
软链接就像一张写着 “目标文件地址” 的纸条。比如你在图书馆 A 区有本书,软链接就是一张纸条,上面写 “书在 A 区 3 排 5 号”。它本身是独立文件,只存路径,所以内核访问时,先读纸条内容,再找目标文件。能跨文件系统:
硬链接依赖 “文件系统内的唯一房号(inode)”,但软链接像 “全城通用的导航地址”。无论目标文件在哪个 “小区(文件系统)”,只要路径写对,软链接都能指向,就像导航不管目的地在哪个城区,都能指路。可链接不存在的文件:
软链接这张 “纸条” 只负责写地址,不检查目标是否存在。比如你先写 “未来会有一本《新书》在 A 区”,软链接允许先创建这个 “规划中的地址”。而硬链接必须先有真实存在的 “书(文件)”,才能复制它的 “房号(inode)”。可对目录链接:
软链接指向目录,就像给大楼贴个 “楼内地图指引”,只是告诉用户 “目录在这里”,不会破坏系统结构。但硬链接若允许目录,会让目录结构像 “无限循环的迷宫”(比如 A 目录硬链接到 B,B 又硬链接回 A),系统无法管理,所以禁止。
二、硬链接规则的底层逻辑(用 “共享书籍” 比喻)
以副本形式存在但不占空间:
硬链接像给同一本书做多个 “书签”。书的内容(数据块)只有一份,多个书签(硬链接)共享书的内容,不产生新数据,所以不占额外空间。不允许给目录创建硬链接:
目录结构是文件系统的 “楼层地图”,如果给目录创建硬链接,会让 “地图” 循环(如目录 A 硬链接到目录 B,目录 B 又关联回 A),系统像走进死循环的迷宫,无法正确遍历目录,因此直接禁止。只能在同文件系统创建:
每个文件系统的 inode 编号是 “本小区房号”,不同文件系统的 “房号” 可能重复。硬链接依赖 inode 编号定位文件,跨文件系统时 “房号” 会混乱(比如两个小区都有 101 号房),所以只能在同文件系统内创建。删除一个硬链接不影响其他:
inode 有一个 “被引用计数”,每创建一个硬链接,计数加 1。删除一个硬链接,只是计数减 1。只要计数 > 0,文件就像 “还有人借的书”,不会消失。只有所有硬链接都删除(计数归 0),文件才会被真正删除。