文件系统是否将存储设备视为(非常大的)字节数组?


12

我想知道文件系统如何写入和读取存储设备。

我认为这是这样的:

文件系统不会直接访问存储设备,而是(通过存储设备的设备驱动程序)将存储设备作为(很大)字节数组呈现给文件系统。

例如,如果文件系统要访问硬盘,它将仅访问代表硬盘的字节数组。

这样,文件系统可以与任何类型的存储设备(传统硬盘,SSD,USB闪存驱动器等)一起使用,并且仅更改存储设备的设备驱动程序。

此图显示了我刚刚解释的内容:

在此处输入图片说明

我的理解正确吗?

Answers:


15

在Linux(和1980年代的Unixes)上,存储设备(通常是某些硬盘或某些SSD上的磁盘分区)是一个块设备(请参阅),也是一个的[子]序列(即物理 I / O的基本单位)。物理块大小取决于硬件(旧的IDE磁盘的块大小为512字节,新的大型SATA磁盘的块大小为4Kbyte,请阅读Advanced Format wikipage ),以及在创建文件系统时(例如,参见mke2fs (8)mkfs),您可以指定逻辑块大小,该大小是该物理块大小的倍数(通常为2的小数,包括1)。另请阅读有关逻辑块寻址的信息

过去(例如1990年代的Sun3工作站),磁盘是由圆柱体制成的,磁头按扇区组织(请参阅CHS Wikipage),扇区中包含一个块。时至今日,这些仍然存在,但它们是由硬盘控制器(磁盘本身上的电路)提供的人工制品。在某些OS中,块设备驱动程序会重新计划和重新排列IO请求,以最大程度地减少磁盘磁头移动和旋转延迟

这样,文件系统可以与任何类型的存储设备(传统硬盘,SSD,USB闪存驱动器等)一起使用,并且仅更改存储设备的设备驱动程序。

是的,但是问题出在细节上(例如,阅读有关TRIMWrite Amplification(特定于SSD的信息))。而且细节很重要,因此实际的实现比您的图要简单。阅读有关文件系统的更多信息(并考虑包括SMBNFS在内的集群和远程文件系统;也了解Logical Volume Manager)。

阅读操作系统:三个简单的部分(及其持久性部分)。

请注意,FreeBSD中没有使用块设备(实际上为字符和块设备提供了通用的抽象)。我怀疑即使在Windows上,操作系统也知道分区,块大小等(但您应该检查)。


Windows还处理磁盘上的分区,每个分区可能使用不同的文件系统(也许一个使用FAT-32,另一个使用NTFS)。文件系统可以在块级别访问分区,也可以将块组合为“集群”。在任何给定的分区上,群集大小将是固定的。
西蒙B

我有点知道,因为MSDOS主要做到了。
巴西尔·斯塔林凯维奇

实际上,FreeBSD仍然使用您所谓的“块设备”。除了作为大量块之外,没有其他方法可以访问硬盘。它们在FreeBSD上仅称为字符/原始设备。他们仍然以大量模块的形式访问设备。FreeBSD唯一缺少的是设备级别的缓存,这是不需要的,因为文件系统已经提供了缓存。
juhist

3

Basile Starynkevitch所说的一切都是正确的。我会再加一点。实际上,磁盘驱动器是“块”驱动器,但是块设备(和许多其他设备)以两种形式出现:“原始”和“煮熟”。原始设备只能以其原始存储块大小的倍数的块进行寻址。因此,原始磁盘设备一次只能读取一个或多个块,而不能读取一个或两个字节。煮熟的设备增加了一层,可以进行更小的操作,以及其他各种功能。

文件系统与原始设备一起使用,因此,如BS所解释的那样,它们不将它们看作字节的大数组,而是块的大数组。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.