如何避免 dd 或 badblocks 擦除硬盘驱动器的备用扇区?

X.L*_*INK 2 linux hard-drive dd

/!\ 在那里寻找更新 2,问题现在已经回答了一半 /!\

我有时会完全擦除我的硬盘驱动器(不是 SSD);成为他们的样子,ddbadblocks -w盲目地擦拭一切。

问题是,他们也在写入硬盘驱动器的备用扇区,这很糟糕,因为它们都是全新的。因此,如果在擦除过程中确实发生了某些事情(断电、写入错误等),那将杀死一个非常有用的扇区......一无所获。

所以问题是:如何避免ddbadblocks擦除硬盘驱动器的备用扇区?


假设:

  • dd 众所周知,它会盲目地擦除经过它的所有东西。
  • badblocks 已知能够访问未映射的块。

更新 1

dd如果他们没有更换有故障的扇区(显然),肯定无法访问备用扇区。这是由于dd设计方式(Kamil Maciorowski 评论):

可用的逻辑扇区号dd被映射到编号的物理扇区,并且相应的数字最初是相等的。备用物理扇区最初没有分配逻辑编号,因此 dd 无法访问它们。

更新2

主要是系统管理员 - 而不是“接近低级”编码器 (C) -,有人可以看看badblocks' 代码并判断它是否确实访问了备用扇区吗?更准确地说,是否badblocks还考虑了其​​块读/写内的备用扇区?

http://git.kernel.org/cgit/fs/ext2/e2fsprogs.git/tree/misc/badblocks.c

在另一边/方式得到答案;我还知道badblocks维护者Theodore Ts'o 在此处拥有一个超级用户帐户。如果他阅读此更新 2,是否有可能直接回答?

agc*_*agc 8

dd不能badblocks也不能访问磁盘硬件备用扇区。主要的原因ddbadblocks 不能访问这些备用扇区是那些utils的的作者不知道怎么了,现代硬盘的硬件和专有性SMART软件可以找到比登天还难了。


这个 Q 似乎是基于操作系统级文件系统和磁盘供应商的硬件级SMART重新映射例程之间的混淆。历史观点可能会澄清事情......

早期的 PC 硬件供应商在发货前对磁盘进行了测试,并在磁盘标签或随附的打印输出中包含了坏块列表。安装驱动器的管理员可能会在格式化驱动器时使用该坏块列表。 早期格式化程序会提示用户输入坏块列表,用户将手动输入这些列表。如果驱动器已经存在一段时间,管理员可能会重新检查驱动器块。无论如何,这些坏块列表的目的是告诉文件系统不要使用这些块。该badblocksUTIL似乎被设计成那样的心中早硬盘。

较新的硬盘包括重新映射例程以及诸如 SMART 之类的诊断例程,这两者相当于硬盘中的专用计算机,可以自动检查坏块甚至重新映射坏块。很棒的功能,但供应商重新映射的糟糕之处在于它的所有实现都是专有的和闭源的——所以用户不确定它真正在做什么,或者在那里没有做。磁盘的重新映射/诊断固件可能有问题,磁盘上可能存在被间谍或黑帽黑客等占领的秘密位置。由于它是磁盘级别的重新映射(不是操作系统级别),因此可能会导致更多的磁头抖动和磨损,效率低下, (如果某些经常使用的文件或区域位于具有重新映射扇区的位置)。

  • 我不相信 SMART 与扇区/块重新映射有任何关系。它只是监视(和测试)。磁盘使用控制器(这就是您实际指的)的时间可能比 SMART 存在的时间要长得多。无需报告即可重新映射。 (2认同)
  • @agc SMART 的长期测试可能会触发重新映射,但它只是礼貌地要求内部固件执行此操作。大多数制造商不会在第一次查询时简单地放弃并重新映射扇区,固件有内部阈值,它同意重新映射读取错误的扇区。正如 Daniel_B 指出的 SMART 和重新映射不相关,我们可以使用 mhdd 或 Victoria 来打击表现不佳的扇区,直到固件同意在没有 SMART 任何帮助的情况下重新映射。 (2认同)

har*_*ymc 5

根据您的要求,我已经查看badblocks.c并且可以证明这是一个非常简单的程序,不使用任何高级磁盘功能,并且不能在磁盘控制器级别上工作。

它所做的只是使用 Linux 标准打开函数将驱动器作为原始设备打开(即作为包含整个设备的虚拟文件),同时应用标志O_DIRECT直接对磁盘进行 I/O,而不通过 Linux 内存缓冲区。

然后,它使用ioctl 函数检索原始设备中的块数 ,该数字仅包括公开可见的块/扇区(无备用扇区),然后使用 Linux 标准函数迭代向每个块/扇区写入和读取模式write和read ,如果返回错误码或者数据不相等报错。

打开/读/写功能可以追溯到Linux诞生之初,当时磁盘的结构要简单得多,并且没有备用扇区。需要更高级的功能来访问任何内部磁盘数据,例如临时使用时无法获得的备用扇区。

出于好奇,开头的评论badblocks.c说:

* This file is based on the minix file system programs fsck and mkfs
* written and copyrighted by Linus Torvalds <Linus.Torvalds@cs.helsinki.fi>
Run Code Online (Sandbox Code Playgroud)

哪里Minix早于Linux(历史链接),其缺点实际上促使 Linus Torvalds 编写了 Linux 的第一个版本。这只是为了让大家了解这个程序是多么古老和简单。它当然不会触及备用扇区。

我还查看了dd.c,这是一个附加磁盘驱动程序的更复杂的程序。我不熟悉磁盘驱动程序接口,但在我看来,即使可以通过该接口修改备用扇区,头脑正常的程序员也不会这样做。我的理由是:

  1. dd 可以将磁盘映像写入文件或从文件写入磁盘映像,并且该映像不包含备用扇区(映射时除外),这可能意味着 dd 不会触及未映射的备用扇区。
  2. 备用扇区用于重新映射坏扇区。使用它们意味着坏扇区将变得没有标记,并且复制到此类坏扇区的新数据可能会在没有通知的情况下被损坏和丢失。
  3. 备用扇区映射对其磁盘来说是唯一的,因为两个不同的磁盘几乎永远不会有完全相同的缺陷,因此复制或清除该映射是没有意义的。