Tentando limpar a parte do código mbr em um disco usando o disco ativo pfsense 2.7.0 (o pfsense é baseado no freebsd) sob o comando shell.
sendo /dev/da0 meu drive seguindo o código sugerido para limpar apenas o código mbr mantendo as partições o comando deveria ser:
dd if=/dev/zero of=/dev/da0 bs=446 count=1
no entanto... o resultado é:
dd: /dev/da0: Invalid argument
1+0 records in
0+0 records out
0 bytes transferred in 0.000089 secs (0 bytes/sec)
em vez disso... se eu usar apenas como código dd if=/dev/zero of=/dev/da0
ele apaga tudo sem erros :(
Estou fazendo esses testes em uma vm para poder recuperar o hd diversas vezes para testar essa passagem... porém essa coisa está me dando dor de cabeça...
EDIT: Parece que se uso bs=512
ou bs=1M
não dá erros. No entanto, ao fazer isso, a parte da tabela de partições também seria excluída ...
EDIT2: Tentei usar o comando dd if=/dev/da0 of=/tmp/mbr_file bs=512 count=1
e ele criou para mim um arquivo com o mbr, gostaria de saber quais comandos posso usar para editar em modo binário o arquivo preenchendo os primeiros 446 bytes com 0 e depois usar para restaurá-lo dd if=/tmp/mbr_file of=/dev/da0 bs=512 count=1
.
O que eu poderia usar? vi?
Já faz muito tempo desde a última vez que usei um sistema BSD, e minha lembrança deles em relação aos dispositivos de disco é que você deve escrever blocos completos (ou múltiplos). Parece que este ainda é o caso, e em particular para
/dev/da0
.A abordagem geral é ler um bloco, atualizar a parte relevante dele e então escrever o bloco completo novamente. Aqui também manteremos um backup do bloco original, como
block0.backup
:(Esta é uma das raras situações em que
dd
é realmente necessário, em vez decat
.)Se você precisar reverter para o backup,
Ok, fiz vários testes e cheguei a essa conclusão...
Como o pfsense é uma versão simplificada do freebsd e muitas ferramentas estão faltando, tive que fazer isso para limpar os primeiros 446 bytes do disco, preservando a tabela de partição localizada no máximo 66 bytes do primeiro bloco de 512 bytes.
então para testar o conteúdo mbr copiado
Resumindo o que fiz foi:
cat mbr_file | ( dd of=/dev/null bs=446 count=1; dd bs=66 count=1 ) > mbr_file_partition_table
para extrair do mbr_file original os últimos 66 bytes.desta vez sem erros porque usei 512 bytes de uma vez.
Várias respostas apontaram corretamente que se escreve caracteres em dispositivos de caracteres e blocos em dispositivos de bloco.
Não sei quais ferramentas o pfSense inclui e quais ele omite, mas em um sistema FreeBSD completo, o seguinte funcionaria:
Escreverei uma
/boot/pmbr
imagem de amostra em meu disco de teste/dev/md0
e a usarei como ponto de partida:Isso faz com que o primeiro bloco
md0
pareça:Para criar um registro de inicialização MBR zerado, copiarei a
pmbr
imagem:E use
hexedit
para colocar zeros nos deslocamentos 0x0-0x1b7.Ctrl-X Ypara salvar e sair.
Finalmente, direi
gpart
para gravar esse arquivo de volta no MBR.E agora temos: