El otro día por casualidad, viendo unos shorts de youtube, descubrí, que si incias tu sistema desde un disco SSD en una Raspberry PI, no viene con TRIM activado.
Tener en funcionamiento TRIM, permite al sistema operativo comunicar al disco de estado sólido qué bloques de datos ya no están en uso, como los datos dejados al borrar ficheros, permitiendo que el SO pase esa información al controlador de la SSD, que de otra manera no sabría qué bloques puede eliminar.
Es por ello recomendable activarlo para que el rendimiento del disco duro sea correcto y prolongar su vida útil
¿Tienes TRIM activo?
Para comprobar si TRIM está activo, tienes que ejecutar el siguiente comando en la terminal:
raspberry@pi5:~ sudo fstrim -v /
En mi caso la salida del comando es:
fstrim: /: the discard operation is not supported
Por lo tanto TRIM no está habilitado.
Test de compatibilidad de Trim
Para verificar que TRIM es compatible con el firmware de nuestro disco, ejecutaremos el comando lsblk -D
el cual nos mostrará el nombre con el que se detecta nuestra unidad SSD.
raspberry@pi5:~ lsblk -D
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda 0 512B 4G 0
├─sda1 0 512B 4G 0
└─sda2 0 512B 4G 0
En mi caso se detecta como /dev/sda
Es posible que debas instalar las utilidades para dispositivos que utilizan el conjunto de comandos SCSI «sg_vpd«. Para ello en una terminal escribe:
raspberry@pi5:~ sudo apt install sg3-utils
Ejecutamos el siguiente comando para comprobar el valor de Maximum unmap LBA count
. Este valor nos indica el número máximo de bloques que se podrán marcar como leídos.
raspberry@pi5:~ sudo sg_vpd -p bl /dev/sda
Block limits VPD page (SBC):
Write same non-zero (WSNZ): 0
Maximum compare and write length: 0 blocks [Command not implemented]
Optimal transfer length granularity: 1 blocks
Maximum transfer length: 65535 blocks
Optimal transfer length: 65535 blocks
Maximum prefetch transfer length: 65535 blocks
Maximum unmap LBA count: 4194240
Maximum unmap block descriptor count: 1
Optimal unmap granularity: 1 blocks
Unmap granularity alignment valid: false
Unmap granularity alignment: 0 [invalid]
Maximum write same length: 0 blocks [not reported]
Maximum atomic transfer length: 0 blocks [not reported]
Atomic alignment: 0 [unaligned atomic writes permitted]
Atomic transfer length granularity: 0 [no granularity requirement
Maximum atomic transfer length with atomic boundary: 0 blocks [not reported]
Maximum atomic boundary size: 0 blocks [can only write atomic 1 block]
Seguidamente ejecutamos el siguiente comando para averiguar el valor del parámetro Unmap command supported (LBPU)
raspberry@pi5:~ sudo sg_vpd -p lbpv /dev/sda
Logical block provisioning VPD page (SBC):
Unmap command supported (LBPU): 1
Write same (16) with unmap bit supported (LBPWS): 0
Write same (10) with unmap bit supported (LBPWS10): 0
Logical block provisioning read zeros (LBPRZ): 0
Anchored LBAs supported (ANC_SUP): 0
Threshold exponent: 0 [threshold sets not supported]
Descriptor present (DP): 0
Minimum percentage: 0 [not reported]
Provisioning type: 0 (not known or fully provisioned)
Threshold percentage: 0 [percentages not supported]
Como los valores de los parámetros Maximum unmap LBA count
y Unmap command supported (LBPU)
son mayores que cero, TRIM se puede ejecutar sin problema.
Hacer que el Kernel ejecute TRIM
Ahora veremos si nuestro Kernel detecta que nuestro dispositivo SSD es capaz de marcar los sectores de almacenamiento como libres.
raspberry@pi5:~ sudo find /sys/ -name provisioning_mode -exec grep -H . {} + | sort
Nos devulve lo siguente:
/sys/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb2/2-1/2-1:1.0/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/provisioning_mode:full
Nos devuelve las palabras provisioning_mode:full
en la salida del comando, por lo tanto el Kernel no sabe que nuestro disco duro es capaz de realizar TRIM. Para solucionar esto ejecutaremos los siguientes comandos:
raspberry@pi5:~ sudo su
Ahora como root ejecutamos lo siguiente:
root@pi5:/home/raspberry# echo unmap > /sys/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb2/2-1/2-1:1.0/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/provisioning_mode
Nota: En vuestro caso deberéis reemplazar /sys/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb2/2-1/2-1:1.0/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/provisioning_mode por el texto que hayas obtenido en el salida del comando que habéis ejecutado en el inicio de este apartado.
A continuación volvemos a realizar la misma comprobación que realizamos al inicio de este apartado. Por lo tanto ejecutamos los siguientes comandos:
Salimos del modo root
root@pi5:/home/raspberry# exit
Ejecuta el siguiente comando.
raspberry@pi5:~ sudo find /sys/ -name provisioning_mode -exec grep -H . {} + | sort
/sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-1/2-1:1.0/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/provisioning_mode:unmap
provisioning_mode:unmap
nos asegura que el kernel es capaz de detectar que nuestro disco puede marcar sectores como disponibles.
Número máximo de bytes libres
Tenemos que indicar el tamaño máximo de bytes que se pueden marcar como libres en una sola operación. Para ello lo primero que haremos es conocer el tamaño de un bloque de la unidad SSD ejecutando el siguiente comando en la terminal:
raspberry@pi5:~ sudo sg_readcap -l /dev/sda
Read Capacity results:
Protection: prot_en=0, p_type=0, p_i_exponent=0
Logical block provisioning: lbpme=0, lbprz=0
Last LBA=468862127 (0x1bf244af), Number of logical blocks=468862128
Logical block length=512 bytes
Logical blocks per physical block exponent=0
Lowest aligned LBA=0
Hence:
Device size: 240057409536 bytes, 228936.6 MiB, 240.06 GB
Una vez obtenido el resultado sabemos dos cosas:
Que el tamaño de un bloque es de 512 bytes y que el valor de Maximum unmap LBA count es 4194240. Este valor nos indica el número máximo de bloques que se podrán marcar como libres en una sola operación.
Por lo tanto el número máximo de bytes que se pueden marcar como libres de utilización es:
4194240 bloques x 512 bytes = 2147450880 bytes
Para establecer este valor en la configuración ejecutaremos los siguientes comandos:
raspberry@pi5:~ sudo su
root@pi5:/home/raspberry# echo 2147450880 > /sys/block/sda/queue/discard_max_bytes
Volvamos al comando del principio, aquel con el que comprobamos si TRIM estaba activo. Ahora verás que TRIM se ejecuta sin problema alguno.
raspberry@pi5:~ sudo fstrim -v /
Activar el trim en la Raspberry Pi cada vez que se arranque
Necesitamos que los cambios aplicados sean persistentes la próxima vez que arranquemos la Raspberry Pi
Lo primero será identificar el ID de nuestro adaptador SATA a USB.
Para ello ejecutaremos el siguiente comando:
raspberry@pi5:~ lsusb
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 174c:55aa ASMedia Technology Inc. ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
El valor del identificador de mi dispositivo es 174c:55aa,
Lo segundo será crear una regla udev
raspberry@pi5:~ sudo nano /etc/udev/rules.d/10-trim.rules
Cuando se abra el editor de textos nano pegaremos el siguiente código:
ACTION=="add|change", ATTRS{idVendor}=="174c", ATTRS{idProduct}=="55aa", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap"
Nota: En vuestro caso tendréis que reemplazar los parámetros 174c
y 55aa
por los de vuestro adaptador SATA a USB.
Una vez pegado el código guardaremos los cambios y cerraremos el fichero.
Hacer que TRIM se ejecute de forma automática mediante un servicio de systemd
Finalmente habilitaremos TRIM mediante systemd ejecutando el siguiente comando:
pi@raspberrypi:~ $ sudo systemctl status fstrim.timer
En la imagen superior vemos en letras verdes que el servicio está enabled (habilitado) y active (activo). y no tenemos que hacer nada mas.
Habilitar el servicio fstrim
En caso de no tener «enabled» el servicio, sigue los siguientes pasos:
pi@raspberrypi:~ $ sudo systemctl enable fstrim.timer
y para iniciarlo
pi@raspberrypi:~ $ sudo systemctl start fstrim.timer
Con el servicio de systemd habilitado TRIM se ejecutará de forma totalmente automática una vez por semana. La periodicidad de ejecución se puede modificar, pero una vez por semana es adecuado para prácticamente la totalidad de usuarios.
Visto en GeekLand