¿Cómo recortar / descartar una partición SSD completa en Linux?

28

Mi partición /dev/sda3en una unidad SSD no contiene ningún sistema de archivos, pero contiene basura. ¿Cómo hago una operación TRIM / DISCARD en toda la partición?

pts
fuente
77
Creo que el punto es que no quiere escribir ningún dato, quiere que el SSD BORRE el bloque de memoria flash pero lo deje vacío para que esté disponible para ser escrito, conocido como actualizar una unidad SSD.
Chris Thompson
@joe: su enlace de borrado seguro ATA ni siquiera menciona las particiones. No quiero borrar todo el disco, solo una partición. Y no quiero arriesgarme a borrar accidentalmente todo el disco.
pts
11
@Doc: Llenar la partición con datos basura es todo lo contrario de la intención de los pts: le dirá al SSD que la partición está completamente llena y en uso. Esto disminuirá el rendimiento y la vida útil de la SSD.
Negro

Respuestas:

40

Si su versión de util-linux es lo suficientemente nueva (septiembre de 2012), en realidad hay una herramienta especialmente diseñada blkdiscard, esa es la mejor manera de hacerlo:

sudo blkdiscard /dev/sda3

Pero si necesita compatibilidad con versiones anteriores de distribución de Linux, sigue leyendo ... Hay casos en hdparm/ wiper.shde basura para tocar un volumen porque no es una partición, por lo que necesitamos algo más allá de eso.

La forma más compatible que he encontrado es aprovechar el hecho de que los volúmenes de intercambio de Linux admiten DISCARD cuando están habilitados. El wipefs al final está allí, por lo que el volumen no se reconoce como intercambio más tarde.

D=/dev/sda3 ; mkswap $D && swapon -d $D && swapoff $D && wipefs -o 0xff6 $D

Esto emite el DESCARGO en la mayoría del dispositivo.

robbat2
fuente
1
Gracias, no lo sabía blkdiscard. Comando peligroso ... :)
frostschutz
¿Por qué? Lo acabo de buscar en el manual:WARNING: All data in the discarded region on the device will be lost!
MrCalvin
9

Sé que esta pregunta es bastante antigua, pero ...

La forma más sencilla de hacer esto es simplemente crear un sistema de archivos ext4 en la partición con una versión razonablemente reciente de mkfs.ext4. Lo primero que hace esta herramienta es RECORTAR toda la partición. Una vez que haya hecho eso, puede sobrescribir los datos que se crean con el sistema de archivos que desee.

(Acabo de hacer esto para crear una nueva partición vfat en una tarjeta SD, por ejemplo).

David dado
fuente
¡Gracias por el consejo! FYI Después de TRIMming, escribe algunos bloques con metadatos para un sistema de archivos ext4 vacío, por lo que un pequeño porcentaje de la partición permanece sin TRIM.
pts
44
@pts Puede minimizar el tamaño de los metadatos reduciendo el tamaño del diario y la cantidad de inodos:mkfs.ext4 -J size=4 -N1 /dev/my/device
Aryeh Leib Taurog
2
El uso de @AryehLeibTaurog -E lazy_journal_initparece dar como resultado un poco menos de escrituras que -J size=4lo que hace. (Basado en experimentos usando un archivo disperso en lugar de un SSD físico y dupara verificar cuánto se había escrito)
Kasperd
@kasperd ¡Un experimento inteligente con resultados interesantes! Gracias.
Aryeh Leib Taurog
8

hdparm --trim-sector-range es de bajo nivel, se supone que debe hablar directamente con el SSD, por lo que no depende del sistema de archivos. Lo que wiper.sh hace es usar programas específicos del sistema de archivos para mapear regiones libres (sistema de archivos) a sectores SSD (hardware), ellos usan hdparm para recortarlos.

Respondiendo a la pregunta, puede usar hdparm para recortar esa partición, pero debe tener mucho cuidado . La forma de hacerlo es obtener el rango de sector utilizado por la partición, luego use hdparm en ese rango de sector. Probablemente necesitará pasar varios rangos de sector, ya que cada rango para --trim-sector-range puede tener un máximo de 65535 sectores.

fdisk -l puede decirle el comienzo y el tamaño de las particiones. Preste atención a las unidades que usa fdisk y al tamaño del sector de su SSD.

Ejemplo (mi SSD):

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    39070079    19534016   83  Linux

Para descartar el espacio antes de esta partición, podría recortar (tamaño de 512 bytes, en mis SSD) 2047 sectores a partir de sector 1: hdparm --trim-sector-ranges 1:2047. No puedo recortar a partir del sector 0 porque ese es el MBR (no sé cómo va para GPT).

Para descartar el espacio utilizado por la partición, lo haría hdparm --trim-sector-ranges 2048:65535 67583:65535 133118:65535 .... Puede ser guionizado pero no voy a escribir uno ahora.

También para estar seguro: no estoy garantizando nada aquí, es posible que haya calculado mal los sectores, haga una copia de seguridad de todo antes de usar efectivamente --trim-sector-range.

Nota : si recorta el espacio "vacío" antes de la primera partición, como lo mostré, asegúrese de reinstalar GRUB (o cualquier cargador de arranque que use) antes de reiniciar, ya que GRUB almacena parte de él en sectores "no utilizados" antes de la primera partición . No conozco otros cargadores de arranque, pero supongo que puede ser el caso, así que tenga cuidado.

spuk
fuente
77
wiper.shestá obsoleto por lo fstrimque es mucho más seguro, pero para este uso específico blkdiscardsupera a ambos. En 2013, no hay necesidad de arriesgar rangos de computación manualmente.
Gabriel
6

Puede echar un vistazo a la secuencia de comandos wiper.shincluida con el paquete hdparm. Utiliza el comando hdparm --trim-sector-rangespara RECORTAR todos los sectores vacíos en una partición, al menos si contiene un sistema de archivos ext3 / 4. No estoy seguro de si funciona con particiones sin formato, pero siempre puede formatearlo temporalmente con ext4.

Jaap Eldering
fuente
Formatearlo con ext4 y luego ejecutarlo wiper.shrecortaría casi toda la partición, excepto los metadatos ext4. Pero me gustaría recortar toda la partición.
pts
2
@pts: le sugiero que mire el código de wiper.sh e intente descubrir cómo deduce los rangos de recorte. Luego, puede enviar manualmente un rango de recorte a hdparm para TRIM toda la partición.
Jaap Eldering
4

blkdiscardpuede funcionar en particiones, no solo en unidades completas. Lo probé con éxito en Fedora 20. Revisé las fuentes de blkdiscard: es un programa muy simple que no sabe nada sobre particiones. Supongo que el núcleo hace la traducción.

Tenga mucho cuidado, blkdiscardno haga preguntas y no muestre información de progreso.

Si blkdiscard no está disponible, use este script y alimente su salida a hdparm. El primer argumento es el número de sectores a recortar, el segundo es el primer sector a recortar.

#! /bin/sh
# List ranges for hdparm --trim-sector-ranges-stdin
: ${MAXSECT=65535}
test $# = 2 || { echo "Usage: trimlist sectors offset" >&2; exit 1; }
sectors=$1
pos=$2
while test $sectors -gt 0; do
    if test $sectors -gt $MAXSECT; then
            size=$MAXSECT
    else
            size=$sectors
    fi
    echo $pos:$size
    sectors=$(($sectors-$size))
    pos=$(($pos+$size))
done
proski
fuente
-1

Aquí hay un artículo interesante que habla sobre el uso de HDDErase para invocar la función de borrado seguro incorporada del SSD, que debería obtener lo que desea:

http://www.windowsitpro.com/article/file-systems/q-how-can-i-reset-a-solid-state-disk-ssd-to-a-fully-erased-clean-state-

Chris Thompson
fuente
Gracias por su respuesta, pero no funciona, ya que 1) borra todo el disco 2) requiere Microsoft Windows, y estaba buscando una solución de Linux.
pts
2
Tenga en cuenta también que esto es básicamente lo mismo que blkdiscard --securehace.
ntninja