Linux——磁盘和文件系统(一)

Linux——磁盘和文件系统

  • 磁盘
    • 机械式磁盘
    • 固态硬盘
  • 机械式磁盘结构
    • 磁盘,磁道,扇区
    • 柱面
  • 文件系统的初始化
    • 划卷(划盘)
  • 挂载
    • C盘放了什么东西
      • Boot Block(启动模块)
    • 0号组放了什么东西
      • Super Block(超级块)
      • Data Block(数据块)
  • inode(索引结点)
    • inode bit map和block bit map
  • 软硬连接
    • 硬链接
    • 软连接

我们之前一直学习计算机都是在一个人为给定的,虚拟的层面上来了解的,今天我们来了解一下,一台计算机底层的组成,我们先来了解存储数据的硬件——磁盘

磁盘

我们一切计算机的基础的基础,是要有一个东西可以来储存我们的数据,这样我们才可以在每次运行时按照我们已经储存好的数据和规定来运行,磁盘就是一个重要的储存设备。

磁盘(Disk)是一种用于存储和检索数据的存储设备。它是计算机系统中的主要外部存储介质之一,被用于长期存储数据、操作系统和应用程序。

发展到如今,我们的磁盘也有许多的种类:

机械式磁盘

  1. 硬盘驱动器(HDD): HDD 是一种使用磁性存储技术的机械式磁盘,其中包含旋转的磁性盘片和移动的磁头。数据存储在盘片上的磁性表面上,而磁头则用于读写数据。
    这种是最早出现的磁盘,工作原理有点像“留声机”,通过指针头在磁道上读取存储数据:
    在这里插入图片描述

这种磁盘最主要的优势就是它便宜,量大,很多企业都会用它。但是缺点就是比较容易损坏,(因为磁头的高速摇晃),一旦损坏,数据很难恢复。

固态硬盘

固态硬盘(SSD): SSD 是一种不使用机械部件的磁盘,而是使用闪存存储技术。
在这里插入图片描述

它相对于HDD更加快速、耐用和轻便,但是也更加昂贵,一般用在笔记本,轻量级的电脑上。

机械式磁盘结构

磁盘,磁道,扇区

我们拿上面的机械式磁盘的图为例:

在这里插入图片描述磁盘:表面有一些磁性物质构成,可以记录一些二进制的数据。我们的磁头会从磁盘上读取数据。

磁道:我们上面看到磁盘好像是光滑的,其实盘面上已经被划分出来无数个轨道了,我们称这些轨道为磁道,磁头就是从磁道读取数据的。
在这里插入图片描述
扇区:磁道被等分划分出来的区域。
在这里插入图片描述在这里插入图片描述

我们可以对扇区编号,方便我们进行管理。

我们这里虽然只看到了一个盘面,但是,实际上一个机械式的磁盘是由很多个磁盘垒起来的,也会有多个磁头:

在这里插入图片描述
同时注意,我们一个盘,可能两个面都是可以读写的。
在这里插入图片描述

柱面

柱面:所有盘面中,相对位置相同的磁道所形成的柱面。
在这里插入图片描述

文件系统的初始化

好了,现在我们有了磁盘了,但是现在这样的物理结构不方便我们进行想象。假设我现在把每一个盘面剪开,然后拼接在一起:
在这里插入图片描述
然后我们可以抽象出来每扇盘面上的磁道和扇区:
在这里插入图片描述操作系统可以以扇区为单位读取,但是这样效率很低,其实我们我们可以一次读取多个扇区,以多个扇区为单位,我们称这样的这样的一个单位为文件块

这样的话我们操作系统在读取文件的时候就会以文件块为单位进行读取。

划卷(划盘)

好的假设现在我有一个完整的磁盘,大小为500GB
在这里插入图片描述现在有一个问题,500GB的磁盘,如果操作系统一个人来管理,操作系统会累死。所以,为了不让操作系统累死,我们可以将这500GB的磁盘进行区域划分
在这里插入图片描述
好了,现在我们划分好了区域,我们可以对这些区域起个名字:比如我把红色的100GB的区域,叫做C盘,把蓝色的300GB的区域叫做E盘。相信到了这里,大部分的同学应该都熟悉起来了,这不就是我的电脑里我看见的C,D,E盘吗?
在这里插入图片描述比如我的电脑把总共的磁盘分了119GB给C盘,剩下的给了D盘,并不是我的电脑有两个磁盘。

挂载

好了,现在我们划好盘了,但问题是,操作系统不知道咋用,也不知道该从哪里开始用,所以如果我们划的盘想要被操作系统看见,就有了挂载的概念:

在计算机领域中,“挂载”是指将一个文件系统附加到文件系统目录树的特定位置的过程。挂载允许文件系统中的文件和目录可通过操作系统的文件系统层次结构进行访问。

具体来说,挂载通常包括以下步骤:

选择文件系统: 首先,确定要挂载的文件系统类型。常见的文件系统包括 ext4、NTFS、FAT32、XFS等。

选择挂载点: 选择一个现有的目录作为挂载点。这个目录将成为新文件系统的根目录,文件系统中的内容将在该目录下可见。
我们可以在Linux下用 mount /dev/sdb1 (分区)/mnt/mydrive (目录名)
我们在Linux下可以用df -h查看我们的文件系统被挂载在哪个区上:
在这里插入图片描述这个其实和我们的U盘息息相关:
在这里插入图片描述

windows下,可以查看已挂载的卷和驱动器号:
先执行diskpart
在这里插入图片描述
再执行:list volume
在这里插入图片描述

C盘放了什么东西

好了,我们现在划好盘了,现在我们把视角转到那100GB的C盘中,现在操作系统该如何管理这100GB的磁盘区域呢?很简单,我又开始划分区域(划成一组一组的):
在这里插入图片描述我们可以看一个更清晰的图:
在这里插入图片描述

Boot Block(启动模块)

诶,这就是我们划分的组了,我们来看看**Boot Block(启动模块)**有什么作用:

“Boot block”(引导块)通常指的是存储设备上的一个特殊区域,包含用于引导计算机操作系统的关键信息。这个区域在启动时会被加载到计算机的内存中,以启动操作系统的引导过程。
具体来说,引导块通常包括以下内容:
引导加载程序(Boot Loader): 引导块中的引导加载程序是一个小型的程序,位于存储设备的引导块区域。这个程序负责加载操作系统的内核到计算机的内存中,并启动操作系统的执行。常见的引导加载程序包括 GRUB(GRand Unified Bootloader)和 LILO(LInux LOader)等。
分区表信息: 引导块通常包含分区表信息,描述了存储设备上的分区结构,其中包括分区的起始位置、大小等信息。这些信息对引导加载程序来说很重要,因为它需要知道从哪个分区加载操作系统。
引导标志和签名: 引导块中可能包含引导标志和数字签名等信息,以确保引导加载程序的完整性和可信度。
其他引导参数: 引导块可能还包含一些其他的引导参数,这些参数可能被操作系统内核用于初始化系统环境。
引导块的位置和结构可能因不同的存储设备而异。在传统的硬盘驱动器(HDD)中,引导块通常位于存储设备的第一个扇区,这也被称为主引导记录(Master Boot Record,MBR)。在使用UEFI(Unified Extensible Firmware Interface)的系统中,引导块通常位于特定的EFI系统分区。

这是它的功能,最重要的一点是这个Boot Block会激活你的操作系统,如果这个区域坏了,那么电脑可能就报废了。

0号组放了什么东西

0号组也放了很多东西我们也一起来看看:
在这里插入图片描述
我们这里先来看看Super Block(超级块)和 Data Block

Super Block(超级块)

superblock(超级块)是文件系统中一个重要的元数据结构,它包含了关于整个文件系统的关键信息。superblock 存储了文件系统的参数、状态和结构,使操作系统能够有效地管理文件系统上的文件和目录。
以下是关于 superblock 的一些基本概念:
文件系统参数: superblock 包含了文件系统的基本参数,例如文件系统的类型、块大小、inode(索引节点)的大小等。这些参数对文件系统的整体结构和功能有着重要的影响。
文件系统状态: superblock 记录了文件系统的状态,如是否已经被挂载(mounted)、是否存在错误等。这有助于操作系统在文件系统挂载时进行正确的初始化和检查。
inode 信息: superblock 包含有关 inode 的信息,包括总共有多少个 inode、已经使用了多少个 inode,以及哪些 inode 已经被分配给了文件或目录。
数据块信息: superblock 存储了文件系统上数据块的总数、已经使用了多少个数据块,以及哪些数据块已经被分配给了文件。
文件系统的布局: superblock 描述了文件系统的整体布局,包括存储空间的分布、块组(block group)的数量等。块组是文件系统的逻辑划分单元,每个块组包含一组 inode 和数据块。
文件系统的挂载点: superblock 中包含了文件系统被挂载的位置信息,即文件系统在操作系统的目录树中的位置。
创建和修改时间: superblock 记录了文件系统的创建时间和最后一次修改时间,这些信息有助于追踪文件系统的历史和维护。
文件系统检查和修复: superblock 中可能包含用于文件系统检查和修复的标志和信息。这对于在文件系统异常情况下进行一致性检查和修复非常重要。

Data Block(数据块)

datablocks(数据块)是文件系统中用于存储文件和目录实际数据的基本单位。当文件系统需要存储文件的内容时,它将文件数据划分为块,然后将这些块存储在磁盘上的数据块中。这些数据块通常是文件系统管理的最小的可分配单元。
以下是关于 datablocks 的一些基本概念:
数据块大小: 文件系统通常将文件数据划分为固定大小的数据块。这个大小是文件系统的一个基本参数,通常在文件系统的超级块(superblock)中指定。典型的数据块大小可能是 4KB、8KB 或 16KB,具体取决于文件系统的设计。
块地址: 文件系统使用块地址来引用数据块。这些块地址存储在文件的 inode 中。对于小文件,块地址可能直接存储在 inode 中;对于大文件,块地址可能存储在一级、二级或三级块指针中,以支持更大的文件大小。
文件系统布局: 数据块的分配和管理通常是按照块组(block group)的形式进行的。块组是文件系统的逻辑单元,每个块组包含一组 inode、数据块和其他元数据。块组的使用有助于提高文件系统的性能和管理。
数据块分配: 当文件系统需要存储新的文件数据时,它会在数据块中找到未被使用的块,将文件数据写入这些块。文件系统会更新相关的数据结构,如 inode 和 datablocks bitmap,以跟踪数据块的使用情况。
文件系统性能: 数据块的大小和分配策略对文件系统的性能产生影响。较小的数据块可能导致更多的碎片,但可能更适用于小文件;较大的数据块可能减少碎片,但可能会浪费存储空间,特别是对于小文件而言。
总的来说,数据块是文件系统中用于存储文件实际内容的基本单位,文件系统的设计和性能特征与数据块的大小、分配方式以及块组的组织方式密切相关。

这是我们的超级块和数据块,现在我们来看一个很重要的概念:索引结点

inode(索引结点)

索引结点是啥呢?如果我们用的Linux操作系统,我们可以看到这个结点:
在这里插入图片描述前面这串数字就是索引结点,那么索引结点到底是啥呢?
其实我们平时找文件都用的是文件名去找,但是对于操作系统来说,人类的语言过于麻烦,所以就把除文件名之外的属性打包在一起,写成一个专门的结构,这,就叫索引结点
在这里插入图片描述
一个索引结点对应一个文件名,所以表面上我们使用文件名寻找文件,但实际上操作系统通过索引结点来寻找文件。

inode bit map和block bit map

我们知道,索引结点再小,不可能有无限个,都是要占用空间和文件块的,而inode bit map和block bit map就是来标记哪些索引结点和板块被用了,用位图1表示用了,0表示没用

软硬连接

好了,我们现在来谈软硬连接的问题,我们首先给出定义:

硬链接
文件系统中的链接关系: 硬链接是指多个文件共享相同的 inode 号,它们指向文件系统中相同的数据块。因此,硬链接的文件实际上是文件系统中相同的实体,无论哪一个发生变化,其他都会受到影响。
** inode 号码**: 硬链接会在文件系统中创建一个额外的目录项,这个目录项具有相同的 inode 号。多个文件名指向相同的 inode,因此它们共享相同的数据和元数据。
删除行为: 当删除一个硬链接时,实际的数据块只有在最后一个链接被删除后才会被释放,因为每个链接都只是 inode 号的一个引用。
跨文件系统限制: 硬链接不能跨越不同的文件系统。
软链接
文件系统中的链接关系: 软链接是一个独立的文件,它包含了指向目标文件的路径或者文件名。软链接并不直接引用目标文件的 inode 号,而是通过路径进行引用。
** inode 号码**: 软链接和目标文件有不同的 inode 号,它们在文件系统中是两个独立的实体。
删除行为: 如果删除了软链接所指向的目标文件,软链接仍然存在,但它成为一个“死链接”或者“孤立链接”。相反,如果删除软链接本身,不会影响目标文件。
跨文件系统: 软链接可以跨越不同的文件系统。

我们可以来演示一下:

硬链接

首先我们可以来演示硬链接,我们首先编一段代码:
在这里插入图片描述
形成mybin文件:

现在我们可以给这个文件创建硬链接(Linux下用ln指令):
在这里插入图片描述在这里插入图片描述
我们看一下这个硬链接和mybin的索引结点号:
在这里插入图片描述
我们发现是一样的,说白了,硬链接就是另外一个文件和源文件共享索引结点
在这里插入图片描述而且运行结果也是一样的。

软连接

我们可以用ln -s创建软连接:
在这里插入图片描述我们看看这个软连接的索引结点号:
在这里插入图片描述
我们发现和源文件的索引结点号不一样,其实软连接就是新创建了一个文件,存放指向源文件的路径,不共用索引结点

执行它,也可以得到我们的目标结果:
在这里插入图片描述这个软连接,其实和Windows下的快捷方式是一样的。

在这里插入图片描述在这里插入图片描述
网络上经常有段子,说当妈妈的为了不让儿子玩游戏,把桌面上的游戏卸载了。其实这样只是删除了软连接(快捷方式),程序本身并没有什么影响。

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

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

相关文章

Python爬取猫眼电影专业评分数据中的应用案例

在数据分析和可视化展示中,获取准确的电影专业评分数据至关重要。猫眼电影作为中国领先的电影信息与票务平台,其专业评分对于电影行业和影迷的数据来说具有重要意义。通过Python爬虫技术,我们可以实现从猫眼电影网站上自动获取这些数据目标。…

面试经典 150 题 ---- 删除排序数组中的重复项 II

面试经典 150 题 ---- 删除排序数组中的重复项 II [删除排序数组中的重复项 II](https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150)方法一:双指针 删除排序数组中的重复项 II …

每日OJ题_算法_前缀和③_力扣724. 寻找数组的中心下标(LCR012+力扣1991)

目录 力扣724. 寻找数组的中心下标 解析代码 力扣724. 寻找数组的中心下标 724. 寻找数组的中心下标 LCR 012. 寻找数组的中心下标 1991. 找到数组的中间位置(三道一样的题,一鱼三吃) 难度 简单 给你一个整数数组 nums ,请…

shell脚本基础之循环语句

目录 一、循环语句的概念 二、for循环语句 1、列表循环 2、列表for循环案例大全 案例一 案例二 案例三 案例四 案例五 案例六 案例七 案例八 3、不带列表循环 4、类似C语言风格的for循环 5、for循环总结 三、while循环语句 1、while循环语句格式 2、while死循…

GMS测试BTSfail-CVE-2022-20451

描述: 项目需要过GMS兼容性测试,BTS这块我们环境没有,送检之后出现了一个BTS的Alert,这个是必须要解决的。下面的warning可以不考虑。 这个是patch问题,根据代理提供的pdf文件找到一个id:为A-235098883的补丁&#xf…

利用ChatGPT实现副业赚钱的10个方法

现今ChatGPT的热潮越来越高,很多程序员也把目光转向了如何靠ChatGPT赚钱,而那些掌握先机的程序员已经通过这一副业赚到了人生中的第一桶金。 如果你也对ChatGPT感兴趣,但还没有找到程序员靠ChatGPT实现营收,增加副业收入的方法&a…

洛谷B3625迷宫寻路

迷宫寻路 题目描述 机器猫被困在一个矩形迷宫里。 迷宫可以视为一个 n m n\times m nm 矩阵,每个位置要么是空地,要么是墙。机器猫只能从一个空地走到其上、下、左、右的空地。 机器猫初始时位于 ( 1 , 1 ) (1, 1) (1,1) 的位置,问能否…

web渗透测试-Server2225-(环境+解析)

1、访问目标IP,打开第1题,根据页面提示,将获取的flag提交。提交格式:flag{xxx}(提交花括号里面的字段) 给出了如上代码,很明显,flag在flag.php文件内。 REQUEST方法既可以接受GET方法,也可以接受POST方法,方便起见,我们选择GET方法。 eval函数 eval() 函数把字符串…

电商平台低价乱价?电商平台API接口接入,实时获取商品价格

​和传统线下渠道对比线上电商运营手段多样和方便,电商会经常采用价格策略以吸引消费者,这种灵活而频繁的价格变动对供货商的渠道管理提出了前所未有的挑战,实时监测电商的价格变动对于品牌商和电商平台是非常重要的环节。而促销活动设计和日…

Did We Get Everything Covered? Codeforces Round 921 (Div. 2) 1925C

Problem - C - Codeforces 题目大意&#xff1a;给出一个长度为m的字符串s&#xff0c;问所有长度为n且由字母表中前k个字母组成的字符串是否都是s的子序列&#xff0c;如果不是须给出反例 1<n<26;1<k<26;1<m<1000;所有样例的m之和不超过1e6 思路&#xf…

MySQL事务和锁05

官网地址&#xff1a;MySQL :: MySQL 5.7 Reference Manual :: 13.3.6 SET TRANSACTION Statement 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Mysql5.7参考手册 / ... / 集事务语句 13.3.6设定交易报表 …

当包容结构体遇见灵活的内存管理

&#x1f308;个人主页&#xff1a;小田爱学编程 &#x1f525; 系列专栏&#xff1a;c语言从基础到进阶 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于c语言的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x…

Python算法题集_和为K的子数组

本文为Python算法题集之一的代码示例 题目560&#xff1a;和为K的子数组 说明&#xff1a;给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nu…

Revit2018复现《AUTODESK REVIT二次开发基础教程》代码17

using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LearnTime { //必备写法 [Transaction(Tr…

JavaScript DOM属性和方法之event事件对象

event对象代表事件的状态&#xff0c;比如事件在其中发生的元素&#xff0c;键盘按键的状态、鼠标的位置、鼠标按钮的状态&#xff0c;事件通常与函数结合使用&#xff0c;函数不会在事件发生前被执行&#xff0c;只有当事件被触发的时候才会执行函数。 一、句柄事件 HTML5的…

【代码能力提升 | 代码阅读学习】分析 VoxelNet 的 主干

文章目录 前言代码分析VoxelNet model2.数据处理2.1单个样本处理2.2处理成batch 最后&#xff0c;附上我一步步调试代码&#xff0c;到3D-conv 前言 代码来自&#xff1a;https://github.com/skyhehe123/VoxelNet-pytorch 其中 测试数据来自&#xff1a;https://github.com/ga…

Go语言标准库log日志

Go语言内置的log包实现了简单的日志服务。 使用Logger log包定义了Logger类型&#xff0c;该类型提供了一些格式化输出的方法。本包也提供了一个预定义的“标准”logger&#xff0c;可以通过调用函数Print系列(Print|Printf|Println&#xff09;、Fatal系列&#xff08;Fatal…

Mysql查询优化从入门到入土详解含示例(值得珍藏)

点击下载《Mysql查询优化从入门到入土详解含示例&#xff08;值得珍藏&#xff09;》 1. 前言 随着互联网的快速发展&#xff0c;数据库已经成为应用程序的重要组成部分。MySQL作为最流行的关系型数据库管理系统之一&#xff0c;广泛应用于各种场景。然而&#xff0c;随着数据…

春节寄快递贵?想要便宜寄快递?那是你没找到寄快递便宜的渠道!

春节将至&#xff0c;公司会发放一大批的年货礼品给员工们&#xff0c;来聊表这一年来的勤恳工作的心意。但是想要拿走这么多的年货&#xff0c;可不是一件容易的事情啊&#xff0c;这时候我们可以通过邮寄的方式把东西邮寄走&#xff0c;是不是省了很多事呢&#xff0c;不仅回…

如何过有「松弛感」的生活?

最近网上有一个词很流行&#xff0c;叫做「松弛感」。最早的出处似乎是这么一条微博&#xff1a;博主见到一家人出门旅游&#xff0c;行李全部被退回&#xff0c;空手抵达目的地&#xff0c;竟然没人紧张和生气&#xff0c;而是重新安排好行李后继续开心聊天&#xff0c;全程非…