ディスクの最初の数バイトを0x00にするだけで、デバイスを起動不可能にすることができます。
通常(これはgrub、grub2、ntldr iircの両方に当てはまります)、ドライブの最初のバイトはx86 jmp命令になります。これは、ディスクラベルよりも前に発生します。デバイスに実行を渡してブートストラップすると、デバイス情報をコードとして取り込むようにCPUを設定するだけです。無効なコードがある場合、割り込みをトリガーし、BIOSが例外を処理し、次の起動可能なデバイスに進みます。
たとえば、私のディスクの始まりは次で始まります:
00000000 eb 63 90 d0 bc 00 7c fb 50 07 50 1f fc be 1b 7c |.c....|.P.P....||
最初の部分はeb 63
、現在のIPからのオフセット0x63へのジャンプ(つまり0x65へ)です。
00000060 00 00 00 00 ff fa 90 90 f6 c2 80 74 05 f6 c2 70 |...........t...p|
00000070 74 02 b2 80 ea 79 7c 00 00 31 c0 8e d8 8e d0 bc |t....y|..1......|
ここから実行が続行されます。
セクターの終わりは次のようになります。
000001b0 cd 10 ac 3c 00 75 f4 c3 ed db 96 d6 00 00 80 01 |...<.u..........|
000001c0 01 00 83 fe ff ff 3f 00 00 00 c1 07 a6 0e 00 fe |......?.........|
000001d0 ff ff 83 fe ff ff 00 60 00 11 00 00 38 29 00 fe |.......`....8)..|
000001e0 ff ff 82 fe ff ff 00 08 a6 0e 00 58 5a 02 00 00 |...........XZ...|
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
ディスクがMBRパーティションテーブルとしてフォーマットされている場合、存在する必要があるのは、オフセットにあるパーティションテーブルと、offset にあるセクターの最後にある0x1be
MBRシグネチャ55aa
だけ0x1fe
です。 0x1be
10進数の446です。
以下は(もちろん)デバイスを起動不能にします。しかし、これはあなたが望むものです。デバイスを起動できないようにしたくない場合は、これを実行しないでください。あなたのデバイスが/dev/sdz
であると仮定しているのは、単にを持っている人があまりいない/dev/sdz
からです。これにより、バカ初心者が盲目的に貼り付けコマンドをコピーするリスクが低くなります。
まず、MBRをバックアップ用のファイルにコピーします。
sudo dd if=/dev/sdz of=/some/where/safe/preferably/not/on/dev/sdz/backup.mbr bs=512 count=1
次に、そのファイルのコピーを作成します。
cp backup.mbr backup.mbr.test
次に、ループバックデバイスを作成して(内容が切り捨てられないようにする必要があります)、テストとして偽のセクター0に変更を適用します。
sudo losetup /dev/loop7 backup.mbr.test
sudo dd if=/dev/zero of=/dev/loop7 bs=446 count=1
sudo losetup -d /dev/loop7
hexdump
ファイルを作成し、パーティションテーブル全体が完全であることを確認します。
sudo hexdump -C backup.mbr.test
次のように表示されるはずです。
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 01 |................|
000001c0 01 00 83 fe ff ff 3f 00 00 00 c1 07 a6 0e 00 fe |......?.........|
000001d0 ff ff 83 fe ff ff 00 60 00 11 00 00 38 29 00 fe |.......`....8)..|
000001e0 ff ff 82 fe ff ff 00 08 a6 0e 00 58 5a 02 00 00 |...........XZ...|
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
00000200
さて、hexdumpedの出力に0x1be
表示80
される場所ですが、これも00
有効であり、まだ有効です。(パーティションテーブルの「ブート可能」フラグです。ほとんどの最新のBIOSで完全に無視されるため、そのままにしておくことができます...)しかし、バイト0x1bf
はほとんどありません0x00
(最も一般的です0x01
が、他の値を取ることができます)これをあなたbackup.mbr
と比較して、過去0x1be
が変更されていないことを確認できます。
変更が正しく適用されたことに満足したら、ファイルをディスクの最初の部分に直接コピーできます。/dev/zero
もう一度ファイルを作成するのではなく、ファイルを作成する理由は、タイプミスに対する安全性のためです。誤って省略してしまった場合count=1
、悪い時間を過ごすことになりますが、ファイルをコピーしてもEOFを超えることはありません。より安全です。
sudo dd if=backup.mbr.test of=/dev/sdz
次にhexdump
ディスクを変更して、変更が期待どおりに行われたことを確認します。
hexdump -C /dev/sdz | head
0x200
に対して比較して、backup.mbr.test
それがあなたが望むものであることを確認してください。
最後に、何らかの理由で何らかの問題が発生した場合は、次の方法でMBRのバックアップをドライブにコピーします。
sudo dd if=backup.mbr of=/dev/sdz
お役に立てれば。