Cancella gli ultimi 1 MB di un disco rigido


25

Esiste un comando semplice che posso usare per azzerare gli ultimi 1 MB di un disco rigido?

Per l'inizio del disco vorrei dd if=/dev/zero of=/dev/sdx bs=1M count=1. L' seekopzione per dd sembra promettente, ma qualcuno ha un modo semplice per determinare esattamente quanto dovrei cercare?

Ho un dispositivo RAID hardware, che memorizza parte della configurazione RAID alla fine del disco. Ho bisogno dell'appliance RAID per vedere le unità come non configurate, quindi desidero rimuovere la configurazione RAID senza dover dedicare del tempo a pulire completamente le unità. Ho una dozzina di unità da 2 TB e una cancellazione completa di tutte quelle unità richiederebbe molto tempo.

Risposte:


22

Il modo più semplice su Linux per ottenere le dimensioni del disco è con blockdev --getsz:

sudo -s
dd bs=512 if=/dev/zero of=/dev/sdx count=2048 seek=$((`blockdev --getsz /dev/sdx` - 2048))

Eccellente, sapevo che doveva esserci uno strumento che potesse ottenere facilmente le dimensioni.
Zoredache,

1
Mentre mi piace la soluzione, usare sdacome esempio è terribilmente pericoloso se copi e incolli e riesci a copiare il ritorno a capo. sdxsarebbe molto più adatto. Prendo precauzioni, ma solo a causa loro non ho distrutto il mio disco in questo momento.
emk2203,

@ emk2203 Un buon punto. Sono curioso, quali precauzioni hai messo in atto per tali scenari?
Hashim,

1
Uso una sola citazione prima di incollare. Se la riga contiene un ritorno a capo, viene catturata dal prompt della shell a causa dell'estremità mancante per l'offerta. Se tutto va bene, vado all'inizio della riga con Ctrl-A, quindi elimino il preventivo, quindi ritorna. Altri tre tasti per l'assicurazione, ne vale la pena.
emk2203,

Invece di / dev / sdx, guarda i collegamenti in / dev / disk / by-id / come nvme-SAMSUNG_MZVLW1TXXXX-000XX_XXXXXXXXX. ls -l / dev / disk / by-id / mostrerà il nome del collegamento e / dev / sdX a cui si collega.
rcpa0,

6

La dimensione di ogni partizione è disponibile in /proc/partitions. Il seguente comando mostra la dimensione di sdx(in unità kB):

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

Così:

dd if=/dev/zero of=/dev/sdx bs=1k count=1024 \
   seek=$(($(awk '$4 == "sdx" {print $3}' </proc/partitions) - 1024))

Qual è il motivo del -1024 alla fine?
Hashim,

1
@Hashim La domanda chiede come cancellare gli ultimi 1 MB. L'ultimo 1 MB avvia 1024 KB prima della fine.
Gilles 'SO- smetti di essere malvagio' il

3

Usare la ricerca per arrivare alla fine del disco funziona molto bene, ovvero:

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

Tuttavia, quando lo usi, ti consiglio di sapere che il tuo valore di conteggio è corretto o di non usarlo affatto. Il motivo per cui dico questo è che le unità possono avere settori a 512 byte o settori a 4k e se usi questa soluzione con un'unità con settori a 4k, non andrai alla fine dell'unità con quel valore di conteggio, e alla fine potrebbero mancare le informazioni RAID (mi sono imbattuto in questo).


Potresti condividere in qualche modo cosa ti sei imbattuto esattamente? Sono incuriosito, mi chiedo se ho frainteso il modo in cui ddindirizzi i settori quando usato con bsvalori personalizzati sempre più piccoli rispetto all'effettiva dimensione di blocco riportata dal firmware del dispositivo o dal kernel di Linux.
sjas,

2

È possibile ottenere il numero di settori sul disco con hdparm -v /dev/sdx. Prova a cercare number_of_sectors - 2048 (ipotizzando settori a 512 byte).


hdparm sembra utile, ma come posso controllare le dimensioni del settore?
Peter

1
/sys/block/sdx/queue/physical_block_sizepotrebbe darti le informazioni, ma alcuni dischi più recenti si muovono velocemente e liberamente con le dimensioni del settore che riportano. Probabilmente è meglio leggere l'etichetta sul disco o cercarla nella scheda tecnica del produttore.

1
Grazie .. Ho appena notato che hdparm -I /dev/sdaelenca 2 "versioni" di dimensioni settoriali: Logicale Physical. È questo che intendi per "veloce e libero"? .... Ho la "sensazione" che se qualcosa si comporterà in questo modo potrebbe essere un sistema RAID ...
Peter.O

1
@red: non riesco a fidare il riferimento ora ma ho letto da qualche parte che alcune unità con settori da 4096 byte segnaleranno al sistema che sono 512 byte e quindi gestiscono la conversione internamente.

1

È possibile utilizzare dde ottenere le dimensioni del dispositivo tramite 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

Non sto usando un blocco di 1 m per evitare errori di arrotondamento.

In alternativa, è possibile scrivere un piccolo programma C (o script) che richiama la lseekfunzione con SEEK_ENDun offset negativo di 1 MB e quindi chiamare write.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.