De Linux System Administrators' Guide Versie 0.6.2 Lars Wirzenius <[1]liw@iki.fi> Joanna Oja <[2]viu@iki.fi> Vertaald door: Ellen Bokhorst <[3]bokkie@nl.linux.org> Een introductie systeembeheer van een Linux-systeem voor beginners. Copyright 1993--1998 Lars Wirzenius. Handelsmerken zijn in handen van hun eigenaren. Het is toegestaan letterlijke kopieën van dit handboek te maken en te distribueren op voorwaarde dat de copyright vermelding en deze permissie vermelding op alle kopieën behouden blijft. Het is toegestaan de code van de bron van dit document via TeX of andere formatters te verwerken en de resultaten af te drukken, en het afgedrukte document te distribueren, op voorwaarde dat het afgedrukte document is voorzien van een permissie vermelding die identiek is aan deze vermelding, inclusief de verwijzingen naar waar de broncode en de officiële homepage te vinden is. Het is toegestaan gewijzigde versies van dit handboek te kopiëren en te distribueren onder de condities van het letterlijke kopiëren, op voorwaarde dat het volledige resulterende afgeleide werk wordt gedistribueerd onder de voorwaarden van een permissie vermelding die identiek is aan deze vermelding. Het is toegestaan om vertalingen van dit handboek te kopiëren en distribueren, onder de bovengenoemde voorwaarden voor gewijzigde versies. De auteur zou het waarderen als hij op de hoogte wordt gesteld van gewijzigde, vertaalde, en afgedrukte versies. Dank u. _________________________________________________________________ Inhoudsopgave [4]Toewijding [5]Beschikbare bron en voorgeformatteerde versies 1. [6]Introductie [7]Het Linux Documentatie Project 2. [8]Overzicht van een Linux-systeem [9]Diverse onderdelen van een besturingssysteem [10]Belangrijke onderdelen van de kernel [11]Belangrijke services in een UNIX systeem [12]init [13]Logins vanaf terminals [14]Syslog [15]Periodieke commando uitvoering: cron en at [16]Grafische gebruikersinterface [17]Netwerken [18]Netwerk logins [19]Netwerk bestandssystemen [20]Mail [21]Afdrukken [22]De layout van het bestandssysteem 3. [23]Overzicht van de Directory Structuur [24]Achtergrond [25]Het root bestandssysteem [26]De /etc directory [27]De /dev directory [28]Het /usr bestandssysteem [29]Het /var bestandssysteem [30]Het /proc bestandssysteem 4. [31]Disks en Andere Opslagmedia Gebruiken [32]Twee soorten apparaten [33]Harddisks [34]Diskettes [35]CD-ROM's [36]Tapes [37]Formatteren [38]Partities [39]De MBR, bootsector en partitietabel [40]Extended en logische partities [41]Partitie typen [42]Partitioneren van een harddisk [43]Devicebestanden en partities [44]Bestandssystemen [45]Wat zijn bestandssystemen? [46]Bestandssystemen in overvloed [47]Welk bestandssysteem zou moeten worden gebruikt? [48]Aanmaken van een bestandssysteem [49]Mounten en unmounten [50]Controleren van de integriteit van een bestandssysteem met fsck [51]Controleren op diskfouten met badblocks [52]Fragmentatie te lijf gaan [53]Andere tools voor alle bestandssystemen [54]Andere tools voor het ext2 bestandssysteem [55]Disks zonder bestandssystemen [56]Toewijzen van diskruimte [57]Partitioneringsschema's [58]Ruimte benodigdheden [59]Voorbeelden van een harddisk toewijzing [60]Meer diskruimte voor Linux toevoegen [61]Tips voor het besparen van diskruimte 5. [62]Geheugenbeheer [63]Wat is virtueel geheugen? [64]Aanmaken van swap space [65]Gebruiken van swap space [66]Het delen van swap spaces met andere besturingssystemen [67]Toewijzen van swap space [68]De buffer cache 6. [69]Boot En Shutdown [70]Een overzicht van boots en shutdowns [71]Het bootproces nader bekeken [72]Meer over shutdowns [73]Rebooten [74]Single user mode [75]Nood opstartdiskettes 7. [76]init [77]init is als eerste aan de beurt [78]Configureren van init om getty te starten: het bestand /etc/inittab [79]Run levels [80]Speciale configuratie in /etc/inittab [81]Booten in single user mode 8. [82]In- en uitloggen [83]Logins via terminals [84]Logins via het netwerk [85]Wat login doet [86]X en xdm [87]Toegangsbeheer [88]Opstarten van de Shell 9. [89]Beheren van gebruikersaccounts [90]Wat is een account? [91]Aanmaken van een gebruiker [92]/etc/passwd en andere informatieve bestanden [93]Uitkiezen van numerieke gebruikers- en groep id's [94]Initiële omgeving: /etc/skel [95]Met de hand aanmaken van een gebruiker [96]Veranderen van de eigenschappen van een gebruiker [97]Verwijderen van een gebruiker [98]Een gebruiker tijdelijk deactiveren 10. [99]Backups [100]Het belang van backups [101]Kiezen van het backupmedium [102]Uitkiezen van een backup tool [103]Eenvoudige backups [104]Backups maken met tar [105]Terugzetten van bestanden met tar [106]Multilevel backups [107]Waarvan maak je een backup [108]Gecomprimeerde backups 11. [109]Bijhouden van de Tijd [110]Tijdzones [111]De hardware- en software-klok [112]Tonen en instellen van de tijd [113]Wanneer de klok niet goed staat [114]Woordenlijst (DRAFT) Lijst van tabellen 4-1. [115]Partitie typen (van het Linux programma fdisk ). 7-1. [116]Run level nummers 10-1. [117]Efficiënt backupschema met meerdere backuplevels Lijst van figuren 2-1. [118]Een aantal van de meer belangrijke onderdelen van de Linux-kernel 3-1. [119]Onderdelen van een Unix directory-structuur. Onderbroken lijnen duiden op partitie limieten. 4-1. [120]Een schematische afbeelding van een harddisk. 4-2. [121]Een voorbeeld van een harddisk partitionering. 4-3. [122]Drie aparte bestandssystemen. 4-4. [123]/home en /usr zijn gemount. 4-5. [124]Voorbeelduitvoer van dumpe2fs 8-1. [125]Logins via terminals: de interactie van init, getty, login, en de shell. 10-1. [126]Een voorbeeld multi-level backupschema. _________________________________________________________________ Toewijding Deze plek is opgedragen aan een toekomstige toewijding. _________________________________________________________________ Beschikbare bron en voorgeformatteerde versies De broncode en andere leesbare formaten van dit boek zijn te vinden op het Internet via anonymous FTP op de homepage van het Linux Documentation Project [127]http://sunsite.unc.edu/LDP/, of op de homepage van dit boek op [128]http://www.iki.fi/viu/linux/sag/. Op z'n minst zijn de PostScript en TeX .DVI formaten beschikbaar. _________________________________________________________________ Hoofdstuk 1. Introductie "In the beginning, the file was without form, and void; and emptiness was upon the face of the bits. And the Fingers of the Author moved upon the face of the keyboard. And the Author said, Let there be words, and there were words." Dit handboek, de Linux System Administrators' Guide, beschrijft de aspecten van het systeembeheer voor het gebruik van Linux. Het is bedoeld voor die mensen die niets tot weinig weten over systeembeheer (zoals in ``wat is het?''), maar die zich reeds de beginselen voor het normaal gebruik eigen hebben gemaakt. Dit handboek vertelt je dan ook niet hoe je Linux moet installeren; dat wordt beschreven in het `Installation and Getting Started' document. Zie hieronder voor meer informatie over Linux handboeken. Systeembeheer is alles wat men moet doen om een computersysteem in bruikbare vorm te behouden. Hieronder bevinden zich zaken zoals het maken van een backup voor bestanden (en ze terug te zetten als dat nodig is), het installeren van nieuwe programma's, aanmaken van accounts voor gebruikers (en ze verwijderen wanneer ze niet langer nodig zijn), ervoor zorgen dat het bestandssysteem niet beschadigd raakt, enzovoort. Als een computer zeg maar een huis zou zijn, zou systeembeheer onderhoud worden genoemd, en zou bestaan uit het schoonmaken, herstellen van gebroken ramen en andere dergelijke zaken. Systeembeheer wordt geen onderhoud genoemd, omdat dat te eenvoudig zou zijn. [129][1] De structuur van dit handboek is zodanig opgezet dat veel van de hoofdstukken onafhankelijk van elkaar bruikbaar zijn, zodat als je informatie over, laten we zeggen, backups nodig hebt, je gewoon dat hoofdstuk kunt lezen. Hopelijk maakt dit het boek eenvoudiger te gebruiken als een referentiehandboek, en wordt het hierdoor mogelijk om slechts een gedeelte te lezen, wanneer het nodig is, in plaats van alles te moeten lezen. Dit handboek is echter als eerste en voornaamste een tutorial, en slechts enkel door een gelukkige toevallige samenloop van omstandigheden een referentiehandboek. Het is niet de bedoeling dat dit handboek volledig op zichzelf wordt gebruikt. Veel van de rest van de Linux documentatie is ook belangrijk voor systeembeheerders. Per slot van rekening is een systeembeheerder gewoon een gebruiker met speciale privileges en verplichtingen. Een zeer belangrijke bron zijn de manual pages, die altijd geraadpleegd zouden moeten worden als een commando niet bekend is. Ondanks dat dit handboek op Linux is gericht, is de algemene stelregel geweest dat het bovendien ook bruikbaar zou moeten zijn voor andere besturingssystemen die op UNIX zijn gebaseerd. Helaas, aangezien er zoveel variatie is in de verschillende versies van UNIX in het algemeen, en systeembeheer in het bijzonder, is er weinig hoop om alle varianten te bestrijken. Zelfs het bestrijken van alle mogelijkheden van Linux is moeilijk, vanwege de aard van de ontwikkeling ervan. Er is geen officiële Linux-distributie, dus verschillende mensen hebben verschillende setups, en veel mensen hebben een setup die ze zelf hebben opgebouwd. Dit boek is niet op een specifieke distributie gericht, ik gebruik zelf echter bijna exclusief het Debian GNU/Linux systeem. Ik heb geprobeerd, daar waar mogelijk, op verschillen te wijzen, en verscheidene alternatieven uitgelegd. Ik heb getracht te beschrijven hoe zaken werken, in plaats van slechts ``vijf makkelijke stappen'' voor iedere taak op te sommen. Dit betekent dat hierin veel informatie staat die niet iedereen nodig heeft, maar die delen zijn als zodanig gemarkeerd en kunnen worden overgeslagen als je een voorgeconfigureerd systeem gebruikt. Alles lezen zal natuurlijk je begrip van het systeem verhogen en zou het gebruik en beheer prettiger moeten maken. Zoals met alle andere Linux gerelateerde ontwikkeling werd het werk op vrijwilligersbasis uitgevoerd. Ik deed het omdat ik dacht dat het misschien leuk zou zijn en omdat ik het gevoel had dat het gedaan zou moeten worden. Zoals echter met al het vrijwilligerswerk, is er een grens aan hoeveel moeite ik kan spenderen, en ook hoeveel kennis en ervaring ik heb. Dit betekent dat het handboek niet noodzakelijk zo goed is als het zou zijn geweest als een deskundige zou zijn betaald om het geleidelijk te schrijven en er een paar jaar aan had gespendeerd om het te perfectioneren. Ik denk, natuurlijk, dat het redelijk goed is, maar wees gewaarschuwd. Één bepaald punt waar ik de kantjes vanaf heb gelopen, is dat ik niet alles door en door heb behandeld, wat reeds goed is gedocumenteerd in andere vrij-verkrijgbare handboeken. Dit geldt vooral voor documentatie die specifiek is voor een programma, zoals alle details over het gebruik van mkfs. Ik beschrijf slechts het doel van het programma, en zoveel van het gebruik als nodig is voor het doel van dit handboek. Voor verdere informatie verwijs ik de vriendelijke lezer naar deze andere handboeken. Meestal maakt de documentatie waarnaar verwezen wordt, onderdeel uit van de volledige set Linux documentatie. Ondanks dat Lars heeft geprobeerd dit handboek zo goed mogelijk samen te stellen, zou ik, als de huidige beheerder, het goede werk in stand houden. Ik zou heel graag van je willen horen als je ideeën hebt hoe het beter gemaakt kan worden. Slecht taalgebruik, feitelijke fouten, ideeën voor verslag uitbrengen over nieuwe gebieden, herschreven secties, informatie over hoe de diverse UNIX versies het doen, ik ben er allemaal in geïnteresseerd. De informatie over hoe je contact met me op kunt nemen is beschikbaar via het World Wide Web op [130]http://www.iki.fi/viu/mail-to-lasu.html. Veel mensen hebben me direct of indirect met dit boek geholpen. Ik zou in het bijzonder Matt Welsh voor de inspiratie en het LDP leiderschap willen bedanken, Andy Oram voor het me weer aan het werk krijgen en te voorzien in veel waardevolle feedback, Olaf Kirch voor dat hij aantoonde dat het ik het voor elkaar kon krijgen, en Adam Richter van Yggdrasil en anderen die me in lieten zien dat ook andere mensen het interessant kunnen vinden. Stephen Tweedie, H. Peter Anvin, Remy Card, Theodore Ts'o, en Stephen Tweedie hebben mij hun werk laten lenen (en dat heeft ervoor gezorgd dat dit boek er dikker en indrukwekkender uitziet): een vergelijking tussen het xia en ext2 bestandssysteem, de device list en een beschrijving van het ext2 bestandssysteem. Deze maken geen onderdeel meer uit van het boek. Ik ben hiervoor zeer dankbaar, en maak mijn excuses voor de eerdere versies waarin soms de juiste toekenningen ontbraken. Bovendien zou ik Mark Komarinski willen bedanken voor het verzenden van zijn materiaal in 1993 en de vele colums in Linux Journal over systeembeheer. Ze waren zeer informatief en inspirerend. Een groot aantal mensen hebben me veel bruikbare opmerkingen gestuurd. In mijn zeer kleine archief kan ik niet alle namen vinden, maar een aantal van hun zijn, in alfabetische volgorde: Paul Caprioli, Ales Cepek, Marie-France Declerfayt, Dave Dobson, Olaf Flebbe, Helmut Geyer, Larry Greenfield en zijn vader, Stephen Harris, Jyrki Havia, Jim Haynes, York Lam, Timothy Andrew Lister, Jim Lynch, Michael J. Micek, Jacob Navia, Dan Poirier, Daniel Quinlan, Jouni K Seppänen, Philippe Steindl, G.B. Stotte. Mijn verontschuldigingen voor iedereen die ik vergeten ben. META moet hier typografische conventies en LDP zaken toevoegen. _________________________________________________________________ Het Linux Documentatie Project Het Linux Documentatie Project, of LDP, bestaat uit een onsamenhangend team met schrijvers, proeflezers en editors die samenwerken om te voorzien in complete documentatie voor het besturingssysteem Linux. De overkoepelende coördinator van het project is Greg Hankins. Dit handboek is er één uit een set met verscheidene handboeken die door de LDP worden gedistribueerd, waaronder een Linux Users' Guide, System Administrators' Guide, Network Administrators' Guide, en een Kernel Hackers' Guide. Deze handboeken zijn allen beschikbaar in het bronformaat, .dvi formaat, en postscript uitvoer via anonymous FTP via sunsite.unc.edu, in de directory /pub/Linux/docs/LDP. We moedigen iedereen met een neiging tot schrijven of redigeren aan om zich bij ons aan te sluiten in het verbeteren van de Linux documentatie. Als je toegang hebt tot Internet e-mail, kun je contact opnemen met Greg Hankins via <[131]gregh@sunsite.unc.edu>. _________________________________________________________________ Hoofdstuk 2. Overzicht van een Linux-systeem "God looked over everything he had made, and saw that it was very good. " (Genesis 1:31) Dit hoofdstuk geeft een overzicht van een Linux-systeem. Als eerste worden de belangrijke services beschreven, waarin het besturingssysteem voorziet. Vervolgens worden de programma's die deze services implementeren beschreven, waarbij de details weloverwogen zijn weggelaten. Het doel van dit hoofdstuk is om begrip bij te brengen voor het systeem in zijn geheel, en dus ieder onderdeel elders in detail te beschrijven. _________________________________________________________________ Diverse onderdelen van een besturingssysteem Een UNIX besturingssysteem bestaat uit een kernel en een aantal systeemprogramma's. Er zijn ook een aantal applicatieprogramma's die het werk doen. De kernel is het hart van het besturingssysteem. [132][2] Het houdt de bestanden op de disks bij, start programma's en voert ze gelijktijdig uit, wijst geheugen en andere bronnen toe aan diverse processen, ontvangt pakketjes van en zendt pakketjes naar het netwerk, enzovoort. De kernel doet van zichzelf erg weinig, maar het voorziet in tools waarmee alle services kunnen worden gebouwd. Het voorkomt ook dat iedereen de hardware direct benadert, door van iedereen te verlangen de tools te gebruiken waarin het voorziet. Op deze manier zorgt de kernel ervoor dat een gebruiker wordt afgeschermd voor de andere gebruikers. De tools waarin door de kernel wordt voorzien, worden gebruikt via system calls; zie manual page sectie 2 voor meer informatie hierover. De systeemprogramma's gebruiken de tools waarin door de kernel is voorzien om de diverse services te implementeren die vereist zijn voor een besturingssysteem. Systeemprogramma's en alle andere programma's, draaien `bovenop de kernel' in wat een user mode wordt genoemd. Het verschil tussen systeem- en applicatieprogramma's is de bedoeling ervan: applicaties zijn bedoeld om bruikbare zaken gedaan te krijgen (of om te spelen, als het een spel is), terwijl systeemprogramma's daarentegen nodig zijn om het systeem te laten werken. Een tekstverwerker is een applicatie; telnet is een systeemprogramma. Het verschil is echter vaak wat onduidelijk, en is alleen belangrijk voor geobsedeerde categorie-indelers. Een besturingssysteem kan ook compilers en de corresponderende libraries bevatten (onder Linux zijn dit in het bijzonder de GCC en de C library), alhoewel niet alle programmeertalen onderdeel van het besturingssysteem hoeven te zijn. Documentatie, en soms zelfs spellen kunnen er ook deel van uitmaken. Volgens traditie wordt het besturingssysteem gedefinieerd door de inhoud van de installatie-tape of -disks; met Linux is dat niet duidelijk, aangezien het over de FTP-sites in de wereld is verspreid. _________________________________________________________________ Belangrijke onderdelen van de kernel De Linux-kernel bestaat uit verscheidene belangrijke onderdelen: procesbeheer, geheugenbeheer, devicedrivers voor de hardware, drivers voor het bestandssysteem, netwerkbeheer, en diverse andere stukjes en beetjes. [133]Figuur 2-1 toont er een aantal van. Figuur 2-1. Een aantal van de meer belangrijke onderdelen van de Linux-kernel [overview-kernel.png] Waarschijnlijk zijn de belangrijkste onderdelen van de kernel (niets werkt zonder) het geheugenbeheer en procesbeheer. Geheugenbeheer zorgt voor het toewijzen van geheugengebieden en swapgebieden aan processen, delen van de kernel, en voor de buffer cache. Procesbeheer maakt processen aan, en implementeert multitasking door de actieve processen voor de processor te verwisselen. Op het laagste niveau bevat de kernel devicedrivers voor de hardware, voor iedere soort hardware die het ondersteunt. Aangezien er in de wereld zoveel verschillende soorten hardware zijn, is het aantal devicedrivers voor de hardware groot. Er zijn vaak veel andere vergelijkbare stukjes hardware die verschillen in hoe ze door software worden aangestuurd. De overeenkomsten maken het mogelijk om drivers die vergelijkbare bewerkingen ondersteunen, in algemene klassen in te delen; ieder lid van de klasse heeft dezelfde interface voor de rest van de kernel, maar verschilt in wat nodig is om ze te implementeren. Alle diskdrivers bijvoorbeeld, lijken voor de rest van de kernel op elkaar, d.w.z. ze hebben allen bewerkingen zoals `initialiseer de drive', `lees sector N', en `schrijf sector N'. Een aantal software services waarin door de kernel zelf wordt voorzien, hebben vergelijkbare eigenschappen, en kunnen daarom in klassen worden geabstraheerd. De diverse netwerkprotocollen zijn bijvoorbeeld geabstraheerd in één programmeer interface, de BSD socket library. Een ander voorbeeld is de Virtuele File System (VFS) laag, die de bestandssysteem bewerkingen abstraheert van hun implementatie. Ieder type bestandssysteem voorziet in een implementatie van iedere bestandssysteem bewerking. Wanneer één of andere entiteit een bestandssysteem probeert te gebruiken, gaat het verzoek via het VFS, die het verzoek naar de juiste driver van het bestandssysteem leidt. _________________________________________________________________ Belangrijke services in een UNIX systeem Deze sectie beschrijft een aantal van de belangrijkere UNIX services, maar zonder al te veel details. Ze worden in latere hoofdstukken grondiger beschreven. _________________________________________________________________ init De allerbelangrijkste service in een UNIX systeem wordt door init verzorgd. init wordt als het eerste proces op ieder UNIX-systeem gestart, als het laatste wat de kernel doet wanneer het boot. Wanneer init start, vervolgt dit het bootproces door diverse opstartkarweitjes uit te voeren (controleren en mounten van bestandssystemen, starten van daemons, enz). De exacte lijst met dingen die init doet, is afhankelijk van welke variant het is; er zijn er verscheidene om uit te kiezen. init voorziet meestal in het concept single user mode, waarin niemand in kan loggen en root een shell op de console gebruikt; de gebruikelijke modus wordt multiuser mode genoemd. Een aantal varianten generaliseren dit als run levels; single en multi-user modes worden geacht twee run levels te zijn, en er kunnen er bovendien nog meer van zijn, om bijvoorbeeld X op de console uit te voeren. Onder normale bewerking, zorgt init ervoor dat getty functioneert (om gebruikers toe te staan in te loggen), en om weesprocessen te adopteren (processen waarvan de ouder is overleden; in UNIX moeten alle processen in een enkele structuur voorkomen, dus wezen moeten worden geadopteerd). Wanneer het systeem wordt uitgezet, is init belast met het `killen' van alle andere processen, unmounten van alle besturingssystemen en het stoppen van de processor, samen met al het andere, waarvoor het is geconfigureerd. _________________________________________________________________ Logins vanaf terminals Logins vanaf terminals (via seriële lijnen) en de console (wanneer X niet draait) worden verschaft door het programma getty. init start voor iedere terminal, waarvoor logins zijn toegestaan een aparte instance van getty. getty leest de gebruikersnaam en voert het login programma uit, welke het wachtwoord inleest. Als de gebruikersnaam en het wachtwoord correct zijn, start login de shell op. Wanneer de shell eindigt, d.w.z. de gebruiker logt uit, of wanneer login eindigt, omdat de gebruikersnaam en het wachtwoord niet overeenkwamen, merkt init dit op en start een nieuwe instance van getty. De kernel heeft geen notie van logins, dit wordt allemaal door de systeemprogramma's afgehandeld. _________________________________________________________________ Syslog De kernel en veel systeemprogramma's produceren foutmeldingen, waarschuwingen en andere berichten. Vaak is het belangrijk dat deze meldingen later nog eens kunnen worden bekeken, zelfs veel later, zodat ze naar een bestand geschreven zouden moeten worden. Het programma dat dit doet, heet syslog. Het kan zodanig worden geconfigureerd dat het de meldingen naar diverse bestanden sorteert, naar gelang wie de schrijver is of de mate van belangrijkheid. Meldingen van de kernel worden vaak gescheiden van de andere meldingen en naar een apart bestand gestuurd, aangezien meldingen van de kernel vaak belangrijker zijn en regelmatig moeten worden gelezen om problemen te kunnen herkennen. _________________________________________________________________ Periodieke commando uitvoering: cron en at Zowel gebruikers als systeembeheerders moeten vaak periodiek commando's uitvoeren. De systeembeheerder wil misschien een commando uitvoeren om de directories met tijdelijke bestanden (/tmp en /var/tmp) van oude bestanden te schonen, of om te voorkomen dat de disks vollopen, aangezien niet alle programma's op de juiste wijze achter zich opruimen. De cron service is ingesteld om dit te doen. Iedere gebruiker heeft een crontab bestand, waarin hij de commando's zet die hij uit wil voeren en de tijden dat ze uitgevoerd zouden moeten worden. De cron daemon zorgt ervoor dat de commando's worden opgestart op die tijd die is aangegeven. De at service is vergelijkbaar met cron, maar het is slechts éénmalig: het commando wordt op de gegeven tijd uitgevoerd, maar het wordt niet herhaald. _________________________________________________________________ Grafische gebruikersinterface UNIX en Linux nemen de gebruikersinterface niet in de kernel op; in plaats daarvan, laten ze het door programma's op gebruikersniveau implementeren. Dit geldt voor zowel de tekstmodus als de grafische omgevingen. Deze regeling maakt het systeem flexibeler, maar heeft als nadeel dat het eenvoudig is om voor ieder programma een andere gebruikersinterface te implementeren, wat het moeilijker maakt om het systeem te leren. De grafische omgeving die primair onder Linux wordt gebruikt, wordt het X Window System (afgekort tot X) genoemd. X implementeert ook geen gebruikersinterface; het implementeert alleen een window systeem, d.w.z. tools waarmee een grafische interface kan worden geïmplementeerd. De drie populairste gebruikersinterface stijlen voor X zijn Athena, Motif, en Open Look. _________________________________________________________________ Netwerken Het gebruik maken van netwerken is de handeling, waarbij twee of meer computers met elkaar worden verbonden, zodat ze met elkaar kunnen communiceren. De eigenlijke methoden van het maken van de verbinding en het bewerkstelligen van de communicatie zijn wat gecompliceerd, maar het eindresultaat is zeer bruikbaar. UNIX besturingssystemen hebben veel netwerkeigenschappen. De meeste basis services (bestandssystemen, afdrukken, backups, enz.) kunnen over het netwerk worden gedaan. Dit kan het systeembeheer eenvoudiger maken, aangezien het een gecentraliseerde administratie toestaat en er nog steeds van de voordelen van het werken op microcomputers en een gedistribueerde gegevensverwerking wordt geprofiteerd, zoals een verlaging van de kosten en betere fout-tolerantie. Dit boek werpt echter slechts enkel een blik op het werken met netwerken; zie de Linux Network Administrators' Guide voor meer informatie, waaronder een basisbeschrijving van hoe netwerken functioneren. _________________________________________________________________ Netwerk logins Netwerklogins werken iets anders dan normale logins. Er is een aparte fysieke seriële lijn voor iedere terminal via welke het mogelijk is om in te loggen. Voor iedere persoon die via het netwerk inlogt, is er een aparte virtuele netwerkverbinding en er kunnen er een willekeurig aantal van zijn. [134][3] Het is daarom niet mogelijk om een apart getty voor iedere mogelijke virtuele verbinding te draaien. Er zijn ook diverse verschillende manieren om via een netwerk in te loggen, in TCP/IP netwerken zijn telnet en rlogin daarvan de belangrijkste. Netwerklogins hebben, in plaats van een hoop getty's, een enkele daemon per manier waarop wordt ingelogd, (telnet en rlogin hebben aparte daemons) die naar alle inkomende pogingen om in te loggen luisteren. Als het er één bemerkt, start het een nieuwe instance van zichzelf om die enkele poging af te handelen; de originele instance blijft vervolgens naar andere pogingen luisteren. De nieuwe instance werkt op vergelijkbare wijze als getty. _________________________________________________________________ Netwerk bestandssystemen Één van de meer nuttige dingen die met netwerkservices kunnen worden bewerkstelligd, is het delen van bestanden via een netwerk bestandssysteem. Datgene wat meestal wordt gebruikt, wordt het Network File System, of NFS genoemd, ontwikkeld door Sun. Met een netwerk bestandssysteem worden alle door een programma uitgevoerde bestandsbewerkingen op de ene computer via het netwerk verzonden naar een andere computer. Hiermee wordt het programma voor de gek gehouden, omdat het denkt dat alle bestanden op de andere computer zich eigenlijk op de computer bevinden, waarop het programma wordt uitgevoerd. Dit maakt het delen van informatie uitermate eenvoudig, aangezien het geen aanpassing aan programma's vereist. _________________________________________________________________ Mail Elektronische mail is meestal de belangrijkste methode om via de computer te communiceren. Een elektronische brief wordt in een bestand met een speciaal formaat opgeslagen, en er worden speciale mailprogramma's gebruikt om de brieven te verzenden en te lezen. Elke gebruiker heeft een inkomende mailbox (een bestand in het speciale formaat), waarin alle mail wordt opgeslagen. Als iemand mail verstuurt, lokaliseert het mailprogramma de mailbox van de ontvanger en voegt de brief toe aan het mailbox bestand. Als de mailbox van de ontvanger zich op een andere computer bevindt, dan wordt de brief naar de andere computer verzonden, die hem in de mailbox bezorgt, waarin deze het best past. Het mailsysteem bestaat uit heel wat programma's. De bezorging van mail naar lokale of remote mailboxen wordt gedaan door één programma (de mail transfer agent of MTA, b.v. sendmail of smail), terwijl er van de programma's, waar de gebruikers gebruik van maken, veel en gevarieerde (mail user agents of MUA's zijn, b.v., pine of elm). De mailboxen worden meestal in /var/spool/mail opgeslagen. _________________________________________________________________ Afdrukken Slechts één persoon tegelijkertijd kan een printer gebruiken, maar het is niet economisch om de printers niet tussen de gebruikers te delen. De printer wordt daarom beheerd door software die een afdrukwachtrij implementeert: alle afdruktaken worden in een wachtrij geplaatst en wanneer de printer met een taak klaar is, wordt de volgende er automatisch naar toegestuurd. Dit ontheft de gebruikers van het organiseren van de afdrukwachtrij en het gevecht om de zeggenschap over de printer. [135][4] De software voor de afdrukwachtrij spoolt ook de afdrukken naar de disks, d.w.z. de tekst wordt in een bestand bewaard ten tijde dat de taak zich in de wachtrij bevindt. Hierdoor kan een applicatieprogramma de afdruktaken snel naar de software van de afdrukwachtrij doorsluizen; de applicatie hoeft niet te wachten totdat de taak echt is afgedrukt om verder te kunnen gaan. Dit is echt heel prettig, aangezien het de mogelijkheid biedt de ene versie af te drukken, en het niet nodig is met afdrukken te wachten, voordat men een volledige gereviseerde nieuwe versie kan maken. _________________________________________________________________ De layout van het bestandssysteem Het bestandssysteem is in veel delen onderverdeeld; meestal over de gehele linie van een root bestandssysteem met /bin, /lib, /etc, /dev, en een paar anderen; een /usr bestandssysteem met programma's en niet veranderlijke data; een /var bestandssysteem met veranderlijke data (zoals logbestanden); en een /home bestandssysteem voor ieders persoonlijke bestanden. Afhankelijk van de hardwareconfiguratie en de beslissingen van de systeembeheerder, kan de onderverdeling anders zijn; het kan zelfs allemaal in één bestandssysteem. [136]Hoofdstuk 3 beschrijft de layout van het bestandssysteem in iets meer detail; de Linux Filesystem Standard behandelt het in wat meer detail. _________________________________________________________________ Hoofdstuk 3. Overzicht van de Directory Structuur " Two days later, there was Pooh, sitting on his branch, dangling his legs, and there, beside him, were four pots of honey..." (A.A. Milne) Dit hoofdstuk beschrijft de belangrijke delen van een standaard Linux directory-structuur, gebaseerd op de FSSTND bestandssysteemstandaard. Het geeft in grote lijnen de normale manier aan, waarop de directory-structuur in aparte bestandssystemen met verschillende doeleinden wordt opgesplitst en het geeft de motivatie achter deze bepaalde opsplitsing. Er worden ook wat alternatieve manieren voor het opsplitsen beschreven. _________________________________________________________________ Achtergrond Dit hoofdstuk is oppervlakkig gebaseerd op de Linux Filesystem Standard, FSSTND, versie 1.2 (zie de bibliografie), welke een standaard probeert in te stellen voor hoe de directory-structuur in een Linux systeem is georganiseerd. Een dergelijke standaard heeft als voordeel dat het eenvoudiger zal zijn om software voor Linux te schrijven of te porten, en om Linux-machines te beheren, aangezien alles op de gebruikelijke plaatsen zal staan. Er is achter de standaard geen autoriteit die iemand dwingt er aan te voldoen, maar het wordt door de meeste, zo niet alle Linux distributies, ondersteund. Het is niet verstandig zonder zeer dwingende redenen met de FSSTND te breken. De FSSTND probeert de Unix traditie en huidige trends te volgen, zodat de Linux-systemen bekend zijn voor degene die ervaring hebben met andere Unix-systemen, en vice versa. Dit hoofdstuk is niet zo gedetailleerd als de FSSTND. Een systeembeheerder zou ook de FSSTND moeten lezen voor het verkrijgen van een volledig begrip. Dit hoofstuk beschrijft niet alle bestanden in detail. De bedoeling is niet om ieder bestand te beschrijven, maar om een overzicht te geven van het systeem met als uitgangspunt het bestandssysteem. Verdere informatie over ieder bestand is elders beschikbaar in dit handboek of in de manual pages. De volledige directory-structuur moet in kleinere delen worden opgebroken, ieder daarvan op zijn eigen disk of partitie, om te accomoderen aan de limieten van diskgroottes en het maken van een backup en ander systeembeheer te vereenvoudigen. De belangrijke delen bestaan uit de root, /usr, /var, en /home bestandssystemen (zie [137]Figuur 3-1). Ieder onderdeel heeft een ander doel. De directory-structuur is zodanig ontworpen dat het goed werkt in een netwerk van Linux computers die een aantal delen van de bestandssystemen over een read-only device kunnen delen (b.v. een CD-ROM), of over het netwerk met NFS. Figuur 3-1. Onderdelen van een Unix directory-structuur. Onderbroken lijnen duiden op partitie limieten. [fstree.png] De regels van de verschillende delen van de directory-structuur worden hieronder beschreven. * Het /root bestandssysteem is voor iedere computer specifiek (het wordt gewoonlijk op een lokale disk bewaard, alhoewel het ook een ramdisk of netwerkdrive zou kunnen zijn) en bevat de bestanden die nodig zijn om het systeem te booten, en het in een dusdanige staat te brengen dat de andere bestandssystemen kunnen worden gemount. De inhoud van het root bestandssysteem zal daarom voldoende zijn voor de single user toestand. Het zal ook tools bevatten voor het herstellen van een gebrekkig systeem, en voor het vanaf backups terugzetten van verloren gegane bestanden. * Het /usr bestandssysteem bevat alle commando's, libraries, manual pages, en andere onveranderlijke bestanden die nodig zijn gedurende de normale werking. Er zouden in /usr geen bestanden moeten voorkomen die voor een gegeven computer specifiek zijn, noch zouden ze tijdens het normale gebruik moeten worden gewijzigd. Dit staat toe dat de bestanden over het netwerk kunnen worden gedeeld, wat kostenbesparend kan zijn, aangezien het diskruimte bespaart (er kunnen makkelijk honderden megabytes in /usr), en kan het beheer eenvoudiger maken (alleen het origineel /usr hoeft te worden gewijzigd, wanneer een update van een applicatie wordt uitgevoerd, niet iedere computer afzonderlijk). Zelfs als het bestandssysteem zich op een lokale disk bevindt, zou het read-only gemount kunnen worden, om de kans te verminderen dat het bestandssysteem tijdens een crash beschadigd raakt. * Het /var bestandssysteem bevat bestanden die veranderen, zoals spool directories (voor mail, news, printers, enz.), logbestanden, opgemaakte manual pages, en tijdelijke bestanden. Volgens traditie bevond alles in /var zich ergens onder /usr, maar dat maakte het onmogelijk om /usr read-only te mounten. * Het /home bestandssysteem bevat de homedirectories van de gebruikers, d.w.z. alle werkelijke data op het systeem. Het scheiden van homedirectories in hun eigen directory-structuur of bestandssysteem maakt het maken van een backup eenvoudiger; van de andere delen hoeft vaak geen backup te worden gemaakt, of in ieder geval niet zo vaak (ze veranderen zelden). Een grote /home kan in verscheidene bestandssystemen moeten worden opgebroken, wat het toevoegen van een extra niveau aan namen onder /home vereist, b.v. /home/students en /home/staff. Alhoewel de verschillende onderdelen hierboven bestandssystemen werden genoemd, is er geen vereiste dat ze zich werkelijk op aparte bestandssystemen bevinden. Ze zouden makkelijk in een enkel bestandssysteem kunnen worden gehouden als het systeem een klein single-user systeem is en de gebruiker het eenvoudig wil houden. De directory kan ook in verschillende bestandssystemen worden onderverdeeld, afhankelijk van hoe groot de disks zijn, en hoeveel ruimte aan diverse doelen is toegekend. Het belangrijkste deel is echter dat alle standaardnamen werken; zelfs als, laten we zeggen, /var en /usr zich in werkelijkheid op dezelfde partitie bevinden, moeten de namen /usr/lib/libc.a en /var/log/messages werken, bijvoorbeeld door de bestanden onder /var naar /usr/var te verplaatsen, en een symlink /var naar /usr/var te maken. De structuur van een Unix bestandssysteem groepeert de bestanden overeenkomstig naar hun doel, d.w.z. alle commando's staan op één plaats, alle gegevensbestanden op een andere, documentatie op een derde plaats, enzovoort. Een alternatief zou zijn om de bestanden te groeperen naar gelang het programma waar ze toe behoren, d.w.z. alle Emacs bestanden zouden zich in één directory bevinden, alle TeX bestanden in een andere directory, enzovoort. Het probleem met de laatste benadering is dat dit het moeilijk maakt om bestanden te delen (de programmadirectory bevat vaak zowel statische als gemeenschappelijk te gebruiken, veranderlijke en niet gemeenschappelijk te gebruiken bestanden), en soms om de bestanden te kunnen vinden (b.v. manual pages op een groot aantal plaatsen, en ervoor zorgen dat de programma's voor de manual pages ze allemaal kan vinden is een nachtmerrie voor het onderhoud). _________________________________________________________________ Het root bestandssysteem Het root bestandssysteem zou in het algemeen klein moeten zijn, aangezien het zeer kritieke bestanden bevat, en een klein, niet frequent, wijzigend bestandssysteem heeft een betere kans om niet beschadigd te raken. Een beschadigd root bestandssysteem zal in het algemeen betekenen dat het systeem niet meer te booten zal zijn, behalve dan met speciale maatregelen (b.v. vanaf een diskette), iets dat je niet zal willen riskeren. De root directory bevat in het algemeen geen bestanden, behalve misschien de standaard boot-image voor het systeem, meestal met de naam /vmlinuz. Alle andere bestanden bevinden zich in de subdirectories van het root bestandssysteem: /bin Commando's die gedurende de systeemstart door normale gebruikers kunnen worden gebruikt (waarschijnlijk na de systeemstart). /sbin Net als /bin, maar de commando's zijn niet voor normale gebruikers bedoeld, alhoewel ze deze wel kunnen gebruiken als dat nodig is en is toegestaan. /etc Configuratiebestanden specifiek voor de computer. /root De homedirectory voor gebruiker root. /lib Gezamenlijke libraries die nodig zijn voor de programma's op het root bestandssysteem. /lib/modules Laadbare kernelmodules, vooral die nodig zijn om het systeem te booten bij het herstellen van calamiteiten (b.v. netwerk en bestandssysteem drivers). /dev Devicebestanden. /tmp Tijdelijke bestanden. Programma's die na de systeemstart draaien, zouden gebruik moeten maken van /var/tmp, niet /tmp, aangezien de eerste zich waarschijnlijk op een disk met meer ruimte bevindt. /boot Bestanden die door de bootstrap loader worden gebruikt, b.v. LILO. Kernel-images worden heel vaak hier bewaard in plaats van in de root directory. Als er veel kernel-images zijn, kan de directory makkelijk nogal groot worden, en het kan beter zijn om ze in een apart bestandssysteem te houden. Een andere reden zou kunnen zijn om er zeker van te zijn dat de kernel-images zich binnen de eerste 1024 cylinders van een IDE-disk bevinden. /mnt Mount point voor tijdelijke mounts voor de systeembeheerder. Van programma's wordt niet verondersteld dat ze automatisch op /mnt mounten. /mnt zou in subdirectories kunnen zijn onderverdeeld (b.v. /mnt/dosa zou een diskettestation kunnen zijn die gebruik maakt van een MS-DOS bestandssysteem, en /mnt/exta kan hetzelfde zijn, maar waarbij een ext2 bestandssysteem wordt gebruikt). /proc, /usr, /var, /home Mount points voor de andere bestandssystemen. _________________________________________________________________ De /etc directory De /etc directory bevat een heleboel bestanden. Een aantal daarvan wordt hieronder beschreven. Voor anderen zou je vast moeten kunnen stellen aan welk programma ze toebehoren, en de manual page voor dat programma moeten lezen. Bovendien komen er veel netwerkconfiguratiebestanden in /etc voor, en ze worden beschreven in de Networking Administrators' Guide. /etc/rc of /etc/rc.d of /etc/rc?.d Scripts of directories met scripts om bij de systeemstart te draaien of wanneer het run level wordt gewijzigd. Zie het hoofdstuk over init voor verdere informatie. /etc/passwd De gebruikersdatabase, met velden die informatie geven over de gebruikersnaam, de werkelijke naam, de homedirectory, het versleutelde wachtwoord, en andere informatie over iedere gebruiker. Het formaat is gedocumenteerd in de passwd manual page. /etc/fdprm Floppy disk parameter tabel. Beschrijft hoe de verschillende disketteformaten eruitzien. Wordt gebruikt door setfdprm. Zie de setfdprm manual page voor meer informatie. /etc/fstab Een opsomming van de bestandssystemen die bij de systeemstart automatisch worden gemount door het mount -a commando (in /etc/rc of een equivalent opstartbestand). Onder Linux, bevat het ook informatie over swapgebieden die automatisch worden gebruikt door swapon -a. Zie [138]paragraaf Mounten en unmounten in Hoofdstuk 4 en de mount manual page voor meer informatie. /etc/group Vergelijkbaar met /etc/passwd, maar beschrijft groepen in plaats van gebruikers. Zie de group manual page voor meer informatie. /etc/inittab Configuratiebestand voor init. /etc/issue Uitvoer door getty voor de loginprompt. Bevat meestal een korte beschrijving of welkomstbericht op het systeem. De inhoud wordt bepaald door de systeembeheerder. /etc/magic Het configuratiebestand voor file. Bevat de beschrijvingen van diverse bestandsformaten aan de hand waarvan file het type bestand raadt. Zie de magic en file manual pages voor meer informatie. /etc/motd De melding van de dag, automatische uitvoer na een succesvolle login. De inhoud is aan de systeembeheerder. Wordt vaak gebruikt om informatie aan iedere gebruiker te verstrekken, zoals waarschuwingen over geplande tijden dat het systeem down gaat. /etc/mtab Lijst met thans gemounte bestandssystemen. Als eerste door de opstartscripts ingesteld, en automatisch door het mount commando bijgewerkt. Wordt gebruikt wanneer een lijst met gemounte bestandssystemen nodig is, b.v. door het commando df. /etc/shadow Shadow password bestand op systemen met shadow password software geïnstalleerd. Shadow passwords verplaatst het versleutelde wachtwoord vanuit /etc/passwd naar /etc/shadow; de laatste is niet voor iemand leesbaar, behalve voor root. Dit maakt het moeilijker om wachtwoorden te kraken. /etc/login.defs Configuratiebestand voor het login commando. /etc/printcap Als /etc/termcap, maar dan bedoeld voor printers. Andere syntax. /etc/profile, /etc/csh.login, /etc/csh.cshrc Bestanden die bij de login of de systeemstart door de Bourne of C-shells worden uitgevoerd. Deze staan de systeembeheerder toe om globale standaards voor alle gebruikers in te stellen. Zie de manual pages voor de respectievelijke shells. /etc/securetty Identificeert secure terminals, d.w.z. de terminals waar vanaf root in mag loggen. Kenmerkend is dat alleen de virtuele consoles worden opgesomd, zodat het onmogelijk wordt (of op z'n minst moeilijker) om superuser privileges te verkrijgen door via een modem of een netwerk op het systeem in te breken. /etc/shells Een opsomming van de betrouwbare shells. Het chsh commando staat gebruikers toe om hun login shell te wijzigen naar alleen die shells die in dit bestand worden opgesomd. ftpd, het serverproces dat in FTP-services voor een computer voorziet, zal nagaan of de shell van de gebruiker in het bestand /etc/shells voorkomt, en zal mensen niet in laten loggen tenzij hun shell hierin staat vermeld. /etc/termcap De terminal capaciteiten database. Beschrijft via welke ``escape sequences'' de diverse terminals kunnen worden bestuurd. Programma's zijn zodanig geschreven dat ze, in plaats van het direct uitvoeren van een escape sequence die alleen op een bepaald merk terminal werkt, de juiste sequence opzoeken in /etc/termcap om te doen wat ze moeten doen. Als resultaat werken de meeste programma's met de meeste soorten terminals. Zie de termcap, curs_termcap, en terminfo manual pages voor meer informatie. _________________________________________________________________ De /dev directory De /dev directory bevat de speciale devicebestanden voor alle devices. De device bestanden zijn benoemd door gebruik te maken van speciale conventies; deze zijn beschreven in de Device list (zie XXX). De devicebestanden worden óf tijdens de installatie óf later met het script /dev/MAKEDEV aangemaakt. /dev/MAKEDEV.local is een script geschreven door de systeembeheerder waarmee slechts de lokale devicebestanden of links worden aangemaakt. (d.w.z. die geen onderdeel uitmaken van de standaard MAKEDEV, zoals devicebestanden voor een aantal niet-standaard devicedrivers). _________________________________________________________________ Het /usr bestandssysteem Het /usr bestandssysteem is vaak groot, aangezien hier alle programma's in zijn geïnstalleerd. Alle bestanden in /usr zijn normaal gesproken afkomstig van een Linux-distributie; lokaal geïnstalleerde bestanden en andere zaken gaan onder /usr/local. Dit maakt het mogelijk om een update van het systeem uit te voeren met een nieuwe versie van de distributie of zelfs een compleet nieuwe distributie te installeren, zonder alle programma's opnieuw te moeten installeren. Een aantal van de subdirectories van /usr worden hieronder opgesomd (een aantal van de minder belangrijke directories zijn komen te vervallen; zie de FSSTND voor meer informatie). /usr/X11R6 Het X Window System, alle bestanden. Om de ontwikkeling en installatie van X te vereenvoudigen, zijn de X-bestanden niet in de rest van het systeem geïntegreerd. Er bevindt zich een directory-structuur onder /usr/X11R6 die vergelijkbaar is met die onder /usr zelf. /usr/X386 Vergelijkbaar met /usr/X11R6, maar voor X11 Release 5. /usr/bin Bijna alle gebruikerscommando's. Een aantal commando's staan in /bin of in /usr/local/bin. /usr/sbin Systeembeheer commando's die niet nodig zijn op het root bestandssysteem, b.v. de meeste serverprogramma's. /usr/man, /usr/info, /usr/doc Respectievelijk de manual pages, GNU Info documenten, en diverse andere documentbestanden. /usr/include Header files voor de programmeertaal C. Deze zouden zich volgens vaste lijn eigenlijk onder /usr/lib moeten bevinden, maar de traditie is overweldigend om voor deze naam te kiezen. /usr/lib Onveranderlijke gegevensbestanden voor programma's en subsystemen, inclusief een aantal site-wide configuratiebestanden. De naam lib is afkomstig van library; originele libraries van programmeer subroutines werden in /usr/lib opgeslagen. /usr/local De plaats voor lokaal geïnstalleerde software en andere bestanden. _________________________________________________________________ Het /var bestandssysteem De /var directory bevat data die wijzigt als het systeem onder normale omstandigheden wordt gedraaid. Het is specifiek voor ieder systeem, d.w.z. niet gedeeld over het netwerk met andere computers. /var/catman Een cache voor man pages, welke op verzoek zijn geformatteerd. De source voor manual pages wordt meestal bewaard in /usr/man/man*; het kan zijn dat een aantal manual pages met een voorgeformatteerde versie worden geleverd, die in /usr/man/cat* is opgeslagen. Andere manual pages moeten worden geformatteerd wanneer ze voor het eerst worden bekeken; de geformatteerde versie wordt dan in /var/man opgeslagen, waardoor de volgende persoon, die dezelfde pagina bekijkt, niet hoeft te wachten, totdat het geformatteerd zal zijn. (/var/catman wordt vaak op dezelfde wijze opgeschoond zoals tijdelijke directories worden opgeschoond.) /var/lib Bestanden die veranderen tijdens normaal gebruik van het systeem. /var/local Variabele data voor programma's die in /usr/local zijn geïnstalleerd (d.w.z., programma's die door de systeembeheerder zijn geïnstalleerd). Merk op dat zelfs lokaal geïnstalleerde programma's de andere /var directories zouden moeten gebruiken, als ze passend zijn, b.v. /var/lock. /var/lock Lock bestanden. Veel programma's volgen een conventie om een lockbestand in /var/lock aan te maken om aan te geven dat ze een bepaald device of een bepaald bestand in gebruik hebben. Andere programma's zullen het lockbestand opmerken en niet proberen om het device of het bestand te gebruiken. /var/log Logbestanden van diverse programma's vooral login (/var/log/wtmp, welke alle logins en logouts op het systeem logt) en syslog (/var/log/messages, waarin meestal alle meldingen van de kernel en systeemprogramma's worden opgeslagen). Bestanden in /var/log kunnen onbegrensd groter worden en het kan zijn dat ze geregeld moeten worden opgeschoond. /var/run Bestanden met informatie over het systeem, welke geldig zijn totdat het systeem weer wordt geboot. /var/run/utmp bevat bijvoorbeeld informatie over de mensen die thans zijn ingelogd. /var/spool Directories voor mail, news, afdrukwachtrijen, en andere in een wachtrij geplaatst werk. Ieder andere spool heeft onder /var/spool zijn eigen subdirectory, b.v., de mailboxen van de gebruikers staan in /var/spool/mail. /var/tmp Tijdelijke bestanden die nogal groot zijn of die een langere tijd moeten bestaan dan wat voor /tmp is toegestaan. (Alhoewel het kan zijn dat de systeembeheerder ook de zeer oude bestanden in /var/tmp niet toestaat). _________________________________________________________________ Het /proc bestandssysteem Het /proc bestandssysteem bevat een bestandssysteem gebaseerd op een illusie. Het bestaat niet op de disk. In plaats daarvan maakt de kernel het in het geheugen aan. Het wordt gebruikt om in informatie over het systeem te voorzien (van origine over processen, vandaar de naam). Een aantal van de belangrijkere bestanden en directories worden hieronder uitgelegd. Het /proc bestandssysteem wordt in meer detail in de proc manual page beschreven. /proc/1 Een directory met informatie over procesnummer 1. Ieder proces heeft een directory onder /proc met als naam zijn proces identificatie nummer. /proc/cpuinfo Informatie over de processor, zoals het type, merk, model, en performance. /proc/devices Lijst met devicedrivers die in de huidige draaiende kernel zijn geconfigureerd. /proc/dma Toont welke DMA kanalen op dit moment worden gebruikt. /proc/filesystems In de kernel geconfigureerde bestandssystemen. /proc/interrupts Toont welke interrupts in gebruik zijn, en hoeveel van ieder er zijn. /proc/ioports Welke I/O poorten op het moment in gebruik zijn. /proc/kcore Een afbeelding van het fysieke geheugen in het systeem. Dit is exact dezelfde grootte als het fysiek aanwezige geheugen, maar neemt in werkelijkheid niet zoveel geheugen in beslag; het wordt tijdens het werken gegenereerd als programma's het benaderen. (Denk eraan: tenzij je het naar elders kopieert, neemt geheel niets onder /proc enige diskruimte in beslag). /proc/kmsg Uitvoer van meldingen door de kernel. Deze worden ook naar syslog gestuurd. /proc/ksyms Symbolentabel voor de kernel. /proc/loadavg De `load average' van het systeem; drie betekenisloze indicators van hoeveel werk het systeem op het moment te doen heeft. /proc/meminfo Informatie over geheugengebruik, zowel fysiek als swap. /proc/modules Welke kernelmodules op het moment zijn geladen. /proc/net Status informatie over netwerkprotocollen. /proc/self Een symbolische link naar de procesdirectory van het programma dat naar /proc kijkt. Als twee processen naar /proc aan het kijken zijn, krijgen ze verschillende links. Dit is voornamelijk om het voor programma's eenvoudiger te maken om hun eigen procesdirectory te bereiken. /proc/stat Diverse statistische gegevens over het systeem, zoals het aantal page faults vanaf het moment dat het systeem werd opgestart. /proc/uptime De tijd dat het systeem actief is. /proc/version De versie van de kernel. Merk op dat ondanks dat de bovenstaande bestanden meestal makkelijk te lezen bestanden zijn, ze soms op een dusdanige manier zijn opgemaakt, dat ze niet makkelijk zijn samen te vatten. Er zijn veel commando's die iets meer doen dan de bovenstaande bestanden inlezen, en ze zodanig indelen dat ze eenvoudiger te begrijpen zijn. Het programma free bijvoorbeeld, leest /proc/meminfo in en converteert de gegeven hoeveelheden bytes naar kilobytes (en voegt bovendien wat meer informatie toe). _________________________________________________________________ Hoofdstuk 4. Disks en Andere Opslagmedia Gebruiken "On a clear disk you can seek forever. " Wanneer je je systeem installeert of een upgrade uitvoert, moet je een tamelijke hoeveelheid werk op je disks verrichten. Je moet bestandssystemen op je disk aanmaken, zodat er bestanden op kunnen worden bewaard, en ruimte reserveren voor de verschillende onderdelen van je systeem. Dit hoofdstuk legt al deze initiële activiteiten uit. Gewoonlijk hoef je al dit werk niet nogmaals te doen, als je je systeem éénmaal hebt ingesteld, behalve dan voor het gebruik van diskettes. Je kunt naar dit hoofdstuk terugkeren als je een nieuwe disk toevoegt of je diskgebruik beter af wilt stemmen. De basistaken bij het beheren van disks zijn: * Formatteren van de disk. Dit doet van alles om het voor het gebruik voor te bereiden, zoals het controleren op slechte sectoren. (Formatteren is tegenwoordig voor de meeste harddisks niet nodig). * Partitioneer een harddisk, als je het voor verscheidene activiteiten wilt gebruiken, waarvan wordt verondersteld dat ze elkaar niet in de weg zitten. Een reden om te partitioneren is om verschillende besturingssystemen op dezelfde disk op te slaan. Een andere reden is om gebruikersbestanden gescheiden te houden van systeembestanden, wat het maken van de backups vereenvoudigt en helpt bij het beschermen tegen beschadigingen van de systeembestanden. * Maak op iedere disk of partitie een bestandssysteem (van een geschikt type) aan. De disk betekent niks voor Linux totdat je er een bestandssysteem op aanmaakt; dan kunnen de bestanden worden aangemaakt en erop worden benaderd. * Mount verschillende bestandssystemen om een enkele directory-structuur mee te vormen, of automatisch of handmatig als het nodig is. (Voor handmatig gemounte bestandssystemen moet meestal ook handmatig het umount commando gegeven worden). [139]Hoofdstuk 5 bevat informatie over virtueel geheugen en diskcaching, waarvan je ook op de hoogte moet zijn, als je van disks gebruik maakt. _________________________________________________________________ Twee soorten apparaten UNIX, en daarom Linux, herkent twee verschillende soorten apparaten: willekeurig-toegankelijke block devices (zoals disks), en character devices (zoals tapes en seriële lijnen). Een aantal daarvan zijn serieel en een aantal daarvan willekeurig toegankelijk. Ieder ondersteund apparaat wordt in het bestandssysteem als een devicebestand voorgesteld. Als je van een devicebestand leest of ernaar schrijft, gaat de data van of naar het device dat het voorstelt. Op deze manier zijn er geen speciale programma's (en geen speciale applicatie programmeermethodieken, zoals het afvangen van interrupts of het ondervragen van een seriële poort) nodig om de devices te benaderen; om bijvoorbeeld een bestand naar de printer te sturen, zou men gewoon kunnen opgeven $ cat filename > /dev/lp1 $ en de inhoud van het bestand wordt afgedrukt (het bestand moet natuurlijk wel in een vorm staan die de printer begrijpt). Aangezien het echter geen goed idee is om verscheidene mensen tegelijkertijd met cat hun bestanden naar de printer te laten sturen, maakt men meestal gebruik van een speciaal programma om de af te drukken bestanden te versturen (meestal lpr). Dit programma zorgt ervoor dat er slechts één programma tegelijkertijd wordt afgedrukt en zal bestanden automatisch naar de printer sturen zodra het klaar is met het voorgaande bestand. Iets vergelijkbaars is voor de meeste devices nodig. In feite hoeft men zich zelden druk te maken om devicebestanden. Aangezien devices in het bestandssysteem als bestanden naar voren komen (in de /dev directory), is het makkelijk te zien welke devicebestanden er bestaan, door ls of een ander passend commando te gebruiken. In de uitvoer van ls -l, bevat de eerste kolom het type bestand en zijn permissies. Het inspecteren van een serieel device bijvoorbeeld, geeft op mijn systeem $ ls -l /dev/cua0 crw-rw-rw- 1 root uucp 5, 64 Nov 30 1993 /dev/cua0 $ Het eerste karakter in de eerste kolom, d.w.z. `c' in crw-rw-rw- hierboven, vertelt een geïnformeerde gebruiker het type bestand, in dit geval een character device. Het eerste teken van gewone bestanden is een `-', voor directories is het een `d', en voor block devices een `b'; zie de ls man page voor verdere informatie. Merk op dat alle devicebestanden gewoonlijk wel voorkomen, zelfs al is het apparaat zelf niet geïnstalleerd. Dus ook al heb je een bestand /dev/sda, dan wil dat nog niet zeggen dat je werkelijk een SCSI-harddisk hebt. Het maakt de installatieprogramma's eenvoudiger als alle devicebestanden beschikbaar zijn, en het maakt het makkelijker nieuwe hardware toe te voegen (het is niet nodig om uit te zoeken wat de juiste parameters zijn en de devicebestanden voor het nieuwe apparaat aan te maken). _________________________________________________________________ Harddisks Deze subsectie introduceert terminologie gerelateerd aan harddisks. Als je reeds bekend bent met de termen en concepten, kun je deze subsectie overslaan. Zie [140]Figuur 4-1 voor een schematische afbeelding van de belangrijkste onderdelen van een harddisk. Een harddisk bestaat uit één of meer circulaire schijven, [141][5] waarvan beide oppervlakken met een magnetische substantie zijn bedekt, die worden gebruikt voor het opnemen van de gegevens. Voor elk oppervlak is er een lees/schrijf-kop die de opgenomen gegevens onderzoekt of wijzigt. De schijven draaien rondom een gewone as; een typische rotatie-snelheid is 3600 rotaties per minuut, alhoewel high-performance harddisks hogere snelheden halen. De koppen bewegen langs de straal van de schijven; deze beweging gecombineerd met de rotatie van de schijven maakt dat de kop alle delen van de oppervlakken kan benaderen. De processor (CPU) en de feitelijke disk communiceren via een disk controller. Dit zorgt dat de rest van de computer niet bekend hoeft te zijn met hoe de disk moet worden gebruikt, aangezien de controllers voor verschillende typen disks zodanig kan worden gemaakt, dat ze dezelfde interface jegens de rest van de computer gebruiken. Daarom kan de computer gewoon zeggen ``hé disk, geef me wat ik wil'', in plaats van een lange en complexe reeks elektronische signalen om de kop naar de juiste lokatie te verplaatsen en te wachten totdat de juiste positie zich onder de kop bevindt en al het andere onplezierige dat anders nodig zou zijn. (In werkelijkheid is de interface naar de controller nog steeds complex, maar veel minder dan het anders zou zijn). De controller kan ook nog wat anders doen, zoals caching, of het automatisch vervangen van slechte sectoren. Het bovenstaande is meestal voldoende om iets van de hardware te begrijpen. Er is nog veel meer, zoals de motor die de schijven laat draaien en de koppen verplaatst, en de electronica die de werking van de mechanische delen bestuurt, maar het meeste daarvan is niet relevant voor het begrip van de werkende principes van een harddisk. De oppervlakten worden gewoonlijk in concentrische ringen onderverdeeld, die sporen worden genoemd, en deze worden op hun beurt weer onderverdeeld in sectoren. Deze onderverdeling wordt gebruikt om lokaties op de harddisk aan te geven en om diskruimte aan bestanden toe te wijzen. Om een gegeven plaats op de harddisk te vinden zou men kunnen zeggen ``oppervlak 3, spoor 5, sector 7''. Meestal is het aantal sectoren gelijk voor alle sporen, maar een aantal harddisks plaatsen meer sectoren in de buitenste sporen (alle sectoren hebben dezelfde fysieke grootte, dus er passen er meer op de langere buitenste sporen). Een sector bevat 512 bytes aan gegevens. De disk zelf kan geen kleinere hoeveelheden data dan een sector aan. Figuur 4-1. Een schematische afbeelding van een harddisk. [hd-schematic.png] Ieder oppervlak is op dezelfde manier in sporen (en sectoren) onderverdeeld. Dit betekent dat wanneer de kop voor één oppervlak zich op een spoor bevindt, de koppen van de andere oppervlakten zich ook op de corresponderende sporen bevinden. Alle corresponderende sporen bijelkaar wordt een cylinder genoemd. Het kost tijd om de koppen van het ene naar het andere spoor (cylinder) te verplaatsen, dus door de bijelkaarhorende gegevens die vaak worden benaderd (zoals bijvoorbeeld een bestand) zo te plaatsen dat het zich binnen één cylinder bevindt, is het niet nodig om de koppen te bewegen om alles ervan te kunnen lezen. Dit verbetert de performance. Het is niet altijd mogelijk om bestanden op deze manier te plaatsen; bestanden die op verscheidene plaatsen op de disk worden opgeslagen, worden gefragmenteerd genoemd. Het aantal oppervlakten (of koppen, wat hetzelfde is), cylinders en sectoren variëren nogal; de specificatie van het aantal van ieder wordt de geometrie van een harddisk genoemd. De geometrie wordt gewoonlijk in een speciaal, door een batterij gevoed, geheugengebied opgeslagen dat het CMOS RAM wordt genoemd, vanwaar het besturingssysteem het tijdens de systeemstart of initialiseren van de driver op kan halen. Helaas, de BIOS [142][6] heeft een beperking in het ontwerp, wat het onmogelijk maakt om een spoornummer groter dan 1024 in het CMOS RAM te specificeren, wat te weinig is voor een grote harddisk. Om hier iets aan te doen, liegt de harddisk-controller over de geometrie, en vertaalt de adressen die door de computer zijn gegeven in iets dat in de werkelijkheid past. Een harddisk heeft bijvoorbeeld 8 koppen, 2048 sporen, en 55 sectoren per spoor. [143][7] De controller zou tegen de computer kunnen liegen en beweren dat het 16 koppen, 1024 sporen, en 35 sectoren per spoor heeft, dus de limiet voor sporen niet overschrijdt, en vertaalt het adres dat de computer geeft, door het nummer van de kop te halveren, en het nummer van het spoor te verdubbelen. In werkelijkheid kan de berekening gecompliceerder zijn, omdat de nummers niet zo comfortabel zijn als hier (maar nogmaals, de details zijn voor het begrijpen van het principe niet relevant). Deze vertaling vervormt de kijk van het besturingssysteem op hoe de disk is georganiseerd, wat het dus onmogelijk maakt om de alle-data-op-één-cylinder truc te gebruiken om de performance een zetje te geven. De vertaling is alleen voor IDE-disks een probleem. SCSI disks gebruiken een sequentieel sectornummer (d.w.z. de controller vertaalt een sequentieel sectornummer naar een kop, cylinder, en sector drietal), en een compleet andere methode voor de CPU om met de controller te communiceren, dus ze zijn van het probleem geïsoleerd. Het kan zijn dat de computer echter ook niet bekend is met de werkelijke geometrie van een SCSI-disk. Aangezien Linux de werkelijke geometrie van de disk niet kent, proberen de bestandssystemen zelfs niet eens om de bestanden binnen een enkele cylinder te houden. In plaats daarvan, probeert het sequentieel genummerde sectoren aan bestanden toe te wijzen, wat bijna altijd een vergelijkbare performance oplevert. Dit wordt nog gecompliceerder door on-controller caches, en automatische prefetches die door de controller worden gedaan. Iedere harddisk wordt door een apart devicebestand voorgesteld. Er kunnen (meestal) slechts twee of vier IDE-harddisks zijn. Deze zijn respectievelijk bekend als /dev/hda, /dev/hdb, /dev/hdc, en /dev/hdd. SCSI-harddisks zijn bekend als /dev/sda, /dev/sdb, enzovoort. Er bestaan vergelijkbare conventies voor de namen van andere typen harddisks; zie XXX (device list) voor meer informatie. Merk op dat de devicebestanden voor de harddisks toegang geven tot de gehele disk, zonder rekening te houden met de partities (die hieronder zullen worden besproken), en als je niet voorzichtig bent, is het niet zo moeilijk om de partities of de gegevens die erin staan te ruïneren. De devicebestanden van de disks worden gewoonlijk alleen gebruikt om toegang tot de master boot record te verkrijgen (die ook hierna zal worden besproken). _________________________________________________________________ Diskettes Een diskette bestaat uit een flexibel schijfje dat op één of beide zijden is bedekt met een vergelijkbare substantie als een harddisk. De diskette zelf heeft geen lees/schrijfkop, die is in de drive opgenomen. Een diskette correspondeert met één schijf in een harddisk, maar is verwijderbaar en één drive kan worden gebruikt om verschillende diskettes te benaderen, terwijl de harddisk één ondeelbare unit is. Net als een harddisk, is een diskette in sporen en sectoren onderverdeeld (en de twee corresponderende sporen op beide zijden van een diskette vormen een cylinder), maar er zijn er veel minder van dan op een harddisk. Een diskettestation kan meestal voor verscheidene verschillende typen disks gebruikt worden; bijvoorbeeld, een 3.5 inch drive kan gebruikt worden voor 720 kB en 1.44 MB disks. Aangezien de drive iets anders moet werken en het besturingssysteem moet weten hoe groot de disk is, zijn er diverse devicebestanden voor diskettestations, één per combinatie van drive en disktype. Daarom is /dev/fd0H1440 het eerste diskettestation (fd0), wat een 3.5 inch drive moet zijn, waarbij gebruik wordt gemaakt van een 3.5 inch, high density disk (H) of grootte 1440 kB (1440), d.w.z. een normale 3.5 inch HD diskette. Voor meer informatie over de naamgeving voor de floppy-devices, zie XXX (device list). De namen voor diskettestations zijn echter complex, en Linux heeft daarom een speciaal type diskettedevice dat het type disk in de drive automatisch detecteert. Het probeert van een nieuw ingevoegde diskette de eerste sector te lezen, waarbij verschillende typen diskettes worden gebruikt, totdat het correcte type wordt gevonden. Dit vereist natuurlijk wel dat de diskette eerst is geformatteerd. De automatische devices worden /dev/fd0, /dev/fd1, enzovoort, genoemd. De parameters die het automatische device gebruikt om de disk te benaderen, kunnen ook met behulp van het programma setfdprm worden ingesteld. Dit kan handig zijn als je disks moet gebruiken die niet voldoen aan enige gebruikelijke diskformaten, d.w.z. als ze een ongewoon aantal sectoren heeft, of als de automatische detectie om één of andere reden mislukt en het juiste devicebestand ontbreekt. Linux kan veel niet-standaard disketteformaten hanteren in aanvulling op alle standaard disketteformaten. Een aantal hiervan vereisen speciale formatteringsprogramma's. We zullen deze disktypen nu overslaan, maar in de tussentijd kun je het bestand /etc/fdprm onderzoeken. Het specificeert de instellingen die setfdprm herkent. Het besturingssysteem moet weten wanneer er van disk in het diskettestation is verwisseld, bijvoorbeeld om te voorkomen dat gegevens van de vorige disk die in de cache zijn geplaatst, worden gebruikt. Helaas is de signaallijn, die hiervoor wordt gebruikt, soms wat gebrekkig, en wat nog erger is, dit zal niet altijd worden opgemerkt als de drive onder MS-DOS wordt gebruikt. Als je vreemde problemen ervaart bij het gebruik van diskettes, zou dit de reden kunnen zijn. De enige manier om dit te corrigeren, is om je diskettestation te repareren. _________________________________________________________________ CD-ROM's Een CD-ROM drive gebruikt een optisch leesbare met plastic bedekte disk. De informatie wordt op het oppervlak van de disk opgenomen [144][8] in kleine `openingen' die langs een spiraal vanaf het midden tot aan de rand zijn gecentreerd. De drive stuurt een laserstraal langs de spiraal om de disk te lezen. Als de laser een opening raakt, kaatst de laser op de ene manier terug; wanneer het glad oppervlak raakt, wordt het op een andere manier teruggekaatst. Op deze manier is het makkelijk om bits, en daarom informatie, te coderen. De rest is eenvoudig, niets anders dan mechanica. CD-ROM drives zijn vergeleken met harddisks langzaam. Terwijl een typische harddisk een gemiddelde zoektijd heeft die minder is dan 15 milliseconden, kan een snelle CD-ROM drive tienden van seconden voor het zoeken gebruiken. De eigenlijke snelheid van het gegevenstransport is tamelijk hoog met honderden kilobytes per seconde. De traagheid betekent dat CD-ROM drives niet zo plezierig zijn om te gebruiken dan harddisks (een aantal Linux distributies voorzien in `live' bestandssystemen op CD-ROM's, wat het onnodig maakt om de bestanden naar de harddisk te kopiëren, wat de installatie eenvoudiger maakt en een hoop harddiskruimte bespaart), alhoewel het nog steeds mogelijk is. CD-ROM's zijn voor het installeren van nieuwe software erg goed, aangezien de maximumsnelheid tijdens de installatie niet essentieel is. Er zijn verscheidene manieren om gegevens op een CD-ROM te arrangeren. De populairste is gespecificeerd door de internationale standaard ISO 9660. Deze standaard specificeert een zeer minimaal bestandssysteem, welke zelfs nog primitiever is dan die van MS-DOS. Aan de andere kant, is het zo minimaal dat ieder besturingssysteem het in het daarbij behorend systeem zou moeten kunnen indelen. Voor normaal UNIX gebruik, is het ISO 9660 bestandssysteem niet bruikbaar, dus werd er een uitbreiding op de standaard ontwikkeld, die de Rock Ridge extensie wordt genoemd. Rock Ridge staat langere bestandsnamen, symbolische links en een heleboel ander moois toe, wat maakt dat een CD-ROM min of meer op ieder UNIX bestandssysteem van deze tijd lijkt. Zelfs beter, een Rock Ridge bestandssysteem is nog steeds een geldig ISO 9660 bestandssysteem, waardoor het bovendien ook bruikbaar is voor niet-UNIX systemen. Linux biedt ondersteuning voor zowel ISO 9660 als de Rock Ridge extensies; de extensies worden automatisch herkend en gebruikt. Het bestandssysteem is echter slechts de helft van de overwinning. De meeste CD-ROM's bevatten gegevens waarvoor een speciaal programma is vereist om ze te benaderen, en de meeste programma's hiervan draaien niet onder Linux (behalve, mogelijk onder dosemu, de Linux MS-DOS emulator). Een CD-ROM drive wordt via een corresponderend devicebestand benaderd. Er zijn verscheidene manieren om een CD-ROM drive met de computer te verbinden: via SCSI, via een geluidskaart, of via EIDE. Het hardware gedeelte dat nodig was om dit te doen, valt buiten het kader van dit boek, maar het type verbinding bepaalt het devicebestand. Zie XXX (device-list) voor verduidelijking. _________________________________________________________________ Tapes Een tape drive gebruik een tape, zoals [145][9] cassettes voor muziek worden gebruikt. Een tape is van nature serieel, wat betekent dat om enig deel ervan te krijgen, je eerst alle andere delen die ertussen staan, moet doorlopen. Een disk kan willekeurig worden benaderd, d.w.z. dat je direct naar iedere plaats op de disk kunt gaan. De seriële toegang op tapes maakt ze langzaam. Aan de andere kant zijn tapes relatief goedkoop te maken, aangezien ze niet snel hoeven te zijn. Ze kunnen ook makkelijk erg lang worden gemaakt, en kunnen daarom een grote hoeveelheid data bevatten. Dit maakt tapes zeer geschikt voor zaken zoals archivering en backups, welke geen grote snelheden vereisen, maar waar wel wordt geprofiteerd van de lage kosten en grote opslagcapaciteit. _________________________________________________________________ Formatteren Formatteren is het proces waarbij markeringen op de magnetische media worden geschreven, die worden gebruikt om sporen en sectoren te markeren. Voordat een disk wordt geformatteerd, is het magnetische oppervlak een chaos van magnetische signalen. Als het is geformatteerd, is er een volgorde in de chaos aangebracht door werkelijk lijnen te tekenen daar waar de sporen gaan, en waar ze in sectoren worden ingedeeld. De eigenlijke details zijn niet helemaal zoals het hier is beschreven, maar dat is irrelevant. Wat belangrijk is, is dat een disk niet kan worden gebruikt, tenzij het is geformatteerd. De terminologie is hier wat verwarrend: in MS-DOS wordt het woord formattering gebruikt om ook het proces, waarbij een bestandssysteem (wat hieronder zal worden besproken) wordt aangemaakt, te omvatten. Daar worden de twee processen, vooral voor diskettes, vaak gecombineerd. Als er onderscheid moet worden gemaakt, wordt de werkelijke formattering low-level formattering genoemd, terwijl het maken van het bestandssysteem high-level formattering wordt genoemd. In UNIX kringen worden deze twee formatteren en het aanmaken van een bestandssysteem genoemd, dus dat is wat dan ook in dit boek wordt gebruikt. Voor IDE en een aantal SCSI-disks vindt de formattering in feite in de fabriek plaats en hoeft dit niet te worden herhaald; vandaar dat de meeste mensen zich er niet om hoeven te bekommeren. In feite kan het formatteren van een harddisk veroorzaken dat het minder goed werkt, bijvoorbeeld omdat het kan zijn dat een disk op één of andere speciale manier moet worden geformatteerd, om automatische vervanging van slechte sectoren toe te kunnen staan. Disks die moeten of kunnen worden geformatteerd, vereisen vaak hoe dan ook een speciaal programma, omdat de interface naar de formatterings logica binnenin de drive van drive tot drive verschillend is. Het formatteringsprogramma bevindt zich of op de controller BIOS, of wordt als een MS-DOS programma meegeleverd; geen van beiden kunnen onder Linux op eenvoudige wijze worden gebruikt. Het kan zijn dat er tijdens het formatteren slechte plekken op de disk worden geconstateerd, die bad blocks of bad sectors worden genoemd. Deze worden soms door de drive zelf afgehandeld, maar zelfs dan, als er zich meer van ontwikkelen, moet er soms iets worden gedaan om te voorkomen dat die delen van de disk worden gebruikt. De logica om dit te doen is in het bestandssysteem ingebouwd; hoe je de informatie aan het bestandssysteem toe kunt voegen, wordt hieronder beschreven. Als alteratief zou men een kleine partitie aan kunnen maken, die slechts het slechte deel van de disk bedekt; deze benadering zou een goed idee kunnen zijn als de slechte plek erg groot is, aangezien bestandssystemen soms problemen hebben met zeer grote slechte gebieden. Diskettes worden met fdformat geformatteerd. Het devicebestand voor de diskette moet als een parameter worden gebruikt. Het volgende commando zou bijvoorbeeld een high density 3.5 inch diskette in het eerste diskettestation formatteren: $ fdformat /dev/fd0H1440 Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB. Formatting ... done Verifying ... done $ Noot: als je een device wilt gebruiken dat de diskette automatisch detecteert (b.v. /dev/fd0), moet je eerst de parameters van het device met setfdprm instellen. Om hetzelfde effect als hierboven te verkrijgen, zou men het volgende moeten doen: $ setfdprm /dev/fd0 1440/1440 $ fdformat /dev/fd0 Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB. Formatting ... done Verifying ... done $ Het is meestal beter om het juiste devicebestand te kiezen dat met het type diskette overeenkomt. Noot: het is niet verstandig om diskettes te formatteren zodanig dat er meer informatie op past dan waar ze voor zijn ontworpen. fdformat zal de diskette ook valideren; d.w.z. controleren op slechte blokken. Het zal een slecht blok verscheidene keren proberen (je kunt dit meestal horen, doordat de geluiden die de drive produceert, dramatisch wijzigen). Als de diskette slechts marginaal slecht is (vanwege vuil op de lees/schrijfkop, een aantal fouten zijn onjuiste signalen), zal fdformat hier niet over klagen, maar een echte fout zal het valideringsproces afbreken. De kernel zal voor iedere I/O error die het vindt, logmeldingen afdrukken; deze zullen naar de console gaan of, als syslog in gebruik is, naar het bestand /usr/log/messages. fdformat zal zelf niet vertellen waar de fout in zit (meestal is men hier niet in geïnteresseerd, diskettes zijn goedkoop genoeg dat een slechte diskette al automatisch wordt weggegooid). $ fdformat /dev/fd0H1440 Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB. Formatting ... done Verifying ... read: Unknown error $ Het commando badblocks kan worden gebruikt om iedere disk of partitie te doorzoeken op slechte blokken (inclusief een diskette). De disk wordt niet geformatteerd, dus het kan zelfs worden gebruikt om bestaande bestandssystemen te controleren. Het voorbeeld hieronder controleert een 3.5 inch diskette met twee slechte blokken. $ badblocks /dev/fd0H1440 1440 718 719 $ badblocks geeft als uitvoer de slechte blokken die het gevonden heeft. De meeste bestandssystemen kunnen dergelijke slechte blokken omzeilen. Er wordt een lijst beheerd met bekende slechte blokken, die wordt geïnitialiseerd als het bestandssysteem wordt gemaakt, en kan later worden gewijzigd. Het initiële onderzoek naar slechte blokken kan met het commando mkfs worden gedaan (die het bestandssysteem initialiseert), maar latere controles zouden met badblocks moeten worden gedaan en de nieuwe blokken zouden met fsck moeten worden toegevoegd. We zullen mkfs en fsck later bespreken. Veel moderne harddisks constateren de slechte blokken automatisch, en proberen ze door een speciaal gereserveerd goed blok te herstellen. Voor het besturingssysteem is dit niet zichtbaar. Deze eigenschap zou in het handboek van de disk moeten zijn gedocumenteerd, mocht je benieuwd zijn of hier sprake van is. Zelfs dergelijke disks kunnen in gebreke blijven, als het aantal slechte blokken teveel wordt, alhoewel de kans bestaat dat de disk tegen die tijd zo slecht is dat ze niet meer bruikbaar is. _________________________________________________________________ Partities Een harddisk kan in verscheidene partities worden onderverdeeld. Iedere partitie functioneert alsof het een aparte harddisk is. De gedachte hierachter is, dat als je één harddisk hebt, en je wilt er, laten we zeggen, twee besturingssystemen op, dan kun je de disk in twee partitities verdelen. Ieder besturingssysteem gebruikt zijn eigen partitie zoals dat het wenst en komt niet aan die van de ander. Op deze manier kunnen de twee besturingssystemen op dezelfde harddisk gerust naast elkaar bestaan. Zonder partities zou men voor ieder besturingssysteem een harddisk moeten kopen. Diskettes zijn niet gepartitioneerd. Er is hier geen technische reden voor, maar aangezien ze zo klein zijn, zouden partities slechts zeer zelden van nut zijn. CD-ROM's worden gewoonlijk ook niet gepartitioneerd, aangezien het eenvoudiger is om ze te gebruiken als één grote disk, en het zelden nodig is om verscheidene besturingssystemen op één CD-ROM te hebben. _________________________________________________________________ De MBR, bootsector en partitietabel De informatie over hoe een harddisk is gepartitioneerd, wordt in de eerste sector van de harddisk opgeslagen (dat wil zeggen, op de eerste sector van het eerste spoor op het eerste diskoppervlak). De eerste sector is de master boot record (MBR) van de disk; dit is de sector die de BIOS inleest en start wanneer de computer voor het eerst wordt opgestart. De master boot record bevat een klein programma dat de partitietabel inleest, controleert welke partitie actief is (d.w.z. als opstartbaar is gemarkeerd), en leest de eerste sector van die partitie in, de boot sector van de partitie. (De MBR is ook een bootsector, maar het heeft een speciale status en heeft daarom een speciale naam). Deze bootsector bevat een ander klein programma dat het eerste deel van het besturingssysteem inleest, die op die partitie is opgeslagen (in de veronderstelling dat het opstartbaar is), en start het dan op. Het partitioneringsschema is niet in de hardware en zelfs niet in de BIOS ingebouwd. Het is slechts een conventie die veel besturingssystemen volgen. Niet alle besturingssystemen volgen het, maar dat zijn de uitzonderingen. Een aantal besturingssystemen ondersteunen partities, maar ze nemen slechts één partitie op de harddisk in beslag, en gebruiken binnen die partitie hun eigen interne partioneringsmethode. Het laatste type kan gerust naast andere besturingssystemen (waaronder Linux) bestaan, en vereist geen speciale maatregelen, maar een besturingssysteem dat geen partities ondersteunt, kan niet op dezelfde disk met andere besturingssystemen bestaan. Als voorzorgsmaatregel is het een goed idee om de partitietabel op een stukje papier te schrijven, zodat als het ooit beschadigd, je niet al je bestanden hoeft kwijt te raken. (Een slechte partitietabel kan met fdisk worden hersteld). De relevante informatie wordt gegeven door het commando fdisk -l: $ fdisk -l /dev/hda Disk /dev/hda: 15 heads, 57 sectors, 790 cylinders Units = cylinders of 855 * 512 bytes Device Boot Begin Start End Blocks Id System /dev/hda1 1 1 24 10231+ 82 Linux swap /dev/hda2 25 25 48 10260 83 Linux native /dev/hda3 49 49 408 153900 83 Linux native /dev/hda4 409 409 790 163305 5 Extended /dev/hda5 409 409 744 143611+ 83 Linux native /dev/hda6 745 745 790 19636+ 83 Linux native $ _________________________________________________________________ Extended en logische partities Het originele partitioneringsschema voor PC harddisks stond slechts vier partities toe. Dit bleek in het echte leven al snel te weinig te zijn, deels omdat een aantal mensen meer dan vier besturingssystemen wilde (Linux, MS-DOS, OS/2, Minix, FreeBSD, NetBSD, of Windows/NT, om er maar een paar te noemen), maar in de eerste plaats omdat het soms goed is om verscheidene partities voor één besturingssysteem te hebben. Swap space voor Linux bijvoorbeeld, kan het beste in een eigen partitie worden geplaatst in plaats van in de Linux hoofdpartitie om redenen van snelheid (zie hieronder). Om iets aan dit ontwerpprobleem te doen, werden er extended partities uitgevonden. Deze truc staat het toe dat een primaire partitie in sub-partities wordt onderverdeeld. De primaire partitie die wordt onderverdeeld is dus de extended partitie; de subpartities zijn de logische partities. Ze gedragen zich als primaire [146][10] partities, maar worden anders aangemaakt. Er zit geen verschil in snelheid tussen. De partitiestructuur van een harddisk kan er ongeveer zo uitzien als in [147]Figuur 4-2. De disk is in drie primaire partities onderverdeeld, de tweede daarvan is in twee logische partities verdeeld. Een deel van de disk is in het geheel niet gepartitioneerd. De disk in z'n geheel en iedere primaire partitie heeft een bootsector. Figuur 4-2. Een voorbeeld van een harddisk partitionering. [hd-layout.png] _________________________________________________________________ Partitie typen De partitietabellen (degene in de MBR, en die voor de extended partities) bevatten per partitie één byte waarin het type van die partitie wordt aangegeven. Hiermee wordt geprobeerd het besturingssysteem te identificeren, dat van de partitie gebruik maakt of waar het de partitie voor gebruikt. Het doel is om het mogelijk te maken te voorkomen dat twee besturingssystemen per ongeluk dezelfde partitie gebruiken. In werkelijkheid doet het type partitie er voor besturingssystemen niet zoveel toe; b.v. Linux maakt het helemaal niet uit wat het is. Wat nog erger is, is dat een aantal ervan het onjuist gebruiken; b.v. op z'n minst negeren een aantal versies van DR-DOS het meest sigificante bit van de byte, terwijl andere dat niet doen. Er is geen instelling voor de standaardisering om aan te geven wat iedere waarde van een byte betekent, maar een aantal algemeen geaccepteerde bytes staan in [148]Tabel 4-1. Dezelfde lijst is beschikbaar in het Linux programma fdisk. Tabel 4-1. Partitie typen (van het Linux programma fdisk ). 0 Empty 40 Venix 80286 94 Amoeba BBT 1 DOS 12-bit FAT 51 Novell? a5 BSD/386 2 XENIX root 52 Microport b7 BSDI fs 3 XENIX usr 63 GNU HURD b8 BSDI swap 4 DOS 16-bitf <32M 64 Novell c7 Syrinx 5 Extended 75 PC/IX db CP/M 6 DOS 16-bit >=32M 80 Old MINIX e1 DOS access 7 OS/2 HPFS 81 Linux/MINIX e3 DOS R/O 8 AIX 82 Linux swap f2 DOS secondary 9 AIX bootable 83 Linux native ff BBT a OS/2 Boot Manag 93 Amoeba _________________________________________________________________ Partitioneren van een harddisk Er zijn veel programma's voor het aanmaken en verwijderen van partities. De meeste besturingsprogramma's hebben hun eigen programma's, en het kan een goed idee zijn om het bij het besturingsprogramma behorende programma te gebruiken, gewoon voor het geval er zich iets ongewoons voordoet dat de andere programma's niet kennen. Veel van de programma's worden fdisk genoemd, inclusief die van Linux, of variaties daarop. Details over het gebruik van Linux fdisk worden gegeven in de man page van fdisk. Het cfdisk commando is vergelijkbaar met fdisk, maar heeft een mooiere (schermvullende) gebruikersinterface. Bij gebruik van IDE-disks, moet de bootpartitie (de partitie met de startbare kernel image bestanden) zich volledig binnen de eerste 1024 cylinders bevinden. Dit is omdat de disk tijdens het booten via de BIOS wordt gebruikt (voordat het systeem naar de protected mode overgaat), en de BIOS kan niet meer dan 1024 cylinders hanteren. Soms is het mogelijk om een bootpartitie te gebruiken die zich slechts gedeeltelijk binnen de eerste 1024 cylinders bevindt. Dit werkt zolang alle bestanden die door de BIOS worden ingelezen binnen de eerste 1024 voorkomen. Aangezien dit moeilijk te regelen valt, is het een zeer slecht idee om dit te doen; je weet nooit of een update van de kernel of het defragmenteren van een disk in een systeem resulteert waarmee niet meer kan worden opgestart. Zorg er daarom voor dat je bootpartitie zich volledig binnen de eerste 1024 cylinders bevindt. Een aantal nieuwere versies van de BIOS en IDE-disks kunnen, in feite, disks met meer dan 1024 cylinders hanteren. Als je een dergelijk systeem hebt kun je het probleem vergeten; als je er niet helemaal zeker van bent, plaats het dan binnen de eerste 1024 cylinders. Iedere partitie zou uit een even aantal sectoren moeten bestaan, aangezien de Linux bestandssystemen een blokgrootte van 1 kilobyte gebruiken, d.w.z. twee sectoren. Een oneven aantal sectoren zal er in resulteren dat de laatste sector niet zal worden gebruikt. Dit zal niet in enige problemen resulteren, maar het is lelijk, en een aantal versies van fdisk zal hier een waarschuwing over geven. Het wijzigen van de grootte van een partitie vereist normaal gesproken dat je een backup maakt van alles wat je van die partitie wilt bewaren (bij voorkeur van de gehele disk, voor het geval dat), de partitie verwijdert, een nieuwe partitie aanmaakt, en dan alles op de nieuwe partitie terugzet. Als de partitie groter wordt, kan het zijn dat je bovendien ook de groottes van de aangrenzende partities aan moet passen (en er een backup van moet maken en de gegevens terug moet zetten). Aangezien het veranderen van de grootte van een partitie nogal pijnlijk is, heb je bij voorkeur de partities gelijk de eerste keer goed, of heb je een effectief en makkelijk te gebruiken backupsysteem. Als je vanaf media installeert, waarbij niet veel menselijke interactie is vereist (zoals bijvoorbeeld vanaf CD-ROM, in tegenstelling tot diskettes), is het vaak makkelijker om eerst met verschillende configuraties te spelen. Aangezien je er toch nog geen gegevens op hebt staan, is het niet zo pijnlijk om de grootte van de partitie verscheidene malen te wijzigen. Er is een programma voor MS-DOS, met de naam fips, welke de grootte van een MS-DOS partitie wijzigt zonder dat het maken van een backup en het terugzetten van de gegevens is vereist, maar voor andere bestandssystemen is het nog steeds nodig. _________________________________________________________________ Devicebestanden en partities Iedere partitie en extended partitie heeft een eigen devicebestand. De naamgeving voor deze bestanden bestaat hieruit dat het nummer van een partitie aan de naam van de gehele disk wordt toegevoegd, met de afspraak dat 1-4 primaire partities zijn (ongeacht hoeveel primaire partities er zijn) en 5-8 logische partities (ongeacht binnen welke primaire partitie ze voorkomen). Bijvoorbeeld, /dev/hda1 is de eerste partitie op de eerste IDE harddisk, en /dev/sdb7 is de derde extended partitie op de tweede SCSI harddisk. De device lijst in XXX (device list) geeft meer informatie. _________________________________________________________________ Bestandssystemen Wat zijn bestandssystemen? Een bestandssysteem bestaat uit de methode en gegevensstructuren die een besturingssysteem gebruikt om bestanden op een disk of partitie bij te houden; d.w.z. de manier waarop bestanden op de disk zijn georganiseerd. Het woord wordt ook gebruikt om naar een partitie of disk te refereren, die wordt gebruikt om de bestanden of het type bestandssysteem op te slaan. Dus men zou kunnen zeggen: ``Ik heb twee bestandssystemen'', met de betekenis dat men twee partities heeft waarop bestanden worden opgeslagen, of dat men het ``extended bestandssysteem gebruikt'' met de betekenis van het type bestandssysteem. Het verschil tussen een disk of partitie en het bestandssysteem dat het bevat is belangrijk. Een paar programma's (waaronder, voor voldoende redenering vatbaar, programma's die bestandssystemen aanmaken) werken direct met de onbewerkte sectoren van een disk of partitie; als er een bestaand bestandssysteem op voorkomt, zal het worden vernietigd of ernstig worden beschadigd. De meeste programma's werken op een bestandssysteem, en zullen daarom niet functioneren op een partitie, waarop er zich geen bevindt (of waarop zich er één bevindt van het verkeerde type). Voordat een partitie of disk als een bestandssysteem kan worden gebruikt, moet het worden geïnitialiseerd en de gegevensstructuren voor het beheer moeten naar disk worden geschreven. Dit proces wordt het maken van een bestandssysteem genoemd. De meeste UNIX typen bestandssystemen hebben een vergelijkbare algemene structuur, alhoewel de exacte details nogal variëren. De centrale concepten zijn superblock, inode, data block, directory block, en indirection block. In het superblock staat informatie over het bestandssysteem in zijn geheel, zoals de grootte (de exacte informatie hangt hier af van het bestandssysteem). In een inode staat alle informatie over een bestand, behalve de naam van het bestand. De naam is in de directory opgeslagen, samen met het nummer van de inode. Een directory-ingang bestaat uit een bestandsnaam en het nummer dat het bestand voorstelt. De inode bevat de nummers van verscheidene gegevensblokken, die worden gebruikt om de gegevens in het bestand op te slaan. Er is in de inode slechts ruimte voor een paar data block nummers, als er echter meer nodig zijn, wordt meer ruimte voor verwijzingen naar de gegevensblokken dynamisch toegekend. Deze dynamisch toegekende blokken zijn indirecte blokken; de naam geeft aan dat, om het data block te kunnen vinden, men eerst het nummer in het indirecte block moet opzoeken. UNIX bestandssystemen staan gewoonlijk toe dat er een hole in een bestand kan worden aangemaakt (dit wordt met lseek gedaan; kijk de manual page er op na), wat betekent dat het bestandssysteem doet alsof er een bepaalde plaats in het bestand met slechts nul bytes is, maar er worden geen feitelijke disksectoren gereserveerd voor die plaats in het bestand (dit betekent dat het bestand wat minder diskruimte zal gebruiken). Dit gebeurt vooral vaak met kleine uitvoerbare bestanden, Linux shared libraries, een aantal databases en in een paar andere gevallen. (``Holes'' worden geïmplementeerd door een speciale waarde als het adres van het gegevensblok in het indirecte blok of de inode op te slaan). Dit speciale adres betekent dat er geen datablock voor dat deel van het bestand is toegekend, derhalve is er een ``hole'' in een bestand). Holes zijn beperkt bruikbaar. Op het systeem van de auteur toonde een eenvoudige maatregel een potentieel van ongeveer 4 MB aan besparing door holes van ongeveer 200 MB totaal gebruikte diskruimte. Dat systeem bevat echter relatief weinig programma's en geen databasebestanden. _________________________________________________________________ Bestandssystemen in overvloed Linux ondersteunt verscheidene typen bestandssystemen. Tijdens dit schrijven zijn de belangrijkste: minix Het oudste, vermoedelijk betrouwbaarste besturingssysteem, maar het is zeer beperkt qua mogelijkheden. Een deel van de tijdregistratie ontbreekt, bestandsnamen mogen uit maximaal 30 tekens bestaan en het is beperkt in capaciteit (maximaal 64 MB per bestandssysteem). xia Een gewijzigde versie van het minix bestandssysteem, dat de beperkingen betreffende de bestandsnamen en de grootte van bestandsnamen elimineert, maar op geen enkele andere wijze nieuwe mogelijkheden introduceert. Het is niet erg populair, maar er is van gerapporteerd dat het erg goed werkt. ext2 Het native Linux bestandssysteem met de meeste mogelijkheden, en op het moment ook het populairste. Het is ontworpen om upwards compatibel te zijn, zodat nieuwe versies van de code van het bestandssysteem niet vereisen dat bestaande bestandssystemen opnieuw moeten worden gemaakt. ext Een oudere versie van ext2 dat niet upwards compatibel was. Het wordt nog nauwelijks gebruikt in nieuwe installaties, en de meeste mensen zijn op ext2 overgegaan. Bovendien is er ondersteuning voor verscheidene niet bij Linux behorende bestandssystemen, om het makkelijker te maken bestanden uit te wisselen met andere besturingssystemen. Deze niet bij Linux behorende bestandssystemen werken net als native bestandssystemen, behalve dat er misschien een aantal gebruikelijke UNIX eigenschappen in ontbreken, of dat ze vreemde beperkingen of andere rariteiten hebben. msdos Compatibiliteit met MS-DOS (en OS/2 en Windows NT) FAT bestandssystemen. usmdos Breidt het MS-DOS bestandssysteem onder Linux uit met lange bestandsnamen, eigenaren, permissies, links en devicebestanden. Hierdoor kan een normaal MS-DOS bestandssysteem worden gebruikt alsof het een Linux bestandssysteem is, dus waarbij de noodzaak voor een aparte partitie voor Linux wordt weggenomen. iso9660 Het standaard CD-ROM bestandssysteem; de populaire Rock Ridge extensie op de CD-ROM standaard, die langere bestandsnamen toestaat, wordt automatisch ondersteund. nfs Een netwerk bestandssysteem, dat toestaat dat een bestandssysteem tussen vele computers wordt gedeeld om eenvoudig toegang tot de bestanden op alle computers te verkrijgen. hpfs Het OS/2 bestandssysteem. sysv SystemV/386, Coherent, en Xenix bestandssystemen. De keuze van het te gebruiken bestandssysteem hangt van de situatie af. Als compatibiliteit of andere redenen één van de niet-native bestandssystemen noodzakeljk maakt, dan moet dat worden gebruikt. Als men vrij kan kiezen, dan is het waarschijnlijk het verstandigst om ext2 te gebruiken, aangezien het alle eigenschappen heeft, maar geen schade lijdt door een gebrek aan performance. Er is ook nog het proc bestandssysteem, meestal toegankelijk als de /proc directory, wat eigenlijk helemaal geen bestandssysteem is, ook al lijkt het er op. Het proc bestandssysteem maakt het makkelijk om bepaalde gegevensstructuren van de kernel te benaderen, zoals de lijst met processen (vandaar de naam). Het maakt dat deze gegevensstructuren op een bestandssysteem lijkt, en dat het bestandssysteem met alle gebruikelijke tools voor bestanden kan worden gemanipuleerd. Om bijvoorbeeld een lijst met alle processen te krijgen, kan men het volgende commando gebruiken: $ ls -l /proc total 0 dr-xr-xr-x 4 root root 0 Jan 31 20:37 1 dr-xr-xr-x 4 liw users 0 Jan 31 20:37 63 dr-xr-xr-x 4 liw users 0 Jan 31 20:37 94 dr-xr-xr-x 4 liw users 0 Jan 31 20:37 95 dr-xr-xr-x 4 root users 0 Jan 31 20:37 98 dr-xr-xr-x 4 liw users 0 Jan 31 20:37 99 -r--r--r-- 1 root root 0 Jan 31 20:37 devices -r--r--r-- 1 root root 0 Jan 31 20:37 dma -r--r--r-- 1 root root 0 Jan 31 20:37 filesystems -r--r--r-- 1 root root 0 Jan 31 20:37 interrupts -r-------- 1 root root 8654848 Jan 31 20:37 kcore -r--r--r-- 1 root root 0 Jan 31 11:50 kmsg -r--r--r-- 1 root root 0 Jan 31 20:37 ksyms -r--r--r-- 1 root root 0 Jan 31 11:51 loadavg -r--r--r-- 1 root root 0 Jan 31 20:37 meminfo -r--r--r-- 1 root root 0 Jan 31 20:37 modules dr-xr-xr-x 2 root root 0 Jan 31 20:37 net dr-xr-xr-x 4 root root 0 Jan 31 20:37 self -r--r--r-- 1 root root 0 Jan 31 20:37 stat -r--r--r-- 1 root root 0 Jan 31 20:37 uptime -r--r--r-- 1 root root 0 Jan 31 20:37 version $ (Er zullen echter een paar extra bestanden zijn, die niet met processen corresponderen. Het voorbeeld hierboven is ingekort.) Noot: zelfs al wordt het een bestandssysteem genoemd, geen enkel deel van het proc bestandssysteem raakt enige disk aan. Het bestaat alleen in de verbeelding van de kernel. Wanneer iemand ooit naar enig onderdeel van het proc bestandssysteem probeert te kijken, zorgt de kernel ervoor dat het erop lijkt alsof het onderdeel ergens bestaat, zelfs al is dit niet zo. Dus zelfs als er een uit meerdere megabytes bestaand /proc/kcore bestand is, neemt het geen enkele diskruimte in beslag. _________________________________________________________________ Welk bestandssysteem zou moeten worden gebruikt? Het heeft meestal weinig zin om verschillende bestandssystemen te gebruiken. Op het moment is ext2fs de populairste en is het waarschijnlijk de verstandigste keuze. Afhankelijk van de overhead voor het bijhouden van de structuren, de snelheid, (waargenomen) betrouwbaarheid, compabiliteit, en diverse andere redenen, kan het aan te raden zijn om een ander bestandssysteem te gebruiken. Dit moet van geval-tot-geval worden beslist. _________________________________________________________________ Aanmaken van een bestandssysteem Bestandssystemen worden aangemaakt, d.w.z. geïnitialiseerd met het commando mkfs. Er is in feite voor ieder type bestandssysteem een apart programma. mkfs is slechts een front end dat het passende programma uitvoert, afhankelijk van het gewenste type bestandssysteem. Het type wordt met de optie -t fstype geselecteerd. De programma's die door mkfs worden aangeroepen hebben een iets andere commando-regel interface. De algemene en belangrijkste opties worden hieronder samengevat; zie de manual pages voor meer informatie. -t fstype Selecteer het type bestandssysteem. -c Zoek naar slechte blokken en inititaliseer de lijst met slechte blokken dienovereenkomstig. -l filename Lees de lijst met initiële slechte blokken vanuit het bestand met de opgegeven naam. Om een ext2 bestandssysteem op een diskette aan te maken, zou men de volgende commando's op kunnen geven: $ fdformat -n /dev/fd0H1440 Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB. Formatting ... done $ badblocks /dev/fd0H1440 1440 $>$ bad-blocks $ mkfs -t ext2 -l bad-blocks /dev/fd0H1440 mke2fs 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10 360 inodes, 1440 blocks 72 blocks (5.00%) reserved for the super user First data block=1 Block size=1024 (log=0) Fragment size=1024 (log=0) 1 block group 8192 blocks per group, 8192 fragments per group 360 inodes per group Writing inode tables: done Writing superblocks and filesystem accounting information: done $ Ten eerste werd de diskette geformatteerd (de optie -n voorkomt validatie, d.w.z. controle op slechte blokken). Vervolgens werd er met badblocks naar slechte blokken gezocht, waarbij de uitvoer naar een bestand bad-blocks werd gestuurd. Tenslotte werd het bestandssysteem aangemaakt, waarbij de lijst met welke slechte blokken badblocks dan ook vond, werd geïnitialiseerd. De optie -c had met mkfs kunnen worden gebruikt, in plaats van met badblocks en een apart bestand. Dat is wat het voorbeeld hieronder doet. $ mkfs -t ext2 -c /dev/fd0H1440 mke2fs 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10 360 inodes, 1440 blocks 72 blocks (5.00%) reserved for the super user First data block=1 Block size=1024 (log=0) Fragment size=1024 (log=0) 1 block group 8192 blocks per group, 8192 fragments per group 360 inodes per group Checking for bad blocks (read-only test): done Writing inode tables: done Writing superblocks and filesystem accounting information: done $ De optie -c is makkelijker dan een apart gebruik van badblocks, maar badblocks is nodig voor de controle nadat het bestandssysteem werd aangemaakt. Het proces om bestandssystemen op harddisks of partities voor te bereiden is hetzelfde als voor diskettes, behalve dat de formattering niet nodig is. _________________________________________________________________ Mounten en unmounten Voordat men een bestandssysteem kan gebruiken, moet het worden gemount. Het besturingssysteem verricht dan diverse administratieve taken om er zeker van te zijn dat alles werkt. Aangezien alle bestanden onder UNIX zich in een enkele directory-structuur bevinden, zal de mount bewerking de inhoud van het nieuwe bestandssysteem er uit laten zien alsof het de inhoud van een bestaande subdirectory in één of ander reeds gemount bestandssysteem is. Bijvoorbeeld: [149]Figuur 4-3 toont drie aparte bestandssystemen, ieder met een eigen rootdirectory. Als de laatste twee bestandssystemen respectievelijk onder /home en /usr van het eerste bestandssysteem worden gemount, krijgen we een enkele directory-structuur, zoals in [150]Figuur 4-4. Figuur 4-3. Drie aparte bestandssystemen. [hd-mount-separate.png] Figuur 4-4. /home en /usr zijn gemount. [hd-mount-mounted.png] De mounts zouden zoals in het volgende voorbeeld kunnen worden bewerkstelligd: $ mount /dev/hda2 /home $ mount /dev/hda3 /usr $ Het mount commando neemt twee argumenten. Het eerste argument is het devicebestand corresponderend met de disk of de partitie met het bestandssysteem. Het tweede argument is de directory waaronder het zal worden gemount. Na deze commando's lijkt de inhoud van de twee bestandssystemen net als de inhoud van respectievelijk de /home en /usr directories. Men zou kunnen stellen dat ``/dev/hda2 gemount is op /home'', en vergelijkbaar voor /usr. Om naar elk bestandssysteem te kijken, zou men de inhoud van de directory waarop het is gemount bekijken, net als bij iedere andere directory. Merk het verschil op tussen het devicebestand, /dev/hda2, en de directory waarop het is gemount, /home. Het devicebestand geeft toegang tot de onbewerkte inhoud van de disk, de directory waarop is gemount geeft toegang tot de bestanden op de disk. De directory waarop is gemount wordt het mount point genoemd. Linux biedt ondersteuning voor vele typen bestandssystemen. mount probeert het type bestandssysteem te gissen. Je kunt ook de optie -t fstype gebruiken om het type direct te specificeren; dit is soms nodig, aangezien het heuristische mount gebruik niet altijd werkt. Om bijvoorbeeld een MS-DOS diskette te mounten, zou je het volgende commando kunnen gebruiken: $ mount -t msdos /dev/fd0 /floppy $ De directory waarop wordt gemount, hoeft niet leeg te zijn, alhoewel het wel moet bestaan. Als het bestandssysteem is gemount, zullen alle bestanden erin echter niet toegankelijk zijn. (De bestanden die reeds geopend zijn, zullen nog steeds toegankelijk zijn. Bestanden die hard links hebben vanuit andere directories kunnen nog steeds worden benaderd door die namen te gebruiken). Het kan geen kwaad om dit te doen, en het kan zelfs handig zijn. Een paar mensen willen bijvoorbeeld graag dat /tmp en /var/tmp aan elkaar gelijk zijn, en maken /tmp als een symbolische link naar /var/tmp. Als het systeem wordt geboot, voordat het /var bestandssysteem is gemount, wordt in plaats daarvan een /var/tmp directory op het root bestandssysteem gebruikt. Als /var wordt gemount, zal het de /var/tmp directory op het root bestandssysteem ontoegankelijk maken. Als /var/tmp niet op het root bestandssysteem voorkwam, zou het onmogelijk zijn om voor het mounten van /var tijdelijke bestanden te gebruiken. Als je niet van plan bent om iets naar het bestandssysteem te schrijven, gebruik dan de -r switch bij mount voor een read-only mount. Dit zal er voor zorgen dat de kernel pogingen om naar het bestandssysteem te schrijven zal beletten en er ook voor zal zorgen dat de kernel de toegangstijden van de bestanden in de inode niet bijwerkt. Read-only mounts zijn nodig voor onbeschrijfbare media, b.v. CD-ROM's. De oplettende lezer zal reeds een logistiek probleempje hebben opgemerkt. Hoe wordt het eerste bestandssysteem (genaamd root bestandssysteem, want het bevat de root directory) gemount, aangezien het uiteraard niet op een ander bestandssysteem kan worden gemount? Dit is magie. [151][11] Het root bestandssysteem wordt tijdens de systeemstart magisch gemount en men kan er op vertrouwen dat het altijd zal zijn gemount. Als het root bestandssysteem niet kan worden gemount, boot het systeem niet. De naam van het bestandssysteem dat magisch als root is gemount, is óf in de kernel gecompileerd, óf met LILO of rdev ingesteld. Het root bestandssysteem wordt meestal eerst read-only gemount. Met de opstartscripts zal vervolgens fsck worden opgestart om de deugdelijkheid te valideren, en als er geen problemen zijn, wordt het opnieuw gemount, en wel zodanig dat ook schrijfopdrachten. zijn toegestaan. fsck mag niet op een gemount bestandssysteem worden uitgevoerd, aangezien alle wijzigingen aan het bestandssysteem ten tijde dat fsck draait, problemen zullen veroorzaken. Aangezien het root bestandssysteem tijdens de controle read-only is gemount, kan fsck eventuele problemen gerust herstellen. De bewerking waarbij het opnieuw wordt gemount, zal alle metagegevens die het bestandssysteem in het geheugen houdt, verwijderen. Op veel systemen komen er nog andere bestandssystemen voor die ook tijdens de systeemstart automatisch zouden moeten worden gemount. Deze worden in het bestand /etc/fstab gespecificeerd; zie de fstab man page voor details over het formaat. Het hangt van diverse factoren af wanneer de extra bestandssytemen exact worden gemount, en dit kan zonodig door iedere beheerder worden geconfigureerd, zie [152]Hoofdstuk 6. Als een bestandssysteem niet langer gemount hoeft te zijn, kan het unmounten worden bewerkstelldigd met het commando umount. [153][12] umount accepteert één argument: óf het devicebestand óf het mount point. Om bijvoorbeeld de gemounte directories uit het vorige voorbeeld te unmounten, zou men de volgende commando's kunnen gebruiken: $ umount /dev/hda2 $ umount /usr $ Zie de man page voor verdere instructies hoe je het commando kunt gebruiken. Het is verplicht dat je een gemounte diskette altijd unmount, vóórdat je de diskette uit de drive haalt. Haal de diskette niet zomaar uit de drive! Vanwege disk caching, hoeft het niet noodzakelijk zo te zijn dat de gegevens naar de diskette zijn geschreven totdat je het unmount, dus het te vroeg verwijderen van de diskette uit de drive kan er voor zorgen dat de inhoud verminkt raakt. Dit is niet erg waarschijnlijk als je alleen gegevens vanaf een diskette inleest, maar als je, zelfs per ongeluk, gegevens ernaar wegschrijft, kan het resultaat rampzalig zijn. Het mounten en unmounten vereist superuser privileges, d.w.z. alleen root kan het. De reden hiervoor is dat als iedere gebruiker een diskette op iedere directory kan mounten, het nogal makkelijk is om een diskette met bijvoorbeeld een Trojan horse te mounten, dat als /bin/sh of enig ander vaak gebruikt programma wordt vermomd. Het is echter vaak nodig om gebruikers in de gelegenheid te stellen diskettes te gebruiken en er zijn verscheidene manieren voor: * Geef de gebruikers het root wachtwoord. Dit is uiteraard slecht voor de beveiliging, maar het is de eenvoudigste oplossing. Het werkt goed als er geen beveiliging nodig is, wat het geval is op veel persoonlijke systemen die niet op een netwerk zijn aangesloten. * Gebruik een programma zoals sudo om gebruikers toe te staan te mounten. Dit is nog steeds een slechte beveiliging, maar het geeft iedereen niet direct superuser privileges. [154][13] * Zorg dat de gebruikers het package mtools kunnen gebruiken. Dit is een package voor het manipuleren van MS-DOS bestandssystemen, zonder ze te mounten. Dit werkt goed als er alleen MS-DOS diskettes nodig zijn, maar het is anders nogal lastig. * Geef een opsomming van de disk-devices en de daarbijbehorende toegestane mount points met de geschikte opties in /etc/fstab. Het laatste alternatief kan worden geïmplementeerd door aan het bestand /etc/fstab een regel als de volgende toe te voegen: /dev/fd0 /floppy msdos user,noauto 0 0 De kolommen zijn: te mounten devicebestand, directory om op te mounten, type bestandssysteem, opties, backup frequentie (gebruikt door dump), en fsck passeernummer (om de volgorde aan te geven waarin bestandssystemen tijdens de systeemstart moeten worden gecontroleerd; 0 betekent geen controle). De optie noauto zorgt ervoor dat deze mount tijdens de systeemstart niet automatisch wordt uitgevoerd (d.w.z. het stopt mount -a om het te mounten). De optie user staat iedere gebruiker toe het bestandssysteem te mounten, en vanwege beveiligingsredenen staat het de uitvoering van programma's (normaal of setuid) en interpretatie van devicebestanden vanaf het gemounte bestandssysteem niet toe. Hierna kan een gebruiker een diskette met een msdos bestandssysteem met het volgende commando mounten: $ mount /floppy $ Het unmounten van de diskette kan (en moet natuurlijk ook) met het corresponderende umount commando. Als je toegang wilt geven aan verscheidene typen diskettes, zul je verscheidene mount points aan moeten geven. De instellingen kunnen voor ieder mount point anders zijn. Om bijvoorbeeld toegang te geven tot zowel MS-DOS als ext2 diskettes, zou je de volgende regel hiervoor in /etc/fstab kunnen plaatsen: /dev/fd0 /dosfloppy msdos user,noauto 0 0 /dev/fd0 /ext2floppy ext2 user,noauto 0 0 Voor MS-DOS bestandssystemen (niet alleen diskettes), wil je waarschijnlijk de toegang er toe beperken door gebruik te maken van de uid, gid, en umask bestandssysteem opties, die in detail staan beschreven in de manual page van mount. Als je niet oppast, geeft het mounten van een MS-DOS bestandssysteem iedereen op z'n minst leestoegang voor de bestanden die er op voorkomen, wat niet zo verstandig is. _________________________________________________________________ Controleren van de integriteit van een bestandssysteem met fsck Bestandssystemen zijn complex, en zijn als zodanig vatbaar voor fouten. De juistheid en validiteit van een bestandssysteem kan met het commando fsck worden gecontroleerd. Het kan worden geïnstrueerd om kleine problemen die het vindt te repareren en de gebruiker te waarschuwen als er zich niet te repareren problemen voordoen. Gelukkig is de code om bestandssystemen te implementeren zeer effectief vrijgemaakt van fouten, dus er treden zelden problemen op. Als er fouten optreden worden deze meestal veroorzaakt door stroomstoringen, ingebreke blijvende hardware of fouten van de operator; door bijvoorbeeld het niet juist afsluiten van het systeem. De meeste systemen zijn zo ingesteld dat ze fsck automatisch tijdens de systeemstart uitvoeren, zodat eventuele fouten worden gedetecteerd (en hopelijk gecorrigeerd) nog voor het systeem wordt gebruikt. Gebruik van een beschadigd systeem maakt de situatie vaak alleen maar erger: als de bestandssystemen verknoeid zijn, zal het gebruiken van het bestandssysteem dit waarschijnlijk alleen maar verergeren, wat kan resulteren in meer verlies aan gegevens. De uitvoering van fsck kan op grotere bestandssystemen echter een tijd duren en aangezien fouten bijna nooit voorkomen als het systeem goed is afgesloten, worden er een aantal trucs gebruikt die in een dergelijke situatie de controle's voorkomen. De eerste is, dat als er een bestand /etc/fastboot bestaat, er geen controle's worden uitgevoerd. De tweede is dat het ext2 bestandssysteem een speciale markering in het superblok heeft dat aangeeft of het bestandssysteem na de vorige mount het unmounten juist is uitgevoerd. Hierdoor kan e2fsck (de versie van fsck voor het ext2 bestandssysteem) voorkomen dat het bestandssysteem wordt gecontroleerd als de flag aangeeft dat het unmounten werd uitgevoerd. (in de veronderstelling dat het juist unmounten geen problemen betekent). Of de truc met /etc/fastboot op je systeem werkt, hangt af van je opstartscripts, maar de ext2 truc werkt iedere keer dat je e2fsck gebruikt. Het moet expliciet worden doorgegeven met een optie aan e2fsck om te worden voorkomen. (Zie de e2fsck man page voor details hoe je dit kunt doen). De automatische controle werkt alleen voor de bestandssystemen die tijdens de systeemstart automatisch worden gemount. Gebruik fsck handmatig om andere bestandssystemen te controleren, b.v. diskettes. Als fsck niet te repareren problemen constateert, heb je óf grondige kennis nodig van hoe bestandssystemen in het algemeen en het type beschadigde bestandssysteem in het bijzonder werken, óf goede backups. Het laatste is makkelijk (alhoewel soms vervelend) te regelen, het eerste kan soms via een vriend, de nieuwsgroepen en mailinglijsten voor Linux, of één of andere bron van ondersteuning worden geregeld, als je de knowhow zelf niet hebt. Ik zou je er graag meer over vertellen, maar mijn gebrek aan opleiding en ervaring hieromtrent verhindert me dat. Het programma debugfs van Theodore T'so zou van nut kunnen zijn. fsck moet alleen worden uitgevoerd op niet gemounte bestandssystemen, nooit op gemounte bestandssystemen (met uitzondering van de read-only root tijdens de systeemstart). Dit omdat het de onbewerkte disk benadert, en het bestandssysteem daarom kan wijzigen, zonder dat het besturingssysteem zich dit realiseert. Als het besturingssysteem van slag raakt, zal dit zeker problemen geven. _________________________________________________________________ Controleren op diskfouten met badblocks Je doet er verstandig aan periodiek op slechte blokken te controleren. Dit wordt gedaan met het commando badblocks. Het geeft als uitvoer een lijst met alle slechte blokken die het kan vinden. Deze lijst kan aan fsck worden doorgegeven om het op te laten nemen in de gegevensstructuur van het bestandssysteem, zodat het besturingssysteem niet zal proberen om de slechte blokken te gebruiken voor het opslaan van data. Het volgende voorbeeld toont hoe dit gedaan kan worden. $ badblocks /dev/fd0H1440 1440 > bad-blocks $ fsck -t ext2 -l bad-blocks /dev/fd0H1440 Parallelizing fsck version 0.5a (5-Apr-94) e2fsck 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10 Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Check reference counts. Pass 5: Checking group summary information. /dev/fd0H1440: ***** FILE SYSTEM WAS MODIFIED ***** /dev/fd0H1440: 11/360 files, 63/1440 blocks $ Als badblocks rapporteert dat een blok reeds in gebruik is, zal e2fsck proberen het blok naar een andere plek te verplaatsen. Als het blok echt slecht was, niet slechts marginaal, kan het zijn dat de inhoud van het bestand beschadigd is. _________________________________________________________________ Fragmentatie te lijf gaan Wanneer een bestand naar disk wordt geschreven, kan het niet altijd in aaneengesloten blokken worden weggeschreven. Een bestand dat niet in aaneengesloten blokken wordt opgeslagen, is gefragmenteerd. Het duurt langer om een gefragmenteerd bestand in te lezen, aangezien de lees/schrijf-kop van de disk meer bewegingen zal moeten maken. Het is wenselijk om fragmentatie te voorkomen, alhoewel het minder een probleem is in een systeem met een goede buffer cache met read-ahead. Het ext2 bestandssysteem probeert fragmentatie tot een minimum te beperken, door alle blokken in een bestand dichtbij elkaar te houden, zelfs als ze niet in aaneengesloten sectoren kunnen worden opgeslagen. Ext2 kent het vrije blok altijd effectief toe aan de dichtstbijzijnde andere blokken van een bestand. Voor ext2 is het daarom zelden nodig om je zorgen te maken over defragmentatie. Er is een programma voor het defragmenteren van een ext2 bestandssysteem, zie XXX (ext2-defrag) in de bibliografie. Er zijn veel MS-DOS defragmentatieprogramma's die blokken in het bestandssysteem manoeuvreren om de fragmentatie te verwijderen. Voor andere bestandssystemen moet defragmentatie worden gedaan door een backup te maken van het bestandssysteem, het opnieuw aan te maken en de bestanden vanaf backups terug te plaatsen. Het is zo ie zo een goed plan voor alle bestandssystemen om vóór het defragmenteren een backup te maken, aangezien er tijdens de defragmentatie veel mis kan gaan. _________________________________________________________________ Andere tools voor alle bestandssystemen Er zijn nog een aantal andere tools die van nut kunnen zijn bij het beheren van bestandssystemen. df toont de vrije diskruimte van één of meer bestandssystemen; du toont hoeveel diskruimte een directory en alle bestanden daarin in beslag nemen. Deze kunnen worden gebruikt om verspilling van diskruimte tegen te gaan. sync forceert dat alle ongeschreven blokken in de buffercache (zie [155]paragraaf De buffer cache in Hoofdstuk 5) naar disk worden geschreven. Het is zelden nodig om dit met de hand te doen; het daemonproces update doet dit automatisch. Het kan in noodgevallen handig zijn, bijvoorbeeld als update of het helpproces bdflush het begeeft, of je de stroom nu af moet sluiten en niet kan wachten totdat update wordt uitgevoerd. _________________________________________________________________ Andere tools voor het ext2 bestandssysteem In aanvulling op mke2fs, waarmee het bestandssysteem wordt aangemaakt, en e2fsck, waarmee het bestandssysteem wordt gecontroleerd, die direct of via de onafhankelijke front ends van het bestandssysteem toegankelijk zijn, heeft het ext2 bestandssysteem een aantal extra tools die van nut kunnen zijn. tune2fs past parameters van het bestandssysteem aan. Een aantal van de interessantste parameters zijn: * Een maximale mount count. e2fsck forceert een controle als het bestandssysteem te vaak werd gemount, zelfs als de clean flag is gezet. Voor een systeem dat voor het ontwikkelen of het testen van het systeem wordt gebruikt, kan het een goed idee zijn om deze limiet te verlagen. * Maximale tijd tussen controle's. e2fsck kan een maximale tijd tussen twee controles ook afdwingen, zelfs als de clean flag is gezet, en het bestandssysteem nog niet zo vaak is gemount. Dit kan echter worden gedeactiveerd. * Aantal blokken dat voor root is gereserveerd. Ext2 reserveert een aantal blokken voor root, waardoor het nog steeds mogelijk is om systeembeheer te verrichten, zonder iets te moeten verwijderen, als het bestandssysteem volraakt. De gereserveerde hoeveelheid is standaard 5 procent, wat op de meeste disks geen verspilling is. Voor diskettes heeft het echter geen zin om blokken te reserveren. Zie de tune2fs manual page voor meer informatie. dumpe2fs toont informatie over een ext2 bestandssysteem, voornamelijk van het superblock. [156]Figuur 4-5 toont een voorbeelduitvoer. Wat van de informatie in de uitvoer is technisch en vereist begrip van hoe het bestandssysteem werkt (zie appendix XXX ext2fspaper), maar veel ervan is zelfs voor beginnende beheerders gemakkelijk te begrijpen. Figuur 4-5. Voorbeelduitvoer van dumpe2fs dumpe2fs 0.5b, 11-Mar-95 for EXT2 FS 0.5a, 94/10/23 Filesystem magic number: 0xEF53 Filesystem state: clean Errors behavior: Continue Inode count: 360 Block count: 1440 Reserved block count: 72 Free blocks: 1133 Free inodes: 326 First block: 1 Block size: 1024 Fragment size: 1024 Blocks per group: 8192 Fragments per group: 8192 Inodes per group: 360 Last mount time: Tue Aug 8 01:52:52 1995 Last write time: Tue Aug 8 01:53:28 1995 Mount count: 3 Maximum mount count: 20 Last checked: Tue Aug 8 01:06:31 1995 Check interval: 0 Reserved blocks uid: 0 (user root) Reserved blocks gid: 0 (group root) Group 0: Block bitmap at 3, Inode bitmap at 4, Inode table at 5 1133 free blocks, 326 free inodes, 2 directories Free blocks: 307-1439 Free inodes: 35-360 debugfs is een debugger voor een bestandssysteem. Het staat toe dat er directe toegang tot de gegevenstructuren op een