AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 758087
Accepted
user3450548
user3450548
Asked: 2023-10-04 05:56:17 +0800 CST2023-10-04 05:56:17 +0800 CST 2023-10-04 05:56:17 +0800 CST

usar dd para código MBR limpo não funciona no pfSense

  • 772

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/da0ele 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=512ou bs=1Mnã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=1e 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?

partition
  • 3 3 respostas
  • 103 Views

3 respostas

  • Voted
  1. Chris Davies
    2023-10-04T22:13:07+08:002023-10-04T22:13:07+08:00

    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:

    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
    

    (Esta é uma das raras situações em que ddé realmente necessário, em vez de cat.)

    Se você precisar reverter para o backup,

    dd if=block0.backup bs=512 of=/dev/da0
    
    • 5
  2. Best Answer
    user3450548
    2023-10-04T20:55:54+08:002023-10-04T20:55:54+08:00

    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.

    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
    

    então para testar o conteúdo mbr copiado

    dd if=/dev/da0 of=/tmp/mbr_file_test bs=512 count=1
    hexdump /tmp/mbr_file_test | less
    

    Resumindo o que fiz foi:

    • copie o mbr para um mbr_file_original
    • criou um arquivo de 446 bytes preenchido com zero chamado mbr_file_zerofilled
    • então, PORQUE ALGUÉM, ESTOU OLHANDO PARA VOCÊ, removeu praticamente todas as ferramentas úteis, até mesmo editores hexadecimais, deixando apenas esse hack disponível, usei esta linha cat mbr_file | ( dd of=/dev/null bs=446 count=1; dd bs=66 count=1 ) > mbr_file_partition_tablepara extrair do mbr_file original os últimos 66 bytes.
    • Neste ponto, usando cat eu concat 2 arquivos e renomeio para mbr_file_new por uma questão de clareza e então usei dd para salvar de volta o mbr no dispositivo da0

    desta vez sem erros porque usei 512 bytes de uma vez.

    • 4
  3. Jim L.
    2023-10-05T02:46:15+08:002023-10-05T02:46:15+08:00

    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/pmbrimagem de amostra em meu disco de teste /dev/md0e a usarei como ponto de partida:

    # gpart bootcode -b /boot/pmbr md0
    bootcode written to md0
    

    Isso faz com que o primeiro bloco md0pareça:

    # 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
    

    Para criar um registro de inicialização MBR zerado, copiarei a pmbrimagem:

    # cp -vp /boot/pmbr mbr.zeroed
    /boot/pmbr -> mbr.zeroed
    

    E use hexeditpara colocar zeros nos deslocamentos 0x0-0x1b7.
    Ctrl-X Ypara salvar e sair.

    Finalmente, direi gpartpara gravar esse arquivo de volta no MBR.

    # gpart bootcode -b mbr.zeroed md0
    bootcode written to md0
    

    E agora temos:

    # 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
    
    • 3

relate perguntas

  • Como montar partições de unidade zfs no solaris 11.3

  • Área de memória Flash Nand de backup

  • Como particionar corretamente um SSD para uma configuração de inicialização dupla

  • Instale várias distribuições Linux em paralelo

  • fdisk não vendo resize2fs encolhendo partição desmontada

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve