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

news2024/11/27 4:14:41

概述

        文件是存储在硬盘上的,硬盘的最小存储单位叫做扇区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.coloradmin.cn/o/1399700.html

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

相关文章

OpenAI的DALL·e2生成的AI图像有时会带有偏见或NSFW

专家警告说,OpenAI的图像生成模型DALLe2可能玩起来很有趣,但它生成的图片可能会带有刻板印象和偏见,甚至是生成NSFW图片,因此在现实世界中部署会有风险。 OpenAI公司承认“如果没有足够的防护措施,像DALLe2这样的模型…

k8s节点RouteCreated为false

出现该情况后,一般是初始化节点失败。因此,需要把节点从集群中移除,再加入到集群中,即可解决。 通常出现这个状况后,该节点上是没有被分配pod ip的,可以通过命令查看: # 发现没有PodCIDR、PodC…

DHCP原理

目录 DHCP应用场景DHCP基本原理DHCP报文类型地址池DHCP工作原理DHCP租期更新DHCP重绑定IP地址释放 DHCP应用场景 在大型企业网络中,会有大量的主机或设备需要获取IP地址等网络参数。如果采用手工配置,工作量大且不好管理,如果有用户擅自修改网…

vue3前端开发,子组件向父组件传递数据练习

vue3前端开发,子组件向父组件传递数据练习&#xff01; <script setup> import Child from ./Child.vue const getMsg (msg)>{console.log(msg); } </script> <template><h3>Parent</h3><!--绑定事件--><Child get-Msg"getM…

回调地狱与解决方案

什么是回调地狱&#xff1f; 简单理解就是回调函数嵌套回调 示例&#xff1a; setTimeout(() > {console.log(1);setTimeout(() > {console.log(2);setTimeout(() > {console.log(3);}, 1000);}, 2000)}, 3000)如上代码所示&#xff0c;回调函数嵌套回调&#xff0c;就…

QoS简介

QoS产生的背景 网络的普及和业务的多样化使得互联网流量激增&#xff0c;从而产生网络拥塞&#xff0c;增加转发时延&#xff0c;严重时还会产生丢包&#xff0c;导致业务质量下降甚至不可用。所以&#xff0c;要在网络上开展这些实时性业务&#xff0c;就必须解决网络拥塞问题…

电商系统设计到开发02 单机性能压测

一、前言 接着上篇文章&#xff1a;电商系统设计到开发&#xff08;第一版&#xff09;-CSDN博客 已经开发的代码&#xff0c;今天我们对上面开发的代码进行压力测试&#xff0c;看看单机部署的情况下&#xff0c;性能表现如何。代码地址&#xff1a;风萧萧兮/concurrency-en…

Linux中关于head命令详解

head的作用 head用于查看文件的开头部分的内容。 head的参数 -q隐藏文件名-v 显示文件名-c<数目>显示的字节数-n<数目>显示的行数 head的案例 # 查看yum.log前五行内容 head -5 yum.log

对于随机生成图片接口浏览器走缓存的问题

前提场景 目前有一个api 他可以随机生成一张图片&#xff0c;我通过v-for循环一个Array渲染出来几个img 并且都调用了该接口&#xff0c;但是每个img都是一样的图片 具体代码如下 <div class"icon-group-box" v-for"item in groupList" :key"item…

Oracle篇—参数文件在11gRAC或12cRAC的启动位置介绍

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

让Mac与Windows合二为一:Microsoft Remote Desktop for Mac的魅力

在数字时代&#xff0c;远程连接已成为工作、学习和生活的必备工具。而Microsoft Remote Desktop for Mac正是这样一款能够让你随时随地&#xff0c;轻松连接到Windows系统的强大工具。 Microsoft Remote Desktop for Mac不仅提供了高效、稳定的远程访问体验&#xff0c;更凭借…

黑马程序员-瑞吉外卖-day4

实现账号的启动禁止 EmployeeController PutMappingpublic R<String> update(RequestBody Employee employee){employeeService.updateById(employee);return R.success("员工信息修改成功");} 出错 解决 common目录下 引入JacksonObjectMapper package com…

Sentinel 降级、限流、熔断

前言 在现代分布式系统中&#xff0c;如何有效地保护系统免受突发流量和故障的影响&#xff0c;是每个开发人员和架构师都需要思考的重要问题。在这样的背景下&#xff0c;Sentinel作为一个强大的系统保护和控制组件&#xff0c;为我们提供了降级、限流、熔断等多种策略&#…

宝塔 ftp 服务器发回了不可路由的地址/读取目录列表失败

ftp连接不上&#xff1a; 1.注意内网IP和外网IP 2.检查ftp服务是否启动 &#xff08;面板首页即可看到&#xff09; 3.检查防火墙20端口 ftp 21端口及被动端口39000 - 40000是否放行 &#xff08;如是腾讯云/阿里云等还需检查安全组&#xff09; 4.是否主动/被动模式都不能连接…

Java学习笔记(七)——操作数组工具类Arrays

文章目录 ArraysArrays.toString()Arrays.binarySearch()Arrays.copyOf()Arrays.copyOfRange()Arrays.fill()Arrays.sort()升序排序降序排序 Arrays 操作数组的工具类。 Arrays.toString() import java.util.Arrays;public class test40 {public static void main(String[] a…

SAP S/4HANA 2023 Fully-Activated Appliance 虚拟机版介绍

注&#xff1a;市面上所有在售虚拟机均为拷贝本人所作的虚拟机&#xff0c;存在各种技术问题&#xff0c;请知悉。 SAP S4HANA 2023 FAA版本内置了四个Client&#xff1a; 1、000&#xff1a;SAP初始Client&#xff0c;原则上不能动&#xff1b; 2、100&#xff1a;只激活了US…

自己是如何使用单元测试

前言 自己是如何使用单元测试 进行单元测试能够让我们在编写方法的具体实现代码后&#xff0c;能清晰地看到其是否能实现预期的功能&#xff0c;有助于我们及时修正自己方法中存在的bug&#xff0c;以免在后续使用到某方法时出现意想不到的错误。 一、引入单元测试所使用的依赖…

MySQL基础笔记(9)事务

一.简介 所谓事务&#xff0c;是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或者撤销操作请求&#xff0c;即&#xff0c;这些操作要么同时成功&#xff0c;或者同时失败——OS中有原语不可分割的概念&…

网工每日一练(1月18日)

1.在下面关于VLAN的描述中&#xff0c;不正确的是 &#xff08; C &#xff09; 。 A、VLAN把交换机划分成多个逻辑上独立的交换机 B、主干链路&#xff08;Trunk&#xff09;可以提供多个VLAN之间通信的公共通道 C、由于包含了多个交换机&#xff0c;所以VLAN扩大了冲突域 D、…

高速CAN总线 C 或 B 节点发送 A节点接收 电压分析

CAN收发器放大图 CAN总线3节点框图&#xff0c;如下图 图① CAN总线 C 节点发送&#xff0c;B 节点接收简化后的逻辑框图如下图。 总线上 A B C 三个节点&#xff0c;按照CAN总线规定&#xff0c;首尾 A B 两个节点处需要接入1个120Ω的终端电阻&#xff0c;如下图&#xff1a…