deel 4_4_1
19-04-2006
16:00
Pagina 1
Networking Services
4/4 Bestandssystemen 4/4.1
Definitie
Structuur van Linuxbestandssystemen
Om op een optimale wijze beheer uit te kunnen voeren op een Linux-bestandssysteem, is kennis van de eigenschappen van deze bestandssystemen van essentieel belang. Daarom leest u in dit hoofdstuk welke bestandssystemen er zoal kunnen worden gebruikt op een Linux-systeem en hoe deze bestandssystemen intern zijn georganiseerd. Voordat we inhoudelijk dieper kunnen ingaan op de werking van een bestandssysteem, moet echter wel duidelijk zijn waar we het precies over hebben. Voorlopig gebruiken we de volgende definitie: een bestandssysteem bestaat uit een verzameling tabellen waarin de eigenschappen van bestanden worden bewaard en waarmee een verwijzing kan worden gegeven naar de locatie van de bij de bestanden behorende gegevens. 4/4.1.1 Typen bestandssystemen Kenmerkend voor Linux is dat meerdere soorten bestandssystemen kunnen worden gebruikt. Dit maakt het mogelijk diverse soorten bestanden te bewerken, ongeacht onder welk systeem ze zijn aangemaakt. Onder andere de volgende bestandssystemen worden ondersteund: • msdos – Levert ondersteuning voor DOS-fat. Dit bestandssysteem is achterhaald en ouderwets: in plaats hiervan wordt tegenwoordig meestal gebruikgemaakt van vfat. • umsdos – Biedt een UNIX-achtig bestandssysteem dat kan worden gebruikt in een DOS-omgeving. Wordt
Novell Netwerkoplossingen, aanvulling 19
4/4.1-1
deel 4_4_1
19-04-2006
16:00
Pagina 2
Bestandssystemen
•
• •
•
• •
• •
•
4/4.1-2
gebruikt in sommige specifieke omgevingen; vooral in embedded Linux. vfat – Geeft ondersteuning voor alle FAT-bestandssystemen die gebruikmaken van lange bestandsnamen zoals dit sinds Windows 95 de standaard is. iso9660 – Biedt ondersteuning voor cd-roms. minix – Het ‘oer’-bestandssysteem. Dit heeft de nodige beperkingen, zoals een zeer beperkte maximale partitiegrootte, en wordt daarom nagenoeg niet meer gebruikt voor partities op harddisks. ntfs(ro) – Read-only ondersteuning voor het NTFSbestandssysteem dat wordt gebruikt bij Windows NT. Tot op het moment dat dit werd geschreven, was geen goede driver beschikbaar om ook naar NTFS te schrijven. hpfs(ro) – Read-only ondersteuning voor het OS/2 hpfs-bestandssysteem. ext2 – Biedt het ext2-bestandssysteem dat jarenlang als standaard op Linux is gebruikt. Tegenwoordig wordt dit bestandssysteem alleen nog maar gebruikt als er nadrukkelijk geen journaling-capaciteiten nodig zijn. ext3 – De opvolger van ext2. Technisch gesproken is dit ext2 waar een journal aan is toegevoegd. Reiserfs – Een relatief nieuw bestandssysteem dat het mogelijk maakt om bestanden op zeer efficiënte wijze op te slaan en in te lezen. Omdat gebruik wordt gemaakt van een B-tree database in plaats van tabellen om te achterhalen hoe een bestand kan worden ingelezen, kan dit bestandssysteem zeer efficiënt zijn werk doen. sysvfs – Maakt het mogelijk gegevens in te lezen die zijn aangemaakt op commerciële UNIX-systemen, zoals SCO, Xenix en Coherent.
Novell Netwerkoplossingen, aanvulling 19
deel 4_4_1
19-04-2006
16:00
Pagina 3
Networking Services
• •
•
ufs – Voor ondersteuning van BSD en afgeleide versies van UNIX, zoals SunOS en NeXTstep. xfs – Een modern journaling bestandssysteem. Dit bestandssysteem is door SGI ontwikkeld om te worden gebruikt op supercomputers waar zeer veel processors gelijktijdig hun werk doen en biedt daarom een aantal unieke eigenschappen die het bestandssysteem op een intel platform eigenlijk overbodig maken. jfs – Een zeer efficiënt 64-bits bestandssysteem dat door IBM is ontwikkeld. Net als Reiserfs wordt door dit bestandssysteem gebruikgemaakt van een B-tree database. Op het moment dat een zeer grote directory wordt gebruikt, wordt een B+-tree database gebruikt om ervoor te zorgen dat in de grote hoeveelheid bestanden in die directory toch efficiënt kan worden gezocht.
Behalve de hiervoor genoemde bestandssystemen wordt in Linux ook ondersteuning geboden voor netwerkgerelateerde bestandssystemen, zoals NFS (UNIX-netwerken), SMB (Windows-netwerken) en NCP (Novell-netwerken). Hiermee kunnen bestanden vanuit een Linux-omgeving van de desbetreffende bestandsserver worden benaderd, maar Linux kan ook worden ingezet als NFS-, SMB- of NCPserver. Alle bestandssystemen die worden gebruikt op een Linuxsysteem worden benaderd vanuit één directory-structuur. De bestandssystemen moeten in deze directory-structuur worden gemount om te kunnen worden benaderd. Binnen deze structuur heeft elk bestandssysteem zijn eigen partitie. Voor de fysieke opslag van een bestandssysteem worden block-devices gebruikt, zoals /dev/sda1 of /dev/hda1. Het is de verantwoordelijkheid van de driver die bij het
Novell Netwerkoplossingen, aanvulling 19
4/4.1-3
deel 4_4_1
19-04-2006
16:00
Pagina 4
Bestandssystemen
block-device hoort dat gegevens van een partitie kunnen worden opgehaald. De driver van het block-device zorgt dat de aanvraag naar een specifiek blok kan worden vertaald in termen van tracks, sectoren en cilinders op de harddisk waarop het bestand is opgeslagen.
VFS
Omdat Linux ondersteuning levert voor verschillende soorten bestandssystemen, is ervoor gekozen de ondersteuning niet te regelen in de kernel zelf, maar in een tussenliggende laag. Deze interfacelaag staat bekend als het Virtual File System, oftewel VFS. De kernel communiceert hiermee en elk apart bestandssysteem heeft een interface naar VFS. Voor de eindgebruiker heeft het gebruik van VFS het voordeel dat deze gebruiker zich verder helemaal niet bewust hoeft te zijn van de verschillen die een rol spelen binnen de bestandssystemen die op een server worden gebruikt. Wegens de unieke eigenschappen van de verschillende bestandssystemen, worden Linux-servers vaak gepartitioneerd, waarbij soms per partitie een verschillend bestandssysteem wordt gebruikt. Zo is ext2 een uitstekende keuze voor een partitie als /boot die alleen wordt gebruikt om van op te starten, ligt ext3 voor de hand voor een database die alleen maar grote bestanden aanmaakt, terwijl de excellente eigenschappen van Reiserfs en JFS meer voor de hand liggen om te gebruiken op een partitie waar een mailserver per dag grote hoeveelheden bestanden wegschrijft.
Ext2
4/4.1-4
4/4.1.2 Opbouw van het bestandssysteem Het Second Extended File system (ext2) is een opvolger van het Extended File system (ext) en is lange tijd de standaard geweest voor alle Linux-distributies. Onder de motorkap heeft ook ext3 nog alle eigenschappen van ext2. Omdat ext2 een uitstekend voorbeeld is van de manier
Novell Netwerkoplossingen, aanvulling 19
deel 4_4_1
19-04-2006
16:00
Pagina 5
Networking Services
waarop een Linux-bestandssysteem in elkaar zit, bespreken we nu in iets meer detail de organisatie ervan. De primaire taak van ext2 is de opslag van gegevens in gegevensblokken. De grootte hiervan wordt gedefinieerd bij het aanmaken van een partitie en is standaard 1024 bytes. Een blok is de kleinste toewijzingseenheid; dat betekent dat een bestand, ook al is het maar 1 byte groot, altijd minimaal een blok in beslag neemt. Omdat dit natuurlijk tot relatief veel verlies van bruikbare schijfruimte leidt, maakt een bestandssysteem als Reiserfs bijvoorbeeld gebruik van tailing waarbij meerdere bestanden een datablok kunnen delen. Om toegang te krijgen tot de datablokken van het bestandssysteem, maakt elk modern UNIX-bestandssysteem gebruik van een inode waarin de complete administratie van het bestandssysteem wordt geregeld. Inodes Voor de beschrijving van de inrichting van het bestandssysteem worden inodes gebruikt. De inode beschrijft in welke blokken de gegevens van een bestand staan, welke permissies en eigenaars aan het bestand zijn verbonden en wat voor type bestand het is. Kort gezegd bevat de inode de totale administratie van een bestand. Elk bestand heeft één inode en elke inode heeft een uniek nummer. De verzameling van inodes wordt bewaard in de inode-tabel. Deze inode-tabel wordt door de meeste bestandssystemen aangemaakt tijdens het creëren van het bestandssysteem en ligt daarna vast. Alleen meer geavanceerde bestandssystemen als Reiserfs en JFS zijn in staat later dynamisch nieuwe inodes aan te maken. Een directory op een bestandssysteem bevat een lijst van de inodes in de directory en deze lijst kan worden opgevraagd met behulp van de opdracht ls -i.
Novell Netwerkoplossingen, aanvulling 19
4/4.1-5
deel 4_4_1
19-04-2006
16:00
Pagina 6
Bestandssystemen
#Inhoud van een inode debugfs: stat <460842> Inode: 460842
Type: regular
Flags: 0x0
Version: 1
User: 0
Group: 0 Size 16784
File ACL: 0
Directory ACL: 0
Links: 1
Blockcount: 36
Fragment: Address: 0
Number: 0
Mode: 0755
Size: 0
ctime: 0x381edca8 – Tue Nov 2 13:44:24 1999 atime: 0x38216b6c – Thu Nov 4 12:18:04 1999 mtime: 0x37157697 – Thu Apr 15 07:18:15 1999 BLOCKS: 1844692 1844693 1844694 1844695 1844696 1844697 1844698 1844699 1844700 TOTAL: 18
De inode is de meest elementaire bouwsteen van het ext2bestandssysteem. Dit geldt overigens ook voor vrijwel alle andere UNIX-bestandssystemen die u in een Linux-omgeving tegenkomt. Elk bestand en elke directory in het bestandssysteem worden beschreven in één inode. De inodes worden bewaard in de inode-tabel. Om snel te kunnen zien welke inodes nog beschikbaar zijn, wordt voor de administratie van het bestandssysteem door het besturingssysteem gebruikgemaakt van een inode-bitmap. Deze wordt opgeslagen aan het begin van elk bestandssysteem. Een inode bevat de volgende velden (zie ook figuur op pagina 7): • mode – Beschrijft het soort bestand (bestand, link, block-device enz.) en welke permissies op het bestand zijn ingesteld. • owner information – Geeft UID en GID van de eigenaars van het bestand. • size – De grootte in bytes.
4/4.1-6
Novell Netwerkoplossingen, aanvulling 19
deel 4_4_1
19-04-2006
16:00
Pagina 7
Networking Services
•
•
timestamps – Een Linux-bestand heeft altijd drie timestamps. Als eerste is dat de ctime (creation time) die aangeeft wanneer het bestand is gemaakt. Vervolgens geeft de mtime (modification time) aan wanneer de inhoud van het bestand voor het laatst is gewijzigd en tot slot is er de atime (access time) die wordt gebruikt om aan te geven wanneer het bestand voor het laatst is gewijzigd. data blocks – Verwijzing naar de blokken waarin zich de gegevens van het bestand bevinden. Alleen de eerste twaalf genoemde blokken verwijzen direct naar fysieke blokken waarin gegevens staan opgeslagen. Daarop volgt een indirect block, dat verwijst naar de maximaal 256 volgende blokken met de gegevens van een bestand. Na het indirect block volgt het double indirect block. Hierin staat een verwijzing naar 256 additionele indirect blocks. Ten slotte komt het triple indirect block, dat een verwijzing bevat naar 256 additionele double indirect blocks.
De organisatie van een ext2-bestandssysteem.
Novell Netwerkoplossingen, aanvulling 19
4/4.1-7
deel 4_4_1
19-04-2006
16:00
Pagina 8
Bestandssystemen
Een inode kan dus een directe verwijzing hebben naar 12 gegevensblokken, via indirect blocks komen daar 256 blokken bij, via double indirect blocks komen daar 65.536 blokken bij en via triple indirect blocks komen daar nog eens 16.777.216 blokken bij. U kunt dus uitrekenen wat de maximale bestandsgrootte op ext2 is. Ext2 zorgt ervoor dat de gebruikte partitie wordt onderverdeeld in block-groups. Alle block-groups bevatten informatie die cruciaal is voor het bestandssysteem. Daarnaast worden de gegevensblokken erin bewaard. Op kleinere bestandssystemen zijn dit 8192 gegevensblokken per block-group, op grotere bestandssystemen wordt een veelvoud daarvan gebruikt. Zo heeft een partitie van 3 gigabyte block-groups met 32.768 gegevensblokken. Het aantal blokken per block-group is te achterhalen met het commando debugfs dat overigens alleen kan worden gebruikt op ext2 en ext3. Na opstarten geeft debugfs een interactieve interface van waaruit u opdrachten kunt geven. Om een overzicht te krijgen van de organisatie van een block-group, geeft u vanuit debugfs het commando open /dev/sdx (of /dev/hdx, al naar gelang het type schijf dat u gebruikt), daarna geeft u het commando stats. In het overzicht dat daardoor wordt gegenereerd, komt een regel voor waarin het aantal blokken per group staat. • superblock • group-descriptors • block-bitmap • inode-bitmap • inode-tabel • data blocks Deze onderdelen worden hierna uitvoeriger besproken.
4/4.1-8
Novell Netwerkoplossingen, aanvulling 19
deel 4_4_1
19-04-2006
16:00
Pagina 9
Networking Services
Superblocks Het superblock bevat een beschrijving van grootte en inrichting van het bestandssysteem. Deze informatie wordt gebruikt voor onderhoud van het bestandssysteem. De normale situatie is dat het superblock in block-group 0 wordt gelezen bij het mounten van een bestandssysteem, maar elke block-group bevat een kopie van het superblock, dat kan worden gebruikt als zich problemen voordoen. Er bestaan dus meerdere reservekopieën van. Het superblock bevat essentiële informatie die nodig is bij het mounten van een partitie. Er komt onder andere de volgende informatie in voor: • magic number – Met het magic number kan het commando mount bepalen dat dit inderdaad een ext2bestandssysteem is. Het magic number voor ext2 is 0xEF53. • revision level – Hiermee kan tijdens het mount-proces worden bepaald welke functionaliteit door deze versie van het bestandssysteem wordt geleverd. • mount count en maximum mount count – Het aantal malen dat het bestandssysteem is gemount en het maximum aantal malen dat het mag worden gemount voordat een controle moet worden uitgevoerd. Afhankelijk van deze gegevens kan onderhoud op het bestandssysteem worden uitgevoerd, op ext2 is dit onderhoud te organiseren met behulp van de opdracht tune2fs. Raadpleeg de man-pagina van tune2fs voor meer details. • block group number – Nummer van de block-group waarin deze kopie van het superblock voorkomt. • free blocks – Het aantal vrije blokken. Deze informatie wordt verkregen uit de block-bitmap. • free inodes – Het aantal vrije inodes. Deze informatie wordt verkregen uit de inode-bitmap.
Novell Netwerkoplossingen, aanvulling 19
4/4.1-9
deel 4_4_1
19-04-2006
16:00
Pagina 10
Bestandssystemen
•
first inode – Het inode-nummer van de eerste inode. In het root-bestandssysteem dient dit de inode van de root-directory te zijn.
# Inhoud van een superblock debugfs: stats Filesystem is read-only Volume name=(none) Last mounted directory = (none) Filesystem UUID = 95815b3c-9122-11d3-99c90000e876f98e Last mount time = Fri Dec 17 14:33:57 1999 Last write time = Fri Dec 17 14:33:57 1999 Mount counts = 10 (maximal = 20) Filesystem OS type = Linux Superblock size = 1024 Block size=1024, fragment size = 1024 Inode size = 128 968704 inodes, 875432 free 3871633 blocks, 1923074 free, 193581 reserved, first block = 1 8192 blocks per group 8192 fragments per group 2048 inodes per group 473 group (15 descriptor blocks) Group 0: block bitmap at 17, inode bitmap at 18, inode table at 19 0 free blocks, 1734 free inodes, 3 used directories Group 1: block bitmap at 8209, inode bitmap at 8210, inode table at 8211 0 free blocks, 1979 free inodes, 2 used directories ...
4/4.1-10
Novell Netwerkoplossingen, aanvulling 19
deel 4_4_1
19-04-2006
16:00
Pagina 11
Networking Services
Group-descriptors De gegevensstructuur van elke block-group wordt beschreven in de group-descriptor. Net als de superblocks worden ook de group-descriptors van block-groups gedupliceerd. Elke group-descriptor omvat de volgende informatie: • blocks-bitmap – Het bloknummer van de block-allocation bitmap die voor deze block-group wordt gebruikt. Deze bitmap wordt gebruikt bij het toewijzen en vrijgeven van blokken; zo kan het systeem snel zien welke blokken wel of niet beschikbaar zijn. • inode-bitmap – Het bloknummer van de inode-allocation bitmap van deze block-group. Deze wordt gebruikt bij het toewijzen en vrijgeven van inodes. • inode table – Bevat het bloknummer van het blok waarin de inode-tabel van deze block-group begint. • free blocks count – Geeft informatie over vrije blokken en inodes. • free inodes count – Laat zien hoeveel inodes er nog beschikbaar zijn • used directory count – Toont het aantal directory’s dat momenteel in gebruik is.
Op ext2 heeft elke block group zijn eigen administratie.
Novell Netwerkoplossingen, aanvulling 19
4/4.1-11
deel 4_4_1
19-04-2006
16:00
Pagina 12
Bestandssystemen
Block- en inode-bitmape De block- en de inode-bitmap geven een overzicht van vrije blokken en inodes binnen een block-group. Als een bestand moet worden aangemaakt, wordt met deze bitmaps achterhaald welke blokken en inodes vrij zijn. Hierdoor kan het systeem snel bepalen waar nieuwe gegevens kunnen worden geplaatst. Directory’s Directory’s dienen voor het terugvinden van bestanden. In feite is een directory niets anders dan een bijzonder type bestand dat geen gegevens bevat maar verwijzingen naar bestanden die in de directory voorkomen. Tip
Benieuwd naar de interne organisatie van een directory? Gebruik dan eens de opdracht ls om de inhoud van een directory te bekijken. Elke directory bevat een aantal directory-entries, waarbij elke directory-entry de naam van het desbetreffende bestand, de bijbehorende inode en de lengte van de directory-entry bevat. Aan de hand van de naam van een bestand kan dus in de directory de bijbehorende inode worden gevonden, vervolgens wordt in de inode gevonden in welke blokken het bestand is opgeslagen en kan het bestand worden ingelezen. Aan de hand van de volledige naam kan een bestand altijd worden teruggevonden op het systeem. Als wordt gezocht naar het bestand /etc/hosts, wordt allereerst de inode van de directory / gezocht. Als deze is gevonden, kunnen via de inode de gegevens worden uitgelezen uit de juiste blokken. In deze blokken wordt een lijst gevonden van bestanden die voorkomen in de directory, zo ook de naam van de directory ‘etc’ met de bijbehorende inode. Vervolgens kun-
4/4.1-12
Novell Netwerkoplossingen, aanvulling 19
deel 4_4_1
19-04-2006
16:00
Pagina 13
Networking Services
nen via de inode uit de blokken die bij etc horen, de gegevens worden ingelezen. Daardoor wordt de informatie over het bestand hosts gevonden, met de bijbehorende inode waardoor de gegevensblokken kunnen worden gevonden en het bestand kan worden ingelezen. 4/4.1.3 Het Virtual File System (VFS) VFS is het bestandssysteem dat door de kernel wordt gebruikt en alle bestandssystemen beheert die zijn gemount. Deze taak wordt uitgevoerd met behulp van gegevensstructuren die het hele VFS beschrijven en daarnaast ook de werkelijke gemounte bestandssystemen zoals ext2 en VFAT. In VFS worden gegevensstructuren ook beschreven met behulp van inodes en directory’s. Voor activering van een bestandssysteem op een blockdevice leest VFS het superblock van dat bestandssysteem in. Hierdoor kan de topologie van het specifieke bestandssysteem worden ingevoegd in de topologie van VFS. Deze informatie wordt in VFS opgeslagen in een VFS-superblock. VFS houdt een lijst bij van actieve bestandssystemen en de bijbehorende VFS-superblocks.
Cache
VFS zorgt er ook voor dat inodes die vaak worden gelezen, worden bewaard in de inode-cache. Hierdoor kan veelgebruikte informatie sneller worden opgevraagd. Daarnaast voorziet de kernel in een buffercache waarin de gegevens van bestanden worden bewaard zodat ze sneller kunnen worden teruggehaald. Op deze manier is het niet nodig bestanden te benaderen met de technieken van het specifieke bestandssysteem en de specifieke device-driver van het block-device. In plaats daarvan kan de kernel één routine gebruiken om snel gegevens in te lezen.
Novell Netwerkoplossingen, aanvulling 19
4/4.1-13
deel 4_4_1
19-04-2006
16:00
Pagina 14
Bestandssystemen
Elk afzonderlijk bestandssysteem wordt in VFS vertegenwoordigd door een VFS-superblock. Hierin staat onder andere de volgende informatie: • device – De naam van het block-device waarop het bestandssysteem voorkomt. • inode-pointers – Er is een mounted inode-pointer die verwijst naar de eerste inode in het specifieke bestandssysteem; daarnaast is er een covered inodepointer die verwijst naar de inode van de directory waarop het bestandssysteem is gemount. • block-size – Beschrijft de grootte van de blokken die door het betreffende bestandssysteem worden gebruikt. • filesystem type – Beschrijft het soort bestandssysteem (reiser, ext2, ext3, enzovoort). • filesystem specific – Een pointer naar specifieke informatie die dit bestandssysteem nodig heeft. Naast de superblocks maakt VFS ook gebruik van specifieke inodes. Deze bestaan alleen in het kernel-geheugen en vormen een weerspiegeling van de inodes van de onderliggende bestandssystemen. 4/4.1.4 Registreren van bestandssystemen Voordat een bestandssysteem kan worden gebruikt, moet het tijdens de compilatie van de kernel worden geregistreerd. Dit betekent dat ondersteuning voor het bestandssysteem aanwezig moet zijn, zodat VFS ermee kan werken. In het bestand /proc/filesystems wordt bijgehouden welke bestandssystemen zijn geregistreerd. In de kernel staan in de meeste gevallen modules aan voor alle mogelijke bestandssystemen die u zou willen gebruiken. Soms echter zal het nodig zijn deze module eerst handmatig te laden voordat u het bestandssysteem kunt mounten.
4/4.1-14
Novell Netwerkoplossingen, aanvulling 19