Copyright © 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 “™” of het symbool “®”.
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:
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.
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.
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.
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
strategiën voor kleine en alleen-lezen
FreeBSD-omgevingen.
Vertaald door René Ladan.
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 geïmplementeerd 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.
Enkele kernelopties zijn specifiek interessant voor degenen die een embedded FreeBSD-systeem creëren.
Alle embedded FreeBSD-systemen die flash-geheugen als
systeemschijf gebruiken zullen geïntereseerd 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 creëren 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
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, “Systeemstragiën 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
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.
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.
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
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.
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.
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 kopiëren 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.
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/*
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.
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