Ви можете зробити пристрій не завантажуваним просто, зробивши перші кілька байтів диска 0x00.
Як правило (і це справедливо як для grub, grub2, так і ntldr iirc), першим байтом вашого диска буде інструкція x86 jmp. Це відбувається ще до того, як розгортати, тому що, передаючи виконання пристрою для завантаження, він просто встановлює центральний процесор, щоб всмоктувати інформацію про пристрій як код. Якщо він має недійсний код, він запускає переривання, і BIOS обробляє виняток і переходить до наступного завантажувального пристрою.
Наприклад, початок мого диска починається з:
00000000 eb 63 90 d0 bc 00 7c fb 50 07 50 1f fc be 1b 7c |.c....|.P.P....||
Перша частина полягає в тому, eb 63
що це Перейти до зміщення 0x63 від поточного IP (тобто до 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, тоді йому потрібні лише дві речі, таблиця розділів, яка є зрушеною, 0x1be
і підпис MBR, 55aa
який відбувається в самому кінці сектора при зміщенні 0x1fe
. 0x1be
- десятковий 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
Тепер, 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
Сподіваюсь, це допомагає.