尝试在 shell 命令下使用 pfsense 2.7.0 live disk(pfsense 基于 freebsd)清理磁盘上的 mbr 代码部分。
/dev/da0我的驱动器遵循建议的清洁代码,仅保留分区的 mbr 代码,命令应该是:
dd if=/dev/zero of=/dev/da0 bs=446 count=1
然而......结果是:
dd: /dev/da0: Invalid argument
1+0 records in
0+0 records out
0 bytes transferred in 0.000089 secs (0 bytes/sec)
相反...如果我仅使用它作为代码,dd if=/dev/zero of=/dev/da0
它只会删除所有内容而不会出现错误:(
我正在虚拟机中进行此测试,以便我可以多次恢复高清来测试这段文字...但是这件事让我头疼...
编辑:似乎如果我使用bs=512
或bs=1M
它不会给出错误。但是这样做也会删除分区表部分......
EDIT2:我尝试使用该命令dd if=/dev/da0 of=/tmp/mbr_file bs=512 count=1
,它为我创建一个带有 mbr 的文件,我想知道我可以使用哪些命令以二进制模式编辑该文件,将前 446 个字节填充为 0,然后用于恢复它dd if=/tmp/mbr_file of=/dev/da0 bs=512 count=1
。
我可以用什么?六?
自从我上次使用 BSD 系统以来已经有很长一段时间了,我对它们关于磁盘设备的记忆是必须写入完整的块(或多个块)。情况似乎仍然如此,尤其是对于
/dev/da0
.一般的方法是读取一个块,更新它的相关部分,然后再次写回整个块。在这里,我们也将保留原始块的备份,如下所示
block0.backup
:(这是真正需要的罕见情况之一
dd
,而不是cat
。)如果您需要恢复到备份,
好吧,我做了很多测试并得出了这个结论......
因为 pfsense 是 freebsd 的一个该死的剥离版本,并且缺少很多工具,所以我必须这样做来清除磁盘中的前 446 个字节,保留位于第一个 512 字节块的最新 66 字节的分区表。
然后测试复制的mbr内容
简而言之,我所做的是:
cat mbr_file | ( dd of=/dev/null bs=446 count=1; dd bs=66 count=1 ) > mbr_file_partition_table
从原始 mbr_file 中提取最后 66 个字节。这次没有错误,因为我一次使用了 512 字节。
几个答案正确地指出,将字符写入字符设备,将块写入块设备。
我不知道 pfSense 包含哪些工具以及省略哪些工具,但在功能齐全的 FreeBSD 系统上,以下内容可以工作:
我会将示例
/boot/pmbr
图像写入我的测试磁盘/dev/md0
并使用它作为起点:这使得第一块
md0
看起来像:要创建清零的 MBR 引导记录,我将复制该
pmbr
映像:并用于
hexedit
在偏移量 0x0-0x1b7 处放置零。Ctrl-X Y保存并退出。
最后,我会告诉您
gpart
将该文件写回 MBR。现在我们有: