Como habilitar TRIM com SSD USB no Raspberry Pi

Introdução

Venho realizando testes com as melhores formas de realizar o boot no Raspberry Pi. Desde cartões SD de alto desempenho; SSD externo, ligado por USB e também memória eMMC (RPi 4 Compute Module).

Aproveitei a recente redução de preços de SSD SATA, e atualmente, é a melhor opção custo benefício para o Raspberry Pi 4. Como o Raspberry ainda possui muitas restrições de I/O, um SSD SATA atende as necessidades muito bem. Lembrando que a melhor performance ainda continua sendo um SSD Nvme.

Caso esteja utilizando um SSD, independente se for SATA ou NVME, é interessante saber que é possível otimizar a vida útil do mesmo habilitando a funcionalidade do “TRIM” no linux.

Tive sucesso em habilitar o TRIM no meu Raspberry Pi 4. No meu setup utilizei um adaptador USB-SATA da UGREEN e um SSD Samsung EVO 850 de 500GB.

Objetivos

  • Saber o que é o TRIM, e suas vantagens
  • Entender o risco de tentar habilitar o TRIM em uma unidade que não ofereça suporte e causar danos irreversíveis no seu SSD
  • Passo a passo para habilitar o TRIM no raspberry pi em uma unidade de armazenamento que ofereça suporte

Aviso! Este tutorial pode causar danos na sua unidade. Continue por rua conta e risco!

O que é o TRIM?

O termo “TRIM” é referente a uma operação que é realizada em dispositivos de armazenamento de estado sólido, como discos SSD e cartões de memória (SD). O TRIM é uma parte crucial para garantir um desempenho eficiente e uma vida útil prolongada desses dispositivos.

Especificamente, o TRIM é uma operação/comando para a interface ATA. Imagine você utilizando normalmente as informações em sua unidade de armazenamento: copiando novos arquivos e deletando arquivos antigos. Quando realiza estas operações, e diante a estrutura do SSD, é necessário que a unidade garanta que as informações “apagadas” sejam devidamente removidas e que haja espaço disponível para novas informações a serem gravadas. Desta forma, é a funcionalidade do TRIM informar ao seu SSD sobre quais dados podem ser apagados. Pode parecer intuitivo este processo, mas ele depende de suporte tanto do Sistema Operacional, quanto da unidade de armazenamento.

Qual a vantagem do TRIM?

De forma sucinta: o SSD sabe de antemão quais dados foram “removidos” e pode marcar os mesmos como “inválidos”, ou seja, ele não precisa remover os dados naquele momento, pode apenas marcar estes dados para serem apagados em um momento mais ocioso da unidade de armazenamento. Permite que o SSD gerencie de forma mais otimizada os dados, evitando também problemas de “write amplification”, que é uma particularidade da memória flash, pois os blocos/páginas precisam ser apagados antes de serem escritos.

Para fazer mais sentido, imagine que o SSD não saiba de antemão quais dados foram “apagados” pelo usuário. E no momento de escrita de novos arquivos, recebe também a notificação de que precisa sobrescrever certos blocos/páginas para que seja possível gravar todas as novas informações. Mas a memória flash precisa ser apagada, para que nova informação seja gravada, então a característica de sobrescrever nada mais é que um overhead de apagar e depois inserir novas informações: gerando múltiplas operações de leitura e escrita. Como o controlador precisa também trabalhar mais em curtos espaços de tempo, quando há estas operações, também é gerado mais calor. Todo este processo pode acarretar em problemas de desempenho e diminuir a vida útil da unidade.

Lembrando que o TRIM pode receber outros nomes ou agir de formas diferentes em outras interfaces ou diferentes sistemas operacionais. Mas de forma resumida, utilizamos o termo TRIM para exemplificar este processo de gestão ativa do sistema de arquivos. O TRIM trabalha com o Garbage Collector auxiliando no processo de organização, limpeza e otimização do SSD. Um ponto importante, o TRIM é opcional, os SSD também operam normalmente mesmo que o sistema operacional não ofereça suporte.

Mas um aviso! Talvez sua unidade de armazenamento não tenha suporte ao TRIM. Tentar ativar o mesmo para uma unidade que não tenha suporte pode causar problemas irreversíveis. Tornando a unidade “somente leitura” ou mesmo transformando em um peso de papel.

Passo a passo para habilitar suporte ao TRIM no Raspberry Pi

Passo 1 – Condições de Contorno

Para executar este tutorial, é necessário que você tenha um SSD configurado em seu Raspberry Pi. O caso ideal é que você já esteja com o SSD configurado e seu boot é realizado diretamente nele. É interessante não ter outras unidades de armazenamento configuradas, pois pode se confundir durante o processo e tentar habilitar o TRIM em outra unidade, causando problemas.

Como mencionei inicialmente, no meu setup, utilizei:

  • Adaptador USB-SATA da UGREEN
  • SSD SATA 500GB 850 EVO da Samsung

Caso utilize outro equipamento, verificar se estes possuem suporte ao TRIM, para não danificar a unidade de armazenamento.

Passo 2 – Riscos

Estou sendo repetitivo, mas é por uma boa causa. Ficaria muito chateado se seguissem este tutorial e o mesmo causasse qualquer tipo de problema em seu equipamento. Então por favor, se não possuem certeza caso seu equipamento tem suporte ao TRIM, não sigam o tutorial. Existem alguns passos para tentar verificar se o TRIM é suportado, mas não são 100% garantidos. Lembrem que tanto o adaptador USB-SATA, quanto o SSD precisam ter suporte. Se utilizam um SSD USB externo (all-in-one), cuidado em dobro.

Mesmo que utilizem o mesmo equipamento que utilizei, lembrem-se que as empresas podem realizar upgrades e mudanças no equipamento ao longo do tempo e mesmo assim manter o mesmo nome e modelo. Nunca é 100% garantido.

Passo 3 – Verificar se o TRIM já está sendo utilizado

No linux, podemos executar o comando abaixo para verificar se o TRIM está ativado e sendo utilizado:

sudo fstrim -v /

Se receber a mensagem “fstrim: /: the discard operation is not supported” como mostrado na imagem abaixo, então o TRIM não está habilitado.

 

Agora vamos verificar como o SSD USB está sendo montado na unidade:

sudo fdisk -l

Na imagem abaixo, podemos verificar que meu SSD está montado como /dev/sda. Minha partição de boot é o /dev/sda1 e a minha partição do sistema de arquivos está em /dev/sda2.

Uma outra forma de verificar se o TRIM está habilitado no meu SSD, é verificar o valor da variável “DISK-MAX” do comando abaixo:

lsblk -D

No meu caso, tenho as partições do meu SSD com o valor “0B”, que indica que o TRIM não está ativado.

Lembrando que nesta etapa, estamos apenas verificando se o TRIM já está ativado e funcional. Como verificado nos passos acima, não há nenhuma evidência que o TRIM esteja ativado, mas isso não significa que o mesmo não esteja disponível. Dependendo do sistema operacional, o TRIM não vem configurado e ativado por padrão. Nos próximos passos, vamos verificar se meu Adaptador USB-SATA da UGREEN tem suporte ao TRIM com meu SSD.

Passo 4 – Verificar se o dispositivo possui suporte ao TRIM

Para esta etapa, vamos precisar de 2 softwares:

  • sg3-utils
  • lsscsi

Caso já não tenha eles instalados, instalar pelo apt:

sudo apt install sg3-utils lsscsi

Agora vamos precisar verificar o valor das variáveis:

  • Maximum unmap LBA count
  • Unmap command supported (LBPU)

Para verificar o valor da variável “Maximum unmap LBA count“, utilize o comando:

sudo sg_vpd -p bl /dev/sda

Na imagem abaixo, é possível observar que no meu caso, o valor é:

Maximum unmap LBA count: 4194240

Para verificar o valor da variável “Unmap command supported (LBPU)“, vamos utilizar o comando:

sudo sg_vpd -p lbpv /dev/sda

Na imagem abaixo, é possível observar que no meu setup, as saídas:

Unmap command supported (LBPU): 1

O que estas informações das variáveis querem dizer? Bom, caso o valor de “Maximum unmap LBA count” seja maior que ZERO. E caso o valor da variável “Unmap command supported (LBPU)” seja exatamente igual a 1. Então há evidências que seu setup (Adaptador USB/SATA + SSD) tenha suporte ao TRIM.

Então, no meu caso:

  • Maximum unmap LBA count: 4194240 (maior que zero!)
  • Unmap command supported (LBPU): 1 (igual a 1!)

Nesta etapa então, verifiquei que há evidências sobre o suporte ao TRIM no meu setup. Assumi o risco pessoal de tentar habilitar o TRIM, sabendo das consequências negativas caso não tenha suporte.

Passo 5 – Habilitando o TRIM no SSD externo no Raspberry Pi

Para habilitar o TRIM primeiro precisamos verificar o modo de provisionamento atualmente ativo. Precisamos então verificar o conteúdo do arquivo de provisionamento. Execute o comando abaixo:

find /sys/ -name provisioning_mode -exec grep -H . {} + | sort

Ao executar o comando, é feito uma busca pelo arquivo de provisionamento e seu conteúdo. No meu caso, a saída que recebi menciona que o método de provisionamento atual é “full”:

/sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/provisioning_mode:full

Como só tenho um SSD configurado, só recebi a saída em 1 linha. Caso tenha mais de uma unidade de armazenamento configurada, será necessário confirmar qual linha do exemplo acima é referente a qual unidade.

Caso tenha mais de uma saída, é possível identificar qual linha do exemplo acima é referente a cada unidade. Execute o comando abaixo:

sudo lsscsi

No meu caso, o comando acima resultou em:

[0:0:0:0]	disk	Samsung SSD 850 EVO 500G	0	/dev/sda

Na saída do comando é possível verificar um identificador do disco “[0:0:0:0]” referente ao SSD. Vimos no começo do tutorial, que o SSD está configurado em /dev/sda. Se repararmos na saída do comando para verificar o método de provisionamento, vemos que o meu SSD, identificado como “[0:0:0:0]“, tem parte do caminho com o identificador:

"[...]scsi_disk/[0:0:0:0]/provisioning_mode:full"

Confirmado qual o caminho do arquivo de provisionamento do SSD, agora precisamos alterar o método de provisionamento de “full” para “unmap”.

Quando executei o comando “find /sys/ -name provisioning_mode -exec grep -H . {} + | sort” tive como resposta o caminho do arquivo sendo (:full é o conteúdo do arquivo e não faz parte do caminho):

/sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/provisioning_mode

Para verificar o conteúdo deste arquivo, executo o comando:

cat /sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/provisioning_mode

Confirmando então, ele contém a string “full“, que precisamos alterar.

Preciso alterar o arquivo e substituir o seu conteúdo de full para unmap. Para isso, primeiro mude para usuário root:

sudo su

Agora execute o comando:

echo unmap > /sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/provisioning_mode

Agora se verificar o conteúdo do arquivo, vai ver que o mesmo foi atualizado para “unmap”:

cat /sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/provisioning_mode

Agora é necessário calcular o valor para ser inserido na variável “discard_max_bytes”. Para seu cálculo vamos precisar das variáveis:

  • Maximum unmap LBA count
  • Logical block length

O valor de Maximum unmap LBA count é obtido executando o comando:

sudo sg_vpd -p bl /dev/sda

O valor de Logical block length pode ser obtido com o comando:

sudo sg_readcap -l /dev/sda

Lembrando que ambos os comandos acima, /dev/sda é onde meu SSD está montado na unidade. Se o seu estiver com outro caminho, lembre-se de atualizar os comandos acima.

Neste setup, consegui os seguintes valores:

Maximum unmap LBA count = 4194240
Logical block length = 512 bytes

A fórmula para a variável “discard_max_bytes” é:

discard_max_bytes = "Maximum unmap LBA count" * "Logical block length"
discard_max_bytes = 4194240 * 512
discard_max_bytes = 2147450880

Caso faça as contas e consiga valores diferentes, não tem problema. Estes valores podem variar dependendo do seu setup.

Caso não esteja em modo super usuário, é necessário para alterar o arquivo.

sudo su

Execute o comando para atualizar o valor de discard_max_bytes:

echo 2147450880 > /sys/block/sda/queue/discard_max_bytes

Vamos agora confirmar se o TRIM foi habilitado executando o comando:

sudo fstrim -v /

Passo 6 – Ativando persistência no TRIM

É necessário ativar persistência no TRIM, pois senão, caso reinicie o Raspberry, as modificações não serão mantidas.

A primeira etapa é identificar o seu SSD externo. No meu caso, é identificar meu adaptador SATA/USB. É necessário identificar 2 características:

  • idVendor
  • idProduct

Vamos executar o comando “lsusb” para identificar os dispositivos conectados na USB:

lsusb

Ao executar o inspecionar a saída, verifiquei que a seguinte linha era referente ao meu adaptador SATA/USB:

Bus 002 Device 002: ID 174c:1153 ASMedia Technology Inc. ASM1153 SATA 3Gb/s bridge

Da linha acima, temos os valores:

  • 174c = idVendor
  • 1153 = idProduct

A segunda etapa então é adicionar uma regra no udev pra configuração automática do TRIM. Para isto, vamos criar e editar o arquivo com o nano:

sudo nano /etc/udev/rules.d/10-trim.rules

Agora é necessário inserir a linha abaixo dentro do nano, mas você precisa alterar o campo idVendor e idProduct com os dados do seu dispositivo. No meu caso, ficou:

ACTION=="add|change", ATTRS{idVendor}=="174c", ATTRS{idProduct}=="1153", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap"

Passo 7 – Automatizando o processo de execução do TRIM

Por padrão, após configurar e habilitar o TRIM em sua unidade de armazenamento, ele não é executado automaticamente. Então é preciso avisar o sistema operacional para que se encarregue deste processo. Senão, terá que chamar a função fstrim manualmente, toda hora que desejar realizar o trim.

Desta forma, para deixar o sistema operacional encarregado para gerenciar o trim, execute o comando:

sudo systemctl enable fstrim.timer

Tudo certo! Para testar se tudo ocorreu bem, reinicie o Raspberry e execute o comando:

sudo fstrim -v /

Caso seu dispositivo tenha suporte ao TRIM e tenha sido configurado corretamente, o TRIM está habilitado e funcional!

Conclusão

Neste tutorial foi possível verificar os passos para habilitar o TRIM utilizando um SSD externo no Raspberry Pi. O processo envolve poucas etapas, mas possui pequenos detalhes para identificação dos dispositivos que podem aumentar o tempo de implementação do tutorial. Caso possua um dispositivo que forneça suporte, o TRIM é uma excelente alternativa para aumentar a vida útil de unidades de armazenamento de estado sólido, como SSD e cartões de memória (SD).

Qualquer dúvida ou sugestão, basta informar nos comentários!