【Linux】20.基础IO(2)

文章目录

  • 2. 理解文件系统
    • 2.1 inode
    • 2.2 如何理解目录
    • 2.3 硬链接
    • 2.4 软链接
    • 2.5 硬链接和软链接的区别


2. 理解文件系统

2.1 inode

我们使用ls -l的时候看到的除了看到文件名,还看到了文件元数据。

ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ ll
total 8
drwxrwxr-x  2 ydk_108 ydk_108 4096 Jan 23 17:05 ./
drwxrwxr-x 16 ydk_108 ydk_108 4096 Jan 23 17:05 ../
ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ 

每行包含7列:

  1. 模式
  2. 硬链接数
  3. 文件所有者
  4. 大小
  5. 最后修改时间
  6. 文件名

ls -l读取存储在磁盘上的文件信息,然后显示出来

37bb1623183afb44a4b5b6fc777f1640

其实这个信息除了通过这种方式来读取,还有一个stat命令能够看到更多信息

root@iZuf68hz06p6s2809gl3i1Z:~/108_class# stat test.txt
  File: test.txt
  Size: 168894    	Blocks: 336        IO Block: 4096   regular file
Device: fc03h/64515d	Inode: 523299      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2025-01-11 14:56:30.477415933 +0800
Modify: 2025-01-11 14:55:52.332005160 +0800
Change: 2025-01-11 14:55:52.332005160 +0800
 Birth: -
root@iZuf68hz06p6s2809gl3i1Z:~/108_class# 

上面的执行结果有几个信息需要解释清楚

为了能解释清楚inode我们先简单了解一下文件系统

dae313d8cfc2ea56a1aa9380c7dd8b1e

  • Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子

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

  • GDT:块组描述符,描述块组属性信息,有兴趣的可以在了解一下

  • 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用

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

  • i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等

  • 数据区:存放文件内容

Linux系统中,一个文件,一个inode。每一个inode都有自己的inode编号(inode的设置,是以分区为单位的,不能跨分区)

inode表示文件的所有属性。文件名,并不属于inode内的属性。

将属性和数据分开存放的想法看起来很简单,但实际上是如何工作的呢?我们通过touch一个新文件来看看如何工作。

[root@localhost linux]# touch abc
[root@localhost linux]# ls -i abc
263466 abc

aa6d788562c4604f30cd705b5559985a

创建一个新文件主要有一下4个操作:

  1. 存储属性
    内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。
  2. 存储数据
    该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据
    复制到300,下一块复制到500,以此类推。
  3. 记录分配情况
    文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。
  4. 添加文件名到目录

新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文件。

文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。


2.2 如何理解目录

  1. 如何理解"目录”

    目录也是文件,也有自己的inode。目录也要有自己的属性

  2. 目录要不要数据块?

    目录也有数据块。

  3. 里面放什么呢?

    该目录下,文件的文件名 和 对应文件的inode的映射关系。

目录是文件,也有ingde编号:

这些问题都与目录的本质及其权限管理密切相关,我来统一解释:

目录本质上是一个特殊的文件,其内部存储着文件名与inode号的映射关系:

  1. 为什么同名文件不能存在:

    • 目录文件内部是一张表,存储着 “文件名→inode号” 的映射

    • 文件名是这张表的主键/索引

    • 如果允许同名,就会造成一个文件名对应多个inode号,系统就无法确定要访问哪个文件

  2. 目录没有w权限:

    • w权限控制目录内容的修改权限

    • 不能创建文件是因为创建文件需要在目录的映射表中添加新的"文件名→inode"记录

    • 没有w权限就无法修改这张映射表,所以无法创建新文件

  3. 目录没有r权限:

    • r权限控制读取目录内容的权限

    • 不能查看文件是因为无法读取目录的映射表

    • 无法获取目录下文件名和inode的对应关系

  4. 目录没有x权限:

    • x权限控制目录的访问/切换权限

    • 系统需要通过目录的inode找到目录的数据块,才能访问目录内容

    • 没有x权限就无法访问目录的inode信息,自然无法进入目录

这些权限的组合形成了一个完整的访问控制体系:

  • 要完整使用一个目录,需要同时具备r、w、x三个权限
  • r权限让你能看到文件列表
  • w权限让你能修改目录内容(创建、删除、重命名文件)
  • x权限让你能访问目录本身和其中的文件
  • 这三种权限相互配合,确保了文件系统的安全性和可用性

总结来说,目录作为一个特殊的文件,其inode和权限系统共同构建了一个层级化的文件组织和访问控制机制。


2.3 硬链接

我们看到,真正找到磁盘上文件的并不是文件名,而是inode。 其实在linux中可以让多个文件名对应于同一个inode

[root@localhost linux]# touch abc 
[root@localhost linux]# ln abc def 
[root@localhost linux]# ls -1i
abc def 263466 abc 263466 def

abcdef的链接状态完全相同,他们被称为指向文件的硬链接。

内核记录了这个连接数,inode 263466 的硬连接数为2

我们在删除文件时干了两件事情:

  1. 在目录中将对应的记录删除。

  2. 将硬连接数-1,如果为0,则将对应的磁盘释放。

硬链接不是一个独立的文件!因为他没有独立的inode

该如何理解硬链接?

所谓的建立硬链接,本质其实就是在特定目录的数据块中新增 文件名和指向的文件的inode 编号的映射关系。

任意一个文件,无论是目录,还是普通文件,都有inode。每一个inode内部,都有一个叫做引用计数的计数器(有多少个文件名指向我)。


2.4 软链接

硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件,在shell中的做法

263563 -rw-r--r--. 2 root root 0 915 17:45 abc
261678 lrwxrwxrwx. 1 root root 3 915 17:53 abc.s -> abc
263563 -rw-r--r--. 2 root root 0 915 17:45 def

b611fd1c006686e7025cf82fdb42de12

软链接是一个独立的文件,具有独立的inode

该如何理解软链接?

软链接是一个独立的文件,有独立的inode,也有独立的数据块,他的数据块里面保存的是指向的文件的路径,相当于windows快捷方式


2.5 硬链接和软链接的区别

inode号:

  • 硬链接:与源文件拥有相同的inode
  • 软链接:有自己独立的inode

文件大小:

  • 硬链接:与源文件大小完全相同
  • 软链接:只占用存储源文件路径名的空间(通常很小)

原文件删除:

  • 硬链接:不受影响,仍然可以访问文件内容
  • 软链接:失效,无法访问(出现断链)

跨文件系统:

  • 硬链接:不能跨文件系统建立
  • 软链接:可以跨文件系统建立

支持目录:

  • 硬链接:不能对目录创建硬链接
  • 软链接:可以对目录创建软链接

常见应用场景:

硬链接适用于:

  • 需要在同一文件系统内保持文件多份副本
  • 想要节省存储空间
  • 确保文件不会因某个链接删除而丢失
  • 通常用来进行路径定位,采用硬链接,可以进行目录间切换

软链接适用于:

  • 需要跨文件系统建立链接
  • 需要链接目录
  • 创建容易理解的快捷方式
  • 经常需要修改链接指向

使用示例:

# 创建示例文件
echo "Hello" > source.txt

# 创建硬链接
ln source.txt hardlink.txt

# 创建软链接
ln -s source.txt softlink.txt

# 查看链接情况
ls -li
# 可以看到硬链接共享同一个inode号
# 软链接有独立的inode号

# 删除源文件测试
rm source.txt
# 硬链接仍然可用
# 软链接会失效

总结:

  • 硬链接更安全但使用受限
  • 软链接更灵活但可能出现断链
  • 选择哪种链接取决于具体使用场景

补充:

ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ ll
total 8
drwxrwxr-x  2 ydk_108 ydk_108 4096 Jan 23 17:05 ./
drwxrwxr-x 16 ydk_108 ydk_108 4096 Jan 23 17:05 ../
ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ ll -li
total 8
527696 drwxrwxr-x  2 ydk_108 ydk_108 4096 Jan 23 17:05 ./
523318 drwxrwxr-x 16 ydk_108 ydk_108 4096 Jan 23 17:05 ../
ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ ll -lia
total 8
527696 drwxrwxr-x  2 ydk_108 ydk_108 4096 Jan 23 17:05 ./
523318 drwxrwxr-x 16 ydk_108 ydk_108 4096 Jan 23 17:05 ../
ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ pwd
/home/ydk_108/108/lesson20
ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ ls /home/ydk_108/108/lesson20 -dil
527696 drwxrwxr-x 2 ydk_108 ydk_108 4096 Jan 23 17:05 /home/ydk_108/108/lesson20
ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ ls /home/ydk_108/108 -dil
523318 drwxrwxr-x 16 ydk_108 ydk_108 4096 Jan 23 17:05 /home/ydk_108/108
ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ 

在Linux中,.表示当前路径的硬链接,..表示上级路径的硬链接。

文件的三个时间:

  • Access :最后访问时间

  • Modify :文件内容最后修改时间

  • Change :属性最后修改时间

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

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

相关文章

read+write实现:链表放到文件+文件数据放到链表 的功能

思路 一、 定义链表: 1 节点结构(数据int型) 2 链表操作(创建节点、插入节点、释放链表、打印链表)。 二、链表保存到文件 1打开文件 2遍历链表、写文件: 遍历链表,write()将节点数据写入文件。…

图漾相机-ROS2-SDK-Ubuntu版本编译(新版本)

官网编译文档链接: https://doc.percipio.xyz/cam/latest/getstarted/sdk-ros2-compile.html 国内gitee下载SDK链接: https://gitee.com/percipioxyz 国外github下载SDK链接: https://github.com/percipioxyz 1.Camport ROS2 SDK 介绍 1.1 …

C# 添加、替换、提取、或删除Excel中的图片

在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观。此外,对于已有图片,你有事可能需要更新图片以确保信息的准确性,或者将Excel 中的图片单独保存,用于资料归档、备…

智能风控 数据分析 groupby、apply、reset_index组合拳

目录 groupby——分组 本例 apply——对每个分组应用一个函数 等价用法 reset_index——重置索引 使用前​编辑 注意事项 groupby必须配合聚合函数、 关于agglist 一些groupby试验 1. groupby对象之后。sum(一个列名) 2. groupby对象…

浅析百度AOI数据与高德AOI数据的差异性

目录 前言 一、AOI属性数据 1、百度AOI数据 2、高德AOI数据 二、AOI矢量边界 1、百度AOI空间范围 2、高德AOI空间范围 三、数据获取频次和难易程度 1、接口限制 2、数据转换成本 四、总结 前言 在当今数字化时代,地理信息数据的精准性和丰富性对于城市规划…

通过亚马逊云科技Bedrock打造自定义AI智能体Agent(上)

大家对于智能体代理Agent一定已经非常熟悉,自主代理(Autonomous Agents) 目前在AI行业极其热门并具有巨大的潜力,能够显著提升开发者日常的工作效率、自动化日常琐碎、重复性任务,并生成全新的内容。Agent可以理解用户…

汇编的使用总结

一、汇编的组成 1、汇编指令(指令集) 数据处理指令: 数据搬移指令 数据移位指令 位运算指令 算术运算指令 比较指令 跳转指令 内存读写指令 状态寄存器传送指令 异常产生指令等 2、伪指令 不是汇编指令,但是可以起到指令的作用,伪…

S4 HANA定义税码(FTXP)

本文主要介绍在S4 HANA OP中S4 HANA定义税码相关设置。具体请参照如下内容: 定义税码(FTXP) 以上界面是根据国家的“定价过程”确定的。蓝色的行项目表示目前已经激活的行项目。 不可抵扣进项税一般用于采购业务中,因此用在进项税码中。 消费税和营业…

Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合

读书笔记:卓越强迫症强大恐惧症,在亲子家庭、职场关系里尤其是纵向关系模型里,这两种状态很容易无缝衔接。尤其父母对子女、领导对下属,都有望子成龙、强将无弱兵的期望,然而在你的面前,他们才是永远强大的…

多级缓存(亿级并发解决方案)

多级缓存(亿级流量(并发)的缓存方案) 传统缓存的问题 传统缓存是请求到达tomcat后,先查询redis,如果未命中则查询数据库,问题如下: (1)请求要经过tomcat处…

场景设计学习-积分系统

场景设计-积分系统 1.概念和规则 积分:用户在网站的各种交互行为都可以产生积分,积分值与行为类型有关天梯榜:按照每个用户的总积分排序得到的排行榜,称为天梯榜。排名靠前的有奖励。天梯榜每个自然月为一个赛季,月初…

ML基础3-sklearn中的1个简单的分类器例子

Scikit-learn(通常缩写为sklearn)是一个流行的Python机器学习库,用于数据挖掘和数据分析任务。它建立在NumPy、SciPy和matplotlib等科学计算/可视化库的基础上,提供了丰富的工具和算法,用于处理各种机器学习问题&#…

The Simulation技术浅析(二):模型技术

一、物理模型(Physical Models) 1. 概述 物理模型基于物理定律和原理,通过模拟现实世界中物理系统的行为和相互作用来构建模型。物理模型通常用于工程、物理和化学等领域,用于预测系统在不同条件下的表现。 2. 关键技术 力学定律:例如牛顿运动定律,用于模拟物体的运动…

006 mybatis关联查询(一对一、一对多)

文章目录 一对一查询SQL语句方法一:resultType方法二:resultMap创建扩展po类Mapper映射文件Mapper接口测试代码小结 一对多查询SQL语句修改po类Mapper映射文件Mapper接口测试代码 注意:因为一个订单信息只会是一个人下的订单,所以…

linux asio网络编程理论及实现

最近在B站看了恋恋风辰大佬的asio网络编程,质量非常高。在本章中将对ASIO异步网络编程的整体及一些实现细节进行完整的梳理,用于复习与分享。大佬的博客:恋恋风辰官方博客 Preactor/Reactor模式 在网络编程中,通常根据事件处理的触…

渗透测试之WAF规则触发绕过规则之规则库绕过方式

目录 Waf触发规则的绕过 特殊字符替换空格 实例 特殊字符拼接绕过waf Mysql 内置得方法 注释包含关键字 实例 Waf触发规则的绕过 特殊字符替换空格 用一些特殊字符代替空格,比如在mysql中%0a是换行,可以代替空格 这个方法也可以部分绕过最新版本的…

环境搭建--vscode

vscode官网下载合适版本 安装vscode插件 安装 MinGW 配置环境变量 把安装目录D:\mingw64 配置在用户的环境变量path里即可 选择用户环境变量path 点确定保存后开启cmd输入g,如提示no input files 则说明Mingw64 安装成功,如果提示g 不是内…

橙河网络:市场调研都会用到哪些工具?

一般市场调研会用到多种工具,以获取全面、准确的市场信息。以下是一些常用的市场调研工具: 一、在线调查平台 问卷星:提供在线问卷编制、分发和数据分析功能,适用于大规模的市场调研。 SurveyMonkey:可用于市场调查…

996引擎 - NPC-添加NPC引擎自带形象

996引擎 - NPC-添加NPC引擎自带形象 截图参考添加NPC参考资料截图参考 添加NPC 编辑NPC表:Envir\DATA\cfg_npclist.xls 1.1. 需要临时隐藏NPC时可以在id前加 // 1.2. 如果NPC朝向不对,可以调整dir 列。(按8方向,上是0顺时针数。我这里给的4) 1.3. 形象代码:NPC代码、怪物…

登录Ubuntu论坛报错:Your username cannot be shorter than 1000 characters.

网址 Ubuntu Forums 报错 The following errors occurred during your registration:Your username cannot be shorter than 1000 characters. 截图