Limpie el último 1 MB de un disco duro


25

¿Hay un comando fácil que pueda usar para poner a cero los últimos 1 MB de un disco duro?

Para el inicio del viaje lo haría dd if=/dev/zero of=/dev/sdx bs=1M count=1. La seekopción para dd parece prometedora, pero ¿alguien tiene una manera fácil de determinar exactamente qué tan lejos debo buscar?

Tengo un dispositivo RAID de hardware, que almacena parte de la configuración RAID al final de la unidad. Necesito el dispositivo RAID para ver las unidades como no configuradas, por lo que quiero eliminar la configuración RAID sin tener que perder el tiempo para limpiar las unidades por completo. Tengo una docena de unidades de 2TB, y un borrado completo de todas esas unidades llevaría mucho tiempo.

Respuestas:


22

La forma más sencilla en Linux para obtener el tamaño del disco es con blockdev --getsz:

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

Excelente, sabía que debe haber una herramienta que pueda obtener el tamaño fácilmente.
Zoredache

1
Si bien me gusta la solución, usarlo sdacomo ejemplo es terriblemente peligroso si copia y pega y logra que se copie el retorno de carro. sdxSería mucho más adecuado. Tomo precauciones, pero solo por eso no destruí mi disco en este momento.
emk2203

@ emk2203 Buen punto. Tengo curiosidad, ¿qué precauciones tiene en su lugar para tales escenarios?
Hashim

1
Utilizo una comilla simple antes de pegar. Si la línea contiene un retorno de carro, es atrapado por el indicador de shell debido al final faltante de la cita. Si todo está bien, voy al comienzo de la línea con Ctrl-A, luego borro la cita y luego regreso. Tres pulsaciones de teclas más para el seguro, valen la pena.
emk2203

En lugar de / dev / sdx, mire los enlaces en / dev / disk / by-id / como nvme-SAMSUNG_MZVLW1TXXXX-000XX_XXXXXXXXX. ls -l / dev / disk / by-id / mostrará el nombre del enlace y el / dev / sdX al que se vincula.
rcpa0

6

El tamaño de cada partición está disponible en /proc/partitions. El siguiente comando muestra el tamaño de sdx(en unidades de KB):

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

Así:

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

¿Cuál es la razón para el -1024 al final?
Hashim

1
@Hashim La pregunta pregunta cómo borrar los últimos 1 MB. El último 1MB comienza 1024kB antes del final.
Gilles 'SO- deja de ser malvado'

3

Usar la búsqueda para llegar al final de la unidad funciona muy bien, es decir:

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

Sin embargo, cuando usa esto, le recomiendo que sepa que su valor de conteo es correcto o que no lo use en absoluto. La razón por la que digo esto es que las unidades pueden tener sectores de 512 bytes o sectores de 4k, y si usa esta solución con una unidad que tiene 4k sectores, no irá al final de la unidad con ese valor de conteo, y puede perder la información RAID al final (me he encontrado con esto).


¿Podría compartir de alguna manera con qué se encontró exactamente? Estoy intrigado y me pregunto si ddentendí mal cómo se dirigen los sectores cuando se usan con bsvalores personalizados más pequeños / más grandes que el tamaño de bloque real informado por el firmware del dispositivo o el kernel de Linux.
sjas

2

Puede obtener el número de sectores en el disco con hdparm -v /dev/sdx. Intente buscar number_of_sectors - 2048 (asumiendo sectores de 512 bytes).


hdparm parece útil, pero ¿cómo comprobaría el tamaño del sector?
Peter

1
/sys/block/sdx/queue/physical_block_sizepuede proporcionarle la información, pero algunos discos más nuevos se reproducen rápido y suelto con el tamaño del sector que informan. Probablemente sea mejor leer la etiqueta en el disco o buscarla en la hoja de datos del fabricante.

1
Gracias. Acabo de notar que hdparm -I /dev/sdaenumera 2 "versiones" del tamaño del sector: Logicaly Physical. ¿Es esto lo que quieres decir con "rápido y suelto"? .... Pero tengo la "sensación" de que si algo se va a comportar de esa manera, bien podría ser un sistema RAID ... "
Peter

1
@red: No puedo encontrar la referencia ahora, pero leí en alguna parte que algunas unidades con sectores de 4096 bytes informarán al sistema que son 512bytes y luego tratarán la conversión internamente.

1

Puede usar ddy obtener el tamaño del dispositivo a travé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

No estoy usando un tamaño de bloque de 1 m para evitar errores de redondeo.

Alternativamente, podría escribir un pequeño programa C (o script) que invoque la lseekfunción con SEEK_ENDun desplazamiento negativo de 1mb y luego llame write.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.