![如何避免 dd 或 badblocks 擦除硬盘的备用扇区?](https://linux22.com/image/1521824/%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%20dd%20%E6%88%96%20badblocks%20%E6%93%A6%E9%99%A4%E7%A1%AC%E7%9B%98%E7%9A%84%E5%A4%87%E7%94%A8%E6%89%87%E5%8C%BA%EF%BC%9F.png)
/!\ 查找下面的更新 2,问题现在已经得到一半的答案了 /!\
我有时会彻底擦除我的硬盘(不是 SSD);因为它们就是这样,dd
而且badblocks -w
会盲目地擦除所有内容。
问题是,他们还会写入硬盘的备用扇区,这很糟糕,因为它们都是全新的。因此,如果在擦除过程中发生某些事情(断电、写入错误等),那么就会白白毁掉一个非常有用的扇区……
那么问题是:如何避免dd
或badblocks
擦除硬盘的备用扇区?
假设:
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 在 Super User 上有一个帐户。如果他读到这个更新 2,是否可以直接得到答案?
答案1
既dd
不能badblocks
访问磁盘硬件备用扇区。主要原因dd
是badblocks
不能访问这些备用扇区的关键在于这些实用程序的作者不知道如何访问,以及现代硬盘硬件的专有性质和聪明的软件使得找出答案变得异常困难。
这个问题似乎是基于对操作系统级文件系统和磁盘供应商硬件级的混淆聪明的和重新映射例行公事。历史观点也许可以澄清一些事情……
早期的PC硬件供应商在发货前对磁盘进行了测试,并在磁盘标签或随附的打印输出上包含坏块列表。安装驱动器的管理员可能会在格式化驱动器时使用该坏块列表。 早期的格式化程序会提示用户输入坏块列表,用户需要手动输入。如果驱动器已经存在一段时间了,管理员可能会重新检查驱动器块。无论如何,这些坏块列表的目的是告诉文件系统不要使用这些块。该badblocks
实用程序似乎是为这种早期硬盘而设计的。
较新的硬盘包括重新映射例程以及 SMART 等诊断例程,这两者相当于硬盘内的专用计算机,可自动检查坏块甚至重新映射坏块。功能很棒,但供应商重新映射的糟糕之处在于,它的所有实现都是专有和封闭源代码的 - 因此用户不确定它到底在做什么,或者无法做什么。磁盘的重新映射/诊断固件可能有缺陷,磁盘上可能有间谍或黑帽黑客占据的秘密位置等。由于它是磁盘级别重新映射(而不是操作系统级别),因此它可能会低效地导致更多的磁头抖动和磨损(如果某些常用文件或区域位于重新映射扇区的位置)。
答案2
根据您的要求,我已经查看过badblocks.c
并且我可以证明这是一个非常简单的程序,它不使用任何高级磁盘功能并且不在磁盘控制器级别上工作。
它所做的就是使用 Linux 标准打开函数将驱动器作为原始设备打开(即包含整个设备的虚拟文件),同时应用标志O_DIRECT
直接对磁盘执行 I/O,而无需经过 Linux 内存缓冲区。
然后,它使用以下方法检索原始设备中的块数: ioctl 函数,该数字仅包含公开可见的块/扇区(无备用扇区),然后使用 Linux 标准函数迭代地将模式写入和读取到每个块/扇区写和读,如果返回任何错误代码或者数据不相等则报告错误。
打开/读取/写入函数可以追溯到 Linux 的早期,当时磁盘的结构非常简单,没有备用扇区。需要更高级的函数来访问任何内部磁盘数据,例如临时使用时无法使用的备用扇区。
出于好奇,开头的评论badblocks.c
说:
* This file is based on the minix file system programs fsck and mkfs
* written and copyrighted by Linus Torvalds <[email protected]>
Minix
Linux 之前的版本(历史链接),而它的缺点实际上促使 Linus Torvalds 编写了 Linux 的第一个版本。这只是为了了解这个程序是多么古老和不成熟。它当然不会触及备用扇区。
我也看过dd.c这是一个更复杂的程序,用于连接磁盘驱动器。我不熟悉磁盘驱动器接口,但在我看来,即使可以通过该接口修改备用扇区,也没有一个头脑正常的程序员会这样做。我的理由是:
- dd 可以将磁盘映像写入文件或从文件写入磁盘映像,并且该映像不包含备用扇区(映射时除外),这可能意味着 dd 不会触及未映射的备用扇区。
- 备用扇区用于重新映射坏扇区。随意修改这些扇区将意味着坏扇区将失去标记,复制到这些坏扇区的新数据可能会被破坏并丢失,且不会造成任何意外。
- 备用扇区映射对于其磁盘是唯一的,因为两个不同的磁盘几乎永远不会有完全相同的缺陷,因此复制或清除该映射是没有意义的。