Activar Trim en una Raspberry Pi.

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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio