O dd pode substituir partições adjacentes

15

Seria

dd if=/dev/zero of=somepartition bs=512

também limpe partições depois somepartitionou para no final de somepartition?

LogicBreaker
fonte
5
Os dispositivos de bloco que representam partições, por exemplo /dev/sda1, são criados pelo kernel de tal maneira que é impossível acessar o armazenamento adjacente através deles (assumindo que a tabela de partições não foi alterada após a leitura do kernel pela última vez). Se você pudesse acessar o armazenamento adjacente dessa maneira, isso seria considerado um bug enorme.
David Foerster

Respostas:

18

Sobrescreva uma partição com dd

ddé uma ferramenta muito poderosa, mas também perigosa. Ele faz o que você manda fazer sem perguntas. Portanto, se você disser para apagar as fotos da família, ... e ocorrer um pequeno erro de digitação.

Mas se você verificar e verificar duas vezes, poderá usá-lo.

dd if=/dev/zero of=somepartition bs=512

ou eu sugeriria

dd if=/dev/zero of=/dev/sdxn bs=4096

onde xestá a letra da unidade en o número da partição e o tamanho do bloco 4096 bytes, torna o processo de gravação mais rápido.

É importante que você escreva em uma partição nesse caso. Se você gravar em toda a unidade (o cabeçote da unidade), /dev/sdxtoda a unidade será substituída. Mas a gravação na partição será interrompida no final da partição e as partições atrás dela serão preservadas. (Eu testei agora em um pendrive USB no Lubuntu 16.04 LTS, então eu sei que funciona assim.)

Exceção para uma partição estendida

Há uma exceção para uma partição estendida (que é um contêiner para partições lógicas, para ter mais de quatro partições em uma tabela de partições do MSDOS). Isso é descrito no seguinte link,

Posso criar uma imagem da partição 'estendida' usando o dd?

Mas há outro problema também. Testei seu comando em um ambiente de teste e o dd leu apenas um kibibyte (1024 bytes) quando desejava criar uma imagem de uma partição estendida.

Testei também isso agora em um pendrive USB no Lubuntu 16.04 LTS, e isso se aplica à escrita (assim como à leitura). Somente o primeiro kibibyte é substituído.

Para resumir, a substituição de partições primárias e partições lógicas funciona de acordo com a descrição principal nesta resposta. Mas não use esse método para substituir uma partição estendida porque somente o primeiro kibibyte será substituído. As partições lógicas da partição estendida não serão mais encontradas através da tabela de partições, mas os dados armazenados nelas ainda estão lá.

sudodus
fonte
Eu já aceitei, mas se é assim, deve ser a resposta correta.
LogicBreaker
3
@ LogicBreaker, talvez você possa mudar a aceitação. Mas isso não é importante. É mais importante que você entenda como usar dde que seja arriscado, para ter muito cuidado ao usá-lo. Boa sorte :-) Em geral, você deve sempre ter um backup de todos os arquivos que não pode perder.
sudodus 25/10
11
Ao escrever em partições simples, você não tem muitas alternativas. Eu mudei, caso contrário, seria enganoso para os outros.
LogicBreaker
11
É por isso que os usuários normalmente não podem acessar os / dev / * "arquivos".
Thorbjørn Ravn Andersen
11
Se esta é a única cópia de suas fotos de família sem backup, então você está sujeito a perdê-los a qualquer momento pelo roubo, incêndio, acidente ou falha de hardware simples :-)
user334639
4

Gravações em um dispositivo de partição não gravam fora dessa partição, com dd ou qualquer outra coisa. Você precisaria usar um dispositivo wholedisk para ter algum efeito fora de uma única partição.

(Advertência: a menos que seu disco tenha uma tabela de partições com partições sobrepostas, o que nunca deve acontecer.)

hobbs
fonte
3
Outra ressalva: se você estiver usando algo como LVM, a gravação em um volume físico pode, é claro, afetar muitos volumes lógicos.
Maxpm 26/10
4

Eu acho que sua pergunta é baseada em um mal-entendido fundamental sobre como dd(e de fato os sistemas operacionais Unix-like em geral) funcionam:

ddnão pode sobrescrever partições adjacentes, simplesmente porque ddnão pode sobrescrever partições, ponto .

dd simplesmente escreve para arquivos . É isso aí.

Agora, se você passar ddum arquivo que representa várias partições, ddsubstituirá esse arquivo . Mas, nesse caso, não está ddgravando além do final da partição.ddainda gravará até o final do arquivo e somente até o final do arquivo.

Mas, se você passar ddum arquivo que representa apenas uma partição, ddnão gravará além do final desta partição. Novamente, isso não tem nada a ver comdd . ddsimplesmente grava no arquivo para o qual você escreve. O fato de esse arquivo representar uma única partição é (nesse caso) garantido pelo driver do dispositivo de bloco no kernel. ddnão tem nada a ver com isso.

Então, resumindo: ddgrava em arquivos. O que esses arquivos representam, não ddé motivo de preocupação. ddnão sabe nada sobre partições.

Jörg W Mittag
fonte
Mmh ... com o dd apenas gravando em arquivos, você não pode usá-lo para gravar em partições brutas.
LogicBreaker
11
Corrigir. Você não pode usar ddpara gravar em partições brutas. Você só pode gravar em arquivos. Obviamente, você pode gravar em um arquivo de dispositivo de bloco que represente uma partição (como /dev/sda1), mas não pode gravar em uma partição bruta. E como você só pode gravar em um arquivo que representa uma partição, não é possível gravar além do final da partição, porque o arquivo representa apenas a partição, e não a partição e um pouco além do final.
Jörg W Mittag 26/10
3
Jorg se refere a uma das principais idéias da filosofia Unix - "tudo é um arquivo". Como tal, o kernel apresenta patições, dispositivos, portas etc. como arquivos. Como resultado, todo programa que pode gravar em um arquivo pode ser usado para gravar em uma partição ou dispositivo. O trabalho do kernel é impor o limite da partição. Você pode abrir /dev/sdano seu editor de texto e alterar os dados, ddnão é diferente de nenhum outro programa em termos de poder acessar partições. Resposta muito boa!
Sergey
1

Há um cenário especial perigoso, mas raro, em que isso pode ocorrer mesmo com drivers de dispositivo de bloco que não sejam de buggy:

  • A tabela de partição no disco é alterada de forma que a partição x seja redimensionada para terminar em um limite inferior ao anterior. A partição y atrás dela é redimensionada para iniciar no limite inferior ou uma nova partição y é adicionada ao espaço.
  • A partição y é preenchida com dados relevantes por meios independentes da tabela de partições, por exemplo, usando dd com opções skip / count no dispositivo de bloco de disco inteiro (por exemplo, / dev / sda)
  • O ioctl que diz ao kernel para reler a tabela de partição não é emitido ou falha devido a dispositivos ocupados
  • A partição x é gravada por qualquer processo que tenta gravá-la até atingir uma condição de erro.
rackandboneman
fonte
0

Você deve ter cuidado com o dd, como se cometer um erro, poderá sobrescrever mais do que esperava e isso depende do que você está usando para o dd (o OP foi vago no uso do dd e na sintaxe exata do dd comando).

Se você especificar uma partição, ela gravará nela até que a partição esteja cheia.

Se você cometer um erro e colocar a unidade inteira, por exemplo, = / dev / sda, o dd gravará em toda a unidade e começará a ignorar (e substituir) a tabela de partição.

Você também pode usar o dd em uma partição para sobrescrever os arquivos excluídos (os arquivos excluídos podem permanecer na partição e descobertos por várias ferramentas de recuperação com vários graus de sucesso até que sejam sobrescritos. Nesse caso, você pode usar o dd para preencher o espaço livre, escrevendo em um arquivo.

dd if=/dev/zero of=/path/to/mount_point/zero_file bs=4096
rm -f /path/to/mount_point/zero_file

Dependendo do que você está fazendo, no entanto, convém usar uma ferramenta alternativa para excluir arquivos com segurança. Consulte Como excluir arquivos de maneira segura? para opções.

Pantera
fonte
6
Se você pudesse gravar em / dev / sdcX e conseguir gravar através de um limite de partição, não seria o dd que ignoraria a tabela de partições - seria o driver de dispositivo de bloco no kernel que estava com bugs e ignorando a tabela de partições.
rackandboneman
11
@sudodus ddnão é tão baixo nível. De fato, a maioria das coisas que as pessoas fazem usando ddpoderia ter sido feita da mesma maneira cat. Na verdade, caté um pouco mais rápido porque usa blocos maiores do ddque o padrão. Todo o código de baixo nível está no kernel. E o motorista realmente não se importa se você estiver usando ddou cat.
kasperd
11
@ududus - desculpe pela confusão, eu não estava tão claro quanto pretendia. O dd certamente pode continuar escrevendo, depende do que você diz para fazer. dd if=/dev/zero of=/dev/sda bs=512 count=1ou dd if=/dev/zero of=/dev/sda bs=512são exemplos. Com o segundo comando, ele continuará gravando e preenchendo o disco inteiro "ignorando" a tabela de partições. Se você especificar uma partição, dd if=/dev/zero of=/dev/sda1ela não irá além da partição. Mais ou menos depende do que você quer fazer com o dd.
Pantera
11
@ Panther A pergunta diz especificamente of=somepartition, portanto, o caso em que você escreve para todo o dispositivo de disco não se aplica. ddnão pode contornar as restrições do driver de dispositivo.
Barmar 26/10
11
@ Bamar ler eu já comentei sobre isso. Tenho visto muitos usuários confundem $ somepartition para / dev / sda
Panther