Alles over de gezondheid van SD-kaarten / microSD-kaarten op de Raspberry Pi

De SD-kaart is - naast de voeding - een kritisch extra onderdeel van de Raspberry Pi. De gezondheid van de SD-kaart in de gaten houden is erg belangrijk voor een soepele werking van uw Raspberry Pi besturingssysteem en een goede gebruikerservaring. Dit artikel zal u verschillende manieren tonen om de gezondheid van uw microSD-kaart te controleren en te bewaken.

Eerst zal ik een diepgaand overzicht geven van hoe geheugenkaarten werken, zodat u de mogelijkheden en beperkingen kunt begrijpen van het controleren van de gezondheidstoestand van uw SD-kaart. Daarna zal ik uitleggen hoe u uw microSD-kaart kunt beschermen door veelvoorkomende problemen die Raspberry Pi-gebruikers ervaren te verminderen. We zullen ook ingaan op de beste microSD-kaartmerken voor Raspberry Pi die we aanraden. Als je wilt, kun je ook verder naar beneden gaan, om alleen de Linux commando's te krijgen om de huidige microSD kaart staat te controleren.

Grondbeginselen: Binnenkant van de microSD-kaart

Inneres einer microSD Karte
Afbeelding: Illustratie van de binnenkant van een SD-kaart. De microSD-kaart heeft een soortgelijke structuur. Afbeelding bron: CC-BY-SA Korpsvart, Wikimedia Commons

De microSD-kaart bevat een flash-geheugenchip (links op de foto), en een microcontroller (rechts op de foto, meestal ARM-gebaseerd).

Flash

Flashgeheugen slaat informatie op door "vangen" elektronendie met hoogspanning door een niet-geleider worden "geïnjecteerd" in een zgn. vlottende poort(**). De elektronen maken dus deel uit van een transistor die al dan niet een aangesloten stroom kan laten lopen, afhankelijk van de lading van de zwevende poort. Theoretisch kunnen ze niet wegvloeien, omdat de zwevende poort elektrisch geïsoleerd is. Dit betekent dat de informatie ook na het uitschakelen van de stroomvoorziening behouden blijft.

De informatie wordt steeds afgelezen tussen bron (S) en drain (D). Elektronen die in de zwevende poort worden gebracht, verhogen b.v. de drempelspanning van de transistor, van waaruit stroom zou gaan lopen. De transistor blokkeert dan bij een normale leesspanning (geleidt niet).

Voor het programmeren van de zwevende poort worden aanzienlijk hogere elektrische spanningen (b.v. 10 V) gebruikt dan voor de normale leesoperatie (b.v. 3,3 V). Voor dit doel wordt bovendien de stuurpoort (V1/V2/V3) gebruikt.

Voor het wissen worden de elektronen weer uit de zwevende poort gedreven door een hoge negatieve spanning aan te leggen via de controlepoort.

NAND flash componenten die in microSD kaarten worden gebruikt groeperen de individuele geheugentransistors in pagina's, en verschillende van de pagina's in blokken. Een pagina heeft tussen 512 en 8192 bytes, een blok kan tot 256 pagina's bevatten (dus een totaal van 2048 kB met een paginagrootte van 8 kB).

Schrijven (voor een logische "1") kan bitsgewijs of ten minste byte-woordgewijs. Wissen (bij een logische "0") kan alleen bloksgewijs. Informatie die niet is gewijzigd, moet toch weer worden ingeprogrammeerd.

Flashgeheugens hebben een beperkte levensduur als gevolg van programmeren en wissen, die wordt gegeven in wiscycli

De reden voor de beperkte levensduur is beschadiging van de isolerende oxidelaag, die de zwevende poort beschermt tegen het weglekken van lading, veroorzaakt door de hoge spanningen. Zodra deze laag geleidend wordt, kan er geen informatie meer in de geheugencel worden vastgehouden.

Terzijde: Multi-level celgeheugen cellen

Aanvankelijk waren er slechts twee ladingstoestanden (1 bit aan informatie) per geheugencel. Dankzij meerdere floating gates per transistor slaan geheugencellen met meerdere niveaus nu verschillende ladingstoestanden en dus meerdere bits per geheugentransistor op. De transistor geleidt dan de aangelegde stroom verschillend, hetgeen bij het uitlezen wordt geëvalueerd.

Enerzijds kan daardoor de dichtheid van de geheugencellen aanzienlijk worden verhoogd, maar anderzijds verloopt het uitlezen langzamer en reageren de geheugencellen veel gevoeliger met bitfouten op ladingverliezen. Met single-level cellen zijn 100.000 tot 1.000.000 write-erase cycli mogelijk, met TLC's (triple-level cellen met drie bits per geheugencel) ca. 1000 write-erase cycli.

Dit is de reden dat industriële SD-kaarten gewoonlijk een lagere geheugendichtheid hebben, en SLC (single level cells) gebruiken, voor een betere gegevensintegriteit.

De controleur

De controller heeft tot taak de flitser te beheren, en in het bijzonder om nivellering van slijtage en correctie van leesfouten. De prestaties en de levensduur van de microSD-kaart hangen in beslissende mate af van de algoritmen die in de controller worden gebruikt.

Flash-geheugen kan niet zo vaak worden herschreven als nodig is vanwege beschadiging van de isolerende oxidelaag van de zwevende poorten, zoals hierboven beschreven. Om beschadiging van afzonderlijke gebieden die bijzonder vaak worden gebruikt te voorkomen, de controller varieert de fysieke toewijzing tot de blokken die logisch kunnen worden aangesproken door het bestandssysteem (= wear leveling).

Deze variatie van de fysieke toewijzing is ook de reden dat het schrijven-testen van de SD-kaart (door te schrijven & lezen met bad block tools, enz.) in feite niet de echte slechte blokken zal identificeren en u in staat zal stellen om ze te vermijden op het besturingssysteem / bestandssysteem niveau! Alleen de flash-geheugen-controller in de microSD-kaart weet welk blok op een bepaald moment wordt geschreven naar / gelezen van, en zoals besproken kan dit in de loop van de tijd veranderen.

Defecte blokken (slechte blokken) zijn al aanwezig in gloednieuwe flash-geheugens. Deze defecte blokken worden gemarkeerd in een speciaal gebied van het flash-geheugen.

Foutcorrectie-informatie voor individuele blokken wordt ook beheerd, zodat leesfouten kunnen worden gecorrigeerd door middel van checksums. De controller voegt blokken met geclusterde leesfouten toe aan de lijst van slechte blokken, en verschuift de feitelijke fysieke toewijzing van het logische blok.

De microSD-kaart heeft gewoonlijk - afhankelijk van de fabrikant - ongeveer 10% reservecapaciteit om de slechte blokken te vervangen door goede "reserveblokken".

Vieze kleine geheimpjes: Flash geheugen problemen

Verwijdering is alleen met de klok mee

Gegevens kunnen alleen blok voor blok worden gewist. Wissen zet de geheugencellen onder druk en verkort hun levensduur - er worden nieuwe slechte blokken gecreëerd.

Defecte blokken uit de fabriek

Flashgeheugens worden reeds met defecte blokken geleverd. In de loop van het gebruik worden nog meer defecte blokken (slechte blokken) toegevoegd. Daarom probeert de controller door middel van wear-leveling de blokken zo gelijkmatig mogelijk te verdelen.

MLC en TLC bijzonder gevoelig

Geheugencellen met meerdere niveaus (MLC's) verminderen het aantal wiscycli en daarmee de betrouwbaarheid op lange termijn.

Lees Storen

Een fenomeen dat ik nog niet heb genoemd, maar dat bijzonder verraderlijk is, is Lees Storen. Zelfs wanneer alleen van de kaart wordt gelezen, kan dit - alleen al door het lezen - ertoe leiden dat naburige geheugencellen in hetzelfde blok hun programmering wijzigen. De waarschijnlijkheid dat dit gebeurt neemt sterk toe na een paar 100.000 lezingen.

Om Read Disturb te vermijden logt de controller daarom het aantal toegangen tot een blok, om het in één stuk naar een nieuwe locatie te kopiëren wanneer een drempel wordt overschreden, en het oorspronkelijke blok te wissen. Daarna kan het blok opnieuw worden gebruikt.

Dit zijn allemaal dingen die een controller moet compenseren om ons voor te houden dat het aan de buitenkant een "perfecte geheugenkaart" is, terwijl hij er aan de binnenkant allesbehalve perfect uitziet!

Tenslotte kunnen door röntgenstralen geschreven bits onbedoeld worden gewist. Hier kan alleen een röntgenveilig ontwerp van de kaart ervoor zorgen dat de gegevens intact blijven.

Fabrikant en selectie van een goede kaart

Zowel de microcontroller en de flashapparatuur als de afgewerkte microSD-kaart kunnen van verschillende fabrikanten afkomstig zijn - de Panasonic SD-kaart in de voorbeeldfoto heeft een Samsung flash, en de controller is in Japan gemaakt.

NAND-flashapparatuur wordt door vier fabrikanten geproduceerd:

  • Samsung <- marktleider
  • Toshiba
  • IM Flash Technologies (joint venture tussen Micron Technology en Intel)
  • Hynix in samenwerking met Numonyx

Toshiba en Samsung produceren het merendeel van alle chips.

SanDisk

TL;DR aanbevolen

SanDisk en Toshiba hebben een joint venture voor flashproductie. In 2009 heeft SanDisk de rechten op de fabrieken echter overgedragen aan Toshiba om een fabrikant van flashgeheugen zonder fabrieken. Geheugenontwikkeling gebeurt nog steeds samen. SanDisk en Toshiba zijn, samen met Matshushita, de grondleggers van de SD-standaard, die in 1999 werd geïntroduceerd. De microSD-standaard is ook door SanDisk bedacht.

Wij vertrouwen al geruime tijd op het merk SanDisk en hebben er tot nu toe zeer goede ervaringen mee gehad.

Samsung

TL;DR aanbevolen

Samsung geheugenkaarten worden ook vaak aanbevolen. Als marktleider op het gebied van NAND-flash kan Samsung alle componenten van de SD-kaart perfect op elkaar afstemmen en beschikt het over alle noodzakelijke informatie voor een solide product.

Kingston

TL;DR NIET aanbevolen

We hadden een slechte ervaring met de betrouwbaarheid van 128 GB Kingston kaarten in een kritiek project. Kingston heeft geen eigen fabrieken, en koopt overtollige capaciteit van andere flash-fabrikanten. Als gevolg daarvan kunnen consistente prestaties niet worden gegarandeerd.

De volgende artikel door Bunny Huang is ook interessant in deze context.

Toshiba

Toshiba, als de #2 op de wereldwijde DRAM-markt, verkoopt ook zijn eigen geheugenkaartproducten. SanDisk en Toshiba zijn, samen met Matshushita, de grondleggers van de SD-standaard, die in 1999 werd geïntroduceerd. Wij hebben tot dusver geen ervaring met Toshiba-kaarten.

Transcend / Silicon Power

We hebben ook Transcend en Silicon Power kaarten gebruikt, vooral in het goedkope segment. De kaarten zijn in principe goed, maar we hebben bij Transcend meer retourzendingen / defecten gezien dan bij SanDisk. Voor kritische projecten zou ik daarom eerder SanDisk / Samsung aanraden.

Een goede geheugenkaart kiezen

Om een goede geheugenkaart te kiezen, moet u eerst de fabrikant kiezen. Wij adviseren Samsung of SanDisken mogelijk Toshiba, voor de shortlist.

Vervolgens moet de geheugenklasse in aanmerking worden genomen. Deze klasse geeft de hoogste schrijfsnelheid blok voor blok aan. Het is niet de schrijfsnelheid voor verspreide random access writes, die zinvoller is in real-world toepassingen.

Een hogere klasse is duurder, maar wordt aanbevolen vanwege de aanzienlijke prestatieverhoging. Wij verzenden gewoonlijk klasse 10 kaarten.

In dit overzicht op eLinux.org een geschikte geheugenkaart kan dan worden gecontroleerd op compatibiliteit met de Raspberry Pi. Belangrijke opmerking: de firmware van de Raspberry Pi is verschillende keren gewijzigd voor een betere compatibiliteit met geheugenkaarten en om gegevenscorruptie te vermijden.

U moet bestellen bij betrouwbare bronnen - bijvoorbeeld, krijgen we onze SanDisk microSD kaarten rechtstreeks bij Raspberry Pi Trading, en gerenommeerde, grote Duitse distributeurs. Op Amazon, zorg ervoor dat u rechtstreeks bij Amazon bestelt, niet bij een marktplaatsverkoper.

Bepaalde informatie (cid, csd, datum, manfid, oemid, serie) van de microSD-kaart kan worden gelezen met Linux om te controleren of u de juiste fabrikant hebt ontvangen. Voorbeelden met een Transcend kaart:

cd /sys/class/mmc_host/mmc?/mmc?:*
echo "man:$(cat manfid) oem:$(cat oemid) name:$(cat name) hwrev:$(cat hwrev) fwrev:$(cat fwrev)"
 man:0x000074 oem:0x4a60 name:USD hwrev:0x1 fwrev:0x0
echo "serial:$(cat serial) mdt:$(cat date)"
serial:0x401e39f2 mdt:03/2017

De fabrikant ID (manfid) wordt toegewezen door SD-3C LLC, alsmede de OEM / Application ID (oemid). De oemid identificeert de OEM van de kaart en/of de inhoud van de kaart.

De productnaam (naam) is 5 tekens lang (ASCII). hwrev is de hardware revisie, en fwrev de firmware revisie. Samen vormen zij de productrevisie (hwrev.fwrev).

De serieel is het serienummer van de microSD-kaart, het is een 32-bits veld dat moet worden gelezen als een niet-ondertekend geheel getal.

De mdt (Fabricagedatum) geeft aan wanneer de kaart werd vervaardigd - jaar en maand.

De waarden kunnen worden vergeleken met de waarden op websites om fraude door valse microSD-kaarten op te sporen. Ik raad aan het volgende te lezen Bunny's blog artikel (een) en dit artikel (twee).

Stabiel man/oem combinaties van een merk wijzen op een goed gecontroleerde en consistente toeleveringsketen. SanDisk heeft bijvoorbeeld de volgende combinatie voor alle vermeldingen in de eLinux.org Wiki: man:0x000003 oem:0x5344. Andere merken, zoals Transcend, variëren hun leveranciers, zodat een constante kwaliteit niet langer kan worden gegarandeerd.

Corruptie van gegevens tijdens de werking voorkomen

De microSD-kaart is de "harde schijf" van de Raspberry Pi. In een normale Linux-configuratie wordt hij op precies dezelfde manier behandeld als een harde schijf - zowel lees- als schrijftoegang vinden plaats. Linux logt informatie naar vele logbestanden, en werkt onder andere de toegangstijden van bestanden bij. Gegevens worden dus vaak gewijzigd en overschreven. Dit is iets waar microSD-kaarten in de eerste plaats nooit voor zijn ontworpen.

Tip #1: Sluit Raspberry Pi goed af & gebruik een goede voeding

Je zou ook niet zomaar de stekker uit een Windows-computer trekken. Met Linux computers, en vooral de microSD kaart-ondersteunde Raspberry Pi's, is het slechts een kwestie van tijd voordat er datacorruptie optreedt tijdens stroomonderbrekingen.

Linux heeft lees-schrijfcaches om bestandsbewerkingen te versnellen. Als u gewoon de stekker uit de Pi trekt, kunt u de informatie in de schrijfcaches verliezen die nog niet naar de microSD is geschreven.

Zoals eerder vermeld, verschuift de microSD-controller actief gegevens tijdens runtime voor wear-leveling, en het vermijden van leesstoringen. Dit gebeurt zonder medeweten van het Linux systeem ("transparant"). En afhankelijk van de fabrikant, meer of minder conservatief. Ook hier - vooral tijdens schrijfoperaties! - kunnen gegevens beschadigd raken en verloren gaan.

U moet er dus voor zorgen dat, na het afsluiten van uw Pi, de ACT-LED van de Raspberry Pi stopt met knipperen, en dan pas de stroom eraf halen.

Een slechte voeding kan ook leiden tot problemen als gevolg van brownouts (onderspanning). Gebruik in geval van twijfel de door Raspberry Pi Trading aanbevolen / geleverde voeding.

Tip #2 alleen-lezen systeem met overlays

Een alleen-lezen systeem beschermt de SD-kaart niet tegen leesstoring, en dus tegen veroudering door de noodzakelijke wiscycli. Dit gebeurt echter veel langzamer dan bij actief schrijven.

Een alleen-lezen bestandssysteem heeft ook andere voordelen, bijvoorbeeld minder controles van het bestandssysteem bij het opstarten.

Vooral embedded systemen - d.w.z. systemen die voor een specifiek doel zijn ontwikkeld en vervolgens in een toepassing worden geïnstalleerd (b.v. digital signage) hebben niet noodzakelijkerwijs de mogelijkheid nodig om voortdurend nieuwe software te installeren en ter plaatse nauwkeurige logboeken bij te houden. De logs kunnen via het netwerk naar een centrale server worden gezonden (zo nodig met vertraging), en voor systeemupdates kan het systeem in onderhoudsmodus worden gezet om de updates toe te passen.

Hier is wat informatie van het Debian project waarop Raspbian is gebaseerd: https://wiki.debian.org/ReadonlyRoot.

Met behulp van RAM-schijfoverlays (in tmpfs) kan een systeem nog steeds logbestanden schrijven, of wijzigingen in bestanden aanbrengen. De RAM-schijf-overlays zouden periodiek gesynchroniseerd kunnen worden met speciaal aangewezen partities op de SD-kaart. Voorzichtigheid is geboden met de RAM-schijf, zodat deze niet overloopt (door de logbestanden), en er is natuurlijk minder RAM-geheugen beschikbaar voor normale activiteiten.

Wij gebruiken deze techniek met ons product Anonymeboxwaarbij moet worden aangenomen dat de gebruikers gewoon de stekker uit het stopcontact halen.

Bent u op zoek naar een partner om een solide read-only oplossing voor uw embedded Raspberry Pi project te realiseren? Wij (als pi3g e.K.) bieden advies & ontwikkelingsdiensten aanvoor hardware en software.

Tip #3 Vermindering van schrijfoperaties

Vooral bij oudere kernels werkt Linux de toegangstijd bij voor elke bestandstoegang, volgens de POSIX-standaard. Dit betekent dat elke leesoperatie automatisch resulteert in een schrijfoperatie. Er is de mogelijkheid om expliciet in te stellen noatime in /etc/fstab als het nog niet is ingesteld (Raspbian lijkt het automatisch in te stellen).

Meer informatie over relativiteit en noatime

Uitschakelen van systeem log met behulp van masker:

systemctl mask systemd-journald.service
Symlink aangemaakt van /etc/systemd/system/systemd-journald.service naar /dev/null.
sudo systemctl mask rsyslog.service
Symlink aangemaakt van /etc/systemd/system/rsyslog.service naar /dev/null.

Andere logs die door andere toepassingen worden gemaakt, en de gevolgen van het uitschakelen van deze diensten (bijvoorbeeld dat bepaalde diensten niet meer starten) moeten natuurlijk in detail worden onderzocht.

Verwissel bestand:

Als er niet genoeg RAM is, verplaatst Linux individuele RAM gebieden in een SWAP bestand. (Overweeg het gebruik van een Raspberry Pi 4 met voldoende RAM, bijvoorbeeld de Pi 4 / 4 GB of de Pi 4 / 8 GB voor uw gebruik). Met het volgende commando kan de status van het SWAP-bestand worden gecontroleerd:

sudo systemctl status dphys-swapfile
dphys-swapfile.service - LSB: Automatisch genereren en gebruiken van een wisselbestand
Geladen: geladen (/etc/init.d/dphys-swapfile)
Actief: actief (afgesloten) sinds za 2017-07-01 19:11:57 UTC; 8min geleden
Proces: 498 ExecStart=/etc/init.d/dphys-swapfile start (code=exited, status=0/SUCCESS)

Het volgende commando kan worden gebruikt om SWAP uit te schakelen:

sudo systemctl disable dphys-swapfile

Conclusie

microSD-kaarten in continu gebruik stellen de betrouwbaarheid op lange termijn van Raspberry Pi-gebaseerde systemen zwaar op de proef.

Door gebruik te maken van de juiste voeding, alleen-lezen systemen met overlays, consequente vermindering van schrijfbewerkingen en de keuze van een goede SD-kaart van een bekend merk, kan de stabiliteit op lange termijn worden verhoogd.

Als u professionele ondersteuning nodig heeft voor uw Raspberry Pi project / product, neem dan contact met ons op voor een gratis eerste consult.

Opmerkingen

(*) Opmerking: de Raspberry Pi 3, 3B+ en 4 kunnen opstarten vanaf USB-media, of via het netwerk (Ethernet), zonder microSD-kaart.

Vooral voor een boot over netwerk is het nog steeds aan te raden om een microSD kaart met een speciale firmware te installeren, omdat een time-out bug in de boot code een stabiele boot verhindert (Raspberry Pi 3B).

De bovenstaande uitleg over de structuur van flash-geheugen geldt ook voor USB-sticks, aangezien ook daarin flash-geheugen is ingebouwd.

(**) Opmerking: een steeds meer gebruikt alternatief voor floating gates zijn charge trapping flash geheugens, het functionele principe blijft hetzelfde. De charge trapping flash cel maakt hogere geheugendichtheden mogelijk.

1 Commentaar

  1. Pete op oktober 13, 2021 op 8:27 pm

    Hoi,
    is er een manier om de controller in de SD-kaart te controleren hoeveel slechte plocks er aanwezig zijn?
    Door dit periodiek te controleren wil ik een trendgrafiek opbouwen.
    Dank u voor het werk.
    Groeten,
    Peter

Laat een reactie achter