【Linux】文件系统

news2024/7/6 18:48:49

目录

  • 🌈前言
  • 🌷1、磁盘的组成
    • 🍡1.1、磁盘的物理结构
    • 🍢1.2、磁盘的存储结构
    • 🍣1.3、磁盘的逻辑结构
  • 🌸2、文件系统
    • 🍤2.1、文件系统的结构
    • 🍥2.2、inode如何与数据块建立联系
    • 🍦2.3、文件名与目录的关系
    • 🍧2.4、软硬链接
      • 🍨2.4.1、软链接
      • 🍩2.4.2、硬链接

🌈前言

本篇文章进行操作系统中文件系统的学习!!!


🌷1、磁盘的组成

我们之前所学的东西,都是在内存中的,现在我们要将视角从内存中迁移到“磁盘”上!!!

  • 文件在内存中打开时,不是磁盘中的所有文件都被打开,没有被打开的依然在磁盘静静躺着

  • 磁盘中有大量的文件,这些文件非常多, 非常杂乱,磁盘要对其进行管理

  • 文件系统:磁盘级别的文件管理,本质工作就是管理文件,用于明确磁盘或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法

  • 它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取和删除


🍡1.1、磁盘的物理结构

机械磁盘是我们计算机上唯一的一个机械设备,现在大部分电脑用的都是固态硬盘(SSD)

在这里插入图片描述

在这里插入图片描述


🍢1.2、磁盘的存储结构

磁盘的存储结构:

  • 盘片:盘片有两个盘面,每个表面都涂有磁性材料,磁性材料是用来保存二进制数据的,每个磁盘的两个表面都能够存储数据

在这里插入图片描述

  • 磁头:硬盘读取数据的关键部件,它的主要作用就是将存储在硬盘盘片上的磁信息转化为电信号向外传输,而它的工作原理则是利用特殊材料的电阻值会随着“磁场变化”的原理来读写盘片上的数据

  • 一个盘面,只有一个磁头!!!

盘片有磁性,磁性分为NS极,磁头改变NS极,就是改变了二进制01


  • 磁道和扇区:每个盘片被划分为一个个磁道(一个个半径不同的同心圆环),每个磁道又划分为一个个扇区(磁道上的一个弧段),扇区是磁盘的最小存储单元,通常是512字节

在这里插入图片描述
在这里插入图片描述

  • 柱面:所有盘面中半径相同的磁道组成柱面

在这里插入图片描述

OS是如何对磁盘进行读写数据的呢???

  • 读写磁盘的时候,磁头找的是某一个面(盘面)的某一个磁道(柱面,距离圆心的半径)的某一个扇区(磁道上的一段扇形存储单元)

  • 这种寻找方式,叫做:CHS(Cylinder Head Sector)寻址

  • 只要我们能找到磁盘上的盘面,柱面(磁道)和扇区,就能找到一个存储单元

在这里插入图片描述


🍣1.3、磁盘的逻辑结构

我们以前学英语,都是把录音带放到录音机里面来跟着学习的!!!

  • 录音带里面的带子存储着数据,该数据可以通过录音机解析播放出来

  • 录音带里面的带子可以拉出来就是一条直线的带子(线性存储数据),也可以拉回去

在这里插入图片描述

磁盘里面是通过以扇区为单位进行数据存储的,磁盘里面有无数个很小的磁铁

  • 磁盘也可以将其看作是一个线性的结构,将磁盘的管理转化成对线性结构的管理

  • OS对磁盘进行IO磁盘读写时,是按4K字节为单位进行访问的

  • OS可以将线性结构的下标(LBA逻辑块地址)转化成CHS进行磁盘寻址

LBA转换成CHS的公式:#c = #lba / (S*H)、#h = (#lba/S) % H、#s = (#lba%S) + 1

  • / 是整数除法
  • % 是取整数除法中的余数
  • #c、#h、#s分别是磁柱、磁头、扇区的编号
  • #lba是逻辑区块编号
  • H=heads per cylinder,每个磁柱的磁头数
  • S=sectors per track,每磁道的扇区数

在这里插入图片描述


🌸2、文件系统

🍤2.1、文件系统的结构

Linux ext2文件系统,下图为磁盘文件系统图

在这里插入图片描述

  • 磁盘是典型的块设备,硬盘分区被划分为一个个的block

  • 磁盘是典型的块设备,硬盘分区被划分为一个个的block

  • 例如:mke2fs的【-b】选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的!!!

Linux下文件的内容和属性是分开存储的,内容被保存到Data blocks、属性被保存到inode table

  • 文件的内容是会发生改变的(不断增多),而属性是不变的(稳定的),它是定长的!

  • 文件系统设计时为了减少它们之间的关联性,就分开进行存储

在这里插入图片描述

文件系统中各个块中的作用:

  • Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成

  • Super Block(超级块):存放文件系统本身的结构信息,记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了

  • GDT(Group Descriptor Table): 块组描述符,描述块组属性信息

  • i节点表(inode table):存放文件属性,如:文件大小,所有者,最近修改时间等,inode table里面还会有一个inode编号和block[],用来与对应的Data Block建议联系!!!

  • inode table其实还存储了一个blocsk编号 – 块编号,用来与数据块建立关联的!
  • inode编号与inode是不同的概念,inode里面保存着inode编号,Linux是通过inode编号标识文件的

在这里插入图片描述

  • 数据块(Data blocks):存放文件内容

  • 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用

  • inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用

使用stat指令可以查看对应的inode信息(文件的属性)

[lyh_sky@localhost lesson22]$ ls
dir  file.txt
[lyh_sky@localhost lesson22]$ stat file.txt 
  文件:"file.txt"
  大小:0         	块:0          IO 块:4096   普通空文件
设备:fd00h/64768d	Inode:34316581    硬链接:1
权限:(0664/-rw-rw-r--)  Uid:( 1000/ lyh_sky)   Gid:( 1000/ lyh_sky)
环境:unconfined_u:object_r:user_home_t:s0
最近访问:2022-11-28 23:25:40.573487092 +0800
最近更改:2022-11-28 23:25:40.573487092 +0800
最近改动:2022-11-28 23:25:40.573487092 +0800
创建时间:-

🍥2.2、inode如何与数据块建立联系

一个inode table(文件的属性)如何与属于自己的文件内容建立联系呢?

inode table其实是一个结构体:

  • 这个结构体里面有一个保存block编号的数组,这个数组就是block[]

  • 要找到文件,必须先找到文件的inode编号,OS帮我们完成

  • OS可以通过inode表找到要打开文件的inode编号,通过inode编号就可以确定在哪个块组(group block)中,并且可以找到对应的block编号,通过block编号,就能找到对应的文件数据

Linux下,底层实际是通过inode编号来标识文件的!!!

struct inode
{
	// 文件的属性
	...
	// [0, 11]:直接保存的就是该文件对应的block编号
	// [12, 14]:指向一个Data block,但是这个Data block不存储有效数据,而是保存该文件所使用的其他块的编号
	block[15];
};

注意:

  • 一个Data block也可以保存块的编号,一个编号4个字节,可以保存4098 /4 = 1024个编号

  • 文件名也是属性,但是inode里面并不保存文件名!!!

🍦2.3、文件名与目录的关系

为什么文件名不保存在inode中呢???

  • 目录也是一个文件,它也有“内容(block)”和“属性(inode)”

  • 目录的内容中保存着文件名和inode编号的映射关系,通过文件名可以找到indoe编号!

  • 目录的属性就是我们熟知那几种…

  • 目录下不能创建同名文件,文件名本身就是一个具有Key值的东西!!!

[lyh_sky@localhost lesson22]$ ls
dir  file.txt
[lyh_sky@localhost lesson22]$ stat dir
  文件:"dir"
  大小:6         	块:0          IO 块:4096   目录
设备:fd00h/64768d	Inode:67355290    硬链接:2
权限:(0775/drwxrwxr-x)  Uid:( 1000/ lyh_sky)   Gid:( 1000/ lyh_sky)
环境:unconfined_u:object_r:user_home_t:s0
最近访问:2022-11-27 18:42:07.249357730 +0800
最近更改:2022-11-27 18:42:07.249357730 +0800
最近改动:2022-11-27 18:42:07.249357730 +0800
创建时间:-

当我们创建一个文件时,OS做了什么???

  • 建立文件名和inode编码,找到自己所处的目录,根据目录的inode表(属性),找到目录的Data block(内容),建立文件名和inode编号的映射关系,并且写入到目录的数据块中!!!

  • 把块位图和inode位图的某个比特位置为1!!!

当我们删除一个文件时,OS做了什么???

  • 首先找到自己所处的目录,根据目录的inode找到目录的数据块,通过目录的数据块找到文件的inode,在inode中找到inode编号,就可以确定在哪个group block中

  • 将这个文件对应块位图和inode位图的bit置为0,最后将该文件所处目录中的Data block中的文件名和inode编号的映射关系去掉即可,这样就完成了删除!!!

  • 在各个OS中下载文件都要很久,删除却很快,其实OS只进行了“伪删除”!!!


🍧2.4、软硬链接

🍨2.4.1、软链接

软硬链接的区别是什么???

软链接:软链接是一个独立文件,有自己独立的inode和inode编号

  • 软链接是通过名字引用另外一个文件(不同的文件名可以执行引用的另外一个文件)

  • 使用 ln 【-s】file1 file2 – 创建软链接

  • 注意:file1必须是需要链接的原文件,file2是建立新的软链接文件名

[lyh_sky@localhost lesson22]$ ls
dir1  test  test.cxx
[lyh_sky@localhost lesson22]$ ./test 
hello world
// 创建软连接文件
[lyh_sky@localhost lesson22]$ ln -s test Test
[lyh_sky@localhost lesson22]$ ls -ali
总用量 20
 34291532 drwxrwxr-x.  3 lyh_sky lyh_sky   58 1129 17:15 .
102102786 drwxrwxr-x. 21 lyh_sky lyh_sky 4096 1127 18:41 ..
 67905798 drwxrwxr-x.  3 lyh_sky lyh_sky   18 1129 10:44 dir1
 34669584 -rwxrwxr-x.  1 lyh_sky lyh_sky 8968 1129 17:13 test
 33555038 lrwxrwxrwx.  1 lyh_sky lyh_sky    4 1129 17:15 Test -> test
 33555013 -rw-rw-r--.  1 lyh_sky lyh_sky  106 1129 17:13 test.cxx
[lyh_sky@localhost lesson22]$ ./Test 
hello world
  • 软链接是Linux下的快捷键,比如:Windows上桌面的图标都是一个软链接文件

  • 我们删除Windows上的图标,只不过是删除了一个软链接文件,没有真正的删除文件
    在这里插入图片描述

Linux下创建快捷方式 – 对可执行文件建立软链接(指向可执行文件)

[lyh_sky@localhost lesson22]$ ls
dir1
[lyh_sky@localhost lesson22]$ tree dir1/
dir1/
└── dir2
    └── dir3
        ├── test
        └── test.cxx

2 directories, 2 files
[lyh_sky@localhost lesson22]$ ln -s ./dir1/dir2/dir3/test Test
// Test就是新创建的可执行文件的快捷方式!!!
[lyh_sky@localhost lesson22]$ ls -ali
总用量 4
 34291532 drwxrwxr-x.  3 lyh_sky lyh_sky   30 1129 17:27 .
102102786 drwxrwxr-x. 21 lyh_sky lyh_sky 4096 1127 18:41 ..
 67905798 drwxrwxr-x.  3 lyh_sky lyh_sky   18 1129 10:44 dir1
 33555013 lrwxrwxrwx.  1 lyh_sky lyh_sky   21 1129 17:27 Test -> ./dir1/dir2/dir3/test
[lyh_sky@localhost lesson22]$ ./dir1/dir2/dir3/test 
hello world
[lyh_sky@localhost lesson22]$ ./Test 
hello world

既然软连接文件是一个独立文件,inode也是独立的,那么该文件的内容是什么呢?

  • 软链接文件中内容保存的是指向文件的所在路径

🍩2.4.2、硬链接

硬链接:硬链接不是一个独立的文件,他和目标文件使用的是同一个inode

  • 硬链接是通过inode引用另外一个文件(inode编号相同)

  • 使用 ln file1 file2 – 创建硬链接

[lyh_sky@localhost lesson22]$ ls
file.txt
[lyh_sky@localhost lesson22]$ ln file.txt file
// 注意查看它们之间的inode编号是一样的
[lyh_sky@localhost lesson22]$ ls -ali
总用量 
 34291532 drwxrwxr-x.  2 lyh_sky lyh_sky   34 1129 23:27 .
102102786 drwxrwxr-x. 21 lyh_sky lyh_sky 4096 1127 18:41 ..
 33554501 -rw-rw-r--.  2 lyh_sky lyh_sky    0 1129 23:26 file
 33554501 -rw-rw-r--.  2 lyh_sky lyh_sky    0 1129 23:26 file.txt

硬链接不是一个独立文件,那是什么呢?

  • 硬链接就是单纯的在Linux指定的目录下,给指定文件新增文件名和inode编号的映射关系!

  • 本质就是改文件inode属性中的计数器,标识有几个文件名与我的inode编号建立了映射关系!

  • 简而言之,就是有几个文件名指向了我的inode(文件本身)(inode编号就是一个“指针”的概念)

当我们创建普通文件时,硬链接为什么默认是1呢?

  • 因为普通文件的文件名本身就和自己的inode编码的映射关系只要一个!
[lyh_sky@localhost lesson22]$ touch file.txt
[lyh_sky@localhost lesson22]$ ls -li
总用量 0
34316595 -rw-rw-r--. 1 lyh_sky lyh_sky 0 1129 23:44 file.txt

硬链接的作用:

  • 可以进行路径间的切换,比如:目录中的隐藏文件(点和点点)

  • 点和点点的作用分别是保存了目录当前路径和到目录的上一个路径

在这里插入图片描述

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

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

相关文章

2021年全国研究生数学建模竞赛华为杯C题帕金森病的脑深部电刺激治疗建模研究求解全过程文档及程序

2021年全国研究生数学建模竞赛华为杯 C题 帕金森病的脑深部电刺激治疗建模研究 原题再现: 一、背景介绍   帕金森病是一种常见的神经退行性疾病,临床表现的特征是静止性震颤,肌强直,运动迟缓,姿势步态障碍等运动症…

R语言生存分析可视化分析

生存分析指的是一系列用来探究所感兴趣的事件的发生的时间的统计方法。 生存分析被用于各种领域,例如: 癌症研究为患者生存时间分析, “事件历史分析”的社会学 在工程的“故障时间分析”。 在癌症研究中,典型的研究问题如下…

Java中如何处理时间--Date类

文章目录0 写在前面1 介绍Date类2 构造方法举例2.1 Date()2.2 Date(long date)3 Date类中常用方法4 写在最后0 写在前面 在实际业务中,总会碰到关于时间的问题,例如收集当年的第一季度的数据。第一季度也就是当年的一月一日到三月三十一日。如何处理时间…

使用markdown画流程图、时序图等

概述 能表示的图类型还有很多,比如: sequenceDiagram时序图 classDiagram类图 stateDiagram:状态图 erDiagram:ER图 gantt: 甘特图 pie:饼图 requirementDiagram: 需求图 流程图 流程图代码以「graph 《布局…

【毕业设计】12-基于单片机的电子体温计(原理图工程+源码工程+仿真工程+答辩论文)

【毕业设计】12-基于单片机的电子体温计(原理图工程源码工程仿真工程答辩论文) 文章目录【毕业设计】12-基于单片机的电子体温计(原理图工程源码工程仿真工程答辩论文)任务书设计说明书摘要设计框架架构设计说明书及设计文件源码展…

Efficient Large-Scale Language Model Training on GPU ClustersUsing Megatron-LM

Efficient Large-Scale Language Model Training on GPU ClustersUsing Megatron-LM 1 INTRODUCTION 在这篇文章中展示了 如何将 tensor ,pipeline, data 并行组合,扩展到数千个GPU上。 提出了一个新的交错流水线调度,可以提升1…

卷积神经网络的工程技巧总结

参考 卷积神经网络的工程技巧(tricks) - 云社区 - 腾讯云 要成功地使用深度学习算法,仅仅知道存在哪些算法和解释它们为何有效的原理是不够的。一个优秀的机器学习实践者还需知道如何针对具体应用挑选一个合适的算法以及如何监控,并根据实验反馈改进机器…

基于 Hive 的 Flutter 文档类型存储

基于 Hive 的 Flutter 文档类型存储 原文 https://medium.com/gytworkz/document-type-storage-in-flutter-using-hive-a18ea9659d84 前言 长久以来,我们一直使用共享首选项以键对格式在本地存储中存储数据,或者使用 SQLite 在 SQL 数据库中存储数据。 存…

JSP | JSP原理深度剖析、基础语法

目录 一:分析使用纯粹Servlet开发web应用的缺陷 二:JSP原理深度剖析 三:JSP的基础语法 一:分析使用纯粹Servlet开发web应用的缺陷 (1)在Servlet当中编写HTML/CSS/JavaScript等前端代码存在什么问题&…

基于ATX自动化测试解决方案

在整车开发中,诊断功能实现后需要进行测试验证。测试验证主要分为两个方面:诊断协议层测试和诊断功能测试。诊断协议层测试:需要对服务层服务定义、传输层相关时间参数进行测试验证;诊断功能测试:需要对各诊断功能项&a…

国产操作系统之银河麒麟服务器版V10安装

一、银河麒麟操作系统简介 银河麒麟是目前国内国产化操作系统主流产品之一。银河麒麟高级服务器操作系统V10是针对企业级关键业务,适应虚拟化、云计算、大数据、工业互联网时代对主机系统可靠性、安全性、性能、扩展性和实时性等需求,依据CMMI5级标准研制…

Java中的引用

Java中的引用强引用软引用弱引用虚引用终结器引用(FinalReference)JDK 1.2版本之后,Java对引用的概念进行了扩充,将引用分为强引用(Strongly Reference)、软引用(Soft Reference)、弱引用&#…

时间序列:时间序列模型---移动平均过程(Moving Average Process)

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 我们从白噪声生成另一种时间序列。如下式: 这种时间序列的值由此刻的白噪声实现(white noise realization)加上beta倍的前一刻的白噪声实现。注意这个beta跟CAPM模型的beta没有…

Linux redict 输入输出重定向 详细使用方法 文件描述符

Linux redict 重定向 Linux 重定向 在 Linux 系统中,我们需要输入和输出让系统与外部进行交互,比如在我们使用鼠标、键盘等输入设备时其实就是通过输入的方式让数据进行系统中。而系统输出一般就会打印在显示器上、刻录光盘等等。而我们要讲的重定向也…

【学习笔记70】数据劫持

一、 数据驱动视图 多次渲染页面,多的时候,比较麻烦和繁琐const box document.querySelector(.box)const obj {name: QF666,age: 18}box.innerHTML 名字: ${obj.name}; 年龄: ${obj.age};obj.age 99;box.innerHTML 名字: ${obj.name}; 年龄:…

RabbitMQ系列【16】AmqpTemplate接口详解

有道无术,术尚可求,有术无道,止于术。 文章目录前言AmqpTemplateAPIsendconvertAndSendreceivereceiveAndConvertreceiveAndReplysendAndReceiveconvertSendAndReceive前言 RabbitTemplate 是spring-amqp提供的一个 RabbitMQ 消息操作模板类…

【Git】rebase 和 merge 的区别

前言 今天想把本地的两个提交压缩成一个提交,再推送到远程。用的是rebase命令解决的,于是乎又捡起了之前的遗留问题:rebase和 merge 有什么区别? 用的是idea内置的git插件,先把idea官网对 “update project” 选择 “…

postgresql使用pg_basebackup备份与恢复

postgresql可以使用pg_dump,pg_restore等命令来进行备份与恢复,那种情况不用停止pgsql服务,只需要执行备份恢复命令即可。 今天介绍的这种备份方式,类似于文件系统的备份与恢复,它需要使用pg_basebackup命令来进行备份&#xff0c…

C#医院门诊会员管理系统源码 通用会员系统源码

C#通用医院会员管理系统源码 源码分享! 本系统使用的技术为NhibernateEF,底层完全封装,可二次使用快速开发。 本技术具有以下特点: 1.面向对象方式访问数据库,摆脱SQL; 2.可移植性强,支持所有流行的数据…