Typefully

Krótkie życie MicroSD w Raspberry Pi

Avatar

Share

 • 

15 hours ago

 • 

View on X

Umierające karty MicroSD na Raspberry Pi - brzmi znajomo? Jednak nie u wszystkich one umierają. Czy znam osoby, które na jednej karcie pracowały bezawaryjnie ponad 4 lata? Oczywiście! Jestem taką osobą 😏 OK, to co zrobić, aby taka karta żyła dłużej? Czytaj dalej 🧵 ↓
Pisałem już wpis o tym, że najlepszym wyjściem jest nieużywanie kart wcale i zastąpienie ich przez zewnętrzny dysk. To spoko pomysł, ale dziś skupię się tylko na żywotności kart. Dlaczego więc one umierają? To przez liczbę zapisów/kasowań na karcie, która jest ograniczona.
Szacuje się, że przeciętna karta MicroSD wytrzyma jakieś 1000-3000 pełnych cykli zapisu, a taka 'z TEMU' coś koło 100-1000. W praktyce oznacza to, że na kartę 64GB władujesz TEORETYCZNIE 64TB danych (64GB x 1000), zanim ją zajedziesz. W praktyce kilka razy mniej np. ~16TB.
Skąd ta różnica? Bo istnieje coś takiego jak write amplification (WAF) na pamięciach NAND, czyli kontroler, chcąc zmienić np. 1KB danych, może realnie zapisać równie dobrze 4KB, jak i 4MB - zależnie od charakteru tego, co zapisuje i od karty.
System operacyjny na malince zapisuje logi niemal cały czas. Nawet gdy nic nie robisz (np. w logach ląduje każde odpalenie crona, czy automatyczna aktualizacja systemu). Co z tym można zrobić? Masz dwie opcje - wyłączenie logów albo... wyrzucenie ich do RAM-u.
Pierwsza opcja brzmi mało poważnie, bo nie dowiesz się nigdy, gdy Raspberry zaliczy jakąś wpadkę. Zero możliwości debugowania. Drugą opcję realizujesz, instalując pakiet "log2ram" - znajdziesz go na GitHubie. Twoje logi są w pamięci RAM, ale... czy to nie ryzykowne?
Trzymanie logów na ulotnym storage sugeruje, że przy awarii tracisz wszystko. To nie do końca prawda. Pakiet log2ram co 24h zrzuca logi na dysk, a nie zapisuje ich cały czas. Warto zwiększyć tę częstotliwość synchronizacji np. do 'co 1h', aby nie tracić doby logów przy awarii.
Korzystasz z Dockera na Raspberry? To masz problem, bo log2ram nie łapie jego logów. Pobaw się jednak plikiem /etc/docker/daemon.json i wrzuć tam: { "log-driver": "journald" }
Od teraz Docker będzie logować dane do Journala (/var/log/journal/), a pakiet log2ram obsługuje wszystko z /var/log/, więc od teraz także i Dockera. Poza zabawą w zmniejszenie liczby zapisów istnieją jeszcze inne rozwiązania.
Po pierwsze, kup sobie dobrą kartę - coś z serii 'High Endurance', które wytrzymują czasami 3-4x więcej pełnych cykli zapisu. Po drugie, kup... za dużą kartę. Potrzebujesz 32GB do szczęścia? To załatw sobie 128GB. Żywotność karty liczona jest w PEŁNYCH cyklach.
Po trzecie, nie zapychaj karty. Kontroler rozrzuca dane po wolnym miejscu. Jeśli jest go mało, to te same komórki pamięci są bombardowane zapisami i karta padnie znacznie szybciej.
Po czwarte: backup! Bo nie ma nieśmiertelnych kart. Twoja karta i tak padnie, niezależnie jakie kroki podejmiesz. Możesz jedynie przedłużyć jej życie, ale nie w nieskończoność.
Avatar

Jakub Mrugalski 🔥

@uwteam

🤖 Piszę o technologii, automatyzacji, cybersecurity ✍️ Dokumentuję swoją drogę w biznesie 🖥️ mikr.us ← to moje 😎