本章我们将学习学习认识一下磁盘的的物理结构,理解磁盘分区分块,如何对区块进行管理。学习认识inode和软硬连接。目标已经确定,接下来就要搬好小板凳,准备开讲了…
前面我们学到的所有的东西,全部都是在内存中。但是并不是所有的文件都被打开了。
大量的文件,就在磁盘上,静静的躺着,这批文件非常多,杂,乱。
视角,从内存中移开,视角,迁移到磁盘上。
磁盘基本的文件管理,本质工作:就和快递站的老板做的工作是一样的!
磁盘是我们电脑上的唯一的一个机械设备目前,我们笔记本上,可能已经不用磁盘了而是SSD(固态硬盘)。磁盘更加的便宜,公司的服务器大部分都是磁盘式的服务器,SSD的耐用性不如磁盘。
磁盘存储数据的原理是基于磁性材料和磁场相互作用的物理过程。在硬盘和磁带等磁介质上,数据以磁场的形式进行存储和读取。
磁性,改变N/S
极,就是改变了0/1
。
当我们改变磁盘上某一个位置的N/S
极,就好比更改了此处保存的数据0/1
。
磁盘存储结构由多个组件组成,每个组件都有不同的功能和作用。以下是磁盘存储结构中常见的组件及其解释:
盘片(Platters):盘片是磁盘存储结构的主要部分,通常由金属或玻璃材料制成。它们被堆叠在一起,并通过主轴旋转。数据存储在盘片的表面上,每个盘片的两个面都可以用于数据存储。
磁头(Heads):磁头是用于读取和写入数据的装置,通常由电磁部件组成。磁头位于盘片的表面上方或下方,能够浮动在非常接近盘片表面的位置,并通过微小的电流产生磁场,与盘片上的磁场相互作用。
臂(Arm):臂是磁头的支撑结构,也被称为寻道臂。臂一端连接着磁头,另一端连接到驱动器的位置控制系统。臂可以在盘片的边缘上移动,将磁头定位到指定的磁道上。
磁道(Track):磁道是盘片上的一个圆环形区域,被划分为多个同心圆。每个磁道上可以存储一定容量的数据,磁头通过臂将其定位到指定磁道上进行读写操作。
柱面(Cylinder): 柱面是指位于多个盘片上同一径向位置的磁道的集合。换句话说,柱面由多个盘片上相同编号的磁道组成,这些磁道在垂直方向上对齐形成一个柱状结构。每个盘片都有多个柱面,且每个柱面上的磁道数量相同。使用柱面编号的方式可以简化磁头的寻道操作。
扇区(Sector):扇区是磁道上的最小单位,用于存储数据。通常情况下,每个扇区的大小为512字节或4KB。数据的读取和写入以扇区为单位进行。
主轴(Spindle):主轴是盘片的旋转中心轴,通过电机驱动使盘片高速旋转。主轴的旋转速度通常以每分钟转数(RPM)来衡量,例如7,200 RPM或10,000 RPM。
驱动器控制器(Drive Controller):驱动器控制器是磁盘驱动器上的电路板,负责控制整个磁盘存储系统的操作。它连接到计算机系统,并根据计算机的指令控制磁头的移动、数据读取和写入等操作。
这些组件共同协作,实现了数据在磁盘上的存储和访问过程。通过磁头的移动和盘片的旋转,可以精确地读取和写入数据,从而实现高效的数据存储和检索。
读写磁盘的时候,磁头找的是某一个面的某一个磁道的某一个扇区:
操作系统的文件系统所作的工作,便是将文件和其对应的扇区联系起来。用上面提到的办法,便可以查找到每一个扇区!
这种查找数据位置的操作,被称为CHS
寻址,CHS
分别对应磁柱、磁面、扇区。
CHS的寻址方式:
相信我们都见过磁带,卷起来是一盘,拉直了是一个长条。而我们的磁盘也可以看作将每个磁道拉直了,连起来就是个长条,我们可以看作是一个大数组。
这种抽象之后的磁盘,被称为LBA逻辑块地址
方式。
通过整除 + 取模等操作,就可以将LBA逻辑块地址
转换成CHS地址
来确定具体位置。
具体计算过程参考:学习传送门
修改了数组中的数据之后,操作系统将LBA对应的CHS地址算出来交给磁盘,让磁盘来修改指定扇区的数据,便实现了保存数据到磁盘中的操作。
对于操作系统而言,一次IO的基本单位通常是块(block),通常情况下,一个块的大小等于一个扇区的大小。扇区是磁盘存储的最小单位,一般为512字节或者4KB。
磁盘访问的基本单位是扇区,不代表磁盘将来就必须以扇区为单位访问。我们可以以多个扇区为单位去访问。
为什么通常是4KB呢?
IO基本单位一般选择4KB的原因有几个方面的考虑:
- 存储介质特性:传统硬盘(磁盘)的扇区大小通常是512字节,而一个4KB的块恰好包含了8个扇区。以4KB作为IO基本单位可以更好地匹配硬盘的物理组织结构,减少读取和写入时的寻道开销,提高存储设备的读写效率。
- 缓存效果:较大的块大小有助于提高IO操作的缓存效果。当系统进行IO操作时,会将整个块加载到内存缓存中。较大的块大小可以最大程度地利用内存的缓存能力,减少频繁的磁盘访问,从而提高整体的读写性能。
- 文件系统的块大小:许多文件系统以4KB作为默认的块大小,选择与文件系统块大小一致的IO单位可以更好地与文件系统进行协作。这样可以避免额外的转换和管理开销,提高数据读写的效率。
其中我个人认为最重要的一点就是:
需要注意的是,IO基本单位的选择也会受到具体应用场景、硬件限制以及性能需求的影响。对于某些特定应用,可能会使用其他大小的块来满足特定的需求。因此,选择IO基本单位的最佳大小需要综合考虑各种因素,并进行实际测试和评估。
上述我们讲到,将磁盘看作是一个大的数组,将大数组分块,只要将每一块管理好,那么整个磁盘也就管理到位了。
假设分区有100GB,我们分了20个小组,接下来再分组,分了五个组,所以最后要想把磁盘管好,就要把块组管好,也就是最后把1GB管好。
Boot Block与开机有关:
一般计算机在刚开始启动的时候,首先加电自检,然后找主板上的一个设备
Base 10 System
,它是硬件,里面大概有五百多字节的存储空间,里面就存储了磁盘设备,当它启动之后定要去找计算机里面,操作系统在什么地方,所以它启动之后一定要读取一个分区里面的Boot Block
,这个当中就表明了一个机器的开机信息,包括分区表,同时还告诉我们操作系统中软件在什么地方。
所以硬件层面上,系统启动时,读取这一小块数据就可以直接找到操作系统,然后加载操作系统,俗称:开机。
Linux采用的是文件内容、文件属性分开存放的存储方式:
Linux中文件的属性信息(如权限、所有者、大小等)是通过inode来存储和管理的:
文件名是用户给文件分配的可识别和易记的名称,而inode是文件系统内部用来唯一标识和管理文件的数据结构。
Linux下一切皆文件,那么目录是文件吗?
为什么要读取目录下文件名时,查看文件名时必须要有读权限:
- 读取文件名就是在读取目录的内容。
- 读取目录的内容就必须要有读权限。
- 这和读一个普通文件没区别。
当想在目录下创建一个文件时,创建文件时必须要有写权限:
- 最后要将文件名和inode映射关系写到目录的data block当中。
- 如果没有写权限,怎么写入呢?
Linux同一个目录下,可以创建多个同名文件吗??不会!
补充:
- 目录实际上是一种特殊的文件,它包含了一个或多个数据块,用于存储文件名和对应的inode号码的映射。
- 每个目录数据块中都保存着一系列的目录项(directory entry),每个目录项由文件名和对应的inode号码组成。系统通过遍历这些目录项,就能够根据文件名找到相应的inode,进而操作文件。
- 当文件系统需要创建、删除、重命名或移动文件时,它会更新目录数据块中的目录项,以反映文件名与inode之间的变化。
- 因此,目录的数据块承载了文件名和inode之间的映射关系,它起到了连接文件名和inode的桥梁作用。通过查找目录数据块,系统可以快速定位并操作特定的文件。
通过ls -l -i
来查看文件的inode:
当我们创建一个文件,操作系统做了什么?
请问删除一个文件,OS做了什么??
ls的工作过程:
ls
找到目录对应的inode编号,根据inode编号找到inode。ls -l工作过程:
ls -l
是找到目录对应的数据块,找到了对应的内容。在我们Linux刚开始学习的时候,我们有一个连接数
是没有讲的:
文件硬连接数:
文件硬连接个数指的是特定文件的硬链接数量。在Linux系统中,多个文件名可以指向相同的数据块,这些文件名被称为文件的硬链接。 硬链接是文件系统中的链接,它们具有相同的inode号,并且它们引用相同的文件内容。
每当创建一个硬链接时,文件的硬链接计数增加1。相反,当删除一个硬链接时,硬链接计数减少1。只有在硬链接计数为0时,文件才被真正删除,释放相关的存储空间。
因此,文件的硬链接个数表示有多少个文件名指向同一份数据。当硬链接计数为1时,说明该文件没有其他硬链接,即它是唯一指向该数据的文件。
当我们创建目录或文件时,我们看到的是:目录默认的硬链接数是2,而文件默认的硬链接数是1。
总之,目录的默认硬链接数是2,是为了维护文件系统的结构和完整性;而文件的默认硬链接数是1,因为文件通常被认为是唯一的。
ln -s 源 目标 #创建软连接
软连接就相当于Linux下的快捷方式(ln: link的简称):
现在是连接可执行程序,未来可能是连接头文件,连接库文件(动静态库)不用我们很冗余的去找这些库。
ln 源 目标 #创建硬链接
建立一个硬连接:
我们发现软连接的inode和原来的inode不同,而硬连接的inode则是与原来相同。
硬连接数:一旦建立好映射关系,就从1变成了2。
软连接的连接数没有变化的原因是:这是个独立文件,因为它有独立inode。
引用计数没有变化,就证明了,软连接不是单纯的拿文件名和文件inode建立映射关系,要不然和硬
连接没区别了。
软连接:
硬连接: