一文详细介绍文件系统与磁盘的基本原理

发布于:2022-11-09 ⋅ 阅读:(16) ⋅ 点赞:(0) ⋅ 评论:(0)

1.文件系统

文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。

文件系统由三部分组成

文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。文件系统是软件系统的一部分,它的存在使得应用可以方便的使用抽象命名的数据对象和大小可变的空间。

文件系统的功能

管理和调度文件的存储空间,提供文件的逻辑结构、物理结构和存储方法;实现文件从标识到实际地址的映射,实现文件的控制操作和存取操作,实现文件信息的共享并提供可靠的文件保密和保护措施,提供文件的安全措施。

常见的文件系统类型

FAT

在Win 9X下,FAT16支持的分区最大为2GB。我们知道计算机将信息保存在硬盘上称为“簇”的区域内。使用的簇越小,保存信息的效率就越高。在FAT16的情况下,分区越大簇就相应的要大,存储效率就越低,势必造成存储空间的浪费。并且随着计算机硬件和应用的不断提高,FAT16文件系统已不能很好地适应系统的要求。在这种情况下,推出了增强的文件系统FAT32。

NTFS

NTFS文件系统是一个基于安全性的文件系统,是Windows NT所采用的独特的文件系统结构,它是建立在保护文件和目录数据基础上,同时照顾节省存储资源、减少磁盘占用量的一种先进的文件系统。使用非常广泛的Windows NT 4.0采用的就是NTFS 4.0文件系统,相信它所带来的强大的系统安全性一定给广大用户留下了深刻的印象。Win 2000采用了更新版本的NTFS文件系统NTFS 5.0,它的推出使得用户不但可以像Win 9X那样方便快捷地操作和管理计算机,同时也可享受到NTFS所带来的系统安全性。

exFAT

全称Extended File Allocation Table File System,扩展FAT,即扩展文件分配表,是Microsoft在Windows Embeded 5.0以上(包括Windows CE 5.0、6.0、Windows Mobile5、6、6.1)中引入的一种适合于闪存的文件系统,为了解决FAT32等不支持4G及其更大的文件而推出。

RAW

RAW文件系统是一种磁盘未经处理或者未经格式化产生的文件系统,一般来说有这几种可能造成正常文件系统变成RAW文件系统:没有格式化、格式化中途取消操作、硬盘出现坏道、硬盘出现不可预知的错误、毒所致。解决RAW文件系统的最快的方法是立即格式化,并且使用杀毒软件全盘杀毒

Ext

xt2:Ext是GNU/Linux 系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。

Ext3:是一种日志式文件系统,是对ext2系统的扩展,它兼容ext2。日志式文件系统的优越性在于:由于文件系统都有快取层参与运作,如不使用时必须将文件系统卸下,以便将快取层的资料写回磁盘中。因此每当系统要关机时,必须将其所有的文件系统全部shutdown后才能进行关机

Ext4:Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4。Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只是增加了一个日志功能而已。Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能。

HFS

分层文件系统(Hierarchical File System,HFS)是一种由苹果电脑开发,并使用在Mac OS上的文件系统。最初被设计用于软盘和硬盘,同时也可以在在只读媒体如CD-ROM上见到。

【文章福利】小编在群文件上传了一些个人觉得比较好得学习书籍、视频资料,有需要的可以进群【977878001】领取!!!额外赠送一份价值699的内核资料包(含视频教程、电子书、实战项目及代码)

内核资料直通车:Linux内核源码技术学习路线+视频教程代码资料icon-default.png?t=M85Bhttps://link.zhihu.com/?target=https%3A//docs.qq.com/doc/DUGZVQk1qWVBHTEl3

学习直通车(腾讯课堂免费报名):Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂icon-default.png?t=M85Bhttps://link.zhihu.com/?target=https%3A//ke.qq.com/course/4032547%3FflowToken%3D1044374

EXT文件系统读取数据的过程

系统先格式化出inode与block的区块。如下图,要访问一个文件时,首先找到这个文件的inode,根据inode中的权限查看当前用户是否有权力读取这个文件;然后根据inode中记录的block的号码,操作系统据此排列磁盘阅读顺序,一口气将四个block内容读出。最后找到block,读出数据。这种文件系统就叫做索引式文件系统。

U盘(闪存)一般使用FAT文件系统,而FAT文件系统并没有inode,每个block中记录着本文件下一个block的位置。所以FAT文件系统无法通过inode一次性将这个文件所有的block号码读取出来,而只能一个个地读取block后才能知道下一个block的位置。如下图:

上图中我们假设文件的数据依序写入1->7->4->15号这四个 block 号码中, 但这个文件系统没有办法一口气就知道四个 block 的号码,他得要一个一个的将 block 读出后,才会知道下一个 block 在何处。如果同一个文件数据写入的 block 分散的太过厉害时,则我们的磁盘读取头将无法在磁盘转一圈就读到所有的数据, 因此磁盘就会多转好几圈能完整的读到到这个文件的内容。

所以如果同一个文件的block分散地太开,那么读取一个文件的时间就会很长,所以就有所谓的“碎片整理“,就是将同一个文件的block们尽量放到一起去。但Linux的EXT4文件系统由于是索引式的,因此不太需要碎片整理。

文件系统通常会将这两部分的数据分别存放在不同的区块,权限和属性放置到 inode 中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 和block 的总量、使用量、剩余量等。

由于每个 inode 和 block 都有编号,而每个档案都会占用一个 inode ,inode 内则有档案数据放置的 block 号码。 因此,我们可以知道的是,如果能够找到档案的inode 的话,那举自然就会知道这个档案所放置数据的block 号码, 当然也就能够读出该档案的实际数据了。这是个比较有效率的作法,因为如此一来我们的磁盘就能够在短时间内读取出全部的数据, 读写的效能比较好。

在整体的规划当中,文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装开机管理程序, 这是个非常重要的设计,因为如此一来我们就能够将不同的开机管理程序安装到个别的文件系统最前端,而不用覆盖整颗硬盘唯一的 MBR, 这样也才能够制作出多重引导的环境!

data block (资料区块)

data block 是用来放置档案内容数据地方,在 Ext2 文件系统中所支持的block 大小有 1K, 2K 及 4K 三种而已。在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode 的记录。 不过要注意的是,由于 block 大小的差异,会寻致该文件系统能够支持的最大磁盘容量于最大单一档案容量并不相同。 因为 block 大小而产生的Ext2 文件系统限制如下:

inode table (inode 表格)

inode 的数量不大小也是在格式化时就已经固定了

 每个 inode 大小均固定为 128 bytes;

 每个档案都仅会占用一个 inode 而已;

 因此文件系统能够建立的档案数量和 inode 的数量有关;

 系统读取档案时需要先找到 inode,并分析 inode 所记录的权限和用户是否符合,若符合才能够开始实际读取block 的内容。

Superblock (超级区块)

Superblock 是记录整个 filesystem 相关信息的地方, 没Superblock ,就没有这个 filesystem 了。一般来说, superblock 的大小为 1024bytes,他记录的信息主要有:

Filesystem Description (文件系统描述说明)

block bitmap (区块对照表)

这就得要透过 block bitmap 的辅助,从 block bitmap 当中可以知道哪些 block 是空的,因此我们的系统就能够很快速的找到可使用的空间来处置档案。

inode bitmap (inode 对照表)

这个其实和block bitmap 是类似的功能,只是 block bitmap 记录的是使用和未使用的 block 号码, 至于inode bitmap 则是记录使用和未使用的 inode 号码!

2.文件系统与目录数的关系

由Ext文件系统的知识点可以知道,在Linux系统下,每个文件(不管是一般文件还是目录文件)都会占用一个inode,且可依据文件内容的大小来分配多个block给文件使用。目录文件的内容是记录文件名,而一般文件才是记录实际数据的地方。举例来说,如果我想要读取/etc/passwd这个文件时,系统是如何读取的呢

如果想要实际查看目录内的文件所占用的inode号码时,可以使用“ls -di”来处理:(参数-d 将目录像文件一样显示,而不是显示其下的文件 -i 显示inode号)

目录数读取

filesystem 大小与磁盘读取性能

当一个文件系统规划的很大时,整个文件系统上的文件就通常无法连续的写在一起,这就出现所谓的文件数据离散的问题。如果有这种情况那么可以把整个文件系统里面的数据复制出来,格式化之后再将数据重新放回去。文件系统如果太大,比如一个文件记录在文件系统的最前面和最后面的Block中,那么读取的时候,磁盘的机械手臂移动幅度过度会造成数据读取性能降低。

前面说到的只是读取,如果新建一个文件或目录文件系统的行为是

数据的不一致状态

如果文件在写入时因不知名原因造成系统中断,写入的数据仅有inodetable及data block 而已,最后一个同步更新中介数据的步骤没有做完,此时就会产生metadata的内容与实际数据存放区产生不一致的情况,这也造就了日志式文件系统的兴起。

日志式文件系统

linux 文件系统的运行

所有数据都要载入内存之后CPU才能对数据进行处理,磁盘的处理速度比内存慢很多,为解决这个效率问题,linux通过一个非同步处理的方式。它的工作原理是:当系统载入一个文件到内存后,如果该文件没有被更改过,则在内存区段的文件数据设置为干净的(clean)但是如果数据被更改过,内存中数据会设置为脏的(dirty),此时所有的动作都还在内存中执行,并没有写入磁盘,系统会时不时将内存中设置为dirty的数据写回磁盘,保证数据的一致性。

文件系统和内存关系:

挂载点的意义

其他linux支持的文件系统与VFS

假设你的/使用的是/dev/hda1,用ext3,而/home使用/dev/hda2,用reiserfs文件系统,那么你取用/home/dmtsai/.bashrc时有特别指定要用的什么文件系统的模块来读取吗?应该是没有吧!这个就是VFS的功能啦!通过这个VFS的功能来管理所有的filesystem,省去我们需要自行设置读取文件系统的定义

想要知道你的Linux支持的文件系统有哪些,可以这样操作

ls -1 /lib/modules/$ (uname - r) /kernel/fs

XFS文件系统简介

xfs文件系统在数据的分布上,主要规划为三个部分:

数据区(data section)

文件系统活动登陆区 (logsection)

实时运行区 (realtime section)

2.磁盘

磁盘结构

根据机械原理,存储器的容量越大其速度就越慢。但是速度越快的存储器,其单位字节的价格就越贵。现代计算机系统可以包含几个不同的可以存储数据的部件,就形成了存储器的层次结构。

磁盘的组成主要有:

圆形的盘片(主要记录数据的部分)

//就像老式唱片机上的那个黑色的盘

机械手臂与在机械手臂上的磁头(可读写盘片上的数据)

//就像老式唱片机上的那个针

主轴马达,可以转动盘片,让机械手臂的磁头在盘片上读写数据

//就像老式唱片机上的那个底座,负责转动那个黑色的盘

磁盘的工作原理

1.系统将文件存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最先是第1磁道的第一磁头下(也就是第1盘面的第一磁道)的所有扇区,然后,是同一柱面的下一磁头,……,一个柱面存储满后就推进到下一个柱面,直到把文件内容全部写入磁盘。

2.系统也以相同的顺序读出数据。读出数据时通过告诉磁盘控制器要读出扇区所在的柱面号、磁头号和扇区号(物理地址的三个组成部分)进行。磁盘控制器则 直接使磁头部件步进到相应的柱面,选通相应的磁头,等待要求的扇区移动到磁头下。

3.扇区到来时,磁盘控制器读出每个扇区的头标,把这些头标中的地址信息与 期待检出的磁头和柱面号做比较(即寻道),然后,寻找要求的扇区号。待磁盘控制器找到该扇区头标时,根据其任务是写扇区还是读扇区,来决定是转换写电路, 还是读出数据和尾部记录。

4.找到扇区后,磁盘控制器必须在继续寻找下一个扇区之前对该扇区的信息进行后处理。如果是读数据,控制器计算此数据的ECC码,然后,把ECC码与已记录的ECC码相比较。如果是写数据,控制器计算出此数据的ECC码,与数据一起存储。在控制器对此扇区中的数据进行必要处理期间,磁 盘继续旋转。

磁盘的文件名

/dev/sd[a-p][1-128]:实体磁盘的文件名

/dev/vd[]a-d[1-128]:虚拟磁盘的文件名

/dev/md[0-128]:软件磁盘的文件名

文件系统:(只有将磁盘分区格式化后,才能成为操作系统能够利用的文件系统格式filesystem

Linux文件系统:权限和属性数据都存放在inode中,实际数据存放在date block中,文件系统的整体信息放在superblock中。