Limpe os últimos 1 MB de um disco rígido

25

Existe um comando fácil que eu possa usar para zerar os últimos 1 MB de um disco rígido?

Para o início da unidade eu faria dd if=/dev/zero of=/dev/sdx bs=1M count=1. A seekopção para dd parece promissora, mas alguém tem uma maneira fácil de determinar exatamente até onde devo procurar?

Eu tenho um dispositivo RAID de hardware, que armazena algumas das configurações de RAID no final da unidade. Eu preciso que o dispositivo RAID veja as unidades como não configuradas, por isso quero remover a configuração RAID sem precisar gastar tempo para fazer uma limpeza completa das unidades. Eu tenho uma dúzia de unidades de 2 TB e uma eliminação completa de todas essas unidades levaria muito tempo.

Zoredache
fonte

Respostas:

22

A maneira mais simples no Linux de obter o tamanho do disco é com blockdev --getsz:

sudo -s
dd bs=512 if=/dev/zero of=/dev/sdx count=2048 seek=$((`blockdev --getsz /dev/sdx` - 2048))
psusi
fonte
Excelente, eu sabia que deveria haver uma ferramenta que pudesse obter o tamanho facilmente.
Zoredache 30/05
11
Enquanto eu gosto da solução, usar sdacomo exemplo é terrivelmente perigoso se você copiar e colar e conseguir copiar o retorno de carro. sdxseria muito mais adequado. Tomo precauções, mas só por causa delas não destruí meu disco agora.
precisa saber é o seguinte
@ emk2203 Bom ponto. Estou curioso, que precauções você toma para esses cenários?
Hashim
11
Eu uso uma aspas simples antes de colar. Se a linha contiver um retorno de carro, ela será capturada pelo prompt do shell devido ao final ausente da cotação. Se estiver tudo bem, vou para o início da linha com Ctrl-A, apago a cotação e, em seguida, retorno. Mais três pressionamentos de tecla para o seguro, vale a pena.
emk2203
Em vez de / dev / sdx, observe os links em / dev / disk / by-id / como nvme-SAMSUNG_MZVLW1TXXXX-000XX_XXXXXXXXX. ls -l / dev / disk / by-id / mostrará o nome do link e o / dev / sdX ao qual ele está vinculado.
Rcpa0
6

O tamanho de cada partição está disponível no /proc/partitions. O comando a seguir mostra o tamanho de sdx(em unidades de kB):

awk '$4 == "sdx" {print $3}' </proc/partitions

Portanto:

dd if=/dev/zero of=/dev/sdx bs=1k count=1024 \
   seek=$(($(awk '$4 == "sdx" {print $3}' </proc/partitions) - 1024))
Gilles 'SO- parar de ser mau'
fonte
Qual é o motivo do -1024 no final?
Hashim
11
@Hashim A pergunta pergunta como limpar os últimos 1 MB. O último 1 MB inicia 1024kB antes do final.
Gilles 'SO- stop be evil'
3

O uso da busca para chegar ao final da unidade funciona muito bem, ou seja:

buscar = $ (( blockdev --getsz /dev/sda- 2048))

No entanto, quando você usa isso, recomendo que você saiba que seu valor de contagem está correto ou não o use. A razão pela qual digo isso é que as unidades podem ter setores de 512 bytes ou 4k e, se você usar esta solução com uma unidade com 4k setores, não irá para o final da unidade com esse valor de contagem, e pode perder as informações de RAID no final (eu encontrei isso).

J Akers
fonte
Você poderia compartilhar de alguma forma o que exatamente encontrou? Estou intrigado, imaginando se não entendi como os ddsetores são tratados quando usados ​​com bsvalores personalizados menores / maiores que o tamanho real do bloco relatado pelo firmware do dispositivo ou pelo kernel do linux.
sjas
2

Você pode obter o número de setores no disco hdparm -v /dev/sdx. Tente procurar number_of_sectors - 2048 (assumindo setores de 512 bytes).


fonte
O hdparm parece útil, mas como eu verificaria o tamanho do setor?
Peter.O
11
/sys/block/sdx/queue/physical_block_sizepode fornecer as informações, mas alguns discos mais recentes são reproduzidos rapidamente com o tamanho do setor que eles relatam. Provavelmente é melhor ler o rótulo no disco ou procurá-lo na folha de dados do fabricante.
11
Obrigado .. Acabei de notar que hdparm -I /dev/sdalista 2 "versões" do tamanho do setor: Logicale Physical. É isso que você quer dizer com "rápido e solto"? .... I jsut obter esse "sentimento" de que se alguma coisa vai se comportar de tal maneira que poderia muito bem ser um sistema RAID ..
Peter.O
11
@red: Não posso refazer a referência agora, mas li em algum lugar que algumas unidades com setores de 4096 bytes reportam ao sistema que são 512 bytes e depois lidam com a conversão internamente.
1

Você pode usar dde obter o tamanho do dispositivo através de fdisk:

dd if=/dev/zero of=/dev/sda bs=1k \
   seek=$(( (`fdisk -l /dev/sda | grep 'Disk /' | cut -d' ' -f 5` -1024*1024)/1024  )) count=1024

Não estou usando um tamanho de bloco de 1 m para evitar erros de arredondamento.

Como alternativa, você pode escrever um pequeno programa C (ou script) que chama a lseekfunção com SEEK_ENDum deslocamento negativo de 1mb e depois chamar write.

maxschlepzig
fonte