总结如果联合研究机构 硬盘上发生此错误时,我会丢失 1 位、1 字节还是一个扇区的大小(512 字节或 4096 字节 AF)?如果可能的话,请解释一下为什么会这样?
背景: 当硬盘读取数据时出现问题时,就会出现问题。当然,磁盘可能会完全失效,导致所有数据丢失(磁盘故障),但这种情况我在这里问是指只有一小部分丢失(URE,不可纠正的读取错误)。
尽管我查找了有关 URE 的信息,但发现的确切信息很少。这可能是因为驱动器内部发生的事情(即隐藏在直接用户交互之外的事情,如 ECC 校正)对我来说很难与我作为用户访问的内容(扇区)联系起来。
让我们想象一下硬盘在读取数据时遇到困难。
在这种情况下,这肯定意味着:
- (a)扇区的某些位无法读取,或者
- (b) 所有位都可以读取,但它们没有通过校验和测试(当然,预计会出现问题,因为 4096 字节的扇区不仅仅是 8*4096 位,而且还有一些用于错误检查/纠正的额外位/字节(即奇偶校验位))(c)????
不,我认为,当我们处于 (a) 和 (b) 组合出现且无法可靠地重建 4096 个扇区字节的情况时,假设它们全都是垃圾就太过分了,实际上,如果我们知道内部硬盘错误校正逻辑,我们可能会说“看起来有些东西没有检查出来,并且至少有 1、2、3、n 位/字节的块数据是“错误的”。如果我们在这个扇区中冗余地保存“hello,hello.....,hello”ASCII 字节字符串,我们实际上可能仍然会有一个相当连续的“hello,hello....”,然后才会出现“...Uellohello...”(即“e”->“U”)。
那么 URE 的粒度是多少?
更新:有一条评论提出了坏扇区的概念(并暗示这反映了 URE 事件的粒度。提出这个观点并不荒谬,也许可以用来回答这个问题。但我刚刚读到另一个相关问题,询问待处理的不可读扇区(此处https://unix.stackexchange.com/questions/1869/how-do-i-make-my-disk-unmap-pending-unreadable-sectors) 这让我想到,在某些情况下,URE 情况下的数据丢失之间确实存在着一条更加模糊的界限。
答案1
硬盘上的纠错码是与每个硬件扇区关联的额外数据块。在写入过程中,驱动器固件会计算此数据并将其与用户数据一起写入。在读取过程中,固件会读取 ECC 和数据并一起检查它们。
对于传统硬盘,硬件扇区为 512 字节。对于高级格式硬盘,硬件扇区为 4K 字节(硬盘在接口处呈现 512 字节或 4K 字节扇区并不重要,即 512e 与 4kn)。
读取后的检查结果基本上有三种可能的结果:
扇区读取无误。这在现代硬盘上实际上并不常见;位密度如此之高,以至于它们依赖于 ECC 工作。
扇区读取时出现可纠正错误。如上所述,这种情况并不罕见;这是预料之中的。驱动器将应用了错误纠正的数据返回给用户。
已读取一个扇区,但有太多“错误位”;无法纠正错误。
在后一种情况下,驱动器通常不会返回任何内容;它只返回指示错误的状态。这是因为不可能知道哪些位是可疑的,更不用说它们的值应该是什么了。因此整个扇区(ECC 位和所有内容)都是不可信的。不可能确定坏扇区的哪一部分是坏的,更不用说它的内容应该是什么了。ECC 是一个“格式塔”,它是根据整个扇区内容计算出来的,如果不匹配,那就是整个扇区不匹配。
SpinRite 的工作原理是,使用“维护读取”功能反复尝试读取坏扇区,即使驱动器显示“无法纠正的错误”,该功能也会返回数据(但没有 ECC 位)。正如 DavidPostill 链接的描述中所述,它可能成功读取无错误(实际上更有可能是“可纠正的”);或者它可能能够推断出扇区内容的合理猜测,本质上是通过平均返回的位。它使用 ECC 精确纠正错误的能力并不比驱动器强;这在数学上是不可能的。
答案2
不存在“无法读取某个位”的情况,除非您遇到了非常严重的硬件错误,例如磁头无法找到正确的磁道,或者伺服磁道损坏,无法找到正确的扇区。显然,无论是哪种情况,您至少都会有一个完整的无法读取的扇区。
否则,你总会得到一些回报,它们只是可能不正确位。这就是纠错码的作用所在;它为每个扇区添加一些额外的 ECC 位,这样任何正确的数据位和 ECC 位组合都会遵循一些代数规则。如果所有位都读取正确,代码将验证,数据可以直接传回。如果少数位读取错误,ECC 代码可用于确定哪些位,并对其进行修复,以便所有数据都能正确传回。如果大量位读取错误,ECC 代码可以检测到存在曾是一个错误,但它不再有足够的信息来弄清楚哪个位不正确;这是无法纠正的读取错误。如果非常如果大量的位被错误读取,那么代码可能会“意外地”正确验证,并且驱动器将返回损坏的数据,但是如果有足够的 ECC 位,发生这种情况的概率就可以变得尽可能小。
所以,回答我认为你要问的问题——如果存在部分读取错误,但有足够的信息来找出错误发生的位置,那么它也可以得到纠正,计算机根本看不到任何错误。这种情况实际上经常发生。当无法确定哪些数据位有效、哪些数据位无效时,就会发生未纠正的错误,而且由于纠错码是按扇区计算的,因此这种情况以扇区粒度发生。
答案3
答案4
经过研究并受到答案的启发https://superuser.com/a/969917/160771从https://superuser.com/users/337631/davidpostill
我想回答一个稍微延伸的替代答案。首先,硬盘及其固件确实是 URE 事件(即无法读取数据的事件)的起源。此外,数据确实以 512 或 4096 字节可用数据和大约 50 或 100 字节额外数据的扇区写入磁盘,这应该允许错误检查和更正。
因此,谈论 URE 时,自然而然地会涉及到硬盘扇区。术语坏扇区肯定是有某种联系的,但与我们拥有 URE 部门时的当前情况并不相同。
存在一些问题的扇区即使读取无误,也不一定完全没有意义。有可能所有 4096 个数据都已损坏,但也有可能只有比可靠更正的位(通过添加到每个扇区的冗余额外 ECC 数据)多 1 位的数据损坏。
在只有比 HDD 能够纠正的更多的极少数字节被损坏的情况下,4096 字节中的一小部分仍然包含有意义的数据。
例如,4096 表示 2 个句子的 ASCII 字符字节。那么,其中 1 个或多个句子可能完全完好无损。此外,每 2 个或 3 个字母也可能被删除。因此,4096 的数据是否在 URE 事件中丢失取决于解释和数据。可以想象,数据本身还有另一层 ECC 外壳,这将允许进一步恢复。
因此,大多数固件对 URE 扇区和坏扇区区别对待是件好事:
通常,只有当扇区被写入时才会自动重新映射扇区。其背后的逻辑可能是,即使扇区无法正常读取,仍可使用数据恢复方法读取。(来自 https://en.wikipedia.org/wiki/Bad_sector)
或者进一步说,可能是该扇区的一部分仍然包含可用数据。