Linux-ionde(软硬件链接)剖析

概述

        文件是存储在硬盘上的,硬盘的最小存储单位叫做扇区sector,每个扇区存储512字节。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个块block。这种由多个扇区组成的块,是文件存取的最小单位。这是针对于文件系统而言的,而对于磁盘来说,其实没有块这样的概念,只是文件系统为了提高读取速率而延申的一个概念;即磁盘的基本单位是扇,而文件系统的基本单位是块。 块的大小,最常见的是4KB,即连续八个sector组成一个block。

而操作系统和内存进行交流的时候,延申出了页的概念,这是针对于内存来说的。

即:操作系统与内存交流是以页为基本单位,文件系统与磁盘交流是以块为基本单位,而磁盘自身读写是以扇区为基本单位。

文件数据存储在块中,那么还必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就叫做inode,中文译名为索引节点,也叫i节点。因此,一个文件必须占用一个inode,且至少占用一个block。

  • 元信息->inode
  • 数据->block

一、inode是什么

文件=文件属性+文件内容;文件属性和文件内容是分开存储的,想要关联起来就要通过某种特定方式,这种方式就是inode编号。

inode是一个结构体,但是里面存有inode 编号和其他文件信息

1.1 inode大小

inode也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区,存放inode所包含的信息。

每个inode的大小,一般是128字节或256字节。通常情况下不需要关注单个inode的大小,而是需要重点关注inode总数。inode总数在格式化的时候就确定了。
 

1.2 inode结构

下图是Linux系统特有的EXT系列的文件系统:

上图中,inode Table负责存储文件属性,Data blocks负责存储文件内容。这个inode Table就是我们所说的inode。

当某个文件被创建时,系统会自动寻找合适的位置存放其inode,所以要通过一些方式:

上述有两个数据块叫做位图,位图是通过比特位来表示数据块是否可用的一种数据结构。

二、位图

2.1 inode Bitmap

寻找的是inode Table中的数据块:

位置含义:inode编号
内容含义:特定inode是否被占用;也就是说,每种二进制数对应一个数据块。

2.2 Block Bitmap

寻找的是Data Block里的数据块:

位置含义:块编号;
内容含义:特定块是否被占用;和inode Bitmap一个道理。

有了这个方法,想要找到数据块就可以通过遍历比特位找到为0的位置,表示无人使用,然后反馈给inode结构体,将该位置信息填入到结构体里的int block[SIZE],以此得到映射关系,就可以找到空闲的数据块。

也就是说,一个文件块组里面只要有后四个结构(inode位图,inode数据块,内容位图,内容数据块),就可以实现文件的创建,而前两个结构是描述这个组的属性的,例如大小、数据块使用多少。
 

三、inode对应关系

3.1 文件操作

inode包含很多的文件元信息,但不包含文件名,例如:字节数、属主UserID、属组GroupID、读写执行权限、时间戳等。而文件名存放在目录当中,但Linux系统内部不使用文件名,而是使用inode号码识别文件。 对于系统来说文件名只是inode号码便于识别的别称。

也就是说,每个inode都有一个对应的数据块,用来存储文件属性。并且找文件的过程并不是通过文件名。

创建文件一定是在一个特定目录下,而目录也是文件,它也有数据块,它的数据块里面放的是文件对应的inode编号。 也就是文件名和inode的映射关系。

那么知道了目录的data blocks存储的是文件名与inode的映射关系,就可以进一步理解在一个目录下查找文件、创建文件的过程

详细过程:

1.系统找到test.c这个文件名对应的inode号码;
2.通过inode号码,获取inode信息;
3.根据inode信息,找到文件数据所在的block,并读出数据。

总结:当Linux系统要查找某个文件时,它会先搜索inode table找到这个文件的属性及数据存放地点,然后再查找数据存放的Block进而将数据取出。(期间系统还会根据inode信息,看用户是否具有访问的权限,有就指向对应的数据block,没有就返回权限拒绝。)

3.1.1 创建文件

//lesson目录下
touch test.c;

这个操作其实就是:修改位图+填充inode信息。

        1.遍历inode bitmap位图结构,找到空闲数据块;
        2.把test.c的inode填入inode数据块里,由于是空文件所以不需要data block。

而需要写入内容时:根据其inode找到它对应的空间,发现为空,就通过遍历data bitmap位图结构找到空闲位置,开辟4KB空间(默认),然后把该空间的id写到block数组中,然后就把文件内容写到data block对应的数据块里了。

3.1.2 删除文件

并不需要清空数据块内容,只需要修改两个位图,由1->0即可“删除该文件”,这也就将该位置定义为可覆盖的文件数据;这也就是为什么平时删除文件是可以恢复的。

3.2 剖析目录创建

前面说过,文件名存放在目录的data block中,目录也是文件,所以文件有的那套inode目录也有。

而其data block内容是:当前目录下,文件名对应文件的inode指针,通过它可以找到当前目录的文件的inode。

这也就印证了那句话:文件名在系统层面没有意义,是给用户使用的;而Linux中真正标识一个文件是通过inode编号。

所以在目录下创建文件其实就是在目录的数据块里添加文件的inode编号和文件名,但是找到文件数据还是通过inode。

四、软硬链接

        软链接文件是一个独立的文件有自己的inode节点,文件中保存了源文件路径,通过数据中保存的源文件路径访问源文件(创建一个快捷方式)
        硬链接是文件的一个目录项,与源文件共用同一个inode节点,直接通过自己的inode节点访问源文件(其实本质上来说与源文件没区别,多个文件共用一个inode节点)

查看inode数量(第一列)
ls -ali;//+文件名可单独查看该文件
去除链接(不建议用rm)
unlink+新文件名

硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件。

4.1 硬链接

        通过文件系统的inode引用产生的新的文件名,而不是产生新的文件,称为硬链接。其实就是创建文件名和inode的映射关系。

        一般情况下,每个inode号码对应一个文件名,但是Linux允许多个文件名指向同一个inode号码。意味着可以使用不同的文件名访问相同的内容。

  • 创建test.c的硬链接:
//硬链接不带-s
ln test.c abc.c;
  • ls-ali查看硬链接
790395 -rw-rw-r--  2 zcb zcb 1826 Dec  9 15:19 abc.c
790395 -rw-rw-r--  2 zcb zcb 1826 Dec  9 15:19 test.c

790395是inode编号,而数字2代表的是硬链接数(默认是1,意味有几个文件名指向该文件,该变量存放在inode结构体中,采用的是引用计数)。

可见两个文件的inode编号一样,说明这两个文件根本就不是独立的文件,是inode编号和文件名的映射,是一模一样的别名。

硬链接被删除,则inode中的链接数-1,并不会直接删除文件数据,而是等链接数为0的时候才会实际删除对应文件的inode,将所占用数据块置为空闲。

4.2 软链接

软链接就像我们在windows中的快捷方式。 为什么这么说呢?平时我们的电脑下载好软件时,假如没有自动添加在桌面,那我们就要去文件夹里面找,那这时就显得很麻烦,我们就会创建快捷方式到桌面。这个过程就相当于软链接,它们是类似的。

既然是快捷方式,那它是完全依赖于原来的文件的。如果原来的文件被删除了,那么这个新添加的文件也就无法使用了。

//软链接带-s
ln -s test.c mytest.c;
//链接成功
mytest.c->test.c

4.2.1关于删除软链接

1.对于文件来说,直接删除软链接并不会删除源文件;但是删除源文件后,软链接对应的文件会失效。
2.对于目录而言,直接删除软链接目录(不带“/”)不会删除源文件,但是若删除目录时多添加了“/”,3.那么会只保留两个空目录(源文件目录和软链接目录中文件都没了)。
服务器上,对data文件夹建立软链接link_data后,如果想删除软链接,则执行 rm -rf link_data,不要加"/"
 

4.3 软硬链接的区别

  1. 软链接是一个独立的文件,有自己的inode,硬链接没有独立的inode
  2. 软链接相当于快捷方式;
  3. 硬链接本质没有创建文件,只是建立了一个文件名和已有的inode的映射关系,并写入当前目录,相当于取了个别名。
  4. 软连接可以跨文件系统进行连接,硬链接不可以。这是因为不同分区有可能有不同文件系统,就算系统相同,也会导致节点号有歧义冲突,因此硬链接不能跨分区建立。

4.3.1 硬链接的作用

方便目录之间进行跳转:.和当前目录相同,…和上级目录相同。

4.3.2 为什么默认目录的硬链接是2

因为目录创建时默认有.和…代表当前目录和上级目录。

五、动静态库

5.1 文件修改状态和修改时间

查看文件的最后修改时间:

stat+文件名

Access是文件最近被访问的时间;在较新的Linux内核中,该时间不会立即被更新,而是有一定时间间隔。

Modify是最近一次修改文件内容的时间

Change是最近一次修改文件属性的时间

当我们修改文件内容的时候,可能会更改文件属性,所以它们可能会同时改变。

makefile第二次无法make重新编译的原因,就是由于新生成的可执行程序的时间比源文件更新,所以就无法继续make。如果你对源文件进行修改,时间也就更新了,也就可以make了。
 

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

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

相关文章

商家转账到零钱开通证明材料怎么办?

商家转账到零钱是什么? 商家转账到零钱是企业付款到零钱的升级版,它的功能是,如果系统需要对用户支付费用,比如发放佣金、提成、退款等,可以直接转账到用户的微信零钱。这个功能在 2022 年 5 月 18 日之前叫做企业付款…

BossCMS RCE

简介 BossCMS是一款基于自主研发PHP框架MySQL架构的内容管理系统,能够满足各类网站开发建设的需求。系统开源、安全、稳定、简洁、易开发、专注为中小型企业及政企单位、个人站长、广大开发者、建站公司提供一套简单好用的网站内容管理系统解决方案。官网提供了大量…

idea 安装免费Ai工具 codeium

目录 概述 ide安装 使用 chat问答 自动写代码 除此外小功能 概述 这已经是我目前用的最好免费的Ai工具了,当然你要是有钱最好还是用点花钱的,比如copilot,他可以在idea全家桶包括vs,还有c/c的vs上运行,还贼强&am…

java数据结构与算法刷题-----LeetCode59. 螺旋矩阵 II

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 解题思路 初始,top行执向第一行,bottom行指向最后一…

Spring Cloud可视化智慧工地大数据云平台源码(人、机、料、法、环五大维度)

智慧工地平台是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三…

OJ常用函数/机试常用STL模板

目录 机试涉及到的算法一、字符串二、vector二、map三、set四、queue五、并查集五、cmath六、读入数据6.1 示例16.2 示例26.3 示例36.4 示例46.5 示例56.6 示例66.7 示例76.8 示例86.9 示例96.10 示例106.11 示例11 七、输入输出八、排序九、数学相关十、大数的表示十一、IDE 机…

Java 应用部署包优化经验分享

背景 最近接手了一个 2018 年的老项目,因为太久远了,功能上的代码不敢乱动,虽然是老项目,但最近一年也在持续加功能,功能不稳定,于是我就进入了救火式改 Bug 的状态。 功能不能妄动,但是这个项…

SwiftUI 框架有哪些主要优势

SwiftUI是苹果公司在2019年推出的一种用于构建用户界面的框架,它使用Swift语言编写,并且与iOS、iPadOS、macOS、watchOS和tvOS等平台兼容。下面简单的看下有哪些主要的优势。 声明式的界面描述 使用声明式编程风格,通过简洁的代码描述用户界…

【已解决】Qt Creator设计模式被禁用不能点的原因及解决方案

Qt Creator 下载地址(含历史版本):https://download.qt.io/official_releases/qtcreator/ 症状 Qt Creator 目前最新版为12.0.1,安装后打开.qml文件发现设计工具图标为禁用状态。 原因及解决方案 根据官网材料(Qt C…

Vue3前端开发,watch侦听器的深度监听和精确监听

Vue3前端开发,watch侦听器的深度监听和精确监听&#xff01;今天和大家分享的内容是&#xff0c;关于watch的深度侦听和精确监听。 首先看一下&#xff0c;第一个案例&#xff0c;练习的是&#xff0c;深度监听的效果。默认是浅的侦听&#xff0c;是不会触发回调函数的。 <…

DNS寻址过程

用一张图详细的描述DNS寻址的过程&#xff0c;是高级前端进阶的网络篇&#xff1a; 主要是第三步要记仔细就行啦&#xff0c;每一步都要详细的记录下来&#xff0c;总结的脉络如下&#xff1a; 本地DNS缓存本地DNS服务器根域名服务器 顶级域名服务器再次顶级域名服务器权威域名…

2024华数杯国际赛A题五小问完整思路+数据+py代码+高质量半成品论文

A题日本排核废水 2024华数杯国际赛A题五小问完整思路数据py代码高质量半成品论文 ## 问题二&#xff1a;三次排放后的放射性废水扩散路径 #### 2.1 基本假设&#xff1a; - 海洋是均匀的介质。 - 废水在排放点瞬时释放&#xff0c;并在海水中以某种速率扩散。 - 考虑海洋环…