ddを使用してきれいなMBRコードを取得すると、pfSenseでは機能しません。

ddを使用してきれいなMBRコードを取得すると、pfSenseでは機能しません。

シェルコマンドでpfsense 2.7.0ライブディスク(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エラーなしですべてが削除されます。 :(

このテキストをテストするためにHDを複数回復元できるように、仮想マシンでテストしています...これは頭が痛いです...

編集する:使用するとbs=512エラーbs=1Mが発生しないようです。ただし、これによりパーティションテーブル部分も削除されます。

編集2:そのコマンドを試してみたdd if=/dev/da0 of=/tmp/mbr_file bs=512 count=1ところ、mbrを含むファイルが作成されました。バイナリモードでファイルを編集するために使用できるコマンドが何であるかを知りたいです。最初の446バイトをゼロで埋め、それを使用してdd if=/tmp/mbr_file of=/dev/da0 bs=512 count=1復元します。

何が使えますか?肉?

答え1

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が、そうではないまれなケースの1つですcat。)

バックアップに復元する必要がある場合

dd if=block0.backup bs=512 of=/dev/da0

答え2

まあ、何度もテストをしてみて下した結論は..

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という0で埋められた446バイトのファイルを作成しました。
  • その後、誰かはい、私はあなたを見ているので、ほとんどすべての便利なツール、さらには16進エディタまで削除し、このハッキングのみを使用できるようにし、この行を使用して元のcat mbr_file | ( dd of=/dev/null bs=446 count=1; dd bs=66 count=1 ) > mbr_file_partition_tablembr_fileから最後の66バイトを抽出します。
  • この時点で、わかりやすくするために、catを使用して2つのファイルをリンクし、名前をmbr_file_newに変更し、ddを使用してmbrをda0デバイスに保存しました。

今回は一度に512バイトを使用したため、エラーは発生しませんでした。

答え3

いくつかの回答では、文字が文字デバイスに書き込まれ、ブロックがブロックデバイスに書き込まれることが正しく指定されています。

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

関連情報