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,
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á.
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.)
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.
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.
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.
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.
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
/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.Respostas:
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.
ou eu sugeriria
onde
x
está 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/sdx
toda 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?
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á.
fonte
dd
e 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.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.)
fonte
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:dd
não pode sobrescrever partições adjacentes, simplesmente porquedd
não pode sobrescrever partições, ponto .dd
simplesmente escreve para arquivos . É isso aí.Agora, se você passar
dd
um arquivo que representa várias partições,dd
substituirá esse arquivo . Mas, nesse caso, não estádd
gravando além do final da partição.dd
ainda gravará até o final do arquivo e somente até o final do arquivo.Mas, se você passar
dd
um arquivo que representa apenas uma partição,dd
não gravará além do final desta partição. Novamente, isso não tem nada a ver comdd
.dd
simplesmente 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.dd
não tem nada a ver com isso.Então, resumindo:
dd
grava em arquivos. O que esses arquivos representam, nãodd
é motivo de preocupação.dd
não sabe nada sobre partições.fonte
dd
para 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./dev/sda
no seu editor de texto e alterar os dados,dd
não é diferente de nenhum outro programa em termos de poder acessar partições. Resposta muito boa!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:
fonte
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.
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.
fonte
dd
não é tão baixo nível. De fato, a maioria das coisas que as pessoas fazem usandodd
poderia ter sido feita da mesma maneiracat
. Na verdade,cat
é um pouco mais rápido porque usa blocos maiores dodd
que 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 usandodd
oucat
.dd if=/dev/zero of=/dev/sda bs=512 count=1
oudd if=/dev/zero of=/dev/sda bs=512
sã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/sda1
ela não irá além da partição. Mais ou menos depende do que você quer fazer com o dd.of=somepartition
, portanto, o caso em que você escreve para todo o dispositivo de disco não se aplica.dd
não pode contornar as restrições do driver de dispositivo.