Linux 系统编程:文件系统的底层逻辑 - inode

《Linux 程序设计》的第三章讲文件操作。在提到 目录 时有这么一段文字:

文件,除了本身包含的 内容 以外,它还会有一个 名字 和一些 属性,即“管理信息”,包括文件的创建 / 修改日期和它的访问权限。这些属性被保存在文件的 inode 中,它是文件系统中的一个特殊数据库,它同时还包含文件的长度和文件在磁盘上存放的位置。系统使用的是文件的 inode 编号,目录结构为文件命名仅仅是为了便于人们使用。

目录 是用于保存其他文件的 节点号名字 的文件。目录文件中的每个数据项都是指向某个文件节点的链接,删除文件名就等于删除与之对应的链接。你可以通过使用 ln 命令在不同的目录中创建指向同一个文件的链接。

刚开始,我不能清晰的理解这两段内容,特别是 inode 。所以我查找了 inode 的资料,发现它是一个重要的基础概念。当我深入了解了 inode 之后,我甚至觉得它是学好 Linux 文件系统的关键。

什么是 inode

当 Linux 创建文件时,会完成两件事情。第一,Linux 在存储设备上保留一块空间用来存储数据。第二,Linux 创建一个称为 索引节点 (index node,简称 inode) 的接口,用来存放文件的属性信息。每一个文件都有对应的 inode ,具体有以下内容:

  • 文件大小,以字节为单位
  • 包含该文件的设备名称
  • 属主的用户标识(Uid)
  • 组标识(Gid)
  • 文件的权限
  • 文件时间戳,共 3 个:inode 上一次修改时间(ctime)、文件上一次修改时间(mtime)、文件上一次访问时间(atime)
  • 指向该文件的链接数
  • 文件类型(普通、目录、特殊、符合连接等)
  • 分配给该文件的块数

需要解释下最后一条:“分配给文件的块数”。文件都存储在 中:文件存储的物理介质,比如硬盘,最小存储单位叫做 扇区(sector),每个扇区存储 512 字节。操作系统读取硬盘时,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即读取一个 (block)。文件存取的最小单位就是块,最常见一个块是 4KB 。

文件系统将所有的 inode 存放在一个大表中,这个表称为 inode 表。在 inode 表中,每个 inode 由唯一编号表示。使用命令 stat 可以查看文件的 inode 信息,比如:
在这里插入图片描述
其中红圈中的数字就是 inode 的编号。
inode 也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是 inode 区,存放 inode 所包含的信息。在我的 Ubuntu 20.4 系统中,一个 inode 占用 256 字节。inode 节点的总数,在格式化时就给定,一般是每 1KB 或每 2KB 就设置一个 inode。因此有可能发生 inode 已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。

查看每个硬盘分区的 inode 总数和已经使用的数量,可以使用 df -i 命令。df 是 disk free-space (磁盘可用空间) 的简称。
在这里插入图片描述
需要注意的是,inode 信息中并没有文件的文件名。下面解释为什么会这样。

当处理目录时,就好像目录实际包含文件一样。例如 home 目录中有 tmp.txt 文件。但是,该目录中并不包含文件。实际上,该目录只包含有文件的名称和文件的 inode 编号。因此,目录的大小相当小。

下面举例说明。当在 home 目录中创建文件 tmp.txt 文件时,首先,系统在硬盘上保留存放该文件的存储空间。接下来,系统查看 inode 表,查找一个空闲的 inode。假设系统查找到的 inode 编号是 #1000,系统会将 tmp.txt 文件的属性信息填到这个 inode 中。最后,系统在 home 目录中存放一个条目。该条目包含名称 tmp.txt ,以及一个编号为 1000 的inode 号。

每当程序需要使用文件时,表面上通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的 inode 编号;其次,通过 inode 编号,获取 inode 信息;最后,根据 inode 信息访问文件即可。

文件名和 inode 之间的连接称为链接。从概念上讲,链接将文件名和文件本身连接起来。系统使用的是文件的 inode 编号,目录结构为文件命名仅仅是为了便于人们使用。这就是为什么 inode 不包含文件名的原因。

实际上,一个 inode 可以由不止一个文件名引用,换句话说,就是一个文件可以有不止一个名称。这称为 多重链接

创建新链接 :ln

硬链接

一般情况下,文件名和 inode 编码是"一一对应"关系,每个 inode 编码对应一个文件名。但是,Unix/Linux系统允许多个文件名指向同一个 inode 编码。

这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。

每当创建文件时,文件系统都会自动在文件名和文件之间创建一个链接。如果希望为已有文件创建一个新链接,使用 ln 命令。以下命令都是创建硬链接:

  • ln tmp.txt new_name.txt:本来只有 tmp.txt 文件,现在 new_name.txt 和 tmp.txt 指向同一个文件。
  • ln /home/desktop/tmp.txt /etc:目录 etc 中也会有 tmp.txt,修改 etc 目录中的 tmp.txt 文件的内容,在 home/desktop 目录下的 tmp.txt 文件内容也会跟着修改。

软连接

硬链接允许为同一个文件指定不止一个名称。但是这样的链接有两个限制:

  1. 不能为目录创建链接。
  2. 不能为不同文件系统中的文件创建链接

为了实现不同文件系统中的目录或文件链接时,需要创建 符号连接 (symbol link)。使用带 -s 选项的 ln 命令。符号链接包含的不是文件的 inode 编号,而是原文件的路径名。每当访问符号链接时,系统借助该路径名查找文件(类似于 Windows 中的快捷方式)。

当使用 ls -l 显示符号链接文件时,需要注意:

  1. 文件类型指示符(最左边的字符) 是小写的 l,表示 link,链接。
  2. 实际的符号链接在输出行的右边显示 (下图红框内)
    在这里插入图片描述
    注意符号链接文件的大小是 10 字节,这恰好是存储路径名占用的大小。如果要查看文件本身的长列表,必须指定实际的路径名:ls -l ../tmp.txt

这种链接方式称为软连接。文件 A 和文件 B 的 inode 编码虽然不一样,但是文件 A 的内容是文件 B 的路径。读取文件 A 时,系统会自动将访问者导向文件 B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件 A 就称为文件 B 的"软链接"(soft link)或者"符号链接(symbolic link)。

这意味着,文件 A 依赖于文件 B 而存在,如果删除了文件 B,打开文件 A 就会报错:“No such file or directory”。这是软链接与硬链接最大的不同:文件 A 指向文件 B 的文件名,而不是文件 B 的 inode 编码,文件 B 的 inode "链接数"不会因此发生变化。







参考资料:
3. 《UNIX & Linux 大学 教程》
4. 《Linux 程序设计》
5. 《理解inode》 - 阮一峰






读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)
千金难买知识,但可以买好多奶粉

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

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

相关文章

ActiveMQ反序列化RCE漏洞复现(CVE-2023-46604)

漏洞名称 Apache ActiveMQ OpenWire 协议反序列化命令执行漏洞 漏洞描述 Apache ActiveMQ 是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。 OpenWire协议在ActiveMQ中被用于…

在虚拟机中安装OpenEuler操作系统

目录 OpenEuler操作系统安装步骤(详细) 一、首先要做好安装前的准备工作: 二、进行虚拟机的创建: 三、OpenEuler 23.09操作系统的安装部署: OpenEuler操作系统安装步骤(详细) 一、首先要做好…

C#基于ScottPlot进行可视化

前言 上一篇文章跟大家分享了用NumSharp实现简单的线性回归,但是没有进行可视化,可能对拟合的过程没有直观的感受,因此今天跟大家介绍一下使用C#基于Scottplot进行可视化,当然Python的代码,我也会同步进行可视化。 P…

从AAAI 2024看人工智能研究的最新热点

图 1 由AAAI 2024论文列表生成的词云 AAAI会议作为全球AI领域的顶级学术盛会,被中国计算机学会(CCF)评为A类会议。AAAI2024的会议论文投稿量达到了历史新高,主赛道收到了12100篇投稿论文,9862篇论文经过严格评审后共有…

imx6ull基于yocto工程的l汇编点亮ed

通过汇编点亮led 在裸机状态下通过汇编点亮led,即没有操作系统,(uboot kernel rootfs 都不需要实现)。 led点亮原理 1.GPIO复用 根据原理图,找到led对应的引脚(pin),复用为GPIO(只有GPIO才能…

一些硬件知识(三)

uint8_t, uint32_t, 和 uint16_t 是 C 和 C 语言中的数据类型&#xff0c;它们分别表示无符号的 8 位、32 位和 16 位整数。这些数据类型定义在标准库 <stdint.h>&#xff08;在 C 语言中&#xff09;或 <cstdint>&#xff08;在 C 中&#xff09;。 uint8_t&…

伴随矩阵定义和计算

一、伴随矩阵定义 1&#xff09;代数余子式 代数余子式也很好理解&#xff0c;在余子式的基础上多了一个-1的次方而已。 2)余子式 余子式很好理解&#xff0c;就是除了这个元素&#xff0c;出去该行该列剩下的行列式的值。 求每个元素的代数余子式&#xff0c;按行求&#xf…

QT基础篇(1)QT概述

1.什么是QT QT是一个跨平台的C应用程序开发框架。它提供了一套丰富的图形用户界面&#xff08;GUI&#xff09;和多媒体功能&#xff0c;可以用于开发各种类型的应用程序&#xff0c;包括桌面应用程序、移动应用程序和嵌入式系统。QT具有易于使用、可定制性强、性能高等特点&a…

uniapp 制作 wgt 包(用于 app 的热更新)

升级版本号 修改 manifest.json 的配置&#xff0c;应用版本名称和应用版本号 必须高于上一版的值。 制作 wgt 包 发布 wgt 包 打开 uni-admin 项目的升级中心 上传后会自动生成下载链接 app 的静默热更新 发布新版后&#xff0c;用户打开app&#xff0c;后台会自动下载 wgt…

pyenv虚拟环境安装和配合pipenv多版本创建

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、下载配置pyenv二、配置多版本虚拟环境总结 前言 最近公司编写了一个自动化用例编写软件&#xff0c;需要适配win7和win10系统&#xff0c;需要同时编译3.8…

基于SSM+vue的新生报到服务管理系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

C++算法学习心得五.二叉树(4)

1.二叉搜索树中的插入操作&#xff08;701题&#xff09; 题目描述&#xff1a;给定二叉搜索树&#xff08;BST&#xff09;的根节点和要插入树中的值&#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证&#xff0c;新值和原始二叉搜索树中的任意…

【Python机器学习】SVM——线性模型与非线性特征

SVM&#xff08;核支持向量机&#xff09;是一种监督学习模型&#xff0c;是可以推广到更复杂模型的扩展&#xff0c;这些模型无法被输入空间的超平面定义。 线模型在低维空间中可能非常受限&#xff0c;因为线和平面的灵活性有限&#xff0c;但是有一种方式可以让线性模型更加…

Linux系统中的IP地址、主机名、和域名解析

1.IP地址 每一台联网的电脑都会有一个地址&#xff0c;用于和其它计算机进行通讯 IP地址主要有2个版本&#xff0c;V4版本和V6版本&#xff08;V6很少用&#xff0c;暂不涉及&#xff09; IPv4版本的地址格式是&#xff1a;a.b.c.d&#xff0c;其中abcd表示0~255的数字&…

echarts x轴下增加一组数据的实现方法

实现效果&#xff1a; 关键代码 xAxis: [{type: category,axisTick:{show: false},axisLine:{show: false},axisLabel:{align:center,},data: [9-w2, 9-w3, 343,9-w2, 9-w3, 343]},{type: category,name: 排比变化,nameTextStyle: {verticalAlign: "left",padding:[…

迈入AI智能时代!ChatGPT国内版免费AI助手工具 peropure·AI正式上线 一个想法写一首歌?这事AI还真能干!

号外&#xff01;前几天推荐的Peropure.Ai迎来升级&#xff0c;现已支持联网模式&#xff0c;回答更新更准&#xff0c;欢迎注册体验&#xff1a; https://sourl.cn/5T74Hu 相信很多人都有过这样的想法&#xff0c;有没有一首歌能表达自己此时此刻的心情&#xff1a; 当你在深…

虚幻UE 特效-Niagara特效初识

虚幻的Niagara特效系统特别的强大&#xff0c;可以为开发者提供丰富的视觉效果&#xff01; 本篇笔记对Niagara系统进行初步的学习探索 文章目录 前言一、Niagara四大核心组件二、粒子发射器和粒子系统1、粒子发射器的创建2、粒子系统的创建3、Niagara系统的使用 总结 前言 在…

SpringBoot之优化高并发场景下的HttpClient并提升QPS

HttpClient优化思路 使用连接池&#xff08;简单粗暴&#xff09; 长连接优化&#xff08;特殊业务场景&#xff09; httpclient和httpget复用 合理的配置参数&#xff08;最大并发请求数&#xff0c;各种超时时间&#xff0c;重试次数&#xff09; 异步请求优化&#xff0…

个人博客教程(Typora官方免费版)

教程 链接&#xff1a;https://pan.baidu.com/s/1kVk3wxrcAPkIy8VrX7CK7g?pwdigiz 提取码&#xff1a;igiz 其实下面的教程都可以通过右键选择你想要的文本来实现&#xff0c;但是掌握基本的语法可以更快&#xff0c;如果看不懂我写的是什么东西可以查看非常简单的入门教程M…

解密Mybatis-Plus:优雅简化你的数据访问层!

目录 1、引言 2、什么是Mybatis-Plus 3、Mybatis-Plus的特点和优势 4、安装和配置Mybatis-Plus 5、使用Mybatis-Plus进行数据库操作 6、Mybatis-Plus的高级功能 7、Mybatis-Plus的扩展和插件 8、与Spring Boot集成 9、结语 1、引言 Mybatis-Plus是一个强大而优雅的Jav…