                        FreeBSD en Solid State Apparaten

  John Kozubik

   <john@kozubik.com>

   Herziening: 8def749c53

   Copyright (c) 2001, 2009 The FreeBSD Documentation Project

   FreeBSD is een geregistreerd handelsmerk van de FreeBSD Foundation.

   Veel van de termen die door fabrikanten en verkopers worden gebruikt om
   hun producten te onderscheiden worden geclaimd als handelsmerk. Op de
   plaatsen waar deze handelsmerken in dit document voorkomen, en het FreeBSD
   Project op de hoogte was van de claim op het handelsmerk, worden de termen
   gevolgd door het symbool "(TM)" of het symbool "(R)".

   Copyright

   Redistribution and use in source (XML DocBook) and 'compiled' forms (XML,
   HTML, PDF, PostScript, RTF and so forth) with or without modification, are
   permitted provided that the following conditions are met:

    1. Redistributions of source code (XML DocBook) must retain the above
       copyright notice, this list of conditions and the following disclaimer
       as the first lines of this file unmodified.

    2. Redistributions in compiled form (transformed to other DTDs, converted
       to PDF, PostScript, RTF and other formats) must reproduce the above
       copyright notice, this list of conditions and the following disclaimer
       in the documentation and/or other materials provided with the
       distribution.

  Belangrijk:

   THIS DOCUMENTATION IS PROVIDED BY THE FREEBSD DOCUMENTATION PROJECT "AS
   IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FREEBSD DOCUMENTATION
   PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

   2013-11-13 07:52:45 +0000 door Hiroki Sato.
   Samenvatting

   Dit artikel behandelt het gebruik van solid state disk-apparaten in
   FreeBSD voor het maken van embedded systemen.

   Embedded systemen hebben het voordeel van verhoogde stabiliteit wegens het
   ontbreken van bewegende delen (harde schijven). Er moet echter rekening
   worden gehouden met de over het algemeen weinig beschikbare schijfruimte
   in het systeem en de duurzaamheid van het opslagmedium.

   Specifieke onderwerpen die aan bod komen omvatten de typen en attributen
   van solid state-media die geschikt zijn om in FreeBSD als schijf te
   gebruiken, kernelopties die interessant zijn in zo'n omgeving, de
   mechanismen van rc.initdiskless die de initialisatie van zulke systemen
   automatiseren en de noodzaak voor alleen-lezen bestandssystemen, en het
   van voor af aan bouwen van bestandssystemen. Het artikel zal afsluiten met
   wat algemene strategien voor kleine en alleen-lezen FreeBSD-omgevingen.

   Vertaald door Rene Ladan.

   [ Opgedeeld HTML bestand / Enkel HTML bestand ]

     ----------------------------------------------------------------------

   Inhoudsopgave

   1. Solid State Disk-apparaten

   2. Kernelopties

   3. Het rc-deelsysteem en alleen-lezen bestandssystemen

   4. Een bestandssysteem uit het niets opbouwen

   5. Systeemstragien voor kleine en alleen-lezen omgevingen.

1. Solid State Disk-apparaten

   Het bereik van dit artikel zal beperkt zijn tot solid state disk-apparaten
   die gemaakt zijn met flash-geheugen. Flash-geheugen is een solid
   state-geheugen (geen bewegende onderdelen) dat niet-vluchtig is (het
   geheugen blijft gegevens behouden zelf nadat alle stroombronnen zijn
   ontkoppeld). Flash-geheugen kan enorme fysieke schokken weerstaan en is
   redelijk snel (de oplossingen met flash-geheugens die in dit artikel
   worden behandeld zijn iets langzamer dan een EIDE-harde schijf voor
   schrijfbewerkingen, en veel sneller voor leesbewerkingen). Een heel
   belangrijk aspect van flash-geheugen, waarvan de ramnificaties later in
   dit artikel besproken zullen worden, is dat elke sector een beperkte
   herschrijfcapaciteit heeft. Een sector flash-geheugen kan maar een bepaald
   aantal keren beschreven, gewist, en herschreven worden voordat de sector
   permanent onbruikbaar wordt. Hoewel veel flash-geheugenproducten
   automatisch slechte blokken in kaart brengen, en hoewel sommigen zelfs
   schrijfoperaties gelijkmatig over de eenheid distribueren, blijft het een
   feit dat er een limiet bestaat aan de hoeveelheid waarmee het apparaat kan
   worden beschreven. Concurrerende apparaten hebben tussen de 1.000.000 en
   10.000.000 schrijfbewerkingen per sector in hun specificaties staan. Dit
   getal varieert vanwege de omgevingstemperatuur.

   In het bijzonder worden ATA-compatibele compact-flash-eenheden besproken,
   welke vrij populair zijn als opslagmedium voor digitale camera's.
   Bijzonder interessant is het feit dat de pinnen ervan precies met die van
   de IDE-bus overeenkomen en dat ze compatibel zijn met de
   ATA-commandoverzameling. Daarom kunnen deze apparaten direct aan een
   IDE-bus in een computer gekoppeld worden met een zeer eenvoudige en
   goedkope adapter. Eenmaal op deze wijze geimplementeerd zien
   besturingssystemen zoals FreeBSD het apparaat als een normale harde schijf
   (doch klein).

   Er bestaan nog andere solid state disk-oplossingen, maar hun kosten,
   zeldzaamheid, en relatieve gebruiksongemak plaatst ze buiten het bereik
   van dit artikel.

2. Kernelopties

   Enkele kernelopties zijn specifiek interessant voor degenen die een
   embedded FreeBSD-systeem creeren.

   Alle embedded FreeBSD-systemen die flash-geheugen als systeemschijf
   gebruiken zullen geintereseerd zijn in geheugenschijven en
   geheugenbestandssystemen. Vanwege het beperkt aantal keren dat het
   flash-geheugen kan worden beschreven, is het het waarschijnlijkst dat de
   schijf en de bestandssystemen op de schijf als alleen-lezen worden
   aangekoppeld. In deze omgeving zullen bestandssystemen zoals /tmp en /var
   als geheugenbestandssystemen worden aangekoppeld zodat het systeem logs
   kan creeren en tellers en tijdelijke bestanden kan bijwerken.
   Geheugenbestandssystemen zijn een kritiek station naar een succesvolle
   implementatie van solid state FreeBSD.

   De volgende regels dienen in uw kernelinstellingenbestand te staan:

 options         MFS             # Geheugenbestandssysteem
 options         MD_ROOT         # md-apparaat bruikbaar als een potentieel root-apparaat
 pseudo-device   md              # geheugenschijf

3. Het rc-deelsysteem en alleen-lezen bestandssystemen

   De post-boot-initialisatie van een embedded FreeBSD-systeem wordt beheerd
   door /etc/rc.initdiskless.

   /etc/rc.d/var koppelt /var als een geheugenbestandssysteem aan, maakt een
   instelbare lijst van mappen in /var aan met het commando mkdir(1), en
   verandert de modus van sommige van deze mappen. Tijdens het uitvoeren van
   /etc/rc.d/var is er nog een rc.conf-variabele in het spel - varsize. Het
   bestand /etc/rc.d/var maakt een partitie /var aan gebaseerd op de waarde
   van deze variabele in rc.conf:

 varsize=8192

   Onthoud dat deze waarde standaard in sectoren is.

   Het feit dat /var een bestandssysteem is dat zowel gelezen als geschreven
   wordt is een belangrijk verschil, aangezien de partitie / (en alle andere
   partities die op uw flash-medium kunnen staan) als alleen-lezen
   aangekoppeld dienen te worden. In Paragraaf 1, "Solid State
   Disk-apparaten" hebben we de beperkingen van flash-geheugen uiteen gelegd
   - in bijzonder de beperkte herschrijfcapaciteit. Het belang van het niet
   als lezen-schrijven aankoppelen van flash-media en het belang van het niet
   gebruiken van een wisselbestand kunnen niet genoeg benadrukt worden. Een
   wisselbestand op een druk systeem kan binnen een jaar een flash-medium
   opmaken. Het uitgebreid loggen of aanmaken en vernietigen van tijdelijke
   bestanden kan hetzelfde doen. Daarom dient u, naast het verwijderen van de
   regel swap uit het bestand /etc/fstab, ook de Options van elk
   bestandssysteem als volgt op ro te zetten:

 # Device                Mountpoint      FStype  Options         Dump    Pass#
 /dev/ad0s1a             /               ufs     ro              1       1

   Op een gemiddeld systeem zullen enkele applicaties het onmiddellijk niet
   meer doen als gevolg van deze verandering. cron zal niet correct draaien
   vanwege ontbrekende cron-tabellen in het /var dat door /etc/rc.d/var is
   aangemaakt, en syslog en DHCP zullen problemen ondervinden als gevolg van
   het alleen-lezen bestandssysteem en ontbrekende items in het /var dat
   /etc/rc.d/var heeft aangemaakt. Dit zijn slechts tijdelijke problemen, en
   worden tezamen met oplossingen voor het uitvoeren van andere veelgebruikte
   softwarepakketten behandeld in Paragraaf 5, "Systeemstragien voor kleine
   en alleen-lezen omgevingen.".

   Een belangrijk ding om te onthouden is dat een bestandssysteem dat met
   /etc/fstab als alleen-lezen was aangekoppeld ten alle tijden
   lezen-schrijven kan worden gemaakt door dit commando te geven:

 # /sbin/mount -uw partitie

   en kan op alleen-lezen worden teruggezet met het commando:

 # /sbin/mount -ur partitie

4. Een bestandssysteem uit het niets opbouwen

   Omdat ATA-compatibele compact-flash-kaarten door FreeBSD als normale IDE
   harde schijven worden gezien, kunt u theoretisch FreeBSD vanaf het netwerk
   installeren door de floppies kern en mfsroot of een CD te gebruiken.

   Zelfs een kleine installatie van FreeBSD die normale installatieprocedures
   gebruikt kan echter een systeem produceren met een omvang van meer dan 200
   MB. Omdat de meeste mensen kleinere flash-geheugenapparaten zullen
   gebruiken (128 MB wordt als redelijk groot gezien - 32 of zelfs 16 MB is
   gebruikelijk) is een installatie dat de normale mechanismen gebruikt niet
   mogelijk er is simpelweg niet genoeg schijfruimte voor zelfs de kleinste
   van de conventionele installaties.

   De gemakkelijkste manier om over deze beperking heen te komen is om
   FreeBSD met conventionele middelen naar een normale harde schijf te
   installeren. Kleedt, nadat de installatie voltooid is, het
   besturingssysteem uit tot een grootte die op uw flash-medium past, en pak
   vervolgens het gehele bestandssysteem in. De volgende stappen leiden u
   door het proces heen van een normaal flash-geheugen voorbereiden op uw
   ingepakte bestandssysteem. Omdat er geen normale installatie wordt
   uitgevoerd, moeten bewerkingen zoals partitioneren, labelen, het aanmaken
   van bestandssystemen, etcetera met de hand uitgevoerd worden. Naast de
   floppies kern en mfsroot heeft u ook de floppy fixit nodig.

    1. Het flash-media-apparaat partitioneren

       Kies nadat er met de floppies kern en mfsroot is opgestart custom uit
       het installatiemenu. Kies partition in het aangepaste installatiemenu.
       In het partitiemenu dient u alle bestaande partities te wissen met de
       toets d. Maak nadat alle bestaande partities gewist zijn een partitie
       aan met de toets c en accepteer de standaardwaarde voor de grootte van
       de partitie. Zorg ervoor dat het type van de partitie op 165 is
       ingesteld wanneer daar naar wordt gevraagd. Schrijf nu deze
       partitietabel naar schijf door op de toets w te drukken (dit is een
       verborgen optie op dit scherm). Wanneer u een ATA-compatibele
       flash-kaart gebruikt, dient u de opstartbeheerder van FreeBSD te
       gebruiken. Druk nu op de toets q om het partitiemenu te verlaten. Het
       menu van de opstartbeheerder wordt nog een keer aan u getoond -
       herhaal de keuze die u eerder heeft gemaakt.

    2. De bestandssystemen op uw flash-geheugenapparaat aanmaken

       Verlaat het aangepaste installatiemenu, en kies van het
       hoofdinstallatiemenu de optie fixit. Geef na het binnengaan van de
       fixit-omgeving het volgende commando:

 # disklabel -e /dev/ad0c

       Op dit punt bent u de tekstverwerker vi binnengegaan onder toezien van
       het commando disklabel. Vervolgens dient u een regel met a: aan het
       einde van het bestand toe te voegen. Deze regel dient er als volgt uit
       te zien:

 a:      123456  0       4.2BSD  0       0

       Hierbij is 123456 een getal dat exact gelijk is aan het getal in de
       bestaande regel met c: voor de grootte. In feite dupliceert u de
       bestaande regel met c: als een regel met a:, met daarbij 4.2BSD als
       type van het bestandssysteem. Sla het bestand op en verlaat de
       tekstverwerker.

 # disklabel -B -r /dev/ad0c
 # newfs /dev/ad0a

    3. Uw bestandssysteem op het flash-medium plaatsen

       Koppel het nieuw voorbereide flash-medium aan:

 # mount /dev/ad0a /flash

       Activeer deze machine in het netwerk zodat we ons tar-bestand kunnen
       overzenden en het op het bestandssysteem van het flash-medium kunnen
       uitpakken. Een manier om dit te doen is:

 # ifconfig xl0 192.168.0.10 netmask 255.255.255.0
 # route add default 192.168.0.1

       Nu de machine op het netwerk is, kan het tar-bestand worden
       overgezonden. U kunt nu tegen een dilemma aanlopen - als bijvoorbeeld
       uw flash-geheugen 128 MB groot is, en uw tar-bestand groter is dan 64
       MB, kan uw tar-bestand niet op het zelfde moment op het flash-medium
       staan als dan wanneer u het uitpakt - u zult schijfruimte tekort
       komen. Een oplossing voor dit probleem is, wanneer u FTP gebruikt, om
       het bestand uitpakt terwijl u het over FTP verzendt. Als u de
       overdracht op deze manier aanpakt, zult u nooit het tar-bestand en de
       inhoud ervan op hetzelfde moment op uw schijf hebben:

 ftp> get tar-bestand.tar "| tar xvf -"

       Als uw tar-bestand met gzip is ingepakt, kunt u dit ook voor elkaar
       krijgen:

 ftp> get tar-bestand.tar "| zcat | tar xvf -"

       Nadat de inhoud van uw ge-tar-de bestandssysteem op het
       bestandssysteem van uw flash-geheugen staan, kunt u het flash-geheugen
       afkoppelen en opnieuw opstarten:

 # cd /
 # umount /flash
 # exit

       Aangenomen dat u uw bestandssysteem correct heeft geconfigureerd toen
       het gebouwd werd op de normale harde schijf (met uw bestandssystemen
       als alleen-lezen aangekoppeld en met de nodige opties in de kernel
       gecompileerd) zou u nu succesvol uw embedded FreeBSD-systeem moeten
       kunnen opstarten.

5. Systeemstragien voor kleine en alleen-lezen omgevingen.

   In Paragraaf 3, "Het rc-deelsysteem en alleen-lezen bestandssystemen" werd
   erop gewezen dat het bestandssysteem /var zoals geconstrueerd door
   /etc/rc.d/var en de aanwezigheid van een hoofdbestandssysteem dat alleen
   gelezen kan worden problemen veroorzaakt met veel alledaagse
   softwarepakketten die door FreeBSD gebruikt worden. In dit artikel zullen
   suggesties voor het succesvol draaien van cron, syslog, ports-installaties
   en de webserver Apache worden gegeven.

  5.1. cron

   Tijdens het opstarten wordt /var bevolkt door /etc/rc.d/var dat de lijst
   van /etc/mtree/BSD.var.dist gebruikt, dus cron, cron/tabs, at, en nog wat
   andere standaardmappen worden aangemaakt.

   Dit lost echter nog niet het probleem van het behouden van cron-tabellen
   na het opnieuw opstarten op. Wanneer het systeem opnieuw opstart, zal het
   bestandssysteem /var dat in het geheugen staat verdwijnen en zullen alle
   cron-tabellen die er in stonden ook verdwijnen. Daarom is een oplossing
   hiervoor het aanmaken van cron-tabellen voor de gebruikers die ze nodig
   hebben, uw bestandssysteem / als lezen-schrijven aan te koppelen en die
   cron-tabellen naar een veilige plaats zoals /etc/tabs te kopieren en een
   regel aan het einde van /etc/rc.initdiskless toe te voegen die deze
   cron-tabellen naar /var/cron/tabs kopieert nadat die map is aangemaakt
   tijdens de syseeminitialisatie. U moet misschien ook een regel toevoegen
   die de modi en toestemmingen van de mappen die u aanmaakt en de bestanden
   die u met etc/rc.initdiskless kopieert verandert.

  5.2. syslog

   syslog.conf specificeert de plaats van bepaalde logbestanden die in
   /var/log bestaan. Deze bestanden worden niet door /etc/rc.d/var tijdens de
   systeeminitialisatie aangemaakt. Daarom dient u ergens na de sectie die de
   mappen in /var aanmaakt in /etc/rc.d/var iets als het volgende toevoegen:

 # touch /var/log/security /var/log/maillog /var/log/cron /var/log/messages
 # chmod 0644 /var/log/*

  5.3. Ports installeren

   Voordat de veranderingen die nodig zijn om succesvol de portsboom te
   gebruiken besproken worden, is een herinnering ten aanzien van de
   alleen-lezen-natuur van uw bestandssystemen op het flash-medium op zijn
   plaats. Aangezien ze alleen-lezen zijn, dient u ze tijdelijk als
   lezen-schrijven aan te koppelen waarbij de koppelsyntaxis zoals getoond in
   Paragraaf 3, "Het rc-deelsysteem en alleen-lezen bestandssystemen" wordt
   gebruikt. U dient deze bestandssystemen altijd als alleen-lezen te
   herkoppelen als u klaar bent met enig onderhoud - onnodige schrijfacties
   naar het flash-medium kunnen de levensduur ervan aanzienlijk verkorten.

   Om het mogelijk te maken om een portsmap binnen te gaan en succesvol make
   install uit te voeren, moeten we een pakketmap op een bestandssysteem
   aanmaken dat niet geheugengebaseerd is en dat onze pakketten tussen
   herstarts bijhoudt. Omdat het toch nodig is om uw bestandssystemen als
   lezen-schrijven te koppelen voor het installeren van een pakket, is het
   zinnig om aan te nemen dat een gebied op het flash-medium ook gebruikt kan
   worden om pakketinformatie naar te schrijven.

   Maak als eerste een map aan voor de pakketdatabase. Dit is normaliter
   /var/db/pkg, maar we kunnen het daar niet plaatsen aangezien het telkens
   als het systeem wordt opgestart zal verdwijnen.

 # mkdir /etc/pkg

   Voeg nu een regel aan /etc/rc.d/var toe die de map /etc/pkg aan
   /var/db/pkg koppelt. Een voorbeeld:

 # ln -s /etc/pkg /var/db/pkg

   Nu zal telkens wanneer u uw bestandssystemen als lezen-schrijven
   aankoppelt en een pakket installeert, make install werken, en zal de
   pakketinformatie succesvol naar /etc/pkg worden geschreven (omdat het
   bestandssysteem op dat moment als lezen-schrijven is aangekoppeld) wat
   altijd als /var/db/pkg beschikbaar is voor het besturingssysteem.

  5.4. Apache Web Server

  Opmerking:

   De stappen in deze sectie zijn alleen nodig indien Apache is ingesteld om
   de pid- of loginformatie buiten /var te schrijven. Standaard houdt Apache
   het pid-bestand in /var/run/httpd.pid en de logbestanden in /var/log.

   Er wordt nu aangenomen dat Apache de logbestanden in een map
   apache_log_map buiten /var bewaart. Wanneer deze map op een alleen-lezen
   bestandssysteem staat, zal Apache geen logbestanden kunnen opslaan, en kan
   het werkproblemen hebben. Indien dit zo is, is het noodzakelijk om een
   nieuwe map aan de lijst met mappen in /etc/rc.d/var die in /var worden
   aangemaakt toe te voegen, en om apache_log_map aan /var/log/apache te
   koppelen. Het is ook nodig om de toestemmingen en eigenaarschappen van
   deze nieuwe map in te stellen.

   Voeg eerst de map log/apache toe aan de lijst van mappen die in
   /etc/rc.d/var aangemaakt moeten worden.

   Voeg ten tweede deze commando's toe aan /etc/rc.d/var na de sectie die
   mappen aanmaakt:

 # chmod 0774 /var/log/apache
 # chown nobody:nobody /var/log/apache

   Verwijder als laatste de bestaande map apache_log_map en vervang het door
   een koppeling:

 # rm -rf apache_log_map
 # ln -s /var/log/apache apache_log_map
