Linux——磁盘和文件系统
- 磁盘
- 机械式磁盘
- 固态硬盘
- 机械式磁盘结构
- 磁盘,磁道,扇区
- 柱面
- 文件系统的初始化
- 划卷(划盘)
- 挂载
- C盘放了什么东西
- Boot Block(启动模块)
- 0号组放了什么东西
- Super Block(超级块)
- Data Block(数据块)
- inode(索引结点)
- inode bit map和block bit map
- 软硬连接
- 硬链接
- 软连接
我们之前一直学习计算机都是在一个人为给定的,虚拟的层面上来了解的,今天我们来了解一下,一台计算机底层的组成,我们先来了解存储数据的硬件——磁盘。
磁盘
我们一切计算机的基础的基础,是要有一个东西可以来储存我们的数据,这样我们才可以在每次运行时按照我们已经储存好的数据和规定来运行,磁盘就是一个重要的储存设备。
磁盘(Disk)是一种用于存储和检索数据的存储设备。它是计算机系统中的主要外部存储介质之一,被用于长期存储数据、操作系统和应用程序。
发展到如今,我们的磁盘也有许多的种类:
机械式磁盘
- 硬盘驱动器(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下的快捷方式是一样的。
网络上经常有段子,说当妈妈的为了不让儿子玩游戏,把桌面上的游戏卸载了。其实这样只是删除了软连接(快捷方式),程序本身并没有什么影响。