22.9. Het rootbestandssysteem op Vinum

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

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

22.9.1. Vinum op tijd starten voor het rootbestandssysteem

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

22.9.2. Een Vinum rootvolume 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 bootvolume samen te stellen. Er zijn daarom een paar trucs nodig om de bootstrapcode wijs te maken dat er een standaard "a" partitie aanwezig is met het rootbestandssysteem.

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

Het is mogelijk en wenselijk om meer dan één samenstelling te hebben, ieder met een replica van het rootbestandssysteem. Het bootstrapproces gebruikt wel maar één van deze replica's om de bootstrap en alle andere bestanden te vinden, tot het moment dat de kernel het rootbestandssysteem laadt. Iedere subschijf binnen deze samenstellingen heeft dus zijn eigen "a" partitievoorstelling nodig om dit apparaat opstartbaar 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 rootvolume 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 rootvolume 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 rootvolume moet als volgt bekeken worden:

    # gvinum 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 bsdlabel moeten worden gebruikt.

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

    # bsdlabel -e apparaatnaam
    

    apparaatnaam 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 rootbestandssysteem), 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 partities (zoals een rootbestandssysteem dat op dit moment aangekoppeld 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 opgestart 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 rootvolume 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 bsdlabel staat deze overlap alleen toe als de Vinum partitie gemarkeerd is met het bestandssysteemtype "vinum".

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

    # fsck -n /dev/devnaama
    

Opmerking: Alle bestanden die controle informatie bevatten moeten relatief zijn ten opzichte van het rootbestandssysteem in het Vinum volume dat, bij het creëren van een Vinum volume, niet overeen hoeft te komen met het rootbestandssysteem 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, rootbestandssysteem 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/gvinum/root

22.9.3. Een op Vinum gebaseerde rootinstallatie

Nadat het Vinum rootvolume is opgezet, geeft gvinum 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 schijfblokken van 512 bytes in termen van bsdlabel. Zo is de grootte van dit rootvolume 245760 blokken van 512 bytes. /dev/da1h, dat de tweede replica van dit rootvolume bevat, is symmetrische opgezet.

Het bsdlabel 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 22.9.4.3 beschreven is. Verder blijkt dat de hele "a" partitie volledig binnen de "h" partitie valt die alle Vinum gegevens voor dit apparaat bevat.

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

22.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.

22.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 kernelmodule nog niet in de lijst van modules staat die automatisch geladen wordt, dan zal load geom_vinum helpen.

Als alles in orde is, kan het opstartproces doorgestart worden met boot -as. De opties -as geven de kernel aan om het rootbestandssysteem te vragen (-a), en het opstartproces te stoppen in single-user mode (-s), waarbij het rootbestandssysteem als alleen-lezen aangekoppeld wordt. Op die manier is er geen risico op gegevensinconsistentie tussen de samenstellingen, zelfs niet als er maar één samenstelling van een multi-samenstellingen volume aangekoppeld is.

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

22.9.4.2. Alleen primaire bootstrap laadt

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

22.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 partitie voordat de Vinum volume identificatie geschreven wordt. De stage 1 en 2 bootstraps en de bsdlabel-informatie hebben ongeveer 8 KB nodig. Dus als de Vinum partitie op offset 0 van de slice van de schijf begint die als opstartbaar 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 bsdlabel -B zoals beschreven in Paragraaf 13.3.2, overschrijft de nieuwe bootstrap de Vinum identificatie en kan Vinum de Vinum schijven niet langer vinden. Hoewel geen instellingsgegevens van Vinum of gegevens in de Vinum volumes overschreven wordt en alle gegevens hersteld kunnen worden door precies dezelfde instellingsgegevens van Vinum opnieuw in te vullen, is dit een lastige situatie om te herstellen. Het zou nodig zijn om de complete Vinum partitie tenminste 4 KB te verplaatsen, om te voorkomen dat de Vinum identificatie en de bootstrap met elkaar botsen.