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.mfbz.cn/a/318148.html

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

相关文章

SV-9001 壁挂式网络采播终端

SV-9001 壁挂式网络采播终端 一、描述 SV-9001是深圳锐科达电子有限公司的一款壁挂式网络采播终端,具有10/100M以太网接口,配置一路线路输入和一组麦克风输入,可以直接连接音源输出设备或麦克风,将采集音源编码后发送至网络播放终…

RuoYi-Vue-Plus 5.X登录前流程及解密

一:问题 1. 前端传给后端的是一个加密字符串,后端controller层login接口怎么就直接解密了呢? 2. 中间经过什么步骤到达的登录接口呢? 二:个人分析 首先考虑的是拦截器、过滤器、切面AOP; 1. 使用全文搜…

【重学C语言】二、前期准备和第一个C程序

【重学C语言】二、前期准备和第一个C程序 1. VS 项目1.1 创建项目 2. Clion 项目(本博主主用)2.1 创建项目2.2 Clion 配置 3. 构建类型4. 构建模式5. 注释6. 第一个 C 程序7. 程序闪退8. 新手遇到的问题 1. VS 项目 1.1 创建项目 打开 VS 创建新项目 创建 main.c 书写以下…

轻松查看WiFi密码的神奇脚本,让你忘记密码也不再是问题

说在前面 🎈本文介绍了一个便捷的脚本,可以帮助你获取电脑中保存的所有Wi-Fi网络的密码。不再需要担心忘记Wi-Fi密码或手动查找密码的麻烦,只需运行脚本即可一键获取。 一、引言 互联网的普及让我们离不开Wi-Fi网络,但忘记密码时…

贝叶斯分类器(公式推导+举例应用)

文章目录 引言贝叶斯决策论先验概率和后验概率极大似然估计朴素贝叶斯分类器朴素贝叶斯分类器的优点与缺点优点缺点 总结实验分析 引言 在机器学习的世界中,有一类强大而受欢迎的算法——贝叶斯分类器,它倚仗着贝叶斯定理和朴素的独立性假设&#xff0c…

fisco-bcos部署pro生产版本

我这里使用的 Ubuntu20.4系统,linux系统把操作命令apt改为yum即可 升级安装包 apt-get update 安装jdk,我这里使用jdk17 apt -y install openjdk-17-jdk-headless 查看java版本 java -version 安装依赖 apt-get install -y curl docker.io docker-com…

关于React你必须知道的3个错误用法。

1. 你知道如何使用“&&”吗? 在React程序中,我经常使用“&&”运算符来决定是否显示内容,如下所示: 我的组长: “你不知道&&运算符的特性吗?当请求还没有成功返回时,会直接渲染“0”。” 我并不信服, 因为我一直都是这样编写代码,从未出过错。为了…

详解CAS及ABA问题

🌈🌈🌈今天给大家分享的是 CAS 问题。 清风的CSDN博客 🛩️🛩️🛩️希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! ✈️✈️✈️动动…

代码随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期 、714.买卖股票的最佳时机含手续费

代码随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期 、714.买卖股票的最佳时机含手续费 最佳买卖股票时机含冷冻期 309.最佳买卖股票时机含冷冻期 文章讲解:https://programmercarl.com/0309.%E6%9C%80%E4%BD%B3%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%…

U盘安装XP纯净版系统教程软件安装教程(附软件下载地址)

软件简介: 软件【下载地址】获取方式见文末。注:推荐使用,更贴合此安装方法! U盘安装XP纯净版系统是一种便捷且快速的方式,以实现系统重装或升级的需求。这篇教程将为您详细介绍如何使用U盘来安装XP纯净版系统。XP纯…

前端面试题集合七(ES6、ES7、ES8、ES9、ES10、ES11、ES12)

ES6(2015) 1. 类(class) class Man {constructor(name) {this.name 小豪;}console() {console.log(this.name);} } const man new Man(小豪); man.console(); // 小豪 2. 模块化(ES Module) // 模块 A 导出一个方法 export …

Spring创建的单例对象,存在线程安全问题吗?

这个问题涉及到Spring框架中的Bean的作用域、单例模式的线程安全性以及如何判断和处理线程安全问题。让我们一步步深入探讨这些概念。 Spring Bean的作用域 Spring提供了几种不同的Bean作用域,包括: 1、 Singleton(单例)&#x…

LeetCode刷题:142. 环形链表 II

题目: 是否独立解决:否,参考了解题思路解决问题,思考了用快慢指针,栈,统计链表数量定位尾巴节点(因为是环形链表所以是死循环,链表数量用while循环统计不出来)都没解决 解…

stm32 - 基础架构

stm32 - 基础架构 基础架构外设概念系统结构引脚定义晶振工程 基础架构 外设概念 NVIC (内核外设) SysTick (内核外设) 其他是片上外设 系统结构 内核引出三条总线 ICode 指令总线: 连接Flash闪存(编写的…

Netfilter 是如何工作的(六):连接跟踪信息的入口创建(in)和出口确认(confirm)

Articles (gitee.io) IPtables-朱双印博客 (zsythink.net) 在 Netfilter 是如何工作的(五) 中连接跟踪信息使用的创建-确认机制的 Netfilter在报文进入系统的入口处,将连接跟踪信息记录在报文上,在出口进行confirm.确认后的连接信息 本文以一个本机上送…

opencv3.4.12全景拼接

最近camera项目需要用到全景拼接,故此查阅大量资料,终于将此功能应用在实际项目上,下面总结一下此过程中遇到的一些问题及解决方式,同时也会将源码附在结尾处,供大家参考。 首先说一下此源码的大概执行流程&#xff0c…

阅读文献-胃癌

写在前面 今天先不阅读肺癌的了,先读一篇胃癌的文章 文献 An individualized stemness-related signature to predict prognosis and immunotherapy responses for gastric cancer using single-cell and bulk tissue transcriptomes IF:4.0 中科院分区:2区 医学…

行为型设计模式——备忘录模式

备忘录模式 备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,很多软件都提供了撤销(Undo)操作…

Ceph入门到精通-通过 CloudBerry Explorer 管理对象bucket

简介 CloudBerry Explorer 是一款可用于管理对象存储(Cloud Object Storage,COS)的客户端工具。通过 CloudBerry Explorer 可实现将 COS 挂载在 Windows 等操作系统上,方便用户访问、移动和管理 COS 文件。 支持系统 支持 Wind…

【动态规划】【滑动窗口】C++算法:3003 执行操作后的最大分割数量

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 C算法:滑动窗口总结 动态规划 LeetCode3003 执行操作后的最大分割数量 给你一个下标从 0 开始的字符串 s 和一个整数 k。 你需要执行以下分割操作,直到字符串 s 变为 空&#xff1…
最新文章