linux - ext4被认为是文件存储还是 block 存储?

标签 linux filesystems ext4 file-storage block-storage

我一直在研究文件、 block 和对象存储之间的区别。我试图将 native Linux 文件系统与其中一种存储数据类型联系起来,但是,我脑海中浮现的一些疑问让我证明我在这里有某种误解:

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

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

这是否意味着 Linux 内核需要 Block Storage 才能启动,但随后它会将自身挂载为文件存储?

最佳答案

ext4 和任何文件系统,按照定义是“文件存储”。这就是文件系统。


术语“文件存储”、“ block 存储”和“对象存储”是指存储导出给其消费者的 API,与传输方式(网络、本地等)无关。

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

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

这个 API 非常简单,可以被固件中的最低级引导代码使用。如果固件可以使用文件 API 或对象 API,您可以从那里启动...这是一回事。
Netboot通过 PXE使用文件传输协议(protocol)来下载引导加载程序(与 block 存储协议(protocol)相反),因此如果文件存储或对象存储支持该协议(protocol),您可以说它们能够启动操作系统。


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

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

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

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

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

NFS 是在本地 block 存储之上实现的本地文件存储之上实现的网络文件存储。也就是说,它将“写这个文件”请求翻译成不同的“写这个文件”RPC,而服务器把这个RPC翻译成另一个不同的“写这个文件”请求到它的本地文件系统。

甚至还有loop devices ,在文件存储之上实现 block 存储。

许多对象存储实际上是建立在文件存储之上的,而文件存储是建立在 block 存储之上的。 Minio,例如,将获取一个常规文件系统,对其进行格式化(即创建它需要的目录结构),然后将诸如“写入此对象”之类的请求翻译为“写入文件系统中的此文件”。

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

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

关于linux - ext4被认为是文件存储还是 block 存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71307757/

相关文章:

linux - 将 PDF 的内容打印到命令行

linux - 检查 lfs 6.5 的 pkg-config 时出错

linux - 使用命令行删除逗号之间的空格

java - 如何使用 Java 7 的新文件 API 检查路径是否指向现有文件?

ubuntu - 如何改进 vagrant 中的慢速共享文件夹

C++将取消引用的对象推送到 vector

unix - ext4 可以检测损坏的文件内容吗?

linux - 使用 docker 在本地开发中用于包管理器的容器?

mysql - 存储 HTML 文件

linux - EXT4 是否已过时用于生产?