Google Summer of Code 2026 Rapport: Verbetering van RAIDframe

Introductie

De Redundant Array of Independent Disks (RAID) is een raamwerk voor schijbbeheer dat is ontwikkeld door de Carnegie-Mellon University. NetBSD maakt gebruik van RAIDframe als een van zijn modules voor schijbbeheer.

Dit systeem houdt in dat meerdere schijven worden geconfigureerd om samen één schijfunit te vormen. Het huidige RAIDframe-raamwerk van NetBSD ondersteunt verschillende niveaus van schijfconfiguraties in een enkel array (zie raid(4)).

NetBSD's RAIDframe ondersteunt RAID-niveaus 0, 1, 5 en 6. Er zijn echter enkele beperkingen die dit project beoogt te verbeteren:

  • Ten eerste staat RAID-niveau 1, ook wel mirroring genoemd, slechts twee schijven toe in een enkel mirror-paar.
  • Ten tweede wordt RAIDframe scrubbing — het lezen van schijven om leesfouten op te sporen — nog niet ondersteund.
  • Ten derde is RAID-niveau 6, hoewel aanwezig in de broncode, niet goed getest en wordt het gebruik ervan afgeraden.

In dit project heb ik gewerkt aan:

  1. De implementatie van een uitbreiding voor RAID-niveau 1, genaamd N-way RAID 1, om meerdere schijven in een RAIDframe-mirror te ondersteunen.
  2. De implementatie van RAID scrubbing.

---

N-way RAID 1

RAID-niveau 1 houdt in dat twee schijven met dezelfde gegevens worden gespiegeld. Deze zijn gestructureerd als één primaire schijf en één pariteitsschijf (secundair).

  • Elke schrijfactie naar het RAID-apparaat schrijft naar alle actieve schijven in de configuratie.
  • Elke leesactie van het RAID-apparaat leest van de schijf met de kortste I/O-wachtrij (lezen/schrijven naar en van de schijven).
  • Indien er een fout optreedt bij een van de schijven, wordt er in degraded mode gelezen en worden de gegevens opgehaald van een van de beschikbare schijven.
  • Als alle schijven uitvallen, wordt de I/O afgebroken.

Er is een nieuwe uitbreiding geïntroduceerd voor de RAID 1-configuratie, genaamd N-way RAID 1. Hierbij worden meer dan twee schijven in een RAID 1-opstelling geconfigureerd, bestaande uit één primaire schijf en meerdere secundaire schijven. Dit verhoogt de redundantie en verbetert de veiligheid van kritieke gegevens bij schijfuitval, wat kan leiden tot dataverlies.

Voorbeeld: In een five-way RAID 1-configuratie zijn er één primaire en vier pariteits-/secundaire schijven. Elke schrijfbeurt probeert naar alle vijf de schijven te schrijven. Elke leesbeurt probeert te lezen van de primaire schijf of de secundaire schijf met de kortste I/O-wachtrij.

Gebruik

Vijf schijven kunnen worden geconfigureerd in een 5-way RAID 1-opstelling voor redundantie met raidctl(8) via het volgende commando:

raidctl /dev/raid1 create N /dev/dk1 /dev/dk2 /dev/dk3 /dev/dk4 /dev/dk5

Hierbij is /dev/raid1 het apparaatbestand voor het RAID-apparaat en is N het niveau. In de volgorde van de schijven wordt de eerste genoemde schijf beschouwd als de primaire en de rest als secundair. De /dev/dk bestanden zijn de NetBSD-schijfpartitie (wedge*) drivers die worden gebruikt voor de onafhankelijke schijven (zie dk(4) en dkctl(8)).

Standaard configureert dit 128 sectoren per stripe unit, een first-in-first-out wachtrijalgoritme en een maximale wachtrijlengte van 100. Dit kan als volgt worden vertaald naar de raid.conf-structuur:

# numrow numcol numspare
1 5 0

# Identify physical disks
START disks
/dev/dk1
/dev/dk2
/dev/dk3
/dev/dk4
/dev/dk5

# Layout is simple - 64 sectors per stripe
START layout
# Sect/StripeUnit StripeUnit/ParityUnit StripeUnit/#ReconUnit RaidLevel
128 1 1 N

# No spares
START spare

START queue
fifo 100

Projectresultaten (Deliverables)

RAIDframe Layout

Er is een nieuwe lay-outstructuur geïntroduceerd voor RAIDframe-niveau N. Het aantal primaire schijven blijft 1. Het aantal pariteits-/secundaire schijven wordt het totaal aantal schijven minus 1. De overige lay-outcomponenten voor RAID 1 (stripe-gerelateerde eigenschappen) blijven gelijk en zijn overgenomen in RAID N.

Sector/stripe mapping

Het huidige ontwerp voor RAID 1 maakt gebruik van ASM (Address Stripe Mapping) structuren. Deze bevatten PDA's (Physical Disk Addresses) die worden gebruikt om de softwareadressen van het RAID-niveau te mappen naar de fysieke schijladressen.

De PDA-structuur bevat:

  • Kolomnummer
  • Startsector
  • Aantal sectoren/blokken
  • Type schijf in de configuratie (data/pariteitschijf)
  • Data-bufferpointer
  • Het virtuele RAID-adres dat correspondeert met het fysieke schijladres

Bij een eenvoudige RAID 1-mirror met twee schijven worden schrijfacties of leesacties verdeeld over de twee schijven volgens de waarde ingesteld in SectorsPerStripeUnit in raid.conf (standaard 128 bij gebruik van raidctl(8)). Er worden dus blokken van 128 sectoren naar elke stripe geschreven, zoals gedefinieerd door de PDA's.

Voor twee schijven in een RAID 1-opstelling wordt een enkele stripe-schrijfbeurt gedefinieerd door één PDA per kolom. Voor de introductie van N-way RAID 1 kan het aantal PDA's niet bij het compileren worden vastgesteld; het aantal PDA's wordt tijdens runtime dynamisch bepaald door het aantal pariteitskolommen. Dit is nodig omdat het aantal secundaire schijven in een N-way opstelling kan variëren, in tegenstelling tot RAID 1, waarbij bekend is dat er één primaire en één secundaire schijf is.

DAG-uitvoering

RAIDframe gebruikt DAG's (Directed Acyclic Graphs) om I/O-nodes te activeren voor lees- en schrijfacties. Deze DAG-nodes zijn afhankelijk van de PDA's. De structuur voor het aanmaken van DAG-nodes moest worden bijgewerkt om meer dan twee PDA's te kunnen accommoderen bij het gebruik van RAID-niveau N.

Reconstructie

De RAIDframe-reconstructie is bijgewerkt om ruimte te maken voor RAID-niveau N. Wanneer een schijf uitvalt, identificeert het huidige algoritme een schijf die niet defect is, leest van die schijf en schrijft naar de schijf die wordt gereconstrueerd. Er zijn nieuwe controles voor RAID N aan de code toegevoegd om slechts van één niet-defecte schijf naar de schijf onder reconstructie te lezen. Dit voorkomt dat er tijdens een reconstructie willekeurig over het schijfarray wordt gelezen en geschreven.

Voordeel van het project

Dit project voegt meer redundantie toe aan het beheer van schijfgegevens, waardoor het risico op dataverlies bij schijfuitval wordt verminderd.

[Link naar werk]

---

RAIDframe scrubbing

De implementatie van scrubbing is een controle van de gezondheid van de disksectoren van alle componenten in een schijfarray. De sectoren van de schijven worden gelezen over elke stripe in de componenten en de I/O geeft het aantal aangetroffen leesfouten per component terug. Disk scrubbing wordt ondersteund voor alle RAID-niveaus in NetBSD.

Het starten van een scrub op een RAID-apparaat gebeurt met raidctl. Scrubbing kan worden uitgevoerd over een bepaald gedeelte van de schijven of over de volledige schijven in het array.

Gebruik

RAID scrubbing wordt uitgevoerd met de volgende syntaxis:

raidctl $device scrub percentage $startpercentage $endpercentage

Voorbeeld: Beschouw een RAID 5-array met drie schijven en honderd stripes: raidctl raid5 scrub percentage 20 30

Dit start een scrub van de RAID-componenten vanaf het twintigste percentiel tot het dertigste percentiel van alle componenten in het array. De stripe-indexen die voor het bovenstaande commando worden gelezen, worden wiskundig als volgt gerepresenteerd in een $startstripe en $endstripe bereik:

  • $start_stripe = 100 * 20 / 100 = 20
  • $end_stripe = 100 * 30 / 100 = 30
  • $endstripe = $endstripe - 1

Er wordt dus gelezen van de schijven vanaf stripe-index 20 tot stripe-index 29.

Resultaten / Kernel-output na een succesvolle scrub

raid5: Total number of read failures on Component /dev/dk1: 10
raid5: Total number of read failures on Component /dev/dk2: 4
raid5: Total number of read failures on Component /dev/dk3: 0

Interpretatie: Dit geeft aan dat er 10 leesfouten zijn gevonden op dk1, 4 leesfouten op dk2 en 0 leesfouten op dk3.

Wanneer de percentage-parameters worden weggelaten, wordt het gehele array (100 procent) gescrubbd: raidctl raid5 scrub

Noot: end_stripe wordt met 1 verlaagd omdat de indexering van stripes begint bij 0.

[Link naar werk]

---

Testen

Het testen van deze verbeteringen omvatte het opzetten van verschillende lay-outs van N-way RAID 1 met verschillende schijfgrootten. Een 2 GB three-way RAID 1-apparaat en een 10 GB five-way RAID 1-apparaat zijn afzonderlijk geconfigureerd en gebruikt voor tests.

Als onderdeel van deze tests zijn de volgende operaties uitgevoerd:

  • Aanmaken van bestandssystemen
  • Mounten en unmounten
  • Schrijven van ruwe bytes
  • Simuleren van componentuitval
  • Reconstructie
  • Toevoegen van een hot spare
  • Rebuilding in place

Dit is gedaan om een zeker niveau van vertrouwen te bieden in het gebruik van N-way RAID 1 en de overige RAIDframe-subsystemen.

Toekomstig werk

Als onderdeel van het testen moeten andere RAID-niveaus (bijv. RAID 0, 1 en 5) worden gevalideerd om er zeker van te zijn dat ze niet nadelig zijn beïnvloed door de nieuwe wijzigingen. RAID-niveau 6 zal verder worden beoordeeld en getest. Het werk aan RAID N kan in de NetBSD-boom worden samengevoegd als vervanging voor de bestaande RAID 1.

Geleerde lessen

Deelname aan Google Summer of Code met NetBSD is zeer impactvol geweest. Ik heb veel ervaring opgedaan met multithreading in de kernel en een dieper inzicht gekregen in hoe opslagsystemen werken. Ik zou iedereen die een dieper begrip van computersystemen wil krijgen, aanraden om Google Summer of Code-projecten met NetBSD te overwegen.

Dankwoord

Ik ben Greg Oster, mijn mentor, en de NetBSD-community dankbaar voor hun enorme steun bij het voltooien van dit project.