Utilidad para RECORTAR el espacio no asignado en la unidad

11

Tengo una unidad (tarjeta SD) con algunas particiones ext4 pero también algo de espacio sin asignar. La fstrimutilidad solo puede funcionar dentro de un sistema de archivos. Antes de reinventar la rueda y escribir una, ¿hay otra utilidad que pueda RECORTAR el espacio no asignado (o que pueda RECORTAR un rango explícitamente especificado)?

Puedo verificar que el controlador no sepa actualmente que la mayoría del espacio no asignado en el dispositivo está libre, ya que he observado que, en esta tarjeta en particular, las lecturas del espacio recortado devuelven 0, pero un escaneo del dispositivo muestra sobran muchos datos basura.

Editar: Tengo un problema al usar hdparm. El siguiente ejemplo descarta el primer sector, pero estoy viendo los mismos resultados independientemente del rango que especifique. fstrimno tiene problemas en el dispositivo:

root@ubuntu:~# hdparm --please-destroy-my-drive --trim-sector-ranges 0:1 --verbose /dev/mmcblk0 

/dev/mmcblk0:
trimming 1 sectors from 1 ranges
outgoing cdb:  85 0d 06 00 01 00 01 00 00 00 00 00 00 40 06 00
outgoing_data:  
00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

ioctl(fd,SG_IO): Invalid argument
FAILED: Invalid argument

Estoy investigando más, pero ¿alguien tiene alguna idea?

Jason C
fuente
1
Si asigna el espacio no particionado con una o más particiones (temporalmente), podría usarlas blkdiscardpara recortar todo el dispositivo.
frostschutz
¡Gracias! Parece la herramienta correcta, pero blkdiscardno parece estar disponible en mis repositorios de paquetes estándar (Ubuntu 12.04, no parece estar presente util-linux).
Jason C
Nunca pude hdparmtrabajar para mí por alguna razón, pero tomé la fuente util-linux de github.com/karelzak/util-linux/tree/stable/v2.23 , lo construí ( ./autogen.sh ; ./configure ; make blkdiscard) y está funcionando muy bien. Todavía desconcertado hdparmpero blkdiscardhace exactamente lo que quiero. Bonificación: no es necesario crear primero un sistema de archivos temporal, puede usarlo sfdisk -lpara calcular el espacio entre particiones y blkdiscardrecortarlo.
Jason C
Oh, ni siquiera sabía blkdiscardque podía trabajar con opciones de desplazamiento / longitud. Entonces, las particiones temporales que sugerí ni siquiera son necesarias. ¡Agradable!
frostschutz

Respuestas:

16

Si tiene una versión suficientemente reciente de util-linux, contiene la herramienta blkdiscardque puede RECORTAR dispositivos completos, o rangos dentro de un dispositivo usando --offsety --lengthopciones.

Tenga en cuenta: blkdiscard es peligroso, si deja que RECORTAR las regiones incorrectas, sus datos se han ido.

Por lo tanto, puede averiguar las regiones no particionadas (libres) de su tabla de particiones y luego RECORTARLAS utilizando esta herramienta. Para msdosy gptparticiones, partedproporciona las regiones libres de esta manera:

# parted -m /dev/sda unit b print free | grep ':free;'
1:17408B:1048575B:1031168B:free;
1:64022904832B:64023240191B:335360B:free;

Agregue un bucle a él ...

while IFS=: read -ra FREE
do
    echo blkdiscard --offset ${FREE[1]%%B} --length ${FREE[3]%%B} /dev/sda
done < <(parted -m /dev/sda unit b print free | grep ':free;')

que imprime

blkdiscard --offset 17408 --length 1031168 /dev/sda
blkdiscard --offset 64022904832 --length 335360 /dev/sda

Verifique que este resultado sea correcto para usted, agregue opciones adicionales si lo desea (¿detallado?) Y finalmente elimine el echopara que se ejecute realmente, y debe estar configurado.

El segundo comando de ese ejemplo en realidad falla porque la longitud es demasiado pequeña: puede valer la pena verificarlo dentro del bucle, ignore las regiones de menos de 1 MB ya que es poco probable que se recorten con éxito.


Si está utilizando LVM en lugar de particiones, puede crear un LV para el espacio desocupado y recortar eso:

lvcreate -l100%FREE -n blkdiscard SSD-VG
blkdiscard -v /dev/SSD-VG/blkdiscard
lvremove SSD-VG/blkdiscard

Si configura issue_discards = 1su lvm.conf, puede omitir la blkdiscardllamada ya que LVM emitirá el TRIM lvremovepor sí mismo.

Frostschutz
fuente
1
¡Gracias! He observado esto como la respuesta porque está funcionando para mí, a pesar de que la respuesta de Michael también es válida. También agregaré lo que dije en los comentarios de la pregunta: si no tiene blkdiscarddisponible; puede obtener la fuente util-linux de github.com/karelzak/util-linux/tree/stable/v2.23 y luego compilar blkdiscard(ejecutar ./autogen.sh ; ./configure ; make blkdiscard): se compiló limpiamente (aunque es posible que tenga que instalar algunas dependencias y configureopciones de ajuste ) y como siempre que no lo instales, no entra en conflicto con el util-linux existente.
Jason C
1
Estaba observando fallas con ciertos valores pasados blkdiscardtambién, pero noté que los valores se basaban en el desplazamiento, no en la longitud. Es posible que haya un problema blkdiscard, estoy en el proceso de investigación. Ver unix.stackexchange.com/questions/98473/…
Jason C el
He creado un script que descarta el espacio libre en todos los sistemas de archivos montados, así como los VG de LVM gratuitos: github.com/stefanct/discard-everything
stefanct
7

hdparm --trim-sector-rangespuede recortar un rango. La página de manual advierte sobre su uso, por lo que es mejor asegurarse de tener el rango y la sintaxis correctos.

Creo que enviar un recorte para todos los datos fuera de una partición sería peligroso, ya que a veces hay algunos datos ocultos como el código del cargador de arranque o las tablas de la segunda partición. Necesitaría saber exactamente qué áreas fuera de las particiones están realmente sin usar.

Michael Suelmann
fuente
¡Perfecto gracias! Puedo tomar el tamaño del dispositivo con hdparmrangos no utilizados sfdisky recortar en consecuencia. Sé lo que hay en el disco. Si hay un esquema de partición que oculta datos en áreas accesibles pero no asignadas, eso rompería la funcionalidad básica de cualquier editor de particiones. Supongo (espero) que cualquier esquema como este haya sido abandonado por mucho tiempo (aunque no conozco ninguno de mi cabeza). Todos los esquemas que conozco almacenan el MBR en un espacio no asignado bien conocido al comienzo del dispositivo, y los VBR / EBR dentro de las particiones asignadas. Puede haber viejos esquemas oscuros que son diferentes. :)
Jason C
Tengo algunas dificultades hdparm, edité mi pregunta con detalles; preguntándome si tienes alguna idea.
Jason C
1
Parece que al menos parte de hdparm no funciona en / dev / mmcblk0. Lo siento, no tengo más idea.
Michael Suelmann