【Linux】磁盘结构 | 文件系统 | 软硬链接

文件的状态有被打开和没有被打开,之前谈到一个文件被进行读写,就要打开加载到内存中,通过对应的系统调用,fd文件描述符的管理,write和read等函数的增删查改。并且借助缓冲区对文件属性和内容的修改。

大部分文件是没有被打开的(不需要访问),都在磁盘里保存的!对于没被进程打开的文件也要进行管理。在一个偌大的磁盘中,需要找到某份内容,就要进行核心工作------快速定位!

文件的管理工作包括:1、打开的文件进行管理  2、没被打开的文件在磁盘里管理

这一个管理工作就叫文件系统。本质就是文件的存储问题。

了解磁盘的物理结构

磁盘是计算机唯一的机械设备,早些年计算机用的激素机械硬盘,这几年逐步过渡到ssd。根据冯诺依曼体系,里cpu越员,速度就会越慢。磁盘的速度是慢于内存慢于ssd。

虽然磁盘的速度效率慢,但是它的造价便宜,内存容量大。所以企业一般是使用机械硬盘。

磁盘的主要结构

包括盘片和磁头

盘片:一片有俩面

磁头:一个磁头负责一片,用来读取修改1或0

简述这一个过程:
一个磁盘会有多个盘片堆叠。一个磁头负责一个盘片。盘片沿着指定方向高速旋转,磁头沿着半径方向转动,一秒钟内盘片可能转了上万次。因此在这样的高速旋转下,盘面的每一个小单元都能被识别到。

这里需要主要磁头和盘片不是贴在一起,而是非常接近。因此一个细微的抖动或者是灰尘都会影响磁盘的数据。

写入:计算机的世界上只有0和1,0和1是一种标志,就好比N和S级。在高速旋转中,磁头通过磁化将一个比特位的空间磁化为0或1的过程就是写入。


磁盘的存储结构

这里对磁盘的盘片详细介绍。一个盘片可以等分分成多个扇形,每一个扇形就叫做扇区。

磁盘又可以做同心环,每俩个环之间包围的区域就叫做磁盘。

因此,研究盘片主要是研究扇区和磁道。一个磁道可以有多个扇区,一个扇区也可以有多个磁道。这是一个划分。

扇区就是磁盘的最小存储单元512字节,4kb.

磁头Head

磁道 Track

扇区 Sector


CHS定位法

一个磁盘有许多块盘片,盘片上有扇区和磁道。如何在一个磁盘中找到指定位置的数据?

多个磁道堆叠,就好比一个空心的圆柱cylinder 。

寻找地址的方法:

  1. 选择哪一面: 本质是选择磁头
  2. 选择哪一个磁道 :因为确定了面,所以要确定磁道,就是确定哪一个柱面
  3. 选择在磁道上的哪一个扇区

这一个过程就是Head Cylinder Sector  CHS定位法 


存储的逻辑抽象

将磁盘的结构由圆盘抽象成线性

类似于磁带,我们将圆盘拉直后,就是线性的存储介质

这一个将磁盘的抽象线性化,得到的数组地址。就叫做LBA(逻辑块地址)

那么我们想要对磁盘写入只需要知道LBA地址,然后通过LBA与CHS的映射关系就能在磁盘上找到那一块空间。

举例
假设:LBA地址为1234,有俩片盘片,共4面,每面可以存储1000字节,每面磁道有10个,扇区有100个

1234 / 1000=1 在第一面上(从0开始计算)

234/10=23  第23个磁道上

234/100=2  第2个扇区上

因此就是得到HCS

这样,我们对磁盘的管理就转化为对扇区数组的管理

OS可以按照扇区为单位进行存取,也可以基于文件系统,按照文件块对文件系统数据存取。

总结:
对存储设备的管理,OS层面就是对数组的增删查改

文件系统

磁盘里的文件是庞大的,为了便于管理,通常会将抽象的线性LBA拆分成小部分,将每一小份管理好,借鉴经验,来管理整体。这是分治的思想。

假设磁盘有500G。可以通过分区来将一个磁盘分成几个小区。通常我们的笔记本就有一块磁盘,一块磁盘被分成C盘\D盘。假设我们将500G分成五个区,每个区域就是100G,在对100G划分成组,每一份就是2G。


inode

每个区的起始位置都有一个Boot Block

Boot  Block是至关重要的 记录OS用于引导用户的操作与配置,记录分区的信息等。

每个区的划分就是组,下面对组详细研究

一个组被划分成 super block(超级块)         group descriptor table(组织描述符)  block bitmap(块位图)        inode bitmap( i结点位图)          bata block(数据块)


i结点表


用来存储文件的属性,如大小,所有组,权限,修改时间等

inode表应该是一个定长的结构体

struct inode{大小,权限,所属组,ACM,inode编号等引用计数block[n]
}

每个inode结构体的大小是128字节,一般而言一个文件就有一个inode编号,一个组有多少个inode编号是可以计算的  一个组的大小是4KB 4KB=4096字节 就有inode=4096/128=32个


数据段

:存放文件内容

ionde结构体会记录编号 

通过数据块的映射关系就能快速找到需要的内容

其中

0-12为 1 级映射

13为间接映射

14为3 级映射

一级映射:1-》2    2-》3

间接映射   13-》20

三级映射  向四面八方(发散)寻找


inode位图/块位图

来标识每一个bit的inode(数据块)是否空闲可用

用法同位图 0表示空闲/1表示存在


超级块(super block)

用来记录文件系统本身的基本信息。包括inode和数据块的总量,未使用的inode和block数目,挂载信息,最后一次检擦磁盘的时间。

文件=内容+属性 都是数据 并且内容和属性是分开存储的

要把多个文件的数据写入组中,就要先把管理组的信息写入。

一个磁盘被格式化后,就是重新写入管理者信息。要想使用分区,就要先进行挂载。

如果超级块被破坏,那么就不能正常使用磁盘。但是OS会对超级块拷贝几份到不同的组起始位置,以备意外的修改。


细节问题


文件的内容和属性是分开的,inode标识符是文件的唯一标志,文件名和inode是映射关系,Linux识别文件只认inode

描述文件的创建

根据文件名 映射到空闲的inode_bitmap 把0修改为1,找到对应inode表的结点,写入相应的属性。为其分配数据块,向数据块写入信息。再block_bitmap对应位置的0修改为1,建立inode 和 datablock的映射关系,最后返回inode

创建文件,一定是再某个路径底下!

通过inode编号->找到所处目录->根据文件的inode找到目录的data block->将文件名和inode编号映射关系写入目录数据块中。

文件的删除

在文件目录中找到 inode,再找到对应的block,在数据块里通过映射关系找到要删除文件的inode编号

再根据inode的编号找到block group(组) ,在俩个(inode和block)位图中,都将1修改为0。

最后在目录的数据块映射除,把文件名和inode映射关系解除。完成删除工作。

软硬链接

在当前路径底下,有test.txt文件和dir目录


软链接

类似于window的快捷方式

通过指令 ln -s test.txt test.soft 将前的文件链接到后

通过ls -il查看inode 得到源文件和软连接的文件的inode不同,不是同一份文件!

因此软链接是创建独立文件,有独立的inode

软链接的内容是指向目标文件的路径

如果删除了源文件,链接文件存在。但是不能存在或者执行

目录是无法进行软链接的


硬链接

创建文件myfile.txt 通过硬链接指令 ln myfile.txt myfile.hard

通过ls -il指令 对比源文件myfile和硬链接文件myfile.hard得到这俩个文件是同一个inode编号,因此它们不是独立文件,是同一份文件。

还可以观察到 文件权限后的标识符是软硬链接数目

软链接不改变链接数目

硬链接改变链接数目

删除硬链接文件后,源文件的软硬链接数目减一

删除源文件后,硬链接的文件链接数目会减一

这里就涉及到了引用计数

硬链接的本质就是在目录下建立的文件名和inode的映射关系

被硬链接一次映射关系就会多1 ,引用计数会增加。

当文件名和inode的映射关系全部解除  ,计数从1减到0时。文件才会被删除。找到inode编号,修改inode位图和block位图

目录的链接数:

一个目录被创建出来,就有俩个链接数,链接文件为本身目录和当前目录下的 .

如果在目录下建立新目录,上一层目录的链接数也会增加

目录硬链接会出现路径错误

软硬链接就在为了不切换路径,而能够打开的快捷方式

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

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

相关文章

SpringAOP以及事务管理和优化处理

Spring的AOP 本篇章中所有的代码都将会放置到git仓库中去,并且会做一个简要的说明。 一、个人理解描述 Spring中所谓的AOP就是在不修改源码的情况下,来进行增强。所谓的增强其实就是在方法执行前后添加一些额外操作。 所谓的增强,就是我们…

Ubuntu使用docker-compose安装chatGPT

ubuntu环境搭建专栏🔗点击跳转 Ubuntu系统环境搭建(十五)——使用docker-compose安装chatGPT Welcome to the AI era! 使用docker compose安装 在/usr/local文件夹下创建chatgpt mkdir chatgpt创建docker-compose.yaml vim docker-compos…

什么是OSPF?为什么需要OSPF?OSPF基础概念

什么是OSPF? 开放式最短路径优先OSPF(Open Shortest Path First)是IETF组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol)。 目前针对IPv4协议使用的是OSPF Version 2(RFC2328&#x…

数据库(MySQL库表操作)

目录 1.1 SQL语句基础(SQL命令) 1.1.1 SQL的简介 1.1.2 SQL语句的分类 1.1.3 SQL语句的书写规范 1.2 数据库操作 1.2.1 查看 1.2.2 自建库 1.2.3 切换数据库 1.2.4 删库 1.3 MySQL字符集 1.3.1 MySQL字符集包括: 1.3.2 utf8 和 u…

性能压力测试:企业成功的关键要素

性能压力测试在现代企业软件开发中扮演着至关重要的角色,它不仅仅是一项技术手段,更是保障企业成功的关键要素。本文将探讨性能压力测试在企业中的重要性,并阐述其对业务稳定性、用户体验和品牌声誉的影响。 一、保障业务稳定性 1、应对高负载…

Java 全栈知识点问题汇总(上)

Java 全栈知识点问题汇总(上) 1 Java 基础 1.1 语法基础 面向对象特性?a a b 与 a b 的区别3*0.1 0.3 将会返回什么? true 还是 false?能在 Switch 中使用 String 吗?对equals()和hashCode()的理解?final、finalize 和 finally 的不同…

SpringCloud Aliba-Sentinel【中篇】-从入门到学废【5】

🎵歌词分享🎵 岁月在墙上剥落看见小时候。 ——《东风破》 目录 🥓1.流控规则 🌭2. 熔断规则 🧈3.热点规则 🧂4.系统规则 1.流控规则 1.资源名:唯一名称,默认请求路径 2.针对来…

GPT应用_AutoGPT

项目地址:https://github.com/Significant-Gravitas/AutoGPT 1 功能 1.1 整体功能,想解决什么问题 单独使用 ChatGPT 时,只提供基本的聊天,无法实现复杂多步的功能,以及与其它应用交互,如果想提供某种功…

OpenCV实战:控制手势实现无触摸拖拽功能

前言: Hello大家好,我是Dream。 今天来学习一下如何使用OpenCV来控制手势,瞬间提升操作体验!跨越界限,OpenCV手势控制拖拽功能现身。 一、主要步骤及库的功能介绍 1.主要步骤 要实现本次实验,主要步骤如下…

Redis缓存问题解决方案

Redis缓存问题解决方案 为什么使用Redis缓存: 1.在高并发的情况下,大量查询进入数据库,会大量占用数据库的连接(默认数据库连接数151),数据库压力过大就会出现connection refuse(数据库连接拒绝)问题, 2.…

Codeforces Round 895 (Div. 3)补题

Two Vessels(Problem - A - Codeforces) 题目大意:有两个无限容器,目前一个容器中有a克水,另一个容器中有b克水,现有一个大小为cg的容器,我们每次可以从一个无限容器中取任意不大于c克的水&…

android中.9图如何制作

在工作中我们需要做界面往往需要设计师给我们提供图标,我们才能把界面友好的显示出来,普通的图标用png、jpg等都可以显示出来,为了让界面更与众不同,设计师们通常会设计一些弯角、弯钩如果我们要作为背景使用的话就不能设置高度&a…