Tu lógica no es incorrecta. Pero solo es válido si se cumplen algunas condiciones.
El comando TRIM , como se especifica en el conjunto de comandos ATA , puede o no poner a cero los sectores contra los que se emite.
En realidad, el estándar se centra en qué datos deben devolverse después de que se haya emitido TRIM 1 :
Este estándar especifica los siguientes comportamientos para los sectores que el dispositivo recorta (ver 7.5.3.3):
a) no determinista: los datos en respuesta a una lectura de un sector recortado pueden cambiar para cada lectura hasta que el host escriba el sector;
b) Lectura determinista después del recorte (DRAT): los datos devueltos en respuesta a una lectura de un sector recortado no cambian, pero pueden ser diferentes a los datos que se devolvieron previamente; y
c) Leer ceros después del recorte (RZAT): los datos devueltos en respuesta a una lectura del sector recortado son cero.
[...] Tanto para dispositivos de almacenamiento DRAT como no deterministas, los datos devueltos en respuesta a un comando de lectura a un LBA que se ha recortado correctamente:
a) pueden ser los datos devueltos previamente para el LBA especificado;
b) puede ser un patrón generado por el dispositivo de almacenamiento; y
c) no son datos previamente escritos en un LBA diferente por el host.
Por lo tanto, lo que devuelve su dispositivo fstrim
depende de las características que implementa. A menos que sea compatible con RZAT, la suposición de que los datos leídos desde un dispositivo recortado serán solo ceros no es válida.
Puede usar hdparm
para verificar esto:
sudo hdparm -I /dev/sdX | grep -i trim
Realicé algunas pruebas usando dos SSD sda
y sdb
. Mismo fabricante, diferentes modelos, con diferente conformidad ATA:
$ sudo hdparm -i /dev/sdb
...
Drive conforms to: Unspecified: ATA/ATAPI-3,4,5,6,7
...
$ sudo hdparm -i /dev/sda
...
Drive conforms to: unknown: ATA/ATAPI-2,3,4,5,6,7
...
Los dos SSD tienen soporte diferente para TRIM:
$ sudo hdparm -I /dev/sda | grep -i trim
* Data Set Management TRIM supported (limit 1 block)
$ sudo hdparm -I /dev/sdb | grep -i trim
* Data Set Management TRIM supported (limit 8 blocks)
* Deterministic read ZEROs after TRIM
Puedo confirmar que, después de emitir fstrim
, la unidad que admite "CERO de lectura determinista después de TRIM" (RZAT) parece haber puesto a cero la partición en cuestión casi por completo. Por el contrario, la otra unidad parece haber puesto a cero (o de lo contrario reemplazado por algún patrón altamente compresible) solo una parte menor del espacio liberado.
1 Fuente en línea: INCITS 529: Tecnología de la información - Conjunto de comandos ATA / ATAPI - 4 (ACS-4)
Nota sobre las pruebas:
Como señaló frostschutz en los comentarios, una lectura posterior fstrim
puede devolver datos del caché del sistema operativo y no del dispositivo recortado. Es, por ejemplo, lo que sucedió en esta pregunta .
(También señalaría esta respuesta a la misma pregunta para un método alternativo para probar TRIM).
Entre fstrim
y una lectura posterior, es posible que deba soltar el caché, por ejemplo, con:
echo 3 | sudo tee /proc/sys/vm/drop_caches
Dependiendo del tamaño de la partición con la que está jugando, no soltar el caché puede ser suficiente para que sus pruebas fallen.
Nota sobre su configuración:
La discard
opción de montaje habilita el ajuste continuo, es decir, cada vez que se eliminan los archivos. No es requerido por fstrim
. De hecho, TRIM a pedido y TRIM continuo son dos formas distintas de gestionar las operaciones TRIM. Para obtener más información, quisiera señalar la unidad de estado sólido en Arch Linux Wiki, que tiene una cobertura detallada de este asunto.
dmsetup table | grep allow_discards