我正在尝试编写一个bash脚本来审核已擦除的硬盘驱动器,以确保擦除系统正常工作。我想找到一种方法来十六进制转储驱动器的特定部分,而不必十六进制转储整个驱动器并提取我想要的部分(因为这似乎运行太长时间使脚本值得写)。理想情况下,我可以从驱动器的开头,中间和末端抓取部件。
我想获取十六进制转储的输出并检查它是否只存在一个字符(表示驱动器已成功擦除)。这部分,我可以处理,但我认为它可能影响我可能得到的任何建议。
我已经使用头管道进入xxd来获取已经工作的文件的开头,但我仍然坚持其他部分。我已经尝试使用tail来获得驱动器的结束,但这似乎也没有快速起作用。是否有可能有效地做到这一点?可能使用dd或其他东西并将其输入到十六进制编辑器中?我查看了xxd以及hexdump的选项无效。如果有人能指出我正确的方向,我们将不胜感激!
答案 0 :(得分:1)
我不在我的贝壳附近,但是这些方面的内容应该让你开始:
dd if=/dev/hda1 | hexdump -C | grep [^00]
将打印所有非零字节。
dd if=/dev/hda1 | od -x -j100
将为您提供带偏移量的十六进制转储,从100字节开始。
答案 1 :(得分:1)
xxd可以选择跳过文件(-s
)并转储有限长度(-l
)。如果使用普通十六进制(-p
)选项,则可以使用grep查找任何异常:
$ xxd -s 8192 -l 256 -p /dev/disk3s2 | grep [^0]
000000010000000000000000000000000000000000000000000000000000
000000000000000000000000300000000000000800000000000000000000
dbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
dbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
dbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
od
具有类似的跳过(-j
)和限制长度(-N
)。同样,dd
有skip=
和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行)后跟零,我很确定该设备比你想象的要大。