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
- 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/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
Camada LVM:
Em/etc/lvm/lvm.conf
habilite o TRIM substituindo0
por1
na 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 executarfstrim
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
for mount in / /boot /data; do
fstrim -v $mount
doneO 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 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çã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.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çã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
fstrim
semanalmente é porque executarfstrim
frequentemente 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.