Linux 文件系统超详解

一.磁盘

磁盘是计算机的主要存储介质,它可以存储大量二进制数据,即使断电后也可以保证数据不会丢失。下面我们将了解磁盘的物理结构、存储结构以及逻辑结构。

 磁盘的存储结构

1. 磁盘寻址的时候,基本单位既不是bit也不是byte,而是扇区。
2. 扇区的大小是512字节。512字节是硬件要求,外磁道和内磁道都是一样的,它们只是密度不同。越靠近圆心的比特位越大,否则就越小。
3. 在单面上定位扇区:通过确定磁道,以及确定对应磁道的扇区,来具体确定该区间。确定磁道:.每一个磁道都有自己的编码,磁道周长不同,但是存储大小相同。由于扇区大小是相同的,因此每一个磁道有多少个扇区也是一定的,所以每一个磁道的扇区也是有编号的,因此定位到磁道就能找到对应扇区。
4. 机械硬盘的寻址方式:盘片不断的转动,磁头不断的摆动,就是在确认在哪个磁道。如何确定扇区?盘片的先选择就是让其磁头定位扇区。
5. 柱面:把一系列同心的磁道压在一起,宏观上看成一个整体。一般定位的时候,(磁头、柱面、扇区)与(磁头、磁道、扇区)这两个是等价的。磁头指向的位置就是柱面的边界位置。
6. 在磁盘中定位扇区:先定位在哪个磁道(在哪个柱面),磁道定位后,(因为,所有磁头共同进退)再去定位盘面(磁头),最后确定是哪一个扇区。

总结:在磁盘中定位一个扇区,采用的是硬件级别定位方法(CHS定位法):柱面(Cylinder)——磁头(Head)——扇区(Sector)

二.文件系统与inode

1.文件在磁盘中是如何存储的?

磁盘的空间很大,OS的文件系统会以1KB、2KB、4KB为单位定制多个扇区进行读写,即使读取/修改1bit的内容,也必须将4KB的内容全部加载到内存中进行读取或修改,完成操作后再将其写回磁盘。虽然磁盘访问的基本单位是512字节,但这相对于整个磁盘的大小还是很小的。为了方便管理,我们采用分治的思想,对磁盘空间进行分区:将1个较大的磁盘空间分为多个较小的磁盘空间,再给不同的分区内写入不同的文件系统。

在一个分区内部再进行分组,然后写入文件系统,管理好每一个分组就可以管理好一个分区。

这一过程是”格式化“,在磁盘中写入文件系统。

文件 =  内容 + 属性(也就是数据),文件在磁盘中的存储,本质就是存储文件的内容和文件的属性的数据。

Linux文件系统特定:文件内容和文件的属性数据分开存储

· Data blocks(数据区):存放文件内容

· Block Bitmap(块位图):记录着 Data blocks 中哪个数据块已被占用,哪个没被占用,Block Bitmap里的块有编号,块里的内容表示是否被占用。

· i节点表(inode Table):存放文件属性 如 文件大小,所有者,最近修改时间等。

· inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。

· GDT,Group Descriptor Table:块组描述符,描述块组属性信息。

· 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。(不是每个分组都有的)

Linux中文件的属性是一个固定大小的集合体,inode内部是不包含文件名的,内核层面,每一个文件都要有inode number!我们通过inode号标识一个文件。(我们可以通过指令ls -li 来查询文件对应的inode编号。)

删除文件时并不需要将文件的数据和内容情况,只需要将对应文件的inode在inode bitmap中的比特位 置为0即可(即使不将它们清空也不会影响新文件的存储,因为新文件的数据会直接将原数据覆盖掉)。因此,在删除文件后是可以及时将文件恢复的,恢复文件只需要找到inode的编号,然后将inode bitmap中对应比特位的值由0置为1,再去inode table对应映射表,将blosk bitmap由0置为1即可。
如果在Linux中误删一个文件,还是可以恢复的(前提是文件的inode和data block没有被占用),因此当误删一个文件时最好的做法是什么也不做。
在windows下,删除文件到回收站,实际上是将文件转移到回收站的目录而已,只有在回收站中删除才是真的删除。

为什么我们在目录中查找文件时,用的是文件名而不是inode id?
因为任何一个文件都是创建在目录下的(注意,同一目录下不能出现相同文件名的两个文件),而目录也是一个文件,也有自己的inode,以及data block。目录的数据块(data block)中存储的是当前目录下文件的文件名与文件inode id的对应关系(这也是为啥inode中不保存文件名)。
新增文件要在当前目录的内容(data block)中添加该文件名与inode id的映射关系,所以当我们在一个目录下新增文件时,必须要有对目录的写权限。
罗列当前目录的文件,要有对目录的读权限,想知道目录中的文件,需要根据文件名找到inode,再读取该文件的属性。读目录内容是要拿到文件名,因此,目录必须要有读权限。

三.软硬链接

1.软链接

创建软链接:
ln -s <目标路径> <链接路径>

例如,创建软链接soft_text.txt文件指向text.txt文件

从上图中可以看到,soft_text.txt有自己独立的inode,它是一个独立的文件,具有自己独立的内容。
所谓的软链接标定文件,它并非用文件的inode来标记。
看这个现象:我们删除text.txt然后再去cat soft_text.txt:

软链接的数据块中保存的是指向目标文件的路径,当目标文件被删除时,软链接也就失效了。

可以理解为你电脑桌面的快捷方式

删除软链接:
rm
rm -f soft_text.txt//和删除普通文件一样ulink
ulink ssoft_text.txt//删除链接

2.硬链接

创建硬链接:

ln <目标路径> <链接路径>

可以发现硬链接的inode和text.txt的相同,它没有独立的inode,用的是目标文件的inode。

硬链接的作用?
当某一个硬链接的文件大小和内容发生变化,那么它对应的目标文件以及所有目标文件的硬链接都会一起发生改变。
硬链接没有创建新的文件,它没有独立的inode、内容。它用的全部是目标文件的inode和内容。

创建硬链接的本质就是在指定的路径下,新增文件名和inode的映射关系

一个inode可能会被多个文件名所映射,为了方便管理,inode有一个计数器count的引用计数,也将引用计数称为硬链接数:

当我们删除硬链接后,计数由2变为1.

硬链接的作用
1.为啥创建一个普通文件时,硬链接数是1?
因为,普通文件本身就有一个文件名和inode对应(只要创建文件,就有一个inode的映射关系)。
2.为啥创建一个目录,它的硬链接数是2?
因为目录名与它自己的inode就是一组1映射关系;其次,目录内部的'.'('.'也表示当前目录,它也是文件名)和inode也是一组映射,所以硬链接数是2。特别的,如果在当前目录下再创建一个目录,当前目录的硬链接数就会变为3。这是因为,当前目录下创建的子目录中默认的有一个文件名'..''..'表示上一层目录,它也是文件名)和当前目录的inode也是一组映射。

用户不能给目录建立硬链接

1. 为什么不允许给目录建立硬链接呢?
如果允许给目录建立硬链接,则可能会打破文件系统目录的有向无环图结构,创建目录循环,导致fsck以及其他的遍历文件树的软件出错。可能会出现:你的子目录是你的父目录这种奇怪的现象,即当前目录的子目录是硬链接的当前目录的父目录这种情况,此时很多遍历系统的命令(du, ls -r, pwd等)就无法使用了,因为可能会导致无限循环。
2. 为什么软链接就不会出现循环调用这个情况呢?
上文中,我们了解到软链接所指向的是链接文件本身的信息,而不是链接文件指向的文件的信息;硬链接直接指向的是inode,而不是路径(直接指向链接文件所指向的文件信息)。这就意味着,在遍历的时候,如果是软链接就不会出现环路从而导致死循环。因此不允许用户给目录建立硬链接。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年大模型与Transformer架构:重塑AI未来的科技革命

引言&#xff1a;一场关于智能的革命 想象一下&#xff0c;当你向一个虚拟助手提问时&#xff0c;它不仅能够准确理解你的需求&#xff0c;还能生成一段流畅且富有逻辑的回答&#xff1b;或者当你上传一张模糊的照片时&#xff0c;系统可以快速修复并生成高清版本——这一切的…

GO语言学习(16)Gin后端框架

目录 ☀️前言 1.什么是前端&#xff1f;什么是后端&#xff1f;&#x1f300; 2.Gin框架介绍 &#x1f337; 3.Gin框架的基本使用 -Hello&#xff0c;World例子&#x1f337; &#x1f33f;入门示例 - Hello&#xff0c;World &#x1f4bb;补充&#xff08;一些常用的网…

深入解析 Git Submodule:从基础到高级操作指南

深入解析 Git Submodule&#xff1a;从基础到高级操作指南 一、Git Submodule 是什么&#xff1f; git submodule 是 Git 提供的一个强大功能&#xff0c;允许在一个 Git 仓库&#xff08;主仓库&#xff09;中嵌入另一个独立的 Git 仓库&#xff08;子模块&#xff09;。主仓…

电子电气架构 --- EEA演进与芯片架构转移

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…

如何用deepseek生成流程图

软件准备&#xff1a; 在线流程图【Flowchart Maker & Online Diagram Software】或【process on】 步骤&#xff1a; 1、用 【DeepSeek】生成 结构化内容&#xff08;Mermaid文件&#xff09; 1.1、向deepseek输入指令&#xff1a;【帮我用mermaind写出“某某”的具体…

【华为OD技术面试真题 - 技术面】- Java面试题(17)

华为OD面试真题精选 专栏:华为OD面试真题精选 目录: 2024华为OD面试手撕代码真题目录以及八股文真题目录 文章目录 华为OD面试真题精选虚拟机分区1. **虚拟磁盘分区**2. **虚拟机的内存分区**3. **CPU分配**4. **虚拟网络分区**5. **存储虚拟化和分区**6. **虚拟机分区管理**…

Linux | I.MX6ULL内核及文件系统源码结构(7)

01 类型 描述 备注 ARM 交叉编译器 版本&#xff1a;4.9.4 提供软件工具 Uboot 版本&#xff1a;2016.03 提供源码 支持LCD显示&#xff1b;支持网口&#xff1b; 支持 EMMC,NAND FLASH&#xff1b; 支持环境变量修改保存 Linux 内核 版本&#xff1a;4.1.15 提供…

0基础入门scrapy 框架,获取豆瓣top250存入mysql

一、基础教程 创建项目命令 scrapy startproject mySpider --项目名称 创建爬虫文件 scrapy genspider itcast "itcast.cn" --自动生成 itcast.py 文件 爬虫名称 爬虫网址 运行爬虫 scrapy crawl baidu(爬虫名&#xff09; 使用终端运行太麻烦了&#xff0c;而且…

鸿蒙NEXT小游戏开发:猜小球

1. 引言 “猜小球”是一个经典的益智游戏&#xff0c;通常由一名表演者和多名参与者共同完成。表演者会将一个小球放在一个杯子下面&#xff0c;然后将三个杯子快速地交换位置&#xff0c;参与者则需要猜出最终哪个杯子下面有小球。本文将介绍如何使用HarmonyOS NEXT技术&…

网络购物谨慎使用手机免密支付功能

在数字经济蓬勃发展的当下&#xff0c;“免密支付”成为许多人消费时的首选支付方式。 “免密支付”的存在有其合理性。在快节奏的现代生活中&#xff0c;时间愈发珍贵&#xff0c;每节省一秒都可能带来更高的效率。以日常通勤为例&#xff0c;上班族乘坐交通工具时&#xff0c…

记录 | Android getWindow().getDecorView().setSystemUiVisibility(...)设置状态栏属性

纯纯的一边开发一边学习&#xff0c;是小白是菜鸟&#xff0c;单纯的记录和学习&#xff0c;大神勿喷&#xff0c;理解有错望指正&#xff5e; getWindow().getDecorView().setSystemUiVisibility(…) 该方法用于控制系统 UI&#xff08;如状态栏、导航栏&#xff09;的可见性…

java虚拟机---JVM

JVM JVM&#xff0c;也就是 Java 虚拟机&#xff0c;它最主要的作用就是对编译后的 Java 字节码文件逐行解释&#xff0c;翻译成机器码指令&#xff0c;并交给对应的操作系统去执行。 JVM 的其他特性有&#xff1a; JVM 可以自动管理内存&#xff0c;通过垃圾回收器回收不再…

VectorBT:使用PyTorch+LSTM训练和回测股票模型 进阶四

VectorBT&#xff1a;使用PyTorchLSTM训练和回测股票模型 进阶四 本方案融合 LSTM 时序预测与动态风险控制。系统采用混合架构&#xff0c;离线训练构建多尺度特征工程和双均线策略&#xff0c;结合在线增量更新持续优化模型。技术要点包括三层特征筛选、波动率动态仓位管理、混…

前端中rem,vh,vw

1. rem&#xff08;Root EM&#xff09; 参照对象 基准&#xff1a;相对于 根元素&#xff08;<html>&#xff09;的 font-size 计算。 默认情况下&#xff0c;浏览器的根 font-size 为 16px&#xff08;即 1rem 16px&#xff09;&#xff0c;但可通过 CSS 修改&#…

详解 MySQL 常见的存储引擎及它们之间的区别

MySQL 支持多种存储引擎&#xff0c;每种引擎针对不同的应用场景提供了特定的特性和优化。下面是几种常见的存储引擎以及它们之间的主要区别&#xff1a; 常见存储引擎 1. InnoDB&#xff08;重点&#xff09; 事务支持&#xff1a; 完全支持 ACID 事务&#xff0c;确保数据一…

html+css+js 实现一个贪吃蛇小游戏

目录 游戏简介 游戏功能与特点 如何玩转贪吃蛇 游戏设计与实现 HTML结构 JavaScript核心实现 代码结构&#xff1a; 效果 关于“其他游戏” 游戏简介 贪吃蛇是一款经典的单人小游戏&#xff0c;玩家通过控制蛇的移动&#xff0c;吃掉食物来增加长度&#xff0c;避免撞…

GLSL(OpenGL 着色器语言)基础语法

GLSL&#xff08;OpenGL 着色器语言&#xff09;基础语法 GLSL&#xff08;OpenGL Shading Language&#xff09;是 OpenGL 计算着色器的语言&#xff0c;语法类似于 C 语言&#xff0c;但提供了针对 GPU 的特殊功能&#xff0c;如向量运算和矩阵运算。 着色器的开头总是要声明…

ngx_http_core_merge_srv_conf

定义在 src\http\ngx_http_core_module.c static char * ngx_http_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) {ngx_http_core_srv_conf_t *prev parent;ngx_http_core_srv_conf_t *conf child;ngx_str_t name;ngx_http_server_name_t…

uni-app:firstUI框架的选择器Select改造,添加一个搜索的插槽

<fui-select :show"showSiteType" :options"siteTypeList" textKey"dict_label" title"请选择站点类型" confirm"chooseSiteType" close"onCloseSiteType"><template v-slot:search><view><…

Debian/Ubuntu的networking的`/etc/network/interfaces`配置文件,如何配置route路由

Debian/Ubuntu的networking的/etc/network/interfaces配置文件,如何配置route路由 在 Debian/Ubuntu 系统中&#xff0c;通过 /etc/network/interfaces 配置文件配置路由&#xff08;静态路由或默认路由&#xff09;可以通过以下方式实现。以下是详细配置方法及示例&#xff1…