ext4 是文件存储还是块存储?

rol*_*anx 5 linux filesystems file-storage ext4 block-storage

我一直在研究文件、块和对象存储之间的区别。我试图将本机 Linux 文件系统与这些类型的存储数据之一联系起来,但是,我想到的一些疑问证明我在这里有某种误解:

直观上,ext4 看起来像文件存储类型,因为它被定义为“文件系统”。此外,根(“/”)架构组织在文件夹和文件中,与文件存储定义相同。

另一方面,ext4使用inode将文件分成块以获得更好的存储性能。这是块存储功能。此外,根据此 IBM 视频,块存储是唯一能够启动操作系统的存储类型:https://www.youtube.com/watch?v =PmxWTTpXNLI(分钟 7:52)。

这是否意味着 Linux 内核需要块存储来启动,但随后它会将自身安装为文件存储?

roo*_*oot 13

ext4 和任何文件系统根据定义都是“文件存储”。这就是文件系统。


术语“文件存储”、“块存储”和“对象存储”是指存储导出给其使用者的 API,无论传输方式如何(网络、本地等)。

ext4 导出文件 API(创建目录、打开目录中的文件等),因此是文件存储。
如果 ext4 允许您发出基于 inode 的系统调用,它也可以算作对象存储,因为 inode 不知道层次结构 - 目录层次结构层是在 inode 之上实现的。

另一方面,硬盘驱动器仅提供“在此偏移处读取”和“在此偏移处写入”类型的 API,因此是块存储。

该 API 非常简单,可以由固件中的最低级别启动代码使用。如果固件可以使用文件 API 或对象 API,那么您就可以从那里启动......这是一件事。通过PXE
的网络引导使用文件传输协议来下载引导加载程序(而不是块存储协议),因此您可以说文件存储或对象存储如果可以支持该协议,就能够引导操作系统。


问题、评论和答案中的许多混乱来自于这些通常堆叠的存储类型。

在Linux上,mdLVM都使用其他块存储来实现块存储。他们通过接受“写入此块”请求并将其转换为另一个“写入此块”请求到正确的磁盘来实现这一点。
您还可以将 LVM 堆叠在物理磁盘之上的 md 之上。

事实上,块存储 API 是唯一在经济上足够简单以支持硬件的东西,因此实际上所有存储都构建在块存储之上。

ext4 是在块存储(硬盘驱动器或 LVM)之上实现的文件存储。它根据文件的格式(即其骨架数据结构如何写入块存储)来决定文件在块设备上的外观,然后当它收到文件写入请求时,它将其转换为适当的“ write this block”请求到块存储。

WrapFS是使用另一个文件存储而不是使用块存储的文件存储。也就是说,当它收到文件写入请求时,它将其转换为对其所包装的文件系统的另一个文件写入请求。

NFS 是在本地块存储之上实现的本地文件存储之上实现的网络文件存储。也就是说,它将“写入此文件”请求转换为不同的“写入此文件”RPC,并且服务器将此 RPC 转换为对其本地文件系统的另一个不同的“写入此文件”请求。

甚至还有循环设备,它在文件存储之上实现块存储。

许多对象存储实际上构建在文件存储之上,而文件存储又构建在块存储之上。例如,Minio将采用常规文件系统,对其进行格式化(即创建所需的目录结构),然后将“写入此对象”之类的请求转换为“写入文件系统中的此文件”。

同样,Panasas 的 HPC 集群在网络文件存储 (OSDFS) 之上实现对象存储。
Panasas还在其对象存储之上实现了文件存储(将文件写入请求转换为对象写入请求),这意味着它将一些骨架数据(例如根inode)写入对象存储(即,它格式化对象存储)。

我见过一种专有的网络文件存储,它是在专有的本地对象存储之上实现的,而专有的本地对象存储又是在本地块存储之上实现的网络文件存储之上实现的。