Linux | 文件系统进阶:Inode与软硬链接艺术剖析

当时共我赏花人,点检如今无一半。 - 《木兰花》(晏殊)

2024.8.24

目录

1. 文件系统的基本概念

1.1 ls -l命令查看目录信息

1.2 stat命令查看具体文件的详细信息

1.3 inode

ext2文件系统的主要组成部分:

例子:创建main.c文件

文件的创建步骤:

问题与思考:在Linux系统中,同一个目录下为什么不允许出现同名文件?

2. 硬链接与软链接

硬链接示例:

操作一:创建一个全新的文件main.c

操作二:通过ln命令构建一个main.c的硬链接test.c

操作三:使用vim编辑器打开main.c文件进行编辑

发现与笔记:

软连接示例:

操作一:创建一个全新的文件main.c

操作二:通过ln -s main.c test.c命令创建软连接

操作三:更改main.c 文件内容后,test.c 文件本身没有发生变化

操作四:删除main.c文件后,test.c变红失效,重新创建main.c 文件后,inode维持不变,软链接test.c重新生效

发现与笔记:


在Linux操作系统中,文件系统是数据存储和组织的核心概念。它不仅提供了数据的持久存储,还定义了数据的访问方式。本文将带你深入了解Linux文件系统的工作原理和特点。

1. 文件系统的基本概念

文件系统是操作系统用于有效地存储、组织、描述和访问磁盘上的数据的一种系统。在Linux中,文件系统是层次结构的,所有的文件和目录都从一个根目录/开始。

1.1 ls -l命令查看目录信息

当你在Linux系统中使用ls -l命令时,它会以列表的形式显示文件和目录的详细信息。每行显示的信息确实包含了文件的元数据,具体来说,每行的信息可以分为以下几列:

  1. 模式(Mode):显示文件的类型和权限。第一个字符表示文件类型:
    • - 表示普通文件。
    • d 表示目录。
    • l 表示符号链接。
    • 其他字符可能表示设备文件等特殊类型。 权限部分由9个字符组成,分为三组,每组三个字符,分别代表文件所有者、所属组和其他用户的读(r)、写(w)和执行(x)权限。如果权限被禁用,则用-表示;如果启用,则用rwx表示。例如,-rwxr-xr-x表示所有者有读、写和执行权限,组和其他用户只有读和执行权限。
  2. 硬链接数(Hard Links):显示文件的硬链接数量。对于普通文件,这个数字通常是1。对于目录,这个数字是2加上子目录的数量。
  3. 文件所有者(Owner):显示文件的所有者用户名。
  4. (Group):显示文件所属的用户组。
  5. 大小(Size):显示文件的大小,单位是字节。
  6. 最后修改时间(Last Modified Time):显示文件最后被修改的日期和时间。
  7. 文件名(File Name):显示文件或目录的名称。

拓展:事实上,在Linux系统中,文件的信息(元数据)和内容是分开存储的。这种设计是文件系统支持操作系统高效地管理磁盘空间和文件访问的前提。

思考:如果没有分开存储,文件的属性和内容都糅杂在一起,使用ls -l命令时的效率如何?

每一次使用ls -l命令查看目录内容,都要同时读取属性和内容,给操作系统和磁盘造成极大负担,不利于高校管理磁盘和文件访问。

1.2 stat命令查看具体文件的详细信息

stat是status的缩写,用于查看文件的状态

  1. 文件名err.c,这是正在检查的文件。
  2. 大小(Size):65字节,表示文件的总大小。
  3. 块大小(Blocks):8,表示文件占用了8个块。
  4. IO块大小(IO Block):4096,表示文件系统的块大小是4096字节。
  5. 文件类型(Device):fc01h/64513d,这通常是一个设备标识符,但在这个上下文中可能表示文件的设备和inode号。
  6. inode号(Inode):152191,这是文件在文件系统中的唯一标识符。
  7. 硬链接数(Links):1,表示该文件只有一个硬链接。
  8. 访问权限(Access):(0664/-rw-rw-r--),表示文件的权限设置为所有者和组都可读写,其他人只有读权限。
  9. 用户ID(Uid):(1000/lhy),表示文件的所有者是用户lhy,用户ID为1000。
  10. 组ID(Gid):(1000/lhy),表示文件所属的组也是lhy,组ID为1000。
  11. 最后访问时间(Access):2024-08-22 21:04:31.097497454+0800,表示文件最后一次被访问的时间。
  12. 最后修改时间(Modify):2024-08-22 21:03:32.156870159+0800,表示文件内容最后一次被修改的时间。
  13. 最后状态改变时间(Change):2024-08-22 21:03:32.156870159+0800,表示文件的元数据最后一次被修改的时间。
  14. 创建时间(Birth):2024-08-22 21:03:32.156870159+0800,某些文件系统(如ZFS或btrfs)支持显示文件的创建时间,这里显示的可能是创建时间。

1.3 inode

每个文件或目录在Linux文件系统中都有一个对应的inode(索引节点)。inode包含了文件的元数据,如文件大小、权限、所有者、创建时间等,但不包含文件名。文件名和inode之间的映射关系由目录项维护。

在Linux的ext2文件系统中,磁盘被组织成一系列块(block),每个块的大小在格式化时确定,并且一旦确定就不可更改。这个块的大小可以通过mke2fs命令的-b选项来设置,常见的块大小有1024字节、2048字节和4096字节。

ext2文件系统的主要组成部分:
  1. 启动块(Boot Block):这是文件系统的第一个块,通常包含启动加载程序的代码。
  2. 超级块(Super Block):存储文件系统的整体结构信息,包括块和inode的总数、已使用和未使用的数量、块和inode的大小、最近一次挂载时间、最近一次写入时间、最近一次检查磁盘的时间等。
  3. 块组(Block Group):根据分区的大小,文件系统被划分为多个块组,每个块组具有相似的结构。
  4. GDT(Group Descriptor Table):块组描述符表,存储有关块组的属性信息。
  5. 块位图(Block Bitmap):记录数据块的使用情况,每个位对应一个数据块,如果位被设置,则表示对应的数据块已被占用。
  6. inode位图(inode Bitmap):记录inode的使用情况,每个位代表一个inode是否被占用。
  7. i节点表(Inode Table):存储文件的属性,如文件大小、所有者、访问权限、最近修改时间等。
  8. 数据区(Data Blocks):实际存放文件内容的区域。

超级块是文件系统的关键部分,如果超级块信息被破坏,整个文件系统将无法正常工作。在实际使用中,为了防止超级块损坏导致的问题,ext2文件系统会在不同位置存储多个超级块的副本,以便在主超级块损坏时使用备用超级块。

ext2文件系统的设计允许高效的文件访问和存储管理,但在现代文件系统中,如ext3和ext4,已经进行了进一步的改进以提供更好的性能和可靠性,但都是在ext2的基础上演化而来的,大家可以自己了解~~。

例子:创建main.c文件

文件的创建步骤:
  1. 构建文件属性,找到一个空闲的inode_table准备存储文件信息(如文件大小,占用的内存块信息等)。
  2. 将文件内容存储在inode_table指定的内存块中。
  3. 更新文件对应的inode_table,将文件内容与块的分配情况依次记录()。
  4. 将文件名添加到目录中,完成创建。

inode_table不是一个单元格,而是一个指针,指向的是表示文件占用的块信息(其实指针指向的最后两个不是块信息。而是下一个单元格的指针,感兴趣可以自行检索~~)

问题与思考:在Linux系统中,同一个目录下为什么不允许出现同名文件?

回答重点:在Linux文件系统中,文件名和inode是一个Key-Value一一映射的结构,每个文件名都对应一个唯一的inode,inode包含了文件的元数据和数据块的位置信息。系统通过文件名找到文件对应的inode查看文件。如果出现了同名文件,无法确定这个文件的inode,就无法打开和查看这个文件。所以,同一个目录下的文件名是唯一的。

2. 硬链接与软链接

最大区别:硬链接是让多个文件名指向同一个inode,而软链接则是创建一个新的文件,通过名字引用另外一个文件。

硬链接示例:
操作一:创建一个全新的文件main.c

操作二:通过ln命令构建一个main.c的硬链接test.c
  • 使用ln命令(不带-s选项)创建了一个硬链接。硬链接是指向同一个inode的多个文件名。
  • test.cmain.c实际上是同一个文件的不同名字,它们共享相同的inode和数据块。

操作三:使用vim编辑器打开main.c文件进行编辑

再次列出文件列表,发现main.c 和 test.c 发生同步变化。编辑操作对文件内容的更改会反映在所有指向该inode的文件名上,因为它们都是访问相同数据的方式。

发现与笔记:
  1. 硬链接的同步性main.ctest.c的更改是同步的,因为它们指向相同的inode和数据块。
  2. inode的共享:硬链接共享同一个inode,这意味着它们实际上是同一个文件的不同引用。
  3. 硬链接的计数:文件系统的内核确实会跟踪inode的硬链接数量。当创建硬链接时,该计数增加;删除硬链接时,计数减少。

我们在删除文件时会做两件事情:

  • 1.在目录中将对应的记录删除
  • 2.内核会减少inode的硬链接计数,当硬链接计数降至0时,则将对应的磁盘文件释放。

软连接示例:
操作一:创建一个全新的文件main.c

操作二:通过ln -s main.c test.c命令创建软连接
  • 这个命令在当前目录下创建了一个名为test.c的软连接,它指向main.c文件。
  • 软连接test.c本身并不存储数据,而是存储了一个指向main.c文件的路径。

操作三:更改main.c 文件内容后,test.c 文件本身没有发生变化
  • 这个现象说明软连接只是指向原始文件的一个引用,它本身不包含数据。
  • 任何对main.c的更改都会反映在使用软连接test.c访问文件时,因为它们实际上是同一个文件的不同访问路径。

操作四:删除main.c文件后,test.c变红失效,重新创建main.c 文件后,inode维持不变,软链接test.c重新生效
  • 当原始文件main.c被删除后,软连接test.c因为没有了指向的目标而失效,这通常在文件浏览器中以变红显示。
  • 如果你重新创建了一个名为main.c的文件,并且这个新文件的inode与原来的相同,软链接重新生效。

发现与笔记:
  • 软连接的依赖性:软连接依赖于它所指向的原始文件。如果原始文件被移动或删除,软连接将失效。
  • 软连接的灵活性:你可以使用软连接来为文件或目录创建快捷方式,而不需要复制文件内容,这有助于节省存储空间。
  • 软连接的局限性:软连接不包含文件数据,它们只是指向原始文件的路径(类似于Windows中的快捷方式)。如果原始文件被重命名或移动到其他目录,软连接将需要更新以反映这些变化。

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

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

相关文章

谷歌登录的时候,要求在手机的通知点是,并按数字来验证身份,但是手机通知栏没有收到通知和数字,原因是什么,怎么办?

前两天,有个朋友联系到GG账号服务,说他的一个谷歌账号在新设备登录的时候,提示说要在手机的通知栏点击谷歌发来的通知,点击是确认,并且要点按相应的数字。 但问题是他反复刷新手机的通知栏都没有看到谷歌发来的通知&a…

xml打印模板解析-SAAS本地化及未来之窗行业应用跨平台架构

一、为何要自己设置打印模板系统 1.确保自由知识产权 2.支持跨平台:物联网,自助终端,电脑,web,C#,jsp,android,java,php 等多种语言 二、xml 代码解析 package CyberWinPHP.Cyber_Plus;import java.io.…

区块链浪潮:Web3时代的数字经济新格局

随着科技的迅猛发展,全球经济正迎来一场前所未有的变革,区块链技术正在其中扮演着关键角色。Web3作为下一代互联网的核心,正在通过区块链技术重塑数字经济的格局,为全球市场带来新的机遇和挑战。这场以去中心化为特征的技术革命&a…

进阶岛 - MindSearch(CPU版)部署到github codespace

实践结论写在前面: github codespace很好用,丝滑、快速huggingface的space管理代码也很好用,自动编译、容器打包、发布一气呵成mindsearch很好用,效果超出预想。planner和searcher的交互丝滑、有效率。mindsearch内置搜索可解决很…

JAVA基础面试题总结(十四)——JVM(下)

类文件结构详解 什么是字节码? 在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决…

45.5【C语言】typedef

目录: *全称 *格式 一般指针 数组指针 函数指针 *细节 *全称 type define 类型(重新)定义(或命名),可简化输入 *格式 1.非指针类型: typedef 类型 简化名称 typedef signed long long k; signed long …

WPF中的可视化树(VisualTree)和逻辑树(LogicalTree)

可视化树和逻辑树 我们先来理解一下什么是可视化树和逻辑树。 可视化树:包含最初指定的大多数元素(在XAML或.cs中)以及控件模板中的元素。 通俗点来讲,就是整个元素的构成树,从最上面的结点到最后一个结点&#xff…

SpringCache源码解析(一)

一、springCache如何实现自动装配 SpringBoot 确实是通过 spring.factories 文件实现自动配置的。Spring Cache 也是遵循这一机制来实现自动装配的。 具体来说,Spring Cache 的自动装配是通过 org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration 这个类来…

Maven的使用

Maven 是一个项目管理工具,它基于项目对象模型(POM,Project Object Model)的概念,通过一小段描述信息(pom.xml)来管理项目的构建、报告和文档。Maven 提供了一个标准化的方式来构建项目&#xf…

MyBatis-Plus 三、(进阶使用)

一、typeHandler 的使用 1、存储json格式字段 如果字段需要存储为json格式,可以使用JacksonTypeHandler处理器。使用方式非常简单,如下所示: 只需要加上两个注解即可: TableName(autoResultMap true) 表示自动…

第五节:Nodify 节点位置设置

引言 如果你尝试过前几节的代码,会发现节点都是出现在0,0 位置,及编辑器左上角。编辑器作为最外层的交互控件,内部封装了节点容器ItemContrainer,我们通过样式属性对Loaction做绑定。本节将介绍如何配置节点位置。 1、节点位置 …

DHCP DNS 欺骗武器化——实用指南

DHCP 枚举 在我们之前的文章中,我们分享了 DHCP DNS 欺骗背后的理论。实际上,需要几条信息才能有效地执行我们描述的攻击。对于攻击者来说幸运的是,发现DHCP 服务器并了解其配置的能力是 DHCP 协议的一部分,这使得侦察过程变得微不足道。 在以下章节中,我们将描述攻击者…

Git的使用教程及常用语法02

四.将文件添加到仓库 创建仓库 git init查看仓库的状态 git status 添加到暂存区 git add提交 git commitgit status 可以查看当前仓库的状态信息,例如包含哪些分支,有哪些文件以及这些文件当前处在怎样的一个状态。 由于当前没有存储任何的东西&…

基于Python的机器学习系列(7):多元逻辑回归

在本篇博文中,我们将探讨多元逻辑回归,它是一种扩展的逻辑回归方法,适用于分类数量超过两个的场景。与二元逻辑回归不同,多元逻辑回归使用Softmax函数将多个类别的概率输出映射到[0, 1]范围内,并确保所有类别的概率和为…

PMBOK® 第六版 控制范围

目录 读后感—PMBOK第六版 目录 结果固然重要,过程同样不可或缺。过程不仅是通往预期成果的途径,也是个人和团队能力提升与经验积累的关键阶段。过程中的每一步都是学习和成长的机会,每一次尝试都能激发创新,而公正透明的流程更增…

TCP BBR 数学模型完整版

今天顺带加入了 bbr 的所有状态和所有流程,获得以下的方程组: C Bltbw,R RtProp,T_r ProbeRTT 周期,g1 Startup gain,g2 ProbeBW gain。设 x estimated bandwidth,r round trip time&am…

MySQL 数据库深度解析:安装、语法与高级查询实战

一、引言 在现代软件开发和数据管理领域中,MySQL 数据库凭借其高效性、稳定性、开源性以及广泛的适用性,成为了众多开发者和企业的首选。无论是小型项目还是大型企业级应用,MySQL 都能提供可靠的数据存储和管理解决方案。本文将深入探讨 MyS…

系统编程-lvgl

带界面的MP3播放器 -- lvgl 目录 带界面的MP3播放器 -- lvgl 一、什么是lvgl? 二、简单使用lvgl 在工程中编写代码 实现带界面的mp3播放器 main.c events_init.c events_init.h 补充1:glob函数 补充2:atexit函数 一、什么是lvgl&a…

安科瑞ACREL-7000能源管控平台在综合能耗监测系统在大型园区的应用

摘要:大型综合园区已经成为多种能源消耗的重要区域,为了探索适用于大型综合园区的综合能耗监测系统,建立了综合能耗监测系统整体框架,提出了综合能耗网络、能耗关系集合、能耗均衡度等概念,并以某大型综合园区为例对综…

AIGC综合应用-黑神话悟空创意写真大片制作方法(实操附模型文件)

​ 怎么用AI来制作 这种黑悟空的现代时尚大片? 悟空不再只是传统的西游记形象,而是走上现代时尚的T台,成为时尚大片中的主角。这个创意乍一听似乎有些离奇,但通过AI技术的加持,这一切都能轻松实现。不需要昂贵的拍摄设…