17 de abril de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Aumentar a vida útil do micro SD no Raspberry

Diagnóstico de rede no Raspberry | Servidor DNS com DNSMasq | Boot do Raspberry pela rede | Raspberry Pi sem vídeo | curso de raspberry | aumentar a vida útil do micro SD

Já escrevi um procedimento para aumentar a vida útil do micro SD nesse outro artigo. Com ele, pode-se até utilizar servidor gráfico se desejado (me refiro ao desktop, com o gerenciador de janelas LXDE, por exemplo). Hoje descrevo outro processo, mas válido apenas para Raspberry sem servidor gráfico, que esteja dedicado a uma aplicação contínua 24×7. Recomendo fortemente o primeiro processo, mas se quer brincar com algo mais elaborado, esse é um bom treinamento.

Como é possível aumentar a vida útil do micro SD?

O grande problema do micro SD é que esse tipo de memória não é muito resistente a gravação e regravação contínua. Por isso, pessoas que usam o sistema com maior intensidade se deparam com problemas de falha, resultando em perda completa do sistema em poucos meses.

Algumas regras básicas devem ser seguidas para aumentar a vida do cartão. Por exemplo, no artigo mencionado ao início podemos definir diretórios que terão permissão de escrita, mas de nada adianta proteger o cartão inteiro e usar um banco de dados em um diretório, que resultará no mesmo problema. Por isso, o primeiro ponto a focar é a eliminação de qualquer agente de gravação contínua no sistema de arquivos.

Outro ponto importante é desabilitar flags do sistema de arquivos que modificam inodes. Para perícia digital ou às vezes uma análise post mortem isso pode ser um problema, mas se o foco é aumentar a vida útil do micro SD, é fundamental utilizar as flags noatimenodiratime, como já descrito no artigo supracitado.

Por fim, o sistema de arquivos em modo somente-leitura será o garantidor desse processo, mas se errar em algum ponto, terá que reiniciar o procedimento. Se não tiver um computador com Linux para acessar o sistema de arquivos raiz no cartão, terá que gravar a imagem novamente. Considerando isso, não faça esse processo em sistemas de produção até que tenha garantido a execução de todos os passos.

 

Procedimento

A primeira coisa a fazer é garantir que está tudo atualizado para evitar problemas durante o processo.

sudo su
apt-get update
apt-get upgrade

Se houve atualização do kernel ou do bootloader, será necessário reiniciar antes de seguir.

Desabilitar a swap

Esse é o pior veneno para o sistema do Raspberry. A swap é um arquivo de paginação de memória; uma “memória virtual”. Isso significa que, se a memória RAM estiver se esgotando, o que estiver em cache será despejado para o arquivo de memória virtual para livrar memória para o sistema. Daí nos deparamos com dois problemas; o sistema ficará significativamente lento se começar a paginar e o cartão será “esmerilhado” pela memória virtual. Se seu sistema está paginando, talvez seja uma boa ideia verificar o que pode ser modificado, inclusive trocando sua Raspberry por uma Raspberry 4 com mais memória, como as vendidas pela MASUGUX.

Para desabilitar a swap sem ter que entrar em detalhes, use os seguintes comandos:

swapoff -a
dphys-swapfile swapoff
cd /etc/rc5.d && unlink S01dphys-swapfile
sudo update-rc.d dphys-swapfile disable

cmdline.txt

Uma coisa muito desejada é que o sistema seja replicável, para quem precisa distribuir uma configuração específica. Nada pior do que fazer perpetuamente a mesma configuração, certo?

Para que seja possível replicar o cartão sem problemas, edite o arquivo /boot/cmdline.txt e troque root=PARTUUID=c1289… por root=/dev/mmcblk0p2 e adicione ao fim da linha o parâmetro ro (que não é fundamental, mas melhor sobrar do que faltar). Não reinicie o sistema até terminar o processo.

A linha deve ficar semelhante a essa:

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait ro

Link simbólico para RAMFS

O Linux tem um recurso magnífico que pode ser usado de diversas maneiras. Escrevi há algum tempo esse artigo sobre a RAMFS, utilizando um processo mais específico. O que precisaremos fazer aqui é redirecionar escritas inevitáveis para outro local. No caso, alguns diretórios de /var, criando um link simbólico para o sistema de arquivos em memória.

Um link simbólico é como um ponteiro (esse exemplo é claro para quem programa em C), ou um “buraco de minhoca” (acho que serve de exemplo para quem curte espaço). Alguns diretórios serão dispostos no cartão através de seus nomes, mas invés de serem diretórios propriamente dito, serão um arquivo descritor que aponta para outro endereço – no caso, a RAM. Precisamos excluir os diretórios originais e recriá-los como link simbólico, dessa maneira:

sudo su
rm -rf /var/{lib/dhcp,lib/dhcpcd5,run,spool,lock}
rm -f /etc/resolv.conf
for line in /var/{lib/dhcp,lib/dhcpcd5,run,spool,lock}; do ln -s /tmp $line;done
touch /tmp/dhcpcd.resolv.conf && ln -s /tmp/dhcpcd.resolv.conf /etc/resolv.conf

Se não está habituado com shell, não se assuste, apenas execute os comandos como descritos acima.

Além disso, uma modificação no dhcpcd5 deve ser feita para apontar o arquivo de pid:

sed -re 's,PIDFile=/run/dhcpcd.pid,PIDFile=/var/run/dhcpcd.pid,' /etc/systemd/system/dhcpcd5.service >/tmp/temp
mv /tmp/temp /etc/systemd/system/dhcpcd5.service

Um último link simbólico será necessário aqui:

rm -f /var/lib/systemd/random-seed
ln -s /tmp/random-seed /var/lib/systemd/random-seed

Edite o arquivo /lib/systemd/system/systemd-random-seed.service e deixe-o assim:

[Unit]
Description=Load/Save Random Seed
Documentation=man:systemd-random-seed.service(8) man:random(4)
DefaultDependencies=no
RequiresMountsFor=/var/lib/systemd/random-seed
Conflicts=shutdown.target
After=systemd-remount-fs.service
Before=sysinit.target shutdown.target
ConditionVirtualization=!container

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/bin/echo "" >/tmp/random-seed
ExecStart=/lib/systemd/systemd-random-seed load
ExecStop=/lib/systemd/systemd-random-seed save
TimeoutSec=30s

E recarregue:

systemctl daemon-reload

Remoção de scripts

Execute esse comando para remover alguns scripts da inicialização:

insserv -r bootlogs && insserv -r console-setup

Agora modifique a tabela de partições, adicionando as flags necessárias. Aproveite para apontar os dispositivos diretamente para os arquivos descritores. Edite o arquivo /etc/fstab e deixe-o assim:

proc            /proc           proc    defaults          0       0
PARTUUID=/dev/mmcblk0p1  /boot           vfat    defaults          0       2
PARTUUID=/dev/mmcblk0p2  /               ext4    defaults,noatime,nodiratime,commit=5,errors=continue,ro  0       1

Esse processo deve ser o suficiente para aumentar a vida útil do micro SD. Reinicie o sistema e desfrute.

Se precisar gravar no sistema, instalar um programa ou algo do tipo, faça:

mount -o remount,rw /

E posteriormente para voltar ao modo protegido:

mount -o remount,ro /

Se você usa a interface gráfica, opte pelo primeiro processo cujo link está no primeiro parágrafo. Nesse caso, é provável que você também utilize o browser para navegar, por isso leia o próximo artigo relacionado, onde mostrarei como apontar o cache do browser para a RAMFS e como iniciá-lo em modo tela cheia para não dar acesso ao desktop.

Até lá!

 

Revisão: Ricardo Amaral de Andrade