是否存在应用程序需要使用 EXT4 和 XFS 等文件系统以及 Red-Hat 8 等最新 Linux 操作系统进行自己的文件损坏检查的情况

是否存在应用程序需要使用 EXT4 和 XFS 等文件系统以及 Red-Hat 8 等最新 Linux 操作系统进行自己的文件损坏检查的情况

我猜想的是

  • EXT4 和 XFS 等文件系统。将块连同校验和写入磁盘(可以是硬盘或 SSD)。
  • 读回时,如果校验失败,操作不会返回数据并指示错误或 EOF(或无数据)。
  • 重新启动时(即使是在操作系统内存页面未刷新的突然关闭之后),Linux 操作系统会使用校验和检查文件块的完整性,并且如果应用程序尝试读取检测到此类错误的块所在的文件,则 Linux 操作系统会使用校验和检查文件块的完整性。一部分,当读取到达上述块时操作将失败。
  • 如果(由 Linux 操作系统)检测到的损坏块位于文件中间。即使后续块不包含错误,读取操作在到达损坏的块后也会失败,并且应用程序将永远无法读取损坏的块之外的数据。
    例如,假设文件大小为 4KB,块大小为 1KB。所以这个文件将分布在 4 个块 A、B、C 和 D 上。假设 Linux 检测到块 C 已损坏。现在操作将能够提供文件中的前 2KB。但是却没有办法最后 1KB,即使应用程序将文件位置放置在 3KB 之后。

如果上述假设正确[请注意,此处不考虑某些入侵者弄乱文件的情况]

  • 应用程序在写入文件时不需要放置自己的校验和,并在读回时验证它(即使在操作系统突然关闭之后)
  • 应用程序可以假设提供的数据来自是它最初写的,可能发生的最糟糕的事情是无法从文件末尾读取数据

这些假设是否错误(在 OS=Linux RedHat Enterprise Linux 8.X 和文件系统=EXT4,XFS 上下文中)?如果是这样,请告诉我哪些是错误的

答案1

EXT4 和 XFS 等文件系统。将块连同校验和写入磁盘(可以是硬盘或 SSD)。

不,两个文件系统都没有数据校验和。

读回时,如果校验和失败,读操作将不会返回数据,并会指示错误或 EOF(或无数据)。

否。如前所述,没有进行数据校验和,但即使它,不会有EOF(那是错误的!),但EIO会设置一个错误代码。

重新启动时(即使是在操作系统内存页面未刷新的突然关闭之后),Linux 操作系统也会使用校验和检查文件块的完整性。

不。这些是日志文件系统,因此通常不需要整个文件系统校验和检查。另外,如上所述,两个文件系统中都没有数据校验和(至少在 XFS 中,有文件元数据的校验和)

另外,不,即使对于存在的校验和,甚至对于具有数据校验和的文件系统,Linux 作为操作系统也不会进行全卷检查。这将需要很长时间,并且很可能留给用户土地软件。考虑到校验和损坏可能意味着存储设备开始出现故障,这样做弊大于利。如前所述,在现代文件系统上很少进行完整的文件系统检查。相反,对访问的检查很常见。

如果应用程序尝试读取其中包含此类错误检测块的文件,则当读取到达上述块时,读取操作将失败。

不,因为不存在数据校验和。但我们假设它们是:

如果(由 Linux 操作系统)检测到的损坏块位于文件中间。即使后续块不包含错误,读取操作在到达损坏的块后也会失败,并且应用程序将永远无法读取损坏的块之外的数据。

不。我不认为 Linux 和 POSIX 对此做出任何保证,并且当您seek到达 1GB 之后的位置时,带有数据校验和的文件系统的合理文件系统驱动程序不会读取 1GB 数据来检查校验和。所以,你的假设是错误的。

例如,假设文件大小为 4KB,块大小为 1KB。所以这个文件将分布在 4 个块 A、B、C 和 D 上。

没有详细介绍 XFS 如何工作,通常也没有详细介绍 ext4 如何工作。您可能想了解什么是基于范围的分配。

假设 Linux 检测到块 C 已损坏。

同样,即使任一文件系统数据校验和,这只会在读取 C 时发生。不早了。

现在读取操作将能够提供文件中的前 2KB。

为什么你不能fseek超越这个范围?

但是,即使应用程序将文件位置放置在 3KB 之后,也无法读取最后 1KB。

如上所述,这是错误的。

然而,

应用程序在写入文件时不需要放置自己的校验和,并在读回时验证它(即使在操作系统突然关闭之后)

是的,将数据完整性交给应用程序而不是块设备抽象的手中将是一个坏的设计错误。

文件系统的全部要点是应用程序不需要知道它们存储数据的物理介质。保持该抽象不泄露底层硬件的丑陋细节意味着应用程序无法了解错误概率、可能发生的错误类型以及它们在物理介质上的位置。

然而,所有这些对于对冗余信息做出明智的选择都是必要的。

简而言之:当使用文件系统在块设备上存储数据时,保证数据完整性的是块设备层,而不是应用层

应用程序可以假设读取提供的数据是它最初写入的数据,可能发生的最糟糕的事情是无法从文件末尾读取数据

应用领域必须假设从文件读取的数据是正确的,否则它也无法假设应用程序是正确的,或者他们所做的任何其他事情都是正确的。同样,这是文件系统为应用程序提供的保证。您正在使用文件系统,因此您可以假设。

这些假设是否错误(在 OS=Linux RedHat Enterprise Linux 8.X 和文件系统=EXT4,XFS 上下文中)?如果是这样,请告诉我其中哪些是错误的。

如上所述,基本上你所有的假设都是错误的:(

相关内容