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

news2024/11/13 23:25:32

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

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.coloradmin.cn/o/2068696.html

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

相关文章

leetcode:2520. 统计能整除数字的位数(python3解法)

难度:简单 给你一个整数 num ,返回 num 中能整除 num 的数位的数目。 如果满足 nums % val 0 ,则认为整数 val 可以整除 nums 。 示例 1: 输入:num 7 输出:1 解释:7 被自己整除,因…

继续修改原神角色数据列表

<!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原神4.8版本获得角色数据表</title> </…

【STM32】一些外设通用内容

在学习各种外设的过程中&#xff0c;发现外设有一些通用的东西可以总结一下&#xff0c;后面发现再继续更新。图来源于正点原子的学习视频和PPT。 目录 1 外设的时钟的开启 2 外设初始化的回调机制 3 外设的中断服务函数 4 HAL库中断回调机制 5 函数的常见…

SpringCache源码解析(一)

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

文件树控件开发

文件树控件和获取驱动信息功能 然后添加上查看文件信息的按钮 双击这个按钮添加上如下代码 void CRemoteClientDlg::OnBnClickedBtnFileinfo() {int ret SendCommandPacket(1);if (ret -1) {AfxMessageBox(_T("命令处理失败!!!"));return;}ClientSocket* pClient…

c++每日练习记录5-(链表的结尾指向nullptr)

解题方法&#xff1a;双指针法 ListNode *partition(ListNode *head, int x){ListNode *head1 new ListNode(0);ListNode *head2 head1;ListNode *head3 new ListNode(0);ListNode *head4 head3;while (head! nullptr){if (head->val < x){head1->next head;head…

成品CNC外壳的巧妙使用

有些时候10块买一个CNC外壳&#xff0c;钻个孔&#xff0c;比单独的3D打印更能提升板子的档次感&#xff1a; 这个CNC是真的好看&#xff0c;再加上3D打印辅助设计&#xff0c;堪称精美&#xff1a;

k8s安装Metabase开源报表系统

metabase是什么&#xff1f; metabase是一款开源的简易但强大同时又无缝兼容大数据和传统数据库的分析工具&#xff0c;帮助公司每一个人对企业数据的学习挖掘&#xff0c;进而达到更好的数据化运营和决策。 Metabase is a simple and powerful analytics tool which lets anyo…

热血传奇1.76版本完美仿官单机版安装教程+GM工具+无需虚拟机

今天给大家带来一款单机游戏的架设&#xff1a;热血传奇1.76版本完美仿官。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xff0c;…

软件上显示“mfc140.dll丢失”错误信息?那么mfc140.dll丢失该如何修复

mfc140.dll是 Microsoft Foundation Class (MFC) 库的一部分&#xff0c;这个库被用于基于 C 的 Windows 应用程序的开发。当 Windows 或软件上显示“mfc140.dll丢失”或“找不到 mfc140.dll”这类错误信息时&#xff0c;表示你的系统可能缺少与 Visual C 相关的组件或这些组件…

软考:软件设计师 — 14.算法基础

十四. 算法基础 1. 算法的特性 算法是对特定问题求解步骤的描述&#xff0c;它是指令的有限序列&#xff0c;其中每一条指令表示一个或多个操作。 有穷性&#xff1a;执行有穷步之后结束&#xff0c;且每一步都可在有穷时间内完成。确定性&#xff1a;算法中每一条指令必须有…

代码随想录算法训练营第三十五天 | 416. 分割等和子集

416. 分割等和子集 题目链接&#xff1a;力扣题目链接 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;动态规划之背包问题&#xff0c;这个包能装满吗&#xff1f;| LeetCode&#xff1a;416.分割等和子集 给定一个只包含正整数的非空数组。是否可以将这个数组分割…

面向对象01:类和对象的创建

本节内容视频链接&#xff1a;面向对象04&#xff1a;类与对象的创建_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p63&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.类、对象定义及关系 类&#xff08;‌Class&#xff09;‌是一个模板或蓝图&#…

如何规避DDoS攻击带来的风险?服务器DDoS防御软件科普

DDoS攻击是目前最常见的网络攻击方式之一。其见效快、成本低的特点&#xff0c;使它深受不法分子的“喜爱”。对于未受保护的企业来说&#xff0c;每次DDoS攻击的平均成本为20万美元&#xff0c;当DDoS攻击汹涌而至&#xff0c;缺失详细的保护预案&#xff0c;企业很可能会陷入…

erlang学习:gen_server书上案例22.6练习题4

昨天没有输出Fun中的io的原因是因为在任务函数中没有调用Fun方法&#xff0c;相当于只传了Fun函数但是没有进行调用&#xff0c;因此没有执行Fun函数&#xff0c;所以控制台中没有进行io的输出&#xff0c;今天在add_job中调用了Fun方法并执行&#xff0c;所以输出了相应的io。…

图像数据处理22

五、边缘检测 5.4 Hough变换 该技术主要用于检测图像中的基本形状&#xff0c;如直线、圆、椭圆等。 Hough变换的基本原理 Hough变换的基本原理是将图像空间中的直线或曲线变换到参数空间中&#xff0c;通过检测参数空间中的极值点&#xff08;局部最大值&#xff09;&…

自制镜像(贫穷版)

在装了docker的机子root目录操作 mkdir -p docker-images/tomcat-image/ cd docker-images/tomcat-image/ 把这两个红框的拉到docker-images/tomcat-image/ vim Dockerfile #导入基础镜像 from centos:7 #定义作者 maintainer GGBond<2958458916qq.com&…

SpringCloudGateway重写负载均衡策略

背景 gateway中多实例请求转发&#xff0c;默认采用轮训转发策略。在有些场景下&#xff0c;某些请求想固定到某一台实例上&#xff0c;这里通过重写默认负载均衡策略的方式实现。 以下代码为&#xff0c;大文件分片上传&#xff0c;多实例场景&#xff0c;根据文件md5和实例…

OpenCV c++ 实现图像马赛克效果

VS2022配置OpenCV环境 关于OpenCV在VS2022上配置的教程可以参考&#xff1a;VS2022 配置OpenCV开发环境详细教程 图像马赛克 图像马赛克&#xff08;Image Mosaic&#xff09;的原理基于将图像的特定区域替换为像素块&#xff0c;这些像素块可以是纯色或者平均色&#xff0c…