inode和软硬链接
文章目录:
- 一、理解文件系统
- 1.1 什么是inode
- 1.2 磁盘了解
- 1.2.1磁盘的硬件结构
- 1.2.2 磁盘的分区
- 1.2.3 EXT2文件系统
- 二、软硬链接
- 2.1 软链接
- 2.2 硬链接
一、理解文件系统
1.1 什么是inode
inodes 是文件系统中存储文件元数据的数据结构。每个文件或目录都有一个唯一的 inode 编号来标识它们。
inode 包含了有关文件或目录的信息,如文件的拥有者、所属组、权限、时间戳等。它还包含指向文件内容的指针,以及其它一些元数据(文件属性),如文件大小和文件类型。
使用命令 ls -l
或者 ll
就可以查看到该目录下的文件及其属性:
其中文件对应的属性如下所示(以 myfile.txt 文件为例):
在 Linux 中,文件的元数据和文件内容是分开存储的,其中使用 inode 来保存文件的元数据。为了管理系统中大量的文件,给每一个文件都分配了一个唯一的 inode 编号,便于系统可以快速的访问和管理文件系统中的文件,而不需要扫描整个文件系统。inode 使得文件系统非常高效的处理大量文件和目录。
使用命令 ls -il
可查看当前目录下的文件的 inode 编号:
在计算机中,文件的属性和数据通常存储在文件系统中。文件系统是一种用于在磁盘或其它设备组织和管理文件和目录的机制❗
1.2 磁盘了解
磁盘是一种用于存储电子数据的设备,通常由多个盘片、磁头和马达组成。它是计算机系统中最常见的外部存储设备之一。磁盘可以存储各种类型的数据,包括操作系统、应用程序、文档、音乐、图像等。数据以二进制形式存储在盘片表面的磁性涂层上。当读取或写入数据时,磁头会在盘片表面运动,根据磁性涂层上的磁场变化来读取或写入数据。
1.2.1磁盘的硬件结构
文件保存在磁盘中,为了更好的理解,首先来了解一下磁盘的物理结构:
磁盘的CHS地址:
磁盘的 CHS 地址是一种用于标识磁盘上物理扇区位置的方式,他由柱面(Cylinder)、磁头(Head)、扇区(Sector)三个参数组成,通常被称为 “CHS寻址模式”。在 CHS 寻址模式下,每个物理扇区都由一个唯一的 CHS 地址来定位。柱面号标识磁盘上的圆柱轨道编号,磁头号表示读写磁盘表面的编号,而扇区号则表示每个轨道上的扇区编号。
尽管CHS寻址模式已经被逐渐淘汰,但在早期计算机系统中仍然广泛使用。现代计算机系统使用更高级别的LBA(Logical Block Addressing,逻辑块寻址模式)或者GPT(GUID Partition Table,全局唯一标识分区表)等方式进行数据存取。
1.2.2 磁盘的分区
磁盘的分区是指将一个物理磁盘划分为多个逻辑部分,每个部分称为一个分区。一个磁盘可以划分为一个或多个分区,每个分区看起来像一个独立的磁盘,可以单独格式化、挂载和使用。磁盘一般以扇区为单位,一个扇区的大小通常情况下为 512byte 。如:一个大小为 512G 的磁盘,可以划分为10亿多个扇区。
在 Linux 下,可以使用 ls /dev/vda* -l
命令来查看磁盘的分区信息:
1.2.3 EXT2文件系统
ext2文件系统于1993年问世,由 Remy Card 开发,它是几个 Linux 发行版(如 RedHat 和 Debian)中的第一个默认文件系统。ext2之所以流行并使用了很长的一段时间,是因为它解决了 ext 第一个系列中出现的 inode 和 碎片 等基本问题。
EXT2文件系统使用基于磁盘的存储方案,其中数据被存储在扇区中,每个扇区的大小为4KB。磁盘被分为一个或多个分区,每个分区包含一个超级块、一个或多个组描述符块和多个数据块组。每个数据块组都由超级块(Super Block)、块组描述符(Group Descriptor Table)、块位图(Block Bitmap)、inode位图(inode Bitmap)、inode表(inode Table)和数据块(Data blocks)组成。
- Boot Block(启动块):大小是确定的,占据一个扇区(512byte)。存储着主引导记录与分区表信息。
- Block Group:ext2文件系统会根据分区的大小划分为数个 Block Group。而每个 Block Group 都有着相同的结构组成。
- Super Block(超级块):存放文件系统本身的结构信息。记录的信息主要有:block 和 inode 的总量,未使用的 block 和 inode 的数量,一个 block 和 inode 的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其它文件系统的相关信息。Super Block 的信息被破坏,可以说整个文件系统结构就被破坏了。
- Group Descriptor Table(块组描述符):简称 GDT,描述块组的属性信息。
- Block Bitmap(块位图):记录 Data Block 中哪个数据块已经被使用,哪个数据块没有被使用。
- inode Bitmap(inode 位图):记录 inode Table 中哪一个被使用,哪个没有被使用。每个 bit 位表示一个 inode 是否被使用。
- inode Table(i 节点表):存放文件的属性。
- Data Blocks(数据区):存放文件内容。
将属性和数据分开实际上是如何工作的呢?接下来我们创建一个新的文件来说明一下:
[root@hostname linux]# touch abc
[root@namehost linux]# ls -i abc
263466 abc
创建一个文件时,操作系统通常会执行以下操作:
- 分配空间:操作系统会为哎文件分配磁盘空间,这些空间在文件创建后将被保留以供该文件使用。
- 存储属性:内核先找到一个空的 i 节点(该例子是263466)。内核将文件属性记录到其中。
- 存储数据:该文件需要存储在三个磁盘块中,内核分别找到三个空闲磁盘块:300、500、800。将内核缓冲区的数据分别写到三个磁盘块中。
- 记录分配情况:文件内容按顺序300、500、800存放。内核在 inode 上的磁盘分布区记录了上述块列表。
- 添加文件名到目录:该目录的文件名为 abc。Linux 内核将入口(263466,abc)添加到目录文件。文件名和 inode 之间的对应关系将文件名和文件的内容以及属性连接起来。
文件与 inode 和 data block 之间的关系
在文件系统中,一个文件对应一个 inode ,一个文件可以由一个或多个数据块组成,这些数据块可能存储在磁盘上的不同位置。每个数据块都有一个地址,该地址通常存储在文件的 inode 中。因此,在文件系统中,当我们创建一个文件时,操作系统会为该文件分配一个 inode,并为该文件分配一些数据块。文件内容存储在数据块中,而文件元数据则存储在 inode 中。程序通过 inode 来访问文件,并根据 inode 中存储的指针信息找到相应的数据块来读取或写入文件数据。
如何理解创建一个新文件
- 在创建新文件的目录下找到该目录所在的分区和块组。
- 遍历 inode bitmap 找到一个未使用的位,将该位置为1。在 inode table 中找到该位对应的空间,并将该文件的属性信息写入其中。
- 在 block bitmap 中找到一个或多个未使用的位(具体多少个由写入文件数据的大小来确定),将这些位置为1。然后在 data blocks 中找到对应的数据块,将数据写入数据块中。
- 在 inode table 新创建文件的 inode 的数组中填入对应的数据块信息,建立映射关系。
- 最后,将 inode 名称和文件名的映射关系保存到目录的数据块中。
如何理解删除一个文件
- 将该文件对应的 inode 在 inode bitmap 对应的位置置为 0 。
- 将该文件在 block bitmap 中申请的位置置为 0。
注意:删除文件并不是真正意义上的对文件数据进行删除,而是将删除文件对应的数据置为无效即可。因此,在一些情况下,可以对某些删除的文件进行找回。
二、软硬链接
Linux 中的软链接和硬链接是什么?
软链接(符号链接)是到原始文件的实际链接,而硬链接是原始文件的镜像副本。如果删除原始文件,软链接就失去价值了,因为它删除原始文件后它指向一个不存在的文件。但在硬链接的情况下,情况是完全相反的。即使删除了原始文件,硬链接依旧会有原始文件的数据。因为硬链接是原始文件的镜像副本。
2.1 软链接
在 Windows 中有一个文件快捷方式功能,用于给文件创建快捷方式,如下所示:
软链接类似于上图中的快捷方式。每个软链接文件都有自己的 inode 值,该值引用原始文件。
对一个文件中信息的任何更改都会反映到另外一个文件中。可以跨不同的文件系统连接软链接,如果源文件被删除或传输,软链接文件将无法正常工作。这种链接被称为悬挂链接。删除软链接没有效果,但如果删除原始文件,可能会导致链接停止工作。🎯
可以通过以下命令创建文件的软链接:
[hyr@centos-hyr linux15]$ ln -s d1/d2/d3/test test.c.soft// d1/d2/d3/test : 表示原始文件// test.c.soft : 生成软链接的名称
通过以下代码我们发现,创建的软链接类似于 Windows 中的快捷方式,可在常用路径下创建路径较深可执行程序的快捷方式,便于快捷的执行程序。
在 shell 下执行 ll -i
命令查看文件的 inode 号,可以看到,软链接文件与原始文件的 inode 号是不同的,说明软链接相对于原始文件是一个独立文件,软链接文件里面实际存储的是原始文件的路径(该文件所在路径到原始文件所在路径的路径),而不是其内容。所以相对于原始文件要小很多。
关于软链接:
- 可以遍历文件系统
- 允许跨越目录去连接
- 权限将不会被修改
- 具有与原始文件不同的我呢见权限和 inode
- 只是原始文件的路径,而不是其内容
- 如果我们改变了原始文件的名称,那么该文件所有的软链接都变成了悬空,即它们变得毫无意义
2.2 硬链接
Linux 中的硬链接相当于保存在磁盘驱动器上的文件 - 它实际上是指里链接到磁盘上的某个位置。硬链接的本质是原始文件的镜像。硬连接和软链接之间的区别就在于,删除了原始文件对硬链接是没有影响的,但是删除原始文件对软链接是有影响。因此,硬链接最大的好处是,即使你删除了原始文件,你依旧可以通过硬链接来访问文件。🎯
可以通过以下命令来创建文件的硬链接:
[hyr@centos-hyr linux15]$ ln test.txt test.txt.hard// test.txt : 原始文件// test.txt.hard : 创建的硬链接文件
通过命令 ll -i
命令查看文件的 inode 号,如下:软链接文件与硬链接文件的 inode 号是一样的,且硬链接文件的大小与源文件的大小也是相同的。在建立硬链接之后,原始文件和硬链接文件的链接数都变为了 2 (为什么?)。
如下所示,若创建一个普通文件,则文件初始的硬链接数为1;若创建一个目录,则文件的硬链接数为2(why?)。
当我们创建目录时,该目录下会生成两个隐藏文件 .
和 ..
,.
表示当前目录,..
表示上级目录。因此,.
和 dir
都表示同一个文件(它们的 inode 都是一样的),因此目录生成时硬链接数就是2。
关于硬链接:
- 不能链接目录
- 每个硬链接文件都被分配了与原始文件相同的 inode 值,因为它们引用相同的物理文件位置。硬链接更加灵活,即使原始文件或被链接的文件在整个文件系统中移动也能保持链接,尽管硬链接不能跨不同的文件系统。
- 任何硬链接文件的大小都与原始文件相同,如果我们改变了任何硬链接的内容,那么所有硬链接文件的大小都会更新
- 即使我们改变了原始文件的文件名,硬链接也可以正常工作
- 不能为目录创建硬链接以避免递归循环
- 硬链接的缺点是不能为不同文件系统上的文件创建硬链接,也不能为特殊文件或目录创建硬链接
软链接和硬链接之间的差异:
参数 | 软链接 | 硬链接 |
---|---|---|
inode 值 | 与原始文件的 inode 值不同 | 与原始文件的 inode 值相同 |
目录 | 可以链接目录 | 不能跨目录链接 |
删除原始文件 | 若原始文件被删除,该链接将失效,因为它只是原始文件的快捷方式 | 即使删除原始文件,硬链接也将继续运行,因为它访问的数据与原始文件相同 |
速度 | 较慢 | 较快 |
内存消耗 | 多 | 少 |
总结:硬链接占用的空间更少,工作速度更快,但对它的修改会反映到原始文件中。而软链接需要更多的空间,对软链接的任何更改都不会对原始文件产生影响。
相关文章:

inode和软硬链接
文章目录:一、理解文件系统1.1 什么是inode1.2 磁盘了解1.2.1磁盘的硬件结构1.2.2 磁盘的分区1.2.3 EXT2文件系统二、软硬链接2.1 软链接2.2 硬链接一、理解文件系统 1.1 什么是inode inodes 是文件系统中存储文件元数据的数据结构。每个文件或目录都有一个唯一的 …...

简单分析Linux内核基础篇——initcall
写过Linux驱动的人都知道module_init宏,因为它声明了一个驱动的入口函数。 除了module_init宏,你会发现在Linux内核中有许多的驱动并没有使用module_init宏来声明入口函数,而是看到了许多诸如以下的声明: static int __init qco…...

硬件速攻-AT24CXX存储器
AT24C02是什么? AT24CXX是存储芯片,驱动方式为IIC协议 实物图? 引脚介绍? A0 地址设置角 可连接高电平或低电平 A1 地址设置角 可连接高电平或低电平 A2 地址设置角 可连接高电平或低电平 1010是设备前四位固定地址 …...
C# tuple元组详解
概念 本质就是个数据结构,它是将多个数据元素分组成一个轻型数据结构。 如何声明元组变量(针对.net framework 4.7 和 .net core 2.0) 不带字段名称元组 ## t1就是个变量 它的类型是元组类型 ## 左侧括号定义的是参数列表 等于号右侧就是个t1赋值 #…...

1、Linux初级——linux命令
下载镜像:http://cn.ubuntu.com/dowload 一、基本命令 1、alias(给命令取别名) 例如:alias clls -la(只是临时的) 2、配置文件$ vim ~/.bashrc $ vim ~/.bashrc // 使用vim打开配置文件 (1)在配置文件…...

ChatGPT助力校招----面试问题分享(四)
1 ChatGPT每日一题:电阻如何选型 问题:电阻如何选型 ChatGPT:电阻的选型通常需要考虑以下几个方面: 额定功率:电阻的额定功率是指电阻能够承受的最大功率。在选型时,需要根据电路中所需要的功率确定所选…...

【设计模式】创建型设计模式
文章目录1. 基础①如何学习设计模式② 类模型③ 类关系2. 设计原则3. 模板方法① 定义②背景③ 要点④ 本质⑤ 结构图⑥ 样例代码4. 观察者模式① 定义②背景③ 要点④ 本质⑤ 结构图⑥ 样例代码5. 策略模式① 定义②背景③ 要点④ 本质⑤ 结构图⑥ 样例代码1. 基础 ①如何学习…...

Linux 信号(signal):信号的理解
目录一、理解信号1.信号是什么2.信号的种类二、简单理解信号的生命周期一、理解信号 1.信号是什么 Linux中的信号其实和日常生活中的信号还是挺像的,LInux中的信号是一种事件通知机制,通知进程发生了某个事件。进程接收到信号后,就会中断当前…...

Vulnhub项目:Web Machine(N7)
靶机地址:Web Machine(N7)渗透过程:kali ip:192.168.56.104,靶机ip,使用arp-scan进行查看靶机地址:192.168.56.128收集靶机开放端口:nmap -sS -sV -T5 -A 192.168.56.128开放了80端口࿰…...

Qt基础之三十三:海量网络数据实时显示
开发中我们可能会遇到接收的网络数据来不及显示的问题。最基础的做法是限制UI中加载的数据行数,这样一来可以防止内存一直涨,二来数据刷新非常快,加载再多也来不及看。此时UI能看到数据当前处理到什么阶段就行,实时性更加重要,要做数据分析的话还得查看日志文件。 这里给出…...
linux console快捷键
Ctrl C:终止当前正在运行的程序。Ctrl D:关闭当前终端会话。Ctrl Z:将当前程序放入后台运行。Ctrl L:清除当前屏幕并重新显示命令提示符。Ctrl R:在历史命令中进行逆向搜索。Ctrl A:将光标移动到行首…...
弗洛伊德龟兔赛跑算法(弗洛伊德判圈算法)
弗洛伊德( 罗伯特・弗洛伊德)判圈算法(Floyd Cycle Detection Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm),是一个可以在有限状态机、迭代函数或者链表上判断是否存在环,以及判断环的起点与长度的算法。昨晚刷到一个视频&…...

nodejs篇 express(1)
文章目录前言express介绍安装RESTful接口规范express的简单使用一个最简单的服务器,仅仅只需要几行代码便可以实现。restful规范的五种接口类型请求信息req的获取响应信息res的设置中间件的使用自定义中间件解决跨域nodejs相关其它内容前言 express作为nodejs必学的…...

Java实习生------Redis常见面试题汇总(AOF持久化、RDB快照、分布式锁、缓存一致性)⭐⭐⭐
“年轻人,就要勇敢追梦”🌹 参考资料:图解redis 目录 谈谈你对AOF持久化的理解? redis的三种写回策略是什么? 谈谈你对AOF重写机制的理解?AOF重写机制的具体过程? 谈谈你对RDB快照的理解&a…...

seata服务搭建
它支持两种存储模式,一个是文件,一个是数据库,下面我们分别介绍一下这两种配置nacos存储配置,注意如果registry.conf中注册和配置使用的是file,就会去读取file.config的配置,如果是nacos则通过nacos动态读取…...

Kafka和RabbitMQ有哪些区别,各自适合什么场景?
目录标题1. 消息的顺序2. 消息的匹配3. 消息的超时4. 消息的保持5. 消息的错误处理6. 消息的吞吐量总结1. 消息的顺序 有这样一个需求:当订单状态变化的时候,把订单状态变化的消息发送给所有关心订单变化的系统。 订单会有创建成功、待付款、已支付、已…...

用Pytorch构建一个喵咪识别模型
本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 目录 一、前言 二、问题阐述及理论流程 2.1问题阐述 2.2猫咪图片识别原理 三、用PyTorch 实现 3.1PyTorch介绍 3.2PyTorch 构建模型的五要素 3.3PyTorch 实现的步骤 3.3.…...

QT搭建MQTT开发环境
QT搭建MQTT开发环境 第一步、明确安装的QT版本 注意: 从QT5.15.0版本开始,官方不再提供离线版安装包,除非你充钱买商业版。 而在这里我使用的QT版本为5.15.2,在线安装了好久才弄好,还是建议使用离线安装的版本 在这里…...

Python3,5行代码,生成自动排序动图,这操作不比Excel香?
5行代码生成自动排序动图1、引言2、代码实战2.1 pynimate介绍2.2 pynimate安装2.3 代码示例3、总结1、引言 小屌丝:鱼哥,听说你的excel段位又提升了? 小鱼:你这是疑问的语气? 小屌丝:没有~ 吧… 小鱼&…...

【Java SE】变量的本质
目录一. 前言二. 变量(variable)2.1 性质2.2 变量类型2.2.1 核心区别2.3 变量的使用三. 总结一. 前言 一天一个Java小知识点,助力小伙伴更好地入门Java,掌握更深层次的语法。 二. 变量(variable) 2.1 性质 变量本质上就是代表一个”可操作的存储空间”…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...