1

我正在尝试编写一个 bash 脚本来审核已擦除的硬盘驱动器,以确保擦除系统正常工作。我想找到一种方法来对驱动器的特定部分进行十六进制转储,而不必对整个驱动器进行十六进制转储并提取我想要的部分(因为这似乎运行时间太长以至于脚本值得编写)。理想情况下,我能够从驱动器的开头、中间和结尾抓取零件。

我想获取十六进制转储的输出并检查它是否只存在一个字符(表明驱动器已成功擦除)。这部分,我可以处理,但我认为它可能会影响我可能得到的任何建议。

我已经使用 head piped 到 xxd 来获取文件的开头,该文件有效,但我仍然停留在其他部分。我试过使用 tail 来结束驱动器,但这似乎也不能很快奏效。是否有可能有效地做到这一点?可能使用 dd 或其他东西并将其传送到十六进制编辑器中?我查看了 xxd 和 hexdump 的选项,但无济于事。如果有人能指出我正确的方向,将不胜感激!

4

2 回答 2

2

xxd 具有跳过进入文件的路径 ( -s) 并转储有限长度 ( -l) 的选项。如果您使用其普通的十六进制 ( -p) 选项,您也许可以使用 grep 来查找任何异常:

$ xxd -s 8192 -l 256 -p /dev/disk3s2 | grep [^0]
000000010000000000000000000000000000000000000000000000000000
000000000000000000000000300000000000000800000000000000000000
dbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
dbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
dbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb

od具有相似的跳过 ( -j) 和限制长度 ( -N)。同样,ddhasskip=count=(尽管这些是以块而不是字节为单位计算的;您可以使用 更改块大小bs=)。

编辑:由于xxd -p给出了奇怪的结果(不停止在设备的末端),我建议运行一些测试来弄清楚发生了什么。首先,备份计算机上的任何重要内容,因为如果设备访问级别出现异常情况,则其中一些测试可能会覆盖意外的内容,甚至可能覆盖另一个磁盘上的内容。

接下来,尝试使用不同的工具将数据转储到设备的末尾,看看它们是否都以相同的方式运行:

xxd -s 65451982336 /dev/sdb | more  # This *should* dump 512 bytes (32 lines) then stop, but apparently keeps going
od -xv -j 65451982336 /dev/sdb | more  # This also *should* dump 512 bytes then stop
dd if=/dev/sdb skip=127835903 | xxd | more # This again should do the same thing (note that the skip value is in 512-byte blocks)

其他工具是否读取 fdisk 报告为磁盘末尾的内容?如果所有三个都读取了更多数据,我将使用“fdisk 错误/误导”的答案。您可以通过在“结束”之后写入一些非零数据并查看结果来进一步测试:

dd if=/dev/random of=/dev/sdb seek=127835903 count=2

...然后重复各种转储命令。如果它们显示两个随机数据块(=64 行)后跟零,我很确定该设备比您想象的要大。

于 2013-12-07T04:39:20.567 回答
1

我不在我的外壳附近,但是这些方面的内容应该可以帮助您入门:

dd if=/dev/hda1 | hexdump -C | grep [^00]

将打印所有非零字节。

dd if=/dev/hda1 | od -x -j100

会给你一个带有偏移量的十六进制转储,从 100 字节开始。

于 2013-12-07T03:40:37.240 回答