文件系统和软硬连接

一、磁盘

磁盘可以存储大量的二进制数据,并且断电后也能保持数据不丢失。因此磁盘是一种永久性存储介质,在计算机中,磁盘是一个外设,也是唯一的机械设备。既然磁盘是一个外设,那么就意味着,磁盘和内存(掉电易失存储介质)相比就比较慢了。

目前所有的普通文件都是在磁盘中存储的。磁盘在冯诺依曼体系结构当中既可以充当输入设备,又可以充当输出设备。

1.1、磁盘的物理结构

磁盘的盘片/盘面是用来存储数据的,两面都有。磁头(每一面都有一个磁头)和盘面并没有接触。中间有音圈马达,一旦磁盘通电之后,盘片旋转,磁头摆动,马达可以控制磁头摆动,控制盘片旋转,通过磁头将二进制数据写到磁盘上。

因为磁盘上存储的是二进制数据,数据是两态的,而磁盘上有许多小的磁铁颗粒,所以磁头是通过改变磁盘上的正负性来写入数据的。

1.2、磁盘的存储结构

扇区:一块绿色的部分就是扇区。磁盘存储数据的基本单位。扇区大小512字节,512字节是硬件要求。

磁道:左图中,一圈一圈的灰色的同心圆就是磁道。磁盘上只有磁道位置能够存储数据,其他位置则不能存储数据。

柱面:多个半径相同的圆构成柱面。如右图紫色的部分。

 

如何将数据写到指定的扇区上:1、首先确认写到哪一个面上(用哪一个磁头去写入) 2、在哪一个磁道上   3、最后找到在哪一个扇区。

磁盘中存储数据,需要先定位扇区,定位任何一个扇区,采用的硬件级别定位方式(CHS定位法):柱面Cylinder——磁头Head——扇区Sector。

1.3、磁盘的抽象结构

由于操作系统并不认识磁盘的物理结构,因此操作系统在访问磁盘时必须使用自己的方式将磁盘的数据管理起来。我们可以把磁盘盘片想象成线性结构。在操作系统的角度,磁盘就是一个线性结构。我们使用数组来表示一个磁盘。要访问某个扇区,只需要找到数组下标,也就是说知道这个扇区的下标就算定位了一个扇区。

在操作系统中,我们称这种地址为LBA(Logic Block Address)地址。而要写到物理磁盘上,我们就要把LBA地址转换成对应磁盘的三维地址CHS地址。

于是在操作系统中,对于磁盘的管理,就变成了对于该数组的管理。操作系统能够通过某种方法,将LBA地址转换成CHS地址,进而可以访问磁盘数据。

二、文件系统和inode

2.1、初识inode

如下图:我们使用 ls -li 命令后,发现除了文件的名称、类型、权限、拥有者、所属组、大小最近修改时间这些内容,每个文件的最开始会有一串数字。那么这个数字是什么呢?其实这个数字就是该文件的inode编号。

那么inode编号代表着什么意思呢?我们接着往下看。

2.2、文件系统

在操作系统中,对于磁盘的管理,本质上就是对于磁盘抽象成的数组的管理。而我们知道,如果一个磁盘的空间是很大的,所以抽象出的数组也一定是很大的,那么操作系统如何管理这么大的数组的呢?

我们假设一个磁盘有500GB的大小。如果直接对这500GB进行管理,那是十分麻烦的。所以我们可以将磁盘分成多个小的分区。对一个小的分区进行管理。我们如果将所有小的分区管理好了,那么整个磁盘就管理好了。如果一个分区还是比较大,那么我们可以继续划分,最后,我们得到一个便于管理的块组。把一个块组管理好,这个分区就管理好了,分区管理好了,整个磁盘就管理好了。

下面我们对一个块组中的内容进行解释:

Boot Block:一个分区的最前面,有一个区域叫做boot block。它是启动块,存在每个分区的开头,备份文件与启动相关的。

Super Block:保存的是整个文件系统的属性信息。Super Block保存在各个块组里意味着备份,如果某个块组的 Super Block损坏,便可以通过拷贝其他块组的Super Block。

Data blocks:保存特定文件的内容。虽然磁盘存储数据的基本单位是扇区(512字节),但是操作系统(文件系统)和磁盘进行IO的基本单位是4KB。data blocks相当于多个4KB大小的空间的集合。Linux的文件=内容+属性,而Linux在磁盘上存储文件是将内容和属性是分开存储的。

inode table:inode是一个大小为128字节的空间,保存对应文件的属性。inode table 则是多个inode空间的集合,所以为了区别,每一个inode空间对应一个inode编号。即:一般而言,一个文件,一个inode空间,一个inode编号。

data blocks和inode tables都是由许多个小的空间组成的,那么我们在向磁盘写入数据时,我们怎么知道哪些空间被占用了,哪些空间没有被占用呢?我们可以使用block bitmap和inode bitmap来标注这些空间的占用情况。

block bitmap:data blocks对应的位图结构,位图中的比特位位置和当前data block对应的数据块位置是一一对应的。比特位为1,代表block被占用,否则表示可用。

inode bitmap:inode对应的位图结构,统计inode的使用情况,位图中比特位的位置和当前文件对应的inode的位置是一样对应的,比特位为1,代表inode被占用,否则表示可用。

GDT(group descripteor table):块组描述符,表示该块组的属性信息,如已经使用多少,inode有多少个,已经被占用了多少个,还剩下多少个。

格式化:当磁盘完成分区后,我们还需要对磁盘进行格式化。磁盘格式化就是对磁盘中的分区进行初始化的一种操作,即:磁盘格式化就是对分区后的各个区域写入对应的管理信息,如block bitmap和inode bitmap全部初始化成为0。所以格式化通常会导致现有的磁盘或分区中所有的文件被清除。

所以,一个块组的前四个部分被我们称为文件系统信息,后面两个部分就是文件的相关内容信息。

2.3、用inode编号找文件属性和内容

既然文件的属性和内容是分开存储的,那么我们要怎么通过inode编号去找到它呢?

首先,属性是很容易就可以找到的,因为我们只要知道了inode编号,就可以直接找到文件的属性。但是,想要找到文件的内容就不是那么容易了。第一点,我们无法通过某种方式直接找到,而且一个文件的大小是可以很大的,这就说明了一个文件的内容会被存储在多个 data blocks中,我们必须将所有的data blocks找到,才是找到了文件的内容,但是我们怎么知道哪些data blocks属于同一个文件。

那么我们应该怎么寻找文件的内容呢?在Data blocks中,每个data block都会有一个编号。而inode其实是一个结构体,它的里面除了文件的各种属性信息外,还有一个int blocks数组,该数组里保存的数字,就是对应的data block的编号,通过这个数组,我们就可以找到属于该文件的所有内容。

但是,这里就又有一个疑问了, blocks数组一般只能存15个编号,可是如果文件内容的data block个数多于数组大小呢?这当然是有解决办法的。

并不是所有的data block只能存放文件的内容,也可以存放其他块的编号,所以最终指向更多的data block来存储。如下图:

2.4、inode和文件名

首先,我们要知道的是,在Linux中,inode属性里面并没有文件名的概念。但是,用户使用时使用的却是文件名,而不是系统认识的inode,这是为什么呢?

在一个目录下,可以保存很多的文件,且同一个目录下文件名是没有重复的。其实,目录也是一个文件,它也有自己的inode和data block。目录的data block中保存的就是该目录下的文件的文件名与其inode编号的映射关系。

2.5、创建一个文件

在inode bitmap中对应的比特位由0置为1,找到其inode table,把属性填进去,文件的数据写到block里,再inode和block建立映射关系,然后block bitmap中对应的比特位由0变为1,接着文件名和inode编号建立映射关系,最后返回inode编号,创建成功。

所以我们在一个目录下创建一个新的文件,必须有写的权限,新建一个文件的时候,要向当前目录的内容里去写文件名和inode的映射关系,所以必须得有写入权限。

2.6、查看一个文件

拿到inode找到inode table,在根据inode table找到对应的数据块,内容加属性就全找到了。

2.7、删除一个文件

实际上删除一个文件时,我们只需要找到inode在inode bitmap当中的比特位和block bitmap中的比特位,把比特位由1置为0,然后解除文件名和inode编号的映射关系。

所以把文件删除是能够恢复的,因为删除只是把比特位清掉了,想要恢复只要得到inode的编号,然后把inode bitmap里的比特位由0置为1,在去inode table对应的映射表,在block bitmap的0置为1。所以如果在Linux中误删除一个文件,还是能恢复的,但是前提必须是inode和data block没有被新的内容占用,所以当误删除一个文件时,最好的办法就是什么都不做。

三、软硬链接

3.1、软连接

我们先来看一看下面的问题:在 bin/exe 路径下有一个可执行程序 test,如果我们要在最开始的目录下执行它的话,我们要使用完整的路径。如果可执行程序在一个路径下藏得非常深,那么即使是使用相对路径,也比较麻烦。


所以,我们可以使用软连接来帮助我们快速找到可执行程序 

ln -s myfile.txt soft_file.link

软连接就相当于Windows下的快捷方式:在我的电脑上,桌面上的微信指向的就是一个长路径下微信的可执行程序。

有自己独立的inode的称为软链接,即软链接是独立的文件,独立的文件有独立的inode和对应的文件内容。 

3.2、硬链接

创建硬链接:

ln myfile.txt hard_file.link

软硬链接最重要的区别在于是否具有独立的inode,硬链接没有独立的inode,它的inode是与其链接文件的inode相同。

建立硬链接根本没有新增文件,因为没有给硬链接的文件分配独立的inode,所以创建硬链接本质就是在指定的路径下,新增文件名和inode编号的映射关系!相当于给文件取了一个别名。

我们再仔细观察,发现建立了硬链接后,数字变成了2,删除硬链接后,数字又重新变成了1。这个数字就叫做硬链接数。也就是这个文件有几个名字。

~ 为什么创建一个普通文件的时候,默认硬链接数是1?

首先目录和本身的inode就是一组映射关系了,第二,目录中还有一个目录 . 表示当前目录,该文件和inode也是一组映射关系,所以是硬链接数是2。

~ 现在在空目录dir下创建一个新的目录d1,此时dir的硬链接数就变成了3,为什么?

因为d1目录下有一个目录 .. 表示上级目录,也就是dir,所以硬链接数为3。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux无root配置Node,安装nvm

1. 安装NVM: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash # 或者,如果你使用wget wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash 对于bash用户,可以运行&…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.6讲 GPIO中断实验-GPIO驱动添加中断处理函数

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

Weblogic 管理控制台未授权远程命令执行漏洞(CVE-2020-14882,CVE-2020-14883)

1 漏洞概述 Weblogic Pre-Auth Remote Command Execution 漏洞(CVE-2020-14882, CVE-2020-14883)是针对 Oracle WebLogic Server 的两个安全漏洞。CVE-2020-14882 允许远程用户绕过管理员控制台组件中的身份验证,而 CVE-2020-14883 则允许经…

基于springboot+vue+Mysql的大学生社团活动平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

Web应用开发中查找慢SQL的方法

每条SQL语句在执行时都需要消耗一定的I/O资源,SQL语句执行的快慢直接决定了硬件资源被占用时长的长短,慢SQL一般指查询很慢的SQL语句。在MySQL数据库中,可以通过慢查询来查看所有执行超时的SQL语句。在默认情况下,一般慢SQL是关闭…

基于NIOS-II软核流水灯和串口通信实现

文章目录 一、创建工程二、系统设计1. 在 “component library” 标签栏中找到 “Nios II Processor” 后点击 Add2. 在 ”Component Library” 标签栏中的查找窗口输入 jtag 找到 ”JTAG UART ”,然后点击 Add3. 添加片上存储器 On-Chip Memory(RAM)核4. 查找窗口输…

Keil手动安装编译器V5版本

V5编译器下载:免积分下载 新版的keil不会自动帮你安装V5版本的编译器,但是很多教程很多比赛所用单片机都是V5的编译器,所以用来开以前的或者开源的很多东西编译直接一大堆报错。 吐槽说完了接下来教你怎么解决 打开installer(在…

springboot+vue+mybatis物业管理系统+PPT+论文+讲解+售后

快速发展的社会中,人们的生活水平都在提高,生活节奏也在逐渐加快。为了节省时间和提高工作效率,越来越多的人选择利用互联网进行线上打理各种事务,通过线上物业管理系统也就相继涌现。与此同时,人们开始接受方便的生活…

软件压力测试怎么做

随着信息技术的迅猛发展,软件在各行各业的应用越来越广泛,其稳定性、可靠性和性能表现也受到了越来越多的关注。在这样的背景下,软件压力测试显得尤为重要。本文将详细介绍软件压力测试的概念、目的、方法以及实施步骤,帮助读者更…

「JavaEE」多线程案例1:单例模式阻塞队列

🎇个人主页:Ice_Sugar_7 🎇所属专栏:JavaEE 🎇欢迎点赞收藏加关注哦! 多线程案例分析 🍉单例模式🍌饿汉模式🍌懒汉模式🍌指令重排序 🍉阻塞队列&a…

eMMC和SD模式速率介绍

概述 在实际项目开发中我们常见的问题是有人会问,“当前项目eMMC、SD所使用模式是什么? 速率是多少?”。这些和eMMC、SD的协议中要求的,要符合协议。接下来整理几张图来介绍。 eMMC 模式介绍 一般情况下我们项目中都是会支持到HS400 8bit 1.8V,最大时钟频率为200MHZ,通…

Idea入门:一分钟创建一个Java工程

一,新建一个Java工程 1,启动Idea后,选择 [New Project] 2,完善工程信息 填写工程名称,根据实际用途取有意义的英文名称选择Java语言,可以看到还支持Kotlin、Javascript等语言选择包管理和项目构建工具Mav…

十款开源数据集成工具

在大数据作业开发中,数据集成工具是非常重要的一个环节,一个好的数据集成系统从可用性、架构扩展性、底层引擎选型、数据源支持能力等方面都需要一定的考量,在本文中汇总了十款开源的数据集成系统,作者本人在过往的开发过程中&…

【记录】docker笔记(五):Docker网络-Network Namespace

Docker 网络理论基础 要了解docker网络,先了解如下基础概念。 Network Namespace Docker 网络的底层原理是 Linux 的 Network Namespace ,所以对于 Linux Network Namespace 的理解对 Docker 网络底层原理的理解非常重要。 简介 Network Name…

LeetCode328奇偶链表

题目描述 给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。请注意,偶数组和奇数组…

node.js的Express框架的介绍 与 安装详细教程

一、Express框架介绍 (1)Express定义: Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。 使用 Express 可以快速地搭建一个完整功能的网站。 &#xff08…

DDoS防护的市场需求将不断增长,DDoS高防IP显得各位重要

分布式拒绝服务(DDoS)攻击是一种恶意攻击,它借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的为例。DDoS攻击通过大量合法的请求占用大…

19个测试⽤例⽣成的AI⼯具!卷起来!

在不断发展的软件开发领域中,确保应⽤程序的可靠性和功能性⾄关重要。 随着软件系统复杂性的增加,有效测试⽅法的需求也在上升。 传统的测试⽤例⽣成⽅法通常⽆法满⾜快速开发周期和复杂代码库的需求。 随着进⼊⼈⼯智能(AI)时…

treejs 3D+echart实现三维旋转炫酷导航网页

treejs 3Dechart实现三维旋转炫酷导航网页https://www.bilibili.com/video/BV1SM4m1C7ki/

行为驱动开源免费接口测试框架:karate

什么是行为驱动测试: 行为驱动测试(Behavior-Driven Testing,简称 BDT)是一种测试方法,旨在通过描述系统行为和功能来编写测试用例。BDT的重点是从用户的角度出发,描述系统应该如何行为,而不是专…