Habilitar TRIM em sistemas usando LUKS não é tão fácil quanto parece pois o TRIM deve ser habilitado em todas as camadas intermediárias entre o SSD e o filesystem. Fiz abaixo uma receita para uso pessoal e que funciona para Debian Jessie e para Fedora 23. No caso do Fedora, os passos 2, 5 e 6 são diferentes e estão listados logo abaixo em seção específica.

Cenário:
- SSD com container criptografado LUKS (dm-crypt).
- dentro do blockdevice criptografado, 1 LVM physical volume com 1 volume group contendo 2 logical volumes.
- 1 lv contém uma partição ext4 (root), o outro contém uma partição swap.
Aviso 1: Como TRIM essencialmente torna claro quais blocos no drive estão em uso e quais não, TRIM é desabilitado por default na camada LUKS. Habilitar TRIM irá vazar um pouco de informação (quantos bytes são usados por sua partição encriptada) e não deveria ser usado em cenário histéricos (a CIA atrás de você).
Aviso 2: O TRIM deve ser aplicado em todas as camadas intermediárias entre o SSD e o filesystem (em nosso caso: dm-crypt, lvm, filesystem).
Passo-a-passo
- Camada dm-crypt:
(Esse passo é necessário apenas para o volume LUKS contendo o filesystem root, caso não seja o caso … ignore. Fonte)
Em /etc/default/grub, adicione p/ as linhas GRUB_CMDLINE_LINUX_DEFAULT e GRUB_CMDLINE_LINUX:
1
cryptdevice=/dev/sdaX:vg_name:discard
Substitua /dev/sdaX pela partição contendo seu volume LUKS e vg_name pelo nome de seu LVM volume group (comando vgscan informa os LVM volume group existentes).
Ex:
1
2GRUB_CMDLINE_LINUX_DEFAULT="quiet cryptdevice=UUID=989595eb-5327-4c09-adc3-63c4a0c16541:dread-note-vg:discard"
GRUB_CMDLINE_LINUX="cryptdevice=UUID=989595eb-5327-4c09-adc3-63c4a0c16541:dread-note-vg:discard"
- Camada dm-crypt:
Atualize o grub:
1 | # update-grub |
- Camada dm-crypt:
Atualize o arquivo/etc/crypttabadicionando,discardp/ o quarto campo de cada partição encriptada.
Ex:
1 | sda5_crypt UUID=989595eb-5327-4c09-adc3-63c4a0c16541 none luks,discard |
- Camada LVM:
Em/etc/lvm/lvm.confhabilite o TRIM substituindo0por1na linha:
1 | issue_discards = 1 |
- Camada LVM || dm-crypt:
Atualize seu initramfs (necessário para mudanças no LVM e/ou dm-crypt):
1 | # mkinitramfs -o /boot/initrd.img-`uname -r`. |
- Camada Filesystem:
É o suficiente executarfstrimsemanalmente. Portanto não adicione a opção em/etc/fstab, mas crie o seguinte script para ser executado semanalmente (arquivo/etc/cron.weekly/fstrim):
1 |
|
O arquivo /etc/cron.weekly/fstrim deve possuir permissão de execução:
1
# chmod +x /etc/cron.weekly/fstrim
Os pontos de montagem (/, /boot, /data) devem ser ajustados à sua realidade. Você receberá um e-mail semanal da quantidade de espaço “trimada“ (trim == aparar/cortar), se preferir não receber … basta remover o argumento -v do fstrim.
Para testar se o script está ok, execute os scripts do diretório /etc/cron.weekly e veja se ele é executado: # run-parts /etc/cron.weekly -v. O parâmetro -v informa o script sendo executado. Exemplo:
1
2
3
4
5
6root@dread-note:~# run-parts /etc/cron.weekly -v
run-parts: executing /etc/cron.weekly/0anacron
run-parts: executing /etc/cron.weekly/fstrim
/: 81,7 GiB (87722549248 bytes) descartado
/boot: 200,9 MiB (210626560 bytes) descartado
run-parts: executing /etc/cron.weekly/man-db
Por meio do log /var/log/syslog podemos verificar a execução dos jobs semanais (procure pela palavra weekly no log). Exemplo:
1
2
3
4Feb 17 10:43:23 dread-note anacron[884]: Job `cron.weekly' started
Feb 17 10:43:23 dread-note anacron[2559]: Updated timestamp for job `cron.weekly' to 2015-02-17
Feb 17 10:43:24 dread-note anacron[884]: Job `cron.weekly' terminated
Feb 17 10:43:24 dread-note anacron[884]: Normal exit (3 jobs run)
- **Obs**: Em 09/03/2015 existia um bug em que o cron.weekly podia não ser executado, em certas circunstâncias, pelo anacron no Debian Jessie - que era *testing* - ([#744753 - anacron: Anacron not triggered when system resumes under systemd - Debian Bug report logs](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=744753)). Não sei se está corrigido atualmente no Jessie como *stable*. Mas sempre podemos invocar manualmente ... ou utilizar outros esquemas para rodar de tempos em tempos.
Para verificar se funcionou, reinicie e teste:
Ao executar
# dmsetup tablehaveráallow_discardsno final da linha correspondente ao seu block device c/ LUKS.
Exemplo:sdaX_crypt: 0 929880064 crypt aes-xts-plain64 0...0 0 8:X 4096 1 allow_discardsAo executar
# fstrim -v /, não haverá a reclamaçãofstrim: /: não há suporte a operação de descarte, e o fstrim concluirá seu trabalho com sucesso:/: 83,2 GiB (89379041280 bytes) descartado.
Modificações para Fedora 23
Substitua os passos 2, 5 e 6 acima por esses:
- Passo 2.
Apenas execute:# grub2-mkconfig -o /boot/grub2/grub.cfg. - Passo 5.
Apenas execute:# dracut -f. - Passo 6.
Apenas execute# systemctl enable fstrim.timerpara automaticamente executar o TRIM semanalmente em todas as unidades montadas que suportam TRIM.
Ps: Para visualizar os logs do service fstrim.timer, execute: journalctl -u fstrim.timer
Bônus
- Partições swap:
- Podem utilizar TRIM. Para tanto, garanta que o TRIM está ativado nos níveis inferiores (dm-crypt e LVM) e ative no filesystem da swap utilizando em sua linha do
/etc/fstaba opçãodiscard. Fonte: Swap Space os SSDs - Solid State Drives - ArchWiki. Exemplo:/dev/mapper/dread--note--vg-swap_1 none swap sw,discard 0 0 - Alguns não habilitam o trim na partição swap, simplesmente evitam ao máximo a escrita na mesma. Como fazer: https://wiki.archlinux.org/index.php/Swap#Swappiness
- Prefiro utilizar swap com TRIM, e caso o sistema realmente utilize a swap no cotidiano … o tweak para reduzir o uso da swap vale a pena tb.
- Podem utilizar TRIM. Para tanto, garanta que o TRIM está ativado nos níveis inferiores (dm-crypt e LVM) e ative no filesystem da swap utilizando em sua linha do
Teoria
fstrim, segundo a descrição do manual ($ man fstrim), discard unused blocks on a mounted filesystem. Por padrão, serão descartados (trim == aparar/cortar) todos os blocos que não estão em uso pelo filesystem.A opção por executar o
fstrimsemanalmente é porque executarfstrimfrequentemente ou mesmo utilizarmount -o discard(ou no/etc/fstab) pode afetar negativamente a performance (e inclusive a vida útil no caso de SSDs de baixa qualidade).Leia obrigatoriamente uma explicação suscinta e didática sobre o tema em How to properly activate TRIM for your SSD on Linux: fstrim, lvm and dm-crypt | synaptic fault.
Links
- Debian Jessie: TRIM on LVM on LUKS on SSD | Off you go… into the purple yonder!: Passo-a-passo de como configurar TRIM no Debian Jessie em que foi inspirado o presente post.
- Solid State Drives - ArchWiki: Informações sobre SSD da ArchWiki, abordando inclusive TRIM em diferentes cenários.
- dm-crypt/Specialties - ArchWiki: Sobre a negativa dos desenvolvedores em habilitar TRIM por default em devices dm-crypt (possibilita obter mais facilmente alguns dados sobre setores livres, nada grave).
- How to properly activate TRIM for your SSD on Linux: fstrim, lvm and dm-crypt | synaptic fault: Melhor explicação didática sobre a teoria e a prática de como funciona o TRIM em SSDs (e o problema que demanda esses cuidados) e como habilitá-lo através das diversas camadas que um filesystem pode estar situado em sistemas GNU/Linux. (Leitura essencial, apesar de no caso de sistemas Debian ser mais prático seguir o passo-a-passo brainless Debian Jessie: TRIM on LVM on LUKS on SSD)
- What is the correct way to setup the fstrim service on an encrypted SSD in Fedora 23? - Ask Fedora: Community Knowledge Base and Support Forum: Link com as peculiaridades do Fedora 23.