Manual

do

Maker

.

com

Reparar o SPIFFS no ESP8266 com MicroPython

Reparar o SPIFFS no ESP8266 com MicroPython

Não é uma solução mágica, mas é melhor do que fazer o flashing outra vez.

Em revisão ao artigo: Atualmente o sistema de arquivos do ESP é o LittleFS. Não pude confirmar ainda se é mais estável, mas enquanto houver suporte ao SPIFFS, a dica segue valendo. Depois, para fins históricos (Abril 2017).

Estou com 2 ESP8266 que ficam ligados 24x7 e em um deles em determinados períodos o sistema de arquivos corrompe. Já fiz alguns flashings, então decidi dar uma pesquisada para ver se tinha outra forma de amenizar o problema. Tem, mas não é tão simples nem tão legal.

Faça backup dos seus arquivos

Do mesmo modo que em seu computador pessoal, faça backup dos arquivos do ESP8266. Utilize o WEBREPL para essa tarefa. Se não conhece ainda ou se não lembra como usa, vou deixar as dicas.

WEBREPL

Você precisará habilitar o serviço no ESP8266 e fazer o download do client. Para habilitá-lo no ESP8266, simplesmente faça a conexão serial e digite:

import webrepl_setup

Em seguida ao prompt, digite "E" e então digite uma senha. Por fim, você será questionado sobre o reset. Confirme com "y".

Pegue o client nesse endereço do github. Após baixá-lo, bastará copiar os arquivos contidos na flash do ESP8266. Para saber quais são, na conexão serial digite:

import os
os.listdir()

No client, utilize algo como:

python ~/webrepl/webrepl_cli.py 192.168.1.10:boot.py .

Esse comando copia o arquivo boot.py para o diretório atual. Faça isso para todos os arquivos, criando um diretório para armazená-los.

Sistema de arquivos corrompido

Quando seu sistema de arquivos corromper, mais nada será executado, porque não há mais arquivos para executar, porém o sistema todo estará funcionando. Quando seu sistema de arquivos estiver corrompido, você deverá ver algo assim ao tentar listar a flash:

fs_corrupted.png

Parecido com o comportamento dos mount points do Linux, você pode montar e desmontar a flash:

import uos
uos.umount("/flash")

import inisetup
inisetup.check_bootsec()

Ele deverá retornar uma mensagem parecida com essa:

The FAT filesystem starting at sector 144 with size 875 sectors appears to be corrupted. If you had important data there, you may want to make a flash snapshot to try to recover it. Otherwise, perform factory reprogramming of MicroPython firmware (completely erase flash, followed by firmware programming).

Só que isso permanecerá em um loop, portanto interrompa com Ctrl+C.

Para formatar e montar o sistema de arquivos , use esses comandos:

import uos
uos.VfsFat.mkfs(bdev)
vfs = uos.VfsFat(bdev)
uos.mount(vfs,"/flash")
uos.listdir("/flash")

Nesse ponto você já deve ter o sistema de arquivos devidamente funcional, mas ainda não pode reiniciar o ESP8266 porque não tem o arquivo de boot. Nesse momento, você deve criá-lo, ainda que depois você o substitua pelo arquivo boot.py que você fez download:

uos.chdir("/flash")
with open("boot.py", "w") as f:
        f.write("""\
import gc
gc.collect()
""")

Agora você já pode fazer um reset do ESP8266:

import machine
machine.reset()

Após o reset o sistema deve voltar a funcionar normalmente, mas no meu caso eu cometi um erro de identação no boot.py e o webrepl não iniciou. Nesse caso, inicie-o manualmente:

import webrepl
webrepl.start()

Como eu já tinha uma série de arquivos no sistema de arquivos do ESP8266 (e como uso Linux), fiz um loop no shell para copiar os arquivos com o webrepl_cli:

ls *.py|while read line; do python ~/webrepl/webrepl_cli.py $line 192.168.1.10:/flash/;done

Desse modo, só tive que digitar a senha a cada arquivo em linha de transferência. No meu caso, ainda tinha o umqtt (que é um diretório) a ser transferido. Primeiro criei o diretório remoto, entrei no diretório local e transferi com quase o mesmo comando. Primeiro na conexão serial:

os.mkdir("/flash/umqtt")

Depois, a tranferência a partir do computador:

cd umqtt
ls *.py|while read line; do python ~/webrepl/webrepl_cli.py $line 192.168.1.10:/flash/umqtt/;done

Pronto para o reset:

import machine
machine.reset()

E tudo estará funcionando novamente!

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.