Puoi rendere il dispositivo non avviabile semplicemente creando i primi pochi byte del disco 0x00.
Tipicamente (e questo è vero sia per grub, grub2 e ntldr iirc) il primo byte del tuo disco sarà un'istruzione j86 x86. Ciò si verifica anche prima di disklabel, perché quando si passa l'esecuzione al dispositivo per eseguirne il bootstrap, imposta semplicemente la CPU per l'aspirazione delle informazioni del dispositivo come codice. Se ha codice non valido, attiva un interrupt e il BIOS gestisce l'eccezione e passa al successivo dispositivo avviabile.
Ad esempio, l'inizio del mio disco inizia con:
00000000 eb 63 90 d0 bc 00 7c fb 50 07 50 1f fc be 1b 7c |.c....|.P.P....||
La prima parte è eb 63
che è Jump to offset 0x63 dall'IP corrente (quindi a 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......|
L'esecuzione continua da qui.
La fine del settore è simile a questa:
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.|
Se il disco è formattato come tabella di partizione MBR, è necessario che siano presenti due elementi, la tabella delle partizioni che è in offset 0x1be
e la firma MBR, 55aa
che si verifica alla fine del settore a offset 0x1fe
. 0x1be
è decimale 446.
Quanto segue (ovviamente) rende il dispositivo non avviabile. Ma questo è quello che vuoi. Se non vuoi rendere il tuo dispositivo non in grado di essere avviato, non farlo, mmm-kay? Suppongo che il tuo dispositivo sia /dev/sdz
, semplicemente perché non molte persone hanno un /dev/sdz
, e questo riduce il rischio che alcuni inesperti novizi copino ciecamente i comandi di incollamento.
Per prima cosa, copia l'MBR in un file per un backup.
sudo dd if=/dev/sdz of=/some/where/safe/preferably/not/on/dev/sdz/backup.mbr bs=512 count=1
Quindi, crea una copia di quel file:
cp backup.mbr backup.mbr.test
Successivamente, dobbiamo creare un dispositivo di loopback (in modo che i contenuti non vengano troncati). E applicare le modifiche sul nostro settore falso 0 come test:
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
del file e assicurati che l'intera tabella delle partizioni sia intatta:
sudo hexdump -C backup.mbr.test
Dovresti vedere qualcosa del tipo:
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
Ora, 0x1be
è dove vedi 80
sull'output hexdumped, anche questo può essere 00
ed essere ancora valido. (È il flag "avviabile" nella tabella delle partizioni, puoi lasciarlo da solo, perché è completamente ignorato dai più moderni BIOS ...) Il byte in 0x1bf
però quasi mai sarà 0x00
(è più comunemente 0x01
ma può assumere altri valori) puoi confrontarlo con backup.mbr
per assicurarti che nulla oltre 0x1be
sia cambiato.
Una volta che sei soddisfatto di aver applicato correttamente la modifica, puoi copiare direttamente il file sulla prima parte del disco. Il motivo per cui vuoi eseguire di nuovo il file anziché /dev/zero
è la sicurezza contro gli errori di battitura. Se accidentalmente ometti count=1
avrai un brutto momento, la copia di un file dall'altra parte non funzionerà mai oltre l'EOF, mai. Quindi è più sicuro.
sudo dd if=backup.mbr.test of=/dev/sdz
Successivo hexdump
del tuo disco per assicurarti che le modifiche siano state effettuate come previsto.
hexdump -C /dev/sdz | head
Confronta fino a 0x200
contro backup.mbr.test
per assicurarti che sia quello che desideri.
Infine, se qualcosa si infrange per qualsiasi motivo, puoi semplicemente copiare il backup dell'MBR sul drive tramite:
sudo dd if=backup.mbr of=/dev/sdz
Spero che questo aiuti.