This is an archive of past FreeBSD releases; it's part of the FreeBSD Documentation Archive.

Het root bestandssysteem op Vinum

19.9. Het root bestandssysteem op Vinum

Bij een machine die een volledig gespiegeld bestandssysteem heeft, is het wenselijk ook het root bestandssysteem te spiegelen. Het bouwen van zo'n instelling is niet zo recht-toe-recht-aan als bij een ander bestandssysteem omdat:

In de volgende paragrafen wordt de term “root volume” gebruikt voor het Vinum volume dat het root bestandssysteem bevat. Het is waarschijnlijk een goed idee om de naam root te gebuiken voor dit volume, maar dit is niet technisch noodzakelijk. Alle commandovoorbeelden in de volgende stukken gaan echter uit van deze naam.

19.9.1. Vinum op tijd starten voor het root bestandssysteem

Om dit te bereiken, moeten een aantal stappen worden doorlopen:

19.9.2. Een Vinum root volume beschikbaar maken voor bootstrap

Omdat de huidige FreeBSD bootstrap maar 7,5 KB code bevat en al belast is met het lezen van bestanden (zoals /boot/loader) van het UFS bestandssysteem, is het bijna onmogelijk om het ook te leren hoe Vinum informatie gelezen moet worden en deze dan te gebruiken om de elementen van het boot volume samen te stellen. Er zijn daarom een paar trucs nodig om de bootstrap code wijs te maken dat er een standaard "a" partitie aanwezig is met het root bestandssysteem.

Om dit mogelijk te maken, moet het root volume aan de volgende eisen voldoen:

Het is mogelijk en wenselijk om meer dan één samenstelling te hebben, ieder met een replica van het root bestandssysteem. Het bootstrap proces gebruikt wel maar één van deze replica's om de bootstrap en alle andere bestanden te vinden, tot het moment dat de kernel het root bestandssysteem laadt. Iedere subschijf binnen deze samenstellingen heeft dus zijn eigen "a" partitievoorstelling nodig om dit apparaat bootbaar te maken. Het is niet verplicht dat iedere voorgestelde "a" partitie op dezelfde offset is geplaatst binnen het apparaat, vergeleken met andere apparaten die samenstellingen van het root volume bevatten. Het is wel een goed idee om op die manier Vinum volumes te maken, zodat de resulterende gespiegelde apparaten symmetrisch zijn. Dit om verwarring te voorkomen.

Om deze "a" partities voor ieder apparaat dat een deel van het root volume bevat te maken, moet het volgende worden gedaan:

  1. De locatie (offset vanaf het begin van het apparaat) en de grootte van de subschijf die onderdeel is van het root volume moet als volgt bekeken worden:

    # vinum l -rv root
    

    Opmerking: De Vinum offsets en groottes worden aangegeven in bytes. Ze moeten door 512 worden gedeeld om de bloknummers te krijgen die in disklabel moeten worden gebruikt.

  2. Voor elk apparaat dat deelneemt aan het root bestandssysteem moet het onderstaande command uitgevoerd worden:

    # disklabel -e devname
    

    devname moet of de naam van een schijf (zoals da0) voor schijven zonder slice-tabel zijn (ook wel: fdisk), of de naam van de slice zijn (zoals ad0s1).

    Als er al een "a" partitie op het apparaat aanwezig is (waarschijnlijk met een pre-Vinum root bestandssysteem), moet die eerst worden hernoemd, zodat het wel toegankelijk blijft (voor de zekerheid), maar niet langer gebruikt wordt om het systeem van op te starten. Actieve paritities (zoals een root bestandssysteem dat op dit moment gemount is) kan geen andere naam gegeven worden. Dit moet dus gebeuren als het systeem vanaf een “Fixit” medium opgestart is of in twee stappen, waar (in een gespiegelde situatie) de schijf waar niet van geboot is als eerste wordt aangepast.

    Daarna moet de offset van de Vinum partitie op dit apparaat (als het bestaat) opgeteld worden bij de offset van de root volume subschijf op dit apparaat. De resulterende waarde wordt de "offset" waarde voor de nieuwe "a" partitie. De "size" waarde voor deze partitie kan worden gehaald uit bovenstaande berekening. De "fstype" wordt 4.2BSD. De "fsize", "bsize" en "cpg" waardes moeten zo goed mogelijk worden gekozen om een daadwerkelijk bestandssysteem na te bootsen, hoewel ze vrij onbelangrijk zijn in deze context.

    Op deze manier wordt een nieuwe "a" partitie gemaakt dat de Vinum partitie op dit apparaat overlapt. Het disklabel staat deze overlap alleen toe als de Vinum partitie gemarkeerd is met het fstype "vinum".

  3. Dat is het! Er bestaat nu een nep "a" partitie op ieder apparaat dat een replica van het root volume heeft. Het is aan te bevelen om de resultaten nogmaals te verifieren met iets als:

    # fsck -n /dev/devnaama
    

Opmerking: Alle bestanden die controle informatie bevatten moeten relatief zijn ten opzichte van het root bestandssysteem in het Vinum volume dat, bij het creëren van een Vinum volume, niet overeen hoeft te komen met het root bestandssysteem dat op dit moment in gebruik is. Dit geldt in het bijzonder voor /etc/fstab en /boot/loader.conf.

Bij de volgende herstart zou de bootstrap de juiste controle informatie moeten vinden in het nieuwe, op Vinum gebaseerde, root bestandssysteem en moeten starten. Aan het einde van het kernel initialisatie proces, nadat alle apparaten aangemeld zijn, geeft het volgende bericht aan dat het opzetten gelukt is:

Mounting root from ufs:/dev/vinum/root

19.9.3. Een op Vinum gebaseerde root opzet

Nadat het Vinum root volume is opgezet, geeft vinum l -rv root een volgend resultaat:

...
Subdisk root.p0.s0:
                Size:        125829120 bytes (120 MB)
                State: up
                Plex root.p0 at offset 0 (0 B)
                Drive disk0 (/dev/da0h) at offset 135680 (132 kB)

Subdisk root.p1.s0:
                Size:        125829120 bytes (120 MB)
                State: up
                Plex root.p1 at offset 0 (0 B)
                Drive disk1 (/dev/da1h) at offset 135680 (132 kB)

De interessante waarden zijn 135680 voor de offset (relatief ten opzichte van de partitie /dev/da0h). Dit vertaalt zich naar 265 512-byte schijfblokken in disklabel termen. Zo is de grootte van dit root volume 245760 512-byte blokken. /dev/da1h, dat de tweede replica van dit root volume bevat, is symmetrische opgezet.

Disklabel voor deze apparaten kan er zo uitzien:

...
8 partitions:
#       size   offset   fstype   [fsize bsize bps/cpg]
  a:   245760     281   4.2BSD     2048 16384    0   # (Cyl.    0*- 15*)
  c: 71771688       0   unused       0    0        # (Cyl.    0 - 4467*)
  h: 71771672      16    vinum                     # (Cyl.    0*- 4467*)

Hieruit blijkt dat de "size" parameter voor de nep "a" partitie overeenkomt met de waarde als hierboven beschreven en dat de "offset" parameter de som is van de offset binnen de Vinum partitie "h" en de offset van deze partitie binnen het apparaat (of de slice). Dit is een normale opzet om problemen te voorkomen zoals in Paragraaf 19.9.4.3 beschreven is. Verder blijkt dat de hele "a" partitie volledig binnen de "h" partitie valt die alle Vinum data voor dit apparaat bevat.

In het bovenstaande voorbeeld is de volledige schijf voor Vinum gereserveerd en er is geen restant van de pre-Vinum root partitie, omdat dit een nieuwe schijf is die vanaf het begin af aan bedoeld was als onderdeel van een Vinum instelling.

19.9.4. Problemen oplossen

Als er iets fout gaat moet er een manier zijn om dat te herstellen. De volgende lijst bevat een paar bekende valkuilen en oplossingen.

19.9.4.1. Systeem bootstrap laadt, maar systeem start niet door

Als om wat voor reden dan ook het systeem niet doorgaat met opstarten, kan de bootstrap worden onderbroken door de spatie toets in te drukken tijdens de 10 seconden waarschuwing. Dan kunnen de loader variabelen (zoals vinum.autostart) bekeken worden met behulp van show en aangepast worden met set of unset.

Als het enige probleem was dat de Vinum kernel module nog niet in de lijst van modules staat die automatisch geladen wordt, dan moet load vinum voldoende zijn.

Als alles in orde is, kan het bootproces doorgestart worden met boot -as. De opties -as geven de kernel aan om het root bestandssysteem te vragen (-a), en het boot proces te stoppen in single-user mode (-s), waarbij het root bestandssysteem als read-only gemount wordt. Op die manier is er geen risico op data inconsistentie tussen de samenstellingen, zelfs niet als er maar één samenstelling van een multi-samenstellingen volume gemount is.

Op de prompt, waar om het root bestandssysteem gevraagd wordt, kan ieder apparaat dat een valide root bestandssysteem bevat worden opgegeven. Als /etc/fstab goed is opgezet, is iets als ufs:/dev/vinum/root te zien. Een andere keuze kan ufs:da0d zijn, dat een hypothetische partitie is die het pre-Vinum root bestandssysteem bevat. Als één van de alias "a" partities ingevuld wordt die eigenlijk een referentie naar de subschijf van het Vinum root apparaat zijn, dan wordt in een gespiegelde opzet maar éé kant van het gespiegelde volume gemount. Als dit bestandssysteem later als read-write gemount wordt, moet(en) de andere samenstelling(en) van het root volume verwijderd worden, omdat deze samenstellingen anders inconsistente data bevatten.

19.9.4.2. Alleen primaire bootstrap laadt

Als /boot/loader niet start, maar de primaire bootstrap laadt wel (zichtbaar door een enkel minnetje in de linker bovenhoek van het scherm, direct na de start van het boot proces), kan worden geprobeerd het primaire boot proces te onderbreken door op de spatie toets te drukken. Dit zorgt ervoor dat het boot proces stopt bij de tweede fase (zie ook Paragraaf 12.3.2). Hier kan worden geprobeerd vanaf een andere partitie te starten, bijvoorbeeld van de partitie waar het vorige root bestandssysteem op stond, dat nu van de "a" verplaatst is.

19.9.4.3. Niets start, paniek van bootstrap

Dit gebeurt als de bootstrap is vernietigd door de Vinum installatie. Helaas laat Vinum op dit moment slechts 4 KB vrij aan het begin van zijn paritie voordat de Vinum volume identificatie geschreven wordt. De stage 1 en 2 bootstraps en de disklabel informatie hebben ongeveer 8 KB nodig. Dus als de Vinum partitie op offset 0 van de slice van de schijf begint die als bootbaar was bedoeld, zal deze Vinum informatie de bootstrap vernielen.

Als bovenstaande situatie is omzeild, bijvoorbeeld door te starten vanaf een “Fixit” medium, en de bootstrap opnieuw is aangemaakt met disklabel -B zoals beschreven in Paragraaf 12.3.2, overschrijft de nieuwe bootstrap de Vinum identificatie en kan Vinum de Vinum schijven niet langer vinden. Hoewel geen Vinum instellingengegevens of gegevens in de Vinum volumes overschreven wordt en alle gegevens hersteld kunnen worden door precies dezelfde Vinum instellingengegevens opnieuw in te vullen, is dit een lastige situatie om te herstellen. Het zou nodig zijn om de complete Vinum parititie tenminste 4 KB te verplaatsen, om te voorkomen dat de Vinum identificatie en de bootstrap met elkaar botsen.

19.9.5. Verschillen met FreeBSD 4.X

In FreeBSD 4.X missen sommige interne functies die nodig zijn om Vinum automatisch alle schijven te laten scannen en de code die het interne ID van de root apparaat achterhaalt is niet slim genoeg om met een naam als /dev/vinum/root om te gaan. Daarom zijn er een paar verschillen ten opzichte van FreeBSD 5.X.

Vinum moet expliciet verteld worden welke schijven bekeken moeten worden door iets als het volgende in /boot/loader.conf:

vinum.drives="/dev/da0 /dev/da1"

Het is belangrijk dat alle schijven die Vinum data kunnen bevatten genoemd worden. Het maakt niet uit of er meer schijven genoemd worden en het is ook niet nodig om iedere slice en/of partitie expliciet op te geven, omdat Vinum alle slices en paritities van de genoemde schijven afgaat voor valide Vinum identificatie informatie.

Omdat de routines die de naam van het root bestandssysteem verwerken en daar het apparaat ID (major/minor nummers) uit halen alleen maar met de “klassieke” apparaatnamen als /dev/ad0s1a overweg kunnen, kunnen ze niets maken van een root volume naam als /dev/vinum/root. Daarom moet Vinum zelf de interne kernel parameter dat het ID van het root volume bevat aanpassen tijdens zijn eigen initialisatie. Dit gaat door de naam van het root volume op te geven in de loader variable vinum.root. Dit ziet er in /boot/loader.conf zo uit:

vinum.root="root"

Als de kernel initialisatie probeert uit te vinden welk root apparaat gemount moet worden, ziet het dat sommige kernelmodules al parameters gezet hebben. In dat geval en als het apparaat dat het root apparaat claimt hetzelfde major nummer heeft als het stuurprogramma dat gevonden is uit de naam van het root apparaat (Vinum in dit geval), dan gebruikt het het van te voren gedefinieerde apparaat ID, in plaats van het zelf proberen uit te vinden. Zo kan het normale automatische boot proces doorgaan met het mounten van het Vinum root volume voor het root bestandssysteem.

Maar als boot -a is gegeven om de naam van het root apparaat te vragen, kan het nog steeds niet overweg met een naam die refereert aan een Vinum volume. Als er een apparaatnaam is gegeven die niet refereert aan een Vinum apparaat, dan zorgt het verschil tussen de major nummers van de van te voren ingestelde root parameter en het stuurprogramma zoals dat uit de gegeven naam wordt afgeleid ervoor dat deze routine zijn eigen afgeleide naam gebruikt. Invoer als ufs:da0d werkt zoals verwacht. Als dit mislukt, is het niet meer mogelijk om nogmaals iets als ufs:vinum/root in te voeren, omdat het niet een tweede keer verwerkt kan worden. De enige uitweg is het systeem opnieuw te starten en opnieuw te beginnen. Op de “askroot” prompt kan /dev/ altijd achterwege gelaten worden.

Deze en andere documenten kunnen worden gedownload van ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Lees voor vragen over FreeBSD de documentatie alvorens contact te zoeken <questions@FreeBSD.org>.
Vragen over deze documentatie kunnen per e-mail naar <doc@FreeBSD.org>.