En diskussion på højt niveau af Linux-filsystemkoncepter

Denne artikel er beregnet til at være en diskussion på meget højt niveau af Linux-filsystemkoncepter. Det er ikke hensigten at være en beskrivelse på lavt niveau af, hvordan en bestemt filsystemtype, f.eks. EXT4, fungerer, og det er heller ikke hensigten at være en vejledning i filsystemkommandoer.

Alle almindelige computere har brug for at gemme data af forskellige typer på en harddisk (HDD) eller noget tilsvarende, f.eks. en USB-hukommelsespind. Der er et par grunde til dette. For det første mister RAM-hukommelsen sit indhold, når computeren slukkes. Der findes ikke-flygtige typer RAM, som kan bevare de data, der er lagret der, efter at strømmen er afbrudt (f.eks. flash RAM, der anvendes i USB-hukommelsespinde og solid state-drev), men flash RAM er meget dyrere end standard, flygtig RAM som DDR3 og andre, lignende typer.

Den anden grund til, at data skal lagres på harddiske, er, at selv standard RAM stadig er dyrere end diskplads. Både RAM- og diskomkostningerne er faldet hurtigt, men RAM er stadig førende med hensyn til omkostninger pr. byte. En hurtig beregning af omkostningerne pr. byte, baseret på omkostningerne for 16 GB RAM i forhold til en harddisk på 2 TB, viser, at RAM er ca. 71 gange dyrere pr. enhed end harddisken. En typisk pris for RAM er i dag ca. 0,0000000043743750 USD pr. byte.

For at sætte de nuværende RAM-omkostninger i perspektiv skal det nævnes, at i de allerførste dage af computerindustrien var en type hukommelse baseret på prikker på en CRT-skærm. Dette var meget dyrt med omkring 1,00 dollars pr. bit!

Definitioner

Du kan høre folk tale om filsystemer på en række forskellige og forvirrende måder. Selve ordet kan have flere betydninger, og du kan være nødt til at skelne den korrekte betydning ud fra sammenhængen i en diskussion eller et dokument. Jeg vil forsøge at definere de forskellige betydninger af ordet “filsystem” ud fra, hvordan jeg har observeret, hvordan det bliver brugt under forskellige omstændigheder. Bemærk, at selv om jeg forsøger at overholde de “officielle” standardbetydninger, er det min hensigt at definere begrebet ud fra dets forskellige anvendelser. Disse betydninger vil blive uddybet i de følgende afsnit af denne artikel.

  1. Hele Linux-mappestrukturen med udgangspunkt i rodmappen øverst (/).
  2. En specifik type datalagringsformat, f.eks. EXT3, EXT4, BTRFS, XFS osv. Linux understøtter næsten 100 typer filsystemer, herunder nogle meget gamle typer samt nogle af de nyeste. Hver af disse filsystemtyper bruger sine egne metadatastrukturer til at definere, hvordan dataene lagres og tilgås.
  3. En partition eller logisk volumen formateret med en bestemt type filsystem, der kan monteres på et angivet monteringspunkt på et Linux-filsystem.

Grundlæggende filsystemfunktioner

Disklagring er en nødvendighed, der bringer nogle interessante og uundgåelige detaljer med sig. Det er indlysende, at et filsystem er designet til at give plads til ikke-flygtig lagring af data; det er dets ultimative funktion. Der er imidlertid mange andre vigtige funktioner, der følger af dette krav.

Alle filsystemer skal tilvejebringe et navnerum – dvs. en navngivning og organisatorisk metodologi. Denne definerer, hvordan en fil kan navngives, specielt længden af et filnavn og den delmængde af tegn, der kan bruges til filnavne ud af det samlede sæt af tilgængelige tegn. Den definerer også den logiske struktur for dataene på en disk, f.eks. brugen af mapper til organisering af filer i stedet for blot at samle dem alle sammen i et enkelt, stort konglomerat af filer. Når navneområdet er defineret, er det nødvendigt med en metadatastruktur for at skabe det logiske grundlag for dette navneområde. Dette omfatter de datastrukturer, der er nødvendige for at understøtte en hierarkisk mappestruktur; strukturer til at bestemme, hvilke blokke af plads på disken der er brugt, og hvilke der er tilgængelige; strukturer, der gør det muligt at vedligeholde navnene på filerne og mapperne; oplysninger om filerne, f.eks. deres størrelse og tidspunkter, hvor de blev oprettet, ændret eller sidst tilgået; og placeringen eller placeringerne af de data, der hører til filen, på disken. Andre metadata bruges til at gemme oplysninger på højt niveau om diskens underopdelinger, f.eks. logiske volumener og partitioner. Disse metadata på højere niveau og de strukturer, de repræsenterer, indeholder de oplysninger, der beskriver det filsystem, der er gemt på drevet eller partitionen, men er adskilt fra og uafhængig af filsystemets metadata.

Filsystemer kræver også en API (Application Programming Interface), der giver adgang til systemfunktionsopkald, som manipulerer filsystemobjekter som filer og mapper. API’er giver mulighed for opgaver som f.eks. oprettelse, flytning og sletning af filer. Det giver også algoritmer, der bestemmer ting som f.eks. hvor en fil er placeret i et filsystem. Sådanne algoritmer kan tage hensyn til mål som f.eks. hastighed eller minimering af diskfragmentering.

Moderne filsystemer indeholder også en sikkerhedsmodel, som er et skema til at definere adgangsrettigheder til filer og mapper. Linux-filsystemets sikkerhedsmodel er med til at sikre, at brugerne kun har adgang til deres egne filer og ikke til andres filer eller til selve operativsystemet.

Den sidste byggesten er den software, der er nødvendig for at implementere alle disse funktioner. Linux anvender en todelt softwareimplementering som en måde at forbedre både systemets og programmørens effektivitet.


Figur 1: Linux’ todelte filsystemsoftwareimplementering.

Den første del af denne todelte implementering er det virtuelle filsystem i Linux. Dette virtuelle filsystem giver et enkelt sæt kommandoer til kernen og udviklere til at få adgang til alle typer filsystemer. Softwaren til det virtuelle filsystem kalder den specifikke enhedsdriver, der er nødvendig for at skabe en grænseflade til de forskellige typer filsystemer. De filsystemspecifikke enhedsdrivere er den anden del af implementeringen. Enhedsdriveren fortolker standardsættet af filsystemkommandoer til dem, der er specifikke for den type filsystem på partitionen eller det logiske volumen.

Katalogstruktur

Som normalt meget organiseret Jomfru kan jeg godt lide, at ting gemmes i mindre, organiserede grupper frem for i én stor spand. Brugen af mapper hjælper mig til at kunne gemme og derefter finde de filer, jeg ønsker, når jeg leder efter dem. Directories er også kendt som mapper, fordi de kan opfattes som mapper, hvori filer opbevares i en slags fysisk skrivebordsanalogi.

I Linux og mange andre styresystemer kan directories struktureres i et trælignende hierarki. Linux-mappestrukturen er veldefineret og dokumenteret i Linux Filesystem Hierarchy Standard (FHS). Referencer til disse mapper ved adgang til dem sker ved at bruge de sekventielt dybere mappenavne, der er forbundet med skråstreger (/), som f.eks. /var/log og /var/spool/mail. Disse kaldes stier.

Den følgende tabel indeholder en meget kort liste over de standardiserede, velkendte og definerede Linux-mapper på øverste niveau og deres formål.

Mappe Beskrivelse
/ (rodfilesystem) Rodfilesystemet er mappen på øverste niveau i filsystemet. Det skal indeholde alle de filer, der er nødvendige for at starte Linux-systemet op, før andre filsystemer monteres. Den skal indeholde alle de nødvendige eksekverbare programmer og biblioteker, der er nødvendige for at starte de resterende filsystemer op. Når systemet er startet op, monteres alle andre filsystemer på standardiserede, veldefinerede monteringspunkter som undermapper til rodfilssystemet.
/bin Mappen /bin indeholder brugerens eksekverbare filer.
/boot Indeholder de statiske bootloader- og kerneeksekverbare filer og konfigurationsfiler, der er nødvendige for at starte en Linux-computer op.
/dev Denne mappe indeholder enhedsfilerne for hver hardwareenhed, der er tilsluttet systemet. Det er ikke enhedsdrivere, men derimod filer, der repræsenterer hver enhed på computeren og letter adgangen til disse enheder.
/etc Indeholder de lokale systemkonfigurationsfiler for værtscomputeren.
/home Hjemmappeopbevaring af brugerfiler i mappen. Hver bruger har en undermappe i /home.
/lib Indeholder delte biblioteksfiler, der er nødvendige for at starte systemet op.
/media Et sted til montering af eksterne flytbare medieenheder, f.eks. USB-drev, der kan være tilsluttet værten.
/mnt Et midlertidigt monteringspunkt for almindelige filsystemer (som i ikke flytbare medier), der kan bruges, mens administratoren reparerer eller arbejder på et filsystem.
/opt Optionelle filer, f.eks. programprogrammer leveret af leverandøren, skal placeres her.
/root Dette er ikke roden (/) filsystemet. Det er hjemmappen for root-brugeren.
/sbin Det er systemets binære filer. Det er eksekverbare programmer, der bruges til systemadministration.
/tmp Temporær mappe. Bruges af operativsystemet og mange programmer til at gemme midlertidige filer. Brugere kan også gemme filer midlertidigt her. Bemærk, at filer, der er gemt her, kan slettes når som helst uden forudgående varsel.
/usr Dette er filer, der kan deles og kun kan læses, herunder eksekverbare binære filer og biblioteker, man-filer og andre typer dokumentation.
/var Variable datafiler gemmes her. Dette kan omfatte ting som logfiler, MySQL- og andre databasefiler, datafiler fra webservere, e-mail-indbakker og meget mere.

Tabel 1: Det øverste niveau i Linux-filsystemets hierarki.

De mapper og deres undermapper, der er vist i tabel 1, samt deres undermapper, der har en grøngrøn baggrund, betragtes som en integreret del af rodfilssystemet. Det vil sige, at de ikke kan oprettes som et separat filsystem og monteres ved opstart. Dette skyldes, at de (nærmere bestemt deres indhold) skal være til stede ved opstart, for at systemet kan starte korrekt op.

Katalogerne /media og /mnt er en del af rodfilesystemet, men de bør aldrig indeholde nogen data. De er snarere blot midlertidige monteringspunkter.

De resterende mapper, de mapper, der ikke har nogen baggrundsfarve i tabel 1, behøver ikke at være til stede under opstartssekvensen, men vil blive monteret senere, under opstartssekvensen, der forbereder værten til at udføre nyttigt arbejde.

Sørg for at se den officielle Linux Filesystem Hierarchy Standard (FHS)-webside for at få oplysninger om hver af disse mapper og deres mange undermapper. Wikipedia har også en god beskrivelse af FHS. Denne standard bør følges så nøje som muligt for at sikre operationel og funktionel konsistens. Uanset hvilke filsystemtyper der anvendes på en vært, er denne hierarkiske mappestruktur den samme.

Linux forenet mappestruktur

I nogle ikke-Linux-pc-operativsystemer, hvis der er flere fysiske harddiske eller flere partitioner, tildeles hver disk eller partition et drevbogstav. Det er nødvendigt at vide, på hvilken harddisk en fil eller et program er placeret, f.eks. C: eller D:. Derefter angiver du drevbogstavet som en kommando, f.eks. D:, for at skifte til D:-drevet, og derefter bruger du cd-kommandoen til at skifte til den korrekte mappe for at finde den ønskede fil. Hver harddisk har sit eget separate og fuldstændige mappetræ.

Linux-filsystemet forener alle fysiske harddiske og partitioner i en enkelt mappestruktur. Det hele starter i toppen – i rodmappen (/). Alle andre mapper og deres undermapper er placeret under den enkelte Linux-rootmappe. Det betyder, at der kun er ét enkelt mappetræ, som man kan søge efter filer og programmer i.

Dette kan kun fungere, fordi et filsystem, f.eks. /home, /tmp, /var, /opt eller /usr kan oprettes på separate fysiske harddiske, en anden partition eller et andet logisk volumen end / (rod)filsystemet og derefter monteres på et monteringspunkt (mappe) som en del af rodfilsystemtræet. Selv flytbare drev som f.eks. et USB-tommelfinger drev eller en ekstern USB- eller ESATA-harddisk vil blive monteret på rodfilssystemet og blive en integreret del af dette mappetræ.

En god grund til at gøre dette er tydelig under en opgradering fra en version af en Linux-distribution til en anden, eller ved skift fra en distribution til en anden. Generelt, og bortset fra eventuelle opgraderingsværktøjer som f.eks. dnf-upgrade i Fedora, er det klogt af og til at omformatere harddisken/harddiskene, der indeholder operativsystemet, under en opgradering for på positiv vis at fjerne al snavs, der har ophobet sig over tid. Hvis /home er en del af root-filsystemet, vil det også blive omformateret og skal derefter gendannes fra en sikkerhedskopi. Ved at have /home som et separat filsystem vil det være kendt af installationsprogrammet som et separat filsystem, og formateringen af det kan springes over. Dette kan også gælde for /var, hvor database, e-mail-indbakker, websted og andre variable bruger- og systemdata er gemt.

Der er andre grunde til at opretholde visse dele af Linux-mappetræet som separate filsystemer. For eksempel lykkedes det mig for lang tid siden, da jeg endnu ikke var klar over de potentielle problemer ved at have alle de nødvendige Linux-mapper som en del af / (root) filsystemet, at fylde min hjemmemappe med et stort antal meget store filer. Da hverken /home-mappen eller /tmp-mappen var separate filsystemer, men blot undermapper til rodfilssystemet, blev hele rodfilssystemet fyldt op. Der var ikke mere plads til, at operativsystemet kunne oprette midlertidige filer eller udvide eksisterende datafiler. I første omgang begyndte applikationsprogrammerne at klage over, at der ikke var plads til at gemme filer, og derefter begyndte selve operativsystemet at opføre sig meget mærkeligt. Ved at starte op til enkeltbrugertilstand og rydde de ulovlige filer i min hjemmemappe kunne jeg komme i gang igen. Jeg geninstallerede derefter Linux ved hjælp af en ret standard opsætning med flere filsystemer og kunne forhindre, at der igen skete fuldstændige systemnedbrud.

Jeg havde engang en situation, hvor en Linux-vært fortsatte med at køre, men forhindrede brugeren i at logge ind ved hjælp af GUI-skrivebordet. Jeg var i stand til at logge ind ved hjælp af kommandolinjeinterfacet (CLI) lokalt ved hjælp af en af de virtuelle konsoller og eksternt ved hjælp af SSH. Problemet var, at /tmp-filsystemet var fyldt op, og at nogle midlertidige filer, som GUI-skrivebordet havde brug for, ikke kunne oprettes på logintidspunktet. Da CLI-login ikke krævede, at der blev oprettet filer i /tmp, forhindrede manglen på plads der ikke, at jeg kunne logge ind med CLI. I dette tilfælde var mappen /tmp et separat filsystem, og der var masser af plads til rådighed i den volumengruppe, som den logiske /tmp-volumen var en del af. Jeg udvidede simpelthen det logiske /tmp-volumen til en størrelse, der passede til min nye forståelse af mængden af den midlertidige filplads, der var nødvendig på den pågældende vært, og problemet var løst. Bemærk, at denne løsning ikke krævede en genstart, og så snart /tmp-filsystemet var blevet udvidet, kunne brugeren logge ind på skrivebordet.

En anden situation opstod, mens jeg arbejdede som laboratorieadministrator i en stor teknologivirksomhed. En af vores udviklere havde installeret et program på den forkerte placering (/var). Programmet gik ned, fordi /var-filsystemet var fuldt, og logfilerne, som er gemt i /var/log på dette filsystem, kunne ikke tilføjes nye meddelelser på grund af pladsmangel. Systemet blev dog ved med at være oppe og køre, fordi de kritiske filsystemer / (root) og /tmp ikke blev fyldt op. Ved at fjerne det ulovlige program og geninstallere det i /opt-filsystemet blev problemet løst.

Filsystemtyper

Linux understøtter læsning af omkring 100 partitionstyper; det kan kun oprette og skrive til nogle få af disse. Men det er muligt – og meget almindeligt – at montere filsystemer af forskellige typer på det samme rodfilesystem. I denne sammenhæng taler vi om filsystemer i form af de strukturer og metadata, der er nødvendige for at lagre og administrere brugerdata på en partition på en harddisk eller et logisk volumen. Den fuldstændige liste over filsystempartitionstyper, der genkendes af Linux-kommandoen fdisk, er angivet her, så du kan få en fornemmelse af den høje grad af kompatibilitet, som Linux har med meget mange typer systemer.

 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

Det vigtigste formål med at understøtte muligheden for at læse så mange partitionstyper er at muliggøre kompatibilitet og i det mindste en vis interoperabilitet med andre computersystemers filsystemer. De valgmuligheder, der er tilgængelige, når du opretter et nyt filsystem med Fedora, er vist i den følgende liste.

  • btrfs
  • cramfs
  • ext2
  • ext3
  • ext4
  • fat
  • gfs2
  • hfsplus
  • minix
  • msdos
  • ntfs
  • reiserfs
  • vfat
  • xfs

Andre distributioner understøtter oprettelse af forskellige filsystemtyper. CentOS 6 understøtter f.eks. kun oprettelse af de filsystemer, der er fremhævet med fed i ovenstående liste.

Montering

Udtrykket “at montere” et filsystem i Linux refererer tilbage til de tidlige dage af computerbrug, hvor en bånd- eller flytbar diskpakke skulle monteres fysisk på en passende drev-enhed. Efter at være blevet fysisk placeret på drevet, ville filsystemet på diskpakken blive logisk monteret af operativsystemet for at gøre indholdet tilgængeligt for adgang for operativsystemet, programprogrammer og brugere. Et monteringspunkt er simpelthen en mappe, som enhver anden, der oprettes som en del af rodfilssystemet. Så f.eks. er filsystemet home monteret på mappen /home. Filsystemer kan monteres på monteringspunkter på andre filsystemer, der ikke er rodfilesystemer, men det er mindre almindeligt. Linux’ rodfilesystem monteres på rodmappen (/) meget tidligt i opstartssekvensen. Andre filsystemer monteres senere, af Linux-startprogrammerne, enten rc under SystemV eller af systemd i nyere Linux-udgaver. Montering af filsystemer under opstartsprocessen styres af konfigurationsfilen /etc/fstab. En nem måde at huske det på er, at fstab står for “filsystemtabel”, og det er en liste over filsystemer, der skal monteres, deres udpegede monteringspunkter og eventuelle indstillinger, der måtte være nødvendige for specifikke filsystemer.

Filsystemer monteres på en eksisterende mappe/monteringspunkt ved hjælp af kommandoen mount. Generelt skal enhver mappe, der bruges som et monteringspunkt, være tom og ikke indeholde andre filer. Linux forhindrer ikke brugere i at montere et filsystem over et filsystem, der allerede er der, eller på en mappe, der indeholder filer. Hvis du monterer et filsystem på en eksisterende mappe eller et eksisterende filsystem, vil det oprindelige indhold blive skjult, og kun indholdet af det nyligt monterede filsystem vil være synligt.

Slutning

Jeg håber, at noget af den mulige forvirring omkring begrebet filsystem er blevet afklaret med denne artikel. Det tog lang tid og en meget hjælpsom mentor, før jeg virkelig forstod og værdsatte kompleksiteten, elegancen og funktionaliteten af Linux-filsystemet i alle dets betydninger.

Hvis du har spørgsmål, så tilføj dem i kommentarerne nedenfor, og jeg vil forsøge at besvare dem.

Næste måned

Et andet vigtigt begreb er, at for Linux er alt en fil. Dette koncept har nogle interessante og vigtige praktiske anvendelser for brugere og systemadministratorer. Grunden til, at jeg nævner dette, er, at du måske vil læse min artikel “Alt er en fil” før den artikel, jeg planlægger at skrive i næste måned om /dev-mappen.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.