Dit artikel is bedoeld als een bespreking op zeer hoog niveau van Linux-bestandssysteemconcepten. Het is niet bedoeld als een beschrijving op laag niveau van hoe een bepaald type bestandssysteem, zoals EXT4, werkt, noch is het bedoeld als een handleiding met bestandssysteemcommando’s.
Iedere computer voor algemeen gebruik moet gegevens van verschillende typen opslaan op een harde schijf (HDD) of een equivalent daarvan, zoals een USB-geheugenstick. Daar zijn een paar redenen voor. Ten eerste verliest RAM zijn inhoud wanneer de computer wordt uitgeschakeld. Er zijn niet-vluchtige typen RAM die de daar opgeslagen gegevens kunnen behouden nadat de stroom is uitgeschakeld (zoals flash RAM dat wordt gebruikt in USB-geheugensticks en solid state drives), maar flash RAM is veel duurder dan standaard, vluchtige RAM zoals DDR3 en andere, vergelijkbare typen.
De tweede reden dat gegevens op harde schijven moeten worden opgeslagen, is dat zelfs standaard RAM nog steeds duurder is dan schijfruimte. De kosten van zowel RAM als disk zijn snel gedaald, maar RAM is nog steeds koploper in termen van kosten per byte. Een snelle berekening van de kosten per byte, gebaseerd op de kosten voor 16 GB RAM versus een 2 TB harde schijf, laat zien dat RAM ongeveer 71 keer duurder is per eenheid dan de harde schijf. Een typische kostprijs voor RAM is ongeveer $0.00000043743750 per byte vandaag.
Om de huidige RAM-kosten in perspectief te plaatsen: in de begindagen van de informatica was een type geheugen gebaseerd op puntjes op een CRT-scherm. Dit was erg duur, ongeveer $1.00 per bit!
Definities
Je hoort mensen op een aantal verschillende en verwarrende manieren over bestandssystemen praten. Het woord zelf kan meerdere betekenissen hebben, en het kan zijn dat u de juiste betekenis moet onderscheiden uit de context van een discussie of document.
Ik zal proberen de verschillende betekenissen van het woord “bestandssysteem” te definiëren, gebaseerd op hoe ik heb waargenomen hoe het in verschillende omstandigheden werd gebruikt. Merk op dat, terwijl ik probeer te voldoen aan standaard “officiële” betekenissen, het mijn bedoeling is om de term te definiëren op basis van zijn verschillende gebruiken. Deze betekenissen zullen in meer detail worden onderzocht in de volgende secties van dit artikel.
- De volledige Linux directory structuur beginnend bij de top (/) root directory.
- Een specifiek type data opslag formaat, zoals EXT3, EXT4, BTRFS, XFS, enzovoorts. Linux ondersteunt bijna 100 soorten bestandssystemen, waaronder een aantal zeer oude en een aantal van de nieuwste. Elk van deze bestandssysteemtypen gebruikt zijn eigen metadatastructuren om te definiëren hoe de gegevens worden opgeslagen en benaderd.
- Een partitie of logisch volume geformatteerd met een specifiek type bestandssysteem dat kan worden aangekoppeld op een gespecificeerd koppelpunt op een Linux-bestandssysteem.
Basisfuncties bestandssysteem
Diskopslag is een noodzaak die een aantal interessante en onontkoombare details met zich meebrengt. Het is duidelijk dat een bestandssysteem is ontworpen om ruimte te bieden voor niet-vluchtige opslag van gegevens; dat is de uiteindelijke functie. Er zijn echter vele andere belangrijke functies die uit die eis voortvloeien.
Alle bestandssystemen moeten een naamruimte bieden – dat wil zeggen, een naamgevings- en organisatiemethodologie. Deze bepaalt hoe een bestand een naam kan krijgen, met name de lengte van een bestandsnaam en de deelverzameling van tekens die voor bestandsnamen kunnen worden gebruikt uit de totale verzameling beschikbare tekens. Het definieert ook de logische structuur van de gegevens op een schijf, zoals het gebruik van mappen om bestanden te ordenen in plaats van ze allemaal samen te voegen in een enkele, enorme conglomeratie van bestanden.
Zodra de naamruimte is gedefinieerd, is een metadatastructuur nodig om de logische basis voor die naamruimte te verschaffen. Deze omvat de gegevensstructuren die nodig zijn om een hiërarchische mappenstructuur te ondersteunen; structuren om te bepalen welke ruimteblokken op de schijf worden gebruikt en welke beschikbaar zijn; structuren die het mogelijk maken de namen van de bestanden en mappen te handhaven; informatie over de bestanden, zoals hun grootte en de tijdstippen waarop zij werden gemaakt, gewijzigd of voor het laatst werden geraadpleegd; en de plaats of plaatsen van de gegevens die bij het bestand op de schijf horen. Andere metagegevens worden gebruikt om informatie op hoog niveau op te slaan over de onderverdelingen van de schijf, zoals logische volumes en partities. Deze metagegevens op een hoger niveau en de structuren die ze vertegenwoordigen, bevatten de informatie die het bestandssysteem beschrijft dat op de schijf of de partitie is opgeslagen, maar staan los van en zijn onafhankelijk van de metagegevens van het bestandssysteem.
Bestandssystemen vereisen ook een Application Programming Interface (API) die toegang biedt tot systeemfunctieaanroepen waarmee bestandssysteemobjecten zoals bestanden en mappen kunnen worden gemanipuleerd. API’s voorzien in taken zoals het creëren, verplaatsen en verwijderen van bestanden. Zij voorzien ook in algoritmen die bepalen waar een bestand op een bestandssysteem wordt geplaatst. Dergelijke algoritmen kunnen rekening houden met doelstellingen zoals snelheid of het minimaliseren van schijffragmentatie.
Moderne bestandssystemen bieden ook een beveiligingsmodel, dat is een schema voor het definiëren van toegangsrechten tot bestanden en mappen. Het Linux-bestandssysteem beveiligingsmodel helpt om ervoor te zorgen dat gebruikers alleen toegang hebben tot hun eigen bestanden en niet die van anderen of het besturingssysteem zelf.
De laatste bouwsteen is de software die nodig is om al deze functies uit te voeren. Linux maakt gebruik van een tweedelige software-implementatie als een manier om zowel het systeem als de programmeur efficiënter te maken.
Figuur 1: De tweedelige Linux-bestandssysteemsoftware-implementatie.
Het eerste deel van deze tweedelige implementatie is het Linux virtuele bestandssysteem. Dit virtuele bestandssysteem biedt een enkele reeks commando’s voor de kernel, en ontwikkelaars, om toegang te krijgen tot alle soorten bestandssystemen. De software voor het virtuele bestandssysteem roept de specifieke apparaatstuurprogramma’s aan die nodig zijn voor de interface met de verschillende typen bestandssystemen. De bestandssysteem-specifieke apparaatstuurprogramma’s vormen het tweede deel van de implementatie. Het apparaatstuurprogramma interpreteert de standaard set van bestandssysteem commando’s naar commando’s die specifiek zijn voor het type bestandssysteem op de partitie of het logische volume.
Directory structuur
Als een meestal zeer georganiseerde Maagd, hou ik ervan dat dingen worden opgeslagen in kleinere, georganiseerde groepen in plaats van in één grote emmer. Het gebruik van mappen helpt mij om de bestanden die ik zoek op te slaan en vervolgens te lokaliseren wanneer ik ernaar op zoek ben. Directories worden ook wel mappen genoemd omdat ze kunnen worden gezien als mappen waarin bestanden worden bewaard in een soort fysieke desktop analogie.
In Linux en veel andere besturingssystemen, kunnen directories worden gestructureerd in een boom-achtige hiërarchie. De Linux-mappenstructuur is goed gedefinieerd en gedocumenteerd in de Linux Filesystem Hierarchy Standard (FHS). Het verwijzen naar deze directories bij het benaderen ervan wordt gedaan door gebruik te maken van de opeenvolgend dieper gelegen directory-namen verbonden door schuine strepen (/), zoals /var/log en /var/spool/mail. Deze worden paden genoemd.
De volgende tabel geeft een zeer beknopte lijst van de standaard, bekende en gedefinieerde top-level Linux directories en hun doeleinden.
Directory | Beschrijving |
---|---|
/ (root filesystem) | Het root filesystem is de top-level directory van het bestandssysteem. Het moet alle bestanden bevatten die nodig zijn om het Linux systeem op te starten voordat andere bestandssystemen worden gemount. Het moet alle uitvoerbare bestanden en bibliotheken bevatten die nodig zijn om de andere bestandssystemen op te starten. Nadat het systeem is opgestart, worden alle andere bestandssystemen gemount op standaard, goed gedefinieerde mount punten als subdirectories van het root bestandssysteem. |
/bin | De /bin directory bevat door de gebruiker uitvoerbare bestanden. |
/boot | Bevat de statische bootloader en kernel uitvoerbare en configuratiebestanden die nodig zijn om een Linux-computer op te starten. |
/dev | Deze directory bevat de apparaatbestanden voor elk hardware-apparaat dat aan het systeem is gekoppeld. Dit zijn geen apparaatstuurprogramma’s, maar bestanden die elk apparaat op de computer vertegenwoordigen en de toegang tot die apparaten vergemakkelijken. |
/etc | Bevat de lokale systeemconfiguratiebestanden voor de hostcomputer. |
/home | Home directory opslag voor gebruikersbestanden. Elke gebruiker heeft een subdirectory in /home. |
/lib | Bevat gedeelde bibliotheekbestanden die nodig zijn om het systeem op te starten. |
/media | Een plaats om externe verwisselbare media-apparaten zoals USB-sticks te mounten die op de host kunnen zijn aangesloten. |
/mnt | Een tijdelijk koppelpunt voor gewone bestandssystemen (dus niet verwisselbare media) dat kan worden gebruikt terwijl de beheerder een bestandssysteem repareert of eraan werkt. |
/opt | Optionele bestanden zoals door de leverancier geleverde toepassingsprogramma’s moeten hier worden geplaatst. |
/root | Dit is niet het root (/) bestandssysteem. Het is de home directory voor de root gebruiker. |
/sbin | Systeem binaire bestanden. Dit zijn uitvoerbare bestanden die worden gebruikt voor systeembeheer. |
/tmp | Tijdelijke directory. Gebruikt door het besturingssysteem en veel programma’s om tijdelijke bestanden op te slaan. Gebruikers kunnen hier ook tijdelijk bestanden opslaan. Bestanden die hier zijn opgeslagen, kunnen op elk moment worden verwijderd zonder voorafgaande kennisgeving. |
/usr | Dit zijn deelbare, alleen-lezen bestanden, inclusief uitvoerbare binaries en bibliotheken, man-bestanden, en andere soorten documentatie. |
/var | Variabele gegevensbestanden worden hier opgeslagen. Dit kunnen dingen zijn als logbestanden, MySQL, en andere database bestanden, web server data bestanden, e-mail inboxen, en nog veel meer. |
De directories en hun subdirectories in tabel 1, samen met hun subdirectories, die een groenblauwe achtergrond hebben, worden beschouwd als een integraal onderdeel van het root bestandssysteem. Dat wil zeggen, ze kunnen niet worden aangemaakt als een afzonderlijk bestandssysteem en aangekoppeld worden bij het opstarten. Dit is omdat ze (specifiek, hun inhoud) aanwezig moet zijn bij het opstarten om het systeem goed te laten opstarten.
De /media en /mnt directories zijn onderdeel van het root bestandssysteem, maar ze zouden nooit gegevens moeten bevatten. Het zijn slechts tijdelijke koppelpunten.
De resterende mappen, die in tabel 1 geen achtergrondkleur hebben, hoeven niet tijdens het opstarten aanwezig te zijn, maar worden later gemount, tijdens de opstartvolgorde die de host voorbereidt op nuttig werk.
Bezoek de officiële Linux Filesystem Hierarchy Standard (FHS) webpagina voor details over elk van deze mappen en hun vele subdirectories. Wikipedia heeft ook een goede beschrijving van de FHS. Deze standaard moet zo nauwkeurig mogelijk worden gevolgd om operationele en functionele consistentie te garanderen. Ongeacht de bestandssysteemtypen die op een host worden gebruikt, is deze hiërarchische mappenstructuur hetzelfde.
Linux verenigde mappenstructuur
In sommige niet-Linux PC besturingssystemen krijgt, als er meerdere fysieke harde schijven of meerdere partities zijn, elke schijf of partitie een stationsletter toegewezen. Het is noodzakelijk om te weten op welke harde schijf een bestand of programma zich bevindt, zoals C: of D:. Dan geeft u de stationsletter als opdracht, D: bijvoorbeeld, om naar de D: schijf te gaan, en dan gebruikt u de cd opdracht om naar de juiste map te gaan om het gewenste bestand te vinden. Elke harde schijf heeft zijn eigen aparte en complete mappenstructuur.
Het Linux bestandssysteem verenigt alle fysieke harde schijven en partities in een enkele mappenstructuur. Het begint allemaal bovenaan – de root (/) directory. Alle andere directories en hun subdirectories bevinden zich onder de enkele Linux root directory. Dit betekent dat er slechts één enkele directory-structuur is waarin naar bestanden en programma’s kan worden gezocht.
Dit kan alleen werken omdat een bestandssysteem, zoals /home, /tmp, /var, /opt, of /usr kan worden aangemaakt op afzonderlijke fysieke harde schijven, een andere partitie, of een ander logisch volume dan het / (root) bestandssysteem en vervolgens kan worden aangekoppeld op een mountpoint (directory) als onderdeel van de root bestandssysteem-structuur. Zelfs verwijderbare schijven zoals een USB thumb drive of een externe USB of ESATA harde schijf zullen worden gemount op het root bestandssysteem en worden een integraal onderdeel van die directory tree.
Een goede reden om dit te doen is duidelijk tijdens een upgrade van de ene versie van een Linux distributie naar een andere, of het veranderen van de ene distributie naar een andere. In het algemeen, en afgezien van upgrade programma’s zoals dnf-upgrade in Fedora, is het verstandig om af en toe de harde schijf(s) met het besturingssysteem te formatteren tijdens een upgrade om alle rommel die zich in de loop der tijd heeft opgehoopt te verwijderen. Als /home deel uitmaakt van het root bestandssysteem zal het ook opnieuw geformatteerd worden en zou dan hersteld moeten worden vanaf een backup. Door /home als een afzonderlijk bestandssysteem te hebben, zal het gekend zijn door het installatieprogramma als een afzonderlijk bestandssysteem en kan het formatteren ervan overgeslagen worden. Dit kan ook gelden voor /var waar database, e-mail inboxen, website, en andere variabele gebruiker en systeem gegevens worden opgeslagen.
Er zijn andere redenen om bepaalde delen van de Linux directory boom als aparte bestandssystemen te handhaven. Lang geleden bijvoorbeeld, toen ik me nog niet bewust was van de potentiële problemen rond het hebben van alle vereiste Linux-mappen als onderdeel van het / (root) bestandssysteem, slaagde ik erin om mijn home directory te vullen met een groot aantal zeer grote bestanden. Aangezien noch de /home directory noch de /tmp directory aparte bestandssystemen waren, maar gewoon subdirectories van het root bestandssysteem, liep het hele root bestandssysteem vol. Er was geen ruimte meer voor het besturingssysteem om tijdelijke bestanden aan te maken of om bestaande gegevensbestanden uit te breiden. In het begin begonnen de applicatieprogramma’s te klagen dat er geen ruimte was om bestanden op te slaan, en daarna begon het besturingssysteem zelf zich heel vreemd te gedragen. Door op te starten in single-user mode en de bestanden in mijn home directory te verwijderen, kon ik weer aan de slag. Ik heb toen Linux opnieuw geïnstalleerd met een vrij standaard multi-filesysteem setup en was in staat om complete systeem crashes te voorkomen.
Ik heb eens een situatie gehad waarbij een Linux host bleef draaien, maar de gebruiker niet kon inloggen met de GUI desktop. Ik was in staat om in te loggen met behulp van de command line interface (CLI) lokaal met behulp van een van de virtuele consoles, en op afstand met behulp van SSH. Het probleem was dat het /tmp bestandssysteem vol was en dat sommige tijdelijke bestanden die nodig waren voor de GUI desktop niet konden worden aangemaakt op het moment van inloggen. Omdat de CLI login niet vereiste dat er bestanden werden aangemaakt in /tmp, verhinderde het gebrek aan ruimte daar me niet om in te loggen via de CLI. In dit geval was de /tmp directory een apart bestandssysteem en was er voldoende ruimte beschikbaar in de volume groep waar het /tmp logische volume deel van uitmaakte. Ik breidde gewoon het /tmp logische volume uit tot een grootte die overeenkwam met mijn nieuwe begrip van de hoeveelheid tijdelijke bestandsruimte die nodig was op die host en het probleem was opgelost. Merk op dat deze oplossing geen reboot vereiste, en zodra het /tmp bestandssysteem was vergroot kon de gebruiker inloggen op de desktop.
Een andere situatie deed zich voor toen ik werkte als een lab beheerder bij een groot technologie bedrijf. Een van onze ontwikkelaars had een applicatie op de verkeerde plaats geïnstalleerd (/var). De applicatie crashte omdat het /var bestandssysteem vol was en de logbestanden, die zijn opgeslagen in /var/log op dat bestandssysteem, niet konden worden aangevuld met nieuwe berichten door gebrek aan ruimte. Het systeem bleef echter draaien omdat de kritieke / (root) en /tmp bestandssystemen niet vol raakten. Het verwijderen van de applicatie en het opnieuw installeren in het /opt bestandssysteem loste het probleem op.
Bestandssysteemtypes
Linux ondersteunt het lezen van ongeveer 100 partitietypes; het kan er maar een paar aanmaken en er naar schrijven. Maar het is mogelijk – en heel gebruikelijk – om bestandssystemen van verschillende types te mounten op hetzelfde root bestandssysteem. In deze context hebben we het over bestandssystemen in termen van de structuren en metadata die nodig zijn voor het opslaan en beheren van de gebruikersgegevens op een partitie van een harde schijf of een logisch volume. De complete lijst van bestandssysteem partitietypes die door het Linux fdisk commando worden herkend wordt hier gegeven, zodat u een gevoel kunt krijgen voor de hoge mate van compatibiliteit die Linux heeft met zeer veel soorten systemen.
0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx 5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt 9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT
Het belangrijkste doel van het ondersteunen van de mogelijkheid om zoveel partitietypes te lezen is om compatibiliteit en op zijn minst enige interoperabiliteit met bestandssystemen van andere computersystemen mogelijk te maken. De keuzes die beschikbaar zijn bij het maken van een nieuw bestandssysteem met Fedora worden getoond in de volgende lijst.
- btrfs
- cramfs
- ext2
- ext3
- ext4
- fat
- gfs2
- hfsplus
- minix
- msdos
- ntfs
- reiserfs
- vfat
- xfs
Andere distributies ondersteunen het aanmaken van verschillende bestandssysteemtypes. CentOS 6 ondersteunt bijvoorbeeld alleen het aanmaken van de vetgedrukte bestandssystemen in de bovenstaande lijst.
Mounten
De term “mounten” van een bestandssysteem in Linux verwijst terug naar de begindagen van de computer toen een tape of verwisselbaar schijfpakket fysiek op een geschikt drive-apparaat moest worden gemount. Nadat het fysiek op de drive was geplaatst, werd het bestandssysteem op de disk pack logisch gemount door het besturingssysteem om de inhoud beschikbaar te maken voor toegang door het OS, toepassingsprogramma’s en gebruikers.
Een mount point is gewoon een directory, net als elke andere, die wordt aangemaakt als onderdeel van het root bestandssysteem. Dus, bijvoorbeeld, het home bestandssysteem is aangekoppeld op de directory /home. Bestandssystemen kunnen worden gekoppeld op koppelpunten op andere niet-root bestandssystemen, maar dit is minder gebruikelijk.
Het Linux root bestandssysteem wordt gekoppeld op de root directory (/) heel vroeg in de opstartvolgorde. Andere bestandssystemen worden later aangekoppeld, door de Linux opstartprogramma’s, hetzij rc onder SystemV of door systemd in nieuwere Linux versies. Het mounten van bestandssystemen tijdens het opstartproces wordt beheerd door het /etc/fstab configuratiebestand. Een gemakkelijke manier om dat te onthouden is dat fstab staat voor “bestandssysteem tabel,” en het is een lijst van bestandssystemen die moeten worden gemount, hun aangewezen mount punten, en eventuele opties die nodig kunnen zijn voor specifieke bestandssystemen.
Filesystems are mounted on an existing directory/mount point using the mount command. In het algemeen moet elke map die als koppelpunt wordt gebruikt, leeg zijn en mag hij geen andere bestanden bevatten. Linux zal niet verhinderen dat gebruikers een bestandssysteem mounten op een bestandssysteem dat er al is of op een directory die bestanden bevat. Als u een bestandssysteem koppelt op een bestaande directory of bestandssysteem, zal de oorspronkelijke inhoud worden verborgen en alleen de inhoud van het nieuw gekoppelde bestandssysteem zichtbaar zijn.
Conclusie
Ik hoop dat een deel van de mogelijke verwarring rond de term bestandssysteem door dit artikel is opgehelderd. Het heeft me veel tijd en een behulpzame mentor gekost om de complexiteit, elegantie en functionaliteit van het Linux bestandssysteem in al zijn betekenissen te begrijpen en te waarderen.
Als je vragen hebt, stel ze dan in het commentaar hieronder en ik zal proberen ze te beantwoorden.
Volgende maand
Een ander belangrijk concept is dat voor Linux, alles een bestand is. Dit concept heeft een aantal interessante en belangrijke praktische toepassingen voor gebruikers en systeembeheerders. De reden dat ik dit noem is dat je misschien mijn “Alles is een bestand” artikel wilt lezen voor het artikel dat ik voor volgende maand gepland heb over de /dev directory.