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

news2024/9/23 21:24:13

文件的状态有被打开和没有被打开,之前谈到一个文件被进行读写,就要打开加载到内存中,通过对应的系统调用,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.coloradmin.cn/o/1397824.html

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

相关文章

高级架构师是如何设计一个系统的?

架构师如何设计系统? 系统拆分 通过DDD领域模型,对服务进行拆分,将一个系统拆分为多个子系统,做成SpringCloud的微服务。微服务设计时要尽可能做到少扇出,多扇入,根据服务器的承载,进行客户端负…

HFSS实战(一)——仿真PCB微带线的损耗

文章目录 一、ODB文件的导出二、PCB文件导入2.1 pcb文件导入2.2层叠设置 三、模型的裁剪四、模型的简化五、端口设置六、将3D LAYOUT模型导出成HFSS模型七、HFSS仿真结束 主要学习目标:利用HFSS3D layout 完成微带线的电磁仿真 利用一个简单的仿真,完成…

项目实战————苍穹外卖(DAY11)

苍穹外卖-day11 课程内容 Apache ECharts 营业额统计 用户统计 订单统计 销量排名Top10 功能实现:数据统计 数据统计效果图: 1. Apache ECharts 1.1 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观&#x…

2023.1.19 关于 Redis 事务详解

目录 Redis 事务对比 MySQL 事务 MySQL 事务 Redis 事务 Redis 事务原子性解释 Redis 事务详解 执行流程 典型使用场景 Redis 事务命令 WATCH 的使用 WATCH 实现原理 总结 阅读下文之前建议点击下方链接了解 MySQL 事务详解 MySQL 事务详解 Redis 事务对比 MySQL 事…

探索设计模式的魅力:一篇文章让你彻底搞懂建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,旨在将一个复杂对象的创建过程与其表示分离,使得同样的构建过程可以创建不同的表示形式。 主要角色: 产品(Product):表示正在构建…

小程序系列--9.生命周期

1. 什么是生命周期? 2. 生命周期的分类 3. 什么是生命周期函数 4. 生命周期函数的分类 5. 应用的生命周期函数 6. 页面的生命周期函数

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

目录 1.流控规则 2. 熔断规则 3.热点规则 1.流控规则 1.资源名:唯一名称,默认请求路径 2.针对来源: Sentinel可以针对调用者进行限流,填写微服务名,默认default (不区分来源) 3.阈值类型/单机阈值: QPS(每秒钟的请求数量&…

pytorch学习(一)线性模型

文章目录 线性模型pytorch使用sklearn训练 pytorch是一个基础的python的科学计算库,它有以下特点: 类似于numpy,但是它可以使用GPU可以用它来定义深度学习模型,可以灵活的进行深度学习模型的训练和使用 线性模型 线性模型的基本形…

Studio One2024免费版下载及入门教程分享

众所周知,Studio One是一个专业的音频编辑软件,近几年随着音视频剪辑越来越火,Studio One也逐渐被人们所熟知。最近,就有许多小伙伴私信我,寻求Studio One的入门教程。 这不,今天小编就给大家带来了音频剪…

iphone5s基带部分电源部分主主电源供电及

时序: 1.,基带电源的供电,基带电源也叫pmu。 首先时序图说电池提供供电,电池是J6接口,视频习惯把接口称之为座子。查U2_RF芯片,发现供电信号为PP_BATT_VCC_CONN,但是没查到跟电池座子有关系,电池座子写的是…

Flask框架小程序后端分离开发学习笔记《1》网络知识

Flask框架小程序后端分离开发学习笔记《1》网络知识 Flask是使用python的后端,由于小程序需要后端开发,遂学习一下后端开发。 一、网址组成介绍 协议:http,https (https是加密的http)主机:g.cn zhihu.com之类的网址…

Python使用pyechart分析疫情确诊人数图(2024)

import json from pyecharts.charts import Map from pyecharts import options as opts# 首先打开文件获取数据 f open("/Desktop/python/Project/数据可视化/疫情.txt", "r", encoding"UTF-8") data f.read()# 字符串转化成json数据 data_js…

rust使用protobuf

前言 c,java,go 等直接是用 ,具体就不说了,这章主要讲述rust 使用protobuf 这章主要讲述2种 1 > protoc protoc-gen-rust plugin 2> protoc prost-build 1:环境 win10 rustrover64 25-2 下载地址 https://github.com/protocolbu…

CHS_01.2.2.1+调度的概念、层次

CHS_01.2.2.1调度的概念、层次 调度的概念、层次知识总览调度的基本概念调度的三个层次——高级调度![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6957fdec179841f69a0508914145da36.png)调度的三个层次——低级调度调度的三个层次——中级调度补充知识&#xff…

unity-声音与声效OLD

声音与声效 基本概念audio clipaudio listeneraudio source 基本操作如何创建音频源(背景音乐)如何在测试的时候关闭声音 常用代码一般流程如何在一个物体上播放多个音效如何在代码中延时播放多个声音如何在代码中停止音频的播放如何判断当前是否在播放音…

Web3解密:区块链技术如何颠覆传统互联网

随着区块链技术的崛起,Web3正逐渐成为新一代互联网的代名词。它不再依赖中心化的权威机构,而是通过去中心化、透明、安全的特性,为用户带来更为开放和公正的互联网体验。本文将深入解密Web3,揭示区块链技术如何颠覆传统互联网的基…

Linux搭建dns主从服务器

一、实验要求 配置Dns主从服务器,能够实现正常的正反向解析 二、知识点 1、DNS简介 DNS(Domain Name System)是互联网上的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网。…

git提交代码到远端仓库的方法详解

一、何为git git就是版本控制器,就比如说你新建了一个git文件夹,里面用于存放你的C语言实习报告,现在要用git对该文件夹进行接管。当你修改了你的C语言实习报告点击保存之后,就用git的相关命令,提交给git,让…

ctfshow命令执行(web29-web52)

目录 web29 web30 web31 web32 web33 web34 web35 web36 web37 web38 web39 web40 web41 web42 web43 web44 web45 web46 web47 web48 web49 web50 web51 web52 web29 <?php error_reporting(0); if(isset($_GET[c])){$c $_GET[c];if(!preg_match…

go语言(十)---- 面向对象封装

面向对象的封装 package mainimport "fmt"type Hero struct {Name stringAd intLevel int }func (this Hero) Show(){fmt.Println("Name ", this.Name)fmt.Println("Ad ", this.Ad)fmt.Println("Level ", this.Level)}func (thi…