Introductie
Linux heeft robuuste systemen en tools om hardwareapparaten te beheren, inclusief opslagstations. In dit artikel zullen we, op hoog niveau, behandelen hoe Linux deze apparaten vertegenwoordigt en hoe ruwe opslag wordt omgezet in bruikbare ruimte op de server.
Wat is Blokopslag?
Blokopslag is een andere naam voor wat de Linux-kernel een blokapparaat noemt. Een blokapparaat is een stuk hardware dat kan worden gebruikt om gegevens op te slaan, zoals een traditionele draaiende harde schijf (HDD), solid state drive (SSD), flashgeheugenstick, enzovoort. Het wordt een blokapparaat genoemd omdat de kernel communiceert met de hardware door verwijzing naar blokken met een vaste grootte, ofwel stukken ruimte.
Met andere woorden, blokopslag is wat je je voorstelt als reguliere schijfopslag op een computer. Eenmaal ingesteld, fungeert het als een uitbreiding van de huidige bestandssysteemstructuur, en je zou moeten kunnen schrijven naar of informatie lezen van elke schijf op een uitwisselbare manier.
Wat zijn Schijfpartities?
Schijfpartities zijn een manier om een opslagstation op te delen in kleinere bruikbare eenheden. Een partitie is een gedeelte van een opslagstation dat op dezelfde manier behandeld kan worden als een station zelf.
Partioneren stelt u in staat om de beschikbare ruimte op te delen en elke partitie voor een ander doel te gebruiken. Dit geeft een gebruiker meer flexibiliteit, waardoor ze mogelijk een enkele schijf kunnen opdelen voor meerdere besturingssystemen, wisselruimte of gespecialiseerde bestandssystemen.
Hoewel schijven kunnen worden geformatteerd en gebruikt zonder partionering, verwachten besturingssystemen meestal een partitietabel te vinden, zelfs als er maar één partitie op de schijf is geschreven. Het wordt over het algemeen aanbevolen om nieuwe schijven te partitioneren voor meer flexibiliteit.
MBR vs GPT
Bij het partitioneren van een schijf is het belangrijk om te weten welk partitie formaat zal worden gebruikt. Dit komt meestal neer op een keuze tussen MBR (Master Boot Record) en GPT (GUID-partitioneringstabel).
MBR is meer dan 30 jaar oud. Vanwege zijn leeftijd heeft het enkele ernstige beperkingen. Zo kan het niet worden gebruikt voor schijven groter dan 2 TB en kan het slechts een maximum van vier primaire partities hebben.
GPT is een moderner partitieschema dat enkele van de inherente problemen met MBR oplost. Systemen die GPT gebruiken, kunnen veel meer partities per schijf hebben. Dit wordt meestal alleen beperkt door de beperkingen die het besturingssysteem zelf oplegt. Bovendien bestaat de limiet voor schijfgrootte niet bij GPT en is de partitietabelinformatie beschikbaar op meerdere locaties om tegen corruptie te beschermen. GPT kan ook een “beschermende MBR” schrijven voor compatibiliteit met alleen-MBR-tools.
In de meeste gevallen is GPT de betere keuze, tenzij uw besturingssysteem u ervan weerhoudt het te gebruiken.
Formatteren en bestandssystemen
Hoewel de Linux-kernel een ruwe schijf kan herkennen, moet deze worden geformatteerd om te worden gebruikt. Formatteren is het proces waarbij een bestandssysteem op de schijf wordt geschreven en deze wordt voorbereid op bestandsbewerkingen. Een bestandssysteem is het systeem dat gegevens structureert en controleert hoe informatie wordt geschreven naar en opgehaald vanaf de onderliggende schijf. Zonder een bestandssysteem zou u het opslagapparaat niet kunnen gebruiken voor standaard bestandssysteemoperaties.
Er zijn veel verschillende bestandssysteemindelingen, elk met verschillende afwegingen, waaronder ondersteuning voor besturingssystemen. Ze bieden allemaal de gebruiker een vergelijkbare weergave van de schijf, maar de functies en platforms die ze ondersteunen, kunnen heel verschillend zijn.
Enkele van de populaire bestandssystemen voor Linux zijn:
- Ext4: Het meest populaire standaard bestandssysteem is Ext4, een opvolger van Ext2 en Ext3. Het Ext4-bestandssysteem is gejournaliseerd, achterwaarts compatibel met oudere systemen, stabiel, en heeft volwassen ondersteuning en tools. Het is een goede keuze als je geen gespecialiseerde behoeften hebt.
- XFS: XFS specialiseert zich in prestaties en grote gegevensbestanden. Het formatteert snel en heeft goede doorvoereigenschappen bij het verwerken van grote bestanden en bij het werken met grote schijven. Het heeft ook functies voor live snapshotting. XFS gebruikt metadata-journaling in tegenstelling tot het journalen van zowel de metadata als de gegevens. Dit leidt tot snelle prestaties, maar kan mogelijk leiden tot gegevenscorruptie bij een plotseling stroomverlies.
- Btrfs: Btrfs is een modern, functierijk copy-on-write-bestandssysteem. Deze architectuur maakt het mogelijk om enkele functionaliteiten voor volumemanagement te integreren binnen de bestandssysteemlaag, inclusief snapshots en klonen. Het wordt standaard gebruikt op sommige consumenten- en commerciële NAS (netwerk-gekoppelde opslag) hardware, en is populair voor toegewijde, multi-schijf arrays.
- ZFS: ZFS is nog een copy-on-write-bestandssysteem en volumemanager met een robuuste en volwassen functieset. Het concurreert redelijk direct met Btrfs, heeft functies voor gegevensintegriteit, kan grote bestandssysteemgroottes aan, heeft typische volumefuncties zoals snapshotting en klonen, en kan volumes organiseren in RAID en RAID-achtige arrays voor redundantie- en prestatiedoeleinden. ZFS heeft een controversiële geschiedenis vanwege licentieproblemen, maar het is niet veel meer of minder populair dan Btrfs als je commerciële ondersteuning in overweging neemt.
Daarnaast maakt Windows voornamelijk gebruik van *NTFS en ExFAT, en macOS maakt voornamelijk gebruik van HFS+ en APFS. Het is meestal mogelijk om deze bestandssysteemindelingen te lezen en soms te schrijven op verschillende platforms, maar dit kan extra compatibiliteitsgereedschap vereisen.
Hoe Linux opslagapparaten beheert
Apparaatbestanden in /dev
In Linux wordt bijna alles gerepresenteerd door een bestand ergens in de bestandssysteemhiërarchie. Dit omvat hardware zoals opslagstations, die op het systeem worden gerepresenteerd als bestanden in de /dev
-directory. Typisch beginnen bestanden die opslagapparaten voorstellen met sd
of hd
gevolgd door een letter. Bijvoorbeeld, de eerste schijf op een server is meestal zoiets als /dev/sda
.
Partities op deze schijven hebben ook bestanden binnen /dev
, gerepresenteerd door het toevoegen van het partitienummer aan het einde van de schijfnaam. Bijvoorbeeld, de eerste partitie op de schijf uit het vorige voorbeeld zou /dev/sda1
zijn.
Hoewel de /dev/sd*
en /dev/hd*
apparaatbestanden de traditionele manier vertegenwoordigen om naar schijven en partities te verwijzen, is er een aanzienlijk nadeel aan het gebruik van deze waarden alleen. De Linux-kernel beslist bij elke opstart welk apparaat welke naam krijgt, dus dit kan leiden tot verwarrende scenario’s waarbij uw apparaten van apparaatknooppunten veranderen.
Om dit probleem te omzeilen, bevat de /dev/disk
directory subdirectories die overeenkomen met verschillende, meer persistente manieren om schijven en partities op het systeem te identificeren. Deze bevatten symbolische koppelingen die bij het opstarten weer worden teruggekoppeld naar de juiste /dev/[sh]da*
bestanden. De koppelingen zijn genoemd naar het identificerende kenmerk van de directory (bijvoorbeeld, op partitielabel in de /dev/disk/by-partlabel
directory). Deze koppelingen zullen altijd wijzen naar de juiste apparaten, dus ze kunnen worden gebruikt als statische identificatoren voor opslagruimtes.
Enkele of alle volgende subdirectories kunnen bestaan onder /dev/disk
:
by-label
: De meeste bestandssystemen hebben een labelmechanisme dat toelaat om willekeurige door de gebruiker gespecificeerde namen toe te wijzen aan een schijf of partitie. Deze directory bestaat uit koppelingen die genoemd zijn naar deze door de gebruiker opgegeven labels.by-uuid
: UUID’s, of universeel unieke identificatoren, zijn een lange, unieke reeks letters en cijfers die kunnen worden gebruikt als een ID voor een opslagbron. Deze zijn over het algemeen niet erg menselijk leesbaar, maar zijn bijna altijd uniek, zelfs tussen systemen. Als zodanig kan het een goed idee zijn om UUID’s te gebruiken om opslag aan te duiden die mogelijk tussen systemen migreert, aangezien naamconflicten minder waarschijnlijk zijn.by-partlabel
enby-partuuid
: GPT-tabellen bieden hun eigen set labels en UUID’s, die ook kunnen worden gebruikt voor identificatie. Dit werkt op dezelfde manier als de vorige twee mappen, maar gebruikt GPT-specifieke identificatoren.by-id
: Deze map bevat links die worden gegenereerd door de eigen serienummers van de hardware en de hardware waaraan ze zijn gekoppeld. Dit is niet helemaal persistent, omdat de manier waarop het apparaat is aangesloten op het systeem deby-id
-naam kan veranderen.by-path
: Net alsby-id
vertrouwt deze map op de verbinding van een opslagapparaat met het systeem zelf. De links hier zijn geconstrueerd met behulp van de interpretatie van het systeem van de hardware die wordt gebruikt om toegang te krijgen tot het apparaat. Dit heeft dezelfde nadelen alsby-id
, omdat het aansluiten van een apparaat op een andere poort deze waarde kan wijzigen.
Gewoonlijk zijn by-label
of by-uuid
de beste opties voor persistente identificatie van specifieke apparaten.
Opmerking: DigitalOcean blokopslagvolumes beheren de serienummers van apparaten die aan het besturingssysteem worden gerapporteerd. Hierdoor kan de categorisatie by-id
betrouwbaar persistent zijn op dit platform. Dit is de voorkeursmethode om te verwijzen naar DigitalOcean-volumes, omdat het zowel persistent als voorspelbaar is bij de eerste keer opstarten.
Monteren van Blokapparaten
In Linux en andere op Unix lijkende besturingssystemen wordt het gehele systeem, ongeacht hoeveel fysieke apparaten erbij betrokken zijn, voorgesteld door een enkele verenigde bestandsstructuur. Wanneer een bestandssysteem op een schijf of partitie gebruikt moet worden, moet het worden aangesloten op de bestaande structuur. Het mounten is het proces van het koppelen van een geformatteerde partitie of schijf aan een directory binnen het Linux-bestandssysteem. De inhoud van de schijf kan vervolgens vanuit die directory worden benaderd.
Schijven worden bijna altijd gemount op toegewijde lege directories – het mounten op een niet-lege directory betekent dat de normale inhoud van de directory niet toegankelijk zal zijn totdat de schijf wordt unmounted. Er zijn veel verschillende montagemogelijkheden die ingesteld kunnen worden om het gedrag van een gemount apparaat te wijzigen. Zo kan bijvoorbeeld de schijf gemount worden in alleen-lezen modus om ervoor te zorgen dat de inhoud niet gewijzigd kan worden.
De Bestandssysteem Hiërarchie Standaard beveelt aan om /mnt
of een subdirectory eronder te gebruiken voor tijdelijk gemounte bestandssystemen. Er worden geen aanbevelingen gedaan over waar meer permanente opslag gemount moet worden, dus je kunt kiezen welk schema je wilt. In veel gevallen worden /mnt
of subdirectories van /mnt
ook gebruikt voor meer permanente opslag.
Permanente Mounts maken met /etc/fstab
Linux-systemen gebruiken een bestand genaamd /etc/fstab
(filesystemtabel) om te bepalen welke bestandssystemen tijdens het opstartproces moeten worden gemount. Bestandssystemen die geen vermelding in dit bestand hebben, worden niet automatisch gemount tenzij ze door andere software worden gescript.
Elke regel van het bestand /etc/fstab
vertegenwoordigt een ander bestandssysteem dat moet worden gemount. Deze regel specificeert het blokapparaat, het aankoppelingspunt, het formaat van de schijf, de mount-opties, evenals een paar andere stukjes informatie.
Complexere opslagbeheer
Hoewel veel gebruiksscenario’s worden ondersteund door deze kernfuncties, zijn er meer complexe beheerparadigma’s beschikbaar voor het samenvoegen van meerdere schijven, met name RAID.
Wat is RAID?
RAID staat voor redundant array of independent disks. RAID is een opslagbeheer- en virtualisatietechnologie waarmee u schijven kunt groeperen en beheren als een enkele eenheid met extra mogelijkheden.
De kenmerken van een RAID-array zijn afhankelijk van het RAID-niveau, dat bepaalt hoe de schijven in de array met elkaar verbonden zijn. Enkele van de meer voorkomende niveaus zijn:
- RAID 0: Dit niveau geeft aan dat er sprake is van schijfstrook. Dit betekent dat wanneer gegevens naar de array worden geschreven, deze lineair worden opgesplitst en verdeeld over de schijven in de set. Dit biedt een prestatieverbetering omdat er gelijktijdig naar meerdere schijven kan worden geschreven of gelezen. Het nadeel is dat een enkele schijfstoring alle gegevens in de gehele array kan verliezen, omdat geen enkele schijf voldoende informatie bevat over de inhoud om opnieuw op te bouwen. RAID 0 wordt meestal om deze reden nooit in productie gebruikt, hoewel het nuttig kan zijn als vergelijkingspunt.
- RAID 1: RAID 1 geeft schijfsynchronisatie aan. Alles wat naar een RAID 1-array wordt geschreven, wordt naar meerdere schijven geschreven. Het belangrijkste voordeel is gegevensredunantie, waardoor gegevens verloren kunnen gaan bij een harde schijfstoring aan beide zijden van de spiegel. Omdat meerdere schijven exact dezelfde gegevens bevatten, wordt uw bruikbare capaciteit met minstens de helft verminderd.
- RAID 5: RAID 5 stroopt gegevens over meerdere schijven, vergelijkbaar met RAID 0. Dit niveau implementeert echter ook een gedistribueerde pariteit over de schijven. Dit betekent dat als een schijf uitvalt, de overgebleven schijven de array kunnen herbouwen met behulp van de pariteitsinformatie die tussen hen wordt gedeeld. Meestal is dit voldoende om één schijf opnieuw op te bouwen, wat betekent dat de array elke verlies van één schijf kan overleven. RAID 5 vermindert de beschikbare ruimte in een array met de capaciteit van één schijf.
- RAID 6: RAID 6 heeft dezelfde eigenschappen als RAID 5, maar biedt dubbele pariteit. Dit betekent dat RAID 6-arrays het verlies van 2 schijven kunnen doorstaan. De capaciteit van de array wordt opnieuw beïnvloed door de hoeveelheid pariteit, wat betekent dat de bruikbare capaciteit wordt verminderd met de ruimte van twee schijven.
- RAID 10: RAID 10 is een combinatie van niveaus 1 en 0. Eerst worden twee sets gespiegelde arrays gemaakt. Vervolgens wordt de data gestreept over deze sets. Dit creëert een array met enkele redundantiekenmerken en biedt goede prestaties. Dit vereist echter nogal wat schijven, en de totale capaciteit is nog steeds minder dan de helft van de gecombineerde schijfruimte.
Waar nu naartoe?
Als je een nieuwe opslagapparaat hebt dat je in je Linux-systeem wilt gebruiken, zal dit artikel je begeleiden bij het proces van partitioneren, formatteren en aankoppelen van je nieuwe bestandssysteem. Dit zou voldoende moeten zijn voor de meeste gevallen waar je vooral bezig bent met het toevoegen van extra capaciteit. Om te leren hoe je opslagbeheertaken uitvoert, bekijk Hoe je basisbeheertaken voor opslagapparaten uitvoert in Linux.