Habilitando TRIM sobre LVM sobre LUKS num SSD

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

  1. 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
2
GRUB_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"

  1. Camada dm-crypt:
    Atualize o grub:

    1
    # update-grub
  2. Camada dm-crypt:
    Atualize o arquivo /etc/crypttab adicionando ,discard p/ o quarto campo de cada partição encriptada.
    Ex:

    1
    sda5_crypt UUID=989595eb-5327-4c09-adc3-63c4a0c16541 none luks,discard
  3. Camada LVM:
    Em /etc/lvm/lvm.conf habilite o TRIM substituindo 0 por 1 na linha:

    1
    issue_discards = 1
  4. 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`.
  5. Camada Filesystem:
    É o suficiente executar fstrim semanalmente. 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
    2
    3
    4
    #! /bin/sh
    for mount in / /boot /data; do
    fstrim -v $mount
    done

    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
6
root@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
4
Feb 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.
  1. Para verificar se funcionou, reinicie e teste:

    • Ao executar # dmsetup table haverá allow_discards no 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_discards

    • Ao executar # fstrim -v /, não haverá a reclamação fstrim: /: 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.timer para 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/fstab a opção discard. 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.

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 fstrim semanalmente é porque executar fstrim frequentemente ou mesmo utilizar mount -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.