AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 758087
Accepted
user3450548
user3450548
Asked: 2023-10-04 05:56:17 +0800 CST2023-10-04 05:56:17 +0800 CST 2023-10-04 05:56:17 +0800 CST

使用 dd 来获取干净的 MBR 代码在 pfSense 上不起作用

  • 772

尝试在 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。

我可以用什么?六?

partition
  • 3 3 个回答
  • 103 Views

3 个回答

  • Voted
  1. Chris Davies
    2023-10-04T22:13:07+08:002023-10-04T22:13:07+08:00

    自从我上次使用 BSD 系统以来已经有很长一段时间了,我对它们关于磁盘设备的记忆是必须写入完整的块(或多个块)。情况似乎仍然如此,尤其是对于/dev/da0.

    一般的方法是读取一个块,更新它的相关部分,然后再次写回整个块。在这里,我们也将保留原始块的备份,如下所示block0.backup:

    dd if=/dev/da0 bs=512 count=1 | tee block0.backup >block0
    dd if=/dev/zero bs=446 count=1 conv=notrunc of=block0
    dd if=block0 bs=512 of=/dev/da0
    

    (这是真正需要的罕见情况之一dd,而不是cat。)

    如果您需要恢复到备份,

    dd if=block0.backup bs=512 of=/dev/da0
    
    • 5
  2. Best Answer
    user3450548
    2023-10-04T20:55:54+08:002023-10-04T20:55:54+08:00

    好吧,我做了很多测试并得出了这个结论......

    因为 pfsense 是 freebsd 的一个该死的剥离版本,并且缺少很多工具,所以我必须这样做来清除磁盘中的前 446 个字节,保留位于第一个 512 字节块的最新 66 字节的分区表。

    dd if=/dev/da0 of=/tmp/mbr_file_original bs=512 count=1
    dd if=/dev/zero of=/tmp/mbr_file_zerofilled bs=446 count=1
    cat /tmp/mbr_file_original | ( dd of=/dev/null bs=446 count=1; dd bs=66 count=1 ) > /tmp/mbr_file_partitions_table
    cat /tmp/mbr_file_partitions_table >> /tmp/mbr_file_zerofilled
    mv /tmp/mbr_file_zerofilled /tmp/mbr_file_new
    dd if=/tmp/mbr_file_new of=/dev/da0 bs=512 count=1
    

    然后测试复制的mbr内容

    dd if=/dev/da0 of=/tmp/mbr_file_test bs=512 count=1
    hexdump /tmp/mbr_file_test | less
    

    简而言之,我所做的是:

    • 将 mbr 复制到 mbr_file_original
    • 创建了一个名为 mbr_file_zerofilled 的零填充 446 字节文件
    • 然后因为有人是的,我在看着你,几乎删除了所有有用的工具,甚至十六进制编辑器,只留下这个黑客可用,使用这一行cat mbr_file | ( dd of=/dev/null bs=446 count=1; dd bs=66 count=1 ) > mbr_file_partition_table从原始 mbr_file 中提取最后 66 个字节。
    • 此时,为了清楚起见,我使用 cat 连接了 2 个文件并重命名为 mbr_file_new,然后使用 dd 将 mbr 保存回 da0 设备

    这次没有错误,因为我一次使用了 512 字节。

    • 4
  3. Jim L.
    2023-10-05T02:46:15+08:002023-10-05T02:46:15+08:00

    几个答案正确地指出,将字符写入字符设备,将块写入块设备。

    我不知道 pfSense 包含哪些工具以及省略哪些工具,但在功能齐全的 FreeBSD 系统上,以下内容可以工作:

    我会将示例/boot/pmbr图像写入我的测试磁盘/dev/md0并使用它作为起点:

    # gpart bootcode -b /boot/pmbr md0
    bootcode written to md0
    

    这使得第一块md0看起来像:

    # dd if=/dev/md0 count=1 | hexdump -v
    1+0 records in
    1+0 records out
    512 bytes transferred in 0.000053 secs (9723673 bytes/sec)
    0000000 31fc 8ec0 8ec0 8ed8 bcd0 0e00 1abe bf7c
    0000010 061a e6b9 f301 e9a4 8a00 fa80 7280 8a0b
    0000020 7536 8004 80c6 f238 0272 80b2 d1e8 b600
    0000030 bb01 0e00 91be e807 00ac 8166 003e 450e
    0000040 4946 7520 660d 3e81 0e04 4150 5452 0275
    ...
    00001a0 be11 000b 6015 4fb8 900f 9090 9090 9090
    00001b0 9090 9090 9090 9090 0000 0000 0000 0000
    00001c0 0000 0000 0000 0000 0000 0000 0000 0000
    00001d0 0000 0000 0000 0000 0000 0000 0000 0000
    00001e0 0000 0000 0000 0000 0000 0000 0000 0000
    00001f0 0000 0000 0000 0000 0000 0000 0000 aa55
    0000200
    

    要创建清零的 MBR 引导记录,我将复制该pmbr映像:

    # cp -vp /boot/pmbr mbr.zeroed
    /boot/pmbr -> mbr.zeroed
    

    并用于hexedit在偏移量 0x0-0x1b7 处放置零。
    Ctrl-X Y保存并退出。

    最后,我会告诉您gpart将该文件写回 MBR。

    # gpart bootcode -b mbr.zeroed md0
    bootcode written to md0
    

    现在我们有:

    # dd if=/dev/md0 count=1 | hexdump -v
    1+0 records in
    1+0 records out
    512 bytes transferred in 0.000106 secs (4847613 bytes/sec)
    0000000 0000 0000 0000 0000 0000 0000 0000 0000
    0000010 0000 0000 0000 0000 0000 0000 0000 0000
    0000020 0000 0000 0000 0000 0000 0000 0000 0000
    0000030 0000 0000 0000 0000 0000 0000 0000 0000
    0000040 0000 0000 0000 0000 0000 0000 0000 0000
    ...
    00001a0 0000 0000 0000 0000 0000 0000 0000 0000
    00001b0 0000 0000 0000 0000 0000 0000 0000 0000
    00001c0 0000 0000 0000 0000 0000 0000 0000 0000
    00001d0 0000 0000 0000 0000 0000 0000 0000 0000
    00001e0 0000 0000 0000 0000 0000 0000 0000 0000
    00001f0 0000 0000 0000 0000 0000 0000 0000 aa55
    0000200
    
    • 3

相关问题

  • 如何在 solaris 11.3 中挂载 zfs 驱动器分区

  • 备份 Nand Flash 存储区

  • 如何正确分区 SSD 以进行双启动设置

  • 并行安装多个 linux 发行版

  • fdisk 没有看到 resize2fs 缩小未挂载的分区

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve