Copyright © 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The FreeBSD Dutch Documentation Project
Welkom bij FreeBSD! Dit handboek behandelt de installatie en het dagelijks gebruik van FreeBSD 8.3-RELEASE en FreeBSD 9.0-RELEASE. Aan deze handleiding wordt nog gewerkt, en is het resultaat van het werk van veel mensen. Veel hoofdstukken of paragrafen bestaan nog niet en wat bestaat dient soms nog bijgewerkt te worden. Als de lezer mee wil helpen aan dit project kan een mail gestuurd worden naar de FreeBSD documentatieproject mailinglijst. De meest recente versie van dit document is te vinden op de FreeBSD website. Eerdere versies van dit handboek zijn te vinden op http://docs.FreeBSD.org/doc/. Het kan ook gedownload worden in veel verschillende formaten en compressiewijzen van de FreeBSD FTP server of een van de vele mirrorsites. Een gedrukt exemplaar van het handboek is te koop bij de FreeBSD Mall (Engels). Het handboek kan ook doorzocht worden.
Redistribution and use in source (SGML DocBook) and 'compiled' forms (SGML, HTML, PDF, PostScript, RTF and so forth) with or without modification, are permitted provided that the following conditions are met:
Redistributions of source code (SGML DocBook) must retain the above copyright notice, this list of conditions and the following disclaimer as the first lines of this file unmodified.
Redistributions in compiled form (transformed to other DTDs, converted to PDF, PostScript, RTF and other formats) must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Belangrijk: THIS DOCUMENTATION IS PROVIDED BY THE FREEBSD DOCUMENTATION PROJECT "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FREEBSD DOCUMENTATION PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
FreeBSD is een geregistreerd handelsmerk van de FreeBSD Foundation.
3Com en HomeConnect zijn geregistreerde handelsmerken van 3Com Corporation.
3ware en Escalade zijn geregistreerde handelsmerken van 3ware Inc.
ARM is een geregistreerd handelsmerk van ARM Limited.
Adaptec is een geregistreerd handelsmerk van Adaptec, Inc.
Adobe, Acrobat, Acrobat Reader, en PostScript zijn òfwel geregistreerde handelsmerken òf handelsmerken van Adobe Systems Incorporated in de Verenigde Staten en/of andere landen.
Apple, AirPort, FireWire, Mac, Macintosh, Mac OS, Quicktime, en TrueType zijn handelsmerken van Apple Computer, Inc., geregistreerd in de Verenigde Staten en andere landen.
Corel en WordPerfect zijn handelsmerken of geregistreerde handelsmerken van Corel Corporation en/of haar dochterondernemingen in Canada, de Verenigde Staten en/of andere landen.
Sound Blaster is een handelsmerk van Creative Technology Ltd. in de Verenigde Staten en/of andere landen.
CVSup is een geregistreerd handelsmerk van John D. Polstra.
Heidelberg, Helvetica, Palatino, en Times Roman zijn òfwel geregistreerde handelsmerken òf handelsmerken van Heidelberger Druckmaschinen AG in de Verenigde Staten en andere landen.
IBM, AIX, EtherJet, Netfinity, OS/2, PowerPC, PS/2, S/390, en ThinkPad zijn handelsmerken van International Business Machines Corporation in de Verenigde Staten, andere landen, of beide.
IEEE, POSIX, en 802 zijn geregistreerde handelsmerken van Institute of Electrical and Electronics Engineers, Inc. in de Verenigde Staten.
Intel, Celeron, EtherExpress, i386, i486, Itanium, Pentium, en Xeon zijn handelsmerken of geregistreerde handelsmerken van Intel Corporation of haar dochterondernemingen in de Verenigde Staten en andere landen.
Intuit en Quicken zijn geregistreerde handelsmerken en/of geregistreerde dienstmerken van Intuit Inc., of een van haar dochterondernemingen, in de Verenigde Staten en andere landen.
Linux is een geregistreerd handelsmerk van Linus Torvalds.
LSI Logic, AcceleRAID, eXtremeRAID, MegaRAID en Mylex zijn handelsmerken of geregistreerde handelsmerken van LSI Logic Corp.
M-Systems en DiskOnChip zijn handelsmerken of geregistreerde handelsmerken van M-Systems Flash Disk Pioneers, Ltd.
Macromedia, Flash, en Shockwave zijn handelsmerken geregistreerde handelsmerken van Macromedia, Inc. in de Verenigde Staten en/of andere landen.
Microsoft, IntelliMouse, MS-DOS, Outlook, Windows, Windows Media en Windows NT zijn òfwel geregistreerde handelsmerken òf handelsmerken van Microsoft Corporation in de Verenigde Staten en/of andere landen.
Netscape en de Netscape Navigator zijn geregistreerde handelsmerken van Netscape Communications Corporation in de Verenigde Staten en andere landen.
GateD en NextHop zijn geregistreerde en ongeregistreerde handelsmerken van NextHop in de Verenigde Staten en andere landen.
Motif, OSF/1, en UNIX zijn geregistreerde handelsmerken en IT DialTone en The Open Group zijn handelsmerken van The Open Group in de Verenigde Staten en andere landen.
Oracle is een geregistreerd handelsmerk van Oracle Corporation.
PowerQuest en PartitionMagic zijn geregistreerde handelsmerken van PowerQuest Corporation in de Verenigde Staten en/of andere landen.
RealNetworks, RealPlayer, en RealAudio zijn de geregistreerde handelsmerken van RealNetworks, Inc.
Red Hat, RPM, zijn handelsmerken of geregistreerde handelsmerken van Red Hat, Inc. in de Verenigde Staten en andere landen.
SAP, R/3, en mySAP zijn handelsmerken of geregistreerde handelsmerken van SAP AG in Duitsland en in verschillende andere wereldwijde landen.
Sun, Sun Microsystems, Java, Java Virtual Machine, JavaServer Pages, JDK, JRE, JSP, JVM, Netra, OpenJDK, Solaris, StarOffice, Sun Blade, Sun Enterprise, Sun Fire, SunOS, Ultra en VirtualBox zijn handelsmerken of geregistreerde handelsmerken van Sun Microsystems, Inc. in de Verenigde Staten en andere landen.
Symantec en Ghost zijn geregistreerde handelsmerken van Symantec Corporation in de Verenigde Staten en andere landen.
MATLAB is een geregistreerd handelsmerk van The MathWorks, Inc.
SpeedTouch is een handelsmerk van Thomson.
U.S. Robotics en Sportster zijn geregistreerde handelsmerken van U.S. Robotics Corporation.
VMware is een handelsmerk van VMware, Inc.
Waterloo Maple en Maple zijn handelsmerken of geregistreerde handelsmerken van Waterloo Maple Inc.
Mathematica is een geregistreerd handelsmerk van Wolfram Research, Inc.
XFree86 is een handelsmerk van The XFree86 Project, Inc.
Ogg Vorbis en Xiph.Org zijn handelsmerken van Xiph.Org.
Veel van de termen die door fabrikanten en verkopers worden gebruikt om hun producten te onderscheiden worden geclaimd als handelsmerk. Op de plaatsen waar deze handelsmerken in dit document voorkomen, en het FreeBSD Project op de hoogte was van de claim op het handelsmerk, worden de termen gevolgd door het symbool “™” of het symbool “®”.
De nieuwkomers bij FreeBSD zullen zien dat de eerste sectie van dit boek ze begeleidt door de FreeBSD installatieprocedure en de geleidelijke introductie in de concepten van UNIX®. Om deze sectie goed te kunnen doorlopen is meer nodig dan de wens om te ontdekken en de mogelijkheid om nieuwe concepten op te nemen wanneer ze geïntroduceerd worden.
De tweede, veel grotere, sectie van het handboek is een uitvoerige referentie naar alle mogelijke (relevante) onderwerpen die interessant zijn voor FreeBSD systeembeheerders. Sommige van deze hoofdstukken adviseren mogelijk om eerdere documentatie te lezen. Dit wordt aangegeven in de samenvatting aan het begin van elk hoofdstuk.
Voor een lijst van extra bronnen van informatie zie Bijlage B.
De huidige online versie van het Handboek representeert de gezamenlijke inspanning van vele honderden bijdragende vrijwilligers van de laatste 10 jaar. Hieronder staan enkele van de belangrijke wijzigingen sinds de tweedelige derde editie in 2004 werd uitgegeven:
Hoofdstuk 26, DTrace, is toegevoegd met informatie over het krachtige prestatie-analysegereedschap DTrace.
Hoofdstuk 21, Ondersteuning voor bestandssystemen, is toegevoegd met informatie over vreemde bestandssystemen in FreeBSD, zoals ZFS van Sun™.
Hoofdstuk 18, Beveiliginsgebeurtenissen auditen, is toegevoegd om de nieuwe auditing-mogelijkheden van FreeBSD te bespreken en het gebruik ervan uit te leggen.
Hoofdstuk 23, Virtualisatie, is toegevoegd met informatie over het installeren van FreeBSD op virtualisatiesoftware.
Hoofdstuk 3, FreeBSD 9.X en nieuwer installeren, is toegevoegd om het installeren van FreeBSD met het nieuwe installatiegereedschap, bsdinstall te behandelen.
De derde editie was het resultaat van meer dan twee jaar werk van de toegewijde leden van het FreeBSD Documentation Project. De gedrukte editie werd zo groot dat het noodzakelijk was om het was om het als twee afzonderlijke delen te publiceren. Hieronder staan de grootste veranderingen in deze nieuwe editie:
Hoofdstuk 12, Instellingen en optimalisatie, is uitgebreid met nieuwe informatie over ACPI power en resource management, het systeemhulpprogramma cron en er staan meer opties voor het optimaliseren van de kernel beschreven.
Hoofdstuk 15, Beveiliging, is uitgebreid met meer informatie over virtuele private netwerken (VPN's), toegangscontrolelijsten voor het bestandssysteem (ACL's) en beveiligingswaarschuwingen.
Hoofdstuk 17, Verplichte toegangscontrole (MAC), is een nieuw hoofdstuk in deze editie. Er wordt in uitgelegd wat MAC is en hoe het gebruikt kan worden om FreeBSD te beveiligen.
Hoofdstuk 19, Opslag, is uitgebreid met informatie over USB opslagapparaten, snapshots van bestandssystemen, bestandssystemen op basis van bestanden en het netwerk en versleutelde partities op schijven.
Hoofdstuk 22, Vinum, is een nieuw hoofdstuk in deze editie. Er wordt in beschreven hoe Vinum gebruikt kan worden. Vinum is een logische volume manager die apparaat onafhankelijke logische schijven kan aanbieden en software RAID-0, RAID-1 en RAID-5.
Aan Hoofdstuk 28, PPP en SLIP, is een paragraaf toegevoegd over problemen oplossen.
Hoofdstuk 29, E-mail, is uitgebreid met informatie over alternatieve transport programma's, SMTP authenticatie, UUCP, fetchmail, procmail en een aantal andere gevorderde onderwerpen.
Hoofdstuk 30, Netwerkdiensten, is nieuw in deze editie. Dit hoofdstuk bevat informatie over het opzetten van een Apache HTTP Server, ftpd en het opzetten van een server voor Microsoft® Windows® clients met Samba. Een aantal paragrafen uit Hoofdstuk 32, Geavanceerde Netwerken, zijn om reden van presentatie naar dit hoofdstuk verplaatst.
Hoofdstuk 32, Netwerken voor gevorderden, is uitgebreid met informatie over het gebruik van Bluetooth® apparaten met FreeBSD, het opzetten van draadloze netwerken en Asynchronous Transfer Mode (ATM) netwerken.
Er is een termenoverzicht toegevoegd als centrale locatie voor definities van technische termen die in dit boek gebruikt worden.
Tenslotte zijn er nog veel esthetische wijzigingen doorgevoerd aan tabellen en figuren in het boek.
Deze tweede editie is een optelsom van meer dan twee jaar werk door vaste leden van het FreeBSD Documentation Project. Het volgende zijn de grote wijzigingen in deze editie:
Er is een complete INDEX toegevoegd.
Alle ASCII-figuren zijn vervangen door grafische diagrammen.
Aan elk hoofdstuk is een standaardsamenvatting toegevoegd om een snel overzicht te geven welke informatie zich in het hoofdstuk bevindt en wat de lezer geacht wordt te weten.
De inhoud is logisch ingedeeld in drie delen: “Starten”, “Systeembeheer” en “Appendix”.
Hoofdstuk 2 (“FreeBSD installeren”) is compleet herschreven met veel schermafdrukken erbij om het makkelijker te maken voor nieuwe gebruikers om greep te krijgen op de tekst.
Hoofdstuk 4 (“UNIX beginselen”) is uitgebreid met extra informatie over processen, daemons en signalen.
Hoofdstuk 5 (“Applicaties installeren”) is uitgebreid met extra informatie over binair package-beheer.
Hoofdstuk 6 (“Het X Window systeem”) is compleet herschreven met de nadruk op het gebruik van moderne bureaubladtechnologiën zoals KDE en GNOME op XFree86™ 4.X.
Hoofdstuk 13 (“Het FreeBSD Opstartproces”) is uitgebreid.
Hoofdstuk 19 (“Opslag”) is herschreven uit wat eens twee aparte hoofdstukken waren over “schijven” en “backups”. We vinden dat de onderwerpen beter begrijpbaar zijn wanneer ze in één hoofdstuk zijn ondergebracht. Er is ook een sectie over RAID (zowel hardware- als softwarematig) toegevoegd.
Hoofdstuk 27 (“Seriële communicatie”) is compleet gereorganiseerd en bijgewerkt voor FreeBSD 4.X/5.X.
Hoofdstuk 28 (“PPP en SLIP”) is aanzienlijk bijgewerkt.
Veel nieuwe secties zijn toegevoegd aan Hoofdstuk 32 (“Geavanceerd netwerken”).
Hoofdstuk 29 (“E-mail”) is uitgebreid met meer informatie over het instellen van sendmail.
Hoofdstuk 11 (“ Linux® binaire compatibiliteit”) is uitgebreid met informatie over het installeren van Oracle®.
De volgende nieuwe onderwerpen worden behandeld in de tweede editie:
Instellingen en optimalisatie (Hoofdstuk 12).
Multimedia (Hoofdstuk 8)
Dit boek is opgedeeld in vijf logische secties. De eerste sectie, Beginnen, behandelt de installatie en het basisgebruik van FreeBSD. Er wordt verwacht dat lezers deze hoofdstukken volgt, en mogelijk hoofdstukken overslaat met bekende onderwerpen. De tweede sectie, Algemene Taken, behandelt veelgebruikte functies van FreeBSD. Deze sectie en alle volgende kunnen in een willekeurige volgorde gelezen worden. Iedere sectie begint met een beknopte samenvatting die beschrijft wat het hoofdstuk inhoudt en wat de lezer al moet weten. Dit is bedoeld om de lezer de kans te geven alleen dat te lezen wat voor hem van belang is. In de derde sectie, Systeembeheer, wordt het beheer behandeld. De vierde sectie, Netwerkcommunicatie, gaat over netwerken en servers. De vijfde sectie bevat appendices met referentiemateriaal.
Introduceert FreeBSD aan een nieuwe gebruiker. Het beschrijft de geschiedenis van het FreeBSD project, de doelen en het ontwikkelmodel.
Begeleidt de gebruiker door het gehele installatieproces van FreeBSD 8.X en eerder door middel van sysinstall. Sommige geavanceerde onderwerpen over installeren, zoals installeren via een seriële console, worden ook behandeld.
Begeleidt een gebruiker door het gehele installatieproces van FreeBSD 9.X en nieuwer door middel van bsdinstall.
Behandelt de basiscommando's en functionaliteit van het FreeBSD besturingssysteem. Als de lezer bekend is met Linux of een andere UNIX variant, kan dit hoofdstuk waarschijnlijk overgeslagen worden.
Behandelt de installatie van software van derden, met zowel FreeBSD's innovatieve “Portscollectie” als de standaard binaire packages.
Beschrijft het X Window systeem in het algemeen en het gebruik van X11 op FreeBSD in het bijzonder. Het beschrijft ook standaard bureaubladomgevingen zoals KDE en GNOME.
Levert standaard bureaubladapplicaties in een lijst, zoals webbrowsers en productiviteitspakketten, en beschrijft hoe ze te installeren op FreeBSD.
Laat zien hoe geluid- en video-ondersteuning te installeren voor een systeem. Het beschrijft ook een aantal voorbeeld audio- en video- applicaties.
Beschrijft waarom misschien een nieuwe kernel ingesteld moet worden en levert gedetailleerde instructies voor het instellen, bouwen en installeren van een eigen kernel.
Beschrijft hoe printers beheerd worden onder FreeBSD, met informatie over bannerpagina's, afdruk-accounting en initiële installatie.
Beschrijft de mogelijkheden van FreeBSD voor binaire compatibiliteit met Linux. Het biedt ook gedetailleerde installatie-instructies voor vele populaire Linux applicaties zoals Oracle, SAP® R/3®, en Mathematica®.
Beschrijft de parameters beschikbaar voor systeembeheerders om een FreeBSD te optimaliseren voor de beste prestaties. Het beschrijft ook diverse instellingenbestanden die gebruikt worden in FreeBSD en waar die te vinden zijn.
Beschrijft de FreeBSD opstartprocedure en legt uit hoe deze aan te passen met instellingen.
Beschrijft hoe gebruikersaccounts aan te maken en te wijzigen. Het beschrijft ook welke resourcebeperkingen er gezet kunnen worden op gebruikers en andere account-beheerstaken.
Beschrijft vele verschillende hulpapplicaties die beschikbaar zijn die helpen om een FreeBSD systeem veilig te houden, met oa: Kerberos, IPsec en OpenSSH.
Beschrijft het jail-raamwerk, en de verbeteringen van jails (gevangenissen) ten opzichte van de traditionele ondersteuning voor chroot van FreeBSD.
Legt uit was Verplichte Toegangscontrole (MAC) is en hoe het gebruikt kan worden om een FreeBSD te beveiligen.
Beschrijft wat FreeBSD Event Auditing is, hoe het geïnstalleerd kan worden, en hoe audit trails geïnspecteerd en gemonitord kunnen worden.
Beschrijft hoe opslagmedia en bestandssystemen beheerd worden onder FreeBSD. Dit omvat fysieke schijven, RAID arrays, optische en tape media, geheugenschijven en netwerkbestandssystemen.
Beschrijft wat het GEOM raamwerk in FreeBSD is en hoe de verschillende ondersteunde RAID-niveau's in te stellen.
Gaat de ondersteuning voor vreemde bestandssystemen in FreeBSD na, zoals het Z File System van Sun.
Beschrijft hoe Vinum gebruikt wordt, een logische volumebeheerder die apparaatonafhankelijke logische schijven levert, met software RAID-0, RAID-1 en RAID-5.
Beschrijft wat virtualisatiesystemen bieden, en hoe ze met FreeBSD gebruikt kunnen worden.
Beschrijft hoe FreeBSD met andere talen dan Engels te gebruiken is. Behandelt zowel het systeem- als applicatieniveau van localisatie.
Geeft uitleg over de verschillen tussen FreeBSD-STABLE, FreeBSD-CURRENT en FreeBSD uitgaven. Beschrijft welke gebruikers voordeel hebben van het bijhouden van een ontwikkelsysteem en legt dat proces uit. Beschrijft de manier waarop gebruikers hun systeem naar de laatste beveiligingsuitgave kunnen bijwerken.
Beschrijft hoe het gereedschap DTrace van Sun te configureren en gebruiken in FreeBSD. Dynamisch tracen kan helpen bij het lokaliseren van prestatieproblemen, door real-time systeemanalyse uit te voeren.
Legt uit hoe een verbinding te maken met terminals en modems op een FreeBSD systeem voor zowel dial-in als dial-out verbindingen.
Beschrijft hoe PPP, SLIP en PPP over Ethernet te gebruiken om verbinding te maken met remote systemen met FreeBSD.
Legt verschillende componenten uit van een mailserver en gaat dieper in op simpele instellingen voor de populairste mailserver software: sendmail.
Geeft gedetailleerde instructies en voorbeeldinstellingen om een FreeBSD machine als een netwerk bestandssysteem server, DNS server, netwerk informatiesysteem server of tijdserver in te stellen.
Licht de filosofie achter op software gebaseerde firewalls toe en beschrijf in detail hoe de verschillende firewalls die in FreeBSD beschikbaar zijn ingesteld kunnen worden.
Beschrijft meerdere netwerk onderwerpen, inclusief het delen van een Internetverbinding met andere computers in een LAN, routeren voor gevorderden, draadloze netwerken, Bluetooth, ATM, IPv6 en nog veel meer.
Geeft verschillende bronnen aan voor het verkrijgen van FreeBSD media op CD-ROM of DVD evenals verschillende sites op het Internet die gebruikers in staat stellen FreeBSD te downloaden en te installeren.
Dit boek behandelt veel verschillende onderwerpen die de lezer misschien hongerig maken naar een gedetailleerdere uitleg. De bibliografie bevat verwijzingen naar een aantal uitstekende boeken.
Beschrijft de vele forums die beschikbaar zijn voor FreeBSD gebruikers om vragen te stellen, en om deel te nemen aan technische conversaties over FreeBSD.
Geeft de PGP-vingerafdrukken van verschillende FreeBSD ontwikkelaars.
Om consistentie en leesbaarheid te behouden en de leesbaarheid te behouden worden er een aantal overeenkomsten nageleefd in dit boek.
Een italic lettertype wordt gebruikt voor bestandsnamen, URL's, benadrukte tekst, en het eerste gebruik van technische termen.
Een monospaced lettertype wordt gebruikt voor foutmeldingen, commando's, omgevingsvariabelen, namen van ports, hostnamen, gebruikersnamen, groepsnamen, apparaatnamen, variabelen en stukjes code.
Een vet lettertype wordt gebruikt voor applicaties, commando's en toetsen.
Toetsen worden weergegeven in bold om op te vallen tussen andere tekst. Toetscombinaties die bedoeld zijn om tegelijkertijd getypt te worden, worden weergeven met +' tussen de toetsen zoals
Ctrl+Alt+Del
Betekent dat de gebruiker de volgende toetsen op hetzelfde moment moet indrukken: Ctrl, Alt en Del.
Toetsen die bedoeld zijn om achter elkaar te typen worden gescheiden door komma's, bijvoorbeeld
Ctrl+X, Ctrl+S
zou betekenen dat de gebruiker de Ctrl en X toetsen tegelijk moet indrukken en erna Ctrl en S tegelijkertijd moet indrukken.
Voorbeelden die beginnen met E:\> geven aan dat het een MS-DOS® commando betreft. Tenzij anders vermeld, kunnen deze commando's in een “Command prompt”scherm in een moderne Microsoft Windows omgeving worden gebruikt.
E:\> tools\fdimage floppies\kern.flp A:
Voorbeelden die starten met een # geven aan dat een commando ingegeven moet worden als de superuser in FreeBSD. Er kan aangemeld worden met root om het commando in te typen, of er kan na als gewone gebruiker aangemeld te hebben gebruikt gemaakt worden van su(1) om superuser-rechten te verkrijgen.
# dd if=kern.flp of=/dev/fd0
Voorbeelden die starten met % geven aan dat een commando opgegeven moet worden vanuit een normale gebruikersaccount. Tenzij anders vermeld, wordt de C-shell syntaxis gebruikt voor het instellen van omgevingsvariabelen en andere shellcommando's.
% top
Het boek dat nu voorligt representeert de inspanningen van honderden mensen over de hele wereld. Of ze nu foutjes verbeteren of complete hoofdstukken inleveren, ze hebben allemaal nuttig bijgedragen.
Verschillende bedrijven hebben bijgedragen aan het maken van dit document door de schrijvers te betalen om hier voltijds aan te werken, door te betalen voor de publicatie, etc. In het bijzonder heeft BSDi (Overgenomen door Wind River Systems) leden van het FreeBSD Documentation Project betaald om voltijds te werken aan het verbeteren van dit boek, wat leidde tot de publicatie van de eerste editie in maart 2000 (ISBN 1-57176-241-8). Wind River Systems heeft daarna verschillende schrijvers betaald om een aantal verbeteringen uit te voeren voor de printuitvoer-infrastructuur en om extra hoofdstukken toe te voegen aan de tekst. Dit werk leverde de publicatie van de tweede gedrukte editie in november 2001 (ISBN 1-57176-303-1). In 2003-2004 heeft FreeBSD Mall, Inc een aantal mensen die bijdragen hebben geleverd betaald om het handboek te verbeteren voor een derde gedrukte editie.
Dit deel van het FreeBSD handboek is voor gebruikers en beheerders die net beginnen met FreeBSD. Deze hoofdstukken:
Geven een inleiding in FreeBSD;
Lichten het installatieproces toe;
Bespreken de UNIX basisbegrippen en grondslag;
Tonen hoe de vele aanvullende applicaties voor FreeBSD geïnstalleerd kunnen worden;
Introduceren X, het venstersysteem van UNIX en gaan uitvoerig in op hoe een bureaubladomgeving wordt ingesteld die een gebruiker helpt productiever te zijn.
Er is geprobeerd het aantal vooruitwijzingen tot een minimum te beperken zodat het handboek van begin tot einde gelezen kan worden zonder bladeren.
Welkom bij FreeBSD! Dit hoofdstuk beschrijft de verschillende aspecten van het FreeBSD Project: geschiedenis, doelen, ontwikkelmodel en meer.
Na het lezen van dit hoofdstuk weet de lezer:
Hoe FreeBSD gerelateerd is aan andere besturingssystemen;
De geschiedenis van het FreeBSD Project;
De doelen van het FreeBSD Project;
De fundering van het FreeBSD open-source ontwikkelmodel;
En natuurlijk: waar de naam “FreeBSD” vandaan komt.
FreeBSD is een op 4.4BSD-Lite gebaseerd besturingssysteem voor Intel (x86 en Itanium®), AMD64 en Sun UltraSPARC® computers. Er zijn ook ports naar andere architecturen in voorbereiding. Er is nog meer informatie over de geschiedenis van FreeBSD of over de huidige uitgave. Als de lezer wil bijdragen aan het project (code, hardware, geld) wordt aangeraden het artikel Bijdragen aan FreeBSD te lezen.
FreeBSD heeft veel mogelijkheden die het bespreken waard zijn. Hier zijn er enkele op een rij gezet:
Preemptive multitasking zorgt ervoor dat meerdere programma's en gebruikers op dezelfde computer kunnen werken, zonder dat de systeemrespons of stabiliteit beïnvloed wordt.
Ondersteuning voor meerdere gebruikers maakt het mogelijk dat verschillende mensen een FreeBSD systeem tegelijkertijd kunnen gebruiken voor een groot aantal taken. Dit betekent bijvoorbeeld dat randapparaten als printers en tapedrives gedeeld kunnen worden door alle gebruikers van het systeem en dat individuele beperkingen ingesteld kunnen worden voor gebruikers of voor groepen gebruikers, zodat kritieke systeembronnen beschermd kunnen worden tegen onrechtmatig of overmatig gebruik.
Krachtige mogelijkheden voor TCP/IP netwerken met ondersteuning voor industriestandaarden als SCTP, DHCP, NFS, NIS, PPP, SLIP, IPsec en IPv6. Dit betekent dat een FreeBSD-systeem makkelijk kan samenwerken met andere systemen en dat het kan functioneren als bedrijfsserver, waarbij het belangrijke functies als NFS (bestandsdeling over het netwerk), email, webdiensten, FTP, routing en firewall-diensten kan aanbieden.
Geheugenbeveiliging garandeert dat applicaties (of gebruikers) elkaar niet kunnen storen. Een crashende applicatie heeft totaal geen effect op andere applicaties.
FreeBSD is een 32-bits besturingssysteem (64-bits op de Itanium, AMD64, en UltraSPARC) en is van de grond af aan zo ontworpen.
Het X Window systeem (X11R7), een industriële standaard, biedt een grafische gebruikersinterface (GUI) met als enige benodigdheden een VGA-kaart en een beeldscherm.
Door binaire compatibiliteit met veel programma's voor Linux, SCO, SVR4, BSDI en NetBSD is het mogelijk om deze programma's zonder snelheidsverlies op FreeBSD te draaien.
Er zijn duizenden applicaties beschikbaar in de FreeBSD ports en pakketten collectie. Waarom zoeken op het Internet als het allemaal al klaarstaat?
Duizenden andere en makkelijk over te zetten applicaties zijn beschikbaar op het Internet. FreeBSD is broncode-compatibel met de meeste populaire commerciële UNIX systemen, wat betekent dat veel applicaties nagenoeg geen wijzigingen vereisen om te compileren op FreeBSD.
Het demand-paged virtueel geheugen en de “gecombineerde VM/buffer cache” van FreeBSD zorgen ervoor dat applicaties met grote geheugenbehoeften niets te kort komen, terwijl de systeemrespons niet achteruit gaat.
SMP-ondersteuning voor computers met meerdere processoren.
Een volledige C en C++ ontwikkelomgeving. Vele andere programmeertalen, te gebruiken voor onderzoek of geavanceerde ontwikkeling, zijn ook beschikbaar in de ports- en pakketcollectie.
De broncode van het hele systeem is beschikbaar, zodat gebruikers de volledige controle over het systeem in handen hebben. Waarom genoegen nemen met alleen het erewoord van de softwarefabrikant, als een compleet open systeem ook tot de mogelijkheden behoort?
Uitgebreide online documentatie.
En nog veel meer!
FreeBSD is gebaseerd op de 4.4BSD-Lite uitgave van de Computer Systems Research Group (CSRG) aan de University of California in Berkeley en borduurt voort op een lange traditie van ontwikkeling van BSD-systemen. Het FreeBSD Project heeft duizenden uren gestoken in het afstellen van het systeem voor maximale prestaties en betrouwbaarheid in realistische en veel voorkomende situaties. Terwijl veel commerciële bedrijven blijven worstelen met het uitbrengen van besturingssystemen met dergelijke mogelijkheden, prestaties en betrouwbaarheid, kan FreeBSD deze nu bieden!
De toepassingen voor FreeBSD worden alleen beperkt door eigen fantasie. Van software-ontwikkeling tot fabrieksautomatisering, van voorraadbeheersing tot de azimuth-correctie van een satellietantenne: als het kan met een commercieel UNIXproduct, dan kan het ook met FreeBSD! FreeBSD vaart ook wel bij de letterlijk duizenden open-source programma's, vaak van bijzonder hoge kwaliteit, die ontwikkeld zijn in onderzoekscentra, universiteiten over de hele wereld en open-source gemeenschappen, en die beschikbaar zijn voor weinig of geen geld. Ook steeds meer commerciële applicaties vinden hun weg naar FreeBSD.
Omdat ook de broncode van FreeBSD zelf vrij beschikbaar is, kan het systeem aangepast worden voor speciale toepassingen of projecten, op manieren die meestal niet mogelijk zijn met besturingssystemen van vooraanstaande commerciële softwarehuizen. Hier zijn een aantal voorbeelden van toepassingen waar FreeBSD voor gebruikt wordt:
Internetdiensten: de robuuste TCP/IP netwerkarchitectuur die in FreeBSD zit, maakt het een ideaal platform voor uiteenlopende Internetdiensten als:
FTP servers;
World Wide Webservers (standaard of beveiligd [SSL]);
IPv4 en IPv6 routering
Firewalls en NAT (“IP-maskering”) gateways;
E-mail servers;
USENET nieuws of Bulletin Board (BBS) systemen;
En meer...
FreeBSD kan eenvoudig geleerd worden op een goedkope standaard-PC, om later verder te groeien naar een professioneel Xeon-systeem met 4 processoren (of meer!) en RAID opslagsystemen als een bedrijf groeit.
Onderwijs: is de lezer informaticastudent of werkzaam in een ander vakgebied dat hier mee te maken heeft? Er is geen betere manier om besturingssystemen, computerarchitecturen en netwerken te bestuderen dan de hands-on open-source ervaring die FreeBSD kan bieden. Gratis beschikbare programma's voor CAD, wiskundige toepassingen en grafisch ontwerp maken FreeBSD ook heel handig voor mensen wiens primaire interesse voor de computer ligt bij het voltooien van ander werk!
Onderzoek: omdat de broncode van het volledige systeem beschikbaar is, vormt FreeBSD een uitstekende basis voor het onderzoeken van besturingssystemen of andere takken in de informatica. De open natuur van FreeBSD maakt het ook mogelijk voor groepen mensen over de hele wereld om met elkaar samen te werken, zonder dat men zich zorgen hoeft te maken over speciale licentieovereenkomsten of beperkingen op wat er besproken kan worden in open fora.
Netwerken: nieuwe router nodig? Of een nameserver (DNS)? Een firewall om een intern netwerk te beschermen? FreeBSD kan die ongebruikte 486 of Pentium PC die nog ergens in een hoekje ligt gemakkelijk omtoveren tot een geavanceerde router met uitgebreide pakketfilter mogelijkheden.
X Window werkstation: FreeBSD is een prima keuze als goedkope X terminal oplossing, door gebruik te maken van de gratis beschikbare X11 server. In tegenstelling tot een pure X terminal kan FreeBSD ook applicaties lokaal draaien, wat een verlichting van de centrale server tot gevolg kan hebben. FreeBSD heeft zelfs de mogelijkheid om “schijfloos” op te starten, zodat individuele werkstations nog goedkoper en makkelijker te beheren zijn.
Bureaublad: de beschikbaarheid van geavanceerde bureaubladomgevingen als KDE en GNOME en kantoortoepassingen als tekstverwerkers en spreadsheet-programma's in de ports- en pakketcollectie maken van FreeBSD een uitgebreid desktop-platform. Thuis en op het werk zorgt FreeBSD ervoor dat er snel, efficiënt en veilig gewerkt kan worden!
Software Ontwikkeling: bij het standaard FreeBSD-systeem zit al een volledige verzameling van ontwikkelgereedschappen, inclusief de bekende GNU C/C++ compiler en debugger.
FreeBSD is beschikbaar in zowel broncode als binaire vorm op CD-ROM, DVD en via FTP. In Bijlage A staat meer informatie over het verkrijgen van FreeBSD.
FreeBSD wordt gebruikt als platform voor apparaten en producten van vele van 's werelds grootste IT-bedrijven, waaronder:
FreeBSD wordt ook gebruikt om sommige van de grootste sites op het Internet te draaien, waaronder:
en nog veel meer sites.
Deze paragraaf geeft wat meer achtergrondinformatie over het project, inclusief een korte geschiedenis, projectdoelen, en het ontwikkelmodel van het project.
Het FreeBSD Project zag het licht in het begin van 1993, gedeeltelijk als een voortzetting van de “Unofficial 386BSD Patchkit” door de 3 laatste coördinatoren van de patchkit: Nate Williams, Rod Grimes en ikzelf.
Het oorspronkelijke doel was om een zogenaamde 'snapshot'-uitgave te maken van 386BSD, om zo een aantal problemen op te lossen die niet op te lossen waren met het patchkit-mechanisme dat eerder gebruikt was. Sommigen kunnen zich misschien nog herinneren dat de werktitel van het project in het begin nog “386BSD 0.5” of “386BSD Interim” was, refererend aan het oorspronkelijke doel.
386BSD was het besturingssysteem van Bill Jolitz en had tot op dat moment geleden onder het feit dat er al bijna een jaar niet naar omgekeken was. Terwijl de patchkit steeds groter en onhandiger werd, was een groep mensen het er over eens dat er iets moest gebeuren en beslisten om Bill te assisteren bij het maken van een tussentijdse “cleanup”-snapshot. Deze plannen kwamen echter tot een plotseling einde toen Bill Jolitz besliste om zijn toestemming voor het project in te trekken, zonder dat er een alternatief werd geboden.
Het duurde niet lang om te beslissen dat het doel nog steeds belangrijk was, zelfs zonder de ondersteuning van Bill, dus werd de naam “FreeBSD” aangenomen, naar een idee van David Greenman. De oorspronkelijke doelen werden opgesteld na het raadplegen van de gebruikers van het systeem. Toen het erop begon te lijken dat dit project misschien wel snel realiteit kon worden, werd contact opgenomen met Walnut Creek CD-ROM vanuit het oogpunt om de distributiekanalen van FreeBSD te verbeteren voor diegenen die geen toegang hadden tot Internet. Walnut Creek CD-ROM ondersteunde niet alleen het idee om FreeBSD op CD-ROM te distribueren, maar bood het project ook een systeem en een snelle Internetverbinding om mee te werken. Zonder Walnut Creek CD-ROM's bijna onbeperkte vertrouwen in wat op dat moment nog een compleet onbekend project was, is het onwaarschijnlijk dat FreeBSD zo ver gekomen zou zijn, en zo snel, als het vandaag de dag is.
De eerste CD-ROM (en algemene op het net beschikbare) distributie was FreeBSD 1.0, uitgebracht in december 1993. Deze versie was gebaseerd op de 4.3BSD-Lite (“Net/2”) tape van U.C. Berkeley, met veel toevoegingen van 386BSD en de Free Software Foundation. Het werd een redelijk succes voor een eerste aanbod, en werd opgevolgd door de zeer succesvolle FreeBSD 1.1 uitgave in mei 1994.
Rond deze tijd vormde zich nogal onverwacht een stormachtige lucht aan de horizon toen Novell en U.C. Berkeley hun langlopende rechtszaak over de legale status van de Berkeley Net/2 tape oplosten met een schikking. Een voorwaarde van deze schikking was dat U.C. Berkeley toegaf dat grote delen van Net/2 “beladen” code was en het eigendom van Novell, die deze code op haar beurt overgenomen had van AT&T enige tijd hiervoor. Wat Berkeley hiervoor terugkreeg was Novell's “zegen” over de 4.4BSD-Lite uitgave; wanneer deze uitkwam zou Novell verklaren dat geen van de code hierin eigendom van Novell was, en bestaande Net/2 gebruikers zou sterk aanbevolen worden om over te stappen naar deze nieuwe versie. Dit gold ook voor FreeBSD en het project werd de tijd gegeven tot juli 1994 om te stoppen met het distribueren van het eigen op Net/2-gebaseerde product. De schikking liet wel toe dat nog een laatste uitgave werd uitgebracht voor de deadline en dat was FreeBSD 1.1.5.1.
FreeBSD nam toen de enorme taak op zich om zichzelf letterlijk opnieuw uit te vinden, met als basis een volledig nieuwe en nogal incomplete verzameling van delen van 4.4BSD-Lite. De “Lite” uitgaven werden zo genoemd omdat Berkeley's CSRG grote delen code die nodig waren om een werkend systeem te construeren had weggelaten (om allerlei legale redenen) en omdat de Intel port van 4.4 grotendeels incompleet was. Het kostte het project tot november 1994 om deze overstap te maken. Op dat moment werd FreeBSD 2.0 op het net en op CD-ROM (aan het einde van december) uitgebracht. Ondanks het feit dat deze uitgave nog wat ruige kanten had, werd het een groot succes en werd het gevolgd door de robuustere en makkelijker te installeren FreeBSD 2.0.5 in juni 1995.
In augustus 1996 is FreeBSD 2.1.5 uitgebracht en deze bleek populair genoeg bij Internet service providers (ISP's) en andere commerciële gebruikers van FreeBSD om nog een uitgave van de 2.1-STABLE tak te rechtvaardigen. Dit was FreeBSD 2.1.7.1, uitgebracht in februari 1997. Deze uitgave markeerde het einde van de hoofdstroomontwikkeling op 2.1-STABLE; alleen beveilingsupdates en andere kritieke bugfixes werden nog op deze tak uitgevoerd (RELENG_2_1_0).
FreeBSD 2.2 werd afgesplitst van de ontwikkelingstak (“-CURRENT”) in november 1996 als RELENG_2_2 en de eerste volledige uitgave (2.2.1) werd uitgebracht in april 1997. Andere uitgaven van de 2.2 tak werden uitgebracht in de zomer en herfst van '97. De laatste (2.2.8) verscheen in november 1998. De eerste officiële 3.0 uitgave verscheen in oktober 1998 en was het begin van het einde voor de 2.2 tak.
Er was opnieuw een afsplitsing op 20 januari 1999, wat leidde tot de 4.0-CURRENT en 3.X-STABLE takken. Vanuit 3.X-STABLE werd versie 3.1 uitgebracht op 15 februari 1999, 3.2 op 15 mei 1999, 3.3 op 16 september 1999, 3.4 op 20 december 1999 en 3.5 op 24 juni 2000. De laatste werd enkele dagen later gevolgd door een puntuitgave-update naar 3.5.1, om enkele net-ontdekte beveiligingsfouten in Kerberos te corrigeren. Dit was de laatste uitgave van de 3.X tak.
Een nieuwe tak werd gemaakt op 13 maart 2000, de 4.X-STABLE tak. Er zijn verschillende uitgaven van deze tak gemaakt: 4.0-RELEASE werd geïntroduceerd in maart 2000, en de laatste 4.11-RELEASE verscheen in januari 2005.
De langverwachte 5.0-RELEASE werd aangekondigd op 19 januari 2003. Dit resultaat van bijna drie jaar werk zette FreeBSD stevig neer op de weg naar geavanceerde multiprocessor- en threading-ondersteuning en introduceerde nieuwe FreeBSD ports voor de UltraSPARC en ia64 architecturen. Deze uitgave werd gevolgd door 5.1 in juni 2003. De laatste 5.X uitgave uit de -CURRENT-tak was 5.2.1-RELEASE uit februari 2004.
De RELENG_5 tak is gemaakt in augustus 2004 en werd gevolgd door 5.3-RELEASE, die het begin van de 5-STABLE tak markeert. De meest recente 5.5-RELEASE is uitgekomen in mei 2006. Er staan geen nieuwe versies gepland voor de RELENG_5 tak.
De RELENG_6 tak is gemaakt in juli 2005, de eerste uitgave van de 6.X tak werd vrijgegeven in november 2005. De meest recente 6.4-RELEASE kwam uit in november 2008. Er zullen geen verdere uitgaven komen van de RELENG_6 tak. Deze tak is de laatste tak waarin ondersteuning zit voor de Alpha architectuur.
De RELENG_7 tak is gemaakt in oktober 2007. De eerste uitgave van deze tak is 7.0-RELEASE, welke is uitgekomen in februari 2008. De meest recente 7.4-RELEASE kwam uit in februari 2011. Er zullen geen andere uitgaven van de RELENG_7 tak uitkomen.
De RELENG_8 tak is gemaakt in augustus 2009. De eerste uitgave van de 8.X tak is 8.0-RELEASE, vrijgegeven in november 2009. De meest recente uitgave 8.3-RELEASE kwam uit in April 2012. Er zullen nog andere uitgaven van de RELENG_8 tak uitkomen.
De RELENG_9 tak is gemaakt in september 2011. De eerste uitgave van deze tak was 9.0-RELEASE, vrijgegeven in January 2012. Er zullen nog andere uitgaven van de RELENG_9 tak uitkomen.
Op dit moment vinden lange-termijn ontwikkelprojecten plaats in de 10.X-CURRENT tak, en snapshot uitgaven van 10.X op CD-ROM (en natuurlijk op het Net) worden continu beschikbaar gemaakt op de snapshot server.
Het doel van het FreeBSD Project is om software aan te bieden die gebruikt kan worden voor iedere mogelijke toepassing, zonder beperkingen. Vele ontwikkelaars hebben een belangrijke investering in de code (en het project) zitten en vinden het niet erg om af en toe een financiële compensatie te ontvangen, maar dat is zeker geen voorwaarde. De ontwikkelaars van FreeBSD geloven dat de eerste en belangrijkste “missie” het aanbieden van code is, aan iedereen die het wil hebben, voor wat voor doel dan ook, zodat de code zo breed mogelijk gebruikt kan worden tot voordeel van zoveel mogelijk mensen. Dit is een van de meest fundamentele doelen van Vrije Software dat FreeBSD enthousiast ondersteunt.
Sommige code in FreeBSD valt onder de GNU General Public License (GPL) of Library General Public License (LGPL). Deze code heeft iets meer beperkingen, maar in ieder geval aan de kant waarbij vrije toegang tot de code geforceerd wordt, in plaats van het gebruikelijke tegenovergestelde hiervan. Door de toegevoegde moeilijkheden die kunnen voortkomen uit het commerciële gebruik van GPL software geeft het FreeBSD Project echter de voorkeur aan het meer vrije BSD copyright, wanneer er een redelijk alternatief voor handen is.
De ontwikkeling van FreeBSD is een erg open en flexibel proces en wordt gevormd door de bijdragen van letterlijk honderden mensen over de hele wereld, zoals te zien is in de lijst van medewerkers. De infrastructuur die wordt gebruikt voor de ontwikkeling van FreeBSD zorgt ervoor dat deze honderden ontwikkelaars kunnen samenwerken over het Internet. Het FreeBSD Project is continu op zoek naar nieuwe ontwikkelaars en ideeën. Om bij te dragen aan de ontwikkeling van FreeBSD is een mail naar FreeBSD technische discussie mailinglijst voldoende. De FreeBSD aankondigingen mailinglijst is beschikbaar om mededelingen te doen aan andere FreeBSD-gebruikers over grote veranderingen.
Een aantal dingen over het FreeBSD Project en haar ontwikkelingsproces zijn handig om te weten, of een bijdrage nu onafhankelijk of in samenwerking met anderen komt:
Gedurende een aantal jaren werd de centrale broncode voor FreeBSD bijgehouden door CVS (Concurrent Versions System), een vrij verkrijgbaar pakket voor het onderhouden van broncode dat bij FreeBSD zit. In juni 2008 is het Project SVN (Subversion) gaan gebruiken. Deze overgang werd nodig geacht omdat de technische beperkingen die door CVS worden opgelegd duidelijk werden wegens de snelle uitbreiding van de broncode en de hoeveelheid geschiedenis die reeds is opgeslagen. Hoewel het hoofdarchief nu SVN gebruikt, blijven cliëntgereedschappen zoals csup die van de oudere CVS-infrastructuur afhankelijk zijn normaal werken -- veranderingen in het SVN-archief worden voor dit doel teruggeplaatst naar CVS. Momenteel wordt alleen de centrale broncode beheerst door SVN. De documentatie, World Wide Web, en Ports-archieven gebruiken nog steeds CVS. Het primaire archief staat op een systeem in Santa Clara, Californië, in de VS, waar het wordt gesynchroniseerd met verschillende “mirrors” over de hele wereld. De boomstructuur van SVN , waarin de broncode voor -CURRENT en -STABLE is te vinden, kan ook makkelijk met die op een eigen systeem gesynchroniseerd worden. Synchroniseren van broncode bevat meer informatie over dit onderwerp.
De zogenaamde committers zijn alle mensen die schrijf-rechten hebben in het CVS archief van FreeBSD. Deze mensen mogen veranderingen maken aan de FreeBSD broncode (de term “committer” is afkomstig uit het cvs(1) commit commando, wat gebruikt wordt om veranderingen door te voeren in het CVS-archief). De beste manier om eigen bijdragen te laten keuren door een van de committers is door gebruik te maken van send-pr(1). Als het erop lijkt dat een bijdrage ergens in het systeem blijft hangen, dan is het ook mogelijk om mail te sturen naar de FreeBSD committer's mailinglijst.
Het FreeBSD core team zou het equivalent zijn van een raad van bestuur als het FreeBSD Project een bedrijf zou zijn. De primaire taak van het core team is ervoor zorg te dragen dat het project, in zijn geheel, in goede vorm verkeert en de goede richting opgaat. Toegewijde en verantwoordelijke ontwikkelaars uitnodigen om deel te worden van de committers is één van de taken van het core team, net als het rekruteren van nieuwe leden van het core team. Het huidige core team is gekozen door de committers uit een groep van kandidaten (ook allen committers) in juli 2010. Elke twee jaar worden verkiezingen gehouden.
Sommige leden van het core team hebben een bijzondere verantwoordelijkheid, wat wil zeggen dat zij er speciaal op toezien dat een bepaald deel van het systeem werkt zoals het hoort. In de lijst van medewerkers staat een complete lijst van ontwikkelaars en hun verantwoordelijkheden.
Opmerking: De meeste leden van het core team zijn vrijwilligers. “Toewijding” betekent dus niet “gegarandeerde ondersteuning”. De “raad van bestuur”-analogie hierboven klopt niet helemaal en het is misschien beter om te zeggen dat dit de mensen zijn die hun leven opgaven voor FreeBSD, tegen beter weten in!
De grootste groep ontwikkelaars zijn de gebruikers zelf, die FreeBSD continu voorzien van constructief commentaar en oplossingen voor fouten. De handigste manier om contact te houden met het niet-gecentraliseerde deel van de ontwikkeling van FreeBSD is een abonnement nemen op de FreeBSD technische discussie mailinglijst, waar allerlei bijdragen, patches en nieuwe ideeën worden bediscussieerd. In Bijlage C is meer informatie te vinden over de verschillende FreeBSD mailinglijsten.
De lijst van medewerkers is lang en groeit iedere dag, dus wat let de lezer om zelf een bijdrage te doen aan FreeBSD?
Programmeren is niet de enige manier om een bijdrage te leveren aan het project. Een meer volledige lijst van dingen die gedaan moeten worden staat op de FreeBSD website.
Samengevat is het FreeBSD ontwikkelmodel georganiseerd als een onsamenhangende verzameling van concentrische cirkels. Het gecentraliseerde model is ontworpen voor het gemak van de gebruikers van FreeBSD, die op deze manier makkelijk de wijzigingen in het project kunnen volgen. Niet om potentiële medewerkers buiten de deur te houden! Het is wenselijk om een stabiel besturingssysteem te maken, met een grote verzameling samenhangende applicaties. Dit model heeft zijn waarde op dat gebied bewezen.
Om bij te dragen en samen FreeBSD verder te ontwikkelen, is het enige wat het FreeBSD Project vraagt dat te doen met dezelfde toewijding als de huidige ontwikkelaars: succes gegarandeerd!
FreeBSD is een open source, op 4.4BSD-Lite gebaseerd besturingssysteem voor Intel (x86 en Itanium), AMD64, n Sun UltraSPARC computers. Het is grotendeels gebaseerd op software van de Computer Systems Research Group (CSRG) van de University of California in Berkeley (U.C. Berkeley), met verbeteringen overgenomen van NetBSD, OpenBSD, 386BSD en de Free Software Foundation.
Sinds het uitbrengen van FreeBSD 2.0 tegen het einde van 1994, zijn de prestaties, mogelijkheden en stabiliteit van FreeBSD dramatisch verbeterd. FreeBSD heeft namelijk de beschikking over een compleet nieuw subsysteem voor virtueel geheugen, dat niet alleen de prestaties ten goede komt, maar er ook voor zorgt dat het systeem minder geheugen gebruikt dan ooit tevoren. Andere belangrijke verbeteringen zijn de ondersteuning van veel nieuwe hardware, een compleet nieuw systeem voor de ondersteuning van machines met meerdere processoren (SMP) en een nieuwe bibliotheek voor de ondersteuning van multithreading in applicaties.
Behalve de basisdistributie van het besturingssysteem, biedt FreeBSD ook een enorme softwarecollectie met duizenden veelgebruikte programma's, de zogenaamde ports. Op het moment van schrijven zijn er al meer dan 23,000 ports! In de ports zitten alle mogelijke klassen van software die te bedenken zijn, van HTTP-servers tot spellen, van kantoorapplicaties tot multimedia en alles wat er tussenin zit. De complete Portscollectie beslaat zo'n 500 MB aan schijfruimte. Meer informatie over de ports en over de pakketten is te vinden in Hoofdstuk 5.
Alle recente versies van FreeBSD bieden een optie aan in de installer (ofwel sysinstall(8) ofwel bsdinstall(8)) om aanvullende documentatie te installeren onder /usr/local/share/doc/freebsd tijdens de eerste installatie van het systeem. De documentatie kan ook op elk later tijdstip worden geïnstalleerd door pakketten te gebruiken zoals beschreven in Paragraaf 25.4.6.2. De lokaal geïnstalleerde documentatie kan in een browser bekeken worden door de volgende URLs te gebruiken:
De nieuwste versies van deze documenten zijn altijd te vinden op http://www.FreeBSD.org/.
FreeBSD heeft een tekstgebaseerd, gebruikersvriendelijk installatieprogramma. FreeBSD 9.0-RELEASE en later gebruiken het installatieprogramma bsdinstall, uitgaven eerder dan 9.0-RELEASE gebruiken sysinstall voor de installatie. Dit hoofdstuk beschrijft het gebruikt van sysinstall om FreeBSD te installeren. Het gebruik van bsdinstall wordt behandeld in Hoofdstuk 3.
Na het lezen van dit hoofdstuk weet de lezer:
Hoe FreeBSD installatieschijven gemaakt kunnen worden;
Hoe FreeBSD harde schijven benoemt en onderverdeelt;
Hoe sysinstall gestart kan worden;
Welke vragen sysinstall stelt, wat ze betekenen en hoe er geantwoord kan worden.
Veronderstelde voorkennis:
De ondersteunde hardwarelijst doornemen van de versie van FreeBSD die geïnstalleerd gaat worden op aanwezigheid van de beschikbare hardware.
Opmerking: In zijn algemeenheid zijn deze installatie-instructies geschreven voor computers met een i386™ architectuur (“PC compatible”). Waar van toepassing worden instructies voor andere platformen gegeven. Deze handleiding is zoveel mogelijk bijgewerkt, maar toch kunnen er verschillen optreden tussen de installatieprocedure en deze tekst. Er wordt aangeraden dit hoofdstuk te beschouwen als een algemene richtlijn en niet als een letterlijke handleiding voor installatie.
De minimale configuratie om FreeBSD te installeren varieert met de versie van FreeBSD en de hardware-architectuur.
Een samenvatting van deze informatie wordt in de volgende secties gegeven. Afhankelijk van de methode die u kiest om FreeBSD te installeren, heeft u misschien ook een floppydrive, een ondersteunde CDROM drive, en in sommige gevallen een netwerkadapter nodig. Dit zal worden behandeld door het Paragraaf 2.3.7.
Zowel FreeBSD/i386 en FreeBSD/pc98 hebben een 486 of betere processor en tenminste 24 MB aan RAM nodig. U zult tenminste 150 MB aan vrije hardeschijfruimte nodig hebben voor de meest minimale installatie.
Opmerking: In het geval van oude configuraties is het verkrijgen van meer RAM en meer hardeschijfruimte meestal belangrijker dan het verkrijgen van een snellere processor.
Er zijn twee klassen processoren die FreeBSD/amd64 kunnen draaien. De eerste zijn AMD64 processoren, inclusief de AMD Athlon™64, AMD Athlon64-FX, AMD Opteron™ of betere processoren.
De tweede klasse van processoren die FreeBSD/amd64 kan gebruiken omvat degenen die de Intel® EM64T architectuur gebruiken. Voorbeelden van deze processoren omvatten de Intel Core™ 2 Duo, Quad, en Extreme processorfamilies en de Intel Xeon™ 3000, 5000, en 7000 rijen van processoren.
Indien u een machine heeft die gebaseerd is op een nVidia nForce3 Pro-150, moet u de BIOS-setup gebruiken om IO APIC uit te zetten. Indien u geen optie heeft om dit te doen, moet u waarschijnlijk in plaats hiervan ACPI uitzetten. Er zitten bugs in de Pro-150 chipset waarvoor we nog geen oplossing hebben gevonden.
Om FreeBSD/sparc64 te installeren heeft u een ondersteund platform nodig (zie Paragraaf 2.2.2).
U heeft een toegewijde schijf nodig voor FreeBSD/sparc64. Het is momenteel niet mogelijk om een schijf met een ander besturingssysteem te delen.
Een lijst van ondersteunde hardware wordt geleverd bij elke uitgave van FreeBSD in de FreeBSD Hardware Notes. Dit document kan normaliter worden gevonden in een bestand genaamd HARDWARE.TXT, in de bovenste map van een CDROM- of FTP-distributie of in het documentatiemenu van sysinstall. Het somt, voor een gegeven architectuur, op welke hardware-apparaten door welke uitgave van FreeBSD worden ondersteund. Kopiën van de lijst van ondersteunde hardware voor verschillende uitgaven en architecturen kunnen ook gevonden worden op de Uitgave Informatie pagina van de FreeBSD website.
Probeer een computer te inventariseren voordat FreeBSD wordt geïnstalleerd. De FreeBSD installatieroutines geven een overzicht van alle componenten (harde schijven, netwerkkaarten, CD-ROM-spelers, enzovoort) met hun typenummer en fabrikant. FreeBSD probeert ook de juiste instellingen te achterhalen, zoals IRQ en IO-poort gebruik. Vanwege de verscheidenheid aan PC-hardware verloopt dit niet altijd helemaal succesvol en daarom kan het nodig zijn om de gegevens die FreeBSD achterhaalt te verbeteren.
Mocht er al een ander besturingssysteem geïnstalleerd zijn, zoals Windows of Linux, dan is het aan te raden de mogelijkheden van dat besturingssysteem te gebruiken om te achterhalen hoe hardware is ingesteld. Als niet volledig bekend is welke instellingen een uitbreidingskaart heeft, dan kan het zijn dat ze op de kaart zelf zijn afgedrukt. Veelvoorkomende IRQ nummers zijn 3, 5 en 7 en IO-poort adressen zijn meestal geschreven als hexadecimale getallen, zoals 0x330.
Er wordt aangeraden deze informatie af te drukken of op te schrijven voordat FreeBSD wordt geïnstalleerd. Het kan handig zijn om een tabel te maken, zoals deze:
Tabel 2-1. Voorbeeld van beschrijving van componenten
| Component | IRQ | IO-poort(en) | Opmerkingen |
|---|---|---|---|
| Eerste harde schijf | N/A | N/A | 40 GB, Seagate, eerste IDE master |
| CD-ROM | N/A | N/A | Eerste IDE slave |
| Tweede harde schijf | N/A | N/A | 20 GB, IBM, tweede IDE master |
| Eerste IDE controller | 14 | 0x1f0 | |
| Netwerkkaart | N/A | N/A | Intel 10/100 |
| Modem | N/A | N/A | 3Com® 56K faxmodem, op COM1 |
| ... |
Nadat de inventarisatie van de componenten in uw computer voltooid is, dient u te controleren of ze aan de hardware-eisen van de uitgave van FreeBSD die u wilt installeren voldoen.
Als de computer waarop FreeBSD geïnstalleerd gaat worden waardevolle gegevens bevat, dan dient er een back-up te zijn en dient deze back-up getest te zijn voordat FreeBSD wordt geïnstalleerd. De FreeBSD installatieprocedure vraagt om bevestiging voordat er naar de schijven geschreven wordt, maar als dat eenmaal is begonnen kan het niet meer teruggedraaid worden.
Als de hele harde schijf voor FreeBSD beschikbaar is, dan hoeft op dit punt verder niets gedaan te worden. Ga verder naar de volgende sectie.
Als FreeBSD echter naast een ander besturingssysteem op een computer komt, dan moet basaal bekend zijn hoe gegevens op schrijven worden opgeslagen en wat dat voor consequenties heeft.
Een PC schijf kan worden onderverdeeld in aparte stukken. Deze stukken heten partities. Aangezien FreeBSD intern ook partities heeft, kan de naamgeving snel verwarrend worden, daarom wordt naar deze schijfstukken verwezen als schijfsnedes of simpelweg snedes (slices) in FreeBSD zelf. Het FreeBSD gereedschap fdisk bijvoorbeeld, dat met PC diskpartities werkt, verwijst naar snedes in plaats van partities. In het ontwerp van de PC is opgenomen dat een schijf slechts vier partities kan bevatten. Deze partities heten de primaire partities. Om deze beperking te omzeilen is een nieuwe soort partitie bedacht, de extended partitie. Een schijf kan slechts één extended partitie bevatten. Binnen een extended partitie kunnen speciale partities, genaamd logische partities, worden aangemaakt.
Elke partitie heeft een partitie-ID, een getal dat aangeeft welk soort gegevens er op die partitie staan. FreeBSD-partities hebben partitie-ID 165.
In zijn algemeenheid benoemt elk besturingssysteem partities op zijn eigen manier. Bijvoorbeeld: MS-DOS en zijn afgeleiden, zoals Windows, geven elke primaire en logische partitie een (station) letter, beginnend met C:.
FreeBSD moet geïnstalleerd worden op een primaire partitie. FreeBSD kan al zijn gegevens, inclusief alle bestanden die zelf zijn gemaakt, op deze partitie opslaan. Als er meerdere schijven zijn, dan kunnen er FreeBSD-partities worden aangemaakt op alle of op sommige schijven. Als FreeBSD wordt geïnstalleerd moet er een partitie beschikbaar zijn. Dit kan een lege partitie zijn die is aangemaakt of het mag een bestaande partitie zijn met gegevens die niet langer bewaard hoeven te blijven.
Als alle partities op alle schijven gebruikt worden, dan moet er een leeg gemaakt worden voor FreeBSD met de hulpprogramma's van het andere besturingssysteem dat wordt gebruikt (bijvoorbeeld fdisk onder MS-DOS of Windows).
Als er een partitie over is, dan kan die gebruikt worden. Het kan zo zijn dat één of meer van de bestaande partities verkleind moet worden.
Een minimale installatie van FreeBSD heeft 100 MB schijfruimte nodig. Dat is wel een zeer minimale installatie, waarop bijna geen ruimte over is voor eigen bestanden. Een meer realistisch minimum is 250 MB zonder grafische gebruikersomgeving en 350 MB of meer als er ook een grafische gebruikersomgeving moet draaien. Als er ook nog gebruikt gemaakt wordt van een heleboel programma's van derde partijen dan is nog meer ruimte nodig.
Met commerciële software zoals PartitionMagic®, of gratis software zoals GPartEd, kunnen partities van grootte gewijzigd worden om ruimte te maken voor FreeBSD. Van zowel PartitionMagic als GPartEd is bekend dat ze met NTFS kunnen werken. GPartEd is beschikbaar op een aantal Live CD Linux-distributies, zoals SystemRescueCD.
Er zijn problemen gemeld met het veranderen van de grootte van Microsoft Vista-partities. Het beschikbaar hebben van een Vista installatie-CDROM tijdens het pogen van zo'n bewerking is aanbevolen. Zoals met al zulke schijfonderhoudtaken is een recente verzameling backups ook sterk aangeraden.
WaarschuwingVerkeerd gebruik van deze programma's kan gegevens van een schijf verwijderen. Er dient een goede, werkende back-up te zijn voordat deze programma's gebruikt worden.
Voorbeeld 2-1. Gebruik van een bestaande, ongewijzigde partitie
Stel er is al een computer met een enkele 4 GB harde schijf waarop een versie van Windows is geïnstalleerd en de schijf is verdeeld in twee schijfstations, C: en D:, van elk 2 GB. Er staat 1 GB aan gegevens op C: en 0.5 GB aan gegevens op D:.
Dit betekent dat de harde schijf twee partities heeft, één voor elke letter. Alle gegevens op D: kunnen gekopieerd worden naar C:, waardoor de tweede partitie beschikbaar komt voor FreeBSD.
Voorbeeld 2-2. Een bestaande partitie verkleinen
Stel er is een computer met een enkele 4 GB harde schijf waarop een versie van Windows is geïnstalleerd. Bij het installeren van Windows is een grote partitie gemaakt, station C: van 4 GB. Er is 1.5 GB in gebruik en voor FreeBSD is 2 GB schijfruimte wenselijk.
Voor een installatie van FreeBSD is één van onderstaande opties de oplossing:
Maak een back-up van de Windows gegevens en installeer Windows opnieuw, waarbij een partitie van 2 GB wordt aanmaakt bij het installeren.
Gebruik één van de bovengenoemde programma's zoals PartitionMagic om de Windows-partitie te verkleinen.
Als bij de installatie van FreeBSD gebruik gemaakt wordt van een netwerk (bijvoorbeeld bij een installatie vanaf een FTP site of een NFS server), dan moeten de netwerkinstellingen bekend zijn. Deze informatie wordt gevraagd tijdens het installeren, zodat FreeBSD contact kan maken met het netwerk om de installatie te voltooien.
Als er contact gemaakt wordt met een Ethernet netwerk of een Internetverbinding met een Ethernet netwerkkaart via de kabel of DSL, dan is de volgende informatie nodig:
IP-adres
IP-adres van de default gateway
Hostnaam
IP-adressen van de DNS server(s)
Subnetmasker
Als deze informatie niet bekend is, dan kan deze meestal nagevraagd worden bij de systeembeheerder of service provider. Het kan zijn dat zij aangeven dat één en ander automatisch wordt toegekend door middel van DHCP. Het is van belang hier een notitie van te maken.
Ook door middel van inbellen bij een Internet service provider met een gewoon modem kan FreeBSD geïnstalleerd worden via Internet, het duurt alleen erg lang.
Dan is nodig:
Het inbelnummer van een ISP
De COM: poort waaraan het modem zit
Gebruikersnaam en wachtwoord bij de ISP
Hoewel het FreeBSD project er naar streeft om elke versie van FreeBSD zo stabiel mogelijk te laten zijn, kan het voorkomen dat er foutjes in het systeem sluipen. Heel af en toe beïnvloeden deze foutjes de installatieprocedure. Als ze ontdekt en opgelost zijn worden ze beschreven in de FreeBSD Errata op de FreeBSD website. Het is verstandig voor een installatie te controleren of er errata zijn om er zeker van te zijn dat er geen obstakels zijn.
Informatie over alle uitgaven, inclusief de errata staan in de uitgave-informatie op de FreeBSD website.
De FreeBSD installatieprocedure kan FreeBSD installeren vanaf één van de volgende plaatsen:
Lokale media
Cd-rom of DVD
Een USB-geheugenstick
Een MS-DOS partitie op dezelfde computer
SCSI of QIC tape
Diskettestation
Netwerk
FTP site, indien noodzakelijk door een firewall of via een HTTP proxy
NFS server
Parallelle of seriële verbinding
Als FreeBSD gekocht is op CD of DVD dan is alles wat nodig is aanwezig om door te gaan naar Paragraaf 2.3.7.
Als de installatiebestanden nog niet beschikbaar zijn wordt in Paragraaf 2.13 uitgelegd hoe de installatie via bovenstaande methoden voorbereid kan worden. Nadat de installatiebestanden beschikbaar zijn kunnen de voorbereidingen voor de installatie verdergaan in Paragraaf 2.3.7.
De FreeBSD installatieprocedure begint met het opstarten van een computer met het FreeBSD installatieprogramma. Dit programma wordt niet uitgevoerd vanuit een ander besturingssysteem. Normaliter start een computer op met het besturingssysteem dat is geïnstalleerd op een harde schijf, maar hij kan ook ingesteld worden om op te starten van een “bootable” diskette. De meeste hedendaagse computers kunnen ook opstarten van een CD-ROM in het CD-ROM station of van een USB-schijf.
Tip: Als FreeBSD op CD-ROM of DVD beschikbaar is (gekocht of zelf gebrand) en een computer kan opstarten van een CD-ROM of DVD (meestal een BIOS optie genaamd “Boot Order” of iets dergelijks), dan is het doorwerken van deze sectie niet nodig. De FreeBSD CD-ROM en DVD images zijn bootable en kunnen zonder verdere voorbereidingen gebruikt worden om FreeBSD te installeren.
Om een opstartbare geheugenstick te maken kunnen deze stappen gevolgd worden:
Bemachtig een image voor de geheugenstick
Images voor de geheugenstick voor FreeBSD 8.X en ouder kunnen worden gedownload vanuit de map ISO-IMAGES van ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/arch/ISO-IMAGES/versie/FreeBSD-versie-RELEASE-arch-memstick.img. Vervang arch en versie door de architectuur en de versie die u wilt installeren. De geheugenstick-images voor FreeBSD/i386 8.3-RELEASE zijn beschikbaar op ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/ISO-IMAGES/8.3/FreeBSD-8.3-RELEASE-i386-memstick.img.
Tip: Voor FreeBSD 9.0-RELEASE en nieuwere uitgaven wordt een ander pad voor de mappen gebruikt. Details over het downloaden en installeren van FreeBSD 9.0-RELEASE enn later wordt behandeld in Hoofdstuk 3.
Het beeldbestand van de geheugenstick heeft een extensie .img. De map ISO-IMAGES bevat een aantal verschillende images, en degene die u nodig heeft zal afhangen van de FreeBSD-versie die u installeert, en in sommige gevallen van de hardware waarop u het installeert.
Belangrijk: Maak voordat u verder gaat een backup van de gegevens die nu op uw USB-stick staan, aangezien deze procedure ze zal wissen.
Schrijf het beeldbestand naar de geheugenstick
FreeBSD gebruiken om het beeldbestand te schrijven
WaarschuwingHet onderstaande voorbeeld vermeldt /dev/da0 als het doelapparaat van waar af u zal opstarten. Zorg er voor dat u het juiste apparaat als het uitvoerapparaat opgeeft om te voorkomen dat u uw bestaande gegevens vernietigt.
Het beeldbestand schrijven door middel van dd(1)
Het .img-bestand is geen gewoon bestand dat u naar de geheugenstick kopieert. Het is een afbeelding van de complete inhoud van de stick. Dit betekent dat u de bestanden niet op de gewone manier van de ene schijf naar de andere kan kopieëren. U dient in plaats hiervan dd(1) gebruiken om de afbeelding direct naar de schijf te schrijven:
# dd if=FreeBSD-8.3-RELEASE-i386-memstick.img of=/dev/da0 bs=64k
Als een Operation not permitted wordt weergegeven, controleer dan dat het apparaat niet in gebruik is en is aangekoppeld, eventueel automatisch door een gereedschap met goede intenties. Probeer het vervolgens opnieuw.
Windows® gebruiken om het beeldbestand te schrijven
Zorg ervoor dat de juiste schijf letter gebruikt wordt als doelschijf, anders kan het voorkomen dat er bestaande data wordt overschreven.
Image Writer for Windows verkrijgen
Image Writer for Windows is een gratis applicatie die een beeld bestand correct naar een geheugen-stick kan schrijven. Download deze van https://launchpad.net/win32-image-writer/ en pak deze uit in een map.
Writing The Image with Image Writer
Dubbelklik op het Win23DiskImager icoon om het programma te starten. Controleer of de schijfletter welke getoond is onder Device de schijf is van de geheugen-stick. Klik op het map icoon en selecteer het bestand welke naar de geheugen-stick geschreven moet worden. Klik op Save om het bestand te accepteren. Controleer of alles correct is en dat er geen bestanden en dergelijke open zijn in andere vensters. Klik als laatste op Write om het bestand te schrijven naar de schijf.
Om opstartdiskettes te maken kunnen de volgende stappen gevolgd worden:
Bemachtig de images voor opstartdiskettes
Belangrijk: Merk op dat met ingang van FreeBSD 8.X floppy-images niet langer beschikbaar zijn. Zie de bovenstaande instructies voor hoe FreeBSD met behulp van een USB-geheugenstick te installeren, of gebruik een CD-ROM of DVD.
De opstartschijven zijn beschikbaar op de installatiemedia in de map floppies/ en kunnen ook gedownload worden uit de map floppies, ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/arch/versie-RELEASE/floppies/. Vervang arch en versie door de architectuur en het versienummer dat geïnstalleerd moet worden. De images voor bootdiskettes voor bijvoorbeeld FreeBSD/i386 8.3-RELEASE zijn beschikbaar op ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/8.3-RELEASE/floppies/.
De diskette-images hebben de extensie .flp. De map floppies/ bevat een aantal images en het hangt af van de gewenste FreeBSD versie, en in sommige gevallen ook van de hardware, welke images nodig zijn. In de meeste gevallen zijn er vier floppies nodig, boot.flp, kern1.flp, kern2.flp, en kern3.flp. In dezelfde map staat README.TXT voor de laatste informatie over de diskette-images.
Belangrijk: Het FTP-programma moet ingesteld staan in binary modus om de disk-images te downloaden. Sommige webbrowsers blijken de text (of ASCII) modus te gebruiken en dan kan er niet van de diskettes opgestart worden.
Maak de diskettes aan
Per gedownload image wordt een diskette aangemaakt. Vanzelfsprekend moeten deze diskettes vrij zijn van fouten. Het gemakkelijkst is dit te testen door de diskettes te formatteren. Vanaf de fabriek geformatteerde floppies kunnen niet vertrouwd worden. Het programma format in Windows meldt niet of er bad blocks zijn, het markeert ze gewoon als “bad” en negeert ze. Het wordt geadviseerd schone, nieuwe floppies te gebruiken als op deze manier wordt geïnstalleerd.
Belangrijk: Als bij het installeren van FreeBSD het installatieprogramma vastloopt, blijft hangen of zich op een andere manier vreemd gedraagt, dan ligt dat meestal aan de floppies. Probeer dan de diskette-images op nieuwe schijven te schrijven en probeer het opnieuw.
Schrijf de imagebestanden op diskettes
De .flp-bestanden zijn geen gewone bestanden die naar een diskette te kopiëren zijn. Het zijn images van de complete inhoud van een diskette. Dit betekent dat ze niet eenvoudigweg gekopieerd kunnen worden van de ene schijf naar de andere. In plaats daarvan moet speciale software gebruikt worden om de images rechtstreeks op de diskettes te schrijven.
Als de diskettes aanmaakt worden op een computer met MS-DOS / Windows, dan levert het FreeBSD project de software fdimage.
Als de floppies van de CD-ROM worden gebruikt en het CD-ROM station is E:, dan kan dit als volgt:
E:\> tools\fdimage floppies\boot.flp A:
Herhaal dit commando voor elk .flp-bestand, waarbij steeds een nieuwe diskette wordt gebruikt. Merk elke diskette met de naam van het bestand dat erop wordt gekopieerd. Pas de opdrachtregel steeds aan, afhankelijk van waar de .flp-bestanden staan. Als er geen CD-ROM beschikbaar is dan kan fdimage gedownload worden vanuit de map tools op de FreeBSD FTP site.
Als de diskettes worden aanmaakt op een UNIX systeem (zoals een ander FreeBSD systeem) dan kan dd(1) gebruikt worden om de imagebestanden naar diskette te kopiëren. Onder FreeBSD:
# dd if=boot.flp of=/dev/fd0
Onder FreeBSD verwijst /dev/fd0 naar het eerste diskettestation (de A:-schijf). /dev/fd1 zou de B:-schijf zijn enzovoorts. Andere UNIX-varianten kunnen andere namen hebben voor de diskettestations. Meer informatie staat in de documentatie van ieder systeem .
Het installeren van FreeBSD kan nu beginnen.
Belangrijk: De installatie maakt geen wijzigingen op schijven totdat het volgende bericht verschijnt:
Last Chance: Are you SURE you want continue the installation? If you're running this on a disk with data you wish to save then WE STRONGLY ENCOURAGE YOU TO MAKE PROPER BACKUPS before proceeding! We can take no responsibility for lost disk contents!De installatie kan worden beëindigd op elk moment voor deze laatste waarschuwing zonder dat de inhoud van harde schijven wordt gewijzigd. Als de angst bestaat dat er iets verkeerd is ingesteld, dan kan op dat moment gewoon de computer uitgezet worden zonder dat er schade optreedt.
Begin met een computer die uit staat.
Zet de computer aan. Als hij aangaat laat hij een optie zien om het systeeminstelmenu, of BIOS, te bereiken, gewoonlijk via F2, F10, Del, of Alt+S. Gebruik de toets die op het scherm wordt aangegeven. In sommige gevallen laat de computer een plaatje zien terwijl hij opstart. Gewoonlijk verdwijnt dit plaatje door het intypen van Esc zodat eventuele verborgen berichten zichtbaar worden.
Zoek de instelling die bepaalt vanaf welk medium de computer opstart. Dit wordt meestal aangeduid met “Boot Order” en laat een lijst met media zien, zoals Floppy, CD-ROM, eerste harde schijf, enzovoorts.
Als u van de CD-ROM opstart, zorg er dan voor dat de CD-ROM geselecteerd is. Als wordt opstart van een USB-schijf of een diskette, stel dat dan in. Raadpleeg in geval van twijfel de documentatie van de computer en/of het moederbord.
Maak de instellingen, bewaar de veranderingen en sluit het instelprogramma af. De computer moet dan opnieuw starten.
Als u een “opstartbare” USB-stick heeft klaargemaakt zoals beschreven in Paragraaf 2.3.7, steek dan de USB-stick in voordat u de computer aanzet.
Bij opstarten vanaf CD moet na het aanzetten van de computer zo snel mogelijk de CD-ROM ingestoken worden.
Opmerking: Voor FreeBSD 7.X zijn installatiediskettes beschikbaar en ze kunnen worden klaargemaakt zoals beschreven in Paragraaf 2.3.7. Eén van deze is de eerste opstartschijf: boot.flp. Plaats deze schijf in uw diskettestation en start de computer op.
Als de computer opstart zoals altijd en met het huidige besturingssysteem begint, dan kan dat om de volgende redenen zijn:
De opstartschijven waren niet vroeg genoeg in de computer gedaan om ervan op te starten. Laat ze er dan inzitten en probeer de computer te herstarten.
De gemaakte wijzigingen in de BIOS zijn niet goed doorgekomen. Doe dat dan nog een keer totdat de juiste instelling gevonden is.
De BIOS ondersteunt het opstarten van het gekozen medium niet.
FreeBSD start nu op. Bij opstarten vanaf CD-ROM is iets als het volgende op het scherm te zien (versie-informatie weggelaten):
Booting from CD-Rom... 645MB medium detected CD Loader 1.2 Building the boot loader arguments Looking up /BOOT/LOADER... Found Relocating the loader and the BTX Starting the BTX loader BTX loader 1.00 BTX version is 1.02 Consoles: internal video/keyboard BIOS CD is cd0 BIOS drive C: is disk0 BIOS drive D: is disk1 BIOS 636kB/261056kB available memory FreeBSD/i386 bootstrap loader, Revision 1.1 Loading /boot/defaults/loader.conf /boot/kernel/kernel text=0x64daa0 data=0xa4e80+0xa9e40 syms=[0x4+0x6cac0+0x4+0x88e9d] \
Bij opstarten vanaf diskette is iets als het volgende op het scherm te zien (versie-informatie weggelaten):
Booting from Floppy... Uncompressing ... done BTX loader 1.00 BTX version is 1.01 Console: internal video/keyboard BIOS drive A: is disk0 BIOS drive C: is disk1 BIOS 639kB/261120kB available memory FreeBSD/i386 bootstrap loader, Revision 1.1 Loading /boot/defaults/loader.conf /kernel text=0x277391 data=0x3268c+0x332a8 | Insert disk labelled "Kernel floppy 1" and press any key...
Volg de instructies op en haal de diskette met boot.flp eruit, stop de diskette met kern1.flp in het station en druk op Enter. Start op vanaf de eerste diskette en geef volgende diskettes in als daarom wordt gevraagd.
Of nu wordt opstart van CD-ROM, USB-stick of diskette, de opstartprocedure komt op een gegeven moment bij het bootloader-menu van FreeBSD:
Wacht 10 seconden of druk op Enter.
De meeste SPARC64®-systemen zijn ingesteld om automatisch vanaf schijf op te starten. Om FreeBSD te installeren dient u over het netwerk of vanaf een CDROM op te starten, waarvoor u in de PROM (OpenFirmware) dient te breken.
Start het systeem opnieuw op, en wacht totdat te opstartboodschappen verschijnen om dit te doen. Het hangt af van het model, maar het zou er ongeveer zo uit moeten zien:
Sun Blade 100 (UltraSPARC-IIe), Keyboard Present Copyright 1998-2001 Sun Microsystems, Inc. All rights reserved. OpenBoot 4.2, 128 MB memory installed, Serial #51090132. Ethernet address 0:3:ba:b:92:d4, Host ID: 830b92d4.
Als uw systeem vanaf hier verder gaat met opstarten vanaf schijf, dient u L1+A of Stop+A op het toetsenbord in te drukken, of een BREAK over de seriële console te versturen (door bijvoorbeeld ~# in tip(1) of cu(1) te gebruiken) om bij de PROM-prompt te komen. Het ziet er als volgt uit:
okok {0}
![]()
Stop hier de CDROM in uw drive, en typ op de PROM-prompt boot cdrom.
De laatste paar honderd regels die op het scherm verschenen zijn bewaard en kunnen bekeken worden.
Druk op Scroll Lock om ze te bekijken. Hiermee wordt de scrollmodus ingeschakeld. Gebruik de pijltjestoetsen en PageUp en PageDown om de resultaten te bekijken. Druk weer op Scroll Lock om de scrollmodus uit te schakelen.
Dit kan nu gedaan worden om de tekst te bekijken die over het scherm rolde terwijl de kernel de hardware onderzocht. Er is tekst te zoals in Figuur 2-2, maar de exacte tekst is anders, afhankelijk van de componenten in een computer.
Figuur 2-2. Voorbeeld resultaten hardware-onderzoek
avail memory = 253050880 (247120K bytes) Preloaded elf kernel "kernel" at 0xc0817000. Preloaded mfs_root "/mfsroot" at 0xc0817084. md0: Preloaded image </mfsroot> 4423680 bytes at 0xc03ddcd4 md1: Malloc disk Using $PIR table, 4 entries at 0xc00fde60 npx0: <math processor> on motherboard npx0: INT 16 interface pcib0: <Host to PCI bridge> on motherboard pci0: <PCI bus> on pcib0 pcib1:<VIA 82C598MVP (Apollo MVP3) PCI-PCI (AGP) bridge> at device 1.0 on pci0 pci1: <PCI bus> on pcib1 pci1: <Matrox MGA G200 AGP graphics accelerator> at 0.0 irq 11 isab0: <VIA 82C586 PCI-ISA bridge> at device 7.0 on pci0 isa0: <iSA bus> on isab0 atapci0: <VIA 82C586 ATA33 controller> port 0xe000-0xe00f at device 7.1 on pci0 ata0: at 0x1f0 irq 14 on atapci0 ata1: at 0x170 irq 15 on atapci0 uhci0 <VIA 83C572 USB controller> port 0xe400-0xe41f irq 10 at device 7.2 on pci 0 usb0: <VIA 83572 USB controller> on uhci0 usb0: USB revision 1.0 uhub0: VIA UHCI root hub, class 9/0, rev 1.00/1.00, addr1 uhub0: 2 ports with 2 removable, self powered pci0: <unknown card> (vendor=0x1106, dev=0x3040) at 7.3 dc0: <ADMtek AN985 10/100BaseTX> port 0xe800-0xe8ff mem 0xdb000000-0xeb0003ff ir q 11 at device 8.0 on pci0 dc0: Ethernet address: 00:04:5a:74:6b:b5 miibus0: <MII bus> on dc0 ukphy0: <Generic IEEE 802.3u media interface> on miibus0 ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto ed0: <NE2000 PCI Ethernet (RealTek 8029)> port 0xec00-0xec1f irq 9 at device 10. 0 on pci0 ed0 address 52:54:05:de:73:1b, type NE2000 (16 bit) isa0: too many dependant configs (8) isa0: unexpected small tag 14 orm0: <Option ROM> at iomem 0xc0000-0xc7fff on isa0 fdc0: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq2 on isa0 fdc0: FIFO enabled, 8 bytes threshold fd0: <1440-KB 3.5'' drive> on fdc0 drive 0 atkbdc0: <Keyboard controller (i8042)> at port 0x60,0x64 on isa0 atkbd0: <AT Keyboard> flags 0x1 irq1 on atkbdc0 kbd0 at atkbd0 psm0: <PS/2 Mouse> irq 12 on atkbdc0 psm0: model Generic PS/@ mouse, device ID 0 vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0 sc0: <System console> at flags 0x100 on isa0 sc0: VGA <16 virtual consoles, flags=0x300> sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0 sio0: type 16550A sio1 at port 0x2f8-0x2ff irq 3 on isa0 sio1: type 16550A ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0 pppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode ppc0: FIFO with 16/16/15 bytes threshold plip0: <PLIP network interface> on ppbus0 ad0: 8063MB <IBM-DHEA-38451> [16383/16/63] at ata0-master UDMA33 acd0: CD-RW <LITE-ON LTR-1210B> at ata1-slave PIO4 Mounting root from ufs:/dev/md0c /stand/sysinstall running as init on vty0
Controleer de resultaten van het hardware-onderzoek nauwgezet om er zeker van te zijn dat FreeBSD alle componenten gevonden heeft die verwacht worden. Als een component niet is gevonden, dan wordt die niet genoemd. Een eigen kernel staat u toe om apparaten te ondersteunen die niet in de GENERIC kernel zitten, zoals geluidskaarten.
Na de procedure voor het opsporen van apparaten Figuur 2-3. Gebruik de pijltoetsen om een land, regio, of groep te kiezen. Druk daarna op Enter, dit stelt gemakkelijk uw land in.
Als u United States als land heeft geselecteerd, dan zal de standaard Amerikaanse toetsenbordindeling worden gebruikt, als een ander land gekozen is, zal het volgende menu worden afgebeeld. Gebruik de pijltoetsen om de juiste toetsenbordindeling te kiezen en druk op Enter.
Nadat het juiste land is gekozen zal sysinstall het hoofd menu tonen.
Het hulpprogramma sysinstall is het installatieprogramma voor FreeBSD. Het is tekstgebaseerd en is onderverdeeld in een aantal menu's en schermen die gebruikt kunnen worden om de installatieprocedure in te stellen en te beheren.
Het menu van sysinstall wordt bestuurd met de pijltjestoetsen, Enter, Tab, Space en andere toetsen. Een gedetailleerde beschrijving van de gebruikte toetsen en wat ze doen is opgenomen in de gebruikersinformatie voor sysinstall.
Selecteer de optie Usage om deze informatie te lezen. Selecteer de knop [Select], zoals in Figuur 2-5, en druk op Enter.
De instructies om het menusysteem te gebruiken worden getoond. Na het lezen kan met Enter het hoofdmenu weer getoond worden.
Kies met de pijltjestoetsen in het hoofdmenu Doc en druk op Enter.
Dit toont het menu Documentation.
Het is belangrijk om de documentatie te lezen.
Selecteer een document met de pijltjestoetsen en druk op Enter om het te bekijken. Na het lezen wordt met Enter teruggekeerd naar het menu Documentation.
Selecteer Exit met de pijltjestoetsen en druk op Enter om het menu Documentation te verlaten.
Kies met de pijltjestoetsen Keymap in het menu en druk op Enter om de toetsenbordinstellingen te wijzigen. Dit is alleen nodig als geen standaard of VS-toetsenbord wordt gebruikt.
Een andere toetsenbordindeling is te kiezen door het menu-item te selecteren met omhoog/omlaag en dan op Space te drukken. Nog een keer Space deselecteert het item. Nadat de keuze is gemaakt kan met de pijltjestoetsen [ OK ] gekozen worden en op Enter gedrukt worden.
In de schermafbeelding wordt maar een deel van de lijst getoond. Selecteer [ Cancel ] door op Tab te drukken. Dan wordt de standaard toetsenbordindeling gebruikt en het programma gaat terug naar het hoofdmenu voor de installatie.
Kies Options en druk op Enter.
De standaardwaarden zijn in orde voor de meeste gebruikers en hoeven meestal niet gewijzigd te worden. De release name hangt af van de versie die geïnstalleerd wordt.
Er staat een beschrijving van het geselecteerde item aan de onderkant van het scherm, geaccentueerd in blauw. Eén van de opties is Use Defaults waarmee opnieuw de beginwaarden worden ingesteld.
Druk op F1 om de helptekst van de diverse opties te bekijken.
Druk op Q om terug te gaan naar het hoofdmenu van de installatie.
De Standard installatie wordt aangeraden voor nieuwe gebruikers van UNIX of FreeBSD. Gebruik de pijltjestoetsen om Standard te selecteren en druk op Enter om de installatie te starten.
Als eerste moet schijfruimte aan FreeBSD worden toegewezen en die ruimte dient gemerkt te worden zodat sysinstall deze kan voorbereiden.Om dit te kunnen doen is kennis nodig over hoe FreeBSD informatie op schijven verwacht aan te treffen.
Voordat FreeBSD op een systeem geïnstalleerd en ingesteld kan worden is er een belangrijk onderwerp waarover kennis nodig is, met name als er meerdere harde schijven zijn.
Op een PC met een BIOS-afhankelijk besturingssysteem zoals MS-DOS en Microsoft Windows, kan het BIOS de normale schijfvolgorde abstraheren en volgt het besturingssysteem die wijzigingen. Dit stelt de gebruiker in staat op te starten van een andere schijf dan de zogenaamde “primary master”. Dit is erg handig voor gebruikers die er achter zijn gekomen dat de gemakkelijkste en goedkoopste manier om een systeembackup te maken het plaatsen van een identieke tweede harde schijf is en het daarop regelmatig kopieëren van de inhoud van de eerste schijf met Ghost® of XCOPY. Als de eerste schijf weigert of aangevallen is door een virus of vervuild is door een fout in het besturingssysteem, dan kan eenvoudig overgeschakeld worden door in het BIOS de twee schijven logisch te wisselen. Dat is als het verwisselen van de kabels, maar dan zonder de systeemkast open te maken.
Duurdere systemen met SCSI controllers hebben vaak BIOS-uitbreidingen die het mogelijk maken SCSI-schijven op soortgelijke wijze in te delen voor maximaal zeven schijven.
Een gebruiker die gewend is hiervan gebruik te maken kan verrast worden als de resultaten met FreeBSD niet overeenkomen met de verwachtingen. FreeBSD maakt geen gebruik van het BIOS en heeft dus geen kennis van “logical BIOS drive mapping”. Dit kan leiden tot verbazingwekkende situaties, met name als de schijven fysiek gelijk zijn in geometrie en ook de data klonen van elkaar zijn.
Bij het gebruik van FreeBSD moet altijd de natuurlijke schijfnummering hersteld worden voordat een installatie wordt gestart en die moet ook zo blijven. Als de schijven gewisseld moeten worden, dan moet dat op de moeilijke manier: maak de systeemkast open en verplaats jumpers en kabels.
Opmerking: Wijzigingen die op dit punt gemaakt worden, worden niet weggeschreven naar de schijf. Als er een fout gemaakt is kan opnieuw begonnen worden door via de menu's sysinstall te verlaten en het nog een keer te proberen of door U te toetsen kan de optie Undo gebruikt worden. Als alles te verwarrend is kan zelfs de computer uitgezet worden.
Na de keuze een standaardinstallatie te beginnen toont sysinstall het volgende bericht:
Message
In the next menu, you will need to set up a DOS-style ("fdisk")
partitioning scheme for your hard disk. If you simply wish to devote
all disk space to FreeBSD (overwriting anything else that might be on
the disk(s) selected) then use the (A)ll command to select the default
partitioning scheme followed by a (Q)uit. If you wish to allocate only
free space to FreeBSD, move to a partition marked "unused" and use the
(C)reate command.
[ OK ]
[ Press enter or space ]
Toets Enter. Er wordt dan een lijst getoond met alle harde schijven die de kernel gevonden heeft bij het onderzoeken van de hardware. Figuur 2-13 toont een voorbeeld van een systeem met twee IDE-schijven. Ze heten ad0 en ad2.
Waarom staat ad1 niet in de lijst?
Stel er zitten twee IDE-schijven in een systeem, de eerste als master op de eerste IDE controller en de andere als master op de tweede IDE controller. Als FreeBSD deze zou nummeren zoals ze worden aangetroffen, als ad0 en ad1, dan zou het allemaal werken.
Maar als dan een derde schijf wordt toegevoegd, als slave op de eerste IDE controller, dan wordt die ad1 en de vorige ad1 wordt dan ad2. Omdat apparaatnamen (zoals ad1s1a) in gebruik zijn om bestandssystemen te vinden, lijken bestandssystemen niet meer in orde zijn en moeten de FreeBSD instellingen gewijzigd worden.
Om dit te omzeilen kan de kernel zo ingesteld worden dat de IDE schijven namen krijgen gebaseerd op hun lokatie en niet in de volgorde waarin ze gevonden worden. Met dat schema wordt de masterschijf op de tweede IDE controller altijd ad2, ook als er geen ad0 of ad1 apparaten zijn.
Dit is de standaardinstelling van de FreeBSD kernel, vandaar dat dit scherm ad0 en ad2 laat zien. De machine waarop deze schermafdruk gemaakt is had IDE schijven op beide masterkanalen van de IDE controllers en geen schijven op de slavekanalen.
Nu kan de schijf waarop de FreeBSD installatie moet komen worden geselecteerd. Druk daarna op [ OK ]. FDisk start op met een scherm vergelijkbaar met Figuur 2-14.
Het scherm van FDisk bestaat uit drie delen.
Het eerste deel, de eerste twee regels van het scherm, toont de details zien van de selecteerde schijf, inclusief de FreeBSD naam, de schijfgeometrie en de totale grootte van de schijf.
Het tweede deel laat de slices zien die momenteel op de schijf aanwezig zijn, waar ze beginnen en eindigen, hoe groot ze zijn en de namen die FreeBSD ze geeft, hun omschrijving en subtype. In dit voorbeeld zijn twee kleine ongebruikte delen te zien, die een afspiegeling zijn van de schijfindeling op het systeem. Het laat ook een grote FAT-slice zien, die bijna zeker zichtbaar is als C: in MS-DOS of Windows, en een extended deel, dat de andere schijfletters kan bevatten voor MS-DOS of Windows.
Het derde deel toont de commando's zien die beschikbaar zijn in FDisk.
De volgende stap hangt af van hoe de schijf moet worden opgedeeld.
Als de hele schijf voor FreeBSD wordt gebruikt (waardoor alle andere data op die schijf verwijderd wordt als later in de procedure met sysinstall wordt bevestigd dat de installatie verder kan gaan) toets dan A, de optie Use Entire Disk. De bestaande delen worden verwijderd en daarvoor in de plaats komt een klein gebied, dat als unused wordt aangegeven (alweer een afspiegeling van de PC schijfopmaak) en dan een groot deel voor FreeBSD. Hierna dient het nieuwe FreeBSD-deel met de pijltjestoetsen geselecteerd te worden en daarna kan S ingetoetst worden om het deel bootable te maken. Het scherm ziet er dan ongeveer uit als in Figuur 2-15. Let op de A in de kolom Flags. Deze geeft aan dat dit deel actief is en er van opgestart wordt.
Als er ruimte voor FreeBSD gemaakt wordt door een bestaande slice te verwijderen, dan moet dat deel geselecteerd worden met de pijltjestoetsen en kan vervolgens op D gedrukt worden. Daarna kan C getoetst worden en wordt er gevraagd hoe groot het deel moet zijn. Geef het gewenste getal in en druk op Enter. De standaardwaarde in dit invoervak is het grootst mogelijke deel dat gemaakt kan worden. Dat kan de grootst mogelijke aaneengesloten ruimte op de harde schijf zijn of de hele schijf.
Als er al ruimte gemaakt is voor FreeBSD (bijvoorbeeld met een programma als PartitionMagic), dan kan de optie C gebruikt worden om een nieuw deel te maken. Opnieuw komt de vraag naar de grootte van het gebied dat aangemaakt moet worden.
Toets na afronding Q. De wijzigingen worden bewaard in sysinstall, maar worden nog niet op de schijf weggeschreven.
Hierna is het mogelijk een bootmanager te installeren. Het installeren van de FreeBSD bootmanager is verstandig als:
Er meer dan één schijf in een systeem zit en FreeBSD op een andere dan de eerste schijf wordt geïnstalleerd;
FreeBSD geïnstalleerd wordt naast een ander besturingssysteem op dezelfde schijf en er bij het opstarten van de computer gekozen moet worden of FreeBSD of het andere besturingssysteem wordt gestart.
Als FreeBSD het enige besturingssysteem op een computer wordt en het is geïnstalleerd op de eerste harde schijf, dan volstaat de Standard bootmanager. Kies None als een bootmanager van een derde partij wordt gebruikt die in staat is om FreeBSD te starten.
Maak de keuze en druk op Enter.
Het hulpscherm, bereikbaar via F1, beschrijft de problemen die mogelijk zijn als de harde schijf voor meerdere besturingssystemen gebruikt gaat worden.
Als er meer dan één schijf is komt het programma terug in het scherm “Select Drives” na het installeren van de bootmanager. Als FreeBSD wordt geïnstalleerd op meerdere schijven, selecteer dan een andere schijf en herhaal het indelen van de schijf met FDisk.
Belangrijk: Als FreeBSD wordt geïnstalleerd op een andere dan de eerste schijf, dan moet de FreeBSD bootmanager geïnstalleerd worden op beide schijven.
Met Tab wordt gewisseld tussen de laatst geselecteerde schijf, [ OK ] en [ Cancel ].
Druk één keer op Tab om [ OK ] actief te maken en druk dan op Enter om door te gaan met de installatie.
Nu moeten er slices in elke zojuist aangemaakte partitie aangemaakt worden. Onthoud dat elke partitie een letter heeft van a tot en met h en dat partities b, c en d een betekenis hebben die gehonoreerd moet worden.
Bepaalde programma's hebben voordeel van specifieke partitieschema's, met name als partities worden aanmaakt over meerdere schijven. Maar voor nu, als eerste FreeBSD installatie, is het niet zo van belang hoe de schijf wordt gepartitioneerd. Het is belangrijker dat FreeBSD wordt geïnstalleert en geleerd wordt hoe ermee te werken. FreeBSD kan altijd opnieuw geïnstalleerd worden om een partitieschema te wijzigen als er meer bekendheid is met het besturingssysteem.
Het onderstaande schema heeft vier partities. Eén als swapgebied en drie voor bestandssystemen.
Tabel 2-2. Partitieopmaak voor de eerste schijf
| Partitie | Bestandssysteem | Grootte | Omschrijving |
|---|---|---|---|
| a | / | 1 GB | Dit is het root-bestandssysteem. Elk ander bestandssyteem wordt ergens in dit systeem aangekoppeld. 1 GB is een redelijke grootte voor dit bestandssysteem. Er wordt niet al te veel data in opgeslagen, want een normale FreeBSD installatie slaat hier ongeveer 128 MB aan gegevens op. De rest van de ruimte is voor tijdelijke gegevens en laat extra ruimte over voor het geval nieuwere versies van FreeBSD meer ruimte nodig hebben in /. |
| b | N/A | 2-3 x RAM |
De swapruimte van een systeem wordt op de b-partitie opgeslagen. De keuze van de juiste hoeveelheid swapruimte is een beetje een kunst. Een goede vuistregel is dat swapruimte twee of drie keer de hoeveelheid intern geheugen (RAM) moet zijn. Er moet minstens 64 MB aan swap zijn, dus als er minder dan 32 MB RAM in een computer zit, zet dan de swapruimte op 64 MB. Als er meer dan één schijf in een computer zit, dan kan er op iedere schijf swapruimte gemaakt worden. FreeBSD gebruikt dan elke schijf als swap, wat effectief de snelheid van het swappen verhoogt. Bereken in dat geval de totale hoeveelheid swap die nodig is (bijvoorbeeld 128 MB) en deel dat door het aantal schijven dat aanwezig is (bijvoorbeeld twee schijven) om de hoeveelheid swap per schijf te bepalen, in dit voorbeeld 64 MB swapruimte per schijf. |
| e | /var | 512 MB tot 4096 MB | De map /var bevat bestanden die constant veranderen: logboekbestanden en andere administratieve bestanden. Veel van deze bestanden worden intensief gelezen of beschreven gedurende het dagelijks draaien van FreeBSD. Door deze bestanden op een apart bestandssysteem te zetten heeft FreeBSD de mogelijkheid de toegang tot deze bestanden te optimaliseren, zonder invloed te hebben op bestanden in andere map die niet zo'n toegangspatroon hebben. |
| f | /usr | Overige schijfruimte (minstens 8 GB) | Alle andere bestanden worden gewoonlijk opgeslagen in /usr en submappen. |
WaarschuwingDe bovenstaande waardes dienen als voorbeeld en dienen alleen door ervaren gebruikers gebruikt te worden. Gebruikers worden aangeraden om de automatische partitie-indeling genaamd Auto Defaultsvan de partitiebewerker van FreeBSD te gebruiken.
Als FreeBSD wordt geïnstalleerd op meer dan één schijf dan moeten ook partities aangemaakt worden op de andere slices die zijn ingesteld. De meest eenvoudige manier om dat te doen is het aanmaken van twee partities op elke schijf: een als swap en een voor een bestandssysteem.
Tabel 2-3. Partitieopmaak voor volgende schijven
| Partitie | Bestandssysteem | Grootte | Omschrijving |
|---|---|---|---|
| b | N/A | Zie omschrijving | Zoals beschreven kan swapruimte over alle schijven verdeeld worden. Ook al is de a partitie vrij, de conventie schrijft voor dat de swapruimte op partitie b staat. |
| e | /diskn | Overige schijfruimte | De overige schijfruimte wordt gebruikt voor één grote partitie. Dit kan gemakkelijk op de a-partitie, in plaats van de e-partitie. De conventie schrijft echter voor dat partitie a op een slice is gereserveerd voor het bestandssysteem dat de root (/) van het bestandssysteem is. Deze conventie hoeft niet gevolgd te worden, maar sysinstall doet dat wel, dus als de conventie wordt nageleefd wordt de installatie iets schoner. Er kan gekozen worden om dit bestandssysteem waar dan ook te mounten. Dit voorbeeld suggereert dat het wordt aangekoppeld als /diskn, waarbij n een getal is dat verandert voor elke schijf. Er kan natuurlijk ook een ander schema worden aanhouden als dat de voorkeur heeft. |
Na het kiezen van de partitieopmaak kunnen ze worden aangemaakt met sysinstall. Dan verschijnt het volgende bericht:
Message
Now, you need to create BSD partitions inside of the fdisk
partition(s) just created. If you have a reasonable amount of disk
space (1GB or more) and don't have any special requirements, simply
use the (A)uto command to allocate space automatically. If you have
more specific needs or just don't care for the layout chosen by
(A)uto, press F1 for more information on manual layout.
[ OK ]
[ Press enter or space ]
Druk op Enter om de FreeBSD partitie-editor, Disklabel te starten.
Figuur 2-18 toont het scherm als Disklabel opstart. Het scherm bestaat uit drie delen.
De eerste paar regels tonen de naam van de actieve schijf en het gebied dat de partities bevat die worden aangemaakt (op dit punt noemt Disklabel dit de Partitienaam in plaats van de slicenaam). Dit scherm toont ook de hoeveelheid vrije ruimte in de slice. Dat is de gereserveerde ruimte in de slice die nog niet aan een partitie is toegewezen.
Het middelste deel toont de partities die aangemaakt zijn, de naam van het bestandssysteem dat elke partitie bevat, de grootte en enkele opties betreffende het aanmaken van het bestandssysteem.
Het onderste deel van het scherm toont de toetsaanslagen die geldig zijn in Disklabel.
Disklabel kan automatisch de partities aanmaken en ze de standaardgrootte geven. De standaardgroottes worden met behulp van een intern algoritme om de partitiegrootte te bepalen gebaseerd op de schijfgrootte berekend. Dit kan door op A te drukken. Dan verschijnt een scherm zoals in Figuur 2-19. Afhankelijk van de grootte van de schrijf die wordt gebruikt zijn de standaardwaarden wel of niet van toepassing. Dit maakt niets uit, omdat de standaardwaarden niet geaccepteerd hoeven te worden.
Opmerking: De standaard partitionering wijst /tmp zijn eigen partitie toe en is die geen onderdeel meer van de partitie /. Dit voorkomt het vollopen van de partitie / met tijdelijke bestanden.
Als er gekozen is om niet de standaard partities te gebruiken en ze te vervangen door een eigen indeling, gebruik dan de pijltjestoetsen om de eerste partitie te selecteren en druk dan op D om deze te verwijderen. Herhaal dit om alle aanbevolen partities te verwijderen.
Selecteer het juiste schijfdeel aan de bovenkant van het scherm om de eerste partitie aan te maken (a, gemount als / - root) en druk op C. Een dialoogscherm verschijnt met de vraag hoe groot de nieuwe partitie moet zijn (zoals te zien in Figuur 2-20). De grootte kan opgeven worden in schijfblokken of als een getal gevolgd door M voor megabytes, G voor gigabytes of C voor cylinders.
De standaardgrootte maakt een partitie aan zo groot als de rest van het schijfdeel. Als de partitiegroottes worden gebruikt als beschreven in het eerdere voorbeeld, verwijder dan het reeds ingevulde getal met Backspace en type 512M, zoals te zien in Figuur 2-21. Druk dan op [ OK ].
Als de grootte van een partitie gekozen is, wordt gevraagd of deze partitie een bestandssysteem of een wisselbestand (swap) bevat. Deze dialoog is te zien in Figuur 2-22. Deze eerste partitie bevat een bestandssysteem, dus controleer of FS geselecteerd is en druk op Enter.
Omdat een bestandssysteem wordt aangemaakt moet disklabel verteld worden waar het bestandssysteem gemount moet worden. Het dialoogscherm is te zien in Figuur 2-23. Het mountpunt van het root-bestandssysteem is /, dus type / en druk dan op Enter.
Het scherm wordt dan bijgewerkt met de nieuw aangemaakte partitie. Deze stappen moeten herhaald worden voor de andere partities. Als een wisselbestandpartitie wordt aanmaakt, wordt niet gevraagd naar het mountpunt, want wisselbestanden worden nooit gemount. Als de laatste partitie is aanmaakt, /usr, kan de aangegeven grootte blijven staan, want dat is de rest van de schijf.
Het uiteindelijke FreeBSD Disklabel Editor scherm kan eruit zien als Figuur 2-24, maar de waarden kunnen afwijken. Druk op Q om af te sluiten.
De keuze van de distributieset om te installeren hangt af van het gebruiksdoel van een systeem en de beschikbare schijfruimte. De voorgedefiniëerde opties variëren van het installeren van kleinste mogelijke installatie tot “alles”. Nieuwelingen in UNIX en/of FreeBSD kiezen bijna zeker één van voorgedefinieerde opties. Het aanpassen van de distributieset is typisch iets voor de meer ervaren gebruikers.
Druk op F1 voor meer informatie over de distributiesets en wat ze bevatten. Na het bekijken van de informatie geeft het toetsen van Enter opnieuw het menu Select Distributions weer.
Als een grafische gebruikersinterface gewenst is, dan dient de configuratie van de X-server en het kiezen van een standaard bureaublad na de installatie van FreeBSD te worden uitgevoerd. Meer informatie over het installeren en instellen van een X-server staat beschreven in Hoofdstuk 6.
Xorg is de standaardversie van X11 die wordt geïnstalleerd.
Als het wenselijk is een aangepaste kernel te compileren, kies dan een optie die de broncode bevat. Meer informatie over de redenen om een aangepaste kernel te bouwen en hoe dat moet staat in Hoofdstuk 9.
Vanzelfsprekend is het meest uitgebreide systeem het systeem dat alles omvat. Als er genoeg schijfruimte is, kies dan met de pijltjestoetsen All, zoals in Figuur 2-25 en druk op Enter. Als schijfruimte een zorg is, overweeg dan een optie die meer toegespitst is op de gewenste situatie. De perfecte keuze maken is niet nodig, naderhand kunnen distributies worden toevoegd.
Na het kiezen van de gewenste distributie komt de vraag of de FreeBSD Portscollectie geïnstalleerd moet worden. De Portscollectie is een gemakkelijke en handige manier om software te installeren. De Portscollectie bevat niet de broncode die nodig is om de software te compileren. In plaats daarvan is het een verzameling bestanden die het downloaden, compileren en installeren van software automatiseert. In Hoofdstuk 5 wordt beschreven hoe de Portscollectie gebruikt kan worden.
Het installatieprogramma controleert niet of er genoeg schijfruimte is. Deze optie dient alleen gekozen te worden als er voldoende schijfruimte is. In FreeBSD 9.0 neemt de Portscollectie ongeveer 500 MB schijfruimte in. Het is verstandig om aan te nemen dat in recentere versies van FreeBSD meer ruimte nodig is.
User Confirmation Requested
Would you like to install the FreeBSD ports collection?
This will give you ready access to over 23,000 ported software packages,
at a cost of around 500 MB of disk space when "clean" and possibly much
more than that if a lot of the distribution tarballs are loaded
(unless you have the extra CDs from a FreeBSD CD/DVD distribution
available and can mount it on /cdrom, in which case this is far less
of a problem).
The ports collection is a very valuable resource and well worth having
on your /usr partition, so it is advisable to say Yes to this option.
For more information on the ports collection & the latest ports,
visit:
http://www.FreeBSD.org/ports
[ Yes ] No
Selecteer [ Yes ] met de pijltjestoetsen om de Portscollectie te installeren of [ No ] om deze optie over te slaan. Druk op Enter om verder te gaan. Het menu Choose Distributions wordt opnieuw getoond.
Als alle keuzes gemaakt zijn, selecteer dan Exit met de pijltjestoetsen, zorg ervoor dat [ OK ] actief is en druk op Enter om verder te gaan.
Als wordt geïnstalleerd vanaf een CD-ROM of DVD kies dan met de pijltjestoetsen de optie Install from a FreeBSD CD/DVD. Zorg ervoor dat [ OK ] actief is en druk op Enter om verder te gaan.
Kies voor andere installatiemethodes de desbetreffende optie en volg de aanwijzingen.
Druk op F1 om de online help voor de installatiemedia te lezen. Druk op Enter om terug te gaan naar het menu mediaselectie.
Er zijn drie manieren van installeren via FTP: active FTP, passive FTP of via een HTTP proxy.
Deze optie zorgt ervoor dat alle FTP acties gebruik maken van de “Active” modus. Dit werkt niet door firewalls, maar werkt wel met oudere FTP-servers die de passieve modus niet ondersteunen. Als een verbinding blijft hangen met de passieve modus probeer dan de actieve modus!
Deze optie geeft sysinstall aan gebruik te maken van de “Passive” modus voor al het FTP-verkeer. Dit zorgt ervoor dat verbindingen door firewalls heen kunnen die inkomende verbindingen niet toelaten op willekeurige TCP-poorten.
Deze optie geeft sysinstall aan gebruik te maken van het HTTP protocol (zoals een webbrowser) om verbinding te maken met een proxy voor alle FTP verbindingen. De proxy vertaalt de verzoeken en stuurt ze naar de FTP server. Dit zorgt ervoor dat verbindingen door firewalls heen kunnen die helemaal geen FTP toestaan, maar wel een HTTP proxy hebben. In dit geval moet naast de FTP-server ook een HTTP proxy opgegeven worden.
Bij het gebruik van een proxy FTP-server moet meestal de server waar uiteindelijk verbinding mee gemaakt moet worden onderdeel zijn van de gebruikersnaam, na het teken “@”. De proxy server “imiteert” dan de echte server. Zo kan bijvoorbeeld geïnstalleerd worden vanaf ftp.FreeBSD.org, gebruikmakend van proxy FTP-server foo.example.com, luisterend op poort 1234.
In dit geval kan in het menu opties menu als FTP gebruikersnaam ftp@ftp.FreeBSD.org ingevuld worden en als wachtwoord een emailadres. Als installatiemedium kan FTP ingevuld worden (of passieve FTP als de gebruikte proxy het ondersteunt) en als URL ftp://foo.example.com:1234/pub/FreeBSD.
Omdat /pub/FreeBSD van ftp.FreeBSD.org via de proxy van foo.example.com wordt benaderd kan vanaf die machine geïnstalleerd worden (die de bestanden ophaalt van ftp.FreeBSD.org als het installatieprogramma erom vraagt).
Nu kan de installatie verder gaan. Dit is ook de laatste mogelijkheid om de installatie te beëindigen ter voorkoming van wijzigingen op de harde schijf.
User Confirmation Requested
Last Chance! Are you SURE you want to continue the installation?
If you're running this on a disk with data you wish to save then WE
STRONGLY ENCOURAGE YOU TO MAKE PROPER BACKUPS before proceeding!
We can take no responsibility for lost disk contents!
[ Yes ] No
Kies [ Yes ] en druk op Enter om verder te gaan.
De duur van de installatie hangt af van de gekozen distributie, het installatiemedium en de snelheid van de computer. Er wordt een serie berichten getoond die de voortgang aangeeft.
De installatie is klaar als het volgende bericht wordt getoond:
Message
Congratulations! You now have FreeBSD installed on your system.
We will now move on to the final configuration questions.
For any option you do not wish to configure, simply select No.
If you wish to re-enter this utility after the system is up, you may
do so by typing: /usr/sbin/sysinstall.
[ OK ]
[ Press enter or space ]
Druk op Enter om verder te gaan met instellingen na de installatie.
Kiezen voor [ No ] en bevestigen met Enter beëindigt de installatie en er worden geen wijzigingen aan het systeem gemaakt. Het volgende bericht verschijnt:
Message
Installation complete with some errors. You may wish to scroll
through the debugging messages on VTY1 with the scroll-lock feature.
You can also choose "No" at the next prompt and go back into the
installation menus to retry whichever operations have failed.
[ OK ]
Het bovenstaande bericht verschijnt omdat er niets is geïnstalleerd. Kies Enter om terug te gaan naar het menu Main Installation en de installatie te verlaten.
Na het installeren volgt de instelling van diverse opties. Een optie kan worden ingesteld door opnieuw naar de instellingenopties te gaan voordat de nieuwe FreeBSD-installatie wordt gestart of door na de installatie sysinstall te gebruiken en te kiezen voor Configure.
Als al eerder PPP is ingesteld voor een FTP-installatie verschijnt het volgende scherm niet en kan dit onderdeel worden geïnstalleerd zoals eerder beschreven.
Gedetailleerde informatie over lokale netwerken (LAN's) en het instellen van FreeBSD als een gateway of router staat in het hoofdstuk Netwerken voor Gevorderden.
User Confirmation Requested
Would you like to configure any Ethernet or PPP network devices?
[ Yes ] No
Kies [ Yes ] en druk op Enter om een netwerkapparaat in te stellen. Kies anders [ No ] om verder te gaan.
Kies de in te stellen interface met de pijltjestoetsen en druk op Enter.
User Confirmation Requested
Do you want to try IPv6 configuration of the interface?
Yes [ No ]
In dit gesloten lokale netwerk was het huidige type Internet protocol (IPv4) toereikend en dus werd [ No ] geselecteerd met de pijltjestoetsen en kon met Enter verder gegaan worden.
Als er verbinding is met een bestaand IPv6 netwerk met een RA server, kies dan [ Yes ] en druk op Enter. Zoeken naar RA servers duurt een paar seconden.
User Confirmation Requested
Do you want to try DHCP configuration of the interface?
Yes [ No ]
Kies [ No ] met de pijltjestoetsen en druk op Enter als DHCP (Dynamic Host Configuration Protocol) niet nodig is.
[ Yes ] kiezen start dhclient op en als het goed gaat stelt het netwerk zichzelf in. In Paragraaf 30.5 staat meer informatie.
Het volgende scherm met netwerkinstellingen toont de instellingen van een Ethernetapparaat van een systeem dat als gateway voor een lokaal netwerk functioneert.
Met Tab kunnen de velden geselecteerd worden waarna de juiste informatie ingevuld kan worden:
De “fully-qualified hostname”, in dit geval k6-2.example.com.
De naam van het domein waar toe de machine behoort, in dit geval example.com.
Het IP-adres van de host die pakketjes doorstuurt naar niet-lokale bestemmingen. Dit moet ingesteld worden als een machine een onderdeel is van netwerk. Laat dit veld leeg als de machine de gateway is naar het Internet voor het netwerk. De IPv4 Gateway staat ook bekend onder de naam default gateway of default route.
Het IP-adres van de lokale DNS server. Er is op dit gesloten lokale netwerk geen DNS server, dus wordt het IP-adres van de DNS server van de provider gebruikt (208.163.10.2).
Het IP-adres dat gebruikt moet worden voor deze interface (192.168.0.1).
Het adresblok dat gebruikt wordt door het lokale netwerk is 192.168.0.0 - 192.168.255.255 met netmasker 255.255.255.0.
Elke interface-specifieke optie voor ifconfig die toegevoegd moet worden. In dit geval waren er geen.
Gebruik Tab om [ OK ] te selecteren als de instellingen gereed zijn en druk op Enter.
User Confirmation Requested
Would you like to Bring the ed0 interface up right now?
[ Yes ] No
Het kiezen van [ Yes ] en het drukken op Enter maakt een machine onderdeel van een netwerk en daarna is hij klaar voor gebruik. Dit heeft echter nog weinig zin, omdat de machine nog opnieuw opgestart moet worden.
User Confirmation Requested
Do you want this machine to function as a network gateway?
[ Yes ] No
Als de machine gateway voor een lokaal netwerk is en pakketjes doorstuurt naar andere machines kies dan [ Yes ] en druk op Enter. Als de machine alleen host op een netwerk is, kies dan [ No ] en druk op Enter om verder te gaan.
User Confirmation Requested
Do you want to configure inetd and the network services that it provides?
Yes [ No ]
Door het selecteren van [ No ] worden diverse diensten als telnetd niet aangezet. Dat betekent dat gebruikers op afstand niet met telnet bij de machine kunnen. Lokale gebruikers kunnen wel met telnet naar andere machines.
Deze diensten kunnen na de installatie worden aangezet door /etc/inetd.conf te wijzigen met een editor naar keuze. In Paragraaf 30.2.1 staat meer informatie.
Selecteer [ Yes ] om deze diensten in te stellen tijdens de installatie. Er wordt een extra bevestiging getoond:
User Confirmation Requested
The Internet Super Server (inetd) allows a number of simple Internet
services to be enabled, including finger, ftp and telnetd. Enabling
these services may increase risk of security problems by increasing
the exposure of your system.
With this in mind, do you wish to enable inetd?
[ Yes ] No
Selecteer [ Yes ] om verder te gaan.
User Confirmation Requested
inetd(8) relies on its configuration file, /etc/inetd.conf, to determine
which of its Internet services will be available. The default FreeBSD
inetd.conf(5) leaves all services disabled by default, so they must be
specifically enabled in the configuration file before they will
function, even once inetd(8) is enabled. Note that services for
IPv6 must be separately enabled from IPv4 services.
Select [Yes] now to invoke an editor on /etc/inetd.conf, or [No] to
use the current settings.
[ Yes ] No
Het selecteren van [ Yes ] geeft de mogelijkheid diensten toe te voegen door het teken # aan het begin van een regel te verwijderen.
Druk na het toevoegen van de gewenste diensten, op Esc om het menu te krijgen waarin de wijzigingen opgeslagen kunnen worden en de editor verlaten kan worden.
User Confirmation Requested
Would you like to enable SSH login?
Yes [ No ]
Het kiezen van [ Yes ] zal sshd(8) aanzetten, het daemon-programma voor OpenSSH. Dit zal beveiligde toegang op afstand tot uw machine toestaan. Zie voor meer informatie over OpenSSH Paragraaf 15.10.
User Confirmation Requested
Do you want to have anonymous FTP access to this machine?
Yes [ No ]
Het selecteren van de standaardwaarde [ No ] en het drukken op Enter stelt gebruikers met toegang en een wachtwoord nog steeds in staat om de machine via FTP te benaderen.
Als anonieme FTP wordt toegestaan kan iedereen de machine met FTP benaderen. De gevolgen voor de veiligheid van de machine moeten overwogen worden voordat deze optie wordt ingeschakeld. Meer informatie over beveiliging staat in Hoofdstuk 15.
Selecteer met de pijltjestoetsen [ Yes ] om anonieme FTP toe te staan en druk op Enter. Een aanvullende bevestiging zal verschijnen:
User Confirmation Requested
Anonymous FTP permits un-authenticated users to connect to the system
FTP server, if FTP service is enabled. Anonymous users are
restricted to a specific subset of the file system, and the default
configuration provides a drop-box incoming directory to which uploads
are permitted. You must separately enable both inetd(8), and enable
ftpd(8) in inetd.conf(5) for FTP services to be available. If you
did not do so earlier, you will have the opportunity to enable inetd(8)
again later.
If you want the server to be read-only you should leave the upload
directory option empty and add the -r command-line option to ftpd(8)
in inetd.conf(5)
Do you wish to continue configuring anonymous FTP?
[ Yes ] No
Dit bericht informeert u dat de FTP-dienst ook in /etc/inetd.conf aangezet moet worden als u anonieme FTP-verbindingen wilt toestaan, zie Paragraaf 2.10.3. Kies [ Yes ] en druk op Enter om verder te gaan; het volgende scherm zal verschijnen:
Gebruik Tab om de informatievelden te selecteren en de juiste informatie in te vullen:
De gebruikers-ID die u aan de anonieme FTP-gebruiker wilt toekennen. Alle geuploade bestanden zullen eigendom zijn van deze ID.
In welke groep de anonieme FTP-gebruiker dient te zitten.
Een string die deze gebruiker in /etc/passwd beschrijft.
Waar de bestanden beschikbaar voor anonieme FTP worden bewaard.
Waar bestanden geupload door anonieme FTP-gebruikers naar toe gaan.
De startmap voor FTP wordt standaard ingesteld op /var. Als daar niet genoeg ruimte is voor de geschatte FTP-wensen dan kan /usr gebruikt worden door de waarde FTP root directory op /usr/ftp in te stellen.
Druk op Enter om verder te gaan als de instellingen gemaakt zijn.
User Confirmation Requested
Create a welcome message file for anonymous FTP users?
[ Yes ] No
Na het kiezen van [ Yes ] en op Enter drukken opent zich een editor waarin het welkomstbericht bewerkt kan worden.
De bovenstaande editor is ee. Volg de instructies om het bericht te wijzigen of wijzig het bericht later door gebruik te maken van een editor naar keuze. Let op de bestandsnaam en lokatie onderaan het scherm van de editor.
Druk op Esc en een pop-up menu verschijnt met als standaardoptie a) leave editor. Druk op Enter om de editor te verlaten en verder te gaan. Druk nog een keer op Enter om de eventuele wijzigingen te bewaren.
Network File System (NFS) maakt het mogelijk bestanden te delen over een netwerk. Een machine kan worden ingesteld als server, client of beide. In Paragraaf 30.3 staat meer informatie.
User Confirmation Requested
Do you want to configure this machine as an NFS server?
Yes [ No ]
Kies [ No ] als er geen noodzaak is voor een Network File System server en druk op Enter.
Na het kiezen van [ Yes ] wordt een bericht getoond dat aangeeft dat er een betand exports moet worden gemaakt.
Message
Operating as an NFS server means that you must first configure an
/etc/exports file to indicate which hosts are allowed certain kinds of
access to your local filesystems.
Press [Enter] now to invoke an editor on /etc/exports
[ OK ]
Druk op Enter om verder te gaan. Een editor start om exports te maken en te bewerken.
Volg de instructies om een te exporteren bestandssysteem toe te voegen of doe het later met een editor naar keuze. Let op de bestandsnaam en lokatie onderaan het scherm van de editor.
Druk op Esc en een pop-up menu verschijnt met als standaardoptie a) leave editor. Druk op Enter om de editor te verlaten en verder te gaan.
De NFS client maakt het mogelijk om NFS servers te benaderen.
User Confirmation Requested
Do you want to configure this machine as an NFS client?
Yes [ No ]
Kies met de pijltjestoetsen de optie [ Yes ] of [ No ] en druk op Enter.
Er is een aantal opties beschikbaar om de systeemconsole in aan te passen.
User Confirmation Requested
Would you like to customize your system console settings?
[ Yes ] No
Om de opties te bekijken en in te stellen, kies [ Yes ] en druk op Enter.
Een gebruikelijke optie is de schermbeveiliging. Gebruik de pijltjestoetsen om Saver te selecteren en druk op Enter.
Kies met de pijltjestoetsen de gewenste schermbeveiliging en druk op Enter. Het instellingenmenu System Console verschijnt weer.
De standaard activeringstijd is 300 seconden. Kies voor het wijzigen van de activeringstijd weer Saver. Kies in het optiemenu Screen Saver met de pijltjestoetsen Timeout en druk op Enter. Een pop-up verschijnt:
Wijzig de waarde, selecteer [ OK ] en druk op Enter om terug te gaan naar het instellingenmenu System Console.
Met het selecteren van Exit en drukken op Enter kan verdergegaan worden met de andere instellingen.
Het instellen van de tijdzone van een machine maakt het mogelijk om automatisch correcties door te voeren voor regionale tijdswijzigingen en het juist uitvoeren van andere tijdzone-afhankelijke functies.
Het voorbeeld toont een machine die staat in de oostelijke tijdzone van de Verenigde Staten. De keuze voor een specifiek systeem hangt af van de geografische locatie.
User Confirmation Requested
Would you like to set this machine's time zone now?
[ Yes ] No
Selecteer [ Yes ] en druk op Enter om de tijdzone in te stellen.
User Confirmation Requested
Is this machine's CMOS clock set to UTC? If it is set to local time
or you don't know, please choose NO here!
Yes [ No ]
Kies [ Yes ] of [ No ] afhankelijk van de instellingen van de klok van de machine en druk op Enter.
Kies met de pijltjestoetsen de juiste regio en druk op Enter.
Kies met de pijltjestoetsen het juiste land en druk op Enter.
Kies met de pijltjestoetsen de juiste tijdzone en druk op Enter.
Confirmation
Does the abbreviation 'EDT' look reasonable?
[ Yes ] No
Bevestig dat de afkorting van de tijdzone juist is. Als die er goed uit ziet, druk dan op Enter om verder te gaan met de overige instellingen.
Opmerking: Dit gedeelte is alleen van toepassing op installaties van FreeBSD 7.X, als u FreeBSD 8.X installeert wordt dit scherm niet getoond.
User Confirmation Requested
Would you like to enable Linux binary compatibility?
[ Yes ] No
Selecteer [ Yes ] en druk op Enter als de mogelijkheid om Linux software te draaien op FreeBSD geactiveerd moet worden. Deze optie installeert de voor Linux compatibiliteit benodigde pakketten.
Als via FTP wordt geïnstalleerd, dan moet de machine verbonden zijn met Internet. Soms heeft een FTP-site niet alle distributies, zoals de Linux comptabiliteit, beschikbaar. Zonodig kan deze ook later geïnstalleerd worden.
Deze optie geeft de mogelijkheid om tekst te kopiëren en te plakken in de console en programma's met een 3-knops muis. Als een 2-knops muis wordt gebruikt, ga dan naar de hulppagina moused(8) na de installatie voor de details over het emuleren van een 3-knops muis. Dit voorbeeld toont een niet-USB muisinstelling (zoals een PS/2 of seriële poort muis):
User Confirmation Requested
Does this system have a PS/2, serial, or bus mouse?
[ Yes ] No
Selecteer [ Yes ] voor een PS/2-, seriële of busmuis of [ No ] voor een USB-muis en druk op Enter.
Gebruik de pijltjestoetsen om Type te selecteren en druk op Enter.
De muis in dit voorbeeld is een PS/2-muis, dus de standaardoptie Auto was van toepassing. Selecteer met de pijltjestoetsen een andere optie om het protocol te wijzigen. Zorg ervoor dat [ OK ] geselecteerd is en druk op Enter om dit menu te verlaten.
Gebruik de pijltjestoetsen om Port te selecteren en druk op Enter.
Dit systeem heeft een PS/2 muis, dus de standaardoptie PS/2 was van toepassing. Gebruik de pijltjestoetsen en druk op Enter om de poort te wijzigen.
Gebruik tenslotte de pijltjestoetsen om Enable te selecteren en druk op Enter om de muisdaemon aan te zetten en te testen.
Beweeg de muis over het scherm en controleer of de cursor op de juiste manier reageert. Als dat in orde is, selecteer dan [ Yes ] en druk op Enter. Als het niet goed gaat, dan is de muis niet goed ingesteld. Kies dan [ No ] en probeer het met andere instellingen.
Kies met de pijltjestoetsen Exit en druk op Enter om terug te gaan naar het instellingenmenu.
Pakketten zijn voorgebouwde binaire bestanden en zijn een gemakkelijke manier om software te installeren.
De installatie van één pakket wordt als voorbeeld getoond. Er kunnen nog meer pakketten geïnstalleerd worden als dat wenselijk is. Na de installatie kan sysinstall gebruikt worden om extra pakketten te installeren.
User Confirmation Requested
The FreeBSD package collection is a collection of hundreds of
ready-to-run applications, from text editors to games to WEB servers
and more. Would you like to browse the collection now?
[ Yes ] No
Na het kiezen van [ Yes ] en drukken op Enter verschijnt het menu pakketkeuze:
Alleen pakketten die aanwezig zijn op het huidige installatiemedium zijn beschikbaar voor installatie op dat moment.
Alle beschikbare pakketten worden getoond na het selecteren van All, maar er kan ook een bepaalde categorie geselecteerd worden. De categorie kan gekozen worden met de pijltjestoetsen en door te bevestigen met Enter.
Dan wordt een menu getoond met alle beschikbare pakketten binnen de gemaakte selectie:
De shell bash is geselecteerd. Er kunnen zoveel pakketten als wenselijk gekozen worden door ze te selecteren en op de spatiebalk te drukken. Een korte beschrijving van elk pakket verschijnt in de linker benedenhoek van het scherm.
Door te drukken op Tab wordt gewisseld tussen het laatst geselecteerde pakket, [ OK ] en [ Cancel ].
Druk na het selecteren van pakketten voor installatie één keer op Tab om naar [ OK ] te gaan en druk op Enter om terug te gaan naar het menu pakketkeuze.
De linker- en rechterpijltjestoets wisselen eveneens tussen [ OK ] en [ Cancel ]. Die manier kan ook gebruikt worden om [ OK ] te kiezen en op Enter te drukken om terug te gaan naar het menu pakketkeuze.
Gebruik Tab en de pijltjestoetsen om [ Install ] te selecteren en druk op Enter. Daarna moet de pakketinstallatie bevestigd worden:
Het selecteren van [ OK ] en drukken op Enter start de installatie. Er worden installatieberichten getoond tot alle installaties zijn afgerond. Maak een notitie van eventuele foutmeldingen.
Na het installeren van pakketten gaat het maken van de laatste instellingen verder. Als er geen pakketten geselecteerd zijn kan om terug te gaan naar het menu toch Install gekozen worden.
Er moet minstens één gebruiker toegevoegd worden tijdens de installatie, zodat het systeem gebruikt kan worden zonder als root aan te hoeven melden. De rootpartitie is in het algemeen klein en het draaien van programma's als root kan de schijfruimte snel vullen. Een groter gevaar wordt hieronder aangegeven:
User Confirmation Requested
Would you like to add any initial user accounts to the system? Adding
at least one account for yourself at this stage is suggested since
working as the "root" user is dangerous (it is easy to do things which
adversely affect the entire system).
[ Yes ] No
Kies [ Yes ] en druk op Enter om verder te gaan met het toevoegen van een gebruiker.
Selecteer User met de pijltjestoetsen en druk op Enter.
De volgende beschrijvingen verschijnen in het onderste deel van het scherm als opties zijn geselecteerd met Tab en kunnen behulpzaam zijn bij het invullen van de benodigde informatie:
De aanmeldnaam van de nieuwe gebruiker (verplicht).
Het numerieke ID van de gebruiker (laat leeg voor automatische toewijzing).
De naam van de aanmeldgroep van de gebruiker (laat leeg voor automatische keuze).
Het wachtwoord voor de gebruiker (vul dit zorgvuldig in!).
De volledige naam van de gebruiker (commentaar).
De groepen waar de gebruiker in zit (waar hij toegangsrechten voor krijgt).
De locatie van de thuismap van de gebruiker (laat leeg voor de standaardwaarde).
De aanmeldshell voor de gebruiker (laat leeg voor de standaardwaarde, zoals /bin/sh).
De aanmeldshell is hier veranderd van /bin/sh in /usr/local/bin/bash om de shell bash te gebruiken die eerder is geïnstalleerd als pakket. Probeer geen shell op te geven die niet bestaat, want dan kan niet aangemeld worden. De meest gebruikte shell in de BSD-wereld is de C shell, die aangegeven kan worden als /bin/tcsh.
De gebruiker is ook toegevoegd aan de groep wheel om het mogelijk te maken superuser te worden met root-rechten.
Druk op [ OK ] als de instellingen zijn gemaakt om naar het menu User and Group Management terug te gaan:
Op dit moment kunnen ook groepen worden toegevoegd als de specifieke behoeften bekend zijn. Dit kan ook door sysinstall (/stand/sysinstall in FreeBSD versies ouder dan 5.2) na de installatie te gebruiken.
Kies na het toevoegen van gebruikers Exit met de pijltjestoetsen en druk op Enter om verder te gaan met de installatie.
Message
Now you must set the system manager's password.
This is the password you'll use to log in as "root".
[ OK ]
[ Press enter or space ]
Druk op Enter om het root wachtwoord in te stellen.
Het wachtwoord moet twee keer gelijk ingegeven worden. Het is vast overbodig om op te merken dat het belangrijk is zorg te dragen voor een manier om het wachtwoord terug te vinden in het geval het wordt vergeten. Tijdens de ingave van het wachtwoord wordt dit niet weergegeven en er worden ook geen sterretjes getoond.
Changing local password for root. New password: Retype new password :
De installatie gaat verder als het wachtwoord succesvol is ingevoerd.
Als het nodig is om extra netwerkapparaten toe te voegen of andere instellingen te maken, dan kan dat nu of later met sysinstall.
User Confirmation Requested
Visit the general configuration menu for a chance to set any last
options?
Yes [ No ]
Selecteer [ No ] met de pijltjestoetsen en druk op Enter om terug te gaan naar het menu Main Installation.
Selecteer [X Exit Install] met de pijltjestoetsen en druk op Enter. Er wordt om bevestiging gevraagd:
User Confirmation Requested
Are you sure you wish to exit? The system will reboot.
[ Yes ] No
Selecteer [ Yes ]. Als u van het CD-ROM-station opstart zal de volgende boodschap u eraan herinneren de schijf te verwijderen:
Message
Be sure to remove the media from the drive.
[ OK ]
[ Press enter or space ]
Het CD-ROM-station is geblokkeerd totdat de machine opnieuw wordt opgestart, dan kan de schijf snel uit het station worden gehaald. Druk op [ OK ] om opnieuw op te starten.
Het systeem start op, dus let op eventuele foutberichten die getoond worden, zie Paragraaf 2.10.16 voor meer details.
Het instellen van netwerkdiensten kan afschrikwekkend zijn voor nieuwe gebruikers zonder (voldoende) voorkennis op dit gebied. Netwerken, inclusief Internet, is van levensbelang voor alle moderne besturingssystemen, inclusief FreeBSD. Als gevolg daarvan is het handig enig begrip te hebben van de uitgebreide netwerkmogelijkheden van FreeBSD. Door dit tijdens de installatie te doen hebben gebruikers in elk geval enige kennis van de diverse netwerkdiensten die hen ter beschikking staan.
Netwerkdiensten zijn programma's die invoer accepteren vanaf het netwerk. Al het mogelijke is gedaan om er voor te zorgen dat deze programma's niets “schadelijks” doen. Helaas zijn programmeurs niet perfect en in de loop van de tijd zijn er fouten gevonden in netwerkdiensten die door aanvallers zijn uitgebuit om slechte dingen te doen. Het is belangrijk alleen netwerkdiensten aan te zetten die nodig zijn. Bij twijfel kan een netwerkdienst het beste niet ingeschakeld worden totdat duidelijk is dat de dienst wél nodig is. Diensten kunnen later alsnog ingeschakeld worden door sysinstall nog een keer te draaien of door middel van de mogelijkheden van het bestand /etc/rc.conf.
Het kiezen van de optie Networking toont het volgende menu:
De eerste optie, Interfaces, is al behandeld in Paragraaf 2.10.1, dus die wordt overgeslagen.
Kies AMD voor het toevoegen van ondersteuning voor het BSD hulpprogramma voor automatisch mounten. Dit wordt meestal gebruikt in combinatie met het NFS protocol (zie verderop) voor het automatisch mounten van externe bestandssystemen. Hier zijn geen speciale instellingen nodig.
De volgende optie is AMD Flags. Als deze optie wordt selecteert komt er een pop-up menu waarin de specifieke AMD vlaggen kunnen worden ingesteld. Het menu bevat al een lijst standaardopties:
-a /.amd_mnt -l syslog /host /etc/amd.map /net /etc/amd.map
De optie -a bepaalt de standaard mountlocatie die is
hier ingesteld op /.amd_mnt. De optie -l bepaalt het standaardbestand voor log, maar als syslogd wordt gebruikt,
dan worden alle acties naar de systeemlogdaemon gestuurd. De map /host wordt gebruikt om een geëxporteerd bestandssysteem
van een externe host te mounten, terwijl de map /net wordt
gebruikt om een geëxporteerd bestandssysteem van een IP-adres te mounten. Het bestand /etc/amd.map bepaalt de standaardopties voor AMD exports.
De optie Anon FTP staat anonieme FTP verbindingen toe. Kies deze optie om van een machine een anonieme FTP server te maken. Hierbij zijn de beveiligingsimplicaties van belang. Er wordt een volgend menu getoond om de beveiligingsrisico's en verdere instellingen te verklaren.
Het instellingenmenu Gateway maakt van de machine een gateway, zoals eerder beschreven. Hier kan de optie Gateway ook gebruikt worden om de optie uit te zetten als die eerder in de installatie per ongeluk is aangezet.
De optie Inetd kan gebruikt worden om de inetd(8) daemon in te stellen of helemaal uit te schakelen, zoals boven beschreven.
De optie Mail kan gebruikt worden om de standaard MTA (Mail Transfer Agent) van het systeem in te stellen. Hiervoor wordt het volgende menu gebruikt:
Hier kan gekozen worden welke MTA moet worden geïnstalleerd en gebruikt. Een MTA is niets meer dan een mailserver die mail aflevert bij gebruikers op het systeem of op Internet.
Het kiezen van Sendmail installeert de populaire server sendmail, die de standaard is voor FreeBSD. De optie Sendmail local maakt van sendmail de standaard MTA, maar zet de mogelijkheid om mail te ontvangen vanaf het Internet uit. De andere opties, Postfix en Exim werken net zo als Sendmail. Allebei leveren ze mail af. Sommige gebruikers geven de voorkeur aan deze alternatieven boven de sendmail MTA.
Na het kiezen van een MTA of de keuze geen MTA te installeren, verschijnt het menu netwerkinstellingen met als volgende optie NFS client.
De optie NFS client stelt het systeem in om te communiceren met een server via NFS. Een NFS server stelt bestandssystemen beschikbaar aan andere machines via het NFS protocol. Als de te installeren machine een op zichzelf staande machine is, dan kan deze optie uitgeschakeld blijven. Het kan zijn dat het systeem later meer instellingen nodig heeft. In Paragraaf 30.3 staat meer informatie over client- en serverinstellingen.
De volgende optie is NFS server, die het mogelijk maakt een systeem in te stellen als NFS server. Deze optie voegt de nodige informatie toe om de dienst RPC, “remote procedure call”, op te starten. RPC wordt gebruikt om de verbindingen tussen hosts en programma's te coördineren.
Daarna volgt de optie Ntpdate die de tijdsynchronisatie afhandelt. Als deze wordt geselecteerd verschijnt het volgende menu:
Kies uit dit menu de server die het dichtst bij het te installeren systeem staat. Door het kiezen van een server in de buurt is de synchronisatie preciezer omdat een verder gelegen server meer vertraging in de verbinding kan hebben.
De volgende optie is de PCNFSD selectie. Deze optie installeert het pakket net/pcnfsd uit de Portscollectie. Dat is een handig hulpprogramma dat het mogelijk maakt om aan te melden bij NFS met systemen die zelf geen aanmeldsysteem hebben, zoals het besturingssysteem MS-DOS van Microsoft.
Door naar beneden te scrollen in het hoofdmenu worden de onderstaande opties zichtbaar:
De hulpprogramma's rpcbind(8), rpc.statd(8) en rpc.lockd(8) worden allemaal gebruikt voor “Remote Procedure Calls” (RPC). Het hulpprogramma rpcbind beheert de communicatie tussen NFS servers en clients en is noodzakelijk om NFS servers correct te laten werken. De daemon rpc.statd communiceert met de daemon rpc.statd op andere machines om statusinformatie te leveren. De gerapporteerde status wordt gewoonlijk bijgehouden in het bestand /var/db/statd.status. De volgende optie in de lijst is rpc.lockd die, mits geselecteerd, bestandslockdiensten mogelijk maakt. Dit wordt meestal gebruikt door rpc.statd om bij te houden welke hosts vragen om bestanden te locken en hoe vaak ze dat doen. Hoewel deze laatste twee opties fantastisch zijn om fouten om te sporen, zijn ze niet noodzakelijk voor NFS servers en clients om correct te werken.
De dan volgende optie in de lijst is Routed, een
routeringsdaemon. Het hulpprogramma routed(8) beheert
netwerkrouteringstabellen, ontdekt “multicast” routers en stelt op
verzoek kopieën van de routeringstabellen ter beschikking aan fysiek
verbonden apparaten. Dit wordt vooral gebruikt door machines die dienst doen als
gateway voor het lokale netwerk. Na het selecteren van deze optie verschijnt een
menu waarin naar de standaardlocatie van het hulpprogramma wordt gevraagd. De
standaardlocatie is al gedefiniëerd en kan met Enter
worden geactiveerd. Dan komt er een ander menu dat vraagt om de opties die
doorgegeven moeten worden aan routed op te geven. De
standaard is -q en die staat al op het scherm.
Dan volgt de optie Rwhod die, als geselecteerd, de daemon rwhod(8) inschakelt bij het opstarten. Het hulpprogramma rwhod zendt periodiek systeemberichten uit over het netwerk of verzamelt die in de modus “consumer”. Meer informatie staat in de hulppagina's ruptime(1) en rwho(1).
De één na laatste optie in de lijst is de daemon sshd(8). Dat is de “secure shell server” van OpenSSH en deze wordt sterk aangeraden boven de standaardservers telnet en FTP. De server sshd wordt gebruikt om een veilige verbinding op te zetten van de ene computer naar de andere door een versleutelde verbinding te gebruiken.
Tenslotte is er de optie TCP Extensions. Dit schakelt TCP uitbreidingen in zoals gedefiniëerd in RFC 1323 en RFC 1644. Hoewel dit op veel machines de verbindingen kan versnellen, kan het ook de oorzaak zijn van het wegvallen van sommige verbindingen. Het wordt niet aangeraden voor servers, maar voor alleenstaande machines kan het voordelig zijn.
Nu de netwerkmogelijkheden zijn ingesteld kan het menu via Exit verlaten worden en doorgegaan worden met het instellen in de volgende sectie.
Als alles goed is gegaan komen er berichten over het scherm rollen en komt dit uit bij de aanmeldprompt. De inhoud van de berichten kan bekeken worden door te drukken op Scroll-Lock en dan met PgUp en PgDn door de tekst heen te lopen. Druk weer op Scroll-Lock om terug te gaan naar de prompt.
Het kan zijn dat het totale bericht niet getoond kan worden (beperking van de buffer). Dan kunnen de berichten later bekeken worden op de commandoregel door na het aanmelden dmesg in te geven op de prompt.
Meld aan met de gebruikersnaam en het wachtwoord die zijn aangemaakt tijdens de installatie (in dit voorbeeld rpratt). Vermijd het aanmelden als root, behalve als het noodzakelijk is.
Gebruikelijke opstartberichten (versie-informatie verwijderd):
Copyright (c) 1992-2002 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
The Regents of the University of California. All rights reserved.
Timecounter "i8254" frequency 1193182 Hz
CPU: AMD-K6(tm) 3D processor (300.68-MHz 586-class CPU)
Origin = "AuthenticAMD" Id = 0x580 Stepping = 0
Features=0x8001bf<FPU,VME,DE,PSE,TSC,MSR,MCE,CX8,MMX>
AMD Features=0x80000800<SYSCALL,3DNow!>
real memory = 268435456 (262144K bytes)
config> di sn0
config> di lnc0
config> di le0
config> di ie0
config> di fe0
config> di cs0
config> di bt0
config> di aic0
config> di aha0
config> di adv0
config> q
avail memory = 256311296 (250304K bytes)
Preloaded elf kernel "kernel" at 0xc0491000.
Preloaded userconfig_script "/boot/kernel.conf" at 0xc049109c.
md0: Malloc disk
Using $PIR table, 4 entries at 0xc00fde60
npx0: <math processor> on motherboard
npx0: INT 16 interface
pcib0: <Host to PCI bridge> on motherboard
pci0: <PCI bus> on pcib0
pcib1: <VIA 82C598MVP (Apollo MVP3) PCI-PCI (AGP) bridge> at device 1.0 on pci0
pci1: <PCI bus> on pcib1
pci1: <Matrox MGA G200 AGP graphics accelerator> at 0.0 irq 11
isab0: <VIA 82C586 PCI-ISA bridge> at device 7.0 on pci0
isa0: <ISA bus> on isab0
atapci0: <VIA 82C586 ATA33 controller> port 0xe000-0xe00f at device 7.1 on pci0
ata0: at 0x1f0 irq 14 on atapci0
ata1: at 0x170 irq 15 on atapci0
uhci0: <VIA 83C572 USB controller> port 0xe400-0xe41f irq 10 at device 7.2 on pci0
usb0: <VIA 83C572 USB controller> on uhci0
usb0: USB revision 1.0
uhub0: VIA UHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub0: 2 ports with 2 removable, self powered
chip1: <VIA 82C586B ACPI interface> at device 7.3 on pci0
ed0: <NE2000 PCI Ethernet (RealTek 8029)> port 0xe800-0xe81f irq 9 at
device 10.0 on pci0
ed0: address 52:54:05:de:73:1b, type NE2000 (16 bit)
isa0: too many dependant configs (8)
isa0: unexpected small tag 14
fdc0: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isa0
fdc0: FIFO enabled, 8 bytes threshold
fd0: <1440-KB 3.5" drive> on fdc0 drive 0
atkbdc0: <keyboard controller (i8042)> at port 0x60-0x64 on isa0
atkbd0: <AT Keyboard> flags 0x1 irq 1 on atkbdc0
kbd0 at atkbd0
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: model Generic PS/2 mouse, device ID 0
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
sc0: <System console> at flags 0x1 on isa0
sc0: VGA <16 virtual consoles, flags=0x300>
sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
sio0: type 16550A
sio1 at port 0x2f8-0x2ff irq 3 on isa0
sio1: type 16550A
ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
ppc0: FIFO with 16/16/15 bytes threshold
ppbus0: IEEE1284 device found /NIBBLE
Probing for PnP devices on ppbus0:
plip0: <PLIP network interface> on ppbus0
lpt0: <Printer> on ppbus0
lpt0: Interrupt-driven port
ppi0: <Parallel I/O> on ppbus0
ad0: 8063MB <IBM-DHEA-38451> [16383/16/63] at ata0-master using UDMA33
ad2: 8063MB <IBM-DHEA-38451> [16383/16/63] at ata1-master using UDMA33
acd0: CDROM <DELTA OTC-H101/ST3 F/W by OIPD> at ata0-slave using PIO4
Mounting root from ufs:/dev/ad0s1a
swapon: adding /dev/ad0s1b as swap device
Automatic boot in progress...
/dev/ad0s1a: FILESYSTEM CLEAN; SKIPPING CHECKS
/dev/ad0s1a: clean, 48752 free (552 frags, 6025 blocks, 0.9% fragmentation)
/dev/ad0s1f: FILESYSTEM CLEAN; SKIPPING CHECKS
/dev/ad0s1f: clean, 128997 free (21 frags, 16122 blocks, 0.0% fragmentation)
/dev/ad0s1g: FILESYSTEM CLEAN; SKIPPING CHECKS
/dev/ad0s1g: clean, 3036299 free (43175 frags, 374073 blocks, 1.3% fragmentation)
/dev/ad0s1e: filesystem CLEAN; SKIPPING CHECKS
/dev/ad0s1e: clean, 128193 free (17 frags, 16022 blocks, 0.0% fragmentation)
Doing initial network setup: hostname.
ed0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
inet6 fe80::5054::5ff::fede:731b%ed0 prefixlen 64 tentative scopeid 0x1
ether 52:54:05:de:73:1b
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x8
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
Additional routing options: IP gateway=YES TCP keepalive=YES
routing daemons:.
additional daemons: syslogd.
Doing additional network setup:.
Starting final network daemons: creating ssh RSA host key
Generating public/private rsa1 key pair.
Your identification has been saved in /etc/ssh/ssh_host_key.
Your public key has been saved in /etc/ssh/ssh_host_key.pub.
The key fingerprint is:
cd:76:89:16:69:0e:d0:6e:f8:66:d0:07:26:3c:7e:2d root@k6-2.example.com
creating ssh DSA host key
Generating public/private dsa key pair.
Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
The key fingerprint is:
f9:a1:a9:47:c4:ad:f9:8d:52:b8:b8:ff:8c:ad:2d:e6 root@k6-2.example.com.
setting ELF ldconfig path: /usr/lib /usr/lib/compat /usr/X11R6/lib
/usr/local/lib
a.out ldconfig path: /usr/lib/aout /usr/lib/compat/aout /usr/X11R6/lib/aout
starting standard daemons: inetd cron sshd usbd sendmail.
Initial rc.i386 initialization:.
rc.i386 configuring syscons: blank_time screensaver moused.
Additional ABI support: linux.
Local package initialization:.
Additional TCP options:.
FreeBSD/i386 (k6-2.example.com) (ttyv0)
login: rpratt
Password:
Het aanmaken van de RSA en DSA sleutels kan een tijdje duren op langzamere machines. Dit gebeurt alleen bij de eerste keer aanmelden na een nieuwe installatie. De volgende keren gaan sneller.
Als de X-server ingesteld is en er een standaard desktop is gekozen, dan kan die worden gestart door startx in te geven op de commandoregel.
Het is belangrijk om het besturingssysteem op de juiste manier uit te schakelen. Schakel niet gewoon de stroom uit. Neem eerst de rol van superuser aan door su in te geven op de commandoregel en het root wachtwoord in te geven. Dit kan alleen als gebruiker die lid is van de groep wheel. Anders moet eerst worden aangemeld als root. Gebruik shutdown -h now om het systeem uit te schakelen.
The operating system has halted. Please press any key to reboot.
Het is veilig om de stroom uit te schakelen als na het commando shutdown het bericht “Please press any key to reboot” getoond wordt. Als een toets wordt ingedrukt in plaats van het uitschakelen van de stroom, dan start het systeem opnieuw.
De combinatie Ctrl+Alt+Del kan ook gebruikt worden om het systeem te herstarten, maar dit wordt niet aangeraden tijdens normaal gebruik.
Dit onderdeel behandelt het oplossen van installatieproblemen, zoals veel voorkomende problemen die gebruikers hebben gerapporteerd. Er is ook een aantal vragen en antwoorden voor mensen die een systeem willen hebben met zowel FreeBSD als MS-DOS of Windows (dual-boot).
Door de beperkingen van de PC-architectuur is het onmogelijk om 100% betrouwbaar een hardware-onderzoek te doen, maar er zijn een paar dingen die wel gedaan kunnen worden in geval van storingen.
Controleer het Hardware Notes document voor uw versie van FreeBSD om er zeker van te zijn dat de hardware ondersteund wordt.
Als de hardware wordt ondersteund, maar het systeem loopt nog steeds vast of heeft andere problemen, dient u een eigen kernel te bouwen. Dit maakt het mogelijk om ondersteuning voor apparaten toe te voegen de niet in de GENERIC kernel zitten. De kernel op de opstartschijven gaat er vanuit dat de hardware ingesteld is op de fabrieksinstellingen wat betreft IRQ's, IO adressen en DMA kanalen. Als de hardware anders is ingesteld, dan moet waarschijnlijk de instellingeneditor gebruikt worden om FreeBSD te vertellen waar de apparaten te vinden zijn.
Het is ook mogelijk dat een onderzoek naar een apparaat dat niet aanwezig is een probleem veroorzaakt bij een later onderzoek naar een ander apparaat dat er wel is. In dat geval moet het conflicterende stuurprogramma uitgeschakeld worden.
Opmerking: Sommige installatieproblemen kunnen voorkomen of verminderd worden door de firmware op de diverse hardwarecomponenten bij te werken, zeker als het om het moederbord gaat. De firmware voor een moederbord wordt ook aangeduid als het BIOS en de meeste moederbord- en computerfabrikanten hebben een website waar upgrades en upgrade-informatie beschikbaar is.
De meeste fabrikanten raden sterk af om het BIOS te upgraden, tenzij er een goede reden voor is, zoals bijvoorbeeld een kritische update. Het upgradeproces kan misgaan, wat beschadiging van de BIOS chip kan veroorzaken.
FreeBSD ondersteunt geen bestandssystemen die gecomprimeerd zijn met het programma Double Space™. Daarom moet het bestandssysteem eerst gedecomprimeerd worden voordat FreeBSD de gegevens kan benaderen. Dit kan met de Compression Agent, te vinden in het menu Start> Programma's > Bureau-accessoires > Systeemwerkset.
FreeBSD kan MS-DOS gebaseerde bestandssystemen (soms FAT bestandssystemen genoemd) ondersteunen. Het commando mount_msdosfs(8) plaatst zulke bestandssystemen in de bestaande maphierarchie, waardoor de inhoud van het bestandssysteem benaderd kan worden. Het programma mount_msdosfs(8) wordt normaliter niet direct gebruikt; in plaats hiervan wordt het aangeroepen door een regel in /etc/fstab of door een aanroep van het gereedschap mount(8) met de juiste parameters.
Een typische regel in /etc/fstab is:
/dev/ad0sN /dos msdosfs rw 0 0
Opmerking: De map /dos moet reeds bestaan om dit te laten werken. Zie fstab(5) voor details over het formaat van /etc/fstab.
Een typische aanroep naar mount(8) voor een MS-DOS bestandssysteem ziet er uit als:
# mount -t msdosfs /dev/ad0s1 /mnt
In dit voorbeeld staat het MS-DOS bestandssysteem op de eerste partitie van de primaire harde schijf. Iedere situatie kan anders zijn, dus controleer de uitvoer van de commando's dmesg en mount. Dat zou voldoende informatie moeten leveren om een idee te vormen over het partitieschema.
Opmerking: FreeBSD kan schijfstukken (dat zijn MS-DOS partities) anders nummeren dan andere besturingssystemen. In het bijzonder krijgen extended MS-DOS partities gewoonlijk hogere schijfstuknummers dan primaire MS-DOS partities. Het gereedschap fdisk(8) kan helpen te bepalen welke schijfstukken bij FreeBSD en welke bij andere besturingssystemen horen.
NTFS-partities kunnen op soortgelijke manier aangekoppeld worden met het commando mount_ntfs(8).
2.11.3.1. Mijn systeem hangt bij het opsporen van hardware tijdens het opstarten, of het gedraagt zich vreemd tijdens het installeren, of de floppydrive wordt niet onderzocht.
FreeBSD maakt veelvuldig gebruik van de ACPI-diensten van het systeem op de i386, amd64 en ia64 platformen bij het helpen van de systeemconfiguratie als het tijdens het opstarten is gedetecteerd. Helaas bestaan er nog enkele bugs in zowel het ACPI-stuurprogramma als in sommige systeemmoederborden en BIOSsen. ACPI kan worden uitgeschakeld door de hint hint.acpi.0.disabled in te stellen in de derde-fase-bootloader:
set hint.acpi.0.disabled="1"
Dit wordt telkens wanneer het systeem opnieuw wordt opgestart teruggezet, dus is het nodig om hint.acpi.0.disabled="1" aan het bestand /boot/loader.conf toe te voegen. Meer informatie over de bootloader kan worden gevonden in Paragraaf 13.1.
2.11.3.2. Ik ga naar opstarten van harde schijf voor de eerste keer na het installeren van FreeBSD, de kernel laadt en onderzoekt mijn hardware, maar stopt met berichten zoals deze:
changing root device to ad1s1a panic: cannot mount root
Wat is er verkeerd? Wat kan ik doen?
Wat is dit bios_drive:interface(unit,partition)kernel_name dat wordt weergegeven met de opstarthulp?
Er is een langdurig probleem in het geval dat de opstartschijf niet de eerste schijf in het systeem is. Het BIOS gebruikt een ander nummeringsschema dan FreeBSD, en uitzoeken welke nummers met welke overeenkomen is lastig goed te krijgen.
In het geval dat de opstartschijf niet de eerste schijf in het systeem is, kan FreeBSD wel wat hulp gebruiken om het te vinden. Er zijn hier twee bekende situaties, en in beide gevallen dient u FreeBSD te vertellen waar het root-bestandssysteem zich bevindt. U kunt dit doen door het BIOS schijfnummer te specificeren, het soort schijf en het FreeBSD schijfnummer voor die soort.
De eerste situatie is wanneer u twee IDE-schijven heeft, elk geconfigureerd als de meester op hun respectievelijke IDE-bus, en u FreeBSD wilt opstarten vanaf de tweede schijf. Het BIOS ziet dit als schijf 0 en schijf 1, terwijl FreeBSD ze als ad0 en ad2.
FreeBSD staat op BIOS schijf 1, van het soort ad en het FreeBSD schijfnummer is 2, dus geldt:
1:ad(2,a)kernel
Merk op dat indien u een slaaf op de primaire bus heeft, bovenstaande niet nodig is (en effectief onjuist is).
De tweede situatie is omvat opstarten van een SCSI-schijf wanneer u één of meer IDE-schijven in het systeem heeft. In dit geval is het FreeBSD schijfnummer lager dan het BIOS schijfnummer. Als u twee IDE-schijven alsook de SCSI-schijf heeft, dan is de SCSI-schijf BIOS schijf 2, soort da en FreeBSD schijfnummer 0, dus geldt:
2:da(0,a)kernel
wanneer u FreeBSD wilt vertellen dat u van BIOS schijf 2 wilt opstarten, welke de eerste SCSI-schijf in het systeem is. Als u slechts één IDE-schijf had, zou 1: gegolden hebben.
Wanneer u de juiste waardes heeft bepaald om te gebruiken, kunt u het commando precies zoals u het zou typen in het bestand /boot.config plaatsen met een standaard tekstverwerker. Tenzij anders geïnstrueerd, gebruikt FreeBSD de inhoud van dit bestand als het standaardantwoord op de prompt boot:.
2.11.3.3. Ik ga naar opstarten van harde schijf voor de eerste keer na de installatie van FreeBSD, maar de prompt van de Boot Manager geeft telkens alleen F? weer in het opstartmenu maar het opstarten gaat niet verder.
De geometrie van de harde schijf was verkeerd ingesteld in de partitiebewerker toen u FreeBSD installeerde. Ga terug naar de partitiebewerker en specificeer de eigenlijke geometrie van uw harde schijf. U moet FreeBSD weer van het begin af herinstalleren met de juiste geometrie.
Als u geheel faalt in het bepalen van de juiste geometrie van uw machine, is hier een tip: Installeer een kleine MS-DOS partitie aan het begin van de schijf en installeer FreeBSD na die partitie. Het installatieprogramma zal de MS-DOS partitie zien en proberen de juiste geometrie er uit af te leiden, wat gewoonlijk werkt.
De volgende tip wordt niet meer aangeraden, maar is hier achtergelaten ter referentie:
Als u een echt toegewijde FreeBSD server of werkstation installeert waar u geen (toekomstige) compatibiliteit met MS-DOS, Linux of een ander besturingssysteem wilt, heeft u ook de mogelijkheid om de gehele schijf (A in de partitiebewerker) te gebruiken, de niet-standaard optie selecterende waarbij FreeBSD de gehele schijf van de allereerste tot de allerlaatste sector beslaat. Dit laat alle geometrieoverwegingen buiten beschouwing, maar is wat beperkend tenzij u nooit iets anders dan FreeBSD op een schijf gaat draaien.
Uw kaart zit waarschijnlijk op een andere IRQ dan wat is gespecificeerd in het bestand /boot/device.hints. Het stuurprogramma ed(4) gebruikt standaard niet de “soft”-configuratie (waardes gegeven met EZSETUP in MS-DOS), maar het zal de softwareconfiguratie gebruiken wanneer u -1 specificeert in de hints voor de interface.
Verplaats òf de jumper op de kaart naar een vaste configuratie-instelling (pas indien nodig de kernelinstellingen aan), òf specificeer het IRQ als -1 door de hint hint.ed.0.irq="-1" in te stellen. Dit vertelt de kernel om de softconfiguratie te gebruiken.
Een andere mogelijkheid is dat uw kaart op IRQ 9 zit, welke gedeeld is met IRQ 2 en vaak een bron van problemen is (al helemaal wanneer u een VGA-kaart heeft die IRQ 2 gebruikt!). U dient IRQ 2 en 9 te vermijden indien mogelijk.
In dit onderdeel wordt het installeren van FreeBSD in bijzondere situaties beschreven.
Dit type installatie heet ook wel een “headless install”, omdat de met FreeBSD te installeren machine of geen monitor heeft aangesloten of zelfs geen VGA-uitvoer heeft. Hoe is dat mogelijk, kan de vraag zijn. Dat kan met een seriële console. Een seriële console is gewoonweg een andere machine die optreedt als monitor en toetsenbord voor een systeem. Om dit te doen moet eerst een installatie-USB-stick worden gemaakt, zoals uitgelegd is in Paragraaf 2.3.7 of het juiste ISO-image voor de installatie worden gedownloadt (zie Paragraaf 2.13.1).
Volg de volgende stappen om de media te wijzigen om in een seriële console op te starten (voor een CD-ROM kan de eerste stap worden overgeslagen):
Installatie-USB-stick geschikt maken voor een seriële console
Als wordt opgestart van de zojuist gemaakt USB-stick, start FreeBSD op in de normale installatiemodus. FreeBSD moet echter opstarten naar een seriële console voor de installatie. Om dit te regelen moet de USB-stick gekoppeld worden aan het FreeBSD systeem met het commando mount(8).
# mount /dev/da0a /mnt
Opmerking: Pas het apparaat en het koppelpunt aan uw situatie aan.
Nu dat de stick is aangekoppeld, moet deze ingesteld worden om in een seriële toestand op te starten. Aan het bestand loader.conf van het bestandssysteem van de USB-stick een regel worden toegevoegd dat de seriële console instelt als de systeemconsole:
# echo 'console="comconsole"' >> /mnt/boot/loader.conf
Nu de USB-stick correct is geconfigureerd, moet deze afgekoppeld worden met umount(8):
# umount /mnt
Nu kan de USB-stick worden afgekoppeld en direct naar de derde stap van deze procedure gegaan worden.
De installatie-CD in staat stellen om in een seriële console op te starten
Als met de CD zou worden opgestart die zojuist van het installatie-ISO-image is gemaakt (zie Paragraaf 2.13.1), dan zou FreeBSD opstarten in de normale installatiemodus. We willen dat FreeBSD voor de installatie opstart in een seriële console. Om dit te doen, moet het ISO-image worden uitgepakt, gewijzigd, en opnieuw worden gegenereerd voordat het op een CD-R wordt gebrandt.
Gebruik tar(1) om alle bestanden uit te pakken van het installatie-ISO-image, bijvoorbeeld FreeBSD-9.0-RELEASE-i386-disc1.iso:
# mkdir /pad/naar/headless-iso # tar -C /pad/naar/headless-iso -pxvf FreeBSD-9.0-RELEASE-i386-disc1.iso
Nu moet het installatiemedium worden ingesteld om in een seriële console op te starten. Aan het bestand loader.conf van het uitgepakte ISO-image moet een regel worden toegevoegd dat de seriële console als de systeemconsole instelt:
# echo 'console="comconsole"' >> /pad/naar/headless-iso/boot/loader.conf
Nu kan er een nieuw ISO-image van het gewijzigde bestandssysteem worden gemaakt. Het gereedschap mkisofs(8) van de port sysutils/cdrtools wordt gebruikt:
# mkisofs -v -b boot/cdboot -no-emul-boot -r -J -V "Headless_installatie" \ -o Headless-FreeBSD-9.0-RELEASEi386-disc1.iso /pad/naar/headless-iso
Nu het ISO-image correct is geconfigureerd, kan het met uw favoriete brandprogramma op een CD-R worden gebrandt.
Null-modem kabel aansluiten
Nu moeten de twee machines verbonden worden met een null-modem kabel. De kabel kan gewoon aangesloten worden tussen de seriële poorten van de machines. Een gewone seriële kabel werkt niet, er is een null-modem kabel nodig omdat daarin sommige draden kruiselings zijn verbonden.
Opstarten voor het installeren
Nu is het tijd om te beginnen met installeren. Steek de USB-stick in de machine die headless wordt geïnstalleerd en zet hem aan. Als u een voorbereidde CD-ROM gebruikt, zet dan de machine aan en steek de CD-ROM erin.
Verbinden met de headless machine
Nu moet verbinding gemaakt worden met die machine met cu(1):
# cu -l /dev/cuau0
Gebruik op FreeBSD 7.X het volgende commando:
# cu -l /dev/cuad0
Dat is alles! De headless machine kan bediend worden via de cu sessie. Het zal de kernel laden en vraagt dan wat voor terminal er gebruikt moeten worden. Selecteer de FreeBSD color console en ga verder met de installatie!
Opmerking: Om herhaling te voorkomen: “FreeBSD-schijf” betekent in deze context een FreeBSD CD-ROM of DVD die gekocht is of zelf is gemaakt.
Er kunnen zich situaties voordoen waarin aangepaste FreeBSD installatiemedia en/of bronnen gemaakt moeten worden. Dat kunnen fysieke media zijn zoals een tape of een bron die sysinstall kan gebruiken om bestanden op te halen, zoals een lokale FTP site of een MS-DOS-partitie.
Bijvoorbeeld:
Er zijn veel machines aangesloten op een lokaal netwerk en er is maar één FreeBSD-schijf. Er moet een lokale FTP site gemaakt worden met de inhoud van de FreeBSD schijf en vervolgens gebruiken andere machines die in plaats van steeds naar het Internet te moeten.
Er is een FreeBSD-schijf, FreeBSD herkent de CD/DVD-speler niet, maar MS-DOS / Windows wel. De FreeBSD installatiebestanden moeten gekopieerd worden naar een MS-DOS partitie op dezelfde computer en dan moet FreeBSD geïnstalleerd worden met die bestanden.
De computer die geïnstalleerd moet worden heeft geen CD/DVD-speler of netwerkkaart, maar kan wel verbonden worden via een “Laplink-achtige” seriële of parallelle kabel met een computer die wel een CD/DVD-speler heeft.
Er moet een tape gemaakt worden die gebruikt kan worden om FreeBSD te installeren.
Als onderdeel van elke versie stelt het FreeBSD project tenminste twee CDROM images beschikbaar (“ISO images”) per ondersteunde architectuur. Deze images kunnen op een CD-R gebrand worden en dan gebruikt worden om FreeBSD te installeren. Als een CD-schrijver aanwezig is en bandbreedte is goedkoop, dan is dit de makkelijkste manier om FreeBSD te installeren.
De juiste ISO images downloaden
De ISO images voor iedere versie kunnen worden gedownload van ftp://ftp.FreeBSD.org/pub/FreeBSD/ISO-IMAGES-arch/versie of de dichtstbijzijnde mirror. Vervang arch en versie door de gewenste waarden.
De bovenstaande map bevat meestal de volgende images:
Tabel 2-4. FreeBSD 7.X en 8.X ISO image-namen en verklaring
| Bestandsnaam | Inhoud |
|---|---|
| FreeBSD-versie-RELEASE-arch-bootonly.iso | Met dit CD-image kunt u het installatieproces starten door vanaf een CD-ROM-drive op te starten maar het bevat geen ondersteuning om FreeBSD van de CD zelf te installeren. U dient hiervoor een installatie vanaf het netwerk ( bijvoorbeeld een FTP-server) uit te voeren nadat u van deze CD heeft opgestart. |
| FreeBSD-versie-RELEASE-arch-disc1.iso.gz | Dit DVD-image bevat alles wat u nodig heeft om het basisgedeelte van FreeBSD te installeren, een verzameling van vooraf gebouwde pakketten, en de documentatie. Het ondersteunt ook het opstarten in een “livefs” gebaseerde reddingsmodus. |
| FreeBSD-versie-RELEASE-arch-memstick.img | Dit image kan naar een USB-geheugenstick worden geschreven en gebruikt worden om een installatie uit te voeren op machines die vanaf USB-drives kunnen opstarten. Het ondersteunt ook het opstarten in een “livefs” gebaseerde reddingsmodus. De documentatiepakketten worden geleverd, echter geen andere pakketten. Dit image is niet beschikbaar voor FreeBSD 7.X. |
| FreeBSD-versie-RELEASE-arch-disc1.iso | Dit CD-image bevat het basisgedeelte van FreeBSD en de documentatiepakketten maar geen andere pakketten. |
| FreeBSD-versie-RELEASE-arch-disc2.iso | Een CD-image met zoveel mogelijk pakketten van derde partijen als er op de schijf passen. Dit image is niet beschikbaar voor FreeBSD 8.X. |
| FreeBSD-versie-RELEASE-arch-disc3.iso | Nog een CD-image met zoveel mogelijk pakketten van derde partijen als op de schijf passen. Dit image is niet beschikbaar voor FreeBSD 8.0 en hoger. |
| FreeBSD-versie-RELEASE-arch-docs.iso | De FreeBSD documentatie. Dit beeld is niet beschikbaar voor FreeBSD 8.X. |
| FreeBSD-versie-RELEASE-arch-livefs.iso | Dit CD-image bevat ondersteuning om in een “livefs” gebaseerde reddingsmodus op te starten maar het ondersteunt niet het installeren van de CD zelf. |
Opmerking: Uitgaven van FreeBSD 7.X voor FreeBSD 7.3 en uitgaven van FreeBSD 8.0 gebruikten een andere naamconventie. Voor de namen van hun ISO-images staat geen FreeBSD-.
U moet òof het bootonly image downloaden, òf het beeldbestand van disc1. Download ze niet allebei, aangezien het beeldbestand disc1 alles bevat wat het bootonly image bevat.
Gebruik de bootonly ISO als toegang tot Internet goedkoop is. Hiermee kan FreeBSD geïnstalleerd worden, waarna pakketten van derde partijen gedownload en geïnstalleerd kunnen worden via het ports/packages systeem (zie Hoofdstuk 5).
Gebruik het dvd1 image om een uitgave van FreeBSD te installeren en een redelijke hoeveelheid pakketten op de schijf te installeren.
De additionele disc images zijn nuttig, maar niet noodzakelijk, zeker niet als er breedband toegang tot Internet is.
CD's branden
Daarna moeten de CD images op een schijf gebrand worden. Als dat wordt gedaan op een ander FreeBSD systeem, dan staat in Paragraaf 19.6 meer informatie (meer in het bijzonder in Paragraaf 19.6.3 en Paragraaf 19.6.4).
Als de CD's op een ander platform worden gebrand, gebruik dan de op dat platform beschikbare hulpprogramma's om een CD-brander aan te sturen. De images zijn samengesteld in het standaard ISO-formaat dat ondersteund wordt door de meeste CD-brandprogramma's.
Opmerking: Als er interesse is in het bouwen van een aangepaste versie van FreeBSD dan staat hierover informatie in het Release Engineering artikel.
FreeBSD-schijven zijn op dezelfde manier ingedeeld als de FTP site. Dat maakt het erg gemakkelijk om een lokale FTP site te maken die gebruikt kan worden door andere machines op een netwerk bij het installeren van FreeBSD.
Op de FreeBSD computer die de FTP site bevat moet de CD-ROM in het CD-ROM station zitten en aangekoppeld zijn op /cdrom.
# mount /cdrom
Maak een gebruikersaccount voor anonieme FTP toegang in /etc/passwd het bestand te bewerken met vipw(8) en de volgende regel toe te voegen:
ftp:*:99:99::0:0:FTP:/cdrom:/nonexistent
Zorg ervoor dat de dienst FTP aan staat in /etc/inetd.conf.
Iedereen met een netwerkverbinding naar de machine kan nu als mediumtype FTP kiezen en ftp://de-machine ingeven na het kiezen van “Other” in het menu FTP sites tijdens de installatie.
Opmerking: Als de bootmedia (meestal diskettes) voor een FTP client niet precies dezelfde versie hebben als die van de lokale FTP site, dan kan sysinstall de installatie niet volledig afronden. Als de versies niet gelijk zijn, dan kan in het menu Options de distributienaam gewijzigd worden in any.
WaarschuwingDeze aanpak is in orde voor een machine die aan een lokaal netwerk hangt en beschermd wordt door een firewall. Het aanbieden van FTP-diensten aan andere machines over Internet (en niet alleen het lokale netwerk) stelt een computer bloot aan de aandacht van krakers en andere ongewenste personen. We raden sterk aan om voldoende voorzorgsmaatregelen te nemen als hiervoor wordt gekozen.
Als wordt geïnstalleerd met diskettes (we adviseren om dit niet te doen), hetzij vanwege niet ondersteunde hardware of eenvoudigweg omdat de persoon die installeert er op staat dingen op de moeilijkste manier te doen, dan moeten eerst diskettes gemaakt worden voor de installatie.
Er zijn minstens zoveel 1.44 MB diskettes nodig als nodig zijn om alle bestanden die in de map base (basisdistributie) staan op te slaan. Als de diskettes worden gemaakt vanuit MS-DOS, dan moeten ze geformatteerd worden met het MS-DOS commando FORMAT. Als Windows wordt gebruikt, formatteer de schijven dan via de verkenner (rechtermuisklik op A: en kies dan “Format”).
Vertrouw voorgeformatteerde schijven niet. Formatteer ze voor de zekerheid opnieuw. Veel door gebruikers gerapporteerde problemen kwamen voort uit het gebruik van verkeerd geformatteerde media, vandaar dat dit punt hier wordt benadrukt.
Als de diskettes worden gemaakt op een andere FreeBSD machine is formatteren nog steeds geen slecht idee, hoewel niet op elke diskette een MS-DOS bestandssysteem nodig is. Met de commando's bsdlabel en newfs kan er een UFS bestandssysteem op gezet worden, zoals met de volgende commando's wordt getoond (voor een 3.5" 1.44 MB diskette):
# fdformat -f 1440 fd0.1440 # bsdlabel -w fd0.1440 floppy3 # newfs -t 2 -u 18 -l 1 -i 65536 /dev/fd0
Daarna kunnen ze aangekoppeld en beschreven worden als elk ander bestandssysteem.
Nadat de diskettes zijn geformatteerd moeten de bestanden op de diskettes gezet worden. De distributiebestanden zijn opgedeeld in porties zodat vijf stuks gemakkelijk op een ouderwetse 1.44 MB diskette passen. Ga door met alle diskettes en zet zoveel bestanden als mogelijk op elke diskette tot alle distributies op die manier gekopiëerd zijn. Elke distributie moet in een submap op de diskette komen, bijvoorbeeld: a:\base\base.aa, a:\base\base.ab, enzovoorts.
Belangrijk: Het bestand base.inf dient ook op de eerste diskette van de base verzameling te staan aangezien het door het installatieprogramma wordt gelezen om uit te zoeken naar hoeveel aanvullende delen te kijken wanneer de distributie opgehaald en aan elkaar geregen wordt.
Als tijdens de installatie het scherm Media verschijnt kan Floppy gekozen worden en het installatiesysteem vraagt daarna om de overige diskettes.
Om een installatie voor te bereiden vanaf een MS-DOS-partitie kunnen alle bestanden vanaf de distributie in een map genaamd freebsd in de hoofdmap van de partitie gezet worden, bijvoorbeeld c:\freebsd. De mappenstructuur van de CD-ROM of FTP site moet gedeeltelijk worden gereproduceerd in deze map, dus we raden aan het MS-DOS commando xcopy te gebruiken als de bron een CD-ROM is. Om bijvoorbeeld een minimale installatie van FreeBSD voor te bereiden:
C:\> md c:\freebsd C:\> xcopy e:\bin c:\freebsd\bin\ /s C:\> xcopy e:\manpages c:\freebsd\manpages\ /s
Hierbij wordt aangenomen dat C: de schijf is met voldoende vrije ruimte en dat E: het CD-ROM station is.
Als er geen CD-ROM station is, dan kan de distributie gedownload worden van ftp.FreeBSD.org. Elke distributie heeft zijn eigen map. De base distributie staat bijvoorbeeld in de map 9.0/base/.
Kopiëer de vanaf een MS-DOS-partitie te installeren distributies (en waar schijfruimte voor is) en plaats ze elk onder c:\freebsd. De distributie BIN is de enige noodzakelijke voor een minimale installatie.
Het installeren vanaf een tape is waarschijnlijk de gemakkelijkste manier, sneller dan een online FTP installatie of een CD-ROM installatie. Het installatieprogramma verwacht dat de bestanden eenvoudigweg getarred zijn op een tape. Na het ophalen van alle benodigde distributiebestanden moeten ze op een tape getarred worden:
# cd /freebsd/distdir # tar cvf /dev/rwt0 dist1 ... dist2
Bij het uitvoeren van de installatie moet ervoor gezorgd worden dat er voldoende ruimte is in een tijdelijke map (die gekozen kan worden) om de volledige inhoud van de gemaakte tape te bevatten. Door de sequentiële toegangsmethode van een tape heeft deze manier van installeren nogal wat tijdelijke schijfruimte nodig.
Opmerking: Bij het begin van de installatie moet de tape al in de drive zitten voor het opstarten van de opstartdiskette. Het installatieprogramma kan hem anders niet vinden.
Er zijn drie soorten netwerkinstallaties beschikbaar: Ethernet (een standaard Ethernet-controller), seriële poort (PPP), of parallelle poort (PLIP, laplink-kabel).
Voor de snelst mogelijke netwerkinstallatie is een Ethernet adapter altijd een goede keuze! FreeBSD ondersteunt de meeste Ethernetkaarten. Een overzicht van de ondersteunde kaarten (en de benodigde instellingen) is beschikbaar in de Hardware Notes voor elke versie van FreeBSD. Als gebruik gemaakt wordt van een ondersteunde PCMCIA kaart, stop deze dan in het slot vóór de laptop wordt aangezet. FreeBSD ondersteunt momenteel helaas geen “hot insertion” van PCMCIA-kaarten tijdens de installatie.
Een toe te wijzen IP-adres op het netwerk, het netmask van de adresklasse en de naam voor de te installeren machine moeten ook bekend zijn. Als wordt geïnstalleerd over een PPP-verbinding en er is geen vast IP-adres, wanhoop dan niet. Het IP-adres kan dynamisch toegekend worden door een ISP. Een systeembeheerder kan aangeven welke waarden gebruikt moeten worden voor netwerkinstellingen. Als andere hosts benaderd moeten worden op naam en niet op IP-adres, dan moet ook een nameserver en mogelijk het adres van een gateway opgegeven worden (als PPP wordt gebruikt is dat het IP-adres van de provider). Bij installatie met FTP via een HTTP-proxy moet ook het adres van de proxy bekend zijn. Als het antwoord op één of meerdere vragen niet bekend is, dan moet echt gesproken worden met de systeembeheerder of ISP vóóor dit soort installaties worden uitgevoerd.
Als een modem wordt gebruikt is PPP hoogstwaarschijnlijk de enige mogelijkheid. Er dient informatie over de provider beschikbaar te zijn omdat die redelijk vroeg in het installatieproces nodig is.
Als PAP of CHAP wordt gebruikt om een verbinding te maken met een ISP (met andere woorden als een verbinding gemaakt kan worden met een ISP onder Windows zonder een script te gebruiken), dan is alles wat gedaan moet worden het ingeven van het dial commando op de ppp prompt. Anders moet bekend zijn hoe de ISP gebeld moet worden met “AT commando's” die specifiek zijn voor een modem, aangezien de PPP-dialer slechts een erg eenvoudige terminal emulator bevat. In het ppp-gebruikers handboek en de FAQ staat meer informatie. Bij problemen kan de log naar het scherm worden gestuurd met het commando set log local ....
Als een hard-wired verbinding naar een andere FreeBSD machine beschikbaar is kan ook overwogen worden te installeren via een “laplink” parallelle poort kabel. De snelheid van een parallelle poort is veel hoger dan wat normaal mogelijk is over een seriële kabel (tot 50 kbytes/sec), resulterend een veel snellere installatie.
De installatie via NFS is redelijk rechttoe-rechtaan. Kopiëer gewoon de FreeBSD distributiebestanden die nodig zijn naar een NFS server en geef die server dan aan in de NFS-media selectie.
Als de server alleen zogenaamde “privileged ports” toestaat (zoals in z'n algemeenheid de standaard voor Sun workstations), dan moet ook de optie NFS Secure aangezet worden in het menu Options voor de installatie verder kan gaan.
Bij het gebruik van een Ethernetkaart van lage kwaliteit die last heeft van erg lage overdrachtssnelheden kan ook de vlag NFS Slow aangezet worden.
Om de installatie van NFS te laten werken, moet de server het aankoppelen van submappen ondersteunen. Als bijvoorbeeld een FreeBSD 9.0 distributie op ziggy:/usr/archive/stuff/FreeBSD staat, dan moet ziggy toestaan dat /usr/archive/stuff/FreeBSD rechtstreeks wordt aangekoppeld en niet alleen /usr of /usr/archive/stuff.
Dit wordt vanuit het FreeBSD-bestand /etc/exports
geregeld door de opties -alldirs. Andere NFS servers
kunnen andere gewoontes hebben. Bij een foutbericht “permission denied” van de server is het waarschijnlijk
dat deze niet goed is ingesteld.
Wordt nog vertaald.
Het volgende hoofdstuk behandelt de basiscommando's en functionaliteit van het FreeBSD besturingssysteem. Veel van dit materiaal is relevant voor elk UNIX achtig besturingssysteem. Als de lezer reeds bekend is met het materiaal, hoeft dit hoofdstuk niet gelezen te worden. Lezer die nog niet eerder met FreeBSD te maken hebben gehad wordt aangeraden door te lezen.
Na het lezen van dit hoofdstuk weet de lezer:
Hoe “virtuele consoles” in FreeBSD gebruikt kunnen worden;
Hoe UNIX bestandspermissies werken en hoe bestandsvlaggen in FreeBSD werken;
Hoe het standaard FreeBSD bestandssysteem eruit ziet;
Hoe een FreeBSD harde schijf is ingedeeld;
Hoe bestandssystemen gekoppeld en ontkoppeld worden;
Wat processen, daemons en signalen zijn;
Wat een shell is en hoe de standaard omgevingsvariabelen veranderd kunnen worden;
Hoe elementaire tekstverwerkers te gebruiken;
Wat apparaten en apparaatkoppelpunten zijn;
Welk binair formaat FreeBSD gebruikt;
Hoe handleidingen te gebruiken meer informatie.
FreeBSD kan op diverse manieren gebruikt worden. Één van deze manieren is het typen van commando's in een tekstterminal. Veel van de flexibiliteit en kracht van een UNIX besturingssysteem is gemakkelijk beschikbaar als je FreeBSD op deze manier gebruikt. Dit onderdeel beschrijft wat “terminals ” en “consoles” zijn en hoe je deze kan gebruiken in FreeBSD.
Als FreeBSD niet is ingesteld om automatisch een grafische omgeving te starten tijdens het opstarten, geeft het systeem een login prompt als het gestart is. Dit gebeurt direct nadat de startscripts klaar zijn. Er wordt iets als het volgende getoond:
Additional ABI support:. Local package initialization:. Additional TCP options:. Fri Sep 20 13:01:06 EEST 2002 FreeBSD/i386 (pc3.example.org) (ttyv0) login:
De meldingen op het scherm kunnen wellicht iets anders zijn op een systeem, maar het zal iets soortgelijks zijn. De laatste twee regels zijn de regels waar het nu over gaat. De voorlaatste regel toont:
FreeBSD/i386 (pc3.example.org) (ttyv0)
Deze regel bevat enkele informatie over het systeem dat net gestart is: dit is een “FreeBSD” console, draaiend op een Intel of soortgelijke processor op de x86 architectuur. [1] De naam van de machine (elke UNIX machine heeft een naam) is pc3.example.org en dit is de console van het systeem, de ttyv0 terminal.
De laatste regel is altijd:
login:
Dit is het deel waar een “gebruikersnaam” ingevuld moet worden om aan te melden op FreeBSD. Het volgende deel beschrijft hoe dat werkt.
FreeBSD is een multi-user en multi-processing systeem. Dit is de formele beschrijving die meestal gegeven wordt aan een systeem dat gebruikt wordt door meerdere personen die gelijktijdig verschillende programma's draaien op één enkele machine.
Elk multi-user systeem heeft een manier nodig om een “gebruiker” van alle andere gebruikers te kunnen onderscheiden. In FreeBSD (en alle andere UNIX achtige besturingssystemen), wordt dit bereikt door te eisen dat elke gebruiker moet “aanmelden” op het systeem voordat hij/zij programma's kan draaien. Elke gebruiker heeft een unieke naam (de “gebruikersnaam”) en een persoonlijke, geheime sleutel (het “wachtwoord”). FreeBSD vraagt om deze twee gegevens voordat het een gebruiker toegestaat om programma's te draaien.
Direct nadat FreeBSD is opgestart en de opstartscripts [2] afgerond zijn, wordt een prompt getoond dat vraagt om een geldige aanmeldnaam op te geven.
login:
In dit voorbeeld wordt aangenomen de gebruikersnaam john is. Als na deze prompt john wordt getype en op Enter wordt gedrukt, verschijnt hierna een prompt om het “ wachtwoord” in te voeren:
login: john Password:
Nu kan john's wachtwoord ingevoerd worden en op Enter gedrukt worden. Het wachtwoord wordt niet getoond! Daarover hoeft geen zorg te bestaan. Het is voldoende om te zeggen dat dit om veiligheidsredenen gedaan wordt.
Als het juiste wachtwoord is ingegeven, is er aangemeld bij op FreeBSD en in het systeem klaar om alle beschikbare commando's uit te voeren.
Na het aanmelden is de MOTD of het bericht van de dag zichtbaar, gevolgd door een commandoprompt (een #, $ of een % karakter). Dit geeft aan dat er succesvol is aangemeld op FreeBSD.
UNIX programma's draaien in één console is prima, maar FreeBSD kan veel programma's tegelijk draaien. Om maar één console te hebben waar commando's ingetypt kunnen worden zou zonde zijn van een besturingssysteem als FreeBSD waar meerdere programma's tegelijkertijd op kunnen draaien. Hier kunnen “virtuele consoles” van pas komen.
FreeBSD kan ingesteld worden om verschillende virtuele consoles te tonen. Met toetscombinaties kan van de ene console naar de gewisseld worden. Elke console heeft zijn eigen uitvoerkanaal, en FreeBSD zorgt ervoor dat alle toetsenbordinvoer en monitoruitvoer goed wordt gezet als er van de ene console naar de volgende wordt gewisseld.
In FreeBSD kunnen speciale toetscombinaties gebruikt worden om te wisselen naar een ander virtueel console. [3] In FreeBSD kan Alt-F1, Alt-F2 tot en met Alt-F8 gebruikt worden om te wisselen naar een ander virtueel console.
Als wordt gewisseld van de ene naar de andere console zorgt FreeBSD dat de uitvoer bewaard blijft. Het resultaat is een “illusie” van het hebben van meerdere schermen en toetsenborden die gebruikt kunnen worden om commando's in te voeren om FreeBSD te laten draaien. De programma's die in de ene virtuele console draaien, stoppen niet als de console niet zichtbaar is. Ze blijven doordraaien als naar een andere virtuele console wordt gewisseld.
De standaardinstelling van FreeBSD start op met acht virtuele consoles. Dit is echter geen vaste waarde en een installatie kan eenvoudig aangepast worden, zodat het systeem gestart wordt met meer of minder virtuele consoles. De hoeveelheid en instellingen van de virtuele consoles worden ingesteld in /etc/ttys.
/etc/ttys kan gebruikt worden om virtuele consoles in te stellen. Elke niet-commentaar regel in dit bestand (regels die niet beginnen met een # karakter) bevat instellingen voor een terminal of virtuele console. De standaardversie van dit bestand die meegeleverd wordt met FreeBSD stelt negen virtuele consoles in en activeert er acht. Dit zijn de regels die beginnen met ttyv:
# naam getty type status commentaar # ttyv0 "/usr/libexec/getty Pc" cons25 on secure # Virtual terminals ttyv1 "/usr/libexec/getty Pc" cons25 on secure ttyv2 "/usr/libexec/getty Pc" cons25 on secure ttyv3 "/usr/libexec/getty Pc" cons25 on secure ttyv4 "/usr/libexec/getty Pc" cons25 on secure ttyv5 "/usr/libexec/getty Pc" cons25 on secure ttyv6 "/usr/libexec/getty Pc" cons25 on secure ttyv7 "/usr/libexec/getty Pc" cons25 on secure ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure
Een uitgebreide beschrijving van elke kolom in dit bestand en alle mogelijke opties voor virtuele consoles staan in de ttys(5) hulppagina gebruiken.
In Paragraaf 13.6.2 staat een gedetailleerde beschrijving van de “single-user modus”. Het is belanrijk te melden dat er in single-user modus maar één console is. Er zijn geen virtuele consoles beschikbaar. De instellingen van de single-user modus console staan ook in /etc/ttys . De regel begint met console:
# name getty type status commentaar # # Als een console gemarkeerd is als "insecure", zal het init script om het root-wachtwoord # vragen wanneer het in single-user mode komt. console none unknown off secure
Opmerking: Zoals het commentaar boven de console regel aangeeft, kan in deze regel het woord secure gewijzigd worden in insecure. In dat geval vraagt FreeBSD bij het opstarten in single-user modus nog steeds om een root-wachtwoord.
Pas op als dit wordt veranderd in insecure. Als het wachtwoord van de gebruiker root zoek is, wordt het opstarten in single-user modus lastig. Het is nog steeds mogelijk, maar het kan vrij moeilijk zijn voor iemand die FreeBSD niet zo goed kent met betrekking tot het opstarten en de programma's die daarbij gebruikt worden.
De FreeBSD standaard video mode kan worden gewijzigd in 1024x768, 1280x1024, of een van de vele andere formaten die ondersteund worden door de grafische kaart en monitor. Om gebruik te maken van de verschillende video modes, moet eerst de kernel opnieuw gecompileerd worden met twee extra opties:
options VESA options SC_PIXEL_MODE
Zodra de kernel opnieuw gecompileerd is met deze twee opties kan gekeken worden welke video modes er ondersteund worden door de hardware door gebruik te maken van de vidcontrol(1) applicatie. Om een overzicht te krijgen van de ondersteunde video modes moet het volgende ingevoerd worden:
# vidcontrol -i mode
Het resultaat van dit commando is een lijst van video modes welke ondersteund worden door de hardware. Hierna kan de nieuwe video mode gekozen worden door dit aan te geven aan vidcontrol(1):
# vidcontrol MODE_279
Als de nieuwe video mode acceptabel is, kan dit permanent ingesteld worden door het volgende in /etc/rc.conf te zetten:
allscreens_flags="MODE_279"
FreeBSD, direct afgeleid van BSD UNIX, is gebaseerd op verschillende belangrijke UNIX concepten. Het meest bekende is dat FreeBSD een multi-user systeem is. Het systeem kan meerdere gebruikers behandelen die tegelijkertijd totaal verschillende dingen doen. Het systeem is verantwoordelijk voor het netjes delen en beheren voor aanvragen voor hardware, randapparatuur, geheugen en cpu tijd tussen elke gebruiker.
Omdat het systeem in staat is om meerdere gebruikers te ondersteunen, heeft alles wat door het systeem beheerd wordt een set van rechten die aangeeft wie mag lezen, schrijven en de bron mag uitvoeren. Deze rechten zijn opgeslagen in drie octetten, die weer in drie stukjes onderverdeeld zijn: één voor de eigenaar van het bestand, één voor de groep waar het bestand toe behoort en één voor de overigen. De numerieke weergave werkt als volgt:
| Waarde | Recht | Maprecht |
|---|---|---|
| 0 | Niet lezen, niet schrijven, niet uitvoeren | --- |
| 1 | Niet lezen, niet schrijven, uitvoeren | --x |
| 2 | Niet lezen, schrijven, niet uitvoeren | -w- |
| 3 | Niet lezen, schrijven, uitvoeren | -wx |
| 4 | Lezen, niet schrijven, niet uitvoeren | r-- |
| 5 | Lezen, niet schrijven, uitvoeren | r-x |
| 6 | Lezen, schrijven, niet uitvoeren | rw- |
| 7 | Lezen, schrijven, uitvoeren | rwx |
De -l optie kan gebruikt worden met ls(1) om een lange
lijst met de inhoud van een map te zien die een kolom heeft met informatie over
bestandsrechten voor de eigenaar, groep en de rest. ls -l in een
willekeurige map kan het volgende laten zien:
% ls -l total 530 -rw-r--r-- 1 root wheel 512 Sep 5 12:31 myfile -rw-r--r-- 1 root wheel 512 Sep 5 12:31 otherfile -rw-r--r-- 1 root wheel 7680 Sep 5 12:31 email.txt ...
Zo ziet de eerste kolom van ls -l eruit:
-rw-r--r--
Het eerste (meest linkse) karakter geeft aan of dit een reguliere bestand is, een map, een speciaal karakter component(!), een socket of een andere pseudo-file component(!). In dit geval betekent de - dat het een regulier bestand is. De volgende drie karakters, rw- in dit voorbeeld, geven de rechten voor de eigenaar van het bestand. De drie karakters r-- erna geven de rechten van voor de groep van het bestand. De overige drie karakters r-- tonen de rechten voor alle overige gebruikers. Een streepje betekent dat de rechten uitgeschakeld zijn. In het geval van dit bestand zijn de rechten zo ingesteld dat de eigenaar kan lezen en schrijven naar het bestand, de groep het bestand kan lezen, en alle overige gebruikers kunnen ook het bestand lezen. Volgens de tabel hierboven worden de rechten 644, waar de cijfers de drie stukjes van de rechten aangeven.
Dit is allemaal leuk en aardig, maar hoe controleert het systeem dan rechten voor apparaten? FreeBSD behandelt de meeste hardware apparaten als bestanden die door programma's kunnen worden geopend en gelezen, en waar data naar toe kan worden geschreven, net zoals elk ander bestand. Deze speciale apparaat bestanden worden bewaard in de map /dev.
Mappen worden ook behandeld als bestanden. Ze hebben lees, schrijf en uitvoerbare rechten. De uitvoerbare vlag voor een map heeft een klein verschil qua betekenis dan die voor gewone bestanden. Als een map als uitvoerbaar gemarkeerd is, betekent het dat erin gekeken mag worden. Het is dus mogelijk om te wisselen naar de map met cd (wissel van map). Dit betekent ook dat in de map bestanden benaderd kunnen worden waarvan de naam bekend is. Dit is natuurlijk afhankelijk van de rechten op het bestand zelf.
In het bijzonder, om een lijst van de map te kunnen maken, moet een gebruiker leesrechten op de map hebben. Om een bestand te verwijderen zijn de naam van het bestand en schrijf en uitvoerrechten op de map nodig waarin het bestand zich bevindt.
Er zijn meer rechtenvlaggen, maar die worden slechts gebruikt in speciale gevallen, zoals bij setuid binaries en sticky mappen. Meer informatie over bestandsrechten en hoe die aangepast kunnen worden staat in chmod(1).
Symbolische rechten, soms ook wel symbolische expressies, gebruiken karakters in plaats van octale getallen om rechten aan bestanden en mappen te geven. Symbolische expressies gebruiken de volgende opbouw: (wie) (actie) (permissies), waar de volgende waardes beschikbaar zijn:
| Optie | Letter | Vertegenwoordigt |
|---|---|---|
| (wie) | u | Gebruiker |
| (wie) | g | Groepseigenaar |
| (wie) | o | Overigen |
| (wie) | a | Iedereen (“wereld”) |
| (actie) | + | Rechten toevoegen |
| (actie) | - | Rechten verwijderen |
| (actie) | = | Stel deze rechten in |
| (recht) | r | Lezen |
| (recht) | w | Schrijven |
| (recht) | x | Uitvoeren |
| (recht) | t | Sticky bit |
| (recht) | s | Verander UID of GID |
Deze waardes worden gebruikt met chmod(1), net zoals eerder, alleen nu met letters. Het volgende commando kan gebruikt worden om de overige gebruikers toegang tot BESTAND te ontzeggen:
% chmod go= BESTAND
Er kan een door komma's gescheiden lijst geleverd worden als meer dan één wijziging aan een bestand moet worden uitgevoerd. Het volgende commando past de rechten voor de groep en de “wereld” aan door de schrijfrechten te ontnemen om daarna iedereen uitvoerrechten te geven:
% chmod go-w,a+x BESTAND
Naast de bestandsrechten die hiervoor zijn besproken, biedt FreeBSD ondersteuning voor “bestandsvlaggen.” Deze vlaggen bieden een aanvullend beveiligingsniveau en controle over bestanden, maar niet over mappen.
Bestandsvlaggen voegen een extra niveau van controle over bestanden, waardoor verzekerd kan worden dat in sommige gevallen zelfs root een bestand niet kan verwijderen of wijzigen.
Bestandsvlaggen worden gewijzigd met het hulpprogramma chflags(1), dat een eenvoudige interface heeft. Om bijvoorbeeld de systeemvlag niet verwijderdbaar in te stellen op het bestand file1:
# chflags sunlink file1
Om de vlag niet verwijderbaar weer te verwijderen kan het voorgaande commando met
“no” voor sunlink worden uitgevoerd:
# chflags nosunlink file1
Om de vlaggen op een bestand te bekijken, kan het ls(1) commando
met de vlaggen -lo gebruikt worden:
# ls -lo file1
De uitvoer hoort er ongeveer als volgt uit te zien:
-rw-r--r-- 1 trhodes trhodes sunlnk 0 Mar 1 05:54 file1
Een aantal vlaggen kan alleen ingesteld of verwijderd worden door de gebruiker root. In andere gevallen kan de eigenaar van een bestand vlaggen instellen. Meer informatie voor beheerders staat in chflags(1) en chflags(2).
Buiten de toestemmingen die reeds besproken zijn, zijn er nog drie specifieke instellingen waarvan alle beheerders kennis dienen te hebben. Dit zijn de setuid-, setgid-, en sticky toestemmingen.
Deze instellingen zijn belangrijk voor sommige UNIX-bewerkingen omdat ze functionaliteit bieden die normaliter niet aan normale gebruikers wordt gegeven. Om ze te begrijpen, dient ook het verschil tussen de echte gebruikers-ID en de effectieve gebruikers-ID opgemerkt te worden.
De echte gebruikers-ID is de UID die het proces start of bezit. De effectieve UID is de gebruikers-ID waaronder het proces draait. Bijvoorbeeld, het gereedschap passwd(1) draait met de echte gebruikers-ID van de gebruiker die het wachtwoord verandert; echter, om de database met wachtwoorden te manipuleren, draait het met de effectieve ID van de gebruiker root. Dit is wat normale gebruikers in staat stelt om hun wachtwoorden te veranderen zonder een fout “Permission Denied” te zien.
Opmerking: De mount(8)-optie nosuid zorgt ervoor dat deze binairen zwijgend falen. Dit houdt in dat ze niet worden uitgevoerd zonder ooit de gebruiker op de hoogte te stellen. Deze optie is ook niet geheel betrouwbaar aangezien een nosuid-wrapper dit volgens de handleidingpagina mount(8) kan omzeilen.
De setuid-toestemming kan aangezet worden door het cijfer vier (4) voor een toestemmingenverzameling te plaatsen zoals te zien is in het volgende voorbeeld:
# chmod 4755 suidvoorbeeld.sh
De toestemmingen op het bestand suidvoorbeeld.sh dienen er nu als volgt uit te zien:
-rwsr-xr-x 1 trhodes trhodes 63 Aug 29 06:36 suidvoorbeeld.sh
Het zou in dit voorbeeld te zien moeten zijn dat een s nu deel is van de toestemmingenverzameling bestemd voor de bestandseigenaar, en de uitvoerbare bit vervangt. Dit staat gereedschappen toe die verhoogde toestemmingen nodig hebben, zoals passwd.
Open twee terminals om dit in real-time te zien. Start op het ene het proces passwd als een normale gebruiker. Controleer de procestabel terwijl het op een nieuw wachtwoord wacht en kijk naar de gebruikersinformatie van het commando passwd.
In terminal A:
Changing local password for trhodes Old Password:
In terminal B:
# ps aux | grep passwd
trhodes 5232 0.0 0.2 3420 1608 0 R+ 2:10AM 0:00.00 grep passwd root 5211 0.0 0.2 3620 1724 2 I+ 2:09AM 0:00.01
Zoals boven vermeld, wordt passwd door een normale gebruiker gedraaid, maar gebruikt het de effectieve UID van root.
De setgid-toestemming voert dezelfde functie uit als de setuid-toestemming; behalve dat het de groepsinstellingen verandert. Wanneer een applicatie of gereedschap met deze instelling wordt gedraaid, krijgt het de toestemmingen gebaseerd op de groep die het bestand bezit, niet op de gebruiker die het proces startte.
Om de setgid-toestemming op een bestand aan te zetten, dient een voorlopende twee (2) aan het commando chmod gegeven te worden zoals in het volgende voorbeeld:
# chmod 2755 sgidvoorbeeld.sh
De nieuwe instelling kan zoals hierboven bekeken worden, merk op dat de s nu in het veld bestemd voor de instellingen van de groepstoestemmingen staat:
-rwxr-sr-x 1 trhodes trhodes 44 Aug 31 01:49 sgidvoorbeeld.sh
Opmerking: In deze voorbeelden zal het shellscript niet met een andere EUID of effectief gebruikers-ID draaien, zelfs al is het shellscript uitvoerbaar. Dit is omdat shellscripts geen toegang hebben tot de setuid(2)-systeemaanroepen.
De eerste twee speciale toestemmingsbits die we besproken hebben (de toestemmingsbits setuid en setgid) kunnen de systeemveiligheid verlagen, door verhoogde toestemmingen toe te staan. Er is een derde bit voor speciale toestemmingen die de veiligheid van een systeem kan verhogen: de klevende bit.
De klevende bit, wanneer deze op een map is ingesteld, staat alleen het verwijderen van bestanden toe door de eigenaar van die bestanden. Deze toestemmingenverzameling is nuttig om het verwijderen van bestanden in publieke mappen, zoals /tmp, door gebruikers die het bestand niet bezitten te voorkomen. Zet een één (1) voor de toestemming om deze toestemming te gebruiken. Bijvoorbeeld:
# chmod 1777 /tmp
Het effect kan nu met het commando ls bekeken worden:
# ls -al / | grep tmp
drwxrwxrwt 10 root wheel 512 Aug 31 01:49 tmp
De toestemming klevende bit is te onderscheiden met de t aan het einde van de verzameling.
De FreeBSD mappenstructuur is erg belangrijk om het systeem goed te leren kennen. Het belangrijkste concept om greep op te krijgen is die van de rootmap, “/”. Deze map is de eerste die gekoppeld wordt tijdens het opstarten en bevat het basissysteem dat nodig is om het besturingssysteem gereed te maken voor multi-user taken. De rootmap bevat ook koppelpunten voor elk ander bestandssysteem dat misschien gekoppeld wordt.
Een koppelpunt is een map waar extra bestandssystemen aan het een bestandssysteem
gekoppeld kunnen worden (meestal het root bestandssysteem). Dit wordt beschreven in Paragraaf 4.5. Standaard koppelpunten zijn /usr, /var, /tmp, /mnt en /cdrom. Naar deze mappen wordt meestal verwezen in /etc/fstab, een tabel met bestandssystemen en koppelpunten ter
referentie voor het systeem. De meeste bestandssystemen in /etc/fstab worden automatisch gekoppeld tijdens het opstarten door
het script rc(8), behalve als de
optie noauto gedefinieerd is. Details staan beschreven in Paragraaf 4.6.1.
Een complete beschrijving over het bestandssysteem staat in hier(7). Hier wordt volstaan met een overzicht van de voorkomende mappen.
| Map | Omschrijving |
|---|---|
| / | Rootmap van het bestandssysteem. |
| /bin/ | Gebruikersapplicaties, belangrijk voor zowel single user als multi-user omgevingen. |
| /boot/ | Programma's en instellingenbestanden die gebruikt worden tijdens het opstarten van het besturingssysteem. |
| /boot/defaults/ | Bestanden met standaardinstellingen voor opstarten;, zie loader.conf(5). |
| /dev/ | Apparaatnodes;, zie intro(4). |
| /etc/ | Bestanden met systeeminstellingen en scripts. |
| /etc/defaults/ | Bestanden met standaard systeeminstellingen;, zie rc(8). |
| /etc/mail/ | Instellingenbestanden voor mail transport programma's zoals sendmail(8). |
| /etc/namedb/ | Instellingenbestanden voor named, zie named(8). |
| /etc/periodic/ | Scripts die dagelijks, wekelijks en maandelijks via cron(8) worden uitgevoerd, zie periodic(8). |
| /etc/ppp/ | Instellingenbestanden voor ppp, zie ppp(8). |
| /mnt/ | Lege map, veel gebruikt door systeembeheerders als tijdelijk koppelpunt voor opslagruimtes. |
| /proc/ | Process bestandssysteem;, zie procfs(5) en mount_procfs(8). |
| /rescue/ | Statisch gelinkte programma's voor noodherstel, zie rescue(8). |
| /root/ | Thuismap van de gebruiker root. |
| /sbin/ | Systeemprogramma's en administratieprogramma's belangrijk voor zowel single-user en multi-user omgevingen. |
| /tmp/ | Tijdelijke bestanden. De inhoud van /tmp blijft meestal NIET bewaard na een herstart. Er wordt vaak een geheugengebaseerd bestandssysteem gekoppeld op /tmp. Dit kan geautomatiseerd worden met de tmpmfs-gerelateerde variabelen van rc.conf(5) (of met een regel in /etc/fstab). Zie mdmfs(8). |
| /usr/ | Hier bevindt zich het leeuwendeel van alle hulpprogramma's en gewone programma's. |
| /usr/bin/ | Standaard programma's, programmeertools. |
| /usr/include/ | Standaard C invoegbestanden. |
| /usr/lib/ | Functiebibliotheken. |
| /usr/libdata/ | Diverse databestanden voor hulpprogramma's. |
| /usr/libexec/ | Systeemdaemons en systeemhulpprogramma's (uitgevoerd door andere programma's). |
| /usr/local/ | Lokale programma's, bibliotheken, etc. Wordt ook gebruikt als standaard locatie voor de FreeBSD ports. Binnen /usr/local, wordt de algemene layout bepaald door hier(7), dat ook voor /usr wordt gebruikt. Uitzonderingen is de map man, die direct onder /usr/local ligt in plaats van onder /usr/local/share, en de documentatie voor ports is te vinden in share/doc/port. |
| /usr/obj/ | Architectuur afhankelijke doelstructuur voor resultaten van de bouw van /usr/src. |
| /usr/ports/ | De FreeBSD Portscollectie (optioneel). |
| /usr/sbin/ | Systeemdaemons en systeemhulpprogramma's (uitgevoerd door gebruikers). |
| /usr/share/ | Architectuur onafhankelijke bestanden. |
| /usr/src/ | BSD en/of lokale broncodebestanden. |
| /usr/X11R6/ | Uitvoerbare bestanden en bibliotheken, etc, voor de X11R6 distributie (optioneel). |
| /var/ | Multifunctionele logboek-, tijdelijke, transparante en spool bestanden. |
| /var/log/ | Diverse logboekbestanden van het systeem. |
| /var/mail/ | Postbusbestanden van gebruikers. |
| /var/spool/ | Diverse printer- en mailsysteemspoolingmappen. |
| /var/tmp/ | Tijdelijke bestanden die bewaard worden bij een herstart van het systeem. |
| /var/yp/ | NIS maps. |
De kleinste vorm van organisatie die FreeBSD gebruikt om bestanden te vinden is de bestandsnaam. Bestandsnamen zijn hoofdlettergevoelig, wat betekent dat readme.txt en README.TXT twee verschillende bestanden zijn. FreeBSD gebruikt de extensie niet (.txt) van een bestand om te bepalen of het bestand een programma, een document of een vorm van data is.
Bestanden worden bewaard in mappen. Een map kan leeg zijn of honderden bestanden bevatten. Een map kan ook andere mappen bevatten, wat het mogelijk maakt om een hiërarchie van mappen te maken. Dit maakt het veel makkelijker om data te organiseren.
Bestanden en mappen worden aangegeven door het bestand of de map aan te geven, gevolgd door een voorwaardse slash, /, gevolgd door andere mapnamen die nodig zijn. Als map foo de map bar bevat, die op zijn beurt het bestand readme.txt bevat, dan wordt de volledige naam of pad naar het bestand foo/bar/readme.txt.
Mappen en bestanden worden bewaard op een bestandssysteem. Elk bestandssysteem bevat precies één map op het hoogste niveau die de rootmap van het bestandssysteem heet. Deze rootmap kan op zijn beurt andere mappen bevatten.
Tot zover is dit waarschijnlijk hetzelfde als voor elk ander besturingssysteem. Er zijn een paar verschillen. MS-DOS gebruikt bijvoorbeeld een \ om bestanden en mappen te scheiden, terwijl Mac OS® gebruik maakt van :.
FreeBSD gebruikt geen schijfletters, of andere schijfnamen in het pad. FreeBSD gebruikt geen c:/foo/bar/readme.txt.
Eén bestandssysteem wordt aangewezen als root bestandssysteem, waar naar wordt verwezen met /. Elk ander bestandssysteem wordt daarna gekoppeld onder het root bestandssysteem. Hoeveel schijven er ook aan een FreeBSD systeem hangen, het lijkt alsof elke map zich op dezelfde schijf bevindt.
Stel er zijn drie bestandssystemen met de namen A,B en C. Elk bestandssysteem heeft één root map die twee andere mappen bevat, A1 en A2 (zo ook voor de andere twee: B1, B2, C1 en C2).
A wordt het root besturingsysteem. Met ls, dat de inhoud van de map kan tonen, zijn de twee mappen A1 en A2 te zien. De mappenstructuur ziet er als volgend uit:

Een bestandssysteem moet gekoppeld worden in een map op een ander bestandssysteem. Als nu bestandssysteem B wordt gekoppeld onder de map A1 vervangt B A1 en zien de koppelingen in B er als volgt uit:

Elk bestand dat in de mappen B1 en B2 aanwezig is, kan benaderd worden met het pad /A1/B1 of /A1/B2. Elk bestand dat in /A1 stond is tijdelijk verborgen en komt tevoorschijn als Bis ontkoppeldvan A.
Als B gekoppeld is onder A2 ziet de diagram er als volgt uit:

en de paden zouden dan respectievelijk /A2/B1 en /A2/B2 zijn.
Bestandssystemen kunnen op elkaar worden gekoppeld. Doorgaand op het vorige voorbeeld kan het bestandssysteem C gekoppeld worden bovenop de map B1 in het bestandssysteem B. Dit resulteert in:

Of C kan direct onder het bestandssysteem A gekoppeld worden, onder de map A1:

Hoewel het niet gelijk is, lijkt het op het gebruik van join in MS-DOS.
Beginnende gebruikers hoeven zich hier gewoonlijk niet mee bezig te houden. Normaal gesproken worden bestandssystemen gemaakt als FreeBSD wordt geïnstalleerd en er wordt besloten waar ze gekoppeld worden. Meestal worden ze ook niet gewijzigd tot er een nieuwe schijf aan een systeem wordt toegevoegd.
Het is mogelijk om één groot root bestandssysteem te hebben en geen andere. Deze benadering heeft voordelen en nadelen.
Voordelen van meerdere bestandssystemen
Verschillende bestandssystemen kunnen verschillende mount opties hebben. Met een goede voorbereiding kan het root bestandssysteem bijvoorbeeld als alleen-lezen gekoppeld worden, waardoor het onmogelijk wordt om per ongeluk kritische bestanden te verwijderen of te bewerken. Het scheiden van andere bestandssystemen die beschrijfbaar zijn door gebruikers, zoals /home van andere bestandssystemen stelt de beheerder in staat om ze nosuid te koppelen. Deze optie voorkomt dat suid/guid bits op uitvoerbare bestanden effectief gebruikt kunnen worden, waardoor de beveiliging mogelijk beter wordt.
FreeBSD optimaliseert automatisch de layout van bestanden op een bestandssysteem, afhankelijk van hoe het bestandssysteem wordt gebruikt. Een bestandsysteem dat veel bestanden bevat waar regelmatig naar geschreven wordt, wordt anders geoptimaliseerd dan een bestandssysteem dat minder maar grotere bestanden bevat. Door het gebruik van één groot bestandssysteem werkt deze optimalisatie niet.
FreeBSD's bestandssystemen zijn erg robuust als er bijvoorbeeld een stroomstoring is, hoewel een stroomstoring op een kritiek moment nog steeds kan leiden tot schade aan de structuur van het bestandssysteem. Door het verdelen van data over meerdere bestandssystemen, is de kans groter dat het systeem nog opstart, wat terugzetten van een backup makkelijker maakt als dat nodig is.
Voordeel van één bestandssysteem
Bestandssystemen hebben een vaste grootte. Als bij de installatie van FreeBSD een bestandssysteem wordt gemaakt, is het later mogelijk dat de partitie groter gemaakt moet worden. Dit is niet zo makkelijk zonder een backup, het opnieuw maken van het bestandssysteem met gewijzigde grootte en het terugzetten van de gebackupte data.
Belangrijk: FreeBSD heeft growfs(8) waarmee de grootte van het bestandssysteem is aan te passen terwijl het draait.
Bestandssystemen worden opgeslagen in partities. Dit betekent niet hetzelfde als de algemene betekenis van de term partitie (bijvoorbeeld, MS-DOS partitie), vanwege FreeBSD's UNIX achtergrond. Elke partitie wordt geïdentificeerd door een letter van a tot en met h. Elke partitie kan slechts één bestandssysteem hebben, wat betekent dat bestandssystem vaak omschreven worden aan de hand van hun koppelpunt in de bestandssysteem hiërarchie of de letter van de partitie waar ze in opgeslagen zijn.
FreeBSD gebruikt ook schijfruimte voor wisselbestanden. Wisselbestanden geven FreeBSD virtueel geheugen. Dit geeft de computer de mogelijkheid om net te doen alsof er veel meer geheugen in de machine aanwezig is dan werkelijk het geval is. Als FreeBSD geen geheugen meer heeft, verplaatst het data die op dat moment niet gebruikt wordt naar de wisselbestanden en plaatst het terug als het wel nodig is (en zet iets anders in ruil daarvoor terug).
Aan sommige partities zijn bepaalde conventies gekoppeld.
| Partitie | Conventie |
|---|---|
| a | Bevat meestal het root bestandssysteem |
| b | Bevat meestal de swapruimte |
| c | Heeft meestal dezelfde grootte als de hele harde schijf. Dit geeft hulpprogramma's de mogelijkheid om op een complete schijf te werken (voor bijvoorbeeld een bad block scanner) om te werken op de c partitie. Meest wordt hierop dan ook geen bestandssysteem gecreeërd. |
| d | Partitie d had vroeger een speciale betekenis, maar die is verdwenen. d zou nu kunnen werken als een normale partitie. |
Elke partitie die een bestandssysteem bevat is opgeslagen in wat FreeBSD noemt een slice. Slice is FreeBSD's term voor wat meeste mensen partities noemen. Dit komt wederom door FreeBSD's UNIX achtergrond. Slices zijn genummerd van 1 tot en met 4.
Slicenummers volgen de apparaatnamen, voorafgegaan door een s die begint bij 1. Dus “da0s1” is de eerste slice op de eerste SCSI drive. Er kunnen maximaal vier fysieke slices op een schijf staan, maar er kunnen logische slices in fysieke slices van het correcte type staan. Deze uitgebreide slices zijn genummerd vanaf 5. Dus “ad0s5” is de eerste uitgebreide slice op de eerste IDE schijf. Deze apparaten worden gebruikt door bestandssystemen waarvan verwacht wordt dat ze een slice in beslag nemen.
Slices, “gevaarlijk toegewijde” (dangerously dedicated) fysieke drivers en andere drives bevatten partities, die worden weergegeven door letters vanaf a tot h. Deze letter wordt achter de apparaatnaam geplakt. Dus “da0a” is de a partitie op de eerste da drive, die “gevaarlijk toegewijd” is. “ad1s3e” is de vijfde partitie op de derde slice van de tweede IDE schijf.
Elke schijf op het systeem wordt geïdentificeerd. Een schijfnaam start met een code die het type aangeeft en dan een nummer dat aangeeft welke schijf het is. In tegenstelling tot bij slices, start het nummeren van schijven bij 0. Standaardcodes staan beschreven in Tabel 4-1.
Bij een referentie aan een partitie verwacht FreeBSD ook dat de slice en schijf refereert naar die partitie en als naar een slice wordt verwezen moet ook de schijfnaam genoemd worden. Dit kan door de schijfnaam, s, het slice nummer en de partitieletter aan te geven. Voorbeelden staan in Voorbeeld 4-1.
In Voorbeeld 4-2 staat een conceptmodel van een schijflayout die een en ander verduidelijkt.
Voordat FreeBSD geïnstalleerd kan worden moeten eerst de schijfslices gemaakt worden en daarna moeten de partities op de slices voor FreeBSD gemaakt worden. Daarna wordt op elke partitie het bestandssysteem (of wisselbestand) gemaakt en als laatste wordt besloten waar het filesysteem gekoppeld wordt.
Tabel 4-1. Schijf apparaatcodes
| Code | Betekenis |
|---|---|
| ad | ATAPI (IDE) schijf |
| da | SCSI directe toegang schijf |
| acd | ATAPI (IDE) CDROM |
| cd | SCSI CDROM |
| fd | Floppydisk |
Voorbeeld 4-2. Conceptmodel van een schijf
Het onderstaande diagram geeft aan hoe FreeBSD de eerste IDE schijf in het systeem ziet. Stel dat de schijf 4 GB groot is en dat deze twee 2 GB slices (MS-DOS partities) bevat. De eerste slice bevat een MS-DOS schijf, C: en de tweede slice bevat een FreeBSD installatie. Deze FreeBSD installatie heeft drie partities en een partitie met een wisselbestand.
De drie partities hebben elk een bestandssysteem. Partitie a wordt gebruikt voor het root bestandssysteem, e voor de map /var en f voor de map /usr.

Het bestandssysteem wordt het best weergegeven als een boom, met de stam als /. /dev, /usr en de andere map in root zijn takken die weer hun eigen takken kunnen hebben, zoals /usr/local, etc.
Er zijn verschillende redenen om sommige van deze mappen op aparte bestandssystemen te plaatsen. /var bevat de mappen log/, spool/ en verschillende types tijdelijke bestanden en kan volraken. Het laten vollopen van het root bestandssysteem is geen goed idee, dus het splitsen van /var van /is vaak de favoriet.
Een andere vaak voorkomende reden om bepaalde mapbomen op aparte bestandssystemen te plaatsen, is om ze op verschillende fysieke schrijven te zetten of gescheiden virtuele schijven zoals gemounte Netwerk bestandssystemen of cd-rom drives.
Tijdens het opstartproces, worden bestandssystemen die
vermeld staan in /etc/fstab automatisch gekoppeld
(tenzij ze vermeld staan met noauto).
/etc/fstab bevat een lijst van regels die aan het volgende formaat voldoen:
apparaat /koppelpunt fstype opties dumpfreq passno
Een apparaatnaam (die moet bestaan) zoals uitgelegd in Paragraaf 19.2.
Een map (die moet bestaan) waarop het bestandssysteem gekoppeld moet worden.
Het bestandssysteem type dat aan mount(8) gegeven wordt. Het standaard FreeBSD bestandssysteem is ufs.
Dit is of rw voor lezen en schrijven
bestandssytemen, of ro voor alleen lezen, gevolgd door
elke andere optie die mogelijk nodig is. Een standaard optie is noauto voor bestandssystemen die niet automatisch gekoppeld
worden tijdens het opstarten. Andere opties staan in mount(8).
Dit wordt gebruikt door dump(8) om te bepalen welke bestandssystemen gedumpt moeten worden. Als het veld niet is ingevuld, wordt aangenomen dat er een nul staat.
Dit bepaalt in welke volgorde bestandssystemen gecontroleerd moeten worden. Bestandssystemen die overgeslagen moeten worden moeten hun passno waarde op nul hebben staan. Voor het root bestandssysteem (dat voor alle andere gecontroleerd moet worden) moet passno op één staan en passno waarden voor andere bestandssystemen moeten een waarde hebben groter dan één. Als bestandssysteem dezelfde passno waarde hebben probeert fsck(8) deze bestandssystemen tegelijkertijd te controleren.
In fstab(5) staat meer informatie over de opmaak van /etc/fstab en de mogelijke opties.
mount(8) wordt gebruikt om bestandsystemen te koppelen.
De meest eenvoudige vorm is:
Alle opties voor het commando staat in mount(8), maar de meest voorkomende zijn:
Mountopties
-aMount alle bestandssystemen die in /etc/fstab staan,
behalve die gemarkeerd staan als “noauto”, uitgesloten zijn door
de optie -t of die al gekoppeld zijn.
-dDoe alles behalve het echt aanroepen van de systeemopdracht mount. Deze optie is handig in samen met de optie -v om te bepalen wat mount(8)
eigenlijk probeert te doen.
-fForceert het koppelen van een niet schoon bestandssysteem (gevaarlijk) of forceert het innemen van schrijftoegang als de koppelstatus van een bestandssysteem wijzigt van lezen en schrijven naar alleen lezen.
-rMount het bestandssysteem alleen lezen. Dit is identiek aan de optie ro voor de optie -o.
-t fstypeMount het opgegeven bestandssysteem als het opgegeven type bestandssysteem of
koppelt alleen bestandssystemen van het aangegeven type als ook de optie
-a is opgegeven.
“ufs” is het standaard bestandssysteem.
-uWerk koppel opties van het bestandssysteem bij.
-vGeef uitgebreide informatie (verbose).
-wMount het bestandssysteem lezen en schrijven.
De optie -o accepteert een door komma's gescheiden
lijst van opties, waaronder de volgende:
Sta geen uitvoerbare bestanden toe op dit bestandssysteem. Ook dit is een nuttige veiligheidsoptie.
Interpreteer geen setuid of setgid opties op het bestandssysteem. Ook dit is een nuttige veiligheidsoptie.
umount(8) heeft een
koppelpunt, een apparaatnaam, -a of -A als parameter.
Alle vormen kunnen de optie -f hebben om een
bestandsysteem te forceren te ontkoppelen en de optie -v
voor uitgebreide informatie. De optie -f is meestal geen
goed idee. Forceren dat een bestandssysteem ontkoppeld wordt kan de computer laten
crashen of data op het bestandssysteem beschadigen.
De opties -a en -A worden
gebruikt om alle bestandssystemen te unmounten, mogelijk nader gespecificeerd door
de optie -t met daarachter op welke typen
bestandssystemen het betrekking heeft. Voor de optie -A
geldt dat deze niet probeert het root bestandssysteem te ontkoppelen.
FreeBSD is een multi-tasking besturingssysteem. Dit betekent dat het lijkt alsof er meer dan één proces tegelijkertijd draait. Elk programma dat draait wordt een proces genoemd. Elk commando dat wordt uitgevoerd start op zijn minst één nieuw proces en er zijn systeemprocessen die continu draaien om het systeem functioneel te houden.
Elk proces wordt geïdentificeerd door een nummer dat process ID of PID heet, en net zoals bij bestanden heeft elk proces één eigenaar en groep. De eigenaars- en groepsinformatie wordt gebruikt om te bepalen welke bestanden en apparaten het proces mag openen, waarbij gebruik wordt gemaakt van de bestandsrechten die eerder zijn behandeld. Veel processen hebben ook een ouderproces (parent process). Een ouderproces is een proces dat het nieuwe proces heeft gestart. Als commando's in een shell worden ingevoerd, start de shell een proces en elk commando dat draait is ook een proces. De uitzondering hierop is het speciale proces init(8). init is altijd het eerste proces, dus het PID is altijd 1. init wordt automatisch gestart door de kernel als FreeBSD opstart.
Twee commando's die erg handig zijn om te zien welke processen er draaien zijn ps(1) en top(1). ps wordt gebruikt om een statische lijst op te vragen van de processen die op het moment van uitvoeren draaien en kan hun PID, geheugengebruik, de startende commandoregel, enzovoort, tonen. top geeft alle draaiende processen weer en werkt de status elke paar seconden bij zodat interactief wordt weergegeven wat een computer aan het doen is.
Standaard laat ps alleen zien welke commando's draaien waarvan de gebruiker die het uitvoert de eigenaar is:
% ps PID TT STAT TIME COMMAND 298 p0 Ss 0:01.10 tcsh 7078 p0 S 2:40.88 xemacs mdoc.xsl (xemacs-21.1.14) 37393 p0 I 0:03.11 xemacs freebsd.dsl (xemacs-21.1.14) 48630 p0 S 2:50.89 /usr/local/lib/netscape-linux/navigator-linux-4.77.bi 48730 p0 IW 0:00.00 (dns helper) (navigator-linux-) 72210 p0 R+ 0:00.00 ps 390 p1 Is 0:01.14 tcsh 7059 p2 Is+ 1:36.18 /usr/local/bin/mutt -y 6688 p3 IWs 0:00.00 tcsh 10735 p4 IWs 0:00.00 tcsh 20256 p5 IWs 0:00.00 tcsh 262 v0 IWs 0:00.00 -tcsh (tcsh) 270 v0 IW+ 0:00.00 /bin/sh /usr/X11R6/bin/startx -- -bpp 16 280 v0 IW+ 0:00.00 xinit /home/nik/.xinitrc -- -bpp 16 284 v0 IW 0:00.00 /bin/sh /home/nik/.xinitrc 285 v0 S 0:38.45 /usr/X11R6/bin/sawfish
In het bovenstaande voorbeeld is de uitvoer van ps(1) georganiseerd in een aantal kolommen. PID is het proces ID. PIDs worden toegekend vanaf 1 en lopen op tot 99999. Als ze allemaal zijn gebruikt, worden ze hergebruikt. (een PID wordt niet hergebruikt als deze reeds in gebruik is). De TT kolom toont de tty vanwaar het programma draait en wordt nu buiten beschouwing gelaten. STAT toont de huidige staat van het programma en ook deze kolom wordt buiten beschouwing gelaten. TIME is de hoeveelheid tijd die het programma gedraaid heeft op de CPU. Dit is meestal niet de verstreken tijd vanaf het moment dat het programma is gestart. Veel programma's wachten omdat er alleen gebruik wordt gemaakt van de CPU als er iets voor het programma te doen is. Als laatste is COMMAND de commandoregel die gebruikt is om het programma te starten.
ps(1) ondersteunt een
aantal opties die de informatie wijzigen die wordt weergegeven. Één van de
meest nuttige combinaties is auxww. De optie a toont informatie over alle draaiende processen, niet alleen die
van de gebruiker die is aangemeld. De optie u toont de
gebruikersnaam van de proceseigenaar, evenals geheugengebruik. De optie x toont informatie over daemonprocessen en met de optie ww laat ps(1) de volledige
commandoregel zien voor elk proces, in plaats van een mogelijk afgekorte regel omdat die
te lang is om op het scherm te passsen.
De uitvoer van top(1) is hetzelfde:
% top last pid: 72257; load averages: 0.13, 0.09, 0.03 up 0+13:38:33 22:39:10 47 processes: 1 running, 46 sleeping CPU states: 12.6% user, 0.0% nice, 7.8% system, 0.0% interrupt, 79.7% idle Mem: 36M Active, 5256K Inact, 13M Wired, 6312K Cache, 15M Buf, 408K Free Swap: 256M Total, 38M Used, 217M Free, 15% Inuse PID USERNAME PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND 72257 nik 28 0 1960K 1044K RUN 0:00 14.86% 1.42% top 7078 nik 2 0 15280K 10960K select 2:54 0.88% 0.88% xemacs-21.1.14 281 nik 2 0 18636K 7112K select 5:36 0.73% 0.73% XF86_SVGA 296 nik 2 0 3240K 1644K select 0:12 0.05% 0.05% xterm 48630 nik 2 0 29816K 9148K select 3:18 0.00% 0.00% navigator-linu 175 root 2 0 924K 252K select 1:41 0.00% 0.00% syslogd 7059 nik 2 0 7260K 4644K poll 1:38 0.00% 0.00% mutt ...
De uitvoer is gesplitst in twee secties. De kop (de eerste vijf regels) toont het laatst uitgegeven PID, de gemiddelde systeembelasting (hoe druk is een systeem), de uptime van het systeem (tijd verstreken sinds laatste reboot) en de huidige tijd. De andere cijfers in de kop tonen hoeveel processen er draaien (in dit geval 47) , hoeveel geheugen en swap er gebruikt wordt en hoeveel processortijd het systeem besteed aan verschillende taakgroepen.
Daaronder staat een serie van kolommen die soortgelijke informatie bevatten als de uitvoer van ps(1). Zo zijn het PID, de gebruikersnaam, de hoeveelheid processortijd en het commando dat gebruikt is om het proces te starten te zien. top(1) laat standaard ook zien hoeveel geheugen er gebruikt wordt door een proces. Dit staat in twee kolommen waarbij in de eerste kolom het maximale geheugengebruik wordt getoond en in de tweede kolom het huidige geheugengebruik. Maximale gebruik is de hoeveelheid geheugen die het proces nodig had in de tijd dat het bestaat en het residente gebruik is hoeveel er op het moment van weergeven gebruikt wordt. In dit voorbeeld is zichtbaar dat Netscape® bijna 30 MB RAM nodig had, maar op het moment van uitvoeren 9 MB verbruikt.
top(1) werkt het beeld
automatisch iedere twee seconden bij. Dat kan gewijzigd worden met de optie s.
Als een gebruiker een editor draait is het makkelijk om de editor te besturen, te vertellen om bestanden te openen, etc. Dit kan omdat de editor de mogelijkheden geeft om dat te doen en omdat de editor gekoppeld is aan een terminal. Sommige programma's zijn niet ontworpen om te draaien met continue gebruikersinvoer, dus als zij de kans krijgen ontkoppelen zij zich van de terminal. Een webserver reageert bijvoorbeeld de hele dag op webaanvragen en heeft eigenlijk geen input van een lokale gebruiker nodig. Programma's die email van locatie naar locatie transporteren zijn een ander voorbeeld.
Deze programma's heten daemons. Daemons waren karakters in de Griekste mythologie, goed noch slecht, ze waren dienende geesten die op grote schaal nuttige dingen deden voor de mensheid. Net zoals de huidige webservers en mailservers nuttige dingen doen. Dit is waarom de mascotte voor BSD al lang een vrolijk kijkende daemon met puntoren en een drietand is.
Er is een overeenkomst om programma's die meestal draaien als daemon te voorzien van het achtervoegsel “d”. BIND is de Berkeley Internet Name Domain (het echte programma heet named), de Apache webserver heet httpd, de printerspooldriver heet lpd, etc. Deze overeenkomst geldt niet altijd. De hoofd maildaemon voor Sendmail heet bijvoorbeeld sendmail en niet maild.
Soms is communicatie met een daemon nodig. Een manier om dit te doen is het versturen van een signaal (signals). Er zijn een verschillende signalen. Sommige hebben een specifieke bedoeling, andere worden geïntrepeteerd door de applicatie. In de documentatie van de applicatie staat hoe de applicatie signalen intrepeteert. Er kan alleen een signaal naar een proces gezonden worden waar de uitvoerende gebruiker eigenaar van is. Als met kill(1) of kill(2) een signaal naar een proces van een andere gebruiker wordt gestuurd, wordt de toegang geweigerd. De enige uitzondering hierop is de root gebruiker, die signalen naar processen van alle gebruikers kan sturen.
FreeBSD stuurt soms ook signalen naar applicaties. Als een applicatie slecht geschreven is en hij probeert geheugen te benaderen waar hij niet naartoe mag, stuurt FreeBSD het proces een Segmentation Violation signaal (SIGSEGV). Als een applicatie de systeemaanroep alarm(3) heeft gebruikt om na een bepaalde periode een alarm te ontvangen, wordt er een Alarm signaal heen gestuurd (SIGALRM), etc.
Twee signalen kunnen gebruikt worden om een proces te stoppen: SIGTERM en SIGKILL. SIGTERM is de nette manier om een proces te killen. Het proces kan het signaal afvangen, begrijpen dat de eigenaar wil dat het wordt afgesloten, wellicht logboekbestanden sluiten die geopend zijn en alle onderhanden activiteiten afhandelen. In een aantal gevallen kan een proces SIGTERM negeren: als het midden in een taak zit die niet beëindigd kan worden.
SIGKILL mag niet worden genegeerd door een proces. Dit is het “Wat je ook aan het doen bent, stop er nu mee” signaal. Na een SIGKILL stopt FreeBSD het proces meteen. [4]
Andere veelgebruikte signalen zijn SIGHUP, SIGUSR1 en SIGUSR2. Dit zijn algemeen bruikbare signalen en verschillende applicaties zullen verschillend reageren als ze verstuurd worden.
Stel dat het bestand met instellingen voor de webserver is aangepast. Dan moet aan de webserver verteld worden dat die de instellingen opnieuw moet lezen. Hiervoor zou httpd gestopt en gestart kunnen worden, maar dit resulteert in een korte onderbreking van de webserverdienst, wat ongewenst kan zijn. De meeste daemons zijn geschreven om te reageren op het SIGHUP signaal door het opnieuw inlezen van het instellingenbestand. Dus in plaats van het stoppen en herstarten van httpd kan het SIGHUP signaal gezonden worden. Omdat er geen standaard manier is om op deze signalen te reageren, reageren verschillende daemons anders. Het is verstandig eerst de documentatie van de daemon in kwestie te lezen.
Zoals onderstaand voorbeeld laat zien, worden signalen door kill(1) verzonden.
Het versturen van een signaal naar een proces
Dit voorbeeld toont hoe een signaal naar inetd(8) wordt verstuurd. Het bestand met instellingen voor inetd is /etc/inetd.conf en inetd leest dit bestand opnieuw in als er een SIGHUP wordt verstuurd.
Eerst moet het proces ID worden opgezocht van het proces waar een signaal naar
verzonden moeten worden. Dit kan door ps(1) en grep(1) te gebruiken.
grep(1) wordt
gebruikt om in de uitvoer te zoeken en te kijken naar de string die de gebruiker
opgeeft. Dit commando wordt gedraaid als een normale gebruiker en inetd(8) wordt
gedraaid onder de gebruiker root, dus aan ps(1) moet de optie
ax meegegeven worden.
% ps -ax | grep inetd 198 ?? IWs 0:00.00 inetd -wW
Dus PID van inetd(8) is 198. In sommige gevallen kan grep inetd ook voorkomen in de uitvoer. Dit komt door de manier waarop ps(1) de lijst van draaiende processen moet vinden.
Met kill(1) kan het signaal verzonden worden. Omdat inetd(8) wordt gedraaid door root moet su(1) gebruikt worden om root te worden.
% su Password: # /bin/kill -s HUP 198
Zoals zovaak met UNIX commando's, geeft kill(1) geen uitvoer als het succesvol uitgevoerd is. Als een signaal wordt verzonden naar een proces waarvan de gebruiker niet zelf de eigenaar is, dan is de melding: “kill: PID: Operation not permitted”. Als het PID verkeerd wordt ingevuld, wordt het signaal naar het verkeerde proces verzonden, wat slecht kan zijn, of, als de gebruiker geluk heeft, wordt het verzonden naar een PID dat momenteel niet in gebruik is, waarop de foutmelding “kill: PID: No such process” verschijnt.
Waarom /bin/kill gebruiken?: Veel shells leveren kill als ingebouwd commando. Dat betekent dat de shell het signaal direct verstuurt in plaats van door het starten van /bin/kill. Dit kan erg nuttig zijn, maar verschillende shells hebben een verschillende opdrachtregel voor het specificeren van de naam van het signaal dat verstuurd moet worden. In plaats van ze allemaal te leren, is het eenvoudiger om gewoon /bin/kill PID te gebruiken.
Andere signalen versturen werkt bijna hetzelfde door TERM of KILL op de commandoregel te vervangen door wat nodig is.
Belangrijk: Het stoppen van willekeurige processen op een systeem is meestal een slecht idee. In het bijzonder bij init(8) met proces ID 1. Het draaien van /bin/kill -s KILL 1 is een snelle manier om een systeem uit te zetten. Argumenten die aan kill(1) worden meegegeven moeten altijd twee keer gecontroleerd worden voordat op Enter gedrukt wordt.
In FreeBSD wordt een groot deel van het alledaagse werk gedaan vanuit een omgeving met een commandoregel die shell heet. De grootste taak van een shell is om commando's van het invoerkanaal op te vangen en deze uit te voeren. Veel shells hebben ook functies ingebouwd om mee te helpen om alledaagse taken zoals bestandsbeheer, bestandsglobbing, bestanden wijzigen vanaf de commandoregel, commandomacro's schrijven en uitvoeren en omgevingsvariabelen instellen en wijzigen. FreeBSD heeft een aantal shells bijgeleverd zoals sh, de Bourne Shell en tcsh, de verbeterde C-shell. Er zijn veel andere shells beschikbaar in de FreeBSD Portscollectie zoals zsh en bash.
Welke shell gebruiken? Dit is een kwestie van smaak. Een C-programmeur voelt zich misschien prettiger bij een C-achtige shell, zoals tcsh. Een voormalig Linux gebruiker of iemand die niet veel ervaring heeft met een UNIX commandoregel interface wil misschien bash proberen. Elke shell heeft zijn eigen unieke eigenschappen die wel of niet werken voor een bepaalde gebruiker.
Een standaard optie in een shell is bestandsnaam completie. Door het intikken van de eerste paar letters van een commando of bestandsnaam, kan de shell opdracht gegeven worden om automatisch de rest het commando of bestandsnaam toe te voegen met de Tab toets op het toetsenbord. Stel dat er twee bestanden zijn met de namen foobar en foo.bar en foo.bar moet verwijderd worden. Dan kan op het toetsenbord rm fo[Tab].[Tab] ingevoerd worden.
De shell geeft rm foo[BEEP].bar weer.
De [BEEP] geeft aan dat de shell in staat was om de bestandsnaam te completeren omdat er meer dan één soortgelijk bestand was. foobar en foo.bar beginnen met fo, maar het was in staat om het af te maken tot foo. Na het invoeren van een . en daarna Tab, is de shell in staat om de rest van de bestandsnaam aan te vullen.
Een andere optie van de shell is het gebruik van omgevingsvariabelen. Omgevingsvariabelen zijn variabele sleutelparen die opgeslagen zijn in de omgevingsruimte van een shell. Deze ruimte kan uitgelezen worden door elk programma dat door de shell wordt uitgevoerd en bevat dus veel programmainstellingen. Hieronder staat een lijst van standaard omgevingsvariabelen en wat ze betekenen:
| Variabele | Omschrijving |
|---|---|
| USER | Gebruikersnaam van de gebruiker die is aangemeld. |
| PATH | Een lijst van mappen, gescheiden door een : voor het zoeken naar binaire bestanden. |
| DISPLAY | Netwerknaam van het X11 scherm om verbinding mee te maken, indien beschikbaar. |
| SHELL | De huidige shell. |
| TERM | De naam van de huidige gebruikersterminal. Gebruikt om de mogelijkheden van de terminal te bepalen. |
| TERMCAP | Databaseregel met terminal escape codes voor het uitvoeren van diverse terminalfuncties. |
| OSTYPE | Type besturingssysteem, bijvoorbeeld FreeBSD. |
| MACHTYPE | De CPU architectuur waar het systeem op draait. |
| EDITOR | De teksteditor waar de gebruiker de voorkeur aan geeft. |
| PAGER | De tekstpager waar de gebruiker de voorkeur aan geeft. |
| MANPATH | Lijst van mappen gescheiden door een : voor het zoeken naar handleidingen. |
Het instellen van omgevingsvariabelen verschilt van shell tot shell. In de C-achtige shells zoals tcsh en csh moet setenv gebruikt worden om omgevingsvariabelen in te stellen. In Bourne-shells zoals sh en bash moet export gebruikt worden om de omgevingsvariabelen in te stellen. Om bijvoorbeeld de omgevingsvariabele EDITOR te wijzigen naar /usr/local/bin/emacs onder csh of tcsh moet het volgende gedaan worden:
% setenv EDITOR /usr/local/bin/emacs
In Bourne shells is dat:
% export EDITOR="/usr/local/bin/emacs"
Met de meeste shells kunnen de omgevingsvariabelen ook weergegeven worden door een $ karakter voor de variabelenaam te plaatsen op de commandoregel. echo $TERM zou weergeven wat er in $TERM gezet is, omdat de shell $TERM uitbreid en het resultaat doorgeeft aan echo.
Shells kennen veel speciale karakters, die meta-karakters heten, als speciale weergaves van data. De meest voorkomende is het karakter * karakter, dat elk karakter in een bestandsnaam voorstelt. Deze speciale meta-karakters kunnen gebruikt worden om bestandsnaamglobbing te doen. Door bijvoorbeeld echo * in te voeren, is het resultaat bijna hetzelfde als door het uitvoeren van ls, omdat de shell alle bestanden die van toepassing zijn aan echo geeft om ze daarna te tonen.
Om te voorkomen dat de shell deze speciale tekens verwerkt, kunnen ze uitgeschakeld worden door er het backslash karakter (\) voor te plaatsen. echo $TERM print de inhoud van TERM naar het scherm. echo \$TERM print $TERM zoals het geschreven is.
De makkelijkste manier om de shell te wijzigen is door het chsh commando te gebruiken. Door chsh te starten wordt de editor gestart die in de EDITOR omgevingsvariable staat. Als deze niet is ingesteld, wordt vi gestart. In de editor kan de regel waarop “Shell:” staat gewijzigd worden.
Aan chsh kan ook de optie -s
meegegeven worden. Dit stelt de shell in, zonder dat een editor gebruikt hoeft te
worden. Als de shell bijvoorbeeld gewijzigd moet worden in bash, kan dat als volgt:
% chsh -s /usr/local/bin/bash
Opmerking: De te gebruiken shell moet geregistreerd zijn in /etc/shells. Als een shell uit de Portscollectie is geïnstalleerd, is dit meestal automatisch gebeurd. Als de shell met de hand is geïnstalleerd moet het onderstaande gedaan worden.
Als bijvoorbeeld bash met de hand geïnstalleerd is in /usr/local/bin, dient het onderstaande te gebeuren:
# echo "/usr/local/bin/bash" >> /etc/shellsHierna kan chsh weer gedraaid worden.
Een groot deel van de instellingen in FreeBSD wordt gemaakt door het bewerken van tekstbestanden. Hierdoor is het een goed idee om bekend te zijn met een tekstverwerker. FreeBSD heeft er een paar in het basissysteem en veel anderen zijn beschikbaar via de Portscollectie.
De makkelijkste en simpelste editor om te leren is de editor ee, wat “easy editor” betekent. Om ee te starten, moet op de commandoregel ee bestandsnaam ingevoerd worden, waar bestandsnaam de naam is van het bestand dat bewerkt moet worden. Om bijvoorbeeld /etc/rc.conf te bewerken, wordt ee /etc/rc.conf ingegeven. Eenmaal in ee worden alle manipulatie commando's die de editor heeft weergegeven aan de bovenkant van het scherm. Het karakter dakje ^ staat voor de toets CTRL op het toetsenbord, dus ^e vormt de toetscombinatie Ctrl+e. Om uit ee te komen wordt op de toets Esc gedrukt en daar kan gekozen worden om de editor te verlaten. De editor vraagt dan of de wijzigingen bewaard moeten worden als het bestand veranderd is.
FreeBSD heeft ook uitgebreidere tekstverwerkers, zoals vi, in het basissysteem en andere editors als Emacs en vim maken onderdeel uit van de FreeBSD Portscollectie (editors/emacs en editors/vim). Deze editors leveren veel meer functionaliteit en kracht maar zijn lastiger om te leren. Als echter veel met tekstverwerking gedaan wordt, is het leren van een krachtige editor als vim of Emacs verstandig omdat deze uiteindelijk veel tijd kan besparen.
Veel applicaties die bestanden wijzigen of getypte invoer nodig hebben zullen automatisch een tekstverwerker openen. Om de tekstverwerker te wijzigen die standaard wordt gebruikt, stelt u de omgevingsvariabele EDITOR in. Zie de sectie shells voor meer details.
Apparaat is een term die meestal wordt gebruikt voor hardwareonderdelen in een systeem, zoals schijven, printers grafische kaarten en toetsenborden. Als FreeBSD opstart laat het vooral zien welke apparaten gedetecteerd worden. Deze opstartmeldingen kunnen nagekeken worden door het bestand /var/run/dmesg.boot te bekijken.
acd0 is bijvoorbeeld de eerste IDE cd-rom drive, terwijl kbd0 staat voor het toetsenbord.
Veel van deze apparaten moeten in een UNIX besturingssysteem benaderd worden via speciale bestanden die apparaatnodes heten en te vinden zijn in de map /dev.
Als een nieuw apparaat wordt toegevoegd aan een systeem of als ondersteuning voor extra apparaten wordt gecompileerd, dan moeten er misschien nieuwe apparaat nodes aangemaakt worden.
Het apparaatbestandssysteem of DEVFS, levert toegang tot de apparaatruimte van de kernel in het globale bestandssysteem. In plaats van dat het nodig is om apparaatnodes te maken en te wijzigen, doet DEVFS dit.
In devfs(5) staat meer informatie.
Om te kunnen begrijpen waarom FreeBSD gebruik maakt van het elf(5) formaat, is het belangrijk op de hoogte zijn van de drie “dominante” uitvoerbare formaten voor UNIX:
Het oudste en “klassieke” UNIX object formaat. Het gebruikt een korte en compacte kop met een magisch nummer aan het begin dat veel gebruikt wordt om het formaat aan te geven (a.out(5) geeft meer details). Het bevat drie laadbare segmenten: .tekst, .data en .bss, een symbolentabel en een stringtabel.
COFF
Het SVR3 object formaat. De kop bestaat uit een sectietabel, dus er kunnen meer dan alleen .tekst, .data, en .bss secties zijn.
De opvolger van COFF, heeft meerdere secties en 32-bit of 64-bit als mogelijke waarden. Één nadeel: ELF was ook ontworpen met de aanname dat er maar één ABI per systeemarchitectuur zou zijn. Deze aanname is eigenlijk redelijk incorrect, zelfs niet in de commerciële SYSV wereld (die op zijn minst drie ABIs heeft: SRV4, Solaris en SCO).
FreeBSD probeert om dit probleem heen te werken door een hulpprogramma te leveren voor het brandmerken van een bekend ELF uitvoerbaar bestand met informatie over de ABI waar hij mee kan werken. In brandelf(1) staat meer informatie.
FreeBSD komt uit het “klassieke” kamp en gebruikt het a.out(5) formaat, een technologie die zich bewezen heeft door meerdere generaties van BSD versies heen, tot het begin van de 3.X versies. Alhoewel het al mogelijk was om ELF programma's en kernels te bouwen en te draaien op een FreeBSD systeem , verzette FreeBSD zich eerst tegen de druk om over te schakelen naar ELF als standaard formaat. Waarom? Toen het Linux kamp hun pijnlijke wissel maakte naar ELF, was dat niet zozeer om van het a.out formaat af te komen, maar meer omdat van het op de inflexibele jump-tabel gebaseerde gedeelde bibliotheekmechanisme af te komen, die het maken van gedeelde bibliotheken erg moeilijk maakte voor bedrijven en ontwikkelaars. Omdat de ELF hulprogramma's een oplossing voor het gedeelde bibliotheek probleem waren en algemeen gezien werden als een “stap vooruit”, werd de migratie geaccepteerd als noodzakelijk kwaad en werd de wissel uitgevoerd. Het gedeelde bibliotheek mechanisme van FreeBSD is meer gebaseerd op het gedeelde bibliotheek mechanisme van Sun's SunOS™ en daardoor erg makkelijk te gebruiken.
Waarom zijn er zoveel verschillende formaten?
In het duistere donkere verleden was er simpele hardware. Deze simpele hardware ondersteunde een simpel klein systeem. a.out was volledig adequaat voor de taak om binaire bestanden op dat simpele systeem te vertegenwoordigen (een PDP-11). Toen mensen UNIX van deze machine gingen porten, behielden ze het a.out formaat omdat het voldeed voor de vroege ports van UNIX naar architecturen als Motorola 68k, VAXen, enzovoort.
Toen besloot een slimme hardware engineer dat als hij de software kon forceren om wat simpele truckjes te doen, hij in staat was om een paar onderdelen van het ontwerp af te schaven, waardoor zijn processorcore sneller kon draaien. Terwijl men probeerde om het met deze nieuwe vorm van hardware te laten werken (vandaag de dag beter bekend als RISC), was a.out te beperkt voor deze hardware. Dus werden er vele formaten ontworpen om betere prestaties te krijgen uit deze hardware dan het simpele formaat a.out kon leveren. Toen werden COFF, ECOFF en een paar andere duistere formaten uitgevonden en werden de limieten verkend, waarna men besloot om zich te richten op ELF.
Daarnaast werden programma's groter en bleven schijven (en fysiek geheugen) relatief klein, zodat het concept van een gedeelde bibliotheek werd geboren. Het VM systeem werd ook meer verfijnd. Terwijl al deze verbeteringen bereikt werden door het a.out formaat, werd het nut met elke nieuwe eigenschap verder uitgerekt. Daarnaast wilde men dingen dynamisch laden tijdens het starten of delen weggooien nadat het programma zijn intiële code had gedraaid om te blijven hangen in het hoofdgeheugen en in de wisselbestanden. Talen werden verder verfijnd en men wilde dat code automatisch werd aangeroepen voor main. Er werden veel hacks gedaan in het a.out formaat om alles mogelijk te maken en dit werkte ook enige tijd. Na verloop van tijd was a.out niet meer in staat om alle problemen te adresseren zonder toenemende overhead in code en complexibiliteit. Hoewel ELF veel van deze problemem verhielp, was het moeilijk om te wisselen naar een systeem dat compleet anders werkte. Dus moest ELF wachten totdat het pijnlijker was om a.out te behouden dan het te migreren naar ELF.
Met het verstrijken van de tijd, werden de bouwprogramma's die FreeBSD heeft afgeleid van hun bouwprogramma's (vooral de assembler en de loader) ontwikkeld in twee parallel lopende takken. De FreeBSD tree voegde gedeelde bibliotheken toe en heeft wat bugs opgelost. De mensen van GNU die deze programma's hebben geschreven, hebben ze herschreven en simpelere ondersteuning toegevoegd voor het bouwen van cross-compilers, waarbij verschillende formaten zo nodig ingevoegd konden worden, enzovoort. Omdat veel mensen cross-compilers wilden bouwen die gericht waren op FreeBSD, hadden die pech, omdat de oudere broncode van FreeBSD voor as en ld niet opgewassen was tegen deze taak. De nieuwe GNU programmaketen (binutils) ondersteunt cross-compiling, ELF, gedeelde bibliotheken, C++ extensies, enzovoort. Daarnaast leveren veel leverancierds ELF binaire bestanden en is het goed voor FreeBSD om het te draaien.
ELF heeft meer expressiemogelijkheden dan a.out en geeft meer uitbreidingsmogelijkheden aan het basissysteem. De ELF hulpprogramma's worden beter onderhouden en geven de mogelijkheid tot ondersteuning voor cross compilatie, wat voor veel mensen belangrijk is. ELF is misschien iets trager dan a.out, maar het meten daarvan kan vrij lastig zijn. Er zijn ook ontelbare verschillen tussen de twee in hoe ze pages opslaan, initiële code verwerken, enzovoort. Geen van allen zijn ze erg belangrijk, maar er zijn verschillen. Na verloop van tijd verdwijnt de ondersteuning voor a.out uit de GENERIC kernel en uiteindelijk ook helemaal uit de kernel als de noodzaak voor a.out gebaseerde programma's voorbij is.
De meest uitvoerige documentatie van FreeBSD is geschreven in de vorm van handleidingen. Bijna elk programma op het systeem heeft een kleine handleiding die uitlegt wat de basisopties en verschillende argumenten doen. Deze handleidingen bekeken worden met man. Het gebruik van man gaat als volgt:
% man commando
commando is de naam van het commando waar meer informatie over getoond moet worden. Om bijvoorbeeld meer informatie weer te geven over ls kan het volgende uitgevoerd worden:
% man ls
De handleidingen zijn opgedeeld in genummerde onderdelen:
Gebruikerscommando's.
Systeemaanroepen en foutnummernummers.
Functies in de C bibliotheken.
Apparaatdrivers.
Bestandsindelingen.
Spelletjes en andere afleidingen.
Diverse informatie.
Systeemonderhoud en commando's
Kernelontwikkelaars.
In sommige gevallen kan een bepaald onderwerp vaker voorkomen in een onderdeel
van de handleidingen. Er is bijvoorbeeld een gebruikerscommando chmod en een systeemaanroep chmod(). In deze gevallen kan man
aangegeven worden welke documentatie weer te geven door het specificeren van het
onderdeel:
% man 1 chmod
Dit geeft de handleiding van het gebruikerscommando chmod weer. Verwijzingen naar een bepaald onderdeel van de handleiding worden traditioneel tussen haakjes geplaatst: chmod(1) verwijst naar het commando chmod en chmod(2) verwijst naar de systeemaanroep.
Dit werkt prima als de naam van het commando bekend is en alleen informatie nodig
is over hoe het commando gebruikt kan worden, maar wat als de naam van het commando
niet bekend is? Dan kan man gebruikt worden om naar
trefwoorden te zoeken in de commandobeschrijvingen door de optie -k te gebruiken:
% man -k mail
Met dit commando wordt een overzicht getoond met commando's die het trefwoord “mail” in hun omschrijving hebben. Dit is gelijk aan het commando apropos.
Dus om meer informatie over spannende commando's met een onbekende functie in /usr/bin te krijgen is het volgende commando voldoende:
% cd /usr/bin % man -f *
Het onderstaande commando resulteert in hetzelfde:
% cd /usr/bin % whatis *
FreeBSD heeft veel applicaties en hulpmiddelen die gemaakt zijn door de Free Software Foundation (FSF). Als extraatje voor de documentatie hebben deze programma's uitgebreidere html bestanden die infobestanden heten, die uitgelezen kunnen worden met info of, als emacs is geïnstalleerd, de infomodus van emacs.
info(1) wordt als volgt gebruikt:
% info
h geeft een korte beschrijving en ? toont een kort commando-overzicht.
FreeBSD bevat een grote collectie aan systeemgereedschappen als onderdeel van het basissysteem. De mogelijkheden reiken echter niet heel ver en daarom is er snel een applicatie van een andere partij nodig. FreeBSD bevat twee complementaire technologieën om andere applicaties te installeren: de FreeBSD Portscollectie (voor het installeren vanuit broncode) en pakketten (voor het installeren vanuit voorgecompileerde binaire bestanden). Beide systemen kunnen gebruikt worden om de nieuwste versies van een gewenste applicatie te installeren van lokale media of rechtstreeks van het netwerk.
Na het lezen van dit hoofdstuk weet de lezer:
Hoe binaire softwarepakketten van derden te installeren;
Hoe software van derden vanuit de Portscollectie vanuit broncode te installeren;
Hoe eerder geïnstalleerde pakketten of ports te verwijderen;
Hoe standaardwaarden die door de ports worden gebruikt te wijzigen;
Hoe het juiste softwarepakket te vinden;
Hoe applicaties bij te werken.
Als u eerder gebruik heeft gemaakt van een UNIX-systeem dan is het bekend dat de standaardprocedure voor het installeren van software van derden ongeveer als volgt is:
Download de software als broncode of als binair bestand;
Pak de software uit vanuit zijn originele distributietype (meestal een tar-bestand gecomprimeerd met compress(1), gzip(1), of bzip2(1));
Zoek de documentatie (meestal een INSTALL of README bestand of enkele bestanden in een submap doc/) en lees zorgvuldig hoe de software geïnstalleerd moet worden;
Als de software als broncode is gedistribueerd, moet de broncode gecompileerd worden. Dit kan wijzigingen in een Makefile vereisen of het draaien van een configure script en andere werkzaamheden;
De software installeren en testen.
En dat geldt alleen als alles goed gaat. Als er een softwarepakket geïnstalleerd wordt dat niet specifiek gemaakt is voor FreeBSD moet mogelijkerwijs zelfs de code aangepast worden om alles goed te laten werken.
Als de gebruiker het wenst, kan hij in FreeBSD doorgaan met het installeren van software op de “traditionele” manier. FreeBSD levert echter twee technologieën die veel moeite kunnen besparen: pakketten en ports. Op dit moment zijn zo meer dan 23,000 applicaties beschikbaar.
Voor iedere gewenste applicatie is het FreeBSD pakket voor die applicatie één te downloaden bestand. Het pakket bevat voorgecompileerde kopiën met alle commando's voor de applicatie en alle instellingenbestanden of documentatie. Een gedownload pakketbestand kan gemanipuleerd worden met FreeBSD pakketbeheercommando's zoals pkg_add(1), pkg_delete(1), pkg_info(1), enzovoort. Het installeren van een nieuwe applicatie kan met één commando.
Een FreeBSD port van een applicatie is een groep bestanden ontworpen om het proces van compileren van een applicatie vanuit broncode te automatiseren.
Het is te vergelijken met de stappen die normaal gevolgd worden om een programma te compileren (downloaden, uitpakken, aanpassen, compileren en installeren). De bestanden die samen een port vormen bevatten alle noodzakelijke informatie om het systeem dit te laten doen. Met een aantal eenvoudige commando's wordt de broncode voor de applicatie automatisch gedownload, uitgepakt, aangepast, gecompileerd en geïnstalleerd.
Het portssysteem kan zelfs gebruikt worden om pakketten te maken die later weer gemanipuleerd kunnen worden met pkg_add en andere pakketbeheercommando's, waarover later meer uitleg wordt gegeven.
Zowel pakketten als ports kennen afhankelijkheden (dependencies). Stel dat er een applicatie geïnstalleerd gaat worden die er vanuit gaat dat een specifieke bibliotheek wordt geïnstalleerd. Zowel de applicatie als de bibliotheek zijn beschikbaar als FreeBSD ports en pakketten. Als het commando pkg_add of het portssysteem wordt gebruikt om de applicatie toe te voegen, dan zien beiden dat de bibliotheek niet geïnstalleerd is en wordt deze automatisch eerst geïnstalleerd.
Gezien het feit dat beide technologieën vrijwel identiek zijn, kan de vraag rijzen waarom FreeBSD de moeite neemt om beide te faciliteren. Pakketten en ports hebben ieder hun eigen kracht. Welke gebruikt wordt hangt af van voorkeuren en omstandigheden.
Voordelen van pakketten
Een gecomprimeerd pakket tar-bestand is meestal kleiner dan het gecomprimeerde tar-bestand met de broncode van de applicatie;
Pakketten vereisen geen additionele compilatie. Voor grote applicaties als Mozilla, KDE of GNOME kan dit belangrijk zijn, vooral als een systeem wat trager is;
Pakketten vereisen geen begrip van het proces van het compileren van software op FreeBSD.
Voordelen van ports
Pakketten worden meestal gecompileerd met conservatieve opties, omdat ze moeten draaien op een maximaal aantal systemen. Bij het installeren vanuit de port kunnen de compilatie-instellingen aangepast worden om zo bijvoorbeeld code te maken die specifiek voor een Pentium 4 of een Athlon processor is;
Sommige applicaties hebben compilatie-instellingen gerelateerd aan wat ze wel of niet kunnen doen. Apache kan bijvoorbeeld ingesteld worden met een uitgebreide hoeveelheid verschillende ingebouwde instellingen. Door vanuit de port te werken hoeven niet alle standaardinstellingen geaccepteerd te worden en kunnen ze ingesteld worden;
In sommige gevallen zijn er meerdere pakketten voor dezelfde applicatie om specifieke instellingen aan te geven. Ghostscript is bijvoorbeeld beschikbaar als een ghostscript pakket en ghostscript-nox11 pakket, afhankelijk van het al dan niet geïnstalleerd hebben van een X11 server. Deze ruwe vorm van tweaking is mogelijk met pakketten, maar dit wordt snel onmogelijk als een applicatie meer dan één of twee verschillende compilatie-instellingen heeft;
De licentievoorwaarden van sommige softwaredistributies verbieden binaire distributie. Ze moeten dus gedistribueerd worden als broncode;
Sommige mensen vertrouwen binaire distributies niet. Broncode kan tenminste (in theorie) zelf doorgelezen en gecontroleerd worden op potentiële problemen;
Als er lokale modificaties zijn, is de broncode nodig om ze toe te passen;
Sommige mensen hebben graag de broncode zodat ze die kunnen lezen als ze zich vervelen, erin kunnen hacken, code kunnen overnemen (indien de licentie dit toestaat natuurlijk), enzovoort.
Om vernieuwingen van ports bij te houden kan een abonnement genomen worden op de FreeBSD ports mailinglijst en/of de FreeBSD ports bugs mailinglijst.
WaarschuwingVoordat een applicatie wordt geïnstalleerd is het aan te raden op http://vuxml.freebsd.org/ na kijken of er geen beveiligingsproblemen voor de gewenste applicatie bekend zijn.
Het is ook mogelijk om ports-mgmt/portaudit te installeren, dat automatisch alle geïnstalleerde applicaties controleert op bekende fouten. Deze controle wordt ook uitgevoerd voordat een port wordt geïnstalleerd. Met het commando portaudit -F -a kunnen de pakketten die al geïnstalleerd zijn worden gecontroleerd.
In de rest van dit hoofdstuk wordt uitgelegd hoe pakketten en ports gebruikt kunnen worden om software in FreeBSD te installeren en te beheren.
Voordat een applicatie geïnstalleerd kan worden, moeten de doelen bekend zijn en hoe de applicatie heet.
De lijst met voor FreeBSD beschikbare applicaties groeit continu. Gelukkig zijn er een aantal manieren om te zoeken:
Op de FreeBSD website staat een recente doorzoekbare lijst met alle beschikbare applicaties: http://www.FreeBSD.org/ports/. De ports zijn onderverdeeld in categorieën. Er kan naar een applicatie gezocht worden op naam (als die bekend is) of alle applicaties in een categorie kunnen bekeken worden.
Dan Langille onderhoudt FreshPorts op http://www.FreshPorts.org/. FreshPorts volgt veranderingen in applicaties in de ports en biedt de mogelijkheid om of meer ports te volgen. Er wordt dan een email gestuurd als de port is bijgewerkt.
Als de naam van de gewenst applicatie niet bekend is, is het wellicht mogelijk deze te achterhalen via een website als FreshMeat (http://www.freshmeat.net/) en kan daarna op de FreeBSD site gecontroleerd worden of de applicatie al geschikt gemaakt is voor gebruik met FreeBSD.
Als de precieze naam van de port bekend is, maar niet bekend is in welke categorie deze staat, kan dit achterhaald worden met whereis(1). Door simpelweg whereis bestand in te geven, waar bestand het te installeren programma is. Als het op het systeem staat, wordt dat als volgt aangegeven:
# whereis lsof lsof: /usr/ports/sysutils/lsof
Dit geeft aan dat lsof (een systeemhulpprogramma) in de map /usr/ports/sysutils/lsof staat.
U kunt ook een eenvoudig echo(1)-statement gebruiken om uit te zoeken waar een port zich in te ports tree bevindt. Bijvoorbeeld:
# echo /usr/ports/*/*lsof* /usr/ports/sysutils/lsof
Merk op dat dit alle overeenkomstige bestanden die gedownload zijn in de map /usr/ports/distfiles terruggeeft.
Nog een andere manier om een port op te sporen is door het ingebouwde zoekmechanisme van de Portscollectie te gebruiken. Hiervoor moet het huidige pad de map /usr/ports zijn. Vanuit die map kan make search name=programmanaam uitgevoerd worden, waar programmanaam de naam is van het programma dat wordt gezocht. Als bijvoorbeeld lsof wordt gezocht:
# cd /usr/ports # make search name=lsof Port: lsof-4.56.4 Path: /usr/ports/sysutils/lsof Info: Lists information about open files (similar to fstat(1)) Maint: obrien@FreeBSD.org Index: sysutils B-deps: R-deps:
Het belangrijkste onderdeel van de uitvoer is in dit geval de regel waarop “Path:” staat, omdat die aangeeft waar de port staat. De andere informatie is niet nodig voor de installatie van de port en wordt hier niet behandeld.
Voor nog dieper zoeken kan ook make search key=string gebruikt worden waar string tekst is waarnaar gezocht moet worden. Hiermee wordt naar namen van ports, commentaar, beschrijvingen en afhankelijkheden gezocht en dit kan gebruikt worden om ports te vinden die te maken hebben met een bepaald onderwerp als onbekend is hoe het gezochte programma heet.
In beide gevallen is de zoekstring niet hoofdlettergevoelig. Zoeken naar “LSOF” geeft hetzelfde resultaat als zoeken naar “lsof”.
Er zijn verschillende gereedschappen die gebruikt worden om pakketten op FreeBSD te beheren:
Het gereedschap sysinstall kan op een draaiend systeem worden gebruikt om beschikbare en geïnstalleerde pakketten te installeren, te verwijderen, en weer te geven. Zie voor meer informatie Paragraaf 2.10.11.
De opdrachtregelgereedschappen om pakketten te beheren, welke het onderwerp van de rest van deze sectie zijn.
Met pkg_add(1) kan een FreeBSD softwarepakket geïnstalleerd worden vanaf een lokaal bestand of vanaf een server op het netwerk.
Voorbeeld 5-1. Handmatig pakketten downloaden en lokaal installeren
# ftp -a ftp2.FreeBSD.org Connected to ftp2.FreeBSD.org. 220 ftp3.FreeBSD.org FTP server (Version 6.00LS) ready. 331 Guest login ok, send your email address as password. 230- 230- This machine is in Vienna, VA, USA, hosted by Verio. 230- Questions? E-mail freebsd@vienna.verio.net. 230- 230- 230 Guest login ok, access restrictions apply. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd /pub/FreeBSD/ports/packages/sysutils/ 250 CWD command successful. ftp> get lsof-4.56.4.tgz local: lsof-4.56.4.tgz remote: lsof-4.56.4.tgz 200 PORT command successful. 150 Opening BINARY mode data connection for 'lsof-4.56.4.tgz' (92375 bytes). 100% |**************************************************| 92375 00:00 ETA 226 Transfer complete. 92375 bytes received in 5.60 seconds (16.11 KB/s) ftp> exit # pkg_add lsof-4.56.4.tgz
Als er lokaal geen bron is voor pakketten (zoals de FreeBSD CD-ROM-verzameling)
dan is het waarschijnlijk makkelijker om de -r optie te
gebruiken met pkg_add(1). Deze
optie zorgt er voor dat het hulpprogramma automatisch het correcte formaat en de
juiste versie bepaalt en die daarna binnenhaalt en installeert vanaf een FTP
site.
# pkg_add -r lsof
Het voorbeeld hierboven haalt het correcte pakket binnen en installeert het zonder dat de gebruiker iets hoeft te doen. Als u een alternatieve FreeBSD Pakkettenmirror wilt specificeren, in plaats van de hoofddistributiesite, dan moet u de omgevingsvariabele PACKAGESITE overeenkomstig instellen om de standaardinstellingen aan te passen. pkg_add(1) gebruikt fetch(3) om de bestanden binnen te halen, dat gebruik maakt van diverse omgevingsvariabelen zoals FTP_PASSIVE_MODE, FTP_PROXY, en FTP_PASSWORD. Mogelijk moeten ook één of meer van deze variabelen gebruikt worden als een machine achter een firewall staat of als gebruik gemaakt moet worden van een FTP/HTTP proxy. In fetch(3) staat de complete lijst. In het voorbeeld hierboven is gebruik gemaakt van lsof in plaats van lsof-4.56.4. Als het pakket wordt binnengehaald met behulp van de bovenstaande instellingen, dan moet het versienummer van het pakket niet gebruikt worden. pkg_add(1) haalt automatisch de laatste versie van de applicatie binnen.
Opmerking: pkg_add(1) downloadt de meest recente versie van een applicatie als FreeBSD-CURRENT of FreeBSD-STABLE. Als een -RELEASE versie wordt gebruikt, wordt het pakket dat bij die release hoort gebruikt. Het is mogelijk dit gedrag te veranderen door PACKAGESITE te wijzigen. Als u bijvoorbeeld FreeBSD 8.1-RELEASE draait, dan haalt pkg_add(1) standaard de pakketten uit ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8.1-release/Latest/. Om pkg_add(1) de FreeBSD 8-STABLE pakketten te laten downloaden kan PACKAGESITE ingesteld worden op ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8-stable/Latest/.
Pakketbestanden worden gedistribueerd in de formaten .tgz en .tbz. Ze zijn te vinden op ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages/ of op de FreeBSD CD-ROM-distributie. Iedere CD-ROM in de FreeBSD 4-CD-ROM-verzameling (en de PowerPak, enzovoort) bevat pakketten in de map /packages. De opbouw van de pakketten is ongeveer gelijk aan die van /usr/ports. Iedere categorie heeft zijn eigen map en ieder pakket staat ook in de map All.
De mappenstructuur van het pakkettensysteem is gelijk aan die van het portssysteem. Samen vormen ze het pakket/portssysteem.
pkg_info(1) is een hulpprogramma dat de diverse geïnstalleerde pakketten toont en beschrijft.
# pkg_info cvsup-16.1 A general network file distribution system optimized for CV docbook-1.2 Meta-port for the different versions of the DocBook DTD ...
pkg_version(1) is een hulpprogramma dat een samenvatting van de versie van alle geïnstalleerde pakketten geeft. Het vergelijkt de versie van het pakket met de huidige versie in de Portscollectie.
# pkg_version cvsup = docbook = ...
De symbolen in de tweede kolom geven aan hoe de geïnstalleerde versie staat ten opzichte van de versie die beschikbaar is in de lokale Portscollectie.
| Symbool | Betekenis |
|---|---|
| = | De versie van het geïnstalleerde pakket komt overeen met die in de lokale Portscollectie. |
| < | De geïnstalleerde versie is ouder dan die beschikbaar is in de ports. |
| > | De geïnstalleerde versie is nieuwer dan die in de lokale Portscollectie. De lokale Portscollectie is waarschijnlijk verouderd. |
| ? | Het geïnstalleerde pakket kan niet gevonden worden in index van de Portscollectie. Dit kan bijvoorbeeld gebeuren als een geïnstalleerde port uit de Portscollectie wordt verwijderd of hernoemd. |
| * | Er zijn meerdere versies van het pakket. |
| ! | Het geïnstalleerde pakket bestaat in de index maar om de een of andere reden was pkg_version niet in staat om het versienummer van het geïnstalleerde pakket met de overeenkomstige ingang in de index te vergelijken. |
Voor het verwijderen van een geïnstalleerd pakket wordt het hulpprogramma pkg_delete(1) gebruikt.
# pkg_delete xchat-1.7.1
Merk op dat pkg_delete(1) de volledige naam en het volledige nummer van het pakket nodig heeft; het bovenstaande commando zou niet werken als xchat in plaats van xchat-1.7.1 was gegeven. Het is echter eenvoudig om pkg_version(1) te gebruiken om de versie van het geïnstalleerde pakket te achterhalen. U zou ook eenvoudigweg een wildcard kunnen gebruiken:
# pkg_delete xchat\*
In dit geval zullen alle pakketten waarvan de naam met xchat begint worden verwijderd.
Alle informatie over pakketten wordt opgeslagen in de map /var/db/pkg. De lijst met geïnstalleerde bestanden en beschrijvingen van ieder pakket staat in de bestanden in deze map.
In de volgende paragrafen worden basisinstructies gegeven over het gebruik van de Portscollectie om programma's op een systeem te installeren of ervan te verwijderen. Een gedetailleerde beschrijving van de make-doelen en omgevingsvariabelen staat in ports(7).
Voordat ports geïnstalleerd kunnen worden moet eerst de Portscollectie op een systeem staan, die in essentie een set van Makefiles, patches en bestanden met beschrijvingen is in /usr/ports.
Tijdens het installeren van een FreeBSD systeem, vraagt sysinstall of de Portscollectie geïnstalleerd moet worden. Als daar “NO” is aangegeven, dan kan met behulp van de volgende instructies alsnog de Portscollectie op een systeem gezet worden:
Met CVSup
Dit is een snelle methode voor het verkrijgen en bijhouden van een kopie van Portscollectie met behulp van het CVSup-protocol. Meer informatie over CVSup staat in CVSup gebruiken.
Opmerking: De implementatie van het CVSup-protocol dat met FreeBSD wordt geleverd heet csup.
Zorg ervoor dat /usr/ports leeg is voordat csup voor het eerst gebruikt wordt! Als er reeds een Ports Collectie aanwezig is die via een andere bron is opgehaald, zal csup verwijderde patchbestanden niet verwijderen.
Draai csup:
# csup -L 2 -h cvsup.FreeBSD.org /usr/share/examples/cvsup/ports-supfile
Wijzig cvsup.FreeBSD.org in een CVSup server in de buurt. In CVSup Mirrors (Paragraaf A.6.7) staat een complete lijst van mirrorsites;
Opmerking: Het kan wenselijk zijn een aangepaste ports-supfile te gebruiken, bijvoorbeeld om een CVSup server niet mee te hoeven geven op de commandoregel.
Kopieer in dit geval, als root, /usr/share/examples/cvsup/ports-supfile naar een nieuwe locatie, zoals /root of een thuismap.
Wijzig ports-supfile.
Wijzig CHANGE_THIS.FreeBSD.org in een CVSup server in de buurt. In CVSup Mirrors (Paragraaf A.6.7) staat een volledige lijst met mirrorsites.
Roep nu als volgt csup aan:
# csup -L 2 /root/ports-supfile
Het later draaien van csup(1) zal alle recente veranderingen aan uw Portscollectie downloaden en toepassen, behalve het eigenlijke herbouwen van ports voor uw eigen systeem.
Met Portsnap
Portsnap is een alternatief systeem voor het distribueren van de Portscollectie. In Portsnap gebruiken staat een gedetailleerde beschrijving van alle mogelijkheden van Portsnap.
Download een gecomprimeerd snapshot van de Portscollectie naar /var/db/portsnap. Na deze stap kan eventueel de verbinding met Internet verbroken worden.
# portsnap fetch
Als Portsnap voor de eerste keer draait, pak het snapshot dan uit in /usr/ports:
# portsnap extract
Als /usr/ports al gevuld is en er alleen wordt bijgewerkt, voer dan het volgende commando uit in plaats van het bovenstaande:
# portsnap update
Met sysinstall
Bij deze methode wordt sysinstall gebruikt om de Portscollectie van installatiemedia te installeren. Hier wordt wel de Portscollectie op het moment dat de release gemaakt is geïnstalleerd. Bij toegang tot Internet is het advies altijd een andere methode te gebruiken.
Draai als root sysinstall zoals hieronder aangegeven:
# sysinstall
Scroll naar beneden en selecteer Configure, druk op Enter.
Scroll naar beneden en selecteer Distributions, druk op Enter.
Scroll naar ports, druk op Space.
Scroll naar boven naarExit, druk op Enter.
Selecteer de gewenste installatiemedia, zoals CD-ROM, FTP, enzovoort.
Scroll omhoog naar Exit en druk op Enter.
Druk op X om sysinstall af te sluiten.
Het eerste wat uitleg behoeft als het over de Portscollectie gaat is de term “skelet” (“skeleton”). In een notendop is een portskelet een minimaal aantal bestanden dat FreeBSD aangeeft hoe een programma gecompileerd en geïnstalleerd kan worden. Ieder portskelet bevat:
Een Makefile. De Makefile bevat verschillende definities die aangeven hoe de applicatie gecompileerd moet worden en waar die op een systeem geïnstalleerd moet worden;
Een bestand distinfo. Dit bestand bevat informatie over de bestanden die gedownload moeten worden om de port te bouwen, en hun checksums (door gebruik te maken van sha256(1)), om vast te stellen dat de bestanden niet corrupt zijn geraakt tijdens de download;
Een map files. Deze map bevat patches om het programma op een FreeBSD systeem te laten compileren en installeren. Patches zijn in essentie kleine bestanden waarin kleine veranderingen aan andere, specifieke, bestanden staan aangegeven. Ze zijn opgesteld in platte tekst en er staan dingen in als “Verwijder regel 10” of “Wijzig regel 26 in ...”. Patches staan ook wel bekend als “diffs” omdat ze gemaakt worden met het programma diff(1).
Deze map kan ook andere bestanden bevatten die gebruikt worden om de port te bouwen;
Een bestand pkg-descr. Dit is een meer gedetailleerde beschrijving van het programma, vaak in één regel;
Een bestand pkg-plist. Dit is een lijst met alle bestanden die door de port geïnstalleerd worden. Het geeft het portssysteem ook aan welke bestanden bij het verwijderen van de port weer verwijderd kunnen worden.
Sommige ports bevatten nog andere bestanden, zoals pkg-message. Het portssysteem gebruikt die bestanden voor het afhandelen van bijzondere situaties. Meer details over die bestanden en over ports in het algemeen zijn na te lezen in het FreeBSD Handboek voor Porters.
De port bevat instructies over hoe de broncode gebouwd moet worden, maar de broncode zelf is er geen onderdeel van. De broncode staat op een CD-ROM of op Internet. De broncode wordt verspreid op de wijze waarop de auteur dat wenst. Vaak is dat als een tar of gzip bestand, maar het kan ook ingepakt zijn met een ander programma of helemaal niet ingepakt zijn. De broncode van een programma, in welke vorm dan ook, heet een “distributiebestand”. De twee methoden om een FreeBSD port te installeren worden hieronder beschreven.
Opmerking: Ports installeren dient als root te gebeuren.
WaarschuwingVoordat een port wordt geïnstalleerd is het aan te raden op http://vuxml.freebsd.org/ na kijken of er geen beveiligingsproblemen voor de gewenste port bekend zijn.
Er kan automatisch een controle op beveiligingsproblemen door portaudit gedaan worden voordat er een nieuwe applicatie wordt geïnstalleerd. Dit gereedschap kan in de Portscollectie gevonden worden (ports-mgmt/portaudit). Overweeg om portaudit -F te draaien voordat er een nieuwe port wordt geïnstalleerd, om de huidige database met beveiligingsproblemen op te halen. Tijdens de dagelijkse beveiligingscontrole van het systeem zal er een beveiligingsaudit en een update van de database plaatsvinden. Lees voor meer informatie de hulppagina's portaudit(1) en periodic(8).
De Portscollectie neemt aan dat er een werkende Internetverbinding is. Als die niet aanwezig is, zet dan handmatig een kopie van het benodigde distributiebestand in /usr/ports/distfiles.
Ga om te beginnen naar de juiste map voor een port:
# cd /usr/ports/sysutils/lsof
Eenmaal in de map lsof is het skelet van de port te zien. In de volgende stap wordt de broncode voor de port gecompileerd of “gebouwd”. Dit wordt gedaan door op het prompt make in te voeren. Dat levert iets als het volgende op:
# make >> lsof_4.57D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/. >> Attempting to fetch from ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/. ===> Extracting for lsof-4.57 ... [uitvoer van uitpakken verwijderd] ... >> Checksum OK for lsof_4.57D.freebsd.tar.gz. ===> Patching for lsof-4.57 ===> Applying FreeBSD patches for lsof-4.57 ===> Configuring for lsof-4.57 ... [uitvoer van configure verwijderd] ... ===> Building for lsof-4.57 ... [uitvoer van compileren verwijderd] ... #
Als het compileren is afgerond is het prompt weer zichtbaar. In de volgende stap wordt de port geïnstalleerd. Om dat te bewerkstelligen wordt het woord install aan make toegevoegd:
# make install
===> Installing for lsof-4.57
...
[uitvoer installatie verwijderd]
...
===> Generating temporary packing list
===> Compressing manual pages for lsof-4.57
===> Registering installation for lsof-4.57
===> SECURITY NOTE:
This port has installed the following binaries which execute with
increased privileges.
#
Als de prompt weer beschikbaar is, is de applicatie klaar voor gebruik. Omdat lsof met verhoogde rechten wordt uitgevoerd, wordt er een waarschuwing getoond. Tijdens het bouwen en installeren van ports zijn de getoonde waarschuwingen van belang.
Het is verstandig om de submap die als werkmap wordt gebruikt te verwijderen. Hierin staan alle tijdelijke bestanden die tijdens het compileren worden gebruikt. Die bestanden gebruiken niet alleen waardevolle schijfruimte, maar ze kunnen later ook problemen veroorzaken als de port wordt bijgewerkt.
# make clean ===> Cleaning for lsof-4.57 #
Opmerking: Het is mogelijk twee stappen minder te gebruiken door make install clean uit te voeren in plaats van make, make install en make clean als drie afzonderlijke stappen.
Opmerking: Sommige shells houden een cache bij van de commando's die in de mappen uit de omgevingsvariabele PATH staan om het opzoeken van een uitvoerbaar bestand te versnellen. Als zo'n shell wordt gebruikt, moet er na de installatie van een port het commando rehash worden uitgevoerd voordat zojuist geïnstalleerde commando's kunnen worden gebruikt. Dit commando werkt voor shells zoals tcsh. Gebruik voor shells als sh hash -r. In de documentatie van een shell staat meer informatie.
Sommige DVD-ROM-producten van andere partijen, zoals de FreeBSD Toolkit van de FreeBSD Mall bevatten distributiebestanden. Die kunnen met de Portscollectie gebruikt worden. Koppel de DVD-ROM aan op /cdrom. Stel bij gebruik van een ander aankoppelpunt de make variabele CD_MOUNTPTS in. De benodigde distributiebestanden worden automatisch gebruikt als ze op de schijf aanwezig zijn.
Opmerking: Licenties van sommige ports staan niet toe dat de code wordt opgenomen in een CD-ROM. Dit kan komen doordat er een formulier ingevuld moet worden voor een download of doordat herdistributie niet is toegestaan of om een andere reden. Om een port te installeren die niet op de CD-ROM staat moet de computer waarop de port geďnstalleerd wordt een Internetverbinding hebben.
Het portssysteem gebruikt fetch(1) om bestanden te downloaden. Dat programma maakt gebruik van een aantal omgevingsvariabelen, waaronder FTP_PASSIVE_MODE, FTP_PROXY, en FTP_PASSWORD. Als een systeem achter een firewall staat, is het wellicht noodzakelijk om een of meer van deze omgevingsvariabelen in te stellen of om gebruik te maken van een FTP/HTTP proxy. In fetch(3) staat een complete lijst.
Als er geen continue Internetverbinding is, kan gebruik gemaakt worden van make fetch. Door dit commando in de map /usr/ports uit te voeren worden alle benodigde bestanden gedownload. Dit commando werkt ook op een lager niveau als /usr/ports/net of /usr/ports/net/xmule. Als een port afhankelijk is van bibliotheken of andere ports dan worden de distributiebestanden van die ports niet opgehaald. Om dat de bereiken dient fetch vervangen te worden door fetch-recursive.
Opmerking: Het is mogelijk alle ports in een categorie te bouwen door make in een hogere map uit te voeren, naar analogie van het voorbeeld voor make fetch. Dit is wel gevaarlijk, omdat sommige ports niet tegelijk met andere geïnstalleerd kunnen zijn. In andere gevallen installeren twee ports hetzelfde bestand met een andere inhoud.
In zeldzame gevallen willen of moeten gebruikers de tar-bestanden van een andere site dan de MASTER_SITES halen (de locatie waar de bestanden vandaan komen). Dat is mogelijk met de optie MASTER_SITES met een volgend commando:
# cd /usr/ports/directory # make MASTER_SITE_OVERRIDE= \ ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ fetch
In het voorgaande voorbeeld is de optie MASTER_SITES gewijzigd naar ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/.
Opmerking: Sommige ports staan toe (of schrijven zelfs voor) dat er een aantal instellingen worden meegegeven die bepaalde onderdelen (niet gebruikt, beveiligingsinstellingen en andere aanpassingen) van de applicatie in- of uitschakelen. Voorbeelden van ports waarbij dat het geval is zijn www/firefox, security/gpgme en mail/sylpheed-claws. Er wordt een bericht getoond als dit soort instellingen beschikbaar zijn.
Soms is het handig (of verplicht) om een andere map voor werk of ports te gebruiken. Met de variabelen WRKDIRPREFIX en PREFIX kunnen de standaardmappen veranderd worden:
# make WRKDIRPREFIX=/usr/home/example/ports install
Het voorbeeld hierboven compileert de port in /usr/home/example/ports en installeert alles in /usr/local.
# make PREFIX=/usr/home/example/local install
Het voorbeeld hierboven compileert in /usr/ports en installeert in /usr/home/example/local.
# make WRKDIRPREFIX=../ports PREFIX=../local install
Het voorbeeld hierboven combineert de twee instellingen. Het gaat te ver om dit volledig in het handboek te beschrijven, maar hier krijgt de lezer een idee van de mogelijkheden.
Het is ook mogelijk de bovenstaande variabelen als deel van de omgeving in te stellen. In de hulppagina's van de gebruikte shell staat hoe dat mogelijk is.
Er zijn ports die imake gebruiken (een onderdeel van het X Window systeem) die niet goed werken met PREFIX en erop staan te installeren in /usr/X11R6. Er zijn ook een aantal Perl ports die PREFIX negeren en in de Perl hiërarchie installeren. Deze ports op de PREFIX locatie laten installeren is meestal erg moeilijk of onmogelijk.
Tijdens het bouwen van bepaalde ports kan er een menu dat op ncurses is gebaseerd verschijnen waaruit u bepaalde bouwopties kunt selecteren. Het is niet ongebruikelijk dat gebruikers dit menu opnieuw willen bezoeken om deze opties toe te voegen, te verwijderen, of te veranderen nadat een port is gebouwd. Er zijn vele manieren om dit te doen. Eén optie is om naar de map waarin de port staat te gaan en make config te typen, wat eenvoudigweg het menu opnieuw toont met daarin de zelfde opties geselecteerd. Een andere optie is om make showconfig te gebruiken, wat alle instelopties voor de port aan u laat zien. Nog een andere optie is om make rmconfig uit te voeren wat alle geselecteerde opties zal verwijderen en u toestaat opnieuw te beginnen. Al deze opties, en anderen, worden zeer gedetailleerd uitgelegd in de hulppagina voor ports(7).
Nu u weet hoe ports te installeren, zult u zich waarschijnlijk afvragen hoe ze te verwijderen, in het geval dat u er een installeert en later besluit dat u de verkeerde port heeft geïnstalleerd. We zullen ons vorige voorbeeld (lsof) verwijderen. Ports worden op precies dezelfde manier verwijderd als pakketten met het commando pkg_delete(1) (zoals beschreven in het onderdeel Pakketten):
# pkg_delete lsof-4.57
Stel als eerste een lijst samen met ports waarvoor een nieuwere versie beschikbaar is in de Portscollectie met het commando pkg_version(1):
# pkg_version -v
Als de Portscollectie eenmaal is bijgewerkt vóór het bijwerken van ports, is het verstandig het bestand /usr/ports/UPDATING te raadplegen. In dat bestand staan aanwijzingen en wijzigingen voor gebruikers die van belang zijn bij het bijwerken van ports, zoals het veranderen van bestandsformaten, veranderen van de locatie van configuratie bestanden, en andere incompatibiliteiten met voorgaande versies.
Als UPDATING tegenstrijdig is met wat hier beschreven is, moet men UPDATING als waar beschouwen.
Het hulpprogramma portupgrade is ontworpen om geïnstalleerde ports eenvoudig bij te werken. Het is beschikbaar via de port ports-mgmt/portupgrade. Installeer het net als iedere andere port met het commando make install clean:
# cd /usr/ports/ports-mgmt/portupgrade # make install clean
Scan de lijst met geïnstalleerde ports met het commando pkgdb -F en corrigeer alle gerapporteerde inconsistenties. Het is verstandig dit regelmatig te doen, voor iedere keer bijwerken.
Door het draaien van portupgrade -a zal portupgrade beginnen met het bijwerken van alle
geïnstalleerde ports op een systeem waarvoor een nieuwere versie beschikbaar
is. Met de vlag -i is het mogelijk in te stellen dat
voor iedere bij te werken port om bevestiging wordt gevraagd.
# portupgrade -ai
Gebruik om alleen een specifieke applicatie bij te werken en niet alle
beschikbare ports portupgrade pkgname. Gebruik de vlag -R om portupgrade eerst alle ports
bij te laten werken die voor een bij te werken toepassing benodigd zijn.
# portupgrade -R firefox
Gebruik de vlag -P om bij installatie van pakketten
in plaats van ports gebruik te maken. Met deze optie zoekt portupgrade in de lokale mappen uit PKG_PATH of haalt de pakketten via het netwerk op als ze lokaal
niet worden aangetroffen. Als een pakket niet lokaal en niet via het netwerk
wordt gevonden, dan gebruikt portupgrade ports. Om het
gebruik van ports te voorkomen kan gebruik gemaakt worden van de optie -PP:
# portupgrade -PP gnome2
Om alleen de distributiebestanden op te halen (of pakketten als -P is opgegeven), zonder bouwen of installeren, is -F beschikbaar. Meer informatie staat in
portupgrade(1).
Portmanager is een ander hulpprogramma voor het eenvoudig bijwerken van geïnstalleerde ports. Het is beschikbaar via de port ports-mgmt/portmanager:
# cd /usr/ports/sysutils/portmanager # make install clean
Alle geïnstalleerde ports kunnen bijgewerkt worden met het volgende eenvoudige commando:
# portmanager -u
Door de vlag -ui aan bovenstaand commando ( portmanager -u -ui) toe te voegen kan ingesteld worden dat
voor iedere stap die Portmanager wil uitvoeren vooraf
toestemming moet worden gegeven. Portmanager kan ook
nieuwe ports op een systeem installeren. Anders dan met het bekende commando
make install clean worden alle
afhankelijkheden bijgewerkt voordat de geselecteerde port wordt gebouwd en
geïnstalleerd:
# portmanager x11/gnome2
Als er problemen zijn ten aanzien van de afhankelijkheden voor een geselecteerde port, dan kan Portmanager ze allemaal herbouwen in de juiste volgorde. Als dat is afgerond, wordt daarna ook de port die problemen opleverde opnieuw gebouwd:
# portmanager graphics/gimp -f
Meer informatie staat in portmanager(1).
portmaster is nog een gereedschap voor het bijwerken van geïnstalleerde ports. portmaster was ontworpen om gebruik te maken van de gereedschappen die in het “basis” systeem te vinden zijn (het hangt niet af andere ports) en het gebruikt de informatie in /var/db/pkg om te bepalen welke ports bij te werken. Het is beschikbaar via de port ports-mgmt/portmaster:
# cd /usr/ports/ports-mgmt/portmaster # make install clean
portmaster verdeelt ports in vier categoriën:
Wortelpoorten (geen afhankelijkheden, wordt niet van afgehangen)
Stampoorten (geen afhankelijkheden, wordt van afgehangen)
Takpoorten (hebben afhankelijkheden, wordt van afgehangen)
Bladpoorten (hebben afhankelijkheden, wordt niet van afgehangen)
U kunt de optie -L gebruiken om alle
geïnstalleerde ports tonen en naar updates te zoeken:
# portmaster -L
===>>> Root ports (No dependencies, not depended on)
===>>> ispell-3.2.06_18
===>>> screen-4.0.3
===>>> New version available: screen-4.0.3_1
===>>> tcpflow-0.21_1
===>>> 7 root ports
...
===>>> Branch ports (Have dependencies, are depended on)
===>>> apache-2.2.3
===>>> New version available: apache-2.2.8
...
===>>> Leaf ports (Have dependencies, not depended on)
===>>> automake-1.9.6_2
===>>> bash-3.1.17
===>>> New version available: bash-3.2.33
...
===>>> 32 leaf ports
===>>> 137 total installed ports
===>>> 83 have new versions available
Alle geïnstalleerde ports kunnen met dit eenvoudige commando worden bijgewerkt:
# portmaster -a
Opmerking: Standaard maakt portmaster een backup-pakket aan voordat het een bestaande port verwijderd. Als de installatie van de nieuwe versie succesvol is, zal portmaster de reservekopie verwijderen. Het gebruik van
-bzal portmaster instrueren om de reservekopie niet automatisch te verwijderen. Het toevoegen van de optie-izal portmaster in interactieve modus opstarten, en u vragen voordat het elke port bijwerkt.
Als u fouten tegenkomt tijdens het bijwerkproces, kunt u de optie -f gebruiken om alle ports bij te werken/te herbouwen:
# portmaster -af
U kunt portmaster ook gebruiken om nieuwe ports op het systeem te installeren, en alle afhankelijkheden bijwerken voordat de nieuwe port gebouwd en geïnstalleerd wordt:
# portmaster shells/bash
Bekijk portmaster(8) voor meer informatie.
Werken met de Portscollectie kan in de loop der tijd veel schijfruimte gebruiken. Na het bouwen en installeren van software uit de ports, is het van belang altijd de tijdelijke mappen work op te ruimen met het commando make clean. De complete Portscollectie kan geschoond worden met het volgende commando:
# portsclean -C
In de loop der tijd komen ook veel oude bestanden met broncode in de map distfiles te staan. Die kunnen handmatig verwijderd worden of met het volgende commando dat alle distributiebestanden waarnaar in de huidige ports geen verwijzingen meer staan verwijdert:
# portsclean -D
Of om alle distributiebestanden te verwijderen waardoor momenteel door geen één geïnstalleerde port op uw systeem wordt verwezen:
# portsclean -DD
Opmerking: Het hulpprogramma portsclean is onderdeel van de suite portupgrade.
Vergeet niet ports die niet langer gebruikt worden te verwijderen. Een handig hulpmiddel hiervoor kan de port ports-mgmt/pkg_cutleaves zijn.
Na het installeren van een nieuwe applicatie is het meestal verstandig om de documentatie te lezen die bij een applicatie zit, bestanden met instellingen die vereist zijn aan te passen, ervoor te zorgen dat de applicatie start na het opstarten (als het een daemon is), enzovoort.
De exacte stappen om een applicatie in te stellen zijn natuurlijk voor iedere applicatie anders. Maar als er net een nieuwe applicatie is geïnstalleerd en het is niet vanzelfsprekend hoe verder te gaan, dan kunnen de volgende tips helpen:
Met pkg_info(1) kan uitgevonden worden welke bestanden geïnstalleerd zijn en waar. Om bijvoorbeeld uit te vinden welke bestanden door FooPackage versie 1.0.0 zijn geïnstalleerd:
# pkg_info -L foopackage-1.0.0 | less
Bestanden in mapnamen met man/ zijn hulppagina's, etc/ bevat bestanden met instellingen en doc/ bevat uitgebreidere documentatie.
Als niet helemaal duidelijk is welke versie van het programma is geïnstalleerd, kan een commando als volgt gebruikt worden:
# pkg_info | grep -i foopackage
Hiermee worden alle pakketten getoond waar foopackage in de pakketnaam voorkomt.
Als de hulppagina's zijn gevonden, kunnen die bekeken worden met man(1). Zo kan er ook in de bestanden met voorbeeldinstellingen gekeken worden en naar aanvullende documentatie, als die is bijgeleverd.
Als er een website is voor de applicatie staat daar vaak ook aanvullende documentatie, veelgestelde vragen, enzovoort. Als het webadres niet bekend is, kan dat nog staan in de uitvoer van het volgende commando:
# pkg_info foopackage-1.0.0
Als er een regel met WWW: in staat, is dat de URL naar de website voor de applicatie.
Ports die na het opstarten moeten starten (zoals Internet diensten) hebben meestal een voorbeeldscript in /usr/local/etc/rc.d. Dit script kan bekeken, aangepast en hernoemd worden waar nodig. Meer informatie staat in Diensten Starten.
Als een port niet werkt, zijn er een aantal mogelijke manieren om verder te komen:
Zoek uit of er een oplossing voor de port staat te wachten in de Problem Report database. Als dat zo is kan wellicht de voorgestelde reparatie gebruikt worden.
Vraag de beheerder van de port om hulp. Voor het emailadres van de beheerder kan make maintainer getypt worden of het kan in de Makefile staan. Zet in de mail in ieder geval de naam en versie van de port (de regel met $FreeBSD: in de Makefile) en de uitvoer tot en met de foutmelding.
Opmerking: Sommige ports worden niet beheerd door een individu maar in plaats daarvan door een mailinglijst. Veel, maar niet alle, van deze adressen zien eruit als
<freebsd-lijstnaam@FreeBSD.org>. Houd hier alstublieft rekening mee bij het formuleren van vragen.In het bijzonder worden ports die geregistreerd staan als onderhouden door
<ports@FreeBSD.org>helemaal niet onderhouden. Reparaties en ondersteuning, als dat al beschikbaar is, komt vanuit de gemeenschap die is geabonneerd op die mailinglijst. Meer vrijwilligers zijn altijd nodig!
Als er geen antwoord komt, stuur dan met send-pr(1) een foutrapport in. Zie Writing FreeBSD Problem Reports).
Repareren! In het Handboek voor de Porter is gedetailleerde informatie te vinden over de infrastructuur van de “Ports”, zodat een kapotte port gemaakt kan worden of er zelfs een nieuwe port ingestuurd kan worden.
Zoek een pakket van een FTP site in de buurt. De “master” pakketcollectie staat op ftp.FreeBSD.org in de map pakketten, maar het is van belang dat er eerst in de buurt wordt gekeken! Dat het pakket werkt is waarschijnlijker dan wanneer uit de broncode wordt gecompileerd en het is nog sneller ook. Een pakket kan met pkg_add(1) geïnstalleerd worden.
FreeBSD gebruikt X11 om gebruikers een krachtige grafische gebruikersschil te bieden. X11 is een vrij beschikbare versie van het X Window System dat geïmplementeerd is in Xorg XFree86 (en andere softwarepakketten die hier niet worden besproken). De standaard en officiele smaak van X11 in FreeBSD is Xorg, de X11-server die is ontwikkeld door de X.Org Foundation onder een licentie die veel lijkt op degene die door FreeBSD wordt gebruikt. Er zijn ook commerciële X-servers voor FreeBSD beschikbaar.
Meer informatie over de videohardware die X11 ondersteunt kan gevonden worden op de Xorg website.
Na het lezen van dit hoofdstuk weet de lezer:
Wat de componenten van het X Window systeem zijn en hoe zij samenwerken.
Hoe X11 geïnstalleerd en ingesteld kan worden.
Hoe verschillende window managers geïnstalleerd en gebruikt kunnen worden.
Hoe TrueType® lettertypen in X11 te gebruiken.
Hoe het systeem ingesteld moet worden voor grafisch aanmelden (XDM).
Aangeraden voorkennis:
Hoe extra software van derden te installeren (Hoofdstuk 5).
X voor de eerste keer gebruiken kan een hele schok zijn voor mensen die gewend zijn aan andere grafische omgevingen, zoals Microsoft Windows of Mac OS.
Het is niet noodzakelijk om alle details te kennen over de X componenten en hoe zij samenwerken, maar enige basiskennis draagt wel bij aan krachtiger gebruik kunnen maken van X.
X is niet het eerste windows systeem dat geschreven is voor UNIX, maar wel het meest populaire. Het oorspronkelijke X ontwikkelteam werkte eerst aan een ander window systeem. De naam van dat systeem was “W” (van “Window”). X was gewoon de volgende letter in het alfabet.
X kan gewoon “X”, “X Window systeem”, “X11” of nog anders genoemd worden. X11 “X Windows” noemen kan door sommigen als een belediging opgevat worden. X(7) kan hierover wat licht laten schijnen.
X is vanaf het begin aan ontworpen om netwerk-centraal te zijn en gebruikt een “client-server” model.
In het X model draait de “X server” op de computer waar het toetsenbord, beeldscherm en muis aan vast zit. De server is verantwoordelijk voor het regelen van beeldinformatie, verwerken van invoer van toetsenbord en muis, en andere invoer- of uitvoerapparaten (i.e., een “tablet” kan als invoerapparaat worden gebruikt, en een videoprojector kan een alternatief uitvoerapparaat zijn). Iedere X applicatie (zoals XTerm, of Netscape) is een “cliënt”. Een cliënt stuurt berichten naar de server zoals “teken een venster op deze coördinaten” en de server stuurt berichten terug zoals “de gebruiker heeft op de OK knop gedrukt”.
Thuis of in kleine bedrijven draaien zowel de X server als de X clients op dezelfde machine. Het is heel goed mogelijk dat de X server op een minder krachtige desktop computer draait en de X applicaties (de clients) op een, zeg maar, dure krachtige machine van het bedrijf. Hier vindt de communicatie tussen de X client en server plaats over het netwerk.
Dit verwart sommige mensen, omdat de X terminologie geheel omgekeerd is aan wat ze verwachten. Dat is namelijk dat de “X server” de grote krachtige machine aan het eind van de gang is en de “X client” de machine op hun bureau is.
Opmerking: De X server is de machine met het beeldscherm en het toetsenbord en de X clients zijn de programma's die de vensters tonen.
Het protocol vereist niet dat de clients en servers hetzelfde besturingssysteem moeten draaien of hetzelfde soort computer moeten zijn. Het is heel goed mogelijk om X server op een Microsoft Windows of Apple's Mac OS te draaien en er zijn verschillende gratis en commerciële applicaties die dat doen.
De filosofie van het X ontwerp lijkt veel op die van UNIX: “gereedschappen, geen beleid”. Dit houdt in dat X niet bepaalt hoe een taak volbracht moet worden. In plaats daarvan worden gereedschappen geleverd aan de gebruiker die verantwoordelijk is voor het juiste gebruik hiervan.
Deze filosofie verbreedt zich door X niet te laten bepalen hoe vensters er moeten uitzien op het scherm, hoe ze verplaatst moeten worden met de muis, welke toetsaanslagen gebruikt moeten worden om te schakelen tussen vensters (bijvoorbeeld Alt+Tab in het geval van Microsoft Windows), hoe de titelbalken eruit moeten zien, of ze wel of niet sluitknoppen moeten hebben, enzovoort.
In plaats daarvan delegeert X deze verantwoordelijkheid aan een applicatie die “Window Manager” heet. Er zijn tientallen window managers voor X: AfterStep, Blackbox, ctwm, Enlightenment, fvwm, Sawfish, twm, Window Maker en vele anderen. Elk van deze window managers heeft een eigen voorkomen en werking. Er zijn window managers met “virtual desktops” of met eigen toetscombinaties om de desktop te beheren; of hebben een “Start” knop of iets gelijksoortig. Sommige gebruiken “thema's” die uiterlijk en beleving compleet veranderen door een nieuw thema te kiezen. Window managers zijn te vinden in de categorie x11-wm van de Portscollectie.
De KDE en GNOME desktop omgevingen hebben hun eigen window managers die in het bureaublad zijn geïntegreerd.
Iedere windows manager heeft zijn eigen manier van instellen. Sommige werken met handgetypte bestanden, anderen beschikken over grafische gereedschappen voor de meeste instellingen. Er is er minstens één (Sawfish) waarvan het instellingenbestand is geschreven in een dialect van de taal Lisp.
Focusbeleid: De window manager is ook verantwoordelijk voor het “focusbeleid” van de muis. Ieder window geörienteerd systeem heeft een manier nodig om te bepalen welk venster actief is, toetsaanslagen ontvangt en daarbij zichtbaar aangeeft welk venster actief is.
Een bekend focus beleid heet “click-to-focus”. Dit model wordt gebruikt door Microsoft Windows, waarbij een venster actief wordt door er met de muis op te klikken.
X ondersteunt geen specifiek focusbeleid. In plaats daarvan bepaalt de window manager op welk venster, op welk moment, de focus ligt. Een aantal window managers ondersteunen verschillende focusmethoden. Ze ondersteunen allemaal “click to focus” en de meerderheid ondersteunt ook nog andere.
De meest populaire zijn:
- focus-volgt-muis (focus-follows-mouse)
Het venster dat onder de muis zit is het venster waarop de focus ligt. Dit hoeft niet het venster te zijn dat bovenop alle andere vensters ligt. De focus verandert door te wijzen naar een ander venster. Het is niet nodig om er ook nog eens op te klikken.
- slordige-focus (sloppy-focus)
Dit beleid is een kleine uitbreiding op focus-follows-mouse. Indien bij focus-follows-mouse de muis over het root venster (of de achtergrond) gaat, ligt op geen enkel venster de focus en gaan alle toetsaanslagen verloren. Bij sloppy-focus, verandert de focus alleen als de muis in een nieuw venster komt en niet als het huidige venster wordt verlaten.
- klik-voor-focus (click-to-focus)
Het actieve venster wordt geselecteerd door erop te klikken. Het venster wordt dan “opgetild” en verschijnt dan voor alle andere vensters. Alle toetsaanslagen worden nu naar dit venster gestuurd, zelfs als de cursor naar een ander scherm wordt verplaatst.
Veel window managers ondersteunen andere soorten of variaties op de bovenstaande typen muisbeleid. Hierover staat meestal meer in de documentatie van de betreffende window manager.
De X aanpak door gereedschappen te leveren en niets af te dwingen breidt zich uit naar de widgets die in elk applicatievenster te zien zijn.
“Widget” is een term voor alle dingen van de gebruikersinterface waarop geklikt kan worden of een andere actie mee uitgevoerd kan worden: knoppen, vinkvakjes, iconen, lijsten en ga zo maar door. Microsoft Windows noemt ze “controls”.
Microsoft Windows en Apple's Mac OS hebben beide een erg strikt widgetbeleid. Van de applicatieontwikkelaars wordt verwacht dat hun applicaties eenduidig zijn wat betreft uiterlijk en beleving. Bij X is ervoor gekozen geen grafische stijl of widgets te verplichten.
X applicaties hebben dus niet allemaal hetzelfde uiterlijk. Er zijn populaire widgetsets en variaties, inclusief de originele Athena widgetset van MIT, Motif® (waarvan de widgetset van Microsoft Windows is afgeleid: schuine randen en drie gradaties grijs), OpenLook en anderen.
De meeste nieuwe X applicaties gebruiken een modern uitziende widgetset: Qt, gebruikt door KDE, of GTK+ van het GNOME project. Vanuit dit oogpunt lijkt het enigszins op de UNIX desktop, wat het makkelijker maakt voor de beginnende gebruiker.
Xorg is de standaard X11 implementatie voor FreeBSD. Xorg is de X11 server van de open source implementatie die is uitgebracht door de X.Org Foundation. Xorg is gebaseerd op de code van XFree86 4.4RC2 en X11R6.6. De versie van Xorg die momenteel beschikbaar is in de FreeBSD Portscollectie is 7.5.2.
Om Xorg vanuit de Portscollectie te bouwen en te installeren:
# cd /usr/ports/x11/xorg # make install clean
Opmerking: Om Xorg compleet te bouwen is tenminste 4 GB vrije schijfruimte nodig.
X11 kan ook als pakket geïnstalleerd worden doordat er binaire pakketten beschikbaar zijn voor pkg_add(1). Als hiervoor de optie “remote fetching” van pkg_add(1) wordt gebruikt, dan moet het versienummer verwijderd worden. pkg_add(1) haalt automatisch de laatste versie van het programma op.
Om het pakket voor Xorg op te halen en te installeren:
# pkg_add -r xorg
Opmerking: Het voorbeeld hierboven installeert de complete X11 distributie inclusief de servers, clients, lettertypen enz. Er zijn ook afzonderlijke pakketten en ports beschikbaar voor verschillende delen van X11.
Om een minimale X11-distributie te installeren kunt u als alternatief x11/xorg-minimal installeren.
De rest van dit hoofdstuk licht toe hoe X11 wordt ingesteld en hoe een productieve desktopomgeving gebouwd kan worden.
Voordat er wordt begonnen met het instellen van X11 is de volgende informatie van de te installeren machine nodig:
Monitor specificaties
Chipset van de videokaart
Geheugen van de videokaart
De specificaties van de monitor worden door X11 gebruikt om de resolutie en ververssnelheid te bepalen. Deze specificaties kunnen normaal gesproken verkregen worden uit de bij de monitor geleverde documentatie of van de website van de leverancier. Er zijn twee nummerreeksen nodig: de horizontale scansnelheid (scan rate) en de verticale synchronisatiesnelheid (vertical synchronization).
De chipset van de videokaart bepaalt welk stuurprogramma X11 gebruikt om de grafische hardware aan te spreken. Bij de meeste chipsets kan dit automatisch bepaald worden, maar het is altijd handig om dit te weten voor het geval de automatische detectie niet correct werkt.
Het geheugen op de videokaart bepaalt de resolutie en kleurdiepte waarmee het systeem kan werken. Dit is belangrijk omdat de gebruiker zo de grenzen van zijn systeem kent.
Xorg gebruikt HAL om toetsenborden en muizen automatisch te detecteren. De ports sysutils/hal en devel/dbus worden als afhankelijkheden van x11/xorg geïnstalleerd, maar moeten met de volgende regels in het bestand /etc/rc.conf worden aangezet:
hald_enable="YES" dbus_enable="YES"
Deze diensten dienen gestart te worden (ofwel handmatig of door opnieuw op te starten) voordat er verder wordt gegaan met de configuratie of gebruik van Xorg.
Xorg werkt vaak zonder enige verdere configuratie door het volgende op de prompt te typen:
% startx
De automatische configuratie kan met sommige hardware mislukken, of het kan dingen anders instellen dan gewenst is. In deze gevallen is handmatige configuratie nodig.
Opmerking: Bureaubladomgevingen als GNOME, KDE, of Xfce hebben gereedschappen waarmee de gebruiker eenvoudig de schermparameters zoals de resolutie kan instellen. Dus als de standaardconfiguratie niet acceptabel is en u van plan bent om een bureaubladomgeving te installeren kunt u gewoon doorgaan met de installatie van de bureaubladomgeving en het juiste scherminstelgereedschap gebruiken.
Het instellen van X11 bestaat uit meerdere stappen. De eerste stap is het bouwen van een instellingenbestand. Dit kan als de supergebruiker met:
# Xorg -configure
Dit genereert een kaal X11-instellingenbestand in de map /root met de naam xorg.conf.new. Feitelijk wordt bepaald waar de map staat door hoe er superuser rechten zijn verkregen. $HOME is anders bij gebruik van su(1) of bij direct aanmelden. Het X11 programma probeert dan de grafische hardware te detecteren en schrijft een instellingenbestand dat de juiste stuurprogramma's laadt voor de gevonden hardware van het systeem.
De volgende stap is het testen van de bestaande instellingen om te controleren of Xorg met de grafische kaart van het doelsysteem kan werken. Typ:
# Xorg -config xorg.conf.new -retro
Als er een zwart/grijs rooster en een X muis cursor verschijnen was de instelling succesvol. Om de test te stoppen dient naar de virtuele console waarmee de test werd gestart overgeschakeld te worden door op Ctrl+Alt+Fn (F1 voor de eerste virtuele console) en Ctrl+C te drukken.
Opmerking: De toetsencombinatie Ctrl+Alt+Backspace kan ook gebruikt worden om uit Xorg te breken. Om het aan te zetten, kunt u òfwel het volgende commando uitvoeren vanaf elke X-terminal-emulator:
% setxkbmap -option terminate:ctrl_alt_bkspòf een instellingenbestand voor het toetsenbord genaamd x11-input.fdi voor hald aanmaken en het in de map /usr/local/etc/hal/fdi/policy opslaan. Dit bestand dient het volgende te bevatten:
<?xml version="1.0" encoding="ISO-8859-1"?> <deviceinfo version="0.2"> <device> <match key="info.capabilities" contains="input.keyboard"> <merge key="input.x11_options.XkbOptions" type="string">terminate:ctrl_alt_bksp</merge> </match> </device> </deviceinfo>U moet uw machine opnieuw opstarten om hald te forceren om dit bestand te lezen.
De volgende regel dient ook aan de sectie ServerLayout of ServerFlags van xorg.conf.new te worden toegevoegd:
Option "DontZap" "off"
Als de muis niet werkt, dan moet deze eerst ingesteld worden. Zie Paragraaf 2.10.10 in het FreeBSD installatiehoofdstuk. In recente versies van Xorg worden de secties InputDevice in xorg.conf genegeerd ten voorkeur van de automatisch gedetecteerde apparaten. Voeg de volgende regel aan de sectie ServerLayout of ServerFlags van dit bestand toe om het oude gedrag te herstellen:
Option "AutoAddDevices" "false"
Invoerapparaten kunnen dan zoals in vorige versies worden geconfigureerd, tezamen met eventuele andere benodigde opties (bijvoorbeeld omschakelen van toetsenbordindeling).
Opmerking: Zoals al eerder is uitgelegd zal de daemon hald standaard automatisch uw toetsenbord detecteren. Het kan zijn dat de indeling of het model van uw toetsenbord niet juist zijn. Bureaubladomgevingen zoals GNOME, KDE of Xfce bieden gereedschappen om het toetsenbord in te stellen. Het is echter mogelijk om de eigenschappen direct in te stellen met behulp van het gereedschap setxkbmap(1) of met een configuratieregel van hald.
Als men bijvoorbeeld een PC-toetsenbord met 102 toetsen met een Franse indeling wilt gebruiken, dienen we een instellingenbestand voor het toestenbord voor hald aan te maken genaamd x11-input.fdi en het op te slaan in de map /usr/local/etc/hal/fdi/policy. Het dient de volgende regels te bevatten:
<?xml version="1.0" encoding="ISO-8859-1"?> <deviceinfo version="0.2"> <device> <match key="info.capabilities" contains="input.keyboard"> <merge key="input.x11_options.XkbModel" type="string">pc102</merge> <merge key="input.x11_options.XkbLayout" type="string">fr</merge> </match> </device> <deviceinfo>Als dit bestand al bestaat, kunt u de regels betreffende de configuratie van het toetsenbord kopiëren en aan uw bestand toevoegen.
U dient uw machine opnieuw op te starten om hald te forceren om dit bestand te lezen.
Het is mogelijk om hetzelfde te bereiken vanaf een X-terminal of een script met dit commando:
% setxkbmap -model pc102 -layout frHet bestand /usr/local/share/X11/xkb/rules/base.lst noemt de beschikbare toetsenborden, indelingen en opties.
Nu moet xorg.conf.new worden aangepast aan de smaak van de gebruiker. Hiervoor moet het bestand in een teksteditor zoals emacs(1) of ee(1) worden geladen. Eerst moeten de frequenties van de monitor toegevoegd worden. Die zijn meestal weergegeven als horizontale en verticale synchronisatiesnelheid. Deze waarden worden toegevoegd aan xorg.conf.new in het onderdeel "Monitor":
Section "Monitor"
Identifier "Monitor0"
VendorName "Monitor Vendor"
ModelName "Monitor Model"
HorizSync 30-107
VertRefresh 48-120
EndSection
In het instellingenbestand kunnen de sleutelwoorden HorizSync en VertRefresh missen. Als ze er niet staan, moeten ze toegevoegd worden met de juiste horizontale synchronisatiesnelheid achter het HorizSync sleutelwoord en de verticale synchronisatiesnelheid achter het VertRefresh sleutelwoord. In het bovenstaande voorbeeld werden de gegevens van de monitor ingevoerd.
X kan DPMS (Energy Star) eigenschappen gebruiken bij monitoren die dit ondersteunen. xset(1) regelt de timeouts en kan de statussen standby, suspend of uit forceren. Om DPMS eigenschappen voor een monitor te activeren, moet de volgende regel toegevoegd worden aan de monitor sectie:
Option "DPMS"
Als het instellingenbestand xorg.conf.new toch open staat in de editor dan kan ook meteen de gewenste standaardresolutie en kleurdiepte gekozen worden. Dit staat in het onderdeel "Screen":
Section "Screen"
Identifier "Screen0"
Device "Card0"
Monitor "Monitor0"
DefaultDepth 24
SubSection "Display"
Viewport 0 0
Depth 24
Modes "1024x768"
EndSubSection
EndSection
Het sleutelwoord DefaultDepth beschrijft de kleurdiepte
die standaard wordt gebruikt. Met de commandoregeloptie -depth van Xorg(1) kan dit
overschreven worden. Het sleutelwoord Modes beschrijft de
resolutie waarmee gewerkt wordt bij de opgegeven kleurdiepte. Alleen VESA
standaarden die door de grafische kaart van het systeem worden gedefinieerd
worden ondersteund. In het voorbeeld hierboven is de standaard kleurdiepte 24 bits
per pixel. Bij deze kleurdiepte is de toegestane resolutie 1024 bij 768
pixels.
Opmerking: Bij het oplossen van problemen zijn de logboekbestanden van X11 vaak een goede hulp. Ze bevatten informatie voor ieder apparaat waar de X11 server verbinding mee maakt. Namen van Xorg logboekbestanden hebben de vorm /var/log/Xorg.0.log. De precieze naam van een logboekbestand van variëren van Xorg.0.log tot Xorg.8.log enzovoort.
Als alles is ingesteld, moet het instellingenbestand op een plaats gezet worden waar Xorg(1) het kan vinden. Dit is meestal /etc/X11/xorg.conf of /usr/local/etc/X11/xorg.conf:
# cp xorg.conf.new /etc/X11/xorg.conf
Het instellen van X11 is nu gereed. Xorg gestart worden met startx(1). De X11-server kan ook gestart worden met behulp van xdm(1).
Instellen met Intel i810 geïntegreerde chipsets vereist de agpgart AGP programmeerinterface voor X11 om de kaart aan te sturen. Zie de agp(4) handleiding voor meer informatie.
Hierdoor wordt het instellen van de hardware net als ieder andere grafische kaart. Bij systemen die zonder agp(4) stuurprogramma gecompileerd zijn slaagt het laden van module met kldload(8) niet. Het stuurprogramma moet in de kernel geladen zijn tijdens het opstarten door te compileren of door /boot/loader.conf te gebruiken.
Deze sectie gaat uit van wat diepere configuratiekennis. Als pogingen om de bovenstaande standaard instelgereedschappen niet tot een werkende configuratie leidden, dan is er genoeg informatie in de logbestanden om de opstelling aan de praat te krijgen. Het gebruik van een tekstverwerker zal nodig zijn.
Huidige breedbeeldformaten (zoals WSXGA, WSXGA+, WUXGA, WXGA en WXGA+) ondersteunen 16:10 en 10:9 formaten of aspectverhoudingen die problematisch kunnen zijn. Voorbeelden van enkele veelvoorkomende schermresoluties voor 16:10 aspectverhoudingen zijn:
2560x1600
1920x1200
1680x1050
1440x900
1280x800
Op een gegeven moment zal het toevoegen van een van deze resoluties net zo eenvoudig zijn als een mogelijke Mode in het Section "Screen":
Section "Screen" Identifier "Screen 0" Device "Card0" Monitor "Monitor0" DefaultDepth 24 SubSection "Display" Viewport 0 0 Depth 24 Modes "1680x1050" EndSubSection EndSection
Xorg is slim genoeg om de resolutie-informatie via I2C/DDC-informtie uit het flatpanel te onttrekken zodat het weet wat de monitor aan kan wat betreft frequenties en resoluties.
Als die ModeLines niet bestaan in de stuurprogramma's, dient men Xorg een kleine hint te geven. Met behulp van /var/log/Xorg.0.log kan men genoeg informatie onttrekken om handmatig een werkende ModeLine aan te maken. Kijk naar informatie die op deze lijkt:
(II) MGA(0): Supported additional Video Mode: (II) MGA(0): clock: 146.2 MHz Image Size: 433 x 271 mm (II) MGA(0): h_active: 1680 h_sync: 1784 h_sync_end 1960 h_blank_end 2240 h_border: 0 (II) MGA(0): v_active: 1050 v_sync: 1053 v_sync_end 1059 v_blanking: 1089 v_border: 0 (II) MGA(0): Ranges: V min: 48 V max: 85 Hz, H min: 30 H max: 94 kHz, PixClock max 170 MHz
Deze informatie wordt EDID-informatie genoemd. Hiervan een ModeLine maken is gewoon een kwestie van de nummers in de juiste volgorde zetten:
ModeLine <name> <clock> <4 horiz. timings> <4 vert. timings>
Dus de ModeLine in Section "Monitor" zou er voor dit voorbeeld uitzien als:
Section "Monitor" Identifier "Monitor1" VendorName "GroteNaam" ModelName "BesteModel" ModeLine "1680x1050" 146.2 1680 1784 1960 2240 1050 1053 1059 1089 Option "DPMS" EndSection
Na het voltooien van deze eenvoudige stappen, zou X moeten starten op uw nieuwe breedbeeldmonitor.
De standaard lettertypen van X11 zijn allerminst ideaal voor het typische bureaubladprogramma. Grote presentatielettertypen zien er hoekig en onprofessioneel uit en kleine lettertypen in Netscape zijn bijna onleesbaar. Er zijn diverse gratis, kwalitatief goede Type1 (PostScript®) lettertypen die meteen gebruikt kunnen worden met X11. De URW lettertypecollectie (x11-fonts/urwfonts) heeft bijvoorbeeld hoge kwaliteit versies van standaard Type1 lettertypen (Times Roman®, Helvetica®, Palatino® en anderen). De Freefonts collectie (x11-fonts/freefonts) heeft nog meer lettertypen, maar de meesten ervan zijn bedoeld om in grafische software als Gimp gebruikt te worden en zijn niet compleet genoeg om als schermlettertypen te gebruiken. Daarbij kan X11 zonder veel moeite ingesteld worden om TrueType lettertypen te gebruiken. Meer informatie staat in X(7) of de paragraaf over TrueType Lettertypen.
Om de bovenstaande Type1 lettertypecollectie van de Portscollectie te installeren:
# cd /usr/ports/x11-fonts/urwfonts # make install clean
Dat geldt ook voor de freefont en andere collecties. Om de X server te vertellen dat deze lettertypen bestaan, dient de volgende regel toegevoegd te worden aan het instellingenbestand van de X server (/etc/X11/xorg.conf):
FontPath "/usr/local/lib/X11/fonts/URW/"
Ook kan op de commando regel in de X sessie het volgende gestart worden:
% xset fp+ /usr/local/lib/X11/fonts/URW % xset fp rehash
Dit werkt wel, maar zodra de X sessie wordt afgesloten is het weer verdwenen tenzij het is toegevoegd aan het opstartbestand (~/.xinitrc voor een normale startx sessie of ~/.xsession als er wordt aangemeld met een grafische aanmeldmanager als XDM). Een derde manier is het gebruik van het nieuwe bestand /usr/local/etc/fonts/local.conf: zie hiervoor de paragraaf over Anti-aliasing.
Xorg heeft ingebouwde ondersteuning voor het renderen van TrueType lettertypen. Er zijn twee verschillende modules die deze functionaliteit activeren. In dit voorbeeld wordt de freetype module gebruikt omdat deze beter werkt met de andere lettertypen die back-ends renderen. Om de freetype module te activeren dient de volgende regel toegevoegd te worden aan het onderdeel "Module" van /etc/X11/xorg.conf.
Load "freetype"
Hierna dient een map voor de TrueType lettertypen gemaakt te worden (bijvoorbeeld /usr/local/lib/X11/fonts/TrueType) en alle TrueType lettertypen moeten naar deze map gekopieerd worden. TrueType lettertypen kunnen niet direct van een Macintosh® gehaald worden. Ze moeten in een UNIX/MS-DOS/Windows formaat zijn voor X11. Zodra de bestanden naar deze map zijn gekopieerd, kan ttmkfdir gestart worden om een fonts.dir bestand te maken zodat de X lettertyperenderer weet waar deze nieuwe bestanden zijn geïnstalleerd. ttmkfdir zit in de FreeBSD Portscollectie als x11-fonts/ttmkfdir.
# cd /usr/local/lib/X11/fonts/TrueType # ttmkfdir -o fonts.dir
Nu moet de TrueType map toe aan het lettertypepad toegevoegd worden. Dit gebeurt op dezelfde wijze als boven is beschreven voor Type1 lettertypen:
% xset fp+ /usr/local/lib/X11/fonts/TrueType % xset fp rehash
of door een FontPath regel toe te voegen aan xorg.conf.
Dat is alles. Nu herkennen Netscape, Gimp, StarOffice™ en alle andere X applicaties de geïnstalleerde TrueType lettertypen. Extreem kleine lettertypen (zoals hoge resolutie tekst op een webpagina) en extreme grote lettertypen (in StarOffice) zien er nu veel beter uit.
Alle lettertypen die X11 in de mappen /usr/local/lib/X11/fonts/ en ~/.fonts/ staan zijn automatisch beschikbaar voor anti-aliasing in applicaties die Xft ondersteunen. De meeste recente applicaties ondersteunen Xft, inclusief KDE, GNOME, en Firefox.
Om te kunnen regelen welke lettertypen gebruik maken van anti-alias of om de eigenschappen van anti-aliasing in te stellen kan /usr/local/etc/fonts/local.conf gemaakt of gewijzigd worden. In dit bestand kunnen speciale eigenschappen van het Xft lettertypesysteem aangepast worden. Deze paragraaf beschrijft wat eenvoudige mogelijkheden. Meer details staan in fonts-conf(5).
Dit bestand moet in het XML formaat opgemaakt worden. Hoofdletters en kleine letters worden onderscheiden en alle tags moeten netjes worden afgesloten. Het bestand begint met de gewone XML header gevolgd door een DOCTYPE definitie en daarna de <fontconfig> tag:
<?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig>
Zoals al eerder is vermeld zijn alle lettertypen in /usr/local/lib/X11/fonts/ en in ~/.fonts/ al geschikt gemaakt voor Xft applicaties. Als naast deze twee mappen nog een andere lettertypen moeten kunnen bevatten, dan dient een soortgelijke regel als de onderstaande aan /usr/local/etc/fonts/local.conf toegevoegd te worden:
<dir>/pad/naar/mijn/fonts</dir>
Na het toevoegen van nieuwe lettertypen en zeker nieuwe lettertypemappen dienen de lettertypecaches opnieuw opgebouwd worden met:
# fc-cache -f
Anti-aliasing maakt randen een beetje wazig wat kleine teksten beter leesbaar maakt en voorkomt “trapvorming” van grote letters. Maar het kan oogkramp veroorzaken als het op normale tekst wordt toegepast. Om lettertypen kleiner dan 14 punten uit te sluiten van anti-aliasing moeten de volgende regels toegevoegd worden:
<match target="font">
<test name="size" compare="less">
<double>14</double>
</test>
<edit name="antialias" mode="assign">
<bool>false</bool>
</edit>
</match>
<match target="font">
<test name="pixelsize" compare="less" qual="any">
<double>14</double>
</test>
<edit mode="assign" name="antialias">
<bool>false</bool>
</edit>
</match>
Spatiëring voor sommige enkel gespatieerde lettertypen kan ook ongepast zijn bij anti-aliasing. Dit lijkt vooral een probleem te zijn bij KDE. Een mogelijke oplossing hiervoor is het vergroten van de spatiëring van die lettertypen naar 100:
<match target="pattern" name="family">
<test qual="any" name="family">
<string>fixed</string>
</test>
<edit name="family" mode="assign">
<string>mono</string>
</edit>
</match>
<match target="pattern" name="family">
<test qual="any" name="family">
<string>console</string>
</test>
<edit name="family" mode="assign">
<string>mono</string>
</edit>
</match>
Het bovenstaande hernoemt de standaardnamen van lettertypen naar "mono"). Voeg daarna het volgende toe:
<match target="pattern" name="family">
<test qual="any" name="family">
<string>mono</string>
</test>
<edit name="spacing" mode="assign">
<int>100</int>
</edit>
</match>
Bepaalde lettertypen, zoals Helvetica, kunnen problemen hebben met anti-aliasing. Dit uit zich meestal in een lettertype dat verticaal door midden lijkt gesneden. Op zijn ergst kan het applicaties laten crashen. Om dit te voorkomen kan overwogen worden om ook de volgende regels toe te voegen aan local.conf:
<match target="pattern" name="family">
<test qual="any" name="family">
<string>Helvetica</string>
</test>
<edit name="family" mode="assign">
<string>sans-serif</string>
</edit>
</match>
Als de wijzigingen in local.conf zijn gemaakt dient niet vergeten te worden het bestand te eindigen met de tag </fontconfig> tag. Als dit niet gedaan wordt, dan worden de wijzigingen niet gezien.
Als laatste kunnen gebruikers hun eigen instellingen aan een persoonlijk .fonts.conf bestand toevoegen. Om dit te doen moet iedere gebruiker het bestand ~/.fonts.conf maken. Ook dit bestand moet in het XML formaat zijn.
Nog een laatste punt: bij een LCD scherm kan sub-pixel sampling prettig zijn. Eigenlijk zorgt dit er voor dat de (horizontaal gesplitste) rode, groene en blauwe componenten gewijzigd worden om de horizontale resolutie te verbeteren. Het resultaat is geweldig. Voeg hiervoor de volgende regels ergens aan local.conf toe:
<match target="font">
<test qual="all" name="rgba">
<const>unknown</const>
</test>
<edit name="rgba" mode="assign">
<const>rgb</const>
</edit>
</match>
Opmerking: Afhankelijk van het soort beeldscherm kan rgb veranderd moeten worden in bgr, vrgb of vbgr. Experimenteren levert de beste instelling op.
De X beeldschermmanager (XDM) is een optioneel onderdeel van het X Window systeem dat gebruikt wordt voor beheer van aanmeldsessies. Dit is vaak erg handig bij bijvoorbeeld “X Terminals”, desktops en grote netwerk beeldschermservers. Omdat het X Window systeem netwerk- en protocolonafhankelijk is, zijn er veel mogelijkheden om X clients en servers op verschillende machines in een netwerk te verbinden. XDM levert een grafische interface waarmee er gekozen kan worden welke beeldschermserver gebruikt moet worden en handelt autorisatie informatie (gebruikersnaam en wachtwoord) af.
XDM levert de gebruiker dezelfde functionaliteit levert als getty(8) (zie Paragraaf 27.3.2). Dus het regelt de systeemaanmeldingen voor de schermen waaraan verbonden moet worden en start dan een sessie manager namens de gebruiker (meestal een X window manager). XDM wacht dan tot het programma stopt en geeft aan dat de gebruiker klaar is en afgemeld kan worden. Hierna kan XDM het aanmeldscherm weer tonen zodat de volgende gebruiker kan aanmelden.
Om XDM te gebruiken moet de port x11/xdm geïnstalleerd worden (het wordt in recente versies van Xorg niet standaard geïnstalleerd). Het daemon-programma XDM is daarna beschikbaar in /usr/local/bin/xdm. Dit programma kan als root altijd gestart worden en regelt dan het X weergavegedeelte van de lokale machine. Als XDM iedere keer bij het opstarten moet starten is het handig om een regel toe te voegen aan /etc/ttys. Meer informatie over het gebruik van dit bestand staat in Paragraaf 27.3.2.1. In de standaardversie van /etc/ttys staat een regel om de applicatie daemon XDM op een virtuele terminal te draaien:
ttyv8 "/usr/local/bin/xdm -nodaemon" xterm off secure
Standaard staat deze regel uit. Om hem aan te zetten moet veld 5 van off naar on gewijzigd worden en moet met init(8) herstart worden met gebruikmaking van de aanwijzingen in Paragraaf 27.3.2.2. Het eerste veld, de naam van de terminal die het programma aanstuurt, is ttyv8. Dit houdt in dat XDM op de negende virtuele terminal begint te draaien.
De map met instellingen voor XDM is /usr/local/lib/X11/xdm. In deze map staan diverse bestanden die gebruikt kunnen worden om het gedrag en uiterlijk van XDM te veranderen. Meestal zijn dit de volgende bestanden:
| Bestand | Omschrijving |
|---|---|
| Xaccess | Regels voor client authorisatie. |
| Xresources | Standaard waarden voor X bronnen. |
| Xservers | Lijst met op afstand en lokaal te beheren schermen. |
| Xsession | Standaard sessie script voor logins. |
| Xsetup_* | Script die applicaties start voordat de login interface start. |
| xdm-config | Algehele instellingen voor alle schermen op deze machine. |
| xdm-errors | Fouten die gegenereerd zijn door het serverprogramma. |
| xdm-pid | Het proces ID van de draaiende XDM. |
Tevens staan in deze map een aantal scripts en programma's om het bureaublad in te stellen als XDM draait. Het doel van elk van deze bestanden wordt kort omschreven. De juiste syntaxis en het gebruik van deze bestanden staat in xdm(1).
De standaardinstelling regelt een eenvoudig rechthoekig aanmeldvenster met bovenin de hostnaam van de machine in een groot lettertype met een “Login:” en “Password:” prompt eronder. Dit is een goed beginpunt om het uiterlijk en werking van het XDM venster te veranderen.
Om een verbinding te maken met XDM-gestuurde schermen wordt het protocol X Display Manager Connection Protocol (XDMCP) gebruikt. Het bestand is een set regels die XDMCP verbindingen met andere machines bestuurt. Het wordt genegeerd, tenzij xdm-config is gewijzigd zodat er wordt geluisterd naar inkomende verbindingen. Standaard wordt het clients niet toegestaan te verbinden.
Dit is een bestand met standaarden voor de schermkiezer en de aanmeldschermen. Hier kan het uiterlijk van het aanmeldprogramma gewijzigd worden. De indeling is hetzelfde als bij het app-defaults bestand en is beschreven in de X11 documentatie.
Dit is het standaard sessiescript voor XDM dat start nadat de gebruiker is aangemeld. Normaal heeft iedere gebruiker een eigen sessiescript in ~/.xsession dat dit script overheerst.
Deze starten automatisch voordat de kiezers of aanmeldschermen getoond worden. Er is een script voor ieder gebruikt scherm met de naam Xsetup_ gevolgd door het lokale schermnummer (bijvoorbeeld Xsetup_0). Normaal draaien deze scripts éé of twee programma's in de achtergrond zoals xconsole.
Dit bevat de instellingen die toegepast worden op ieder scherm die deze installatie aanstuurt. De indeling is hetzelfde als van app-defaults.
Hierin staan de meldingen die de X servers geven als XDM ze probeert te starten. Als een scherm dat gestart is door XDM om onduidelijke reden hangt, is dit een goede plaats om te zoeken naar foutmeldingen. Deze meldingen worden ook per sessie naar het ~/.xsession-errors van de gebruiker gestuurd.
Om gebruikers een verbinding te laten maken met een X server moeten de toegangsregels gewijzigd worden en de connectielistener moet aangezet worden. Deze hebben standaard wat terughoudende waarden. Om XDM te laten luisteren naar verbindingen moet als eerste een regel uitgecommentarieerd worden in xdm-config:
! SECURITY: do not listen for XDMCP or Chooser requests ! Comment out this line if you want to manage X terminals with XDM DisplayManager.requestPort: 0
Hierna moet XDM herstart worden. Afwijkend in dit bestand is dat commentaar in app-defaults bestanden begint met het karakter “!” en niet met het karakter “#”. Het kan wenselijk zijn om de toegangscontrole aan te scherpen -- hiervoor staan voorbeeldregels in Xaccess en lees de hulppagina xdm(1) voor meer informatie.
Er bestaan diverse alternatieven voor het XDM programma. KDM (wordt geleverd bij KDE) wordt later in dit hoofdstuk behandeld. De beeldschermmanager KDM biedt vele grafische verbeteringen en cosmetische franje en de mogelijkheid om de gebruiker de kans te geven een window manager te laten kiezen bij het aanmelden.
Deze sectie beschrijft de verschillende bureaubladomgevingen voor X op FreeBSD. Een “bureaubladomgeving” kan van alles inhouden: van een simpele window manager tot een complete suite van bureaubladapplicaties zoals KDE of GNOME.
GNOME is een gebruikersvriendelijke bureaubladomgeving die de gebruiker de mogelijkheid geeft om gemakkelijk de computer te gebruiken en in te stellen. GNOME heeft een paneel (voor het starten en tonen van statusinformatie van applicaties), een bureaublad (waar data en applicaties geplaatst kunnen worden), een set standaard bureaubladapplicaties en een regels die het makkelijker maakt voor applicaties om eenduidig met elkaar samen te werken. Gebruikers van andere besturingssystemen of omgevingen voelen zich meestal meteen thuis bij het gebruik van de krachtige grafisch gestuurde omgeving die GNOME biedt. Meer informatie over GNOME op FreeBSD staat op de FreeBSD GNOME Project website. De website bevat ook redelijk complete FAQ's over het installeren, instellen en beheren van GNOME.
De software kan eenvoudig worden geïnstalleerd vanuit een pakket of de Portscollectie:
Om het GNOME pakket te installeren:
# pkg_add -r gnome2
Om GNOME vanuit de Portscollectie te installeren:
# cd /usr/ports/x11/gnome2 # make install clean
Voor een correcte werking, vereist GNOME dat het /proc bestandssysteem gekoppeld is. Voeg
proc /proc procfs rw 0 0
toe aan /etc/fstab om procfs(5) automatisch te koppelen tijdens het opstarten.
Zodra GNOME geïnstalleerd is, moet de X server verteld worden dat in plaats van de standaard window manager GNOME gebruikt moet worden.
De meest eenvoudige manier om GNOME te starten is via GDM, de GNOME Display Manager. GDM wordt meegeïnstalleerd met de GNOME bureaubladomgeving, maar staat standaard uitgeschakeld. Dit programma kan ingeschakeld worden door het volgende toe te voegen aan /etc/rc.conf:
gdm_enable="YES"
Na een herstart zal GDM automatisch gestart worden.
Meestal is het gewenst om alle GNOME applicaties tegelijkertijd met GDM te starten. Om dit te bereiken moet de volgende regel worden toegevoegd aan /etc/rc.conf:
gnome_enable="YES"
GNOME kan ook gestart worden vanaf de commandoregel door het bestand .xinitrc juist in te stellen. Als er al een .xinitrc is, dan hoeft alleen de regel die de huidige window manager start veranderd te worden in een regel die /usr/local/bin/gnome-session start. Als er niets speciaals met dit instellingenbestand is gedaan:
% echo "/usr/local/bin/gnome-session" > ~/.xinitrc
Nu kan met startx de GNOME bureaubladomgeving gestart worden.
Opmerking: Als een beeldschermmanager als XDM gebruikt wordt werkt het bovenstaande niet. In plaats daarvan moet een uitvoerbaar .xsession gemaakt worden met hetzelfde commando erin. Hiervoor moet het bestand aangepast worden door het bestaande window manager commando te vervangen door /usr/local/bin/gnome-session:
% echo "#!/bin/sh" > ~/.xsession % echo "/usr/local/bin/gnome-session" >> ~/.xsession % chmod +x ~/.xsession
Het is ook mogelijk de beeldschermmanager zo in te stellen dat de window manager gekozen kan worden tijdens het aanmelden. In de paragraaf Meer KDE Details wordt uitgelegd hoe dit gedaan moet worden voor de KDM beeldschermmanager van KDE.
KDE is een bureaubladomgeving die eigentijds is en makkelijk in gebruik. KDE biedt de gebruiker:
Een schitterende eigentijdse desktop;
Een desktop die volledig netwerktransparant is;
Een geïntegreerd hulpsysteem dat eenvoudig bruikbare informatie geeft over het gebruik van het KDE bureaublad en de applicaties;
Alle KDE applicaties werken op dezelfde manier en zien er hetzelfde uit;
Gestandaardiseerde menu's en werkbalken, keybindings, kleurschema's, enzovoort;
Internationalisatie: KDE is beschikbaar in meer dan 55 talen;
Gecentraliseerde, consistente, dialooggedreven bureaubladinstelling;
Een grote hoeveelheid bruikbare KDE applicaties;
KDE wordt geleverd met een webbrowser genaamd Konqueror die niet onder doet voor de andere bestaande webbrowsers op UNIX systemen. Meer informatie over KDE staat op de KDE website. Voor FreeBSD specifieke informatie en bronnen over KDE is er de website KDE/FreeBSD initiatief.
Er zijn twee versies van KDE beschikbaar op FreeBSD. Versie 3 is sinds lange tijd aanwezig en is nog steeds beschikbaar in de Portscollectie alhoewel het nu onbeheerd en gedeeltelijk kapot is. Versie 4 wordt punctueel bijgewerkt en is de standaardkeuze voor gebruikers van KDE. Ze kunnen zelfs naast elkaar worden geïnstalleerd.
Net als bij GNOME of iedere andere bureaubladomgeving kan de software eenvoudig geïnstalleerd met een pakket of uit de Portscollectie:
Om het KDE 3 pakket van het netwerk te installeren:
# pkg_add -r kde
Om het KDE 4 pakket van het netwerk te installeren:
# pkg_add -r kde4
pkg_add(1) haalt automatisch de laatste versie van de applicatie op.
Om KDE 3 vanuit de Portscollectie te bouwen en te installeren:
# cd /usr/ports/x11/kde3 # make install clean
Gebruik de Portscollectie om KDE 4 vanuit de broncode te bouwen:
# cd /usr/ports/x11/kde4 # make install clean
Nadat KDE geïnstalleerd is, moet de X server verteld worden dat déze applicatie gestart moet worden in plaats van de standaard window manager. Hiervoor kan .xinitrc aangepast worden:
Voor KDE 3:
% echo "exec startkde" > ~/.xinitrc
Voor KDE 4:
% echo "exec /usr/local/kde4/bin/startkde" > ~/.xinitrc
Als het X Window System wordt gestart met startx is KDE het bureaublad.
Als er een beeldschermmanager als XDM gebruikt wordt, is de instelling anders. Dan moet .xsession gewijzigd worden. Instructies voor KDM worden later in dit hoofdstuk beschreven.
Nadat KDE geïnstalleerd is op een systeem, kunnen de meeste dingen uitgezocht worden via de hulppagina's of door de verschillende menu's aan te wijzen en erop te klikken. Windows en Mac® gebruikers voelen zich meestal helemaal thuis.
Het beste naslagwerk voor KDE is de on-line documentatie. KDE heeft zijn eigen web browser, Konqueror, tientallen handige applicaties en uitgebreide documentatie. De volgende paragrafen beschrijven de technische zaken die moeilijk proefondervindelijk te achterhalen zijn.
Een beheerder van een multi-user systeem die een grafisch aanmeldscherm willen hebben voor zijn gebruikers kan hiervoor XDM gebruiken, zoals eerder beschreven. KDE biedt KDM als alternatief. Dat is ontworpen met een beter uiterlijk en heeft meer aanmeldopties. Gebruikers kunnen via een menu kiezen welke bureaubladomgeving (KDE, GNOME of een andere) zij na het aanmelden willen gebruiken.
Om KDM te starten, moeten verschillende bestanden gewijzigd worden, afhankelijk van de versie van KDE.
Voor KDE 3 dient de regel met ttyv8 als volgt aangepast te worden:
ttyv8 "/usr/local/bin/kdm -nodaemon" xterm on secure
Voor KDE 4 dient procfs(5) te worden aangekoppeld en de volgende regel aan /etc/rc.conf te worden toegevoegd:
kdm4_enable="YES"
Xfce is een bureaubladomgeving die gebaseerd is op de GTK+ toolkit die gebruikt wordt bij GNOME, maar is eenvoudiger en bedoeld voor gebruikers die een simpel en efficiënt bureaublad willen dat toch eenvoudig en makkelijk in te stellen is. Het ziet er bijna hetzelfde uit als CDE dat bij commerciële UNIX systemen zit. Een aantal Xfce functies zijn:
Een eenvoudige, makkelijk te bedienen desktop;
Geheel in te stellen met de muis, met klikken en slepen, enzovoort;
Hoofdpaneel hetzelfde als CDE met menu's, applets en applicaties
Geïntegreerde window manager, bestandsmanager, geluidsmanager, GNOME compliance module en meer zaken;
Thema's (sinds het gebruik van GTK+);
Snel, licht en efficiënt: ideaal voor de oudere of langzamere machines of machines met beperkte hoeveelheid geheugen;
Meer informatie over Xfce staat op de Xfce website.
Xfce is met een pakket te installeren:
# pkg_add -r xfce4
Of vanuit de Portscollectie:
# cd /usr/ports/x11-wm/xfce4 # make install clean
Nu moet de X server weten dat Xfce gestart moet worden als X de volgende keer start:
% echo "/usr/local/bin/startxfce4" > ~/.xinitrc
De volgende keer dat X start is Xfce het bureaublad. Wederom: als een beeldschermmanager als XDM gebruikt wordt, moet .xsession gemaakt worden zoals beschreven in de paragraaf over GNOME. Nu moet echter het command /usr/local/bin/startxfce4 gebruikt. Het is ook mogelijk de beeldschermmanager in te stellen om bureaublad te kiezen bij het aanmelden, zoals is uitgelegd in de paragraaf over kdm.
Na de inleiding gaat dit deel van het FreeBSD handboek over een aantal vaak gebruikte mogelijkheden van FreeBSD. De volgende hoofdstukken:
Geven een inleiding in populaire en handige desktop toepassingen: browsers, productieviteitsgereedschappen, documentviewers, etc;
Geven een inleiding in een aantal multimediatoepassingen die in FreeBSD beschikbaar zijn;
Geven uitleg over het proces waarmee een aangepaste kernel voor FreeBSD kan worden gemaakt om extra functionaliteit aan een systeen toe te voegen;
Beschrijven gedetailleerd het afdruksysteem, zowel voor met een desktop verbonden als met het netwerk verbinden printers;
Beschrijven hoe applicaties voor Linux op FreeBSD kunnen draaien.
In een aantal van de hoofdstukken wordt voorkennis aangeraden. Dit staat vermeld in de inleiding van ieder hoofdstuk.
FreeBSD kan een groot aantal bureaubladapplicaties draaien, zoals browsers en tekstverwerkers. De meeste hiervan zijn beschikbaar als pakketten of kunnen automatisch vanuit de Portscollectie gebouwd worden. Veel nieuwe gebruikers verwachten dit soort applicaties op hun bureaublad. Dit hoofdstuk laat zien hoe populaire bureaubladapplicaties moeiteloos geïnstalleerd kunnen worden vanuit een pakket of vanuit de Portscollectie.
Als programma's vanuit ports geïnstalleerd worden, wordt hun broncode gecompileerd. Dit kan erg lang duren, afhankelijk van wat er gecompileerd wordt en de rekenkracht van een machine. Als compileren vanuit broncode te veel tijd kost, kunnen de meeste programma's van de Portscollectie als een voorgebouwd pakket geïnstalleerd worden.
Omdat FreeBSD compatibel is met Linux, zijn veel applicaties die voor Linux zijn ontwikkeld beschikbaar een FreeBSD bureaublad. Het wordt sterk aanbevolen om Hoofdstuk 11 te lezen voordat Linux applicaties geïnstalleerd worden. Veel ports die gebruik maken van Linux compatibiliteit beginnen met “linux-”. Dit is handig om te onthouden wanneer er naar een port gezocht wordt met bijvoorbeeld whereis(1). In dit hoofdstuk wordt aangenomen dat Linux binaire compatibiliteit is ingeschakeld voordat Linux applicaties worden geïnstalleerd.
In dit hoofdstuk worden de volgende categoriën behandeld:
Browsers (zoals Firefox, Opera, Konqueror, Chromium)
Productiviteit (zoals KOffice, AbiWord, The GIMP, OpenOffice.org, LibreOffice)
Documentviewers (zoals Acrobat Reader®, gv, Xpdf, GQview)
Financieel (zoals GnuCash, Gnumeric, Abacus)
Er wordt aangenomen dat de lezer van dit hoofdstuk:
Weet hoe aanvullende software van derde partijen geïnstalleerd wordt (Hoofdstuk 5).
Weet hoe aanvullende Linux software geïnstalleerd wordt (Hoofdstuk 11).
Meer informatie over een multimedia-omgeving staat in Hoofdstuk 8. Installatie van email staat beschreven in Hoofdstuk 29.
FreeBSD wordt zonder een voorgeïnstalleerde browser geleverd. In plaats hiervan bevat de www map van de Portscollectie browsers om te installeren. Het is ook mogelijk voor de meeste ports een pakket te installeren als compileren niet gewenst is. Compileren kan soms lang duren.
KDE en GNOME bevatten reeds HTML-browsers. In Paragraaf 6.7 staat meer informatie over de installatie van deze complete bureaubladen.
Lichtgewicht browsers uit de Portscollectie zijn onder andere www/dillo2, www/links of www/w3m.
Dit gedeelte behandelt deze applicaties:
| Applicatie | Bronnen | Ports | Grote afhankelijkheden |
|---|---|---|---|
| Firefox | gemiddeld | zwaar | Gtk+ |
| Opera | weinig | licht | FreeBSD en Linux versies beschikbaar. De Linux versie is afhankelijk van de Linux binaire compatibiliteit en linux-openmotif. |
| Konqueror | gemiddeld | zwaar | KDE bibliotheken |
| Chromium | gemiddeld | gemiddeld | Gtk+ |
Firefox is een moderne, gratis, stabiele open-source browser die volledig geporteerd is naar FreeBSD: het heeft een motor voor HTML-weergave die zich zeer strikt aan de standaarden houdt, browsen met tabbladen, blokkeren van pop-ups, uitbreidingen, verbeterde veiligheid, en meer. Firefox is gebaseerd op de codebase van Mozilla.
Installeer het pakket door het volgende te typen:
# pkg_add -r firefox
Dit zal de laatste uitgave van Firefox installeren, als u in plaats hiervan de Extended Support Release (ESR) van Firefox wilt draaien, gebruik dan:
# pkg_add -r firefox-esr
De Portscollectie kan ook gebruikt worden als u liever vanuit de broncode installeert.
# cd /usr/ports/www/firefox # make install clean
Voor Firefox ESR dient firefox in het vorige commando vervangen te worden door firefox-esr.
Opmerking: In deze en de volgende twee secties wordt er vanuit gegaan dat Firefox reeds geïnstalleerd is.
Installeer OpenJDK 6 vanuit de Ports Collectie door het volgende typen:
# cd /usr/ports/java/openjdk6 # make install clean
Installeer daarna de port java/icedtea-web:
# cd /usr/ports/java/icedtea-web # make install clean
Zorg ervoor dat de standaard configuratieopties voor beide ports zijn geselecteerd.
Start de browser en voer about:plugins in de locatie balk en druk op Enter. Er zal een pagina gepresenteerd worden die de geïnstalleerde plugins toont; de Java™ plugin zal nu getoond moeten worden.
Als de browser de plugin niet kan vinden, dient elke gebruiker het volgende commando uit te voeren en de browser opnieuw te starten:
% ln -s /usr/local/lib/IcedTeaPlugin.so \ $HOME/.mozilla/plugins/
De Adobe® Flash™ plugin is niet beschikbaar voor FreeBSD. Er is echter wel een softwarelaag (wrapper) om de Linux-versie van de plugin te draaien. Deze wrapper ondersteunt ook Adobe Acrobat® plugin, RealPlayer® plugin en meer.
Afhankelijk van de versie van FreeBSD die u draait zijn er verschillende stappen nodig:
Op FreeBSD 7.X
Installeer de port www/nspluginwrapper. Deze port heeft emulators/linux_base-fc4 nodig, wat een grote port is.
De volgende stap is om de port www/linux-flashplugin9 te installeren. Dit zal Flash 9.X installeren, van deze versie is bekend dat die correct werkt op FreeBSD 7.X.
Op FreeBSD 8.X of nieuwer
Installeer de port www/nspluginwrapper. Deze port heeft emulators/linux_base-f10 nodig, wat een grote port is.
De volgende stap is om de Flash 11.X vanuit de port www/linux-f10-flashplugin11 te installeren.
Voor deze versie is het nodig om de volgende koppeling aan te maken:
# ln -s /usr/local/lib/npapi/linux-f10-flashplugin/libflashplayer.so \ /usr/local/lib/browser_plugins/
De /usr/local/lib/browser_plugins directory moet handmatig aangemaakt worden als deze nog niet op het systeem bestaat.
Wanneer de juiste Flash port, afhankelijk van de versie van FreeBSD die u draait, is geïnstalleerd, moet de plugin door elke gebruiker worden geïnstalleerd met nspluginwrapper:
% nspluginwrapper -v -a -i
Het Linux procesbestandssysteem, linprocfs(5), moet zijn aangekoppeld op /compat/linux/proc, indien het gewenst is om Flash-animaties af te spelen. Dit kan met het volgende commando gedaan worden:
# mount -t linprocfs linproc /compat/linux/proc
Dit punt kan geautomatiseerd worden tijdens het opstarten door het toevoegen van deze regel aan /etc/fstab:
linproc /compat/linux/proc linprocfs rw 0 0
Start dan de browser en voer op de adresbalk about:plugins in en druk op Enter. Een pagina met alle geïnstalleerde plugins wordt nu getoond.
Swfdec is de bibliotheek om Flash-animaties te decoderen en af te beelden. Swfdec-Mozilla is een plugin voor Firefox-browsers dat de Swfdec-bibliotheek gebruikt om SWF-bestanden af te spelen. Er wordt nog steeds veel aan ontwikkeld.
Als u het niet kunt of wilt compileren, kan het pakket vanaf het netwerk worden geïnstalleerd:
# pkg_add -r swfdec-plugin
Als het pakket niet beschikbaar is, kunt u het vanuit de Portscollectie compileren en installeren:
# cd /usr/ports/www/swfdec-plugin # make install clean
Herstart hierna uw browser om deze plugin effectief te maken.
Opera is een volledige en een standaard volgende browser. Hij wordt standaard geleverd met een ingebouwde email-client, een nieuwslezer, een IRC client, een RSS/ATOM feed lezer en nog veel meer. Ondanks dat is Opera relatief gezien niet zwaar en erg snel. Hij komt in twee smaken: een FreeBSD versie en een versie die draait onder Linux emulatie.
De FreeBSD pakketversie van Opera wordt zo geïnstalleerd:
# pkg_add -r opera
Sommige FTP-sites hebben niet alle pakketten, maar Operakan worden nog altijd via de Portscollectie worden verkregen door te typen:
# cd /usr/ports/www/opera # make install clean
De Linux versie van Opera kan geïnstalleerd worden door bij de bovenstaande voorbeelden linux-opera te gebruiken in plaats van opera.
De Adobe Flash plugin is niet beschikbaar voor FreeBSD. Er bestaat echter een Linux versie van de plugin. Om deze versie te installeren moet de port www/linux-f10-flashplugin11 geïnstalleerd zijn, installeer daarna de port www/opera-linuxplugins:
# cd /usr/ports/www/linux-f10-flashplugin11 # make install clean # cd /usr/ports/www/opera-linuxplugins # make install clean
U kunt controleren of de plugin aanwezig is: start uw browser, geef opera:plugins in op de adresbalk en druk op Enter. Er zou een lijst moeten verschijnen met alle huidig beschikbare plugins.
Volg de instructies voor Firefox om de Java plugin te installeren.
Konqueror is deel van KDE, maar kan ook buiten KDE gebruikt worden door x11/kdebase3 te installeren. Konqueror is meer dan een browser, het is ook een bestandsbeheerder en multimedia-viewer.
Er is ook een verzameling plugins beschikbaar voor Konqueror, beschikbaar in misc/konq-plugins.
Konqueror ondersteunt ook Flash; een “How To” gids om ondersteuning voor Flash in Konqueror te krijgen is beschikbaar op http://freebsd.kde.org/howtos/konqueror-flash.php.
Chromium is een open-source browserproject dat er op gericht is om een veiligere, snellere en stabielere surfervaring op te bouwen. Chromium biedt surfen met tabbladen, het blokkeren van pop-ups, uitbreidingen en nog veel meer. Chromium is het open-source project waar de browser Google Chrome op is gebaseerd.
Chromium kan als volgt als een pakket worden geïnstalleerd:
# pkg_add -r chromium
Als alternatief kan Chromium worden gecompileerd vanuit de broncode door de Portscollectie te gebruiken:
# cd /usr/ports/www/chromium # make install clean
Opmerking: Chromium wordt geïnstalleerd als /usr/local/bin/chrome, niet als /usr/local/bin/chromium.
Opmerking: Deze sectie neemt aan dat Chromium al is geïnstalleerd.
Installeer OpenJDK 6 vanuit de Portscollectie:
# cd /usr/ports/java/openjdk6 # make install clean
Installeer vervolgens java/icedtea-web vanuit de Portscollectie:
# cd /usr/ports/java/icedtea-web # make install clean
Start Chromium en geef about:plugins op in de adresbalk. IcedTea-Web zou genoemd moeten worden als één van de geïnstalleerde plugins.
Als Chromium de plugin IcedTea-Web niet vermeldt, voer dan de volgende commando's uit en herstart de browser:
# mkdir -p /usr/local/share/chromium/plugins # ln -s /usr/local/lib/IcedTeaPlugin.so \ /usr/local/share/chromium/plugins/
Opmerking: Deze sectie neemt aan dat Chromium al is geïnstalleerd.
Het configureren van Chromium en Adobe Flash lijkt op de instructies voor Firefox. Raadpleeg die sectie voor gedetailleerdere instructies en het installeren van Adobe Flash op FreeBSD. Er zou geen verdere configuratie nodig moeten zijn, aangezien Chromium sommige plugins van andere browsers kan gebruiken.
Als het op productiviteit aankomt, zoeken nieuwe gebruikers vaak een goed kantoorpakket of een vriendelijke tekstverwerker. Hoewel sommige bureaubladomgevingen zoals KDE reeds een kantoorpakket verschaffen, is er geen standaard produktiviteitspakket. FreeBSD kan alles verschaffen wat nodig is, ongeacht de bureaubladomgeving.
In dit gedeelte worden de onderstaande applicaties beschreven:
| Applicatie | Bronnen | Ports | Afhankelijkheden |
|---|---|---|---|
| KOffice | weinig | zwaar | KDE |
| AbiWord | weinig | licht | Gtk+ of GNOME |
| The GIMP | weinig | licht | Gtk+ |
| OpenOffice.org | veel | erg zwaar | JDK™, Mozilla |
| LibreOffice | enigszins veel | zwaar | Gtk+, of KDE / GNOME, of JDK |
De KDE-gemeenschap heeft zijn bureaubladomgeving met een kantoorpakket geleverd dat buiten KDE gebruikt kan worden. Het bevat de vier standaardcomponenten uit andere kantoorpakketten. KWord is de tekstverwerker, KSpread is het spreadsheetprogramma, KPresenter beheert diapresentaties en Kontour voorziet in grafische mogelijkheden.
Voordat de nieuwste KOffice wordt geïnstalleert, moet er een recente versie van KDE geïnstalleerd zijn.
KOffice voor KDE als pakket installeren gaat met het volgende commando:
# pkg_add -r koffice-kde4
Als het pakket niet beschikbaar is, kan de Portscollectie gebruiken worden. Om KOffice voor KDE4 te installeren:
# cd /usr/ports/editors/koffice-kde4 # make install clean
AbiWord is een vrij tekstverwerkingsprogramma, ongeveer gelijk aandoet als Microsoft Word. Het is geschikt om verslagen, brieven, rapporten, memo's, enzovoort mee te typen. Het programma is snel, bevat veel mogelijkheden en is gebruikersvriendelijk.
AbiWord kan veel bestandsformaten importeren en exporteren, waaronder enkele gesloten formaten, zoals Microsoft's .doc.
AbiWord is beschikbaar als pakket en te installeren met:
# pkg_add -r abiword
Als het pakket niet beschikbaar is, kan het worden gecompileerd vanuit de Portscollectie. De Portscollectie is meer recent. Dat kan als volgt:
# cd /usr/ports/editors/abiword # make install clean
Voor het bewerken of retoucheren van afbeeldingen is The GIMP een zeer geavanceerd afbeeldingenmanipulatieprogramma. Het kan als eenvoudig tekenprogramma worden gebruikt of als kwalititeitspakket voor het retoucheren van foto's. Het ondersteunt een groot aantal plugins en bevat een scripting interface. The GIMP kan een groot aantal bestandsformaten lezen en schrijven. Het ondersteunt interfaces met scanners en tabletten.
Het pakket is te installeren met:
# pkg_add -r gimp
Als een FTP-site dit pakket niet heeft, kan de Portscollectie gebruikt worden. De graphics map van de Portscollectie bevat ook The GIMP Manual. Die kan zo geïnstalleerd worden:
# cd /usr/ports/graphics/gimp # make install clean # cd /usr/ports/graphics/gimp-manual-pdf # make install clean
Opmerking: De graphics map van de Portscollectie bevat de ontwikkelversie van The GIMP in graphics/gimp-devel. Een HTML-versie van The GIMP Manual staan in graphics/gimp-manual-html.
OpenOffice.org bevat alle noodzakelijke applicaties in een compleet kantoorproductiviteitspakket: een tekstverwerker, een spreadsheet, een presentatiebeheerder en een tekenprogramma. De gebruikersinterface is vrijwel gelijk aan die van andere kantoorpakketten en het kan veel populaire bestandsformaten in- en uitvoeren. Het is beschikbaar in een aantal verschillende talen -- internationalisatie is uitgebreid tot interfaces, spellingcontrole, en woordenboeken.
De tekstverwerker van OpenOffice.org gebruikt een eigen XML-bestandsformaat voor overdraagbaarheid en flexibiliteit. Het spreadsheetprogramma bevat een macrotaal en kan gekoppeld worden aan externe databases. OpenOffice.org is stabiel en draait zonder aanpassingen op Windows, Solaris™, Linux, FreeBSD en Mac OS X. Meer informatie over OpenOffice.org staat op de OpenOffice.org website. Voor specifieke FreeBSD informatie en om direct pakketten te downloaden is er de website van het FreeBSD OpenOffice.org Porting Team.
Om OpenOffice.org te installeren:
# pkg_add -r openoffice.org
Opmerking: Dit hoort te werken als er een -RELEASE versie van FreeBSD wordt gedraaid. In andere gevallen is het verstandig om te kijken op de website van het FreeBSD OpenOffice.org Porting Team en het juiste pakket met pkg_add(1) te downloaden en te installeren. Zowel de huidige release als de ontwikkelversie kunnen op die locatie gedownload worden.
Als het pakket geïnstalleerd is, start dan met het volgende commando OpenOffice.org:
% openoffice.org
Opmerking: Tijdens de eerste keer starten worden er een aantal vragen gesteld en wordt de map .openoffice.org in de thuismap van de aangemelde gebruiker gemaakt.
Als de OpenOffice.org pakketten niet beschikbaar zijn, kan het uit de ports gecompileerd worden. Hiervoor is veel schijfruimte en tijd nodig:
# cd /usr/ports/editors/openoffice.org-3 # make install clean
Opmerking: Vervang om een gelokaliseerde versie te bouwen de voorgaande commandoregel door de volgende:
# make LOCALIZED_LANG=uw_taal install cleanVervang taal door de juiste ISO-taalcode. Een lijst met ondersteunde taalcodes is beschikbaar in het bestand files/Makefile.localized in de map van de port.
Start hierna OpenOffice.org met:
% openoffice.org
LibreOffice is een gratis kantoorpakket ontwikkeld door The Document Foundation en is compatibel met andere grote kantoorpakketten en is beschikbaar op meerdere platforms. Het is een afsplitsing van OpenOffice.org onder een nieuw merk en bevat alle verwachte toepassingen van een compleet kantoorpakket: een tekstverwerker, een spreadsheet, een presentatiebeheerder, een tekenprogramma, een databasebeheerprogramma, en een programma om wiskundige formules te bewerken. Het is beschikbaar in een aantal verschillende talen -- internationalisatie heeft zich uitgebreid naar interfaces, spellingcheckers en woordenboeken.
De tekstverwerker van LibreOffice gebruikt een eigen XML-bestandsformaat voor verhoogde portabiliteit en flexibiliteit. Het spreadsheetprogramma bevat een macrotaal en kan met externe databases gebruikt worden. LibreOffice is reeds stabiel en draait op Windows, Linux, FreeBSD, en Mac OS X. Meer informatie over LibreOffice is te vinden op de website van LibreOffice.
Om LibreOffice als een pakket te installeren:
# pkg_add -r libreoffice
Opmerking: Dit zou moeten werken met een -RELEASE-versie van FreeBSD.
Als het pakket is geïnstalleerd, dient de volgende opdracht gebruikt te worden om LibreOffice te draaien:
% libreoffice
Opmerking: Tijdens de eerste keer draaien worden u wat vragen gesteld en wordt er een map .libreoffice aangemaakt in uw thuismap.
Als er geen pakket voor LibreOffice beschikbaar is, heeft u nog altijd de optie om de port te compileren. Denk er echter aan dat dit veel schijfruimte en redelijk veel tijd kost.
# cd /usr/ports/editors/libreoffice # make install clean
Opmerking: Als u een gelokaliseerde versie wilt bouwen, dient u de vorige opdracht door het volgende te vervangen:
# make LOCALIZED_LANG=uw_taal install cleanU dient uw_taal te vervangen door de juiste ISO-taalcode. Een lijst met ondersteunde talen is beschikbaar in het doel pre-fetch van de Makefile van de port.
Wanneer dit is gedaan, kan LibreOffice gestart worden met deze opdracht:
% libreoffice
Sommige nieuwe documentformaten hebben aan populariteit gewonnen sinds de komst van UNIX; het kan zijn dat de standaardviewers die ze vereisen niet in het basissysteem zitten. In dit gedeelte wordt aangegeven hoe zulke viewers geïnstalleerd kunnen worden.
Dit gedeelte behandelt de onderstaande applicaties:
| Applicatie | Bronnen | Ports | Afhankelijkheden |
|---|---|---|---|
| Acrobat Reader | weinig | licht | Linux binaire compatibiliteit |
| gv | weinig | licht | Xaw3d |
| Xpdf | weinig | licht | FreeType |
| GQview | weinig | licht | Gtk+ of GNOME |
Documenten worden vaak als PDF-bestanden, “Portable Document Format”, verspreid. Een van de aanbevolen viewers voor dit bestandstype is Acrobat Reader dat Adobe voor Linux heeft uitgegeven. Omdat FreeBSD Linux binaries kan draaien, is het ook beschikbaar voor FreeBSD.
Om Acrobat Reader 8 te installeren uit de Portscollectie:
# cd /usr/ports/print/acroread8 # make install clean
Vanwege de licentie is een pakket niet beschikbaar.
gv is een PostScript en PDF viewer. Het is gebaseerd op ghostview maar heeft een vriendelijker uiterlijk dankzij de Xaw3d bibliotheek. Het is snel en heeft mogelijkheden, zoals oriëntatie, papiergrootte, schalen en anti-aliassen. Bijna elke bewerking kan met het toetsenbord of de muis worden gedaan.
gv is als pakket te installeren:
# pkg_add -r gv
Of uit de Portscollectie:
# cd /usr/ports/print/gv # make install clean
Xpdf een efficiënte lichtgewicht PDF-viewer voor FreeBSD. Het heeft erg weinig bronnen nodig en is zeer stabiel. Het gebruikt de standaard X-fonts en is niet afhankelijk van Motif of andere X-toolkits.
Xpdf is als pakket te installeren:
# pkg_add -r xpdf
Of uit de Portscollectie:
# cd /usr/ports/graphics/xpdf # make install clean
Als de installatie voltooid is, kan Xpdf gestart worden en het menu kan met de rechtermuisknop geactiveerd worden.
GQview is een afbeeldingenbeheerder. Een bestand kan met één klik bekeken worden, er kan een externe editor opgestart worden er kunnen thumbnail-voorbeelden gemaakt worden en nog veel meer. Het bevat ook een diapresentatie-modus en enkele standaard bestandsoperaties. Er kunnen afbeeldingsverzamelingen beheerd worden en eenvoudig duplicaten gevonden worden. GQview kan het complete scherm gebruiken en ondersteunt meerdere talen.
GQview is als pakket te installeren:
# pkg_add -r gqview
Of uit de Portscollectie:
# cd /usr/ports/graphics/gqview # make install clean
Om financiën via het FreeBSD bureaublad te beheren zijn er krachtige en gemakkelijk te gebruiken applicaties om te installeren. Sommige zijn compatibel met wijdverbreide bestandsformaten, zoals de formaten gebruikt door Quicken® en Excel om documenten op te slaan.
Dit gedeelte behandelt deze programma's:
| Applicatie | Bronnen | Ports | Afhankelijkheden |
|---|---|---|---|
| GnuCash | weinig | zwaar | GNOME |
| Gnumeric | weinig | zwaar | GNOME |
| Abacus | weinig | licht | Tcl/Tk |
| KMyMoney | weinig | zwaar | KDE |
GnuCash is onderdeel van GNOME dat gebruikersvriendelijke en krachtige applicaties aan eindgebruikers wil leveren. Met GnuCash kunnen inkomsten en uitgaven, bankrekeningen en voorraden bijgehouden worden. Het bevat een intuïtieve interface terwijl het erg professioneel blijft.
GnuCash levert een slim kasboek, een hiërarchisch systeem van rekeningen, en veel toetsenbordversnellers en auto-invul mogelijkheden. Het kan een transactie splitsen in meer gedetailleerde stukken. GnuCash kan Quicken QIF-bestanden invoeren en samenvoegen. Het kan ook met de meeste internationale datum- en valutaformaten omgaan.
GnuCash is als pakket te installeren:
# pkg_add -r gnucash
Of uit de Portscollectie:
# cd /usr/ports/finance/gnucash # make install clean
Gnumeric is een spreadsheetprogramma uit de GNOME bureaubladomgeving. Het maakt gebruikt van “auto-invullen” afhankelijk van het celformaat. Het kan bestanden in een aantal populaire formaten zoals Excel, Lotus 1-2-3 en Quattro Pro inlezen. Gnumeric ondersteunt grafieken door middel van het grafiekprogramma math/guppi. Het heeft een groot aantal ingebouwde functies en kent gebruikelijke celformaten als nummer, valuta, datum, tijd en veel meer.
Gnumeric is als pakket te installeren:
# pkg_add -r gnumeric
Of uit de Portscollectie:
# cd /usr/ports/math/gnumeric # make install clean
Abacus is een kleine en gemakkelijk te gebruiken spreadsheetprogramma. Het bevat veel ingebouwde functies die nuttig zijn in verschillende domeinen zoals statistiek, financiën, en wiskunde. Het kan Excel-bestanden lezen en schrijven. Abacus kan PostScript uitvoer produceren.
Abacus is als pakket te installeren:
# pkg_add -r abacus
Of uit de Portscollectie:
# cd /usr/ports/deskutils/abacus # make install clean
KMyMoney is een persoonlijke financiële beheerder gebouwd voor KDE. KMyMoney poogt om alle belangrijke eigenschappen die in commerciële persoonlijke financiële beheerders zitten te bieden en te integreren. Gebruiksgemak en degelijke dubbele accounting zijn eigenschappen die worden benadrukt. KMyMoney importeert vanuit standaard Quicken Interchange Format (QIF) bestanden, houdt investeringen bij, kan met meerdere munteenheden overweg, en biedt een waaier aan rapporten. Mogelijkheden om OFX te importeren zijn via een aparte plugin beschikbaar.
Om KMyMoney als een pakket te installeren:
# pkg_add -r kmymoney2
Als het pakket niet beschikbaar is, kan de Portscollectie gebruikt worden:
# cd /usr/ports/finance/kmymoney2 # make install clean
Hoewel FreeBSD populair is bij ISP's om zijn prestaties en stabiliteit, is het behoorlijk klaar voor dagelijks gebruik als een bureaublad. Met enkele duizenden applicaties als pakketten of ports, is een perfect bureaublad te bouwen dat aan alle noden voldoet.
Nu volgt nog een overzicht van alle bureaubladapplicaties die in dit hoofdstuk zijn behandeld:
| Applicatie | Package | Port |
|---|---|---|
| Opera | linux-opera | www/linux-opera |
| Firefox | firefox | www/firefox |
| Chromium | chromium | www/chromium |
| KOffice | koffice-kde4 | editors/koffice-kde4 |
| AbiWord | abiword | editors/abiword |
| The GIMP | gimp | graphics/gimp |
| OpenOffice.org | openoffice | editors/openoffice.org-3 |
| LibreOffice | libreoffice | editors/libreoffice |
| Acrobat Reader | acroread | print/acroread8 |
| gv | gv | print/gv |
| Xpdf | xpdf | graphics/xpdf |
| GQview | gqview | graphics/gqview |
| GnuCash | gnucash | finance/gnucash |
| Gnumeric | gnumeric | math/gnumeric |
| Abacus | abacus | deskutils/abacus |
| KMyMoney | kmymoney2 | finance/kmymoney2 |
FreeBSD ondersteunt een breed bereik aan geluidskaarten, waardoor het mogelijk is van geluid van hoge kwaliteit op een computer te genieten. Hieronder vallen mogelijkheden om geluid op te nemen en af te spelen in de MPEG Audio Layer 3 (MP3), WAV en Ogg Vorbis formaten en vele andere formaten. De FreeBSD Portscollectie bevat ook programma's waarmee opgenomen audio bewerkt kan worden, waarmee geluidseffecten toegevoegd kunnen worden en aangesloten MIDI apparaten bestuurd kunnen worden.
Met wat experimenteren kunnen met FreeBSD videobestanden en DVD's afgespeeld worden. Er zijn minder programma's om video te encoderen, te converteren en af te spelen dan er zijn voor audio. Op het moment van schrijven is er bijvoorbeeld geen goed hercoderingsprogramma in de FreeBSD Portscollectie beschikbaar wat gebruikt kan worden om tussen formaten onderling te converteren, zoals mogelijk is met audio/sox. De software in dit landschap is echter sterk aan verandering onderhevig.
In dit hoofdstuk worden de stappen beschreven die uitgevoerd moeten worden om een geluidskaart in te stellen. Bij de installatie en instelling van X11 (Hoofdstuk 6) is al beschreven hoe videokaarten ingesteld kunnen worden, hoewel er nog wel een aantal mogelijkheden zijn om het afspelen te verbeteren.
Na het lezen van dit hoofdstuk weet de lezer:
Hoe een systeem zo in te stellen dat een geluidskaart wordt herkend;
Hoe getest kan worden of een kaart werkt;
Hoe problemen op te lossen met betrekking tot geluidsinstellingen;
Hoe MP3's en andere audio af te spelen en te maken;
Hoe video wordt ondersteund door de X server;
Welke video speler/encoderports goede resultaten geven;
Hoe DVD's, .mpg en .avi bestanden af te spelen;
Hoe de inhoud van CD's en DVD's naar bestanden geript kan worden;
Hoe een TV-kaart in te stellen;
Hoe een scanner in te stellen.
Er wordt aangenomen dat de lezer van dit hoofdstuk:
Weet hoe een nieuwe kernel in te stellen en te installeren (Hoofdstuk 9).
WaarschuwingHet proberen aan te koppelen van audio-CD's met mount(8) resulteert in ieder geval in een foutmelding en in het ergste geval tot een kernel panic. Dat type media heeft een formaat dat afwijkt van het gebruikelijke ISO-bestandssysteem.
Alvorens te beginnen is het van belang te weten welk model een geluidskaart is, welke chip erop wordt gebruikt en of het een PCI of ISA kaart is. FreeBSD ondersteunt vele PCI en ISA kaarten. De ondersteunde audio-apparaten staan in een lijst in de Hardware Notes. In de Hardware Notes staat ook beschreven welk stuurprogramma uw kaart ondersteunt.
Om een geluidsapparaat te gebruiken dient het juiste apparaatstuurprogramma geladen te worden. Dit kan op twee manieren. De meest eenvoudige manier is simpelweg een kernelmodule te laden voor de gewenste geluidskaart met kldload(8). Dit kan vanaf de commandoregel:
# kldload snd_emu10k1
Of door als volgt de juiste regel toe te voegen aan /boot/loader.conf:
snd_emu10k1_load="YES"
De bovenstaande voorbeelden zijn voor een Creative SoundBlaster® Live! geluidskaart. De overige beschikbare laadbare geluidsmodules staan beschreven in /boot/defaults/loader.conf. Als niet compleet duidelijk is welk stuurprogramma gebruikt dient te worden, dan kan het met de module snd_driver geprobeerd worden:
# kldload snd_driver
Dit is een metastuurprogramma, dat in één keer de meest voorkomende apparaatstuurprogramma's laadt. Hiermee kan het zoeken naar het juiste stuurprogramma versneld worden. Het is ook mogelijk om alle geluidsstuurprogramma's te laden via de optie /boot/loader.conf.
Om uit te vinden welk stuurprogramma na het laden van het metastuurprogramma snd_driver wordt geladen kan de inhoud van het bestand /dev/sndstat nagekeken worden met cat /dev/sndstat.
Een tweede mogelijkheid is ondersteuning voor een geluidskaart statisch in de kernel te compileren. In de onderstaande paragrafen staat meer informatie over hoe op die manier ondersteuning voor hardware toegevoegd kan worden. Meer informatie over het hercompileren van een kernel staat in Hoofdstuk 9.
Eerst moet het stuurprogramma voor het audioraamwerk sound(4) aan de kernel toegevoegd worden. Daarvoor dient het volgende te worden opgenomen in het bestand met kernelinstellingen:
device sound
Daarna kan ondersteuning voor de specifieke geluidskaart toegevoegd worden. Daarvoor moet bekend zijn welk stuurprogramma de kaart ondersteunt. Dit kan opgezocht worden in de lijst met ondersteunde audio-apparaten in de Hardware Notes, waar de correcte stuurprogramma's voor geluidskaarten beschreven staan. Zo wordt een Creative SoundBlaster Live! geluidskaart bijvoorbeeld ondersteund door het stuurprogramma snd_emu10k1(4). Ondersteuning voor deze kaart kan als volgt worden toegevoegd:
device snd_emu10k1
In de hulppagina voor een stuurprogramma staat welke syntaxis gebruikt kan worden. De expliciete syntaxis voor de kernelinstellingen voor elk ondersteund geluidsstuurprogramma staat ook in /usr/src/sys/conf/NOTES.
Voor niet-PnP ISA-geluidskaarten kan het nodig zijn dat de kernel informatie gegeven moet worden over de instellingen van de kaart (IRQ, I/O poort, enzovoort), zoals dat geldt voor alle niet-PnP ISA-kaarten. Dit kan via het bestand /boot/device.hints. Bij het starten van een systeem leest de loader(8) dat bestand uit en geeft de instellingen door aan de kernel. Zo gebruikt een oude Creative SoundBlaster 16 ISA niet-PnP-kaart het stuurprogramma snd_sbc(4) samen met snd_sb16 en dient de volgende regel toegevoegd te worden aan het kernelinstellingenbestand:
device snd_sbc device snd_sb16
Daarnaast moet het volgende worden toegevoegd aan /boot/device.hints:
hint.sbc.0.at="isa" hint.sbc.0.port="0x220" hint.sbc.0.irq="5" hint.sbc.0.drq="1" hint.sbc.0.flags="0x15"
In dit geval gebruikt de kaart I/O poort 0x220 en IRQ 5.
De gebruikte syntaxis voor /boot/device.hints staat beschreven in de hulppagina sound(4) en de hulppagina voor het gevraagde stuurprogramma.
De bovenstaande instellingen zijn de standaardinstellingen. In sommige gevallen moeten IRQ of andere instellingen gewijzigd worden om een apparaat juist te laten werken. In snd_sbc(4) staat meer informatie over deze kaart.
Na het herstarten met de aangepaste kernel of na het laden van de benodigde module, hoort de geluidskaart ongeveer als volgt te verschijnen in de systeemberichtbuffer (dmesg(8)):
pcm0: <Intel ICH3 (82801CA)> port 0xdc80-0xdcbf,0xd800-0xd8ff irq 5 at device 31.5 on pci0 pcm0: [GIANT-LOCKED] pcm0: <Cirrus Logic CS4205 AC97 Codec>
De status van de geluidskaart kan gecontroleerd worden via het bestand /dev/sndstat:
# cat /dev/sndstat FreeBSD Audio Driver (newpcm) Installed devices: pcm0: <Intel ICH3 (82801CA)> at io 0xd800, 0xdc80 irq 5 bufsz 16384 kld snd_ich (1p/2r/0v channels duplex default)
De uitvoer kan per systeem wat verschillen. Als er geen apparaten pcm genoemd worden, dienen eerdere stappen herzien te worden. Bekijk nogmaals de instellingen van de kernel en bevestig dat het juiste apparaatstuurprogramma was gekozen. Veel voorkomende problemen staan beschreven in Paragraaf 8.2.2.1.
Als het goed is werkt de geluidskaart nu. Als pinnen voor audio-out van de CD-ROM- of DVD-ROM-drive juist zijn aangesloten op de geluidskaart, dan kan er een CD in de drive gestopt worden en kan deze met cdcontrol(1) afgespeeld worden:
% cdcontrol -f /dev/acd0 play 1
Applicaties als audio/workman kunnen een vriendelijker interface bieden. Wellicht is het handig om een applicatie als audio/mpg123 te installeren om naar MP3 audiobestanden te luisteren.
Een snelle manier om de kaart te testen is het als volgt sturen van gegevens naar /dev/dsp:
% cat bestandsnaam > /dev/dsp
bestandsnaam kan ieder bestand zijn. Deze commandoregel hoort wat ruis te maken, waardoor wordt bevestigd dat de geluidskaart echt werkt.
Opmerking: De appparaat nodes /dev/dsp* worden automatisch aangemaakt wanneer dat nodig is. Als deze niet worden gebruikt, bestaan ze niet en zullen ze niet terugkomen in de terugkoppeling van ls(1).
Niveaus voor de geluidskaartmixer kunnen aangepast worden met het commando mixer(8). Er staan meer details in mixer(8).
| Fout | Oplossing |
|---|---|
| “sb_dspwr(XX) timed out” | De I/O poort is niet correct ingesteld. |
| “bad irq XX” | Het IRQ is niet correct ingesteld. Zorg dat het ingestelde IRQ en het IRQ voor het geluid hetzelfde zijn. |
| “xxx: gus pcm not attached, out of memory” | Er is niet genoeg geheugen beschikbaar om het apparaat te gebruiken. |
| “xxx: can't open /dev/dsp!” | Controleer fstat | grep dsp of een ander programma het apparaat geopend heeft. Bekende probleemgevallen zijn esound en KDE's geluidsondersteuning. |
Een ander euvel is dat moderne grafische kaarten voor het gebruik van HDMI en dergelijken vaak zijn uitgerust met hun eigen geluidsstuurprogramma. Dit geluidsapparaat wordt soms opgesomd voor het eigenlijke geluidskaart en daardoor wordt deze niet gebruikt als het standaard afspeelapparaat. Om te zien of dit het geval is, kan dmesg worden gedraaid en gezocht worden naar pcm. De uitvoer ziet er ongeveer als volgt uit:
... hdac0: HDA Driver Revision: 20100226_0142 hdac1: HDA Driver Revision: 20100226_0142 hdac0: HDA Codec #0: NVidia (Unknown) hdac0: HDA Codec #1: NVidia (Unknown) hdac0: HDA Codec #2: NVidia (Unknown) hdac0: HDA Codec #3: NVidia (Unknown) pcm0: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 0 nid 1 on hdac0 pcm1: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 1 nid 1 on hdac0 pcm2: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 2 nid 1 on hdac0 pcm3: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 3 nid 1 on hdac0 hdac1: HDA Codec #2: Realtek ALC889 pcm4: <HDA Realtek ALC889 PCM #0 Analog> at cad 2 nid 1 on hdac1 pcm5: <HDA Realtek ALC889 PCM #1 Analog> at cad 2 nid 1 on hdac1 pcm6: <HDA Realtek ALC889 PCM #2 Digital> at cad 2 nid 1 on hdac1 pcm7: <HDA Realtek ALC889 PCM #3 Digital> at cad 2 nid 1 on hdac1 ...
Hier is de grafische kaart (NVidia) opgesomd voor de geluidskaart (Realtek ALC889). Om de geluidskaart als standaard afspeelapparaat te gebruiken, dient hw.snd.default_unit veranderd te worden in de eenheid dat voor afspelen gebruikt moet worden:
# sysctl hw.snd.default_unit=n
Hier is n het nummer van het geluidsapparaat wat gebruikt dient te worden, in dit voorbeeld 4. U kunt deze verandering permanent maken door de volgende regel aan /etc/sysctl.conf toe te voegen:
hw.snd.default_unit=4
Het is vaak wenselijk om meerdere geluidsbronnen tegelijkertijd af te kunnen spelen, zoals wanneer esound of artsd het delen van een geluidsapparaat met een andere applicatie niet ondersteunen.
Met FreeBSD kan dit met Virtuele Geluidskanalen, die aangezet kunnen worden met de faciliteit sysctl(8). Met virtuele kanalen kunnen het afspelen van een geluidskaart gemultiplext worden door het geluid in de kernel te mixen.
Het aantal virtuele kanalen kan met drie sysctl knoppen als root als volgt ingesteld worden:
# sysctl dev.pcm.0.play.vchans=4 # sysctl dev.pcm.0.rec.vchans=4 # sysctl hw.snd.maxautovchans=4
In het bovenstaande voorbeeld worden vier virtuele kanalen toegewezen, wat in het
dagelijks gebruik voldoende is. Zowel dev.pcm.0.play.vchans=4 als dev.pcm.0.rec.vchans=4 zijn het aantal virtuele kanalen dat
pcm0 heeft voor afspelen en opnemen, en zijn instelbaar
als een apparaat is aangesloten. In hw.snd.maxautovchans
staat het aantal virtuele kanalen dat aan een nieuw audio-apparaat wordt gegeven
als het wordt aangesloten met kldload(8). Omdat de
module pcm onafhankelijk van de hardware
stuurprogramma's geladen kan worden, kan in hw.snd.maxautovchans opgeslagen worden hoeveel virtuele
kanalen apparaten die later worden aangesloten krijgen. Voor meer informatie wordt
naar pcm(4) verwezen.
Opmerking: Het aantal virtuele kanalen voor een apparaat kan niet gewijzigd worden als het in gebruik is. Sluit eerst alle programma's die het apparaat gebruiken, zoals muziekspelers of geluidsdaemons.
Het juiste pcm apparaat zal automatisch en transparant gealloceerd worden voor programma's die /dev/dsp0 aanroepen.
De standaardwaarden voor de mixerkanalen zijn ingesteld in de broncode van het stuurprogramma pcm(4). Er zijn vele applicaties en daemons waarmee waarden voor de mixer ingesteld en onthouden kunnen worden en iedere keer bij het starten weer kunnen worden ingesteld, maar dit is geen nette oplossing. Het is mogelijk om de standaardwaarden in te stellen op het niveau van het stuurprogramma -- dit wordt bereikt door de gewenste waarden in te stellen in /boot/device.hints, bijvoorbeeld:
hint.pcm.0.vol="50"
Met de bovenstaande instelling wordt het volume van een kanaal standaard op 50 ingesteld bij het laden van de module pcm(4).
Met MP3 (MPEG Layer 3 Audio) kan geluid bijna in CD-kwaliteit weergegeven worden en dus is er een goede reden om dit vooral niet na te laten op een FreeBSD werkstation.
Verreweg de meest populaire X11 MP3 speler is XMMS (X Multimedia Systeem). In XMMS kunnen Winamp skins gebruikt worden, omdat de GUI vrijwel gelijk is aan die van Nullsoft's Winamp. XMMS heeft ook een eigen plug-in ondersteuning.
XMMS kan geïnstalleerd worden via de multimedia/xmms port of pakket.
De interface van XMMS is intuïtief met een afspeellijst, grafische equalizer en meer. Gebruikers die bekend zijn met Winamp vinden XMMS vast eenvoudig te gebruiken.
De port audio/mpg123 is een alternatieve MP3-speler die gebruik maakt van de commandoregel.
mpg123 werkt door het geluidsapparaat en het MP3-bestand aan te geven op de commandoregel. Aangenomen dat uw audio-apparaat /dev/dsp1.0 is en u het MP3-bestand Foobar-GreatestHits.mp3 wilt afspelen, zou u het volgende opgeven:
# mpg123 -a /dev/dsp1.0 Foobar-GreatestHits.mp3 High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2 and 3. Version 0.59r (1999/Jun/15). Written and copyrights by Michael Hipp. Uses code from various people. See 'README' for more! THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK! Playing MPEG stream from Foobar-GreatestHits.mp3 ... MPEG 1.0 layer III, 128 kbit/s, 44100 Hz joint-stereo
Voordat een CD of een CD track naar MP3 ge-encodeerd kan worden moeten de audiogegevens naar de harde schijf geript worden. Dit gaat door de ruwe CDDA (CD Digital Audio) gegevens naar WAV-bestanden te kopiëren.
Het hulpprogramma cdda2wav, dat onderdeel is van de suite sysutils/cdrtools, kan gebruikt worden om audio-informatie en de daarbij behorende informatie van CD's te rippen.
Als de audio CD in de drive zit, kan het volgende commando als root uitgevoerd worden om een hele CD naar individuele (per track) WAV-bestanden te rippen:
# cdda2wav -D 0,1,0 -B
cdda2wav ondersteunt ATAPI (IDE) CD-ROM-drives. Om van een IDE drive te rippen, dient de apparaatnaam aangegeven te worden in plaats van de SCSI eenheidsnummers. Om bijvoorbeeld track 7 van een IDE drive te rippen:
# cdda2wav -D /dev/acd0 -t 7
De optie -D 0,1,0
geeft het SCSI apparaat 0,1,0 aan, dat overeenkomt
met de uitvoer van cdrecord -scanbus.
Om individuele tracks te rippen kan gebruik gemaakt worden van de optie -t:
# cdda2wav -D 0,1,0 -t 7
In het bovenstaande voorbeeld wordt track 7 van de audio CD geript. Om een reeks tracks te rippen, bijvoorbeeld van 1 tot 7, kan een reeks opgegeven worden:
# cdda2wav -D 0,1,0 -t 1+7
Ook het hulpprogramma dd(1) kan gebruikt worden om audio tracks van ATAPI drives af te halen. Deze mogelijkheid wordt beschreven in Paragraaf 19.6.5.
Tegenwoordig is de MP3 encoder lame. Lame staat in audio/lame in de portsstructuur.
Met de geripte WAV-bestanden converteert het volgende commando audio01.wav naar audio01.mp3:
# lame -h -b 192 \ --tt "Foo Titel" \ --ta "FooBar Artiest" \ --tl "FooBar Album" \ --ty "2005" \ --tc "Geript en encoded door Foo" \ --tg "Genre" \ audio01.wav audio01.mp3
192 kbits lijkt de standaard bitrate voor MP3 te zijn. Het is ook mogelijk
128 of 160 of andere bitrates te gebruiken. Hoe hoger de bitrate, hoe meer
schijfruimte de uiteindelijke MP3-bestanden gebruiken, maar ook de kwaliteit wordt
dan hoger. Met de optie -h wordt de modus “hogere
kwaliteit, maar iets langzamer” ingeschakeld. Met de opties vanaf --t worden de ID3 tags ingegeven, die meestal informatie over
een nummer bevatten en onderdeel uitmaken van het MP3-bestand. In de hulppagina voor
lame staan nog meer opties die gebruikt kunnen
worden bij het encoderen beschreven.
Om een CD te kunnen branden van MP3's, moeten ze omgezet worden naar een niet gecomprimeerd WAV-formaat. Zowel XMMS als mpg123 ondersteunen de uitvoer van MP3 naar een niet gecomprimeerd bestandsformaat.
Naar schijf schrijven met XMMS:
Start XMMS;
Klik rechts op het venster om het XMMS menu te zien;
Selecteer Preference onder Options;
Wijzig de Output Plugin naar “Disk Writer Plugin”;
Klik Configure;
Voer een map in (of kies “browse”) waar de ongecomprimeerde bestanden naar toe geschreven moeten worden;
Laad de MP3-bestanden zoals gewoonlijk in XMMS, met het volume op 100% en de EQ instellingen uitgeschakeld;
Klik Play. XMMS lijkt nu de MP3 af te spelen, maar er is geen muziek te horen. Nu wordt feitelijk de MP3 afgespeeld naar een bestand;
Zorg ervoor dat de standaard Output Plugin wordt teruggezet naar hoe de instellingen waren om weer naar MP3's te kunnen luisteren.
Schrijven naar stdout vanuit mpg123:
Voer mpg123 -s audio01.mp3 > audio01.pcm uit.
XMMS schrijft een bestand in het WAV-formaat, terwijl mpg123 de MP3 converteert naar ruwe PCM audio data. Beide formaten kunnen gebruikt worden met cdrecord om audio CD's te maken. Met burncd(8) moeten ruwe PCM-bestanden gebruikt worden. Als er WAV-bestanden worden gebruikt, is er een tikgeluid te horen bij het begin van iedere track. Dit is het geluid van de kop van ieder WAV-bestand. Met het hulpprogramma SoX kan de kop van WAV-bestanden verwijderd worden. Dit programma kan geïnstalleerd worden met de port of pakket audio/sox
% sox -t wav -r 44100 -s -w -c 2 track.wav track.raw
In Paragraaf 19.6 staat meer informatie over het gebruiken van een CD-brander in FreeBSD.
Video afspelen is een relatief nieuwe en zich snel ontwikkelende richting voor applicaties. In tegenstelling tot voor audio werkt alles hier niet zo soepel.
Voor er wordt begonnen is het van belang te weten welk model videokaart zich in een systeem bevindt en welke chip die gebruikt. Hoewel Xorg vele videokaarten ondersteunt, zijn er veel minder geschikt om goed video mee af te spelen. Er kan een lijst met ondersteunde extensies getoond worden voor X server met de gebruikte videokaart door het commando xdpyinfo(1) uit te voeren terwijl X11 draait.
Het is verstandig een kort MPEG-bestand beschikbaar te hebben dat gebruikt kan worden als testbestand voor het evalueren van de spelers en hun opties. Omdat sommige DVD-spelers standaard zoeken naar DVD media in /dev/dvd of deze apparaatnaam standaard in de broncode hebben staan, is het wellicht verstandig om een symbolische link te maken naar de juiste apparaten:
# ln -sf /dev/acd0 /dev/dvd # ln -sf /dev/acd0 /dev/rdvd
Vanwege de werking van devfs(5), blijven handmatig aangemaakte links niet bestaan als een systeem wordt herstart. Om automatisch symbolische links aan te laten maken als een systeem start, kunnen de volgende regels toegevoegd worden aan /etc/devfs.conf:
link acd0 dvd link acd0 rdvd
Daarnaast zijn voor het decoderen van DVD, waarvoor bijzondere DVD-ROM functies aangeroepen worden, schrijfrechten op de DVD-apparaten nodig.
Om de gedeeld-geheugeninterface van X11 te verbeteren, wordt aangeraden dat een aantal variabelen van sysctl(8) worden verhoogd:
kern.ipc.shmmax=67108864 kern.ipc.shmall=32768
Er zijn een aantal methoden om video weer te geven onder X11. Welke echt werkt, is voornamelijk afhankelijk van de gebruikte hardware. Iedere hieronder beschreven methode geeft andere resultaten op andere hardware. De laatste tijd krijgt het renderen van video in X11 veel aandacht en bij iedere versie van Xorg kan er een aanzienlijke verbetering zijn.
Een lijst van veel gebruikte video-interfaces:
X11: normale X11 uitvoer met gebruikmaking van gedeeld geheugen;
XVideo: een uitbreiding op de X11 interface die video in een door X11 getekend object ondersteunt;
SDL: de Simple Directmedia Layer;
DGA: de Direct Graphics Access;
SVGAlib: low level console grafische laag.
Xorg kent een uitbreiding XVideo, ook bekend als Xvideo, Xv of xv, waarmee video direct weergegeven kan worden in getekende objecten door een speciale versneller. Deze uitbreiding geeft een goede afspeelkwaliteit, zelfs op machines met mindere specificaties.
Of de uitbreiding actief is, kan gecontroleerd worden met het commando xvinfo:
% xvinfo
XVideo wordt ondersteund als de uitvoer er ongeveer als volgt uitziet:
X-Video Extension version 2.2
screen #0
Adaptor #0: "Savage Streams Engine"
number of ports: 1
port base: 43
operations supported: PutImage
supported visuals:
depth 16, visualID 0x22
depth 16, visualID 0x23
number of attributes: 5
"XV_COLORKEY" (range 0 to 16777215)
client settable attribute
client gettable attribute (current value is 2110)
"XV_BRIGHTNESS" (range -128 to 127)
client settable attribute
client gettable attribute (current value is 0)
"XV_CONTRAST" (range 0 to 255)
client settable attribute
client gettable attribute (current value is 128)
"XV_SATURATION" (range 0 to 255)
client settable attribute
client gettable attribute (current value is 128)
"XV_HUE" (range -180 to 180)
client settable attribute
client gettable attribute (current value is 0)
maximum XvImage size: 1024 x 1024
Number of image formats: 7
id: 0x32595559 (YUY2)
guid: 59555932-0000-0010-8000-00aa00389b71
bits per pixel: 16
number of planes: 1
type: YUV (packed)
id: 0x32315659 (YV12)
guid: 59563132-0000-0010-8000-00aa00389b71
bits per pixel: 12
number of planes: 3
type: YUV (planar)
id: 0x30323449 (I420)
guid: 49343230-0000-0010-8000-00aa00389b71
bits per pixel: 12
number of planes: 3
type: YUV (planar)
id: 0x36315652 (RV16)
guid: 52563135-0000-0000-0000-000000000000
bits per pixel: 16
number of planes: 1
type: RGB (packed)
depth: 0
red, green, blue masks: 0x1f, 0x3e0, 0x7c00
id: 0x35315652 (RV15)
guid: 52563136-0000-0000-0000-000000000000
bits per pixel: 16
number of planes: 1
type: RGB (packed)
depth: 0
red, green, blue masks: 0x1f, 0x7e0, 0xf800
id: 0x31313259 (Y211)
guid: 59323131-0000-0010-8000-00aa00389b71
bits per pixel: 6
number of planes: 3
type: YUV (packed)
id: 0x0
guid: 00000000-0000-0000-0000-000000000000
bits per pixel: 0
number of planes: 0
type: RGB (packed)
depth: 1
red, green, blue masks: 0x0, 0x0, 0x0
Opmerking: Sommige van de weergegeven formaten (YUV2, YUV12, enzovoort) zijn niet in iedere implementaties van XVideo beschikbaar en hun afwezigheid kan sommige spelers hinderen.
Als het resultaat er als hieronder uitziet, is er geen ondersteuning voor XVideo aanwezig op de videokaart in een systeem:
X-Video Extension version 2.2 screen #0 no adaptors present
Als XVideo voor een kaart niet wordt ondersteund, dan betekent dat alleen dat het lastiger wordt om op een beeldscherm aan de vereisten voor het renderen van video te voldoen. Afhankelijk van de videokaart en de processor kan het toch nog mogelijk zijn om acceptabele prestaties neer te zetten. In Paragraaf 8.4.3 staan verwijzingen naar leesvoer over mogelijkheden voor het verbeteren van prestaties.
De Eenvoudige Directmedia Laag (Simple Directmedia Layer), SDL, was bedoeld als een porting-laag tussen Microsoft Windows, BeOS en UNIX, waardoor cross-platform toepassingen konden worden ontwikkeld die efficiënt gebruik maken van geluid en beelden. De SDL laag biedt een abstractie op laag niveau naar de hardware die soms efficiënter kan zijn dan de X11 interface.
De SDL staat in devel/sdl12.
Directe Grafische Toegang (Direct Graphics Access) is een X11 uitbreiding die een programma in staat stelt voorbij te gaan aan de X server en de framebuffer direct kan wijzigen. Omdat hij afhankelijk is van geheugenmapping op een laag niveau om dit delen uit te voeren, moeten programma's die er gebruik van maken als root draaien.
De DGA uitbreiding kan getest en gebenchmarkt worden met dga(1). Als dga draait, verandert het de kleuren op een scherm als er een toets wordt ingedrukt. Om te stoppen kan de toets q gebruikt worden.
In dit onderdeel wordt de software die vanuit de FreeBSD Portscollectie beschikbaar is voor het afspelen van video beschreven. Het afspelen van video is een tak van softwareontwikkeling die erg in beweging is en de mogelijkheden van de verschillende applicaties verschillen zeer waarschijnlijk van wat hier is beschreven.
Als eerste is het belangrijk om te weten dat veel applicaties die met video te maken hebben en op FreeBSD draaien ontwikkeld zijn als Linux applicaties. Veel van die applicaties zijn op het moment van schrijven van beta-kwaliteit. Problemen die te verwachten zijn bij het gebruik van de beschreven videopakketten op FreeBSD zijn:
Een applicatie kan geen bestanden afspelen die zijn gemaakt met een andere applicatie;
Een applicatie kan geen bestanden afspelen die met de applicatie zelf zijn gemaakt;
Dezelfde applicatie, op twee verschillende machines gebouwd, speelt hetzelfde bestand op twee machines anders af;
Een ogenschijnlijk triviale filter, zoals het herschalen van beeldgrootte, kan resulteren in vreselijk vervelende artefacten door fouten in de routine voor het herschalen;
Een applicatie dumpt zijn core regelmatig;
Documentatie wordt niet geïnstalleerd bij de port en staat op het web of in de map work van de port.
Veel van deze applicaties kunnen ook “Linux-ismes” vertonen. Zo kunnen er bijvoorbeeld problemen ontstaan door de wijze waarop standaard bibliotheken zijn geïmplementeerd in de Linux distributies of een aantal van de mogelijkheden van de Linux-kernel, waarvan door de makers van de applicatie wordt aangenomen dat ze aanwezig zijn. Dit soort problemen zijn niet altijd zichtbaar en er wordt ook omheen gewerkt door de beheerders van ports, wat tot de volgende mogelijke problemen kan leiden:
Het gebruik van /proc/cpuinfo om processorkarakteristieken uit te lezen;
Het verkeerd gebruiken van threads, waardoor een programma hangt als het klaar is, in plaats van dat het echt eindigt;
Software die nog niet in de FreeBSD Portscollectie zit en vaak gebruikt wordt samen met een applicatie die daar wel onderdeel van uitmaakt.
Tot nu toe is gebleken dat de ontwikkelaars van applicaties wel coöperatief waren met de beheerders van ports om zo het aantal work-arounds dat nodig was voor het overzetten tot een minimum te beperken.
MPlayer is een zich snel ontwikkelende videospeler. De doelen van het MPlayer-team zijn snelheid en flexibiliteit onder Linux en andere Unices. Het project is gestart toen de oprichter van het team genoeg had van de slechte afspeelprestaties van de destijds beschikbare spelers. Er zijn mensen die zeggen dat het grafische ontwerp is opgeofferd voor het stroomlijnen van het ontwerp, maar het blijkt dat, als een gebruiker gewend is aan de commandoregelopties en de toetsencommando's, de applicatie erg goed werkt.
MPlayer staat in multimedia/mplayer. MPlayer voert een aantal hardwarecontroles uit tijdens het bouwen, wat resulteert in een binair bestand dat niet van het ene naar het andere systeem verplaatst kan worden. Daarom is het van belang dat het uit de ports wordt gebouwd en niet als binair pakket wordt geïnstalleerd. Daarnaast staan er ook nog opties die vanaf de make commandoregel meegegeven kunnen worden beschreven in de Makefile en aan het begin van de build:
# cd /usr/ports/multimedia/mplayer # make N - O - T - E Take a careful look into the Makefile in order to learn how to tune mplayer towards you personal preferences! For example, make WITH_GTK1 builds MPlayer with GTK1-GUI support. If you want to use the GUI, you can either install /usr/ports/multimedia/mplayer-skins or download official skin collections from http://www.mplayerhq.hu/homepage/dload.html
De standaard portopties zijn voor de meeste gebruikers voldoende. Maar als bijvoorbeeld de XviD codec nodig is, dan moet de optie WITH_XVID op de commandoregel meegegeven worden. Het standaard DVD-apparaat kan ook gedefinieerd worden met de optie WITH_DVD_DEVICE, waarbij standaard /dev/acd0 wordt gebruikt.
Op het moment van schrijven wordt de MPlayer port gebouwd met de HTML documentatie en twee uitvoerbare bestanden, mplayer en mencoder, wat een hulpmiddel is voor het opnieuw encoderen van video.
De HTML documentatie voor MPlayer is erg informatief. Als de lezer vindt dat er informatie over videohardware en interfaces in dit hoofdstuk mist, dan is de documentatie van MPlayer een zeer grondige aanvulling. Het is de moeite waard de tijd te nemen om de documentatie van MPlayer te lezen, als meer informatie over de ondersteuning van video in UNIX welkom is.
Iedere gebruiker van MPlayer dient een submap .mplayer in zijn thuismap te hebben. Die kan als volgt gemaakt worden:
% cd /usr/ports/multimedia/mplayer % make install-user
De commando-opties voor mplayer staan in de hulppagina. Nog meer details staan in de HTML documentatie. In dit onderdeel worden slechts een aantal gebruiksmogelijkheden beschreven.
Om een bestand als testbestand.avi af te spelen met een van de
beschikbare video-interfaces, kan de optie -vo gebruikt
worden:
% mplayer -vo xv testbestand.avi
% mplayer -vo sdl testbestand.avi
% mplayer -vo x11 testbestand.avi
# mplayer -vo dga testbestand.avi
# mplayer -vo 'sdl:dga' testbestand.avi
Het is de moeite waard alle bovenstaande opties uit te proberen omdat hun relatieve prestatie afhangt van vele factoren die aanzienlijk verschillen tussen hardware.
Om een DVD af te spelen dient testbestand.avi vervangen te worden door
dvd://N -dvd-device APPARAAT waar N het titelnummer is dat afgespeeld moeten worden
en APPARAAT het
apparaatknooppunt is voor de DVD-ROM. Om bijvoorbeeld titel 3 van /dev/dvd af te spelen:
# mplayer -vo xv dvd://3 -dvd-device /dev/dvd
Opmerking: Het standaard DVD-apparaat kan ingesteld worden bij het bouwen van de MPlayer port met de optie WITH_DVD_DEVICE. Standaard is dit apparaat /dev/acd0. Meer details staan in de Makefile van de port.
Om te stoppen, pauzeren, verder te spoelen, enzovoort, kunnen de toetsendefinities gebruikt worden, die in te zien zijn door mplayer -h uit te voeren of de hulppagina te lezen.
Overige belangrijke opties voor het afspelen zijn: -fs
-zoom, waarmee het volledige scherm wordt gebruikt, en -framedrop, die prestatieverhogend werkt.
Om ervoor te zorgen dat de commandoregels niet te lang worden, kan het bestand .mplayer/config met voorkeursinstellingen gemaakt worden:
vo=xv fs=yes zoom=yes
Tenslotte kan mplayer gebruikt worden om een DVD naar een bestand van het type .vob te rippen. Om de tweede titel van een DVD de dumpen kan het volgende commando gebruikt worden:
# mplayer -dumpstream -dumpfile out.vob dvd://2 -dvd-device /dev/dvd
Het uitvoerbestand out.vob, is van het type MPEG en kan bewerkt worden met andere in dit onderdeel besproken programma's.
Voordat mencoder wordt gebruikt, is het verstandig de opties uit de HTML-documentatie te bekijken. Er is een hulppagina, maar die is niet echt bruikbaar zonder de HTML-documentatie. Er zijn ontelbare mogelijkheden om de kwaliteit te verhogen, de bitrate te verlagen en formaten te wijzigen en een aantal van die truuks maken het verschil tussen goede en slechte prestaties. Hieronder staan een aantal voorbeelden beschreven. Eerst een eenvoudige kopie:
% mencoder invoer.avi -oac copy -ovc copy -o uitvoer.avi
Verkeerde combinaties van commandoregelopties kunnen resulteren in
uitvoerbestanden die zelfs niet af te spelen zijn door mplayer. Daarom wordt aangeraden om het bij de optie
-dumpfile in mplayer te houden
als het alleen maar nodig is een bestand te rippen.
Om invoer.avi te converteren naar de MPEG4-codec met MPEG3-audio encodering (audio/lame is verplicht):
% mencoder invoer.avi -oac mp3lame -lameopts br=192 \ -ovc lavc -lavcopts vcodec=mpeg4:vhq -o utvoer.avi
Hiermee wordt uitvoer gemaakt die af te spelen is met mplayer en xine.
invoer.avi kan
worden vervangen door dvd://1 -dvd-device /dev/dvd en
als root gedraaid worden om een DVD-titel direct te
hercoderen. Omdat het waarschijnlijk is dat de eerste experimenten niet
direct tevredenstellend zijn, wordt aangeraden een titel eerst naar een bestand te
dumpen en dat als werkbestand te gebruiken.
De xine videospeler is een project met een brede scope, dat niet alleen tracht een allesomvattende video-oplossing te bieden, maar ook probeert een herbruikbare basisbibliotheek en een modulair uitvoerbaar bestand te maken dat uitgebreid kan worden met plug-ins. Het kan als pakket en port geïnstalleerd worden uit multimedia/xine.
De xine speler heeft nog wat ruwe randjes, maar is zeker goed van start gegaan. In de praktijk heeft xine een snelle CPU met een snelle videokaart of ondersteuning voor de XVideo extensie nodig. De GUI is bruikbaar, maar wat onhandig.
Op het moment van schrijven wordt er geen invoermodule bij xine geleverd waarmee CSS gecodeerde DVD's afgespeeld kunnen worden. Er zijn er die door andere partijen zijn gebouwd die dat type modules wel hebben, maar die zijn niet beschikbaar in de FreeBSD Portscollectie.
Vergeleken met MPlayer, doet xine meer voor de gebruiker, maar tegelijkertijd neemt het wat van de fijnafstellingsmogelijkheden weg. De videospeler xine werkt het beste op XVideo-interfaces.
Standaard start de xine speler op in een grafische gebruikersinterface. Via het menu kan een specifiek bestand geopend worden:
% xine
Het is ook mogelijk om zonder de GUI direct een bestand af te laten spelen:
% xine -g -p mijnfilm.avi
De software transcode is geen speler, maar een verzameling hulpprogramma's voor het hercoderen van video- en audiobestanden. Met transcode wordt het mogelijk om videobestanden samen te voegen, kapotte bestanden te repareren en commandoregelprogramma's te gebruiken met stdin/stdout stream interfaces.
Tijdens het bouwen van de port multimedia/transcode kan een groot aantal opties opgegeven worden en de volgende commandoregel wordt geadviseerd om transcode te bouwen:
# make WITH_OPTIMIZED_CFLAGS=yes WITH_LIBA52=yes WITH_LAME=yes WITH_OGG=yes \ WITH_MJPEG=yes -DWITH_XVID=yes
De geadviseerde instellingen zijn toereikend voor de meeste gebruikers.
Om de mogelijkheden van transcode te illustreren volgt nu een voorbeeld van hoe een DivX-bestand om te zetten in een PAL MPEG-1-bestand (PAL VCD):
% transcode -i invoer.avi -V --export_prof vcd-pal -o uitvoer_vcd % mplex -f 1 -o uitvoer_vcd.mpg uitvoer_vcd.m1v uitvoer_vcd.mpa
Het resulterende MPEG-bestand, uitvoer_vcd.mpg, is klaar om afgespeeld te worden met MPlayer. Het kan ook op een CD-R gebrand worden om er een Video-CD mee te maken. In dat geval is het nodig om de programma's multimedia/vcdimager en sysutils/cdrdao te installeren.
Er is een hulppagina voor transcode, maar kijk ook op transcode wiki voor meer informatie en voorbeelden.
Als de twee vergeleken worden, draait transcode aanzienlijk langzamer dan mencoder, maar is de kans wel groter dat er een bestand uit komt dat op de meeste spelers afgespeeld kan worden. MPEG-bestanden die met transcode zijn gemaakt, zijn bijvoorbeeld al afgespeeld op Windows Media® Player en Apple's Quicktime®.
De beschikbare videosoftware pakketten voor FreeBSD zijn fors in ontwikkeling. Het is goed mogelijk dat in de nabije toekomst de meeste problemen die hier aan de kaak zijn gesteld, zijn opgelost. Intussen kunnen zij die het hoogst haalbare uit de A/V mogelijkheden voor FreeBSD willen halen, dat het beste doen door wat beschikbaar is bij elkaar te scharrelen uit de beschikbare FAQ's and tutorials en meerdere programma's gebruiken. Het doel van deze paragraaf is de lezer wat richting te geven op dat vlak.
De MPlayer documentatie is technisch erg informatief. Deze documenten kunnen het beste bekeken worden door iemand die veel kennis wil opdoen over video in UNIX. Op de MPlayer mailinglijst wordt het niet op prijs gesteld als iemand de documentatie niet heeft gelezen, dus het is verstandig RTFM in gedachten te houden alvorens bug rapportages naar ze te mailen.
De xine HOWTO bevat een hoofdstuk over het verbeteren van prestaties, dat op alle spelers van toepassing is.
Tenslotte zijn er nog een aantal veelbelovende applicaties die het proberen waard zijn:
Avifile bestaat ook als port: multimedia/avifile;
Ogle is er ook als port: multimedia/ogle;
multimedia/dvdauthor, een open source pakket voor authoring van DVD content.
Met TV-kaarten is het mogelijk om naar (kabel)uitzendingen te kijken op een computer. Op de meeste kaarten kan composiet video aangeleverd worden via een RCA of S-video input en sommige kaarten hebben ook een FM tuner.
FreeBSD biedt ondersteuning voor PCI-gebaseerde TV-kaarten met een Brooktree Bt848/849/878/879 of een Conexant CN-878/Fusion 878a Video Capture Chip met het stuurprogramma bktr(4). Het is van belang dat er op de kaart ook een ondersteunde tuner zit. Hiervoor kan bktr(4) geraadpleegd worden, waarin een lijst met ondersteunde tuners staat.
Voordat de kaart gebruikt kan worden, dient het stuurprogramma bktr(4) geladen te worden. Dit kan door de volgende regel aan /boot/loader.conf toe te voegen:
bktr_load="YES"
Daarnaast is het ook mogelijk om statisch ondersteuning voor de TV-kaart in de kernel te compileren. Dan dient de volgende regel toegevoegd te worden aan de kernelinstellingen:
device bktr device iicbus device iicbb device smbus
De extra stuurprogramma's zijn nodig omdat de kaartcomponenten verbonden zijn via een I2C bus. Met deze instellingen kan een nieuwe kernel gebouwd en geïnstalleerd worden.
Als een systeem eenmaal ondersteuning biedt, hoort de TV-kaart ongeveer als volgt bij een herstart getoond te worden:
bktr0: <BrookTree 848A> mem 0xd7000000-0xd7000fff irq 10 at device 10.0 on pci0 iicbb0: <I2C bit-banging driver> on bti2c0 iicbus0: <Philips I2C bus> on iicbb0 master-only iicbus1: <Philips I2C bus> on iicbb0 master-only smbus0: <System Management Bus> on bti2c0 bktr0: Pinnacle/Miro TV, Philips SECAM tuner.
Deze berichten kunnen afwijken, afhankelijk van de gebruikte hardware. Het is van belang te controleren of de tuner juist herkend wordt; er kunnen nog een aantal instellingen gemaakt worden voor parameters met sysctl(8) MIB's en in het kernelinstellingenbestand. Om bijvoorbeeld het gebruik van een Philips SECAM tuner te forceren, kan de volgende regel aan het bestand met kernelinstellingen worden toegevoegd:
options OVERRIDE_TUNER=6
Dit kan ook via een instelling van sysctl(8):
# sysctl hw.bt848.tuner=6
In de hulppagina voor bktr(4) en /usr/src/sys/conf/NOTES staan meer details over de beschikbare opties.
Om een TV-kaart te gebruiken, dient een van de volgende applicaties geïnstalleerd te worden:
multimedia/fxtv biedt TV-in-een-window en beeld/audio/videocapture mogelijkheden;
multimedia/xawtv is ook een TV applicatie met dezelfde mogelijkheden als fxtv;
misc/alevt decodeert Videotext/Teletext en kan deze weergeven;
audio/xmradio, een applicatie om de FM-tuner die bij sommige TV-kaarten zit te gebruiken;
audio/wmtune, een handige bureaubladapplicatie voor radiotuners.
Er zijn nog meer applicaties beschikbaar in de Portscollectie.
Bij problemen met een TV-kaart dient eerst gecontroleerd te worden of de videocapture chip en de tuner echt ondersteund worden door het stuurprogramma bktr(4) en of de juiste instellingen worden gebruikt. Voor meer ondersteuning en vragen over een specifieke TV-kaart is het aan te raden de archieven van de freebsd-multimedia mailinglijst te raadplegen of er contact mee op te nemen.
MythTV is een open-source PVR software project.
Het staat in de Linux-wereld bekend als een complexe toepassing met veel afhankelijkheden, en daarom moeilijk om te installeren. De Portscollectie van FreeBSD versimpelt veel van het proces, maar sommige componenten moeten handmatig worden geïnstalleerd. Deze sectie is bedoeld om te helpen en te begeleiden in het installeren van MythTV.
MythTV is ontworpen om V4L te gebruiken om invoerapparatuur voor video zoals encoders en tuners te benaderen. Momenteel werkt MythTV het beste met USB DVB-S/C/T kaarten die ondersteund worden door multimedia/webcamd omdat webcamd een gebruikerstoepassing levert voor V4L. Elke DVB-kaart die ondersteund wordt door webcamd zou met MythTV moeten werken, een lijst van kaarten waarvan hun werking bekend is kan hier gevonden worden. Er zijn ook stuurprogramma's bekend voor Hauppauge-kaarten in de pakketten multimedia/pvr250 en multimedia/pvrxxx, maar deze leveren een niet-standaard interface met hun stuurprogramma dat niet werkt met versies van MythTV nieuwer dan 0.23.
HTPC bevat een lijst van alle beschikbare stuurprogramma's voor DVB.
Doordat MythTV flexibel en modulair is, staat het de gebruiker toe om de voorkant en de achterkant op verschillende machines te hebben.
Voor de voorkant is multimedia/mythtv-frontend nodig, alsook een X-server welke in x11/xorg beschikbaar is. Idealiter beschikt de voorkant-computer ook over een videokaart die XvMC ondersteunt en optioneel over een afstandsbediening die compatibel is met LIRC.
Voor de achterkant is multimedia/mythtv nodig, alsook een MySQL™ database en optioneel een tuner en opslag voor opnames. Het MySQL pakket zou automatisch als een afhankelijkheid geïnstalleerd moeten worden tijdens de installatie van multimedia/mythtv.
Gebruik de volgende stappen om MythTV te installeren. Installeer als eerste MythTV van de FreeBSD Portscollectie:
# cd /usr/ports/multimedia/mythtv # make install
Installeer de database voor MythTV:
# mysql -uroot -p < /usr/local/share/mythtv/database/mc.sql
Configureer de achterkant:
# mythtv-setup
Start de achterkant:
# echo 'mythbackend_enable="YES"' >> /etc/rc.conf # /usr/local/etc/rc.d/mythbackend start
In FreeBSD is toegang tot scanners mogelijk met SANE (Scanner Access Now Easy) API uit de FreeBSD Portscollectie. SANE gebruikt ook een aantal FreeBSD apparaatstuurprogramma's om toegang te krijgen tot de hardware van de scanner.
FreeBSD ondersteunt SCSI en USB scanners. Het is van belang te controleren of een scanner door SANE wordt ondersteund voordat er instellingen worden gemaakt. SANE heeft een lijst met ondersteunde apparaten waarin gekeken kan worden of een scanner wordt ondersteund en wat de status voor ondersteuning is. Op systemen van vóór FreeBSD 8.X staat in de handleidingpagina van uscanner(4) een lijst met ondersteunde USB-scanners.
Zoals hierboven al is aangegeven, worden zowel SCSI als USB-scanners ondersteund. Afhankelijk van de gebruikte scannerinterface zijn verschillende apparaatstuurprogramma's nodig.
In de GENERIC kernel zitten standaard de apparaatstuurprogramma's die nodig zijn voor ondersteuning van USB-scanners. In het geval wordt besloten tot het maken van een aangepaste kernel, dan dienen de volgende regels in het kernelinstellingenbestand te worden opgenomen:
device usb device uhci device ohci device uscanner device ehci
Op systemen van vóór FreeBSD 8.X is de volgende regel ook nodig:
device uscanner
Op deze versies van FreeBSD biedt het apparaat uscanner(4) ondersteuning voor de USB-scanners. Sinds FreeBSD 8.0 ondersteunt de bibliotheek libusb(3) dit direct.
Na een herstart met de juiste kernel kan de USB-scanner aangesloten worden. Een regel die de detectie van uw scanner aangeeft zou in de berichtenbuffer van het systeem (dmesg(8)) moeten verschijnen:
ugen0.2: <EPSON> at usbus0
Of op een FreeBSD 7.X systeem:
uscanner0: EPSON EPSON Scanner, rev 1.10/3.02, addr 2
Deze berichten geven aan dat de scanner òfwel /dev/ugen0.2 òf /dev/uscanner0 als apparaatknooppunt gebruikt afhankelijk van de versie van FreeBSD die we draaien. Voor dit voorbeeld was een EPSON Perfection® 1650 USB-scanner gebruikt.
Als een scanner een SCSI interface heeft, is het belangrijk te weten welk SCSI controllerbord gebruikt gaat worden. Afhankelijk van de gebruikte SCSI chipset, dient het bestand met kernelinstellingen aangepast te worden. De GENERIC kernel ondersteunt de meest voorkomende SCSI controllers. In het bestand NOTES is de juiste instelling te vinden die toegevoegd moet worden aan het bestand met kernelinstellingen. Naast het toevoegen van het juiste SCSI-adapter stuurprogramma, dienen ook de volgende regels opgenomen te worden in het kernelinstellingenbestand:
device scbus device pass
Als de kernel juist gecompileerd en geïnstalleerd is, horen de apparaten tijdens het opstarten zichtbaar te zijn in de systeemberichtbuffer:
pass2 at aic0 bus 0 target 2 lun 0 pass2: <AGFA SNAPSCAN 600 1.10> Fixed Scanner SCSI-2 device pass2: 3.300MB/s transfers
Als een scanner niet aan staat tijdens het opstarten, is het nog mogelijk handmatig detectie te forceren door de SCSI-bus te laten scannen met camcontrol(8):
# camcontrol rescan all Re-scan of bus 0 was successful Re-scan of bus 1 was successful Re-scan of bus 2 was successful Re-scan of bus 3 was successful
In het bovenstaande geval zal de scanner ongeveer als volgt verschijnen in de lijst met SCSI-apparaten:
# camcontrol devlist <IBM DDRS-34560 S97B> at scbus0 target 5 lun 0 (pass0,da0) <IBM DDRS-34560 S97B> at scbus0 target 6 lun 0 (pass1,da1) <AGFA SNAPSCAN 600 1.10> at scbus1 target 2 lun 0 (pass3) <PHILIPS CDD3610 CD-R/RW 1.00> at scbus2 target 0 lun 0 (pass2,cd0)
Meer details over SCSI-apparaten staan in de hulppagina's voor scsi(4) en camcontrol(8).
Het SANE systeem is opgesplitst in twee delen: de backends (graphics/sane-backends) en de frontends (graphics/sane-frontends). Het deel met de backends zorgt voor de toegang tot de scanner zelf. In de lijst met door SANE ondersteunde apparaten staat welk backend welke scanner(s) ondersteunt. Het is echt nodig het juiste backend vast te stellen, omdat het anders bijzonder lastig wordt een scanner aan de praat te krijgen. Het deel met frontends levert een grafische scaninterface (xscanimage).
De eerste stap is om de port of het pakket graphics/sane-backends te installeren. Daarna kan met het commando sane-find-scanner gecontroleerd worden welke scanner er door het SANE systeem is gedetecteerd:
# sane-find-scanner -q found SCSI scanner "AGFA SNAPSCAN 600 1.10" at /dev/pass3
In de uitvoer is te lezen welk type interface en welk apparaatknooppunt worden gebruikt om de scanner met een systeem te verbinden. Het merk en het model worden wellicht niet getoond, maar dat is ook niet echt van belang.
Opmerking: Sommige USB-scanners verlangen dat er firmware wordt geladen. Dit wordt uitgelegd in de hulppagina van het backend. Het is ook van belang sane-find-scanner(1) en sane(7) te lezen.
Hierna kan gecontroleerd worden of de scanner ook te zien is voor een
scanner-frontend. Er zit bij de SANE backends een
standaard hulpprogramma
scanimage(1).
Met dit commando kunnen de apparaten zichtbaar gemaakt worden en kan vanaf de
commandoregel gescand worden. Met de optie -L
kunnen de scannerapparaten getoond worden:
# scanimage -L device `snapscan:/dev/pass3' is a AGFA SNAPSCAN 600 flatbed scanner
Of, met bijvoorbeeld de USB-scanner die in Paragraaf 8.7.2.1 wordt gebruikt:
# scanimage -L device 'epson2:libusb:/dev/usb:/dev/ugen0.2' is a Epson GT-8200 flatbed scanner
Deze uitvoer komt van een FreeBSD 8.X systeem, het item 'epson2:libusb:/dev/usb:/dev/ugen0.2' geeft de naam van het backend (epson2) en het apparaatknooppunt (/dev/ugen0.2) dat door onze scanner wordt gebruikt.
Opmerking: De afwezigheid van uitvoer of een bericht dat aangeeft dat er geen scanners zijn aangetroffen, betekent dat scanimage(1) niet in staat is een scanner te identificeren. Als dit gebeurt, dient het instellingenbestand voor het backend aangepast te worden en dient daar de juiste instelling gemaakt te worden. De map /usr/local/etc/sane.d/ bevat alle bestanden met instellingen voor de backends. Het is bekend dat dit identificatieprobleem optreedt bij bepaalde USB-scanners.
De USB-scanner die in Paragraaf 8.7.2.1 wordt gebruikt, wordt in FreeBSD 8.X prima gedetecteerd en werkt daar, maar in eerdere versies van FreeBSD (waar uscanner(4) wordt gebruikt) toont het de volgende informatie met sane-find-scanner:
# sane-find-scanner -q found USB scanner (UNKNOWN vendor and product) at device /dev/uscanner0De bovenstaande uitvoer geeft aan dat de scanner juist is gedetecteerd, dat het de USB-interface gebruikt en is aangesloten op het apparaatknooppunt /dev/uscanner0. Nu kan gecontroleerd worden of de scanner juist wordt geïdentificeerd:
# scanimage -L No scanners were identified. If you were expecting something different, check that the scanner is plugged in, turned on and detected by the sane-find-scanner tool (if appropriate). Please read the documentation which came with this software (README, FAQ, manpages).Omdat in het bovenstaande voorbeeld de scanner niet wordt geïdentificeerd, dient het bestand /usr/local/etc/sane.d/epson2.conf gewijzigd te worden. De gebruikte scanner is een EPSON Perfection 1650, dus in dit geval dient voor de scanner het backend epson2 gebruikt te worden. Het is van belang om het commentaar in de instellingenbestanden van de backends te lezen. Het aanpassen van regels is eenvoudig: plaats een commentaarkarakter voor alle regels voor andere interfaces dan die nodig zijn weg (in dit geval worden alle regels die beginnen met het woord scsi uitgeschakeld, omdat er een USB-interface wordt gebruiken), en dan kan onderaan het bestand een regel met de gebruikte interface en apparaatknooppunt geplaatst worden:
usb /dev/uscanner0Het is aan te raden de opmerkingen te lezen in het bestand met instellingen voor het backend en ook de hulppagina, omdat daarin meer details en de correcte syntaxis te vinden zijn. Nu kan gecontroleerd worden of de scanner wèl juist wordt geïdentificeerd:
# scanimage -L device `epson:/dev/uscanner0' is a Epson GT-8200 flatbed scannerDe USB-scanner is geïdentificeerd. Het is niet belangrijk dat het merk en model niet overeenkomen met de scanner. Het belangrijkste is het veld `epson:/dev/uscanner0', dat de juiste benamingen voor het backend en het apparaatknooppunt aangeeft.
Als scanimage -L in staat is een scanner goed te zien, dan zijn de instellingen compleet. Er kan nu met het apparaat gescand worden.
Hoewel scanimage(1) in staat is om vanaf de commandoregel te scannen, is het aan te raden beelden te scannen vanuit de grafische gebruikersinterface. SANE heeft een eenvoudige, maar efficiënte grafische interface: xscanimage (graphics/sane-frontends).
Xsane (graphics/xsane) is een ander populair grafisch scanfrontend, dat geavanceerde mogelijkheden biedt, zoals meerdere scanmodi (fotokopie, fax, enzovoort), kleurcorrectie, batchscannen, enzovoort. Beide applicaties zijn als plug-in voor GIMP te gebruiken.
Alle voorgaande taken zijn uitgevoerd met root rechten, maar het is wellicht ook nodig dat andere gebruikers de scanner kunnen gebruiken. Dan heeft een gebruiker lees- en schrijfrechten nodig op de apparaatknooppunt voor een scanner. Onze USB-scanner gebruikt bijvoorbeeld apparaatknooppunt /dev/ugen0.2 wat in feite slechts een symbolische koppeling is naar het echte apparaatknooppunt genaamd /dev/usb/0.2.0 (een blik op de inhoud van de map /dev bevestigt dit). Zowel de symbolische koppeling als het apparaatknooppunt zijn van respectievelijk de groepen wheel en operator. Door de gebruiker joe aan deze groepen toe te voegen kan hij de scanner zien, maar vanwege duidelijke veiligheidsredenen dient het toevoegen van een gebruiker aan elke groep met zorg te gebeuren, vooral aan de groep wheel. Een betere oplossing is om een specifieke groep aan te maken voor het gebruik van USB-apparaten en de scanner toegankelijk te maken voor leden van deze groep.
We zullen dus bijvoorbeeld een groep genaamd usb gebruiken. De eerste stap is het aanmaken van deze groep met behulp van het commando pw(8):
# pw groupadd usb
Hierna moeten we de symbolische koppeling /dev/ugen0.2 aanmaken en het apparaatknooppunt /dev/usb/0.2.0 met de juiste schrijfpermissies toegankelijk maken voor de groep usb (0660 of 0664), omdat standaard alleen de eigenaar van deze bestanden (root) ernaar kan schrijven. Dit alles wordt gedaan door de volgende regels aan /etc/devfs.rules toe te voegen:
[system=5] add path ugen0.2 mode 0660 group usb add path usb/0.2.0 mode 0666 group usb
Gebruikers van FreeBSD 7.X hebben waarschijnlijk de volgende regels met het juiste apparaatknooppunt, /dev/uscanner0, nodig:
[system=5] add path uscanner0 mode 0660 group usb
Daarna kan de volgende regel aan /etc/rc.conf toegevoegd worden en dient een machine herstart te worden:
devfs_system_ruleset="system"
Meer informatie over de bovenstaande instellingen staan in de hulppagina voor devfs(8).
Nu dienen er alleen nog gebruikers aan de groep usb toegevoegd te worden om toegang tot de scanner toe te staan:
# pw groupmod usb -m joe
Lees voor meer details de handleidingpagina van pw(8).
De kernel is de kern van het FreeBSD-besturingssysteem en is verantwoordelijk voor het geheugenbeheer, het opleggen van beveiligingsregels, het aansturen van het netwerk, de toegang tot schijven en nog veel meer. Hoewel steeds meer in FreeBSD dynamisch instelbaar wordt, is het af en toe nodig om de kernel opnieuw in te stellen en te compileren.
Na het lezen van dit hoofdstuk weet de lezer:
Waarom het nodig is om een aangepaste kernel te bouwen;
Hoe een nieuw kernelinstellingenbestand te schrijven of een bestaand kernelinstellingenbestand aan te passen;
Hoe het kernelinstellingenbestand te gebruiken om een nieuwe kernel aan te maken en te bouwen;
Hoe een nieuwe kernel te installeren;
Hoe problemen op te lossen als er iets verkeerd gaat.
Alle opdrachten die in dit hoofdstuk als voorbeeld zijn gegeven moeten als root uitgevoerd worden om te slagen.
Traditioneel heeft FreeBSD zoals dat heet een “monolitische” kernel gehad. Dit betekent dat de kernel één groot programma was, een vaste lijst van apparaten ondersteunde en als het gewenst was om het gedrag van de kernel te veranderen, moest er een nieuwe kernel gecompileerd worden en moest daarna de computer opnieuw gestart worden met de nieuwe kernel.
Vandaag de dag beweegt FreeBSD zich snel naar een model waar veel van de functionaliteit van de kernel in modules zit die dynamisch in en uit de kernel kunnen worden geladen, naargelang dat noodzakelijk is. Dit stelt de kernel in staat om zich aan nieuwe hardware aan te passen die plotseling beschikbaar komt (zoals PCMCIA-kaarten in een laptop) of om nieuwe functionaliteit in zich op te nemen die niet noodzakelijk was toen de kernel oorspronkelijk werd gecompileerd. Dit staat bekend als een modulaire kernel.
Desondanks is het nog steeds nodig om enkele dingen van de kernel statisch in te stellen. In sommige gevallen komt dit doordat de functionaliteit zo diep geworteld zit in de kernel dat het niet dynamisch laadbaar gemaakt kan worden. In andere gevallen kan het simpelweg komen doordat nog niemand de tijd heeft genomen om een dynamisch laadbare kernelmodule voor die functionaliteit te schrijven.
Het bouwen van een aangepaste kernel is een van de meest belangrijke beproevingen die geavanceerde BSD-gebruikers moet doorstaan. Hoewel dit proces veel tijd in beslag neemt, levert het veel voordelen op voor een FreeBSD systeem. In tegenstelling tot de GENERIC-kernel, die vele typen hardware moet ondersteunen, ondersteunt een aangepaste kernel alleen de hardware van de computer waar hij voor gemaakt is. Dit biedt een aantal voordelen, zoals:
Een snellere opstarttijd. Aangezien de kernel alleen de hardware zoekt die zich in het systeem bevindt, kan de tijd die het systeem nodig heeft om op te starten aanzienlijk korter worden;
Minder geheugengebruik. Een aangepaste kernel gebruikt vaak minder geheugen dan de GENERIC-kernel door ongebruikte mogelijkheden en apparaatstuurprogramma's weg te laten. Dit is van belang aangezien de kernelcode altijd in het fysieke geheugen aanwezig blijft, waardoor dit geheugen niet door applicaties gebruikt kan worden. Om deze reden is een aangepaste kernel geknipt voor een systeem met een kleine hoeveelheid RAM;
Aanvullende hardware-ondersteuning. Een aangepaste kernel kan ingebouwde ondersteuning bieden voor apparaten die zich niet in de GENERIC-kernel bevinden, zoals geluidskaarten.
Alvorens in de kernelconfiguratie te duiken, zou het verstandig zijn om een inventarisatie van de hardware van de machine te maken. In het geval dat FreeBSD niet het primaire besturingssysteem is, kan de inventarisatielijst eenvoudig worden gemaakt door de configuratie van het huidige besturingssysteem te bekijken. De Device Manager van Microsoft bijvoorbeeld bevat normaliter belangrijke informatie over geïnstalleerde apparaten. De Device Manager bevindt zich in het controlepaneel.
Opmerking: Sommige versies van Microsoft Windows hebben een icoon System dat een scherm weer zal geven waarmee Device Manager kan worden benaderd.
Als er geen ander besturingssysteem op de machine staat, moet de beheerder deze informatie handmatig vinden. Eén manier is om de gereedschappen dmesg(8) en man(1) te gebruiken. De meeste apparaatstuurprogramma's van FreeBSD hebben een handleiding, die de ondersteunde hardware noemen, en tijdens het opstarten wordt gevonden hardware getoond. De volgende regels geven bijvoorbeeld aan dat het stuurprogramma voor psm een muis heeft gevonden:
psm: <PS/2 Mouse> irq 12 on atkbdc0 psm0: [GIANT-LOCKED] psm0: [ITHREAD] psm0: model Generic PS/2 mouse, device ID 0
Dit stuurprogramma zal in het eigen kernelinstellingenbestand opgenomen moeten worden of worden geladen met loader.conf(5).
Soms geven de gegevens van dmesg alleen de systeemboodschappen weer in plaats van de uitvoer van de opstartonderzoeken. In deze gevallen kan de uitvoer worden verkregen door het bestand /var/run/dmesg.boot te bekijken.
Een andere methode om hardware te vinden is door pciconf(8) te gebruiken welke meer gedetailleerde uitvoer geeft. Bijvoorbeeld:
ath0@pci0:3:0:0: class=0x20000 card=0x058a1014 chip=0x1014168c rev=0x01 hdr=0x00
vendor = 'Atheros Communications Inc.'
device = 'AR5212 Atheros AR5212 802.11abg wireless'
class = network
subclass = ethernet
Dit beetje uitvoer, verkregen met pciconf -lv geeft aan dat het stuurprogramma ath een draadloos Ethernetapparaat heeft gevonden. Het gebruik
van man ath zal de
handleiding voor ath(4) teruggeven.
Wanneer de vlag -k aan man(1) wordt gegeven
kan deze nuttige informatie geven. Met het bovenstaande kan dit gedaan worden:
# man -k Atheros
om een lijst handleidingen te krijgen die dat ene woord bevatten:
ath(4) - Atheros IEEE 802.11 wireless network driver ath_hal(4) - Atheros Hardware Access Layer (HAL)
Gewapend met een inventarisatielijst van de hardware zou het proces van het bouwen van een eigen kernel minder angstaanjagend moeten lijken.
Bekijk, voordat er een eigen kernel gebouwd wordt, de redenen om dit te doen. Als er de noodzaak is voor specifieke hardwareondersteuning, kan dit reeds beschikbaar zijn als een module.
Kernelmodules staan in de map /boot/kernel en kunnen dynamisch in de draaiende kernel worden geladen met kldload(8). De meeste, als niet alle, kernelstuurprogramma's hebben een specifieke module en een handleiding. De laatste sectie merkte bijvoorbeeld het draadloze Ethernetstuurprogramma ath op. Van dit stuurprogramma staat de volgende informatie in de handleiding:
Plaats de volgende regel in loader.conf(5) om het stuurprogramma tijdens het opstarten als een module te laden: if_ath_load="YES"
Zoals aangegeven, zal het toevoegen van de regel if_ath_load="YES" aan /boot/loader.conf deze module dynamisch laden tijdens het opstarten.
In sommige gevallen is er geen geassocieerde module. Dit geldt het vaakst voor bepaalde subsystemen en zeer belangrijke stuurprogramma's, het fast file system (FFS) bijvoorbeeld is een verplichte optie in de kernel, net zoals netwerkondersteuning (INET). Helaas is de enige manier om te zien of een stuurprogramma nodig is naar de module zelf zoeken.
WaarschuwingHet is eenvoudig om ondersteuning voor een apparaat of optie te verwijderen en met een kapotte kernel opgezadeld te zitten. Als bijvoorbeeld het stuurprogramma ata(4) uit het kernelinstellingenbestand gehaald wordt, zal een systeem dat ATA schijfstuurprogramma's gebruikt niet opstarten zonder de module aan loader.conf toe te voegen. Kijk bij twijfel of de module aanwezig is en laat ondersteuning dan gewoon in de kernel.
Opmerking: Het is noodzakelijk om de volledige broncode van FreeBSD geïnstalleerd te hebben om de kernel te bouwen.
Eerst wordt er een overzicht gegeven van de mappen waarin de kernel gebouwd wordt. Alle genoemde mappen staan onder de map /usr/src/sys, die ook toegankelijk is via de padnaam /sys. Er zijn hier een aantal mappen aanwezig die de verschillende delen van de kernel representeren, maar de meest belangrijke hiervan zijn arch/conf, waarin de kernelinstellingen bewerkt worden en compile, waarin de aangepaste kernel gebouwd wordt. arch representeert hier één van i386, amd64, ia64, powerpc, sparc64 of pc98 (een alternatieve ontwikkelingstak van PC-hardware die populair is in Japan). Alles binnen de map van een bepaalde architectuur is er alleen voor die architectuur. De rest van de code is machine-onafhankelijk en hetzelfde op alle platformen waarnaar FreeBSD eventueel overgezet kan worden. De indeling van de mapstructuur is logisch: alle ondersteunde apparaten, bestandssystemen en opties staan in een eigen submap.
Dit voorbeelden in dit hoofdstuk veronderstellen dat de i386-architectuur gebruikt wordt. Als dit voor de lezer anders is, moeten de bijhorende aanpassingen aan de padnamen worden gemaakt.
Opmerking: Als de map /usr/src/ niet aanwezig is op een systeem (of als het leeg is), dan is de broncode niet geïnstalleerd. De eenvoudigste manier om de volledige broncode te installeren is om sysinstall te draaien als root en Configure, dan Distributions, dan src, en tenslotte All. Als het niet bestaat, dient u een symbolische link naar /usr/src/sys aan te maken:
# ln -s /usr/src/sys /sys
Daarna kan vanuit de map arch/conf het instellingenbestand GENERIC naar de naam voor de aangepaste kernel gekopieerd worden. Bijvoorbeeld:
# cd /usr/src/sys/i386/conf # cp GENERIC MIJNKERNEL
Traditioneel bestaat deze naam geheel uit hoofdletters en als er meerdere FreeBSD-machines worden beheerd met verschillende hardware is het een goed idee om het te vernoemen naar de hostnaam van de machine. Omwille van dit voorbeeld wordt het MIJNKERNEL genoemd.
Tip: Het kernelinstellingenbestand direct onder /usr/src opslaan kan een slecht idee zijn. In geval van problemen kan het verleidelijk zijn om /usr/src te verwijderen en opnieuw te beginnen. Nadat dit gedaan is kost het vaak maar enkele seconden om te realiseren dat het instellingenbestand voor de aangepaste kernel verwijderd is. Ook moet GENERIC niet gewijzigd worden, omdat het tijdens de volgende keer dat de broncodeboom bijgewerkt wordt, overschreven kan worden waarbij de wijzigingen in de kernelinstellingen verloren gaan.
Het kan gewenst zijn om het kernelinstellingenbestand ergens anders op te slaan en een symbolische link naar het bestand in de map i386 aan te maken:
# cd /usr/src/sys/i386/conf # mkdir /root/kernels # cp GENERIC /root/kernels/MIJNKERNEL # ln -s /root/kernels/MIJNKERNEL
Nu moet MIJNKERNEL met de favoriete tekstverwerker bewerkt worden. Voor beginners is waarschijnlijk alleen de tekstverwerker vi beschikbaar, die te ingewikkeld is om hier te beschrijven, maar goed is beschreven in vele boeken in de bibliografie. FreeBSD biedt ook de eenvoudigere tekstverwerker ee, die voor een beginner de keuze bij uitstek is. De commentaarregels in het begin kunnen gewijzigd worden om de persoonlijke instellingen of de veranderingen die gemaakt zijn ten opzichte van GENERIC weer te geven.
Voor degenen die een kernel op SunOS of een andere BSD hebben gebouwd zal veel van dit bestand bekend voorkomen. Echter, voor degenen die van een ander besturingssysteem zoals DOS komen, kan het instellingenbestand GENERIC overdonderend overkomen, dus moeten de beschrijvingen in de sectie Het Instellingenbestand zorgvuldig opgevolgd worden.
Opmerking: Als de broncodeboom gesynchroniseerd is met de nieuwste broncode van het FreeBSD-project, moet altijd /usr/src/UPDATING gelezen worden voordat enige bijwerkstappen worden genomen. Dit bestand beschrijft alle belangrijke zaken en gebieden binnen de broncodestructuur die speciale aandacht nodig hebben. /usr/src/UPDATING komt altijd overeen met de lokale versie van de FreeBSD-broncode en is daarom meer bijgewerkt met nieuwe informatie dan dit handboek.
Nu moet de broncode voor de kernel gecompileerd worden.
Een kernel bouwen
Opmerking: Het is noodzakelijk om de volledige broncode van FreeBSD geïnstalleerd te hebben om te kernel te bouwen.
Ga naar de map /usr/src:
# cd /usr/src
Compileer de kernel:
# make buildkernel KERNCONF=MIJNKERNEL
Installeer de nieuwe kernel:
% make installkernel KERNCONF=MIJNKERNEL
Tip: Bij het bouwen van een aangepaste kernel worden standaard alle kernelmodules ook herbouwd. Om de kernel sneller bij te werken en alleen de aangepaste modules te bouwen kan /etc/make.conf aangepast worden voordat de kernel wordt gebouwd:
MODULES_OVERRIDE = linux acpi sound/sound sound/driver/ds1 ntfsMet deze variabele wordt een lijst van te bouwen modules ingesteld die gebouwd moeten worden in plaats van allen.
WITHOUT_MODULES = linux acpi sound ntfsDeze variabele stelt een lijst in van modules op het topniveau die moeten worden uitgesloten van het bouwproces. Andere variabelen die mogelijk ook nuttig zijn in het proces van het bouwen van een kernel staan beschreven in de handleiding voor make.conf(5).
De nieuwe kernel wordt naar de map /boot/kernel gekopieerd als /boot/kernel/kernel en de oude kernel wordt verplaatst naar /boot/kernel.old/kernel. Nu moet het systeem afgesloten worden en opnieuw worden opgestart om gebruik te maken van de nieuwe kernel. Er zijn wat instructies voor problemen oplossen aan het einde van dit hoofdstuk, die erg nuttig kunnen zijn als er iets misgaat. Vergeet niet om het gedeelte te lezen waarin staat uitgelegd hoe te herstellen als de nieuwe kernel niet opstart.
Opmerking: Andere bestanden die te maken hebben met het opstartproces, zoals de boot loader(8) en instellingen worden opgeslagen in /boot. Modules van derde partijen of eigen modules kunnen in /boot/kernel opgeslagen worden, alhoewel gebruikers erop bedacht moeten zijn dat het erg belangrijk is dat de modules synchroon worden gehouden met de gecompileerde kernel. Modules die niet bedoeld zijn om met de gecompileerde kernel te draaien kunnen voor instabiliteit of onjuistheden zorgen.
Het algemene formaat van een instellingenbestand is vrij eenvoudig. Elke regel bevat een sleutelwoord en één of meer argumenten. Omwille van de eenvoud bevatten de meeste regels maar één argument. Alles wat na een # komt, wordt als commentaar beschouwd en genegeerd. De volgende gedeelten beschrijven elk sleutelwoord, in het algemeen in dezelfde volgorde als GENERIC, alhoewel sommige samenhangende sleutelwoorden gegroepeerd zijn in een enkel gedeelte (zoals Netwerken) zelfs al staan ze verspreid in het bestand GENERIC. Een uitputtende lijst van architectuurafhankelijke opties en apparaten staat in het bestand NOTES, dat in dezelfde map staat als het bestand GENERIC. Architectuuronafhankelijke opties staan in /usr/src/sys/conf/NOTES.
Een nieuwe directief include is beschikbaar om te gebruiken in instellingenbestanden. Hiermee kan een ander instellingenbestand logisch in het huidige worden opgenomen, waardoor het eenvoudig wordt om kleine veranderingen relatief aan een bestaand bestand te onderhouden. Als u bijvoorbeeld een GENERIC kernel nodig heeft met slechts een klein aantal aanvullende opties of stuurprogramma's, hoeft u hiermee slechts een delta ten opzichte van GENERIC te onderhouden:
include GENERIC ident MIJNKERNEL options IPFIREWALL options DUMMYNET options IPFIREWALL_DEFAULT_TO_ACCEPT options IPDIVERT
Veel beheerders zullen aanzienlijke voordelen in dit model zien vergeleken met de vroegere gewoonte om instellingenbestanden vanuit het niets te schrijven: het lokale instellingenbestand zal alleen lokale verschillen uitdrukken ten opzichte van een GENERIC kernel en wanneer upgrades worden uitgevoerd zullen nieuwe mogelijkheden die aan GENERIC zijn toegevoegd ook aan de lokale kernel worden toegevoegd tenzij dit expliciet verhinderd wordt met nooptions of nodevice. De rest van dit hoofdstuk behandelt de inhoud van een typisch instellingenbestand en de verschillende rollen die opties en apparaten spelen.
Opmerking: Draai het volgende commando als root om een bestand te bouwen dat alle beschikbare opties bevat, wat normaliter voor testdoeleinden gedaan wordt:
# cd /usr/src/sys/i386/conf && make LINT
Het volgende is een voorbeeld van het kernelinstellingenbestand GENERIC met aanvullend commentaar omwille van de helderheid. Dit voorbeeld is redelijk gelijk aan de versie in /usr/src/sys/i386/conf/GENERIC.
machine i386
Dit is de architectuur van de machine. Het moet één van amd64, i386, ia64, pc98, powerpc of sparc64 zijn.
cpu I486_CPU cpu I586_CPU cpu I686_CPU
Bovenstaande optie geeft het type CPU aan dat in een systeem zit. De CPU-regel kan meerdere keren voorkomen (als bijvoorbeeld onbekend is of I586_CPU of I686_CPU gebruikt moet worden), maar voor een aangepaste kernel is het beter om alleen de aanwezige CPU aan te geven. Als er twijfel bestaat over het type CPU, kan het bestand /var/run/dmesg.boot worden bekeken voor de opstartberichten.
ident GENERIC
Dit is de identificatie van de kernel. Dit moet veranderd worden in de naam van de kernel, dus MIJNKERNEL als de instructies van de voorgaande voorbeelden gevolgd zijn. De waarde in de string ident wordt afgebeeld wanneer de kernel opstart, dus is het handig om de nieuwe kernel een andere naam te geven als deze apart moet worden gehouden van de gebruikelijke kernel (als er bijvoorbeeld een experimentele kernel gebouwd wordt).
#Om apparaatbindingen statisch in te compileren in plaats van via /boot/device.hints. #hints "GENERIC.hints" # Standaardlocatie voor devices.
device.hints(5) wordt gebruikt om opties van de programma's die de apparaten aansturen in te stellen. De standaardplaats die loader(8) controleert tijdens het opstarten is /boot/device.hints. Met de optie hints is het mogelijk om deze aanwijzingen statisch in de kernel te compileren, waardoor er geen noodzaak is om een bestand device.hints in /boot aan te maken.
makeoptions DEBUG=-g # Bouw kernel met gdb(1) debugsymbolen.
Het normale bouwproces van FreeBSD voegt debuginformatie toe wanneer de kernel met de
optie -g gebouwd wordt, wat debuginformatie doorgeeft aan gcc(1).
options SCHED_ULE # ULE taakplanner
De standaard taakplanner voor FreeBSD. Laat dit staan.
options PREEMPTION # Zet kernelthreadpreëmptie aan
Sta toe dat threads in de kernel worden gepreëmpt door threads met een hogere prioriteit. Het help bij interactiviteit en staat toe dat interruptthreads eerder draaien in plaats van te moeten wachten.
options INET # internetwerken
Netwerkondersteuning. Laat dit aanstaan, zelfs als een verbinding met een netwerk niet gepland is. De meeste programma's hebben tenminste een teruglusnetwerk nodig (dat wil zeggen het maken van netwerkverbindingen binnen de PC), dus dit is eigenlijk verplicht.
options INET6 # IPv6 communicatieprotocollen
Dit zet de IPv6-communicatieprotocollen aan.
options FFS # Berkeley Fast Bestandssysteem
Dit is het basisbestandssysteem voor de harde schijf. Laat dit erin staan als er vanaf de harde schijf wordt opgestart.
options SOFTUPDATES # Schakel FFS Softupdates ondersteuning in
Deze optie zet softupdates in de kernel aan en helpt om de schijftoegang voor schrijven te verhogen. Zelfs als deze functionaliteit door de kernel geleverd wordt, moet die voor specifieke schijven worden aangezet. Bekijk de uitvoer van mount(8) om te zien of softupdates aanstaat voor de systeemschijven. Als de optie soft-updates niet zichtbaar is, dient deze geactiveerd te worden met behulp van tunefs(8) voor bestaande bestandssystemen of newfs(8) voor nieuwe bestandssystemen.
options UFS_ACL # Ondersteuning voor toegangscontrolelijsten
Met deze optie wordt de ondersteuning voor toegangscontrolelijsten aangezet. Hiervoor zijn uitgebreide attributen en UFS2 nodig. Een en ander wordt in detail beschreven in Paragraaf 15.11. ACL's staan standaard aan en moeten niet uitgezet worden in de kernel als ze al eerder op een bestandssysteem zijn gebruikt, omdat dit de toegangscontrolelijsten verwijdert en hierdoor de manier waarop bestanden beschermd worden op onvoorspelbare wijze verandert.
options UFS_DIRHASH # Verbeter prestaties in grote mappen
Deze optie bevat functionaliteit om schijfoperaties op grote mappen te versnellen, ten koste van extra geheugen. Deze staat normaalgesproken, zoals voor een grote server of interactief werkstation, aan en wordt uitgezet als FreeBSD op een kleiner systeem wordt gebruikt waar geheugen het belangrijkste en schijfsnelheid minder belangrijk is, zoals voor een firewall.
options MD_ROOT # MD is een potentieel rootapparaat
Deze optie zet ondersteuning aan voor een virtuële schijf die in het geheugen wordt geïmplementeerd en als rootapparaat wordt gebruikt.
options NFSCLIENT # Netwerk Bestandssysteem Client options NFSSERVER # Netwerk Bestandssysteem Server options NFS_ROOT # NFS bruikbaar als /, NFSCLIENT nodig
Het netwerkbestandssysteem. Dit kan weggelaten worden tenzij er gepland is om partities te aan te koppelen van een UNIX bestandsserver over TCP/IP.
options MSDOSFS # MSDOS Bestandssysteem
Het MS-DOS bestandssysteem. Dit kan veilig weggelaten worden, tenzij er gepland is om een DOS-geformatteerde partitie van de harde schijf tijdens het opstarten aan te koppelen. Het wordt automatisch geladen als er voor de eerste keer een DOS-partitie wordt aangekoppeld, zoals boven beschreven. Bovendien geeft de uitstekende software emulators/mtools toegang tot DOS-floppies zonder dat ze aangekoppeld en afgekoppeld moeten worden en heeft het MSDOSFS helemaal niet nodig.
options CD9660 # ISO 9660 Bestandssysteem
Het ISO 9960-bestandssysteem voor CD-ROMs. Commentarieer dit uit als er geen CD-ROM drive aanwezig is of als er slechts af en toe gegevens-CD-ROMs aangekoppeld worden (aangezien het dynamisch geladen wordt als er voor de eerste keer een gegevens-CD-ROM aangekoppeld wordt). Audio-CD's hebben dit bestandssysteem niet nodig.
options PROCFS # Procesbestandssysteem (vereist PSEUDOFS)
Het procesbestandssysteem. Dit is een “als-of” bestandssysteem, aangekoppeld op /proc, dat programma's als ps(1) in staat stelt om meer informatie over de draaiende processen te geven. Het is in de meeste omstandigheden niet nodig om PROCFS te gebruiken, omdat de meeste debug- en monitorgereedschappen zijn aangepast om zonder PROCFS te draaien: installaties koppelen dit bestandssysteem standaard niet aan.
options PSEUDOFS # Pseudo-bestandssysteem raamwerk
Kernels die PROCFS gebruiken moeten ook ondersteuning voor PSEUDOFS opnemen.
options GEOM_PART_GPT # GUID Partitietabellen.
Met deze optie kan een groot aantal partities op een enkele schijf aanwezig zijn.
options COMPAT_43 # Compatibel met BSD 4.3 [ERIN HOUDEN!]
Compatibiliteit met 4.3BSD. Laat dit aanstaan. Sommige programma's gedragen zich vreemd als dit uitgecommentarieerd wordt.
options COMPAT_FREEBSD4 # Compatibel met FreeBSD 4
Deze optie is nodig om ondersteuning te bieden aan applicaties die gecompileerd zijn op oudere versies van FreeBSD en gebruik maken van oudere systeemaanroep-interfaces. Het is aanbevolen dat deze optie gebruikt wordt op alle i386 systemen die mogelijk oudere applicaties draaien. Voor platformen die pas in 5.X ondersteuning verwierven, zoals ia64 en SPARC64, is deze optie niet nodig.
options COMPAT_FREEBSD5 # Compatibel met FreeBSD5
Deze optie is vereist om ondersteuning te geven aan applicaties die gecompileerd zijn op FreeBSD 5.X die gebruik maken van de systeemaanroepinterfaces van FreeBSD 5.X.
options COMPAT_FREEBSD6 # Compatibel met FreeBSD5
Deze optie is vereist om ondersteuning te geven aan applicaties die gecompileerd zijn op FreeBSD 6.X die gebruik maken van de systeemaanroepinterfaces van FreeBSD 6.X.
options COMPAT_FREEBSD7 # Compatibel met FreeBSD5
Deze optie is vereist om ondersteuning te geven aan applicaties die gecompileerd zijn op FreeBSD 7.X die gebruik maken van de systeemaanroepinterfaces van FreeBSD 7.X.
options SCSI_DELAY=5000 # Vertraging (in ms) voordat SCSI wordt ondergezocht.
Dit zorgt ervoor dat de kernel vijf seconden wacht voordat die elk SCSI-apparaat in het systeem onderzoekt. Als er alleen IDE-harde schijven zijn, kan deze optie genegeerd worden, anders kan geprobeerd worden dit getal te verlagen, om het opstarten te versnellen. Uiteraard moet deze waarde weer verhoogd worden als FreeBSD problemen heeft om de SCSI-apparaten te herkennen.
options KTRACE # ktrace(1) ondersteuning
Dit schakelt kernelondersteuning voor het volgen processen in, wat handig is tijdens debuggen.
options SYSVSHM # SYSV-stijl gedeeld geheugen
Deze optie biedt System V gedeeld geheugen. Meestal wordt dit wegens de XSHM-uitbreiding in X gebruikt, waar door vele grafische programma's automatisch gebruik van wordt gemaakt voor extra snelheid. Als X gebruik wordt, is het raadzaam om dit op te nemen.
options SYSVMSG # SYSV-stijl berichtwachtrijen
Dit biedt ondersteuning voor System V berichten. Ook deze optie voegt slechts een paar honderd bytes aan de kernel toe.
options SYSVSEM # SYSV-stijl semaforen
Dit biedt ondersteuning voor System V semaforen. Het wordt minder vaak gebruikt, maar voegt slechts een paar honderd bytes aan de kernel toe.
Opmerking: De optie
-pvan het commando ipcs(1) geeft een lijst van alle processen die een van deze System V faciliteiten gebruikt.
options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensies
Dit biedt real-time-uitbreidingen die in de 1993 POSIX® zijn toegevoegd. Bepaalde applicaties in de Portscollectie gebruiken deze (zoals StarOffice).
options KBD_INSTALL_CDEV # installeer een CDEV-ingang in /dev
Deze optie is nodig om apparaatknooppunten voor het toetsenbord aan te maken in /dev.
options ADAPTIVE_GIANT # Giant mutex is adaptief.
Giant is de naam van een wederzijds uitsluitingsmechanisme (een sleep mutex) dat een grote verzameling kernelbronnen beschermt. Vandaag de dag is dit een onacceptabele prestatie-bottleneck die actief door sloten wordt vervangen die individuele bronnen beschermen. De optie ADAPTIVE_GIANT zorgt ervoor dat Giant in de verzamelingen van mutexen wordt opgenomen waar actief wordt opgespind. Dit betekent dat wanneer een thread de Giant-mutex wil nemen, maar die reeds door een thread op een andere CPU genomen is, de eerste thread blijft draaien en wacht tot er een slot vrijkomt. Normaalgesproken zou de thread weer gaan slapen en wachten op de volgende kans om te draaien. Laat dit er in geval van twijfel instaan.
Opmerking: Merk op dat in FreeBSD 8.0-RELEASE en later alle mutexen standaard adaptief zijn, tenzij ze expliciet op niet-adaptief zijn gezet door met de optie NO_ADAPTIVE_MUTEXES te compileren. Een gevolg is dat Giant nu standaard adaptief is, en dat de optie ADAPTIVE_GIANT uit de kernelinstellingen is verwijderd.
device apic # I/O APIC
Het apic-apparaat zet de ondersteuning voor I/O-APIC voor het afleveren van interrupts aan. Het apic-apparaat kan zowel in UP- als in SMP-kernels gebruikt worden, maar is noodzakelijk voor SMP-kernels. Voeg options SMP toe om ondersteuning voor meerdere processoren op te nemen.
Opmerking: Het apic-apparaat bestaat alleen in de i386-architectuur, deze instelregel dient niet op andere architecturen gebruikt te worden.
device eisa
Neem dit op voor een EISA-moederbord. Dit zet ondersteuning voor zelfdetectie en -instelling aan voor alle apparaten op de EISA-bus.
device pci
Neem dit op voor een PCI-moederbord. Dit zet ondersteuning voor zelfdetectie van PCI-kaarten en gatewaying van PCI-naar-ISA-bus aan.
# Floppy drives device fdc
Dit is de controller voor de floppydrive.
# ATA- en ATAPI-apparaten device ata
Dit stuurprogramma biedt ondersteuning aan alle ATA- en ATAPI-apparaten. Er is slechts één device ata-regel nodig om de kernel alle PCI ATA/ATAPI-apparaten te laten ontdekken op moderne machines.
device atadisk # ATA schijven
Dit is samen met device ata nodig voor ATA schijven.
device ataraid # ATA RAID schijven
Dit is samen met device ata nodig voor ATA RAID-schijven.
device atapicd # ATAPI CD-ROM drives
Dit is samen met device ata nodig voor ATAPI CD-ROM drives.
device atapifd # ATAPI floppy drives
Dit is samen met device ata nodig voor ATAPI floppydrives.
device atapist # ATAPI tape drives
Dit is samen met device ata nodig voor ATAPI tapedrives.
options ATA_STATIC_ID # Statische apparaatnummering
Dit zorgt ervoor dat de controller statisch nummert. Zonder deze optie worden nummers dynamisch toegewezen.
# SCSI Controllers
device ahb # EISA AHA1742 familie
device ahc # AHA2940 en onboard AIC7xxx apparaten
options AHC_REG_PRETTY_PRINT # Print registerbitvelden in
# debuguitvoer. Voegt ~128k
# aan stuurprogramma toe.
device ahd # AHA39320/29320 en onboard AIC79xx apparaten
options AHD_REG_PRETTY_PRINT # Print registerbitvelden in
# debuguitvoer. Voegt ~215k
# aan stuurprogramma toe.
device amd # AMD 53C974 (Teckram DC-390(T))
device isp # Qlogic familie
#device ispfw # Firmware voor QLogic HBAs- normaliter een module
device mpt # LSI-Logic MPT-Fusion
#device ncr # NCR/Symbios Logic
device sym # NCR/Symbios Logic (nieuwere chipsets + die van `ncr')
device trm # Tekram DC395U/UW/F DC315U adapters
device adv # Advansys SCSI adapters
device adw # Advansys wide SCSI adapters
device aha # Adaptec 154x SCSI adapters
device aic # Adaptec 15[012]x SCSI adapters, AIC-6[23]60.
device bt # Buslogic/Mylex MultiMaster SCSI adapters
device ncv # NCR 53C500
device nsp # Workbit Ninja SCSI-3
device stg # TMC 18C30/18C50
SCSI controllers. Commentarieer de regels uit voor apparaten die niet in het systeem aanwezig zijn. Als het een systeem met alleen IDE apparaten betreft, kunnen ze allemaal weggelaten worden. De regels met *_REG_PRETTY_PRINT zijn debugopties voor hun respectievelijke stuurprogramma's.
# SCSI randapparaten device scbus # SCSI bus (nodig voor SCSI) device ch # SCSI media changers device da # Direct Access (schijven) device sa # Sequential Access (tape, enzovoort) device cd # CD device pass # Passthrough apparaat (directe SCSI-toegang) device ses # SCSI Omgevingsdiensten (en SAF-TE)
SCSI-aanhangsels. Ook hier geldt dat apparaten die niet aanwezig zijn uitgecommentarieerd kunnen worden, of als alleen IDE-hardware aanwezig is, ze allemaal weggelaten kunnen worden.
Opmerking: Het USB-stuurprogramma umass(4) en enkele andere stuurprogramma's gebruiken het SCSI-subsysteem, alhoewel ze geen echte SCSI-apparaten zijn. Daarom mag SCSI-ondersteuning niet verwijderd worden als dit soort stuurprogramma's in de kernelinstellingen worden opgenomen.
# RAID controllers met interfaces naar het SCSI subsysteem device amr # AMI MegaRAID device arcmsr # Areca SATA II RAID device asr # DPT SmartRAID V, VI en Adaptec SCSI RAID device ciss # Compaq Smart RAID 5* device dpt # DPT Smartcache III, IV - Zie NOTES voor opties device hptmv # Highpoint RocketRAID 182x device hptrr # Highpoint RocketRAID 17xx, 22xx, 23xx, 25xx device iir # Intel Integrated RAID device ips # IBM (Adaptec) ServeRAID device mly # Mylex AcceleRAID/eXtremeRAID device twa # 3ware 9000 series PATA/SATA RAID # RAID controllers device aac # Adaptec FSA RAID device aacp # SCSI passthrough voor aac (heeft CAM nodig) device ida # Compaq Smart RAID device mfi # LSI MegaRAID SAS device mlx # Mylex DAC960 famile device pst # Promise Supertrak SX6000 device twe # 3ware ATA RAID
Ondersteunde RAID-controllers. Als een van deze niet aanwezig is, kan deze uitgecommentarieerd of verwijderd worden.
# atkbdc0 bestuurt het toetsenbord en de PS/2 muis device atkbdc # AT toetsenbordcontroller
De toetsenbordcontroller (atkbdc) biedt I/O-diensten aan voor het AT-toetsenbord en het PS/2-type van aanwijsapparaten. Deze controller is noodzakelijk voor het toetsenbordstuurprogramma (atkbd) en het PS/2-aanwijsapparaatstuurprogramma (psm).
device atkbd # AT toetsenbord
Het stuurprogramma atkbd biedt samen met de controller atkbdc toegang tot het AT84-toetsenbord of het uitgebreide AT-toetsenbord dat verbonden is met de controller voor het AT-toetsenbord.
device psm # PS/2 muis
Dit apparaat kan gebruikt worden als de muis in de PS/2-muispoort wordt geplugd.
device kbdmux # toetsenbordmultiplexer
Basisondersteuning voor multiplexing van toetsenborden. Als u niet van plan bent om meerdere toetsenborden op het systeem te gebruiken, kunt u deze regel veilig verwijderen.
device vga # VGA videokaart stuurprogramma
Het stuurprogramma voor de videokaart.
device splash # Splash screen en screensaver ondersteuning
Een splash-scherm tijdens het opstarten! Screensavers hebben deze optie ook nodig.
# syscons is het standaard consolestuurprogramma, lijkt op een SCO console device sc
sc is het standaard consolestuurprogramma en lijkt op een SCO-console. Aangezien de meeste programma's die met een volledig scherm werken de console via een terminaldatabase zoals termcap benaderen, moet het niet uitmaken of dit of vt, het VT220-compatibele consolestuurprogramma, gebruikt wordt. Wanneer er aangemeld wordt, dient de variabele TERM op scoansi gezet worden indien programma's die met een volledig scherm werken problemen hebben om met dit console te draaien.
# Schakel dit in voor het pcvt (VT220 compatibele) consolestuurprogramma #device vt #options XSERVER # ondersteuning voor X server op een vt console #options FAT_CURSOR # begin met een blokcursor
Dit is een VT220-compatibel consolestuurprogramma, achterwaarts compatibel met de VT100/102. Het werkt goed op enkele laptops die hardware-incompatibiliteiten hebben met sc. Ook dient de variabele TERM op vt100 of vt220 gezet te worden bij het aanmelden. Dit stuurprogramma kan ook nuttig zijn wanneer er verbinding wordt gemaakt met een groot aantal verschillende machines in een netwerk, waarbij de ingangen termcap of terminfo voor het apparaat sc vaak niet beschikbaar zijn. vt100 is op bijna elk platform beschikbaar.
device agp
Neem dit op als er een AGP-kaart in het systeem aanwezig is. Dit zet ondersteuning voor AGP aan, en ondersteuning voor AGP GART voor borden die deze mogelijkheden hebben.
# Ondersteuning voor energiebeheer (zie NOTES voor meer opties) #device apm
Ondersteuning voor geavanceerd energiebeheer (Advanced Power Management). Dit is nuttig voor laptops, alhoewel dit standaard uitgeschakeld is in GENERIC.
# Schakel suspend/resume ondersteuning voor de i8254 in. device pmtimer
Het stuurprogramma voor het timerapparaat voor energiebeheergebeurtenissen, zoals APM en ACPI.
# PCCARD (PCMCIA) ondersteuning. # PCMCIA en cardbus bridge ondersteuning. device cbb # cardbus (yenta) bridge device pccard # PC Card (16-bit) bus device cardbus # CardBus (32-bit) bus
Ondersteuning voor PCMCIA. Dit is wenselijk voor laptopgebruikers.
# Serial (COM) poorten device sio # 8250, 16[45]50-gebaseerde seriële poorten
Dit zijn de seriële poorten waarnaar in de wereld van MS-DOS/Windows verwezen wordt als COM-poorten.
Opmerking: Als er een intern modem op COM4 en een seriële poort op COM2 aanwezig is, moet het IRQ van het modem in 2 worden veranderd (om duistere technische redenen geldt dat IRQ2 = IRQ9) om er vanuit FreeBSD toegang toe te krijgen. Als er een multipoort seriële kaart aanwezig is, staat in sio(4) meer informatie over de juiste waarden die aan /boot/device.hints toegevoegd moeten worden. Sommige videokaarten (vaak gebaseerd op S3 chips) gebruiken IO-adressen van de vorm 0x*2e8, en omdat vele goedkope serieële kaarten de 16-bits IO-adresruimte niet volledig decoderen, botsen ze met deze kaarten waardoor de COM4-poort praktisch onbruikbaar is.
Elke serieële poort moet een uniek IRQ hebben (tenzij er gebruik wordt gemaakt van een van de multipoortkaarten waarbij gedeelde interrupts ondersteund worden), dus kunnen de standaard IRQ's voor COM3 en COM4 niet gebruikt worden.
# Parallelle poort device ppc
Dit is de interface voor de parallelle poort op de ISA-bus.
device ppbus # Parallelle poortbus (verplicht)
Biedt ondersteuning voor de parallelle poortbus.
device lpt # Printer
Ondersteuning voor parallelle poort-printers.
Opmerking: Alle van de bovenstaande drie zijn noodzakelijk om ondersteuning voor parallelle printers aan te zetten.
device plip # TCP/IP over parallel
Dit is het stuurprogramma voor de parallelle netwerkinterface.
device ppi # Parallelle poort interface apparaat
De algemene I/O (“geek-poort”) + IEEE1284 I/O.
#device vpo # scbus en da verplicht
Dit is voor een Iomega Zipdrive. Hiervoor is ondersteuning voor scbus en da nodig. De beste prestaties worden gehaald met poorten in EPP 1.9-modus.
#device puc
Dit dient uitgecommentarieerd te worden indien er een “domme” seriële of parallelle PCI-kaart aanwezig is die ondersteund wordt door het puc(4) verbindingsstuurprogramma.
# PCI Ethernet NIC's. device de # DEC/Intel DC21x4x (“Tulip”) device em # Intel PRO/1000 adapter Gigabit Ethernet Card device ixgb # Intel PRO/10GbE Ethernet Card device txp # 3Com 3cR990 (“Typhoon”) device vx # 3Com 3c590, 3c595 (“Vortex”)
Verscheidene PCI-netwerkkaartstuurprogramma's. Degenen die niet in het systeem aanwezig zijn kunnen uitgecommentarieerd of verwijderd worden.
# PCI Ethernet NIC's die de MII bus controller code gebruiken. # NB: 'device miibus' moet behouden blijven om deze NIC's te kunnen gebruiken! device miibus # MII bus ondersteuning
Ondersteuning voor MII-bus is noodzakelijk voor sommige PCI 10/100 Ethernet-NICs, namelijk voor diegenen die MII-geldige transceivers gebruiken of interfaces voor transceiverbesturing implementeren die als een MII werken. Door device miibus aan de kernelinstellingen toe te voegen wordt de ondersteuning voor de generieke miibus-API en voor alle PHY-stuurprogramma's opgenomen, waaronder een generieke voor PHYs die niet specifiek door een individueel stuurprogramma worden behandeld.
device bce # Broadcom BCM5706/BCM5708 Gigabit Ethernet device bfe # Broadcom BCM440x 10/100 Ethernet device bge # Broadcom BCM570xx Gigabit Ethernet device dc # DEC/Intel 21143 en verschillende gelijkwerkenden device fxp # Intel EtherExpress PRO/100B (82557, 82558) device lge # Level 1 LXT1001 gigabit Ethernet device msk # Marvell/SysKonnect Yukon II Gigabit Ethernet device nge # NatSemi DP83820 gigabit Ethernet device nve # nVidia MCP on-board Ethernet Networking device pcn # AMD Am79C97x PCI 10/100 (voorrang op 'lnc') device re # RealTek 8139C+/8169/8169S/8110S device rl # RealTek 8129/8139 device sf # Adaptec AIC-6915 (“Starfire”) device sis # Silicon Integrated Systems SiS 900/SiS 7016 device sk # SysKonnect SK-984x & SK-982x gigabit Ethernet device ste # Sundance ST201 (D-Link DFE-550TX) device stge # Sundance/Tamarack TC9021 gigabit Ethernet device ti # Alteon Networks Tigon I/II gigabit Ethernet device tl # Texas Instruments ThunderLAN device tx # SMC EtherPower II (83c170 “EPIC”) device ge # VIA VT612x gigabit Ethernet device vr # VIA Rhine, Rhine II device wb # Winbond W89C840F device xl # 3Com 3c90x (“Boomerang”, “Cyclone”)
Stuurprogramma's die gebruik maken van de MII bus-controllercode.
# ISA Ethernet NIC's. Inclusief pccard NIC's. device cs # Crystal Semiconductor CS89x0 NIC # 'device ed' heeft 'device miibus' nodig device ed # NE[12]000, SMC Ultra, 3c503, DS8390 kaarten device ex # Intel EtherExpress Pro/10 en Pro/10+ device ep # Etherlink III-gebaseerde kaarten device fe # Fujitsu MB8696x-gebaseerde kaarten device ie # EtherExpress 8/16, 3C507, StarLAN 10, etc. device lnc # NE2100, NE32-VL Lance Ethernet kaarten device sn # SMC's 9000 serie Ethernet chips device xe # Xircom pccard Ethernet # ISA apparaten die de oude ISA shims gebruiken #device le
ISA Ethernetstuurprogramma's. In /usr/src/sys/i386/conf/NOTES staan details over welke kaarten door welk stuurprogramma ondersteund worden.
# Draadloze NIC kaarten device wlan # 802.11 ondersteuning
Generieke 802.11 ondersteuning. Deze regel is vereist voor draadloos netwerken.
device wlan_wep # 802.11 WEP-ondersteuning device wlan_ccmp # 802.11 CCMP-ondersteuning device wlan_tkip # 802.11 TKIP-ondersteuning
Crypto-ondersteuning voor 802.11-apparaten. Deze regels zijn nodig als u van plan bent om versleuteling en 802.11i-beveiligingsprotocollen te gebruiken.
device an # Aironet 4500/4800 802.11 draadloze NIC's. device ath # Atheros PCI/CardBus NICs device ath_hal # Atheros HAL (Hardware Access Layer) device ath_rate_sample # SampleRate verzendsnelheidbeheer voor ath device awi # BayStack 660 en anderen device ral # Ralink Technologies RT2500 draadloze NICs. device wi # WaveLAN/Intersil/Symbol 802.11 draadloze NIC's. #device wl # Oudere niet-802.11 Wavelan draadloze NIC.
Ondersteuning voor verscheidene draadloze kaarten.
# Pseudo-apparaten device loop # Netwerk teruglussen
Dit is het generieke teruglusapparaat voor TCP/IP. Als telnet of FTP op localhost (ook bekend als 127.0.0.1) gebruikt wordt, loopt dat via dit apparaat. Dit is verplicht.
device random # Entropy apparaat
Cryptografisch veilige willekeurige getallengenerator.
device ether # Ethernet ondersteuning
ether is allen noodzakelijk als er een Ethernetkaart aanwezig is. Het bevat code voor het generieke Ethernetprotocol.
device sl # Kernel SLIP
sl dient voor SLIP-ondersteuning. Dit is bijna geheel overgenomen door PPP, wat eenvoudiger is op te zetten, beter geschikt is voor modem-naar-modem-verbindingen en krachtiger is.
device ppp # Kernel PPP
Dit dient voor PPP-ondersteuning van inbelverbindingen door de kernel. Er is ook een versie van PPP als gebruikersapplicatie geïmplementeerd die tun gebruikt en meer flexibiliteit en mogelijkheden biedt zoals demand-bellen.
device tun # Packet tunnel.
Dit wordt gebruikt door de gebruikers-PPP-software. In PPP staat meer informatie.
device pty # Pseudo-ttys (telnet, etc.)
Dit is een “pseudo-terminal” of gesimuleerde aanmeldpoort. Die wordt gebruikt door binnenkomende sessies van telnet en rlogin, door xterm en voor sommige andere applicaties zoals Emacs.
device md # “Geheugenschijven”
Pseudo-apparaten die een schijf in het geheugen implementeren.
device gif # IPv6 en IPv4 tunnelen
Dit implementeert IPv6-over-IPv4-tunneling, IPv4-over-IPv6-tunneling, IPv4-over-IPv4-tunneling en IPv6-over-IPv6-tunneling. Het apparaat gif is “zelfklonend” en zal naar behoefte apparaatknooppunten aanmaken.
device faith # IPv6-naar-IPv4-relay (vertaling)
Dit pseudo-apparaat onderschept pakketten die ernaar verzonden worden en leidt ze om naar het IPv4/IPv6-vertaaldaemon.
# Het `bpf' apparaat schakelt de Berkeley Pakketfilter in. # Wees bewust van de administratieve consequenties die dit heeft! # 'bpf' is nodig bij gebruik van DHCP. device bpf # Berkeley pakketfilter
Dit is het Berkeley Pakketfilter. Dit pseudo-apparaat staat netwerkinterfaces toe om in luistermodus gezet te worden, zodat elk pakket op een uitzendnetwerk (bijvoorbeeld een Ethernet) onderschept wordt. Deze pakketten kunnen naar schijf onderschept en/of onderzocht worden met het programma tcpdump(1).
Opmerking: Het apparaat bpf(4) wordt ook gebruikt door dhclient(8) om het IP-adres van de standaardrouter (gateway) te verkrijgen, enzovoorts. Als DHCP gebruikt wordt, dient dit ingeschakeld te blijven.
# USB-ondersteuning device uhci # UHCI PCI->USB interface device ohci # OHCI PCI->USB interface device ehci # EHCI PCI->USB interface (USB 2.0) device usb # USB Bus (verplicht) #device udbp # USB Double Bulk Pipe apparaten device ugen # Generic device uhid # “Human Interface Devices” device ukbd # Toetsenbord device ulpt # Printer device umass # Schijven/Massaopslag - heeft scbus en da nodig device ums # Muis device ural # Ralink Technology RT2500USB draadloze NICs device urio # Diamond Rio 500 MP3 speler device uscanner # Scanners # USB Ethernet, heeft mii nodig device aue # ADMtek USB Ethernet device axe # ASIX Electronics USB Ethernet device cdce # Generic USB over Ethernet device cue # CATC USB Ethernet device kue # Kawasaki LSI USB Ethernet device rue # RealTek RTL8150 USB Ethernet
Ondersteuning voor verscheidene USB-apparaten.
# FireWire ondersteuning device firewire # FireWire bus code device sbp # SCSI over FireWire (scbus en da nodig) device fwe # Ethernet over FireWire (niet-standaard!)
Ondersteuning voor verscheidene Firewire-apparaten.
Meer informatie en aanvullende apparaten die door FreeBSD ondersteund worden staan in /usr/src/sys/i386/conf/NOTES.
Sommige machines (PAE) hebben meer geheugen nodig dan limiet van 4 gigabyte op User+Kernel Virtual Adress (KVA) ruimte. Vanwege deze limiet voegde Intel ondersteuning toe voor toegang tot 36-bits fysieke adresruimte in de Pentium® Pro en nieuwere lijn van CPU's.
De Physical Address Extension (PAE)
mogelijkheden van de Intel Pentium Pro en nieuwere CPU's staan geheugenhoeveelheden
toe tot 64 gigabyte. FreeBSD biedt ondersteuning voor deze mogelijkheid via de
kernelinsteloptie PAE, die beschikbaar is in alle recent
uitgegeven versies van FreeBSD. Vanwege de beperkingen van de
geheugenarchitectuur van Intel wordt er geen onderscheid gemaakt tussen
geheugen boven of beneden 4 gigabytes. Geheugen dat boven de 4 gigabytes is
toegewezen wordt gewoon bij het beschikbare gevoegd.
Om ondersteuning voor PAE in de kernel aan te zetten, dient de volgende regel aan het kernelinstellingenbestand te worden toegevoegd:
options PAE
Opmerking: De ondersteuning voor PAE in FreeBSD is alleen beschikbaar voor Intel IA-32-processoren. Ook dient opgemerkt te worden dat ondersteuning voor PAE nog niet wijdverbreid getest is en als betakwaliteit beschouwd dient te worden vergeleken met andere stabiele kenmerken van FreeBSD.
Ondersteuning voor PAE in FreeBSD heeft enige beperkingen:
Een proces kan niet meer dan 4 gigabyte VM-ruimte krijgen;
Apparaatstuurprogramma's die geen gebruik maken van de bus_dma(9)-interface zullen gegevenscorruptie veroorzaken in een kernel die PAE aan heeft staan en hun gebruik wordt afgeraden. Om deze reden wordt er de kernelinstellingenbestand voor de PAE-kernel geleverd met FreeBSD, dat alle stuurprogramma's uitsluit waarvan niet bekend is dat ze werken in een kernel die PAE aan heeft staan;
Sommige systeeminstellingen bepalen het geheugenbronverbruik aan de hand van de
hoeveelheid beschikbaar fysiek geheugen. Zulke instellingen kunnen onnodig
veel toewijzen vanwege de grote hoeveelheid geheugen in een PAE systeem. Een voorbeeld hiervan is de sysctl
kern.maxvnodes, die het maximum aantal vnodes dat
in de kernel aanwezig mag zijn beheert. Het is aan te raden om deze en andere van
dit soort instellingen aan te passen aan een redelijke waarde;
Het kan nodig zijn om de virtuele kerneladresruimte (KVA) te vergroten of om het aantal kernelbronnen dat veel
gebruikt wordt (zie boven) te verminderen om zo uitputting van KVA te voorkomen. De kerneloptie KVA_PAGES kan gebruikt worden om de KVA-ruimte te vergroten.
Om prestatie- en stabiliteitsredenen is het aan te raden om tuning(7) te raadplegen. pae(4) bevat bijgewerkte informatie over de ondersteuning voor PAE in FreeBSD.
Er zijn vier probleemcategoriën die op kunnen treden tijdens het bouwen van een aangepaste kernel:
Als het commando config(8) faalt bij het verwerken van de kernelbeschrijving, is er waarschijnlijk ergens een eenvoudige fout gemaakt. Gelukkig geeft config(8) het nummer van de regel weer waarmee het problemen had, dus kan snel de regel gevonden worden waarin de fout zit. In het onderstaande voorbeeld dient gecontroleerd te worden of het sleutelwoord juist is ingevoerd door het met de kernel GENERIC of een andere referentie te vergelijken:
config: line 17: syntax error
Als make faalt, duidt dit meestal op een fout in de kernelbeschrijving die niet erg genoeg is om door config(8) opgemerkt te worden. De instellingen dienen nogmaals nagekeken te worden. Als het probleem nog steeds niet is op te lossen, stuur dan een mail naar de FreeBSD algemene vragen mailinglijst met de kernelinstellingen. Dat leidt meestal snel tot een diagnose.
Als de nieuwe kernel niet opstart of de apparaten niet herkent is kalmte geboden. FreeBSD heeft een uitstekend mechanisme om van niet-compatibele kernels te herstellen. De gewenste kernel om mee op te starten kan vanuit de FreeBSD boot loader gekozen worden. Als het systeemopstartmenu verschijnt, kan deze gekozen worden. Selecteer de optie “Escape to a loader prompt”, nummer zes. Typ op de prompt boot kernel.old of de naam van een andere kernel die correct opstart. Als de kernelinstellingen gewijzigd worden, is het altijd aan te raden om een kernel bij de hand te houden waarvan bekend is dat die juist werkt.
Nadat er met een goede kernel is opgestart, kan het instellingenbestand gecontroleerd worden en geprobeerd worden om de kernel nogmaals te bouwen. Een behulpzame bron is het bestand /var/log/messages, dat onder andere alle kernelberichten van alle keren dat er succesvol is opgestart vastlegt. Ook geeft dmesg(8) alle kernelberichten weer van de huidige opstartprocedure.
Opmerking: Als er problemen zijn met het bouwen van een kernel, dient een GENERIC, of een andere kernel waarvan bekend is dat die werkt, bewaard te worden onder een andere naam die niet verwijderd wordt als de volgende kernel gebouwd wordt. Er kan niet op kernel.old vertrouwd worden omdat bij de installatie van een nieuwe kernel kernel.old overschreven wordt met de laatst geïnstalleerde kernel, die niet hoeft te werken. Ook dient de werkende kernel zo snel mogelijk naar de juiste plaats /boot/kernel verplaatst te worden, omdat anders commando's als ps(1) eventueel onjuist werken. Hiervoor dient simpelweg de map met de goede kernel hernoemd te worden:
# mv /boot/kernel /boot/kernel.slecht # mv /boot/kernel.goed /boot/kernel
Als er een andere versie van de kernel is geïnstalleerd dan degene waarmee de systeemgereedschappen gebouwd zijn, bijvoorbeeld een kernel voor -CURRENT op een -RELEASE-systeem, werken vele systeemstatuscommando's als ps(1) en vmstat(8) niet langer. De wereld moet opnieuw gecompileerd en geïnstalleerd worden en met dezelfde broncodestructuur als de kernel zijn gebouwd. Dit is een van de redenen waarom het normaliter geen goed idee is om een afwijkende versie van de kernel ten opzichte van de rest van de wereld te gebruiken.
FreeBSD kan gebruikt worden om op een scala aan printers af te drukken, van de oudste matrixprinter tot de nieuwste laserprinters en alles er tussenin, waardoor op hoge kwaliteit afgedrukt kan worden vanuit de gebruikte programma's.
FreeBSD kan ook ingesteld worden als printserver in een netwerk. Dan kan FreeBSD afdrukopdrachten ontvangen van uiteenlopende computers, waaronder FreeBSD computers, Windows en Mac OS hosts. FreeBSD zorgt ervoor dat er één afdrukopdracht per keer wordt afgedrukt, houdt statistieken bij van gebruikers en computers die de meeste afdrukken maken, drukt “voorbladen” af, zodat duidelijk is van wie de afdruk is en nog veel meer.
Na het lezen van dit hoofdstuk weet de lezer:
Hoe het FreeBSD afdrukwachtrijsysteem moet worden ingesteld;
Hoe afdrukfilters kunnen worden geïnstalleerd, om bepaalde afdrukopdrachten op een andere manier af te handelen, zoals het omzetten van documenten naar formaten die een printer begrijpt;
Hoe voorbladen kunnen worden afgedrukt;
Hoe er op printers die op andere computers zijn aangesloten kan worden afgedrukt;
Hoe er op printers die direct op het netwerk zijn aangesloten kan worden afgedrukt;
Hoe afdrukbeperkingen kunnen worden opgelegd, zoals het beperken van de grootte van de afdrukopdracht, en bepaalde gebruikers verbieden af te drukken;
Hoe afdrukstatistieken kunnen worden bijgehouden en het printergebruik in de gaten kan worden gehouden;
Hoe problemen met afdrukken kunnen worden opgelost.
Aangeraden voorkennis:
Hoe een nieuwe kernel wordt ingesteld, gebouwd en geïnstalleerd (Hoofdstuk 9).
Om printers onder FreeBSD te kunnen gebruiken moeten ze kunnen werken met het Berkeley lijnafdrukwachtrijsysteem, ook wel bekend als het wachtrijsysteem LPD of simpelweg LPD. Dit is het standaard afdruksysteem onder FreeBSD. Dit hoofdstuk introduceert LPD en begeleidt bij het instellen.
Als de gebruiker al bekend is met LPD of een ander afdrukwachtrijsysteem, dan kan verder worden lezen vanaf Standaardinstallatie.
LPD regelt alles met betrekking tot de printer van een host. Het is verantwoordelijk voor een aantal zaken:
Het regelt de toegang tot aangesloten printers en printers die op andere hosts op het netwerk zijn aangesloten;
Het geeft gebruikers de mogelijkheid bestanden aan te bieden die afgedrukt moeten worden; deze aangeboden bestanden worden afdrukopdrachten genoemd;
Het voorkomt dat gebruikers tegelijkertijd een printer benaderen door een wachtrij bij te houden voor elke printer;
Het kan voorbladen afdrukken (in het Engels ook wel bekend als banner, of burst pagina's) zodat gebruikers hun afdruk tussen andere afdrukken makkelijk terug kunnen vinden;
Het handelt de communicatie af voor printers die op een seriële poort zijn aangesloten;
Het kan afdrukopdrachten over een netwerk versturen naar een LPD wachtrij op een andere host;
Het kan speciale filters aanroepen die afdrukopdrachten converteren voor verschillende printertalen of afdrukmogelijkheden;
Het houdt statistieken bij van het printergebruik.
Middels een instellingenbestand (/etc/printcap) en door speciale filters beschikbaar te stellen, kan het LPD systeem alle, of enkele van bovenstaande taken uitvoeren op een grote verscheidenheid aan afdrukhardware.
Als er maar één gebruiker is op een systeem, staat terecht ter discussie waarom het wachtrijsysteem nodig is als toegangscontrole, voorbladen en printerstatistieken niet nodig zijn. Hoewel directe toegang tot de printer is in te stellen, is het raadzaam het wachtrijsysteem toch te gebruiken, omdat:
LPD afdrukopdrachten in de achtergrond afhandelt. Dan is het niet nodig te wachten tot de gegevens naar de printer zijn verzonden;
LPD op eenvoudige wijze een afdrukopdracht door een filter kan afdrukken om kopteksten met datum/tijd toe te voegen of een speciaal bestandsformaat (zoals een TeX DVI-bestand) om te zetten naar een formaat dat de printer begrijpt. Deze handelingen hoeven dan niet handmatig uitgevoerd te worden;
Veel gratis en commerciële software met een afdrukfunctie verwacht dat er een wachtrijsysteem aanwezig is op een systeem om afdrukopdrachten naar te sturen. Door een wachtrijsysteem op te zetten, wordt toekomstig te installeren of reeds geïstalleerde software op eenvoudige wijze ondersteund.
WaarschuwingVanaf FreeBSD 8.0; zijn de apparaatknooppunten voor seriële poorten hernoemd van /dev/ttydN naar /dev/ttyuN. FreeBSD 7.X gebruikers moeten de volgende documentatie aanpassen naar aanleiding van deze wijzigingen.
Om printers met het LPD wachtrijsysteem te kunnen gebruiken, dienen zowel de printerhardware als de LPD software geïnstalleerd te worden. Dit document beschrijft deze installatie in twee stappen:
In het onderdeel Eenvoudige printerinstallatie staat hoe een printer moet worden aangesloten, hoe LPD er mee kan communiceren en hoe tekstbestanden afgedrukt kunnen worden.
In Geavanceerde printerinstallatie staat beschreven hoe een scala aan bestandsformaten afgedrukt kan worden, hoe voorbladen kunnen worden afgedrukt en hoe statistieken van de printer kunnen worden bijgehouden.
Nu wordt toegelicht hoe de printerhardware en de LPD software ingesteld moeten worden om een printer te kunnen gebruiken. Het behandelt de basis:
Hardware-instellingen geeft een aantal aanwijzingen voor het aansluiten van een printer op een poort van een computer.
Software-instellingen toont hoe het instellingenbestand (/etc/printcap) voor het LPD-systeem moet worden opgezet.
Hoe een printer geïnstalleerd moet worden die via een netwerkprotocol gegevens ontvangt, in plaats van een seriële of parallelle poort, staat in Printers met netwerkinterfaces.
Hoewel dit onderdeel “Eenvoudige printerinstallatie” heet, is het redelijk complex. De printer met de computer en het LPD-systeem laten samenwerken is het moeilijkste. De geavanceerde opties, zoals voorbladen en statistieken, zijn relatief makkelijk als de printer eenmaal werkt.
Hier worden de verschillende manieren waarop een printer op een computer kan worden aangesloten beschreven. Het bespreekt de soorten poorten en kabels en de kernelinstellingen die nodig kunnen zijn om FreeBSD met een printer te laten communiceren.
Als een printer al is aangesloten en succesvol is gebruikt onder een ander besturingssysteem, dan kan waarschijnlijk verder gelezen worden in Software-instellingen.
De printers die tegenwoordig voor PC's verkocht worden hebben eigenlijk altijd een van de volgende drie poorten:
Seriële poort, ook bekend als RS-232- of COM-poorten, gebruiken een seriële poort op een computer om gegevens naar een printer te sturen. Seriële poorten zijn heel gebruikelijk in de computerindustrie en kabels zijn eenvoudig verkrijgbaar en makkelijk te maken. Seriële poorten hebben soms speciale kabels nodig en vereisen soms het instellen van ingewikkelde communicatieparameters. De meeste seriële poorten hebben een maximale doorvoersnelheid van 115.200 bps waardoor het afdrukken van grote grafische afdrukopdrachten erg onpraktisch wordt.
Parallelle poorten gebruiken een parallelle poort op een computer om gegevens naar een printer te sturen. Parallelle poorten zijn gebruikelijk in de PC-markt en zijn sneller dan RS-232 serieel. Kabels zijn goed verkrijgbaar, maar moeilijker handmatig te vervaardigen. Meestal zijn er geen communicatieparameters bij parallelle poorten, wat het instellen erg eenvoudig maakt.
Parallelle poorten staan ook wel bekend als “Centronics” poorten, genoemd naar het soort aansluiting op de printer.
USB poorten, genoemd naar de Universal Serial Bus, kunnen zelfs op nog hogere snelheid werken dan parallelle of RS-232 seriële poorten. De kabels zijn eenvoudig en goedkoop. USB is voor afdrukken superieur aan RS-232 Serieel en Parallel, maar wordt op UNIX-systemen niet altijd goed ondersteund. Een van de manieren om dit te omzeilen is de aanschaf van een printer met zowel een USB als een parallelle poort, zoals veel printers die hebben.
Over het algemeen kunnen parallelle poorten meestal in één richting communiceren (van computer naar printer), terwijl seriële en USB poorten in twee richtingen kunnen communiceren. Nieuwere parallelle poorten (EPP en ECP) en printers kunnen onder FreeBSD in beide richtingen communiceren, mits een IEEE-1284 gekeurde kabel wordt gebruikt.
Tweewegcommunicatie met een printer over een parallelle poort verloopt meestal op een van de volgende twee manieren. De eerste manier is door gebruik te maken van een op maat gemaakt stuurprogramma voor FreeBSD dat de taal spreekt die door de printer wordt gebruikt. Dit geldt meestal voor inkjet printers en er kan dan gebruikt gemaakt worden van rapportagemogelijkheden over bijvoorbeeld inktniveaus en andere statusinformatie. De tweede methode wordt gebruikt als een printer PostScript ondersteunt.
PostScript-taken zijn eigenlijk programma's die naar de printer worden gestuurd. Het hoeft zelfs niet in een afdruk te resulteren; het resultaat van de opdracht kan direct weer naar de computer worden gestuurd. PostScript gebruikt ook tweewegcommunicatie om een computer op de hoogte te stellen van opgetreden fouten, zoals fouten in het PostScript-programma of vastgelopen papier. Gebruikers kunnen dit soort informatie handig vinden. De beste manier om bij een PostScript-printer effectief bij te houden wat het printergebruik is, vraagt om tweewegcommunicatie: de printer wordt gevraagd om het totaal aantal afgedrukt pagina's, de afdrukopdracht wordt verzonden en vervolgens wordt nogmaals om het totaal aantal afgedrukte pagina's gevraagd. Het verschil van deze getallen geeft het aantal afgedrukte pagina's van de afdrukopdracht van de betreffende gebruiker.
Om een printer met een parallelle poort aan te sluiten, moet een Centronics kabel de printer met de computer verbinden. De instructies die geleverd zijn bij de printer, de computer of beide, moeten voldoende zijn om dit te verduidelijken.
Onthoud op welke parallelle poort de printer is aangesloten. De eerste parallelle poort heet onder FreeBSD ppc0, de tweede ppc1, enzovoort. De benaming voor de printer gaat analoog: /dev/lpt0 voor de printer op de eerste parallelle poort enzovoort.
Gebruik de juiste seriële kabel om een printer met een seriële poort op een computer aan te sluiten. De instructies die geleverd zijn bij de printer, de computer of beide, moeten voldoende zijn om dit te verduidelijken.
Als onduidelijk is wat de “juiste seriële kabel” is, kan een van onderstaande opties geprobeerd worden:
Een modemkabel verbindt elke pin van de stekker aan het ene eind direct met de corresponderende pin van de stekker aan het andere eind. Dit type kabel heet ook wel een “DTE-naar-DCE”-kabel.
Een null-modem kabel verbindt enkele pinnetjes direct, verwisselt andere (bijvoorbeeld van verstuur gegevens naar ontvang gegevens) en sluit sommige draden kort in de stekker. Dit type kabel heet ook wel een “DTE-to-DTE”-kabel.
Een seriële printerkabel, nodig bij sommige ongebruikelijke printers, is als een null-modem kabel, maar stuurt sommige signalen naar hun tegenhangers in plaats van ze intern kort te sluiten.
Het is ook nodig de communicatieparameters voor de printer in te stellen, meestal via het bedieningspaneel of middels DIP-schakelaars op de printer. Selecteer de hoogste bps (bits per seconde, soms baud) die zowel door de computer als de printer wordt ondersteund. Kies 7 of 8 data bits. Geen, even of oneven pariteit en 1 of 2 stop bits. Selecteer ook het flow-control protocol: ofwel geen, ofwel XON/XOFF (ook bekend als “in-band” of “software”) flow-control. Onthoud deze instellingen voor de hier op volgende software-instellingen.
Nu wordt beschreven welke software-instellingen nodig zijn om onder FreeBSD af te drukken met behulp van het wachtrijsysteem LPD.
Een overzicht van de te doorlopen stappen:
Maak, indien nodig, de kernel geschikt voor de poort die door de printer wordt gebruikt. In Kernelinstellingen is te lezen hoe dit gedaan kan worden.
Stel de communicatievorm voor de parallelle poort in, als gebruik wordt gemaakt van een parallelle printer. In Communicatietype instellen voor een parallelle poort staan de details.
Test of het besturingssysteem gegevens naar de printer kan sturen. In Printercommunicatie controleren staat een aantal suggesties.
Stel LPD in voor de printer door /etc/printcap aan te passen. Dat wordt later in het hoofdstuk beschreven.
Het besturingssysteem is gecompileerd om met een beperkte verzameling apparaten te kunnen werken. De seriële en parallelle poorten zijn onderdeel van deze verzameling. Daarom kan het nodig zijn om ondersteuning voor een extra seriële of parallelle poort toe te voegen als een kernel hier nog niet voor is ingesteld.
Om te achterhalen of de huidige kernel een seriële poort ondersteunt:
# grep sioN /var/run/dmesg.boot
Hier is N het aantal seriële poorten, beginnende bij nul. Als de uitvoer op het volgende lijkt, dan wordt de poort door de kernel ondersteund:
sio2 at port 0x3e8-0x3ef irq 5 on isa sio2: type 16550A
Om te achterhalen of de kernel een parallelle poort ondersteunt:
# grep ppcN /var/run/dmesg.boot
Hier is N het aantal parallelle poorten beginnende bij nul. Als de uitvoer er ongeveer als volgt uit ziet, dan wordt de poort door de kernel ondersteund:
ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0 ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode ppc0: FIFO with 16/16/8 bytes threshold
Het kan nodig zijn een kernel aan te passen om het besturingssysteem in staat te stellen een parallelle of seriële poort die voor een printer wordt gebruikt te herkennen en te gebruiken.
In het onderdeel over kernelinstellingen staat meer informatie om ondersteuning voor een seriële poort toe te voegen. Lees de betreffende en de volgende sectie om ondersteuning voor een parallelle poort toe te voegen.
Wanneer een parallelle poort wordt gebruikt, kan worden aangegeven of FreeBSD voor de printer interrupt-gestuurde of “polled” communicatie moet gebruiken. Het generieke printerapparaatstuurprogramma (lpt(4)) onder FreeBSD gebruikt het systeem ppbus(4). Dit bestuurt de chipset van de poort met het stuurprogramma ppc(4).
De interrupt-gestuurde methode is standaard in de GENERIC kernel. In dit geval gebruikt het besturingssysteem een IRQ om te bepalen of de printer klaar is om gegevens te ontvangen.
Bij de polled methode vraagt het besturingssysteem met vaste intervallen aan de printer of deze klaar is om gegevens te ontvangen. Als de printer antwoordt met “klaar”, stuurt de kernel meer gegevens.
De interrupt-gestuurde methode is meestal iets sneller, maar gebruikt een kostbaar IRQ-nummer. Van sommige HP printers wordt beweerd dat ze niet goed werken in interruptmodus, schijnbaar door een (nog niet begrepen) timing-probleem. Deze printers moeten gebruik maken van de polled methode. Gebruik de methode die werkt. Sommige printers werken met beide methodes, maar zijn tergend langzaam in de interrupt modus.
Het communicatietype kan op twee manieren worden ingesteld: door de kernel in te stellen of door gebruik te maken van lptcontrol(8).
Het communicatietype instellen door de kernel aan te passen:
Pas het kernelinstellingenbestand aan. Zoek naar een ppc0 ingang. Gebruik ppc1 voor het opzetten van een tweede parallelle poort. Gebruik ppc2 voor de derde poort, enzovoort.
Als u gebruik wilt maken van de interrupt gestuurde modus, bewerk dan de regel hieronder:
hint.ppc.0.irq="N"
Het kernelinstellingenbestand moet ook het stuurprogramma ppc(4) bevatten:
device ppc
Om gebruik te maken van polled modus verwijder dan het volgende regel uit /boot/device.hints:
hint.ppc.0.irq="N"
In sommige gevallen is het onder FreeBSD niet voldoende om een poort in polled modus te zetten. In veel gevallen komt dat door het stuurprogramma acpi(4). Dit is in staat om apparaten te testen en aan te sluiten en kan zodoende het communicatietype van de printer wijzigen. Raadpleeg de instellingen voor acpi(4) om dit probleem te verhelpen.
Sla het bestand op. Maak en installeer de nieuwe kernel en herstart de computer. In De FreeBSD-kernel instellen staan meer details.
Communicatietype instellen met lptcontrol(8):
Typ:
# lptcontrol-i-d/dev/lptN
om lptN op interrupt-gestuurde modus in te stellen.
Typ:
# lptcontrol-p-d/dev/lptN
om lptN op polled modus in te stellen.
# lptcontrol -p -d /dev/lptN
Zet deze commando's in het bestand /etc/rc.local zodat het communicatietype juist wordt ingesteld bij het opstarten. In lptcontrol(8) staat meer informatie.
Voor het instellen van het wachtrijsysteem, is het verstandig te controleren of het besturingssysteem gegevens naar een printer kan versturen. Het is een stuk makkelijker om problemen met printercommunicatie en het wachtrijsysteem apart op te lossen.
De printer wordt getest door er tekst naar toe te sturen. Voor printers die direct tekens kunnen afdrukken is het programma lptest(1) handig: het genereert alle 96 afdrukbare ASCII-tekens op 96 regels.
Voor PostScript (of andere op taal gebaseerde) printers, is een meer geavanceerde test nodig. Een eenvoudig PostScript-programma zoals het volgende volstaat:
%!PS 100 100 moveto 300 300 lineto stroke 310 310 moveto /Helvetica findfont 12 scalefont setfont (Werkt dit?) show showpage
Bovenstaande PostScript-code kan in een bestand worden opgeslagen en in de voorbeelden in de volgende paragrafen gebruikt worden.
Opmerking: Als in dit document wordt gesproken over een printertaal, wordt uitgegaan van een taal als PostScript en niet PCL van HP. Hoewel PCL zeer functioneel is, kan het direct platte tekst afdrukken door gebruik te maken van escape-tekens. PostScript kan niet direct platte tekst afdrukken. Voor dat soort printertalen zijn speciale aanpassingen nodig.
In deze sectie wordt beschreven hoe te controleren of FreeBSD kan communiceren met een printer die op een parallelle poort is aangesloten.
Voer de volgende stappen uit om een printer op een parallelle poort te testen:
su(1) naar root.
Stuur gegevens naar de printer.
Gebruik lptest(1) als de printer platte tekst af kan drukken:
# lptest > /dev/lptN
Hier is N het nummer van de parallelle poort, beginnende bij nul.
Als de printer PostScript of een andere printertaal begrijpt, stuur dan een klein programma naar de printer:
# cat > /dev/lptN
Geef het programma regel voor regel heel nauwkeurig in. Een regel kan niet worden gewijzigd als er op RETURN of ENTER is gedrukt. Geef na het afronden van de invoer voor het programma het einde-van-invoer-teken. Dit is meestal CONTROL+D.
Het programma kan ook in een bestand worden opgeslagen:
# cat bestand > /dev/lptN
Hier is bestand de naam van het bestand waarin het programma is opgeslagen dat naar een printer gestuurd kan worden.
Nu moet er iets worden afgedrukt. Tekst die er niet goed uitziet is geen probleem. Dit wordt later gerepareerd.
In deze sectie wordt beschreven hoe te controleren of FreeBSD kan communiceren met een printer die op een seriële poort is aangesloten.
Voer de volgende stappen uit om een printer op de seriële poort te testen:
su(1) naar root.
Voeg de volgende regel toe aan /etc/remote:
printer:dv=/dev/poort:br#bps-snelheid:pa=pariteit
Hier is poort de apparaatingave voor de seriële poort (ttyu0, ttyu1, enzovoort), bps-snelheid is het aantal bits per seconde waarop de printer communiceert en pariteit is de pariteit die door de printer wordt vereist (even, odd, none of zero).
Hier volgt een voorbeeldregel voor een printer verbonden met een seriële lijn op de derde seriële poort op 19200 bps, zonder pariteit:
printer:dv=/dev/ttyu2:br#19200:pa=none
Maak verbinding met de printer met tip(1):
# tip printer
Als dit niet werkt, pas dan /etc/remote opnieuw aan en probeer gebruik te maken van /dev/cuaaN in plaats van /dev/ttyuN.
Stuur gegevens naar de printer.
Gebruik lptest(1) als de printer platte tekst af kan drukken:
% $lptest
Als de printer PostScript of een andere printertaal begrijpt, stuur dan een klein programma naar de printer. Geef het programma regel voor regel heel nauwkeurig in. Backspace of andere speciale toetsen kunnen een speciale betekenis hebben voor de printer. Het kan ook nodig zijn een speciaal einde-van-invoer-teken te geven zodat de printer weet dat het gehele programma ontvangen is. Druk voor PostScript-printers CONTROL+D.
Het programma kan ook in een bestand worden opgeslagen:
% >bestand
Hier is bestand de naam van het bestand waarin het programma is opgeslagen. Nadat tip(1) het bestand heeft verstuurd kan het juiste einde-van-invoer-teken ingegeven worden.
Nu moet er iets worden afgedrukt. Tekst die er niet goed uitziet is geen probleem. Dit wordt later gerepareerd.
Op dit punt moet de printer zijn aangesloten, de kernel ingesteld zijn om met de printer te communiceren (indien nodig) en is het mogelijk eenvoudige gegevens naar de printer te sturen. Nu kan LPD ingesteld worden zodat de toegang tot de printer wordt geregeld.
LPD wordt ingesteld door het bestand /etc/printcap aan te passen. Het wachtrijsysteem LPD leest dit bestand iedere keer dat het systeem wordt aangeroepen zodat wijzigingen direct van toepassing zijn.
De opmaak van het bestand printcap(5) is voor de hand liggend. Met een willekeurige tekstverwerker kunnen wijzigen in /etc/printcap aangebracht worden. De opmaak is identiek aan die van andere bestanden die voor dergelijke instellingen worden gebruik, zoals /usr/share/misc/termcap en /etc/remote. In cgetent(3) staat een uitgebreid overzicht van dit formaat.
De vereenvoudigde instellingen bestaan uit de volgende stappen:
Kies een naam (en een paar handige aliassen) voor de printer en voeg ze toe aan /etc/printcap. In Printernaamgeving staat meer informatie over het toekennen van een naam aan een printer.
Het afdrukken van voorbladen (standaard) kan uitgezet worden met de optie sh. In Voorbladen onderdrukken staat meer informatie.
Maak een wachtrijmap aan en specificeer de locatie door middel van de optie sd. In Wachtrijmap aanmaken staat meer informatie.
Bepaal welke ingave in /dev voor de printer wordt gebruikt en geef dit in /etc/printcap aan door gebruik te maken van de optie lp. In Printerapparaat identificeren staat meer informatie. Als de printer is aangesloten op een seriële poort moeten de communicatieparameters worden ingesteld met de optie ms#. Dit wordt beschreven in Communicatieparameters voor het wachtrijsysteem instellen.
Installeer een filter voor platte tekst. In Tekstfilter installeren staan details.
Test de instellingen door iets met lpr(1) af te drukken. Details staan in Printer uitproberen en Problemen oplossen.
Opmerking: Op taal gebaseerde printers, zoals PostScript-printers, kunnen niet direct platte tekst afdrukken. De vereenvoudigde instellingen, zoals hierboven beschreven en hieronder verder beschreven, gaan er van uit dat alleen bestanden naar een printer worden gestuurd die de printer begrijpt.
Gebruikers verwachten vaak dat ze platte tekst naar printers op een systeem kunnen sturen. Programma's die LPD gebruiken om af te drukken gaan hier ook vaak van uit. Als een dergelijke printer wordt geïnstalleerd en het moet mogelijk zijn zowel afdrukopdrachten in de printertaal als in platte tekst naar een printer te sturen, dan is het zeer aan te raden een extra stap in deze vereenvoudigde opzet in te voegen: installeer een conversieprogramma dat automatisch platte tekst omzet in PostScript (of een andere printertaal). In Platte tekst op PostScript-printers afdrukken staat hoe dit in zijn werk gaat.
De eerste (makkelijke) stap is het kiezen van een naam voor een printer. Het maakt niet uit of een naam functioneel of grappig is, aangezien ook een aantal aliassen aan een printer toegekend kunnen worden.
Ten minste één van de printers die in /etc/printcap worden genoemd moet het alias lp hebben. Dit is de standaardnaam voor de printer. Als gebruikers de omgevingsvariabele PRINTER niet ingesteld hebben en ook geen printernaam specificeren als ze LPD gebruiken, dan wordt standaard de printer lp gebruikt.
Het is verder gebruikelijk om het laatste alias zo te kiezen dat het een volledige beschrijving van de printer is, inclusief merk en model.
Als een naam en een aantal aliassen zijn gekozen, kunnen ze aan /etc/printcap worden toegevoegd. De naam van een printer wordt in de meest linker kolom geplaatst. Scheid ieder alias met een verticale streep en plaats een dubbele punt achter het laatste alias.
In het volgende voorbeeld is de beginsituatie een uitgekleed /etc/printcap waarin twee printers worden gedefinieerd (een Diablo 630 lijnprinter en een Panasonic KX-P4455 PostScript-laserprinter):
# # /etc/printcap voor host rose # rattan|line|diablo|lp|Diablo 630 Line Printer: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:
In dit voorbeeld heet de eerste printer rattan en heeft de volgende aliassen: line, diablo, lp en Diablo 630 Line Printer. Omdat deze printer het alias lp heeft, is het de standaard printer. De tweede printer heet bamboo en heeft de aliassen ps, PS, S, panasonic en Panasonic KX-P4455 PostScript v51.4.
Het wachtrijsysteem LPD drukt standaard een voorblad af voor elke afdrukopdracht. Het voorblad bevat de gebruikersnaam van de gebruiker die de afdrukopdracht gaf, de computer waar de opdracht is gegeven en, in mooie grote letters, de naam van de afdrukopdracht. Het nadeel hiervan is dat al deze extra tekst het debuggen van de eenvoudige printerinstallatie bemoeilijkt. Daarom wordt het afdrukken van voorbladen onderdrukt.
Om voorbladen te onderdrukken, wordt de optie sh toegevoegd voor de relevante printer in /etc/printcap. Hieronder staat een voorbeeld van /etc/printcap met de optie sh:
#
# /etc/printcap voor host rose - nergens worden voorbladen afgedrukt
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:
Het juiste formaat is gebruikt: de eerste regel begint in de meest linker kolom, volgende regels springen in. Elke regel eindigt met een backslash, behalve de laatste.
De volgende stap in deze eenvoudige opzet is het aanmaken van een wachtrijmap. Dit is een map waar afdrukopdrachten geplaatst worden totdat ze worden afgedrukt. Ook wordt er een aantal bestanden geplaatst die nodig zijn voor het functioneren van het wachtrijsysteem.
Vanwege het veranderlijke karakter van wachtrijmappen is het gebruikelijk om deze mappen onder /var/spool te plaatsen. Het is niet nodig om een reservekopie van de inhoud van deze mappen te maken. Ze kunnen eenvoudigweg opnieuw worden aangemaakt met mkdir(1).
Het is ook gebruikelijk om de naam van de map overeen te laten komen met die van de printer, zoals onder is weergegeven:
# mkdir /var/spool/printernaam
Als er veel printers zijn aangesloten op een netwerk, is het beter de wachtrijmappen aan te maken in een enkele map die speciaal wordt gebruikt voor afdrukken met LPD. In dit voorbeeld wordt dat gedaan voor de printers rattan en bamboo:
# mkdir /var/spool/lpd # mkdir /var/spool/lpd/rattan # mkdir /var/spool/lpd/bamboo
Opmerking: Als de afdrukopdrachten privé moeten blijven, dan is het belangrijk de wachtrijmap niet algemeen toegankelijk te maken. Wachtrijmappen moeten eigendom zijn van gebruiker daemon en groep daemon. Uitsluitend deze gebruiker en groep moeten de map kunnen lezen, schrijven en doorzoeken. We doen dit voor onze voorbeeldprinters:
# chown daemon:daemon /var/spool/lpd/rattan # chown daemon:daemon /var/spool/lpd/bamboo # chmod 770 /var/spool/lpd/rattan # chmod 770 /var/spool/lpd/bamboo
Tenslotte moet LPD verteld worden dat deze mappen bestaan. Dit kan met het bestand /etc/printcap. De locatie van de wachtrijmap wordt opgegeven met de optie sd:
#
# /etc/printcap voor host rose - wachtrijmappen toegevoegd
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:
De naam van de printer staat in de eerste kolom, maar alle andere regels die de printer beschrijven worden ingesprongen en elke regel eindigt met een backslash.
Als geen wachtrijmap wordt opgegeven met sd, dan wordt standaard /var/spool/lpd gebruikt.
In de sectie Hardware-instellingen is bepaald welke poort en ingang in de map /dev door FreeBSD worden gebruikt om met een printer te communiceren. Nu moet LPD dit ook weten. Als het wachtrijsysteem een afdrukopdracht krijgt, opent het het relevante apparaat namens het filterprogramma (dat verantwoordelijk is voor het sturen van gegevens naar een printer).
Geef de locatie van de ingang in /dev op in /etc/printcap door gebruik te maken van de optie lp.
In het huidige voorbeeld wordt aangenomen dat rattan op de eerste parallelle poort is aangesloten en bamboo op de zesde seriële poort. Hier volgen de toevoegingen voor /etc/printcap:
#
# /etc/printcap voor host rose - bepaald welke apparaten te gebruiken
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyu5:
Als voor een printer de optie lp niet wordt gebruikt in /etc/printcap, dan gebruikt LPD standaard /dev/lp. Momenteel bestaat /dev/lp niet in FreeBSD.
Als de te installeren printer is aangesloten op een parallelle poort, dan staan verdere instructies in Tekstfilter installeren. In andere gevallen kunnen de instructies in de volgende paragraaf gevold worden.
Voor printers die zijn aangesloten op een seriële poort kan LPD de bps-snelheid, pariteit en andere seriële communicatie parameters instellen voor het filterprogramma dat gegevens naar een printer stuurt. Dit is gunstig omdat:
De verschillende communicatieparameters uitgeprobeerd kunnen worden door /etc/printcap aan te passen. Het is niet nodig het filterprogramma opnieuw te compileren;
Het wachtrijsysteem kan hetzelfde filter gebruiken voor verschillende printers die mogelijk verschillende seriële communicatie-instellingen hebben.
Met de volgende opties in /etc/printcap kunnen seriële communicatieparameters worden ingesteld voor het apparaat waar lp naar verwijst:
Stelt de communicatiesnelheid van het apparaat in op bps-snelheid, waarbij bps-snelheid de waarde 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600 of 115200 bits-per-seconde kan aannemen.
Bepaalt de opties voor het geval het printerapparaat een terminal is. In stty(1) staat uitleg over de beschikbare opties.
Als LPD het apparaat opent dat met lp is opgegeven, worden de eigenschappen van het apparaat bepaald door de optie ms#. Met name van belang zijn de modi parenb, parodd, cs5, cs6, cs7, cs8, cstopb, crtscts en ixon. Deze worden uitgelegd in stty(1).
Nu wordt de voorbeeldprinter op de zesde seriële poort aangepast. De bps-snelheid wordt ingesteld op 38400. Als modus wordt gekozen: geen pariteit met -parenb, 8-bit tekens met cs8, geen modemcontrole met clocal en hardware flow-control met crtscts:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:
Nu kan LPD verteld worden welke tekstfilters gebruikt moeten worden bij het versturen van afdrukopdrachten. Een tekstfilter is een programma dat LPD aanroept als het een afdrukopdracht krijgt. Wanneer LPD het tekstfilter aanroept, wordt de standaard invoer van het filter gekoppeld aan de afdrukopdracht en de standaard uitvoer aan het printerapparaat dat door de optie lp is opgegeven. Er wordt aangenomen dat het filter van standaard invoer leest, vervolgens de nodige handelingen uitvoert en het resultaat naar de standaard uitvoer schrijft, zodat het afgedrukt wordt. In Filters staat meer informatie over het tekstfilter.
Voor deze eenvoudige printerinstallatie kan het tekstfilter een klein shellscript zijn dat /bin/cat aanroept om de afdrukopdracht naar de printer te sturen. FreeBSD wordt geleverd met een ander filter, lpf, dat backspaces en onderlijnde tekst afhandelt voor printers die hier niet mee overweg kunnen. Natuurlijk kan elk filter gebruikt worden dat gewenst is. Het filter lpf wordt uitgebreid beschreven in lpf: een tekstfilter.
Nu wordt eerst het shellscript /usr/local/libexec/if-simple gemaakt dat als simpel tekstfilter dient. Plaats de volgende tekst in het bestand met een tekstverwerker naar keuze:
#!/bin/sh # # if-simple - Eenvoudig tekstfilter voor lpd # Geïnstalleerd in /usr/local/libexec/if-simple # # Kopieert eenvoudigweg stdin naar stdout. # Filterargumenten worden genegeerd. /bin/cat && exit 0 exit 2
Zorg dat het bestand uitvoerbaar is:
# chmod 555 /usr/local/libexec/if-simple
Zorg dat LPD het filter gebruikt door dit aan te geven met de optie if in /etc/printcap. Nu volgt hoe dit te doen voor de twee printers uit het voorbeeld:
#
# /etc/printcap voor host rose - met tekstfilter
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:\
:if=/usr/local/libexec/if-simple:
Opmerking: Een kopie van het script if-simple staat in de map /usr/share/examples/printing.
lpd(8) wordt gestart vanuit /etc/rc door de variabele lpd_enable. Standaard staat deze variabele op NO. Als dit nog niet is gedaan, voeg dan de volgende regel toe aan /etc/rc.conf en herstart de computer:
lpd_enable="YES"
Of voer het commando lpd(8) uit:
# lpd
Nu volgt het laatste onderdeel van de eenvoudige LPD installatie. Helaas zijn felicitaties nog niet gepast. De printer moet worden getest en eventuele problemen moeten worden opgelost. Om de installatie te testen kan iets afgedrukt worden. Afdrukken gaat met het commando lpr(1). Dit stuurt een opdracht naar een printer.
Het programma lpr(1) is te combineren met het programma lptest(1) uit Printercommunicatie controleren om tekst te genereren.
Om de eenvoudige installatie van LPD te testen:
# lptest 20 5 | lpr -Pprinternaam
Hier is printernaam de naam van een printer
(of een alias) die in /etc/printcap wordt genoemd. De
standaard printer kan worden getest door bij het aanroepen van lpr(1) de optie -P weg te laten. Nogmaals: test een PostScript-printer door een PostScript-programma naar een printer te sturen en maak
geen gebruik van lptest(1). Dit kan
door het programma in een bestand op te slaan en de volgende commandoregel
uit te voeren: lpr bestand.
Voor een PostScript-printer moet het resultaat van het programma verschijnen. Als gebruik wordt gemaakt van lptest(1) ziet het resultaat er ongeveer zo uit:
!"#$%&'()*+,-./01234 "#$%&'()*+,-./012345 #$%&'()*+,-./0123456 $%&'()*+,-./01234567 %&'()*+,-./012345678
Om de printer uitvoeriger te testen kunnen grotere programma's geprobeerd worden (voor taalgebaseerde printers) of kan lptest(1) aangeroepen worden met andere argumenten. Bijvoorbeeld: lptest 80 60, drukt 60 regels af met elk 80 karakters.
Als de printer niet werkt, lees dan verder in Problemen oplossen.
WaarschuwingVanaf FreeBSD 8.0; zijn de apparaatknooppunten voor seriële poorten hernoemd van /dev/ttydN naar /dev/ttyuN. FreeBSD 7.X gebruikers moeten de volgende documentatie aanpassen naar aanleiding van deze wijzigingen.
Deze sectie behandelt het gebruik van filters om speciaal opgemaakte tekst en voorbladen af te drukken, via het netwerk af te drukken en printergebruik te beperken en statistieken bij te houden.
Hoewel LPD veel van het afdrukwerk afhandelt (netwerkverkeer, wachtrijafhandeling, toegangscontrole, enzovoort), wordt het echte werk door de filters gedaan. Filters zijn programma's die met een printer communiceren en inspelen op printerspecifieke eigenschappen. In de eenvoudige printeropzet is een filter geïnstalleerd voor platte tekst, een zeer eenvoudig filter dat met de meeste printers zou moeten werken (Tekstfilter installeren).
Om echter gebruik te maken van formaatomzetting, printeradministratie, printerspecifieke aanpassingen, enzovoort, is het nodig te weten hoe filters werken. Uiteindelijk is het de verantwoordelijkheid van het filter om deze zaken af te handelen. Het slechte nieuws is dat de beheerder in het merendeel van de gevallen het filter moet aanleveren. Het goede nieuws is dat veel filters algemeen beschikbaar zijn en als ze dat niet zijn, zijn ze vaak makkelijk te schrijven.
FreeBSD heeft een ingebouwd filter, /usr/libexec/lpr/lpf, die met veel printers werkt die platte tekst kunnen afdrukken. Het filter regelt backspace en tabs in bestanden en administreert printergebruik, maar dat is zo'n beetje alles wat dit filter doet. Er zijn ook diverse filters en filtercomponenten in de FreeBSD Portscollectie.
Hieronder wordt het volgende beschreven:
In Hoe filters werken staat een overzicht van de rol die een filter speelt in het afdrukproces. Lees dat onderdeel om een indruk te krijgen wat er “onder de motorkap” gebeurt als LPD filters gebruikt. Deze kennis helpt mogelijke problemen te voorkomen of op te lossen als meerdere filters worden geïnstalleerd voor printers.
LPD gaat er van uit dat elke printer standaard platte tekst af kan drukken. Dit geeft problemen voor PostScript (of andere op taal gebaseerde) printers die niet in staat zijn direct platte tekst af te drukken. In Platte tekst op PostScript-printers afdrukken staat wat er kan worden gedaan om dit probleem te verhelpen. Lees verder in dit onderdeel als het om PostScript-printers gaat.
Voor veel programma's is PostScript een populair uitvoerformaat. Sommige mensen schrijven PostScript code zelfs direct. PostScript-printers zijn echter kostbaar. In PostScript simuleren op niet-PostScript-printers staat hoe de tekstfilter van een printer aangepast moet worden zodat die PostScript accepteert en afdrukt op een niet-PostScript-printer. Dit onderdeel is van toepassing voor niet-PostScript-printers.
In Conversiefilters wordt een
methode beschreven om de conversie van bepaalde bestandsformaten te automatiseren,
zoals van grafische of tekstopmaakprogramma's, naar formaten die een printer kan
begrijpen. Na het lezen van dit onderdeel is een beheerder in staat om een
printer zodanig in te stellen dat gebruikers lpr -t kunnen invoeren om troff-gegevens af te drukken, lpr -d om TeX DVI-gegevens af te drukken of lpr
-v om rasterplaatjes af te drukken, enzovoorts.
Het wordt aangeraden deze sectie te lezen.
In Uitvoerfilters wordt een niet vaak gebruikte functionaliteit van LPD behandeld: uitvoerfilters. Tenzij voorbladen worden afgedrukt (Voorbladen), kan deze sectie waarschijnlijk overgeslagen worden.
lpf: een tekstfilter beschrijft lpf, een redelijk complete, eenvoudige tekstfilter voor lijnprinters (en laserprinters die zich als lijnprinters voordoen) dat wordt geleverd bij FreeBSD. Voor een snelle manier om printeradministratie aan de praat te krijgen voor platte tekst of voor printers waar rook uit komt bij het zien van backspace karakters, is het serieus te overwegen gebruik te maken van lpf.
Opmerking: Een kopie van de scripts die hieronder worden beschreven, staan in de map /usr/share/examples/printing.
Zoals eerder genoemd, is een filter een programma dat wordt uitgevoerd door LPD voor het afhandelen van het apparaatafhankelijke deel van de communicatie met een printer.
Als LPD een bestand wil afdrukken uit een afdrukopdracht, start het een filterprogramma. Het koppelt de standaard invoer van de filter aan het af te drukken bestand, de standaard uitvoer aan de printer en de standaard foutmelding aan het logboekbestand voor foutmeldingen (zoals opgegeven via de optie lf in /etc/printcap of standaard /dev/console).
Welk filter LPD start en de argumenten van het filter
hangen af van wat er in het bestand /etc/printcap wordt
opgegeven en de argumenten die de gebruiker geeft op de commandoregel van lpr(1). Als een
gebruiker bijvoorbeeld lpr -t
ingeeft, start LPD het filter troff, zoals wordt
opgegeven via de optie tf voor de betreffende printer. Als
een gebruiker platte tekst wilt afdrukken, dan wordt het filter if gestart (dit klopt bijna: zie Uitvoerfilters voor de details).
Er zijn drie soorten filters die in /etc/printcap kunnen worden opgegeven:
Het tekstfilter, dat in de LPD documentatie verwarrend genoeg input filter wordt genoemd, verwerkt het afdrukken van gewone tekst. Beschouw het als het standaardfilter. LPD verwacht dat elke printer standaard platte tekst kan afdrukken en het is de taak van het tekstfilter om er voor te zorgen dat backspaces, tabs en andere speciale karakters de printer niet in de war sturen. In een omgeving waar moet worden bijgehouden hoeveel er wordt afgedrukt, moet het tekstfilter ook administreren hoeveel pagina's er zijn afgedrukt. Dit gaat meestal door het aantal afgedrukte regels te tellen en dit te vergelijken met het aantal regels per pagina dat door de printer wordt ondersteund. Het tekstfilter wordt aangeroepen met de volgende lijst argumenten:
filter-name [-c] -w width -l length -i indent -n login -h host acct-file
met
-cwordt gebruikt als de afdrukopdracht is gegeven met lpr
-l
is de waarde van de optie pw (page width: paginabreedte), zoals opgegeven in /etc/printcap, standaard 132
is de waarde van de optie pl (page length: paginalengte), standaard 66
geeft aan hoeveel wordt ingesprongen door lpr -i, standaard 0
de gebruikersnaam van de gebruiker die de afdrukopdracht gaf
de hostnaam waar de afdrukopdracht gegeven is
de naam van het administratiebestand zoals opgegeven via de optie af.
Een conversiefilter converteert een specifiek bestandsformaat naar een formaat dat een printer begrijpt. Bijvoorbeeld: ditroff typesettinggegevens kunnen niet direct worden afgedrukt, maar er bestaat wel een conversiefilter om ditroff-gegevens te converteren naar een formaat dat een printer kan verteren en afdrukken. Dit wordt in Conversiefilters beschreven. Conversiefilters zijn ook nodig om printergebruik te administreren, mocht dat nodig zijn. Conversiefilters worden met de volgende argumenten aangeroepen:
filter-name -x pixel-width -y pixel-height -n login -h host acct-file
Hier is pixel-width de waarde van de optie px (standaard 0) en pixel-height is de waarde van de optie py (standaard 0).
Het uitvoerfilter wordt alleen gebruikt als er geen tekstfilter is of als er voorbladen worden afgedrukt. De ervaring leert dat uitvoerfilters zelden worden gebruikt. In sectie Uitvoerfilters worden ze beschreven. Er zijn slechts twee argumenten die aan een uitvoerfilter worden meegegeven:
filter-name -w width -l length
Deze zijn identiek aan de argumenten -w en -l van het tekstfilter.
Filters moeten afsluiten met de volgende waarde:
Als het filter een bestand succesvol heeft afgedrukt.
Als het filter niet geslaagd is om een bestand af te drukken, maar wil dat LPD het nogmaals probeert. LPD herstart het filter als die afsluit met deze status.
Als het filter niet geslaagd is om een bestand af te drukken, maar niet wil dat LPD het nogmaals probeert. LPD verwijdert het bestand uit de wachtrij.
Het tekstfilter dat bij FreeBSD wordt geleverd, /usr/libexec/lpr/lpf, benut de argumenten voor paginabreedte en -lengte om te bepalen wanneer een nieuwe pagina moet worden begonnen en om het printergebruik bij te houden. Het gebruikt de argumenten voor login, host en administratiebestand om accountingregels aan te maken.
Controleer bij het zoeken naar filters of ze LPD-compatibel zijn. Zo ja, dan ondersteunen ze de argumenten zoals hierboven beschreven. Zorg bij het zelf schrijven van filters voor algemeen gebruik dat ze dezelfde argumenten en exitcodes ondersteunen.
Als een computer en PostScript (of andere op taal gebaseerde) printer maar één gebruiker hebben die belooft nooit platte tekst naar de printer te sturen of programma's te gebruiken die dat doen, dan is dit onderdeel overbodig.
Als gebruikers zowel PostScript als platte tekst naar een printer willen sturen, dan is het aan te raden de printerinstellingen hierop aan te passen. Hiervoor moet het tekstfilter bij elke nieuwe opdracht bepalen of het om platte tekst of PostScript gaat. Alle PostScript-opdrachten beginnen met %! (raadpleeg de printerhandleiding voor andere printertalen). Als dit de eerste twee karakters zijn van een opdracht is het PostScript en kan de rest van een opdracht direct doorgestuurd worden. Is dit niet het geval, dan moet de filter de tekst omzetten in PostScript en het resultaat afdrukken.
Hoe gaat dat werken?
Voor seriële printers kan het meest eenvoudig lprps geïnstalleerd worden. lprps is een PostScript-afdrukfilter die tweewegcommunicatie met een printer heeft. Het werkt het statusbestand van een printer bij met uitgebreide informatie afkomstig van een printer, zodat gebruikers en beheerders precies kunnen zien wat de status van een printer is (zoals: “toner bijna op” of “papier vastgelopen”). Maar belangrijker, het omvat het programma psif dat bepaalt of een binnenkomende opdracht platte tekst is en textps (dat ook geleverd wordt met lprps) om opdrachten om te zetten naar PostScript. Vervolgens wordt een opdracht met lprps naar een printer gestuurd.
lprps is onderdeel van de FreeBSD Portscollectie (zie De Portscollectie). U kunt één van de ports print/lprps-a4 of print-lprps-letter installeren afhankelijk van de gebruikte papiermaat. Nadat lprps is geïnstalleerd moet de installatielocatie ervan aan psif worden doorgeven dat onderdeel is van lprps. Als lprps is geïnstalleerd via de Portscollectie, gebruik dan het volgende voor de seriële PostScript-printer in /etc/printcap:
:if=/usr/local/libexec/psif:
Ook moet de optie rw worden opgeven, die LPD vertelt om een printer in lezen/schrijvenmodus te openen.
Als een parallelle PostScript-printer wordt ingesteld (en dus geen tweewegcommunicatie toegepast kan worden met de printer, zoals vereist door lprps), dan kan het volgende shellscript gebruikt worden als tekstfilter:
#!/bin/sh # # psif - Druk PostScript of platte tekst af op een PostScript # printer. Script versie; NIET de versie die wordt geleverd bij lprps # Geïnstalleerd in /usr/local/libexec/psif # IFS="" read -r first_line first_two_chars=`expr "$first_line" : '\(..\)'` if [ "$first_two_chars" = "%!" ]; then # # PostScript opdracht, afdrukken. # echo "$first_line" && cat && printf "\004" && exit 0 exit 2 else # # Platte tekst, converteren en dan afdrukken. # ( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0 exit 2 fi
In bovenstaand script is textps een programma dat geïnstalleerd is om platte tekst om te zetten naar PostScript. Elk tekst-naar-PostScript programma volstaat. De FreeBSD Portscollectie (zie De Portscollectie) bevat een uitgebreid tekst-naar-PostScript-programma, a2ps, dat wellicht handig is om te gebruiken.
PostScript is de facto de standaard voor op hoge kwaliteit typesetten en afdrukken. PostScript is echter een dure standaard. Gelukkig heeft Aladdin Enterprises een gratis PostScript-kloon, Ghostscript, die werkt onder FreeBSD. Ghostscript kan de meeste PostScript-bestanden lezen en de pagina's op verschillende soorten apparaten weergeven, waaronder veel niet-PostScript-printers. Door Ghostscript te installeren en een printer gebruik te laten maken van een speciaal tekstfilter voor uw printer, kan uw niet-PostScript-printer zich gedragen als een echte PostScript-printer.
Ghostscript is beschikbaar via de FreeBSD Portscollectie, vele versies zijn beschikbaar, de meest gebruikte versie is print/ghostscript-gpl.
Om PostScript te simuleren moet een tekstfilter detecteren of het een PostScript-bestand aan het afdrukken is. Zo niet, dan stuurt het filter het bestand direct naar een printer, anders gebruikt het filter Ghostscript om het bestand om te zetten naar een formaat dat door een printer wordt begrepen.
Een voorbeeld: het volgende script is een tekstfilter voor Hewlett Packard
DeskJet 500 printers. Voor andere printers moet het argument -sDEVICE voor het commando gs
(Ghostscript) vervangen worden. (Met gs -h wordt een lijst met apparaten getoond worden die de
huidige installatie van Ghostscript ondersteunt.)
#!/bin/sh # # ifhp - Druk Ghostscript-gesimuleerd PostScript af op een DeskJet # 500. Geïnstalleerd in /usr/local/libexec/ifhp # # Behandel LF als CR+LF (om een "trapeffect" op HP/PCL # printer te voorkomen): # printf "\033&k2G" || exit 2 # # Lees de eerste twee karakters van het bestand # IFS="" read -r first_line first_two_chars=`expr "$first_line" : '\(..\)'` if [ "$first_two_chars" = "%!" ]; then # # Het is PostScript. Gebruik Ghostscript om te converteren # en druk het af. # /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \ -sOutputFile=- - && exit 0 else # # Platte tekst of HP/PCL, dus direct afdrukken; druk een # pagina-einde af om de laatste pagina te ejecteren. # echo "$first_line" && cat && printf "\033&l0H" && exit 0 fi exit 2
Tot slot moet LPD op de hoogte gebracht worden van het filter via de optie if:
:if=/usr/local/libexec/ifhp:
Dat is alles. Nu kan lpr platte.tekst en lpr watdanook.ps ingevoerd worden en beiden worden juist afgedrukt.
Na de eenvoudige installatie, zoals beschreven in Eenvoudige printerinstallatie, te hebben voltooid, is het waarschijnlijk wenselijk om conversiefilters te installeren voor favoriete bestandsformaten (naast platte ASCII-tekst).
Conversiefilters maken het afdrukken van verschillende bestanden eenvoudig. Stel dat veel gebruik gemaakt wordt van het tekstverwerkingsprogramma TeX en een PostScript printer. Elke keer als door TeX een DVI-bestand wordt gegenereerd, kan dat niet direct afgedrukt worden. Het DVI-bestand moet omgezet worden naar PostScript. De te geven opdrachten zijn de volgende:
% dvips zeewieranalyse.dvi % lpr zeewieranalyse.ps
Na installatie van een conversiefilter voor DVI-bestanden kan deze handmatige conversie overgeslagen worden door LPD de conversie te laten uitvoeren. Elke keer als een DVI-bestand wordt afgedrukt, hoeft alleen de volgende opdracht gegeven te worden:
% lpr -d zeewieranalyse.dvi
LPD voert de DVI-bestandsconversie uit door -d te geven. In Opties
voor opmaak en conversie staat een lijst van conversie-opties.
Voor elke conversie-optie moet een conversiefilter geïnstalleerd worden en moet in /etc/printcap de locatie worden opgegeven. Een conversiefilter is als het tekstfilter voor de eenvoudige printerinstallatie (Tekstfilter installeren), behalve dat in plaats van platte tekst af te drukken, het conversiefilter het bestand converteert naar een formaat dat een printer begrijpt.
Installeer de conversiefilters die nodig zijn. Als veel DVI-bestanden worden afgedrukt, dan is het handig een DVI-filter te installeren. Als veel troff wordt afgedrukt, dan is het waarschijnlijk handig een troff-filter te installeren.
De volgende tabel geeft een samenvatting van filters waarmee LPD kan werken, hoe ze in /etc/printcap kunnen worden aangeroepen en hoe ze met lpr kunnen worden aangeroepen:
| Bestandsformaat | /etc/printcap optie | lpr optie |
|---|---|---|
| cifplot | cf | -c |
| DVI | df | -d |
| plot | gf | -g |
| ditroff | nf | -n |
| FORTRAN-tekst | rf | -f |
| troff | tf | -f |
| raster | vf | -v |
| platte tekst | if | geen, -p, of -l |
In het voorbeeld waarbij lpr -d wordt gebruikt, moet voor de printer een optie df gedefinieerd staan in /etc/printcap.
Ondanks wat anderen mogelijk beweren, zijn formaten als FORTRAN-tekst en plot
waarschijnlijk verouderd. Dit biedt de mogelijkheid een nieuwe betekenis te geven
aan deze opties door zelf een filter te installeren. Stel dat direct
Printerleaf-bestanden afgedrukt moeten worden (bestanden van het
bureaubladpublicatieprogramma Interleaf), maar nooit plotbestanden worden
afgedrukt. Dan kan een Printerleaf-conversiefilter geïnstalleerd worden onder
de optie gf en gebruikers kunnen geïnstrueerd
worden om lpr -g te gebruiken
om Printerleaf-bestanden af te drukken.
Aangezien conversiefilters programma's zijn die niet onder de FreeBSD-basisinstallatie vallen, kunnen ze het best onder /usr/local geplaatst worden. De map /usr/local/libexec is een veelgebruikte locatie, omdat hier programma's te vinden zijn die alleen door LPD gebruikt worden. Gewone gebruikers hoeven ze nooit te gebruiken.
Om een conversiefilter te activeren, moet de bestandslocatie onder de juiste optie voor de betreffende printer in /etc/printcap opgegeven worden.
In het onderstaande voorbeeld wordt het DVI-conversiefilter toegevoegd onder de sectie van de printer bamboo. Hieronder staat opnieuw het voorbeeldbestand /etc/printcap, nu met de nieuwe optie df voor de printer bamboo:
#
# /etc/printcap voor host rose - df-filter voor bamboo toegevoegd
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
Het DVI-filter is een shellscript met de naam /usr/local/libexec/psdf. Het script ziet er als volgt uit:
#!/bin/sh # # psdf - DVI naar PostScript afdrukfilter # Geïnstalleerd in /usr/local/libexec/psdf # # Aangeroepen door lpd wanneer een gebruiker lpr -d uitvoert # exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"
Dit script roept dvips in filtermodus aan (het -f argument) op de standaard uitvoer, de af te drukken
opdracht. Vervolgens start het PostScript
afdrukfilter lprps (zie Platte tekst op PostScript-printers afdrukken) met de argumenten die
LPD aan het script doorgeeft. lprps gebruikt deze argumenten om de afgedrukte pagina's te
administreren.
Er is geen vaste procedure om conversiefilters te installeren, er worden in deze sectie wat werkende voorbeelden gegeven. Gebruik deze als hulp bij het zelf maken van filters. Gebruik ze zonder aanpassingen indien mogelijk.
Dit voorbeeldscript is een raster (eigenlijk een GIF-bestand) conversiefilter voor een HP LaserJet III-Si printer:
#!/bin/sh
#
# hpvf - Converteer GIF-bestanden naar HP/PCL, druk vervolgens af
# Geïnstalleerd in /usr/local/libexec/hpvf
PATH=/usr/X11R6/bin:$PATH; export PATH
giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
&& exit 0 \
|| exit 2
Het script converteert achtereenvolgens het GIF-bestand naar een PNM-bestand (portable anymap), een PGM-bestand (portable graymap), een PBM-bestand (portable bitmap) en tenslotte naar LaserJet/PCL formaat.
Een /etc/printcap bestand dat bovenstaand filter gebruikt ziet er als volgt uit:
#
# /etc/printcap voor host orchid
#
teak|hp|laserjet|HP LaserJet 3Si:\
:lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:\
:vf=/usr/local/libexec/hpvf:
Het volgende script is een conversiefilter voor troff-gegevens afkomstig van het groff-typesettingsysteem voor de PostScript-printer bamboo:
#!/bin/sh # # pstf - Converteert groff's troffgegevens naar PS, drukt vervolgens af. # Geïnstalleerd in /usr/local/libexec/pstf # exec grops | /usr/local/libexec/lprps "$@"
Bovenstaande script maakt eveneens gebruik van lprps om de communicatie met een printer af te handelen. Als een printer op een parallelle poort is aangesloten, ziet het er als volgt uit:
#!/bin/sh # # pstf - Converteert groff's troff naar PS, drukt vervolgens af. # Geïnstalleerd in /usr/local/libexec/pstf # exec grops
Dat is alles. In /etc/printcap moet het volgende toegevoegd worden om het filter beschikbaar te maken:
:tf=/usr/local/libexec/pstf:
Hieronder een voorbeeld waarvan FORTRAN-programmeurs waarschijnlijk tranen in hun ogen krijgen: een FORTRAN-tekstfilter voor een willekeurige printer die in staat is platte tekst af te drukken. Het filter wordt actief gemaakt voor teak:
#!/bin/sh # # hprf - FORTRAN tekstfilter voor LaserJet 3si: # Geïnstalleerd in /usr/local/libexec/hprf # printf "\033&k2G" && fpr && printf "\033&l0H" && exit 0 exit 2
De onderstaande regel wordt toegevoegd aan /etc/printcap voor de printer teak om het filter beschikbaar te maken:
:rf=/usr/local/libexec/hprf:
Het laatste voorbeeld is wellicht complexer. Er wordt een DVI-filter toegevoegd voor de eerder genoemde LaserJet printer teak. Eerst het makkelijke gedeelte: in /etc/printcap wordt de locatie van het DVI-filter opgegeven:
:df=/usr/local/libexec/hpdf:
Nu het moeilijke gedeelte: het schrijven van het filter. Daarvoor is een DVI-naar-LaserJet/PCL conversieprogramma nodig. De FreeBSD Portscollectie (zie Portscollectie) heeft er een: print/dvi2xx. Door deze port te installeren komt het programma dat nodig is beschikbaar, dvilj2p, waarmee DVI geconverteerd kan worden naar LaserJet IIp-, LaserJet III- en LaserJet 2000-formaten.
Het hulpprogramma dvilj2p maakt het filter hpdf redelijk complex, omdat dvilj2p niet van de standaard invoer kan lezen. Het wil werken met een bestandsnaam. Nog lastiger is dat de bestandsnaam moet eindigen op .dvi, zodat moeilijk gebruik gemaakt kan worden van /dev/fd/0 als standaard. Dit probleem kan omzeild worden door een (symbolische) koppeling aan te maken van een tijdelijk bestand (eindigend op .dvi) naar /dev/fd/0. Hiermee wordt dvilj2p gedwongen van de standaard invoer te lezen.
De enige andere hobbel die genomen moet worden, is dat /tmp niet gebruikt kan worden als tijdelijke koppeling. Symbolische koppelingen zijn eigendom van de gebruiker en groep bin. Het filter wordt uitgevoerd door de gebruiker daemon. De map /tmp heeft het sticky-bit aan staan. Het filter kan de koppeling wel aanmaken, maar het is niet mogelijk de koppeling te verwijderen als de opdracht is uitgevoerd, omdat de koppeling eigendom is van een andere gebruiker.
In plaats hiervan maakt het filter een symbolische koppeling aan in de huidige werkmap, de wachtrijmap (zoals opgegeven in de optie sd in /etc/printcap). Dit is een perfecte plaats voor filters om hun werk te doen, zeker gezien er (soms) meer vrije schijfruimte is in de wachtrijmap dan onder /tmp.
Dit is het uiteindelijke filter:
#!/bin/sh
#
# hpdf - Druk DVI-gegevens af op een HP/PCL printer
# Geïnstalleerd in /usr/local/libexec/hpdf
PATH=/usr/local/bin:$PATH; export PATH
#
# Definieer een functie om tijdelijke bestanden op te ruimen. Deze
# staan in de huidige map; de wachtrijmap voor de printer.
#
cleanup() {
rm -f hpdf$$.dvi
}
#
# Definieer een functie om fatale fouten te verwerken: geef de
# opgegeven boodschap weer en sluit af met 2. Afsluiten met 2 vertelt
# LPD niet nog eens te proberen de afdrukopdracht af te drukken.
#
fatal() {
echo "$@" 1>&2
cleanup
exit 2
}
#
# Als de gebruiker de opdracht annuleert, stuurt LPD een SIGINT, dus
# ondervang SIGINT (en enkele andere signalen) om onze rommel op te
# ruimen.
#
trap cleanup 1 2 15
#
# Voor de zekerheid bestaande tijdelijke bestanden opruimen
#
cleanup
#
# Koppel het DVI-invoerbestand aan de standaard invoer (het af te
# drukken bestand).
#
ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"
#
# Maak LF = CR+LF
#
printf "\033&k2G" || fatal "Cannot initialize printer"
#
# Converteer en druk af. De retourneerwaarde van dvilj2p lijkt niet
# betrouwbaar, dus negeren we het.
#
dvilj2p -M1 -q -e- dfhp$$.dvi
#
# Opruimen en afsluiten
#
cleanup
exit 0
Al deze conversiefilters bieden vele mogelijkheden voor afdrukomgevingen, maar dwingen de gebruiker aan te geven (op de lpr(1) commandoregel) welk filter gebruikt moet worden. Als gebruikers niet zo vaardig zijn in het gebruik van computers, wordt het al snel vervelend steeds aan te moeten geven welk filter gebruikt moet worden. Vervelender is echter wanneer een gebruiker een verkeerd filter gebruikt voor een bepaald bestandsformaat. Het resultaat kan zijn dat een printer honderden pagina's papier uitspuugt.
In plaats van het installeren van conversiefilters, is het te proberen om het (standaard) tekstfilter het bestandstype van het af te drukken bestand te laten detecteren en dan automatisch het juiste conversiefilter aan te laten roepen. Programma's als file kunnen hierbij handig zijn. Voor sommige bestandsformaten kan het moeilijk zijn de verschillen te ontdekken en voor deze bestanden kan alsnog een conversiefilter beschikbaar worden gesteld.
De FreeBSD Portscollectie heeft een tekstfilter dat automatisch converteert genaamd apsfilter (print/apsfilter). Het detecteert platte tekst, PostScript en DVI-bestanden, voert de juiste conversie uit en druk de bestanden af.
Het wachtrijsysteem LPD ondersteunt een ander type filter waar nog geen aandacht aan is besteed: een uitvoerfilter. Een uitvoerfilter is bedoeld om alleen platte tekst af te drukken, net als een tekstfilter, maar met veel vereenvoudigingen. Wanneer een uitvoerfilter wordt gebruikt, maar geen tekstfilter, dan:
start LPD een uitvoerfilter voor de gehele opdracht, in plaats van voor elk bestand in de opdracht;
biedt LPD het uitvoerfilter niet de voorziening van het identificeren van het begin of eind van de bestanden in de afdrukopdracht;
stuurt LPD de gebruikersnaam en de hostnaam niet door aan het filter. Het is dus niet bedoeld om een afdrukadministratie bij te houden. In feite zijn er maar twee argumenten:
filter-name -wwidth -llength
Hierbij is width afkomstig van de optie pw en length afkomstig van de optie pl voor de betreffende printer.
De eenvoud van een uitvoerfilter is verleidelijk. Als elk bestand in een afdrukopdracht op een nieuwe pagina moet beginnen, is een uitvoerfilter niet geschikt. In dat geval dient een tekstfilter (ook wel invoerfilter) gebruikt te worden (zie Tekstfilter installeren. Verder is een uitvoerfilter eigenlijk veel ingewikkelder, omdat de te verwerken bytestroom gecontroleerd moet worden op speciale tekens en steeds signalen naar zichzelf moet sturen in opdracht van LPD.
Een uitvoerfilter is noodzakelijk als voorbladen gewenst zijn en het nodig is om escape-reeksen of andere initialisatietekens te sturen voor het afdrukken van het voorblad. Maar het is tevens nutteloos als het voorblad voor rekening van de afkomstige gebruiker moet komen, aangezien LPD geen gebruiker of hostinformatie naar het uitvoerfilter stuurt.
Op een enkele printer staat LPD het gebruik van zowel een uitvoerfilter als van een tekst of andere filter toe. In deze gevallen start LPD het uitvoerfilter alleen voor het afdrukken van het voorblad (zie Voorbladen). LPD verwacht vervolgens van het uitvoerfilter dat deze zichzelf stopt door twee bytes naar het filter te sturen: ASCII 031 gevolgd door ASCII 001. Als een uitvoerfilter deze twee bytes ziet (031, 001), moet die stoppen door een SIGSTOP naar zichzelf te sturen. Als LPD klaar is met het uitvoeren van alle andere filters, dan herstart deze het uitvoerfilter door er een SIGCONT naar toe te sturen.
Als er wel een uitvoerfilter, maar geen tekstfilter is en LPD is niet bezig met het verwerken van een opdracht met platte tekst, dan gebruikt LPD het uitvoerfilter voor het afdrukken van de opdracht. Zoals eerder vermeld, drukt het uitvoerfilter elk bestand van de opdracht achter elkaar af zonder pagina-einden of andere signalen voor paginavoortgang. Dit is waarschijnlijk niet gewenst. In bijna alle gevallen is een tekstfilter nodig.
Het programma lpf, dat eerder geïntoduceerd is als tekstfilter, kan ook worden uitgevoerd als uitvoerfilter. Als een ad-hoc uitvoerfilter nodig is, maar het schrijven van de bytedetectie en signaalverzending code niet wenselijk is, dan is lpf het proberen waard. lpf kan ook opgenomen worden in een shellscript om initialisatiecode af te handelen die eventueel nodig is voor een printer.
Het programma /usr/libexec/lpr/lpf uit de
gecompileerde FreeBSD-distributie is een tekstfilter (invoerfilter) die uitvoer kan
inspringen (een opdracht gegeven met lpr -i), karakters onveranderd kan doorlaten (een opdracht
gegeven met lpr -l), de
printpositie voor backspaces en tabs in de opdracht kan aanpassen en
afgedrukte pagina's kan administreren. Het kan ook functioneren als
uitvoerfilter.
Het filter lpf is geschikt voor vele afdrukomgevingen. Hoewel het zelf niet in staat is initialisatiesequenties naar een printer te sturen, is het vrij eenvoudig om een shellscript te schrijven dat de initialisatie doet en vervolgens lpf aanroept.
Als lpf afgedrukte pagina's moet administreren, is het nodig om de juiste waarden in te vullen voor de opties pw en pl in het bestand /etc/printcap. Deze waarden worden gebruikt om te bepalen hoeveel tekst er op een pagina past en hoeveel pagina's er in een afdrukopdracht zijn afgedrukt. Zie Printergebruik administreren voor meer informatie.
Als er veel gebruikers zijn die allemaal verschillende printers gebruiken, dan is het te overwegen gebruik te maken van voorbladen als noodzakelijk kwaad.
Voorbladen, in het Engels ook wel bekend als banner of burst pagina's, identificeren wie een bepaalde opdracht heeft afgedrukt. Ze worden meestal bedrukt met grote, dikgedrukte letters, eventueel met een decoratieve rand, zodat ze in een stapel afdrukken opvallen tussen de afgedrukte documenten. Ze maken het gebruikers mogelijk hun afdrukopdracht snel te vinden. Het nadeel van het gebruik van voorbladen is dat er een extra blad moet worden afgedrukt voor elke opdracht, waarmee hun nut niet langer duurt dan een paar minuten. Uiteindelijk belanden ze in een papierbak of afvalberg. Voorbladen gaan vooraf aan elke opdracht, niet aan elk bestand in een opdracht, waardoor de verspilling beperkt blijft.
Het LPD-systeem kan automatisch voorbladen afdrukken als een printer direct platte tekst kan afdrukken. In geval van een PostScript-printer, is het nodig een extern programma aan te roepen om een voorblad te genereren (zie Voorbladen op PostScript-printers.
In de sectie Eenvoudige printerinstallatie is het afdrukken van voorbladen uitgeschakeld door de optie sh (“suppress header”) in het bestand /etc/printcap op te geven. Om wel voorbladen af te drukken, hoeft alleen de optie sh verwijderd te worden.
Dit klinkt wat al te makkelijk, of niet?
Dat klopt. Het kan nodig zijn een uitvoerfilter op te geven die initialisatiestrings naar een printer stuurt. Hier is een voorbeeld uitvoerfilter voor HP PCL-compatible printers:
#!/bin/sh # # hpof - Uitvoerfilter voor HP PCL-compatible printers # Geïnstalleerd in /usr/local/libexec/hpof printf "\033&k2G" || exit 2 exec /usr/libexec/lpr/lpf
Geef de locatie van het uitvoerfilter op met de optie of. Zie Uitvoerfilters voor meer informatie.
Hier is een voorbeeldbestand /etc/printcap voor de printer teak die eerder is geïntroduceerd;. Het afdrukken van voorbladen is geactiveerd en bovenstaande uitvoerfilter is toegevoegd:
#
# /etc/printcap voor host orchid
#
teak|hp|laserjet|HP LaserJet 3Si:\
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:\
:vf=/usr/local/libexec/hpvf:\
:of=/usr/local/libexec/hpof:
Als gebruikers nu een opdracht sturen naar teak, wordt
er bij elke opdracht een voorblad afgedrukt. Als gebruikers liever willen zoeken
naar hun afdrukken, dan kunnen ze de voorbladen onderdrukken door de opdracht
te geven met het commando lpr -h. Zie Voorbladopties voor meer opties voor lpr(1).
Opmerking: LPD drukt een karakter voor pagina-einde af na elk voorblad. Als een printer een ander teken of sequentie gebruikt voor het beëindigen van een pagina, dan kan dit opgeven worden met de optie ff in /etc/printcap.
Door het afdrukken van voorbladen aan te zetten, produceert LPD een lang voorblad waarop in grote letters de gebruiker, host en opdracht te lezen zijn. Hier volgt een voorbeeld (kelly heeft de opdracht “outline” afgedrukt vanaf host rose):
k ll ll
k l l
k l l
k k eeee l l y y
k k e e l l y y
k k eeeeee l l y y
kk k e l l y y
k k e e l l y yy
k k eeee lll lll yyy y
y
y y
yyyy
ll
t l i
t l
oooo u u ttttt l ii n nnn eeee
o o u u t l i nn n e e
o o u u t l i n n eeeeee
o o u u t l i n n e
o o u uu t t l i n n e e
oooo uuu u tt lll iii n n eeee
r rrr oooo ssss eeee
rr r o o s s e e
r o o ss eeeeee
r o o ss e
r o o s s e e
r oooo ssss eeee
Job: outline
Date: Sun Sep 17 11:04:58 1995
LPD geeft een paginabegin na deze tekst, zodat de opdracht op een nieuwe pagina begint (tenzij de optie sf (suppress form feeds, “onderdruk paginabegin”) is toegevoegd bij de desbetreffende printer in /etc/printcap).
Als dit wenselijk is, kan LPD ook een korte tekst op het voorblad afdrukken; geef hiervoor de optie sb (short banner, “kort voorblad”) op in het bestand /etc/printcap. Het voorblad ziet er dan als volgt uit:
rose:kelly Job: outline Date: Sun Sep 17 11:07:51 1995
Standaard drukt LPD het voorblad als eerste af en vervolgens de opdracht. Om dat om te keren, moet de optie hl (header last, “voorblad laatst”) in /etc/printcap worden opgeven.
Het gebruik van LPD's ingebouwde voorbladen dwingt een bepaald paradigma af wat betreft het administreren van printergebruik: voorbladen moeten gratis zijn.
Waarom?
Omdat het uitvoerfilter het enige externe programma is dat controle heeft als
het voorblad afgedrukt wordt dat het gebruik zou kunnen administreren. Het heeft
echter geen beschikking over informatie over gebruiker of host of een administratiebestand. Het
heeft dus geen idee wie voor het gebruik moet worden belast. Het volstaat ook
niet om gewoon “het aantal pagina's met één op te hogen”
door het tekstfilter of een van de conversiefilters (dat wel beschikt over
gebruiker- en hostinformatie) te veranderen, omdat gebruikers het afdrukken van een
voorblad kunnen onderdrukken met lpr -h. Ze worden dan aangeslagen voor voorbladen die niet
zijn afgedrukt. Milieubewuste gebruikers gebruiken vast lpr -h, maar dit kan niet worden
afgedwongen.
Het is ook niet voldoende om elk
filter zijn eigen voorblad te laten genereren (om zo het gebruik te kunnen
administreren). Als gebruikers het afdrukken van voorbladen willen onderdrukken met
lpr -h, krijgen ze toch
een voorblad en worden er ook voor belast, aangezien LPD
geen kennis over de optie -h doorgeeft aan de
filters.
Wat zijn dan de mogelijkheden?
Accepteer het paradigma van LPD en maak voorbladen gratis;
Installeer een alternatief voor LPD, zoals LPRng. In Alternatieven voor het standaard wachtrijsysteem staat meer over andere afdruksoftware die in plaats van LPD geïnstalleerd kan worden;
Schrijf een slim uitvoerfilter. Gewoonlijk is een uitvoerfilter bedoeld om niet meer te doen dan het initialiseren van een printer of wat eenvoudige karakterconversie. Het is geschikt voor voorbladen en opdrachten met platte tekst (als er een tekstfilter is). Maar als er een tekstfilter is voor opdrachten met platte tekst, dan start LPD het uitvoerfilter alleen voor voorbladen. Het uitvoerfilter kan dan het voorblad dat LPD genereert analyseren om te bepalen welke gebruiker en host belast moeten worden voor het afdrukken van het voorblad. Het enige probleem is dat het uitvoerfilter nog steeds niet weet in welk bestand het gebruik moet worden bijgehouden (de naam van het bestand opgegeven in de af wordt niet meegegeven), maar als een bekend bestand gebruikt wordt, kan dit in het uitvoerfilter worden opgeven. Om het parsen af te handelen kan gebruik gemaakt worden van de optie sh (short header, “kort voorblad”) in /etc/printcap. Dit kan echter wat omslachtig zijn en gebruikers waarderen zeker de meer gulle systeembeheerder die voorbladen gratis maakt.
Zoals hierboven beschreven, kan LPD een voorblad in platte tekst genereren, dat geschikt is voor de meeste printers. Natuurlijk kan PostScript platte tekst niet direct afdrukken, zodat de voorbladfunctie van LPD nutteloos is.
Een voor de hand liggende manier om voorbladen te krijgen, is elk
conversiefilter en tekstfilter zijn eigen voorblad te laten genereren. De filters
moeten gebruik maken van de argumenten gebruiker en host om een geschikt voorblad
te genereren. Het nadeel van deze methode is dat gebruikers altijd een
voorblad krijgen, ook wanneer zij een opdracht geven met lpr
-h.
Deze methode wordt nader beschreven. Het volgende script heeft drie argumenten (gebruikersnaam, hostnaam en de naam van de opdracht) en maakt een eenvoudig PostScript-voorblad:
#!/bin/sh
#
# make-ps-header - genereer een PostScript-voorblad op stdout
# Geïnstalleerd in /usr/local/libexec/make-ps-header
#
#
# Dit zijn PostScript-eenheden (72 in een inch). Pas dit aan voor A4
# of het gebruikte formaat:
#
page_width=612
page_height=792
border=72
#
# Controleer argumenten
#
if [ $# -ne 3 ]; then
echo "Usage: `basename $0` <user> <host> <job>" 1>&2
exit 1
fi
#
# Bewaar deze, voornamelijk voor de leesbaarheid in de PostScript-code.
#
user=$1
host=$2
job=$3
date=`date`
#
# Stuur de PostScript-code naar stdout.
#
exec cat <<EOF
%!PS
%
% Vermijd conflicten met de opdracht van de gebruiker die volgt.
%
save
%
% Maak een dikke, onaangename border in de marge van het papier.
%
$border $border moveto
$page_width $border 2 mul sub 0 rlineto
0 $page_height $border 2 mul sub rlineto
currentscreen 3 -1 roll pop 100 3 1 roll setscreen
$border 2 mul $page_width sub 0 rlineto closepath
0.8 setgray 10 setlinewidth stroke 0 setgray
%
% Toon de gebruikersnaam duidelijk, groot en prominent
%
/Helvetica-Bold findfont 64 scalefont setfont
$page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto
($user) show
%
% Nu volgen de saaie bijzonderheden
%
/Helvetica findfont 14 scalefont setfont
/y 200 def
[ (Job:) (Host:) (Date:) ] {
200 y moveto show /y y 18 sub def }
forall
/Helvetica-Bold findfont 14 scalefont setfont
/y 200 def
[ ($job) ($host) ($date) ] {
270 y moveto show /y y 18 sub def
} forall
%
% Dat is alles
%
restore
showpage
EOF
Nu kan zowel het conversiefilter als het tekstfilter dit script aanroepen om eerst een voorblad te genereren en vervolgens de opdracht van de gebruiker af te drukken. Hier volgt het eerder gebruikte DVI-conversieprogramma, aangepast om een voorblad te maken:
#!/bin/sh
#
# psdf - DVI naar PostScript printfilter
# Geïnstalleerd in /usr/local/libexec/psdf
#
# Aangeroepen door lpd, wanneer de gebruiker lpr -d uitvoert
#
orig_args="$@"
fail() {
echo "$@" 1>&2
exit 2
}
while getopts "x:y:n:h:" option; do
case $option in
x|y) ;; # Ignore
n) login=$OPTARG ;;
h) host=$OPTARG ;;
*) echo "LPD started `basename $0` wrong." 1>&2
exit 2
;;
esac
done
[ "$login" ] || fail "No login name"
[ "$host" ] || fail "No host name"
( /usr/local/libexec/make-ps-header $login $host "DVI File"
/usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args
Merk op hoe het filter eerst de argumentenlijst moet nagaan om te bepalen wat de gebruikers- en hostnaam zijn. Dit is gelijk voor de andere conversiefilters. Het tekstfilter heeft echter een andere verzameling argumenten (zie Hoe filters werken).
Zoals eerder is beschreven, is het in bovenstaande opzet, hoewel deze simpel is,
niet mogelijk “voorbladen te onderdrukken” (de optie -h in lpr). Als gebruikers een boom
willen sparen (of een paar centen bij betaalde voorbladen) dan is dit dus
niet mogelijk, aangezien elk filter een voorblad afdrukt voor iedere opdracht.
Om gebruikers in staat te stellen per opdracht voorbladen te onderdrukken, moet
gebruik gemaakt worden van de truc uit Voorbladen administreren:
schrijf een uitvoerfilter dat het door LPD gegenereerde voorblad inleest en een
PostScript-versie genereert. Als de gebruiker de
opdracht geeft met lpr -h, dan
genereert LPD geen voorblad en het uitvoerfilter
ook niet. Anders leest het uitvoerfilter de tekst van LPD in en stuurt een geschikt voorblad in PostScript naar de printer.
Voor een PostScript-printer op een seriële lijn kan gebruik gemaakt worden van lprps, dat met een uitvoerfilter wordt geleverd en het bovenstaande kan doen. Voorbladen worden door psof niet geteld.
FreeBSD ondersteunt afdrukken via het netwerk: het sturen van opdrachten naar printers op afstand. Afdrukken via een netwerk betekent over het algemeen twee verschillende dingen:
Het benaderen van een printer aangesloten op een andere computer. Een printer met een conventionele seriële of parallelle verbinding wordt op een bepaalde computer geïnstalleerd. Vervolgens wordt LPD zodanig ingesteld dat afdrukken vanaf andere computers in het netwerk mogelijk is. In Printers geïnstalleerd op andere hosts staat hoe dit te doen.
Het benaderen van een printer die direct is aangesloten op een netwerk. Een printer heeft een netwerkinterface naast (of in plaats van) een gewone seriële of parallelle poort. Zo een printer kan als volgt werken:
Het begrijpt het LPD protocol en kan zelfs opdrachten van andere hosts in de wachtrij plaatsen. In dit geval werkt een printer als een gewone host die LPD heeft draaien. Volg de procedure in Printers geïnstalleerd op andere hosts om een dergelijke printer te installeren
Het kan zijn dat een printer een netwerkverbinding ondersteunt. In dit geval kan een printer worden “aangesloten” op een bepaalde host op het netwerk door deze host verantwoordelijk te maken voor het plaatsen van opdrachten in een wachtrij en het versturen van opdrachten naar de printer. In Printers met netwerkinterfaces staan enkele suggesties om zulke printers te installeren.
Het wachtrijsysteem LPD heeft een ingebouwde mogelijkheid om opdrachten naar andere hosts te sturen die ook LPD draaien (of een systeem dat compatibel is met LPD). Deze eigenschap maakt het mogelijk om een printer op een host te installeren en deze toegankelijk te maken voor andere hosts. Het werkt ook met printers die over een netwerkinterface beschikken en het LPD-protocol begrijpen.
Om dit soort afdrukken op afstand mogelijk te maken, moet een printer eerst op een host geïnstalleerd worden, de printerhost, door de printerinstallatie te volgen als beschreven in Eenvoudige printerinstallatie. Stel desgewenst de printer in voor geavanceerde taken volgens Geavanceerde printerinstallatie. Test de printer en controleer of deze werkt met eventueel speciaal ingestelde opties voor LPD. De lokale host moet geautoriseerd zijn om de LPD-dienst op de verre host te gebruiken (zie Opdrachten van hosts op afstand beperken).
Als een printer een netwerkinterface heeft die compatibel is met LPD, dan is de printerhost in onderstaande beschrijving de printer zelf en de printernaam is de naam die voor de printer is ingesteld. Meer informatie staat in de documentatie bij de printer en/of de printernetwerkinterface.
Tip: Bij een HP LaserJet voert de printernaam text automatisch de CRLF-conversie uit. Het is dan niet nodig het script hpif te gebruiken.
Op hosts die toegang moeten krijgen tot de printer, moet in /etc/printcap een regel worden toegevoegd met het volgende:
Geef de regel een willekeurige naam. Om het eenvoudig te houden kunnen wellicht het beste dezelfde namen en aliassen worden gebruikt als op de printerhost;
Laat de optie lp expliciet leeg (:lp=:);
Maak een wachtrijmap aan en geef de locatie op met de optie sd. LPD slaat hier afdrukopdrachten op alvorens ze naar de printerhost te sturen;
Geef de naam van de printerhost op met de optie rm;
Geef de naam van de printer op de printerhost op met de optie rp.
Dit is het. Conversiefilters, paginadimensies, enzovoort, hoeven niet in /etc/printcap opgegeven te worden.
Hier volgt een voorbeeld. De host rose heeft twee printers: bamboo en rattan. Gebruikers op de host orchid krijgen toegang tot deze printers. Hier volgt /etc/printcap voor orchid (uit Voorbladen afdrukken). Er stond in het bestand al een regel voor de printer teak. Voor de twee printers op de host rose zijn twee regels toegevoegd:
#
# /etc/printcap voor host orchid - printers (op afstand) op rose toegevoegd
#
#
# teak is lokaal; het is direct aangesloten op orchid:
#
teak|hp|laserjet|HP LaserJet 3Si:\
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/ifhp:\
:vf=/usr/local/libexec/vfhp:\
:of=/usr/local/libexec/ofhp:
#
# rattan is aangesloten op rose; stuur opdrachten voor rattan naar rose:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:
#
# bamboo is ook aangesloten op rose:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:
Op orchid moeten wachtrijmappen worden aangemaakt:
# mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo
# chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo
# chown daemon:daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo
Nu kunnen gebruikers op orchid afdrukken op rattan en bamboo. Een gebruiker op orchid geeft bijvoorbeeld de volgende invoer:
% lpr-Pbamboo-dsushi-review.dvi
Dan kopieert LPD op orchid de opdracht naar de wachtrijmap /var/spool/lpd/bamboo en ziet dat het een DVI-opdracht is. Zodra de host rose ruimte heeft in zijn wachtrijmap bamboo, sturen de twee LPD's het bestand naar rose. Het bestand wacht in de wachtrij van rose totdat het succesvol is afgedrukt. Het wordt geconverteerd naar PostScript (aangezien bamboo een PostScript-printer is) op rose.
Netwerkkaarten voor printers zijn er in twee versies: een versie die een wachtrij nabootst (de duurdere versies), of versies die alleen de mogelijkheid geven om er informatie naar te sturen alsof het een seriële of parallelle poort is (de goedkopere versies). In Printers geïnstalleerd op andere hosts wordt het voor de duurdere beschreven.
Het formaat van /etc/printcap maakt het mogelijk om op te geven welke seriële, of parallelle poort gebruikt moet worden en (in geval van een seriële poort) de baud-snelheid, of er communicatie moet worden toegepast, vertragingen voor tabs, conversies voor nieuwe regelkarakters en meer. Er is geen mogelijkheid om een verbinding met een printer op te geven die op een TCP/IP of andere netwerkpoort luistert.
Om informatie naar een netwerkprinter te sturen, is het nodig een programma te ontwikkelen dat door tekst- en conversiefilters kan worden aangeroepen. Hier volgt een voorbeeld: het script netprint stuurt alle informatie van de standaard invoer naar een netwerkprinter. Als eerste argument wordt de hostnaam van de printer opgegeven en als tweede argument het poortnummer waarmee de verbinding moet worden opgezet. Er wordt alleen eenrichtingcommunicatie ondersteund (FreeBSD naar printer). Veel netwerkprinters ondersteunen tweewegcommunicatie. Het kan wenselijk zijn hiervan gebruik te maken (om printerstatus op te vragen, statistieken bij te houden, enzovoort).
#!/usr/bin/perl
#
# netprint - Tekstfilter voor printer aangesloten op het netwerk
# Geïnstalleerd in /usr/local/libexec/netprint
#
$#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>";
$printer_host = $ARGV[0];
$printer_port = $ARGV[1];
require 'sys/socket.ph';
($ignore, $ignore, $protocol) = getprotobyname('tcp');
($ignore, $ignore, $ignore, $ignore, $address)
= gethostbyname($printer_host);
$sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address);
socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)
|| die "Can't create TCP/IP stream socket: $!";
connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
while (<STDIN>) { print PRINTER; }
exit 0;
Dit script kan vervolgens in verschillende filters gebruikt worden. Stel dat een Diablo 750-N matrixprinter op het netwerk is aangesloten. Op poort 5100 accepteert de printer informatie om af te drukken. De hostnaam van de printer is scrivener. Hier volgt het tekstfilter voor de printer:
#!/bin/sh # # diablo-if-net - Tekstfilter voor Diablo printer 'scrivener' luistert # op poort 5100. Geïnstalleerd in /usr/local/libexec/diablo-if-net # exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100
Nu volgt informatie over het beperken van printergebruik. Het LPD-systeem maakt het mogelijk te bepalen wie er toegang heeft tot een printer, zowel lokaal als op afstand, of meerdere kopieën afgedrukt mogen worden, hoe lang opdrachten mogen zijn en hoe lang wachtrijen mogen worden.
Het LPD systeem maakt het heel makkelijk voor
gebruikers om meerdere afdrukken van een bestand te maken. Gebruikers kunnen
opdrachten afdrukken met bijvoorbeeld lpr -#5 en krijgen dan vijf kopieën van elk bestand in
de opdracht. De systeembeheerder kan beslissen of dit wenselijk is.
Wanneer meerdere kopieën onwenselijk zijn, kan de optie -# van lpr(1) worden
uitgeschakeld door de optie sc in /etc/printcap op te nemen. Als gebruikers opdrachten
versturen met de optie -#, zien ze het volgende:
lpr: multiple copies are not allowed
Als het mogelijk is van andere hosts af te drukken (zie Printers geïnstalleerd op andere hosts), moet de optie sc ook in /etc/printcap van de andere hosts aanwezig zijn. Anders kunnen gebruikers nog steeds multi-kopie opdrachten van andere hosts sturen.
Hier volgt een voorbeeld. Hieronder staat /etc/printcap voor de host rose. De printer rattan is redelijk krachtig, dus meerdere kopieën zijn toegestaan. De laserprinter bamboo is wat gevoeliger, dus meerdere kopieë zijn uitgeschakeld door de optie sc toe te voegen:
#
# /etc/printcap voor host rose - beperk meerdere kopieën op bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:\
:lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
Nu moet ook de optie sc worden toegevoegd in /etc/printcap van host orchid (tegelijk worden meerdere kopieën voor de printer teak uitgeschakeld):
#
# /etc/printcap voor host orchid - geen meerdere kopieën voor lokale
# printer teak of printer op afstand bamboo
teak|hp|laserjet|HP LaserJet 3Si:\
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\
:if=/usr/local/libexec/ifhp:\
:vf=/usr/local/libexec/vfhp:\
:of=/usr/local/libexec/ofhp:
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc:
Door de optie sc te gebruiken, wordt het gebruik van
lpr -#i voorkomen, maar dat
weerhoudt gebruikers er nog steeds niet van om lpr(1) meerdere keren
te aanroepen of meerdere keren hetzelfde bestand te versturen in een opdracht:
% lpr voorverkoop.teken voorverkoop.teken voorverkoop.teken voorverkoop.teken voorverkoop.teken
Er zijn vele manieren om dit misbruik te voorkomen (onder andere door het te negeren), welke vrij zijn om te verkennen.
Door gebruik te maken van het UNIX groepmechanisme en de optie rg in /etc/printcap kan geregeld worden wie er op welke printer kan afdrukken. De gebruikers die toegang hebben tot een printer moeten in een groep worden geplaatst en deze groep moet in de optie rg worden genoemd.
Als gebruikers buiten de groep (inclusief root) naar de beheerde printer proberen te printen, worden ze begroet met het volgende bericht:
lpr: Not a member of the restricted group
Net als met de optie sc (suppress multiple copies: onderdruk meerdere kopieën) moet rg, indien wenselijk, ook op andere hosts worden opgegeven die ook toegang hebben tot printers (zie Printers geïnstalleerd op andere hosts).
In het volgende voorbeeld heeft iedereen toegang tot de printer rattan, maar alleen gebruikers in de groep artists kunnen gebruik maken van bamboo. Hier volgt het bekende /etc/printcap voor de host rose:
#
# /etc/printcap voor host rose - beperkte toegang voor groep bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:\
:lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
De andere voorbeeldbestanden /etc/printcap (voor de host orchid) worden niet aangepast. Natuurlijk kan iedereen op orchid afdrukken op bamboo. Het kan zijn dat er sowieso alleen bepaalde gebruikers op orchid zijn toegestaan en dat deze gebruikers toegang mogen hebben tot de printer. Of wellicht niet.
Opmerking: Er kan per printer slechts één groep worden opgegeven.
Als veel gebruikers toegang hebben tot printers kan het nodig zijn een limiet op te geven voor de grootte van de bestanden die gebruikers naar een printer kunnen sturen. Er is immers slechts beperkte ruimte op het bestandssysteem en er moet ook voldoende ruimte zijn voor opdrachten van andere gebruikers.
LPD heeft de mogelijkheid om met de optie mx een limiet op te geven voor het maximum aantal bytes van een bestand in een afdrukopdracht. De eenheden worden opgegeven in BUFSIZ blokken, die 1024 bytes groot zijn. Een nul voor deze optie betekent geen limiet aan de bestandsgrootte. Als de optie wordt weggelaten, wordt een standaardlimiet van 1000 blokken gebruikt.
Opmerking: De limiet heeft betrekking op de bestanden in een opdracht, niet op de totale grootte van een opdracht.
LPD weigert een bestand dat groter is dan de opgegeven limiet niet. In plaats daarvan plaatst het zo veel mogelijk van het bestand op de wachtrij, om dit vervolgens af te drukken. De rest wordt genegeerd. Of dit gedrag wenselijk is, is onderwerp van debat.
Nu worden limieten voor de voorbeeldprinters rattan en bamboo opgegeven. Aangezien de PostScript-bestanden van die artists nogal groot kunnen worden, krijgen ze een limiet van vijf megabyte opgelegd. Er wordt geen limiet opgelegd voor de platte tekst printer:
#
# /etc/printcap voor host rose
#
#
# Geen limiet op opdrachtgrootte:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:mx#0:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
#
# Limiet van vijf megabyte:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
:lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
Ook hier zijn de limieten alleen van toepassing op lokale gebruikers. Als toegang tot deze printers van andere hosts mogelijk is, worden deze gebruikers niet beperkt. Het is daarom nodig de optie mx ook in de /etc/printcap van de betreffende hosts op te geven. In Printers geïnstalleerd op andere hosts staat meer informatie over afdrukken op andere hosts.
Er is een andere gespecialiseerde manier om opdrachtgrootte voor printers op afstand te beperken (zie Opdrachten van hosts op afstand beperken.
Het wachtrijsysteem LPD beschikt over verschillende methoden om afdrukopdrachten van hosts op afstand te beperken:
Met de bestanden /etc/hosts.equiv en /etc/hosts.lpd kan worden ingesteld van welke hosts op afstand een lokale LPD-opdracht wordt geaccepteerd. LPD controleert of een inkomend verzoek afkomstig is van een host die wordt genoemd in een van deze bestanden. Zo niet, dan weigert LPD het verzoek.
Het formaat van deze bestanden is eenvoudig: één host per regel. /etc/hosts.equiv wordt ook gebruikt door het protocol ruserok(3) en heeft invloed op programma's als rsh(1) en rcp(1). Voorzichtigheid is dus geboden.
Als voorbeeld volgt hier /etc/hosts.lpd voor de host rose:
orchid violet madrigal.fishbaum.de
Dit betekent dat rose verzoeken accepteert van de hosts orchid, violet en madrigal.fishbaum.de. Voor iedere andere host die verbinding probeert te maken met LPD op rose, wordt de opdracht geweigerd.
De hoeveelheid vrije ruimte die over moet blijven op een bestandssysteem waar een wachtrij zich bevindt kan ook worden ingesteld. Hiervoor moet een bestand met de naam minfree in de wachtrijmap worden aangemaakt. In dit bestand kan een getal worden gezet dat het aantal schijfblokken (512 bytes) aan vrije ruimte aangeeft dat beschikbaar moet blijven wil een opdracht worden geaccepteerd.
Hiermee kan worden gegarandeerd dat gebruikers op afstand een bestandssysteem niet vol kunnen schrijven. Ook kan hierdoor een soort voorrang worden gegeven aan lokale gebruikers: zij kunnen nog opdrachten plaatsen als de vrije schijfruimte al lang beneden de opgegeven limiet uit minfree is gekomen.
Als voorbeeld wordt een bestand minfree voor de printer bamboo toegevoegd. In /etc/printcap staat de juiste wachtrijmap:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
:lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:rw:mx#5000:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
De wachtrijmap wordt opgegeven met de optie sd. Er wordt een limiet van drie megabyte ingesteld (wat gelijk staat aan 6144 schijfblokken) voor de hoeveelheid vrije schijfruimte die op het bestandssysteem beschikbaar moet zijn voordat LPD een opdracht op afstand accepteert:
# echo 6144 > /var/spool/lpd/bamboo/minfree
Met de optie rs in /etc/printcap kan worden geregeld welke gebruikers op afstand kunnen afdrukken op lokale printers. Als rs voorkomt voor een lokale printer accepteert LPD opdrachten van hosts op afstand als de gebruiker die de opdracht wil plaatsen ook een account heeft met dezelfde gebruikersnaam op de lokale host. Anders weigert LPD de opdracht.
Deze optie is met name nuttig in een omgeving waar (bijvoorbeeld) verschillende afdelingen een netwerk delen en gebruikers de grenzen van de afdeling overschrijden. Door ze een account te geven op een systeem kunnen ze de aangesloten printers gebruiken vanaf het systeem van hun eigen afdeling. Wanneer ze alleen gebruik mogen maken van de printers en niet van overige diensten op de computer, kunnen “tokenaccounts” worden aangemaakt, zonder thuismap en met een nutteloze shell als /usr/bin/false.
Het kan nodig zijn om afdrukken te doorbelasten. Inkt en papier kosten geld en er zijn onderhoudskosten. Printers zitten vol met bewegende delen en hebben de neiging kapot te gaan. Nu is er gekeken naar de printers, het gebruikerspatroon en de onderhoudskosten en op basis hiervan is een prijs vastgesteld per pagina (of per centimeter, per meter, of per wat dan ook). Hoe wordt nu een administratie bijgehouden van gemaakte afdrukken?
Het slechte nieuws is dat het wachtrijsysteem LPD hierbij niet echt helpt. Het administreren van afdrukken is erg afhankelijk van het type printer, het afdrukformaat en de wensen die een systeembeheerder heeft ten aanzien van het doorbelasten van printergebruik.
Om het administreren te implementeren, is het nodig om aanpassingen te maken in de tekstfilter (om platte tekst opdrachten te belasten) en de conversiefilters (om opdrachten in andere bestandsformaten te belasten), om pagina's te tellen, of de printer te vragen hoeveel pagina's er zijn afgedrukt. Het volstaat niet om het eenvoudige uitvoerfilter te gebruiken, aangezien dit niet in staat is het gebruik te administreren. Zie Filters.
In het algemeen zijn er twee manieren om gebruik te administreren:
Periodiek administreren is de meer gebruikelijke manier, omdat het waarschijnlijk makkelijker is. Als iemand een opdracht afdrukt, schrijft het filter de gebruiker, host en het aantal pagina's in een administratiebestand. Elke maand, semester, jaar, of een andere gewenste periode kunnen de administratiebestanden verzameld worden om het aantal afgedrukte pagina's op te tellen en het gebruik in rekening te brengen. De logboekbestanden kunnen vervolgens geschoond worden, zodat met een schone lei de volgende periode begonnen kan worden.
Directe administratie is minder gebruikelijk, waarschijnlijk omdat het moeilijker is. Met deze methode zorgen de filters ervoor dat gebruikers voor hun printergebruik worden afgerekend op het moment dat ze er gebruik van maken. Net als schijfquota is de administratie onmiddellijk. Hiermee wordt voorkomen dat gebruikers kunnen afdrukken wanneer ze over hun limiet zijn gegaan. Ook biedt dit de mogelijkheid voor gebruikers om hun afdrukquotum te controleren, of aan te passen. Deze methode vereist databasecode om gebruikers en hun quota bij te houden.
Het wachtrijsysteem LPD ondersteunt beide methoden op eenvoudige wijze. Aangezien de filters (meestal) moeten worden aangeleverd, moet ook de code voor de administratie worden geleverd. Er is echter een voordeel: er is grote flexibiliteit in de administratiemethode. Zo kan bijvoorbeeld gekozen worden tussen periodieke of directe administratie. Er kan gekozen worden welke informatie opgeslagen wordt: gebruikersnamen, hostnamen, type opdracht, aantal afgedrukte pagina's, hoe lang het afdrukken duurde, enzovoort. Dit alles kan worden gedaan door de filters aan te passen.
FreeBSD wordt met twee programma's geleverd waarmee periodieke administratie direct kan worden opgezet. Het zijn het tekstfilter lpf, beschreven in lpf: een tekstfilter en pac(8), een programma dat posten uit administratiebestanden verzamelt en optelt.
Zoals beschreven in de sectie over filters (Filters), roept LPD de tekst- en conversiefilters aan met de naam van het administratiebestand als argument. De filters kunnen dit argument gebruiken om te bepalen in welk bestand de gegevens voor de administratie moeten worden weggeschreven. De naam van dit bestand is afkomstig van de optie af uit /etc/printcap. Als er geen absoluut pad wordt opgegeven, dan is de locatie relatief aan de wachtrijmap.
LPD start lpf met paginabreedte en -lengte argumenten (afkomstig uit de opties pw en pl). Het filter lpf gebruikt deze argumenten om te bepalen hoeveel papier er gebruikt zal worden. Nadat het bestand naar de printer is gestuurd, schrijft het een post in het administratiebestand. De posten zien er als volgt uit:
2.00 rose:andy 3.00 rose:kelly 3.00 orchid:mary 5.00 orchid:mary 2.00 orchid:zhang
Aangezien lpf geen ingebouwde logica voor bestandslocking kent, moet voor elke printer een apart administratiebestand gebruikt worden. Twee lpfs kunnen elkaars posten corrumperen als ze tegelijk in hetzelfde bestand schrijven. De optie af=acct in /etc/printcap biedt een makkelijke manier om er zeker van te zijn dat aparte bestanden worden gebruikt. Dan bevindt elk administratiebestand zich in de wachtrijmap van de betreffende printer en krijgt de naam acct krijgen
Wanneer het tijd is om met gebruikers af te rekenen voor hun afdrukken, kan het programma pac(8) gedraaid worden. Ga naar de wachtrijmap van de printer waarvoor betaald moet worden en typ pac. Er verschijnt een dollar-centrische samenvatting zoals het volgende:
Login pages/feet runs price orchid:kelly 5.00 1 $ 0.10 orchid:mary 31.00 3 $ 0.62 orchid:zhang 9.00 1 $ 0.18 rose:andy 2.00 1 $ 0.04 rose:kelly 177.00 104 $ 3.54 rose:mary 87.00 32 $ 1.74 rose:root 26.00 12 $ 0.52 total 337.00 154 $ 6.74
Dit zijn de argumenten die pac(8) verwacht:
-PprinterDe printer waarvoor een samenvatting moet worden gegenereerd. Deze optie werkt alleen als er een absoluut pad is gegeven in de optie af in /etc/printcap.
-cSorteer de uitvoer op kosten, in plaats van alfabetisch op gebruikersnaam.
-mNegeer de hostnamen in het administratiebestand. Met deze optie is de gebruiker smith op host alpha dezelfde gebruiker als smith op host gamma. Zonder deze optie zijn het verschillende gebruikers.
-pprijsBereken de prijs met prijs dollar per pagina of per voet, in plaats van de prijs uit de optie pc in /etc/printcap of twee cent (de standaard). De prijs kan worden opgegeven als een decimaal getal.
-rKeer de sorteervolgorde om.
-sMaak een bestand met een samenvatting van de administratie en leeg het administratiebestand.
Druk de administratiegegevens alleen af voor gebruikersnamen namen.
In de standaard samenvatting die pac(8) genereert,
is het aantal pagina's te zien dat iedere gebruiker vanaf een bepaalde host
heeft afgedrukt. Wanneer de hostnaam niet van belang is (bijvoorbeeld omdat
gebruikers iedere host kunnen gebruiken), gebruik dan pac
-m om de volgende samenvatting te genereren:
Login pages/feet runs price andy 2.00 1 $ 0.04 kelly 182.00 105 $ 3.64 mary 118.00 35 $ 2.36 root 26.00 12 $ 0.52 zhang 9.00 1 $ 0.18 total 337.00 154 $ 6.74
Om het verschuldigde bedrag te berekenen gebruikt pac(8) de optie pc uit /etc/printcap (standaard
aantal van 200 of 2 cent per pagina). Specificeer, in honderden centen, de
prijs per pagina of per voet die berekent moet worden. Deze waarde kan worden
aangepast door pac(8) aan te
roepen met de optie -p. De eenheden van de optie -p zijn echter in dollars, niet in honderden centen.
Bijvoorbeeld,
# pac -p1.50
zorgt ervoor dat elke pagina 1,50 dollar kost. U kunt echt grote winsten maken met deze optie.
Tenslotte kan met pac -s de
samenvatting worden opgeslagen in een bestand dat dezelfde naam krijgt als het
administratiebestand van de printer, maar dan met _sum toegevoegd aan de naam. Vervolgens wordt het
administratiebestand geleegd. Als pac(8) opnieuw
wordt aangeroepen, herleest pac(8) het
samenvattingsbestand om de startwaarden te bepalen en telt daar de informatie bij
op van het standaard administratiebestand.
Om ook maar de minste nauwkeurigheid bij het administreren te verkrijgen, is het nodig te weten hoeveel papier een afdrukopdracht gebruikt. Dit is het centrale probleem van het bijhouden van printerstatistieken.
Voor opdrachten met platte tekst is het probleem niet zo moeilijk op te lossen: het aantal regels in een opdracht wordt geteld en vergeleken met het aantal regels per pagina dat door een printer wordt ondersteund. Hierbij moet niet worden vergeten dat backspaces in het bestand regels overschrijven en dat lange logische regels worden afgedrukt als meerdere fysieke regels.
Het tekstfilter lpf (geïntroduceerd in lpf: een tekstfilter) houdt met deze zaken rekening bij het administreren. Als het nodig is een tekstfilter te schrijven dat ook het printergebruik moet bijhouden, dan is het nuttig de broncode van lpf te bestuderen.
Hoe worden andere bestandsformaten dan verwerkt?
Voor een DVI-naar-LaserJet, of DVI-naar-PostScript conversie kan het filter de diagnostische uitvoer van dvilj of dvips bekijken om te bepalen hoeveel pagina's er zijn geconverteerd. Voor andere formaten kan hetzelfde worden gedaan met behulp van de betreffende conversieprogramma's.
Deze methoden hebben echter als nadeel dat een printer eventueel niet alle pagina's ook daadwerkelijk afdrukt. Zo kan het papier vast komen te zitten, de toner opraken of de printer ontploffen, terwijl de gebruiker toch moet betalen.
Dus, wat kan hieraan worden gedaan?
Er is slechts één betrouwbare manier om nauwkeurig te administreren. Dat is met behulp van een printer die kan vertellen hoeveel papier er is gebruikt. Deze moet vervolgens worden aangesloten met een seriële lijn, of een netwerkverbinding. Bijna alle PostScript-printers hebben deze mogelijkheid, andere modellen en merken mogelijk ook (bijvoorbeeld Imagen netwerklaserprinters). De filters dienen voor deze printers aangepast te worden om het papierverbruik na elke opdracht te achterhalen en de administratieve informatie alleen op deze waarde te baseren. Er is geen noodzaak om foutgevoelig regels te tellen of bestanden te analyseren.
Natuurlijk kan een beheerder ook vrijgevig zijn en alle afdrukken gratis maken.
Hieronder wordt beschreven hoe printers die onder FreeBSD geïnstalleerd zijn gebruikt moeten worden. Nu volgt een overzicht van de commando's op gebruikersniveau:
Er is ook een administratief commando, lpc(8), beschreven in Printers beheren, dat gebruikt wordt om printers en hun wachtrijen in te stellen.
Alledrie de commando's lpr(1), lprm(1) en lpq(1) accepteren een
optie -Pprinternaam om
aan te geven op welke printer uit /etc/printcap een opdracht
van toepassing is. Dit biedt de mogelijkheid opdrachten te versturen, verwijderen en
controleren voor verschillende printers. Als -P niet wordt
gebruikt, werken deze commando's op de printer gedefinieerd in de omgevingsvariabele PRINTER. Tot slot, wanneer de omgevingsvariabele PRINTER niet is gedefinieerd, wordt standaard verwezen naar de printer
met de naam lp.
Om bestanden af te drukken:
% lpr bestandsnaam ...
Dit drukt elk van de opgegeven bestanden af op de standaard printer. Als geen bestanden worden opgegeven, drukt lpr(1) de standaard invoer af. De volgende opdracht drukt bijvoorbeeld een paar belangrijke systeembestanden af:
% lpr /etc/host.conf /etc/hosts.equiv
Om een specifieke printer te selecteren:
% lpr -P printernaam bestandsnaam ...
Dit voorbeeld drukt een lange opgave van de huidige map af op de printer rattan:
% ls-l| lpr-Prattan
Omdat er geen bestanden worden meegegeven aan het commando lpr(1), drukt lpr de gegevens af die het van de standaard invoer leest: de
uitvoer van het commando ls -l.
lpr(1) accepteert ook een breed scala aan opties om de vorm aan te passen, bestandsconversies toe te passen, meerdere kopieën af te drukken, enzovoort. Meer informatie staat in Afdrukopties.
Als lpr(1) wordt gebruikt om af te drukken, dan worden de gegevens die afdrukt moet worden in een pakketje samengevoegd dat een “afdrukopdracht” wordt genoemd en naar het wachtrijsysteem LPD gestuurd. Elke printer heeft een wachtrij met opdrachten van alle gebruikers. Een printer drukt deze opdrachten op volgorde van binnenkomst af.
De wachtrij voor de standaardprinter kan worden weergegeven met lpq(1). Voor een
specifieke printer moet de optie -P meegegeven worden.
Het volgende commando toont de wachtrij van printer bamboo:
% lpq -P bamboo
Hieronder volgt een voorbeeld van de uitvoer van het commando lpq:
bamboo is ready and printing Rank Owner Job Files Total Size active kelly 9 /etc/host.conf, /etc/hosts.equiv 88 bytes 2nd kelly 10 (standard input) 1635 bytes 3rd mary 11 ... 78519 bytes
Dit laat drie opdrachten zien in de wachtrij voor bamboo. De eerste opdracht, gegeven door gebruiker kelly, heeft opdrachtnummer 9 gekregen. Elke opdracht voor een printer krijgt een uniek opdrachtnummer. Dit nummer kan in de meeste gevallen genegeerd worden, maar is nodig om een opdracht te annuleren. In Opdrachten verwijderen staan meer details.
Opdrachtnummer negen bestaat uit twee bestanden; meerdere bestanden opgegeven naar lpr(1), worden als één enkele opdracht behandeld. Het is de actieve opdracht (active onder de kolom “Rank”), wat betekent dat de printer deze opdracht momenteel aan het afdrukken is. De tweede opdracht bestaat uit gegevens doorgegeven aan lpr(1) als standaard invoer. De derde opdracht is afkomstig van gebruiker mary. Het is een veel grotere opdracht. De bestandsnaam van het bestand dat ze probeert af te drukken is te lang voor het overzicht, daarom toont lpq(1) drie puntjes.
De allereerste regel uitvoer van lpq(1) is ook handig: die vertelt wat de printer momenteel aan het doen is; dat wil zeggen, wat LPD denkt dat de printer aan het doen is.
Het commando lpq(1) ondersteunt ook
een optie -l om een gedetailleerd, lang overzicht te
geven. Hieronder volgt voorbeelduitvoer van lpq -l:
waiting for bamboo to become ready (offline ?)
kelly: 1st [job 009rose]
/etc/host.conf 73 bytes
/etc/hosts.equiv 15 bytes
kelly: 2nd [job 010rose]
(standard input) 1635 bytes
mary: 3rd [job 011rose]
/home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes
Een gebruiker die van gedachten verandert over een af te drukken opdracht, kan een opdracht uit een wachtrij halen met het commando lprm(1). Vaak kan met lprm(1) zelfs een actieve opdracht worden verwijderd, maar een deel of alles van de opdracht kan desondanks toch worden afgedrukt.
Om een opdracht van de standaardprinter te verwijderen dient eerst met lpq(1) het opdrachtnummer gevonden te worden. Typ vervolgens:
% lprm opdrachtnummer
Om een opdracht van een specifieke printer te verwijderen, moet de optie -P worden toegevoegd. Het volgende commando verwijdert
opdrachtnummer 10 uit de wachtrij van printer bamboo:
% lprm -P bamboo 10
Het commando lprm(1) heeft een aantal snelkoppelingen:
Verwijder alle opdrachten (voor de standaardprinter) van de huidige gebruiker.
Verwijder alle opdrachten (voor de standaardprinter) die van gebruiker zijn. De supergebruiker kan opdrachten van andere gebruikers verwijderen. Andere gebruikers kunnen alleen hun eigen opdrachten verwijderen.
Zonder een opdrachtnummer, gebruikersnaam of - op de
opdrachtregel, verwijdert lprm(1) de huidige
actieve opdracht van de huidige gebruiker op de standaard printer. Alleen de
supergebruiker kan iedere actieve opdracht verwijderen.
Gebruik de optie -P met bovenstaande snelkoppelingen
om een specifieke printer in plaats van de standaard printer te selecteren. Het
volgende voorbeeld verwijdert alle opdrachten van de huidige gebruiker uit de
wachtrij van printer rattan:
% lprm -P rattan -
Opmerking: Als in een netwerkomgeving wordt gewerkt, staat lprm(1) alleen toe opdrachten te verwijderen vanaf hosts waarvan de afdrukopdrachten zijn gegeven, ook als dezelfde printer vanaf andere hosts bereikbaar is. Het volgende voorbeeld demonstreert dit:
% lpr-Prattan mijnbestand % rlogin orchid % lpq-Prattan Rank Owner Job Files Total Size active seeyan 12 ... 49123 bytes 2nd kelly 13 myfile 12 bytes % lprm-Prattan 13 rose: Permission denied % logout % lprm-Prattan 13 dfA013rose dequeued cfA013rose dequeued
Het commando lpr(1) ondersteunt een aantal opties voor de opmaak van platte tekst, het converteren van grafische en andere bestandsformaten, het afdrukken van meerdere kopieën, afwikkeling van een opdracht en meer. In deze sectie worden die opties beschreven.
De volgende opties voor lpr(1) zorgen voor de opmaak van de bestanden in de opdracht. Gebruik deze opties als de opdracht geen platte tekst bevat of als platte tekst opgemaakt dient te worden met behulp van pr(1).
Het volgende commando drukt bijvoorbeeld een DVI-bestand af (van het TeX typesettingsysteem) met de naam visrapport.dvi op de printer bamboo:
% lpr -P bamboo -d visrapport.dvi
Deze opties zijn van toepassing op alle bestanden in de opdracht. Het is dus niet mogelijk om bijvoorbeeld DVI- en ditroff-bestanden in een opdracht samen te voegen. In plaats hiervan moeten deze bestanden als aparte opdrachten worden gegeven, elk met een andere conversie-optie.
Opmerking: Al deze opties, behalve
-pen-T, vereisen dat er conversiefilters zijn geïnstalleerd voor een printer. De optie-dvereist bijvoorbeeld het DVI-conversiefilter. In Conversiefilters staan de details beschreven.
-cAfdrukken van cifplot-bestanden.
-dAfdrukken van DVI-bestanden.
-fAfdrukken van FORTRAN tekstbestanden.
-gAfdrukken van plotgegevens.
-i aantalDe uitvoer wordt aantal kolommen ingesprongen. Als nummer wordt weggelaten, wordt acht kolommen ingesprongen. Deze optie werkt alleen met bepaalde conversiefilters.
Opmerking: Plaats geen spatie tussen de
-ien het nummer.
-lDrukt letterlijke tekstgegevens af, inclusief controlekarakters.
-nAfdrukken van ditroff (apparaatonafhankelijke troff) gegevens.
Opmaak van platte tekst met pr(1) alvorens af te drukken. Zie pr(1) voor meer informatie.
-T titelGebruik titel op de pr(1) koptekst in
plaats van de bestandsnaam. Deze optie heeft alleen effect in combinatie met de
optie -p.
-tAfdrukken van troffgegevens.
-vAfdrukken van rastergegevens.
In het volgende voorbeeld wordt een mooi opgemaakte versie van de handleiding ls(1) afgedrukt op de standaardprinter:
% zcat /usr/share/man/man1/ls.1.gz | troff-t-man | lpr-t
Het commando zcat(1) pakt de
broncode van de ls(1) handleiding uit
en geeft het door aan het commando troff(1), dat de
broncode opmaakt, er GNU troff van maakt en dit doorstuurt naar lpr(1), dat de
opdracht naar de LPD wachtrij stuurt. Omdat de
optie -t meegeven wordt aan lpr(1), converteert
het wachtrijsysteem de GNU troff uitvoer naar een formaat dat de standaardprinter
begrijpt als de opdracht wordt afgedrukt.
De volgende opties voor lpr(1) geven LPD aan de opdracht speciaal te behandelen:
Produceer een aantal van kopieën kopieën van elk bestand in de opdracht, in plaats van één kopie. Een beheerder kan deze optie uitschakelen om slijtage van de printer te voorkomen en gebruik van een kopieerapparaat aan te moedigen. Zie Meerdere kopieën beperken.
Dit voorbeeld drukt drie kopieën af van parser.c gevolgd door drie kopieën van parser.h op de standaardprinter:
% lpr -#3 parser.c parser.h
Stuur een email na voltooiing van de afdrukopdracht. Met deze optie stuurt het LPD-systeem een email als een opdracht is afgehandeld. In dit bericht vertelt het of de opdracht succesvol is uitgevoerd of dat er een fout was met (vaak) de aard van de fout.
Kopieer de bestanden niet naar de wachtrijmap, maar maak in plaats hiervan een symbolische link.
Bij het afdrukken van een grote opdracht is het handig van deze optie gebruik te maken. Het spaart ruimte in de wachtrijmap (het kan zijn dat de opdracht de vrije ruimte verbruikt in het bestandssysteem waarin de wachtrijmap zich bevindt). Het bespaart ook tijd, omdat LPD niet elke byte van de opdracht naar de wachtrijmap hoeft te kopieëren.
Er is echter een nadeel: aangezien LPD het originele bestand nodig heeft, is het niet mogelijk dit te wijzigen, of te verwijderen totdat het is afgedrukt.
Opmerking: Bij het afdrukken op een printer in een netwerk, moet LPD een bestand uiteindelijk toch kopieëren van een lokale host naar een netwerkhost. De optie
-sbespaart dus ruimte in een lokale wachtrijmap, niet in die van een host in een netwerk. Het blijft echter nuttig.
Verwijder bestanden in een opdracht na ze naar een wachtrij gekopieerd te
hebben of na ze te hebben afgedrukt als de optie -s
is gebruikt. Wees voorzichtig met deze optie!
Deze opties voor lpr(1) passen de tekst aan die gewoonlijk op het voorblad van een opdracht verschijnt. Deze opties hebben geen effect als het afdrukken van voorbladen wordt onderdrukt op een gebruikte printer. Zie Voorbladen voor meer informatie over het opzetten van voorbladen.
Vervang de hostnaam op het voorblad door tekst. De hostnaam is gewoonlijk de naam van de host waarvan de opdracht is verstuurd.
Vervang de naam van de opdracht op het voorblad door tekst. De naam van de opdracht is standaard de naam van het eerste bestand in de opdracht of stdin als de standaard uitvoer wordt afgedrukt.
Druk geen voorblad af.
Opmerking: Bij sommige installaties kan het zijn dat deze optie geen effect heeft door de manier waarop de voorbladen worden gegenereerd. Zie Voorbladen voor de details.
De beheerder van de printers in een netwerk heeft deze moeten installeren, opzetten en testen. Met het commando lpc(8) kan een beheerder op nog meer manieren communiceren met printers. Met lpc(8) is het mogelijk om:
Printers te starten en te stoppen;
Wachtrijen aan en uit te zetten;
De volgorde van opdrachten in elke wachtrij aan te passen.
Ten eerste een opmerking over terminologie: als een printer is gestopt, drukt die niets uit een wachtrij af. Gebruikers kunnen nog steeds opdrachten geven, maar opdrachten wachten in een wachtrij totdat de bijbehorende printer is gestart of als de wachtrij vrij is.
Als een wachtrij is uitgeschakeld, kan geen enkele gebruiker (behalve root) opdrachten naar een printer versturen. Een ingeschakelde wachtrij accepteert opdrachten. Een printer met een uitgeschakelde wachtrij kan worden gestart en drukt dan alle afdrukopdrachten in de wachtrij af tot deze leeg is.
In het algemeen is het nodig root-rechten te hebben om het commando lpc(8) te gebruiken. Gewone gebruikers kunnen het commando lpc(8) gebruiken om een printerstatus op te vragen en om een vastgelopen printer te herstarten.
Nu volgt een samenvatting van de lpc(8) commando's. De meeste commando's accepteren een argument printernaam, om aan te geven op welke printer te werken. Om op alle printers te werken die in /etc/printcap genoemd worden, kan all worden gebruikt als printernaam.
Annuleer de huidige opdracht en stop de printer. Gebruikers kunnen nog steeds opdrachten versturen als de wachtrij is ingeschakeld.
Verwijder oude bestanden uit de wachtrijmap van de betreffende printer. Het kan wel eens gebeuren dat de bestanden waaruit een opdracht bestaat niet juist worden verwijderd door LPD. Dit gebeurt bijvoorbeeld wanneer er fouten zijn opgetreden tijdens het afdrukken of tijdens grote administratieve activiteit. Dit commando vindt en verwijdert bestanden die niet in de wachtrijmap thuishoren.
Nieuwe opdrachten kunnen niet meer in de wachtrij worden geplaatst. Als de printer nog draait, drukt die de opdrachten die zich nog in de wachtrij bevinden af. De supergebruiker (root) kan altijd opdrachten versturen, ook naar een uitgeschakelde wachtrij.
Dit commando is handig bij het testen van een nieuwe printer of een filterinstallatie: schakel de wachtrij uit en verstuur als root opdrachten. Andere gebruikers kunnen geen opdrachten versturen totdat het testen is voltooid en de wachtrij weer is ingeschakeld met het commando enable.
Schakel een printer uit. Equivalent aan disable gevolgd door stop. De boodschap verschijnt als de status van de printer als een gebruiker de wachtrij van de printer controleert met lpq(1) of de status met lpc status.
Schakel de wachtrij van een printer in. Gebruikers kunnen opdrachten versturen, maar de printer drukt ze pas af als deze is gestart.
Geef hulp over het commando commandonaam. Zonder commandonaam, wordt een samenvatting van de beschikbare commando's getoond.
Start de printer. Gewone gebruikers kunnen dit commando gebruiken als door een uitzonderlijke omstandigheid LPD hangt, maar ze kunnen een printer niet starten die gestopt is met een van de commando's stop of down. Het commando restart is equivalent aan abort gevolgd door start.
Start de printer. De printer drukt opdrachten in zijn wachtrij af.
Stop de printer. De printer maakt de huidige opdracht af en drukt opdrachten in de wachtrij niet af. Gebruikers kunnen nog steeds opdrachten versturen naar een ingeschakelde wachtrij, ook al is de printer gestopt.
Herschik de wachtrij voor printernaam door de opdrachten met de opgegeven opdracht nummers of opdrachten van gebruikersnaam bovenaan de wachtrij te plaatsen. Voor dit commando is het niet mogelijk all te gebruiken als printernaam.
Schakel een printer in. Het omgekeerde van het commando down. Equivalent aan start gevolgd door enable.
lpc(8) accepteert bovenstaande commando's op de opdrachtregel. Als er geen commando's worden gegeven, schakelt lpc(8) over op een interactieve modus, waar opdrachten gegeven kunnen worden totdat het commando exit, quit of einde-van-bestand wordt gegeven.
Na het lezen van deze handleiding, heeft de lezer zo'n beetje alles gelezen wat er te leren valt over het wachtrijsysteem LPD zoals het te vinden is in FreeBSD. Er zijn veel tekortkomingen te onderkennen, wat vanzelf leidt tot de vraag: “Welke andere wachtrijsystemen zijn er beschikbaar (en werken onder FreeBSD)?”
LPRng, dat “LPR: the Next Generation” betekent, is een compleet herschreven PLP. Patrick Powell en Justin Mason (de voornaamste beheerder van PLP) hebben samengewerkt om LPRng te maken. De thuispagina voor LPRng is http://www.lprng.org/.
CUPS, het Common UNIX Printing System, voorziet in een overzetbare printlaag voor UNIX-achtige besturingssystemen. Het is ontwikkeld door Easy Software Product, om een standaard afdrukoplossing voor alle UNIX-producenten en gebruikers te promoten.
CUPS gebruikt het Internet Printing Protocol (IPP) als basis voor het beheren van afdrukopdrachten en wachtrijen. De protocollen Line Printer Daemon (LPD), Server Message Block (SMB) en AppSocket (ook bekend als JetDirect) worden ook ondersteund met minder functionaliteit. CUPS biedt bladeren naar netwerkprinters en PostScript Printer Description (PPD) gebaseerde afdrukopties om echt printen onder UNIX te ondersteunen.
De thuispagina voor CUPS is http://www.cups.org/.
HPLIP, het HP Linux Imaging and Printing systeem, is een suite van programma's ontwikkeld door HP dat printen, scannen en faxen voor toepassingen van HP ondersteunt. Deze suite van programma's maakt gebruikt van het printsysteem CUPS als een backend voor sommige van de printmogelijkheden.
De thuispagina voor HPLIP is http://hplipopensource.com/hplip-web/index.html.
Na het uitvoeren van een simpele test met lptest(1) is mogelijk een van onderstaande resultaten verkregen, in plaats van de juiste uitvoer:
De printer drukte bovenstaande af, maar wachtte enige tijd zonder iets te doen. Het was zelfs nodig om een PRINT REMAINING, of FORM FEED-knop op te printer in te drukken om enig resultaat te krijgen.
Als dit het geval is, dan stond de printer waarschijnlijk te wachten of er nog meer gegevens van de opdracht zouden komen, alvorens iets af te drukken. Om dit probleem op te lossen, kan het tekstfilter worden aangepast zodat deze een FORM FEED-karakter (of wat er ook nodig is) naar de printer stuurt. Dit is meestal voldoende om een printer zover te krijgen om tekst af te drukken die zich nog in de interne buffer bevindt. Het is ook nuttig om er zeker van te zijn dat elke afdrukopdracht eindigt op een hele pagina, zodat de volgende opdracht niet ergens midden op de laatste pagina van de vorige opdracht begint.
De volgende vervanging voor het shellscript /usr/local/libexec/if-simple drukt een form feed af nadat de opdracht naar een printer is gestuurd:
#!/bin/sh # # if-simple - Eenvoudige tekst invoerfilter voor lpd # Geïinstalleerd in /usr/local/libexec/if-simple # # Kopieert eenvoudig stdin naar stdout. Negeer alle filterargumenten. # Schrijft een form feed karakter (\f) na het afdrukken van de opdracht. /bin/cat && printf "\f" && exit 0 exit 2
Het resultaat ziet er als volgt uit:
!"#$%&'()*+,-./01234
"#$%&'()*+,-./012345
#$%&'()*+,-./0123456
Dit krijgen slachtoffers van het trapeffect te zien. Het wordt veroorzaakt door conflicterende interpretaties van de karakters die een regeleinde aangeven. UNIX-achtige besturingssystemen gebruiken een enkel karakter: ASCII-code 10, de line feed (LF). MS-DOS, OS/2® en andere besturingssystemen gebruiken twee karakters: ASCII-code 10 en ASCII-code 13 (de carriage return, CR). Veel printers gebruiken de MS-DOS-conventie voor het representeren van regeleinden.
Als onder FreeBSD wordt afgedrukt, bevat de tekst alleen het line feed-karakter. Na het zien van een line feed-karakter vervolgt de printer zijn werk op de volgende regel, maar behoudt dezelfde horizontale positie op de pagina voor het afdrukken van het volgende teken. Hier is de carriage return voor bedoeld: om het volgende karakter af te drukken aan de linkerkant van de pagina.
Dit is wat FreeBSD wil dat de printer doet:
Hier volgen een aantal manieren om dit te bereiken:
Gebruik de instellingentoetsen of het bedieningspaneel van de printer om de interpretatie van deze karakters aan te passen. Controleer de handleiding van de printer om uit te vinden hoe dit moet.
Opmerking: Als een systeem in een ander besturingssysteem dan FreeBSD wordt opgestart, kan het nodig zijn een printer opnieuw in te stellen, zodat die een interpretatie voor CR- en LF-karakters gebruikt die bij dat andere besturingssysteem horen. Het kan de voorkeur genieten een van onderstaande oplossingen te gebruiken.
Zorg dat het seriële lijnstuurprogramma van FreeBSD automatisch LF naar CR+LF converteert. Dit werkt natuurlijk alleen voor printers op een seriële poort. Gebruik de optie ms# en zet de modus onlcr in het bestand /etc/printcap voor de printer om deze functionaliteit in te schakelen.
Stuur een escape-code naar een printer om tijdelijk LF-karakters anders te behandelen. Raadpleeg hiervoor de handleiding van de printer om escape-codes te achterhalen die de printer ondersteunt. Als de juiste escape-code is gevonden, moet de tekstfilter worden aangepast zodat deze eerst de code stuurt en vervolgens de afdrukopdracht.
Hier volgt een eenvoudig tekstfilter voor printers die HP PCL-escape-codes begrijpen. Dit filter zorgt dat een printer LF-karakters behandelt als LF en CR, vervolgens verstuurt het de opdracht en tot slot een form feed om de laatste pagina in de opdracht uit te voeren. Het zou met alle HP printers moeten werken.
#!/bin/sh # # hpif - Eenvoudig tekst invoerfilter voor lpd voor HP PCL-printers # Geïnstalleerd in /usr/local/libexec/hpif # # Kopieert eenvoudig stdin naar stdout. Negeert alle filterargumenten. # Vertelt de printer om LF te zien als CR+LF. # Werpt de pagina uit na voltooiing. printf "\033&k2G" && cat && printf "\033&l0H" && exit 0 exit 2
Nu volgt een voorbeeldbestand /etc/printcap voor host orchid. Er is een printer aangesloten op de eerste parallelle poort; een HP LaserJet 3Si, genaamd teak. Die gebruikt bovenstaand script als tekstfilter:
#
# /etc/printcap voor host orchid
#
teak|hp|laserjet|HP LaserJet 3Si:\
:lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:
De printer is nooit een regel opgeschoven. Alle regels tekst lopen over elkaar en zijn op dezelfde regel afgedrukt.
Dit probleem is het “omgekeerde” van het trapeffect, zoals boven beschreven, en is veel zeldzamer. Ergens worden de LF-karakters die FreeBSD gebruikt om een regel te eindigen gezien als CR-karakters om de afdruklocatie te verplaatsen naar de linkerkant van het papier, zonder óók een regel naar beneden te gaan.
Gebruik de instellingentoetsen, of het bedieningspaneel van de printer om de volgende interpretatie van LF en CR af te dwingen:
Tijdens het afdrukken heeft de printer een paar karakters per regel niet afgedrukt. Het kan zijn dat het probleem erger werd naarmate de printer zijn werk deed, steeds meer karakters verliezend.
Het probleem is dat de printer de snelheid waarmee de computer gegevens over een seriële lijn stuurt niet bij kan houden (dit probleem zou zich niet voor moeten doen met printers op een parallelle poort). Er zijn twee manieren om dit probleem te verhelpen:
Als de printer XON/XOFF flow-control ondersteunt, zorg dan dat FreeBSD dit gebruikt door de modus ixon in de optie ms# te specificeren.
Als de printer de Request to Send / Clear to Send hardware-handshake ondersteunt, (ook bekend als RTS/CTS), specificeer dan de modus crtscts in de optie ms#. Zorg dat de bedrading van de kabel die printer met de computer verbindt juist is voor hardware flow-control.
Het lijkt alsof de printer willekeurige onzin afdrukte en niet de gewenste tekst.
Dit is meestal een ander symptoom van verkeerde communicatieparameters voor een seriële printer. Controleer de bps-snelheid in de optie br en de instelling voor pariteit in de optie ms#. Wees er zeker van dat de printer dezelfde instellingen gebruikt als in het bestand /etc/printcap worden opgegeven.
Als er niets gebeurde, ligt het probleem waarschijnlijk bij FreeBSD en niet bij de hardware. Voeg de optie logboekbestand (lf) toe in /etc/printcap voor de betreffende printer. Hier is bijvoorbeeld de definitie voor rattan met de optie lf:
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:\
:lf=/var/log/rattan.log
Probeer vervolgens nogmaals af te drukken. Controleer het logboekbestand (in dit voorbeeld /var/log/rattan.log) op mogelijke foutmeldingen. Probeer op basis van deze melding het probleem te verhelpen.
Als er geen optie lf is opgegeven, gebruikt LPD /dev/console als standaard.
FreeBSD levert binaire compatibiliteit met verscheidene andere UNIX achtige besturingssystemen, waaronder Linux. Op dit moment kan de vraag gesteld worden waarom FreeBSD nu precies Linux-binairen moet kunnen draaien. Het antwoord is dat veel bedrijven en ontwikkelaars alleen ontwikkelen voor Linux, omdat dat het nieuwste “hebbeding” is in de wereld van computers. Dat laat FreeBSD gebruikers al zeurend achter bij diezelfde bedrijven en ontwikkelaars om originele FreeBSD versies van hun applicaties. Het probleem is dat veel van deze bedrijven zich niet goed realiseren hoeveel mensen hun product zouden gebruiken als er ook FreeBSD versies van waren en de meesten blijven alleen voor Linux ontwikkelen. Dus wat moet een FreeBSD gebruiker doen? Hier komt de Linux binaire compatibiliteit van FreeBSD om de hoek kijken.
In een notendop stelt de compatibiliteit FreeBSD in staat om rond de 90% van alle Linux applicaties zonder wijzigingen te draaien. Dit omvat applicaties zoals StarOffice, de Linux versie van Netscape, Adobe Acrobat, RealPlayer, Oracle, WordPerfect®, Doom, Quake en meer. Er wordt zelfs gemeld dat in sommige gevallen Linux-binairen beter presteren op FreeBSD dan op Linux.
Er zijn echter enkele Linux-specifieke besturingssysteemeigenschappen die niet door FreeBSD ondersteund worden. Linux-binairen werken niet op FreeBSD als ze overvloedig gebruik maken van i386 specifieke aanroepen, zoals het aanzetten van de virtuele 8086 modus.
Na het lezen van dit hoofdstuk weet de lezer:
Hoe Linux binaire compatibiliteit op een systeem aan te zetten;
Hoe aanvullende Linux gedeelde bibliotheken te installeren;
Hoe Linux applicaties op een FreeBSD systeem te installeren;
De implementatiedetails van Linux compatibiliteit in FreeBSD.
Aangeraden voorkennis:
Hoe extra software van derden te installeren (Hoofdstuk 5).
Linux binaire compatibiliteit staat standaard niet aan. De gemakkelijkste manier om deze functionaliteit aan te zetten is door het linux KLD object (“Kernel LoaDable object”) te laden. Deze module kan geladen worden door het volgende commando als root uit te voeren:
# kldload linux
Als Linux compatibiliteit altijd aan moet staan, dan moet de volgende regel aan /etc/rc.conf toegevoegd worden:
linux_enable="YES"
Met kldstat(8) kan gecontroleerd worden of de KLD geladen is:
% kldstat Id Refs Address Size Name 1 2 0xc0100000 16bd8 kernel 7 1 0xc24db000 d000 linux.ko
Als het om enige reden ongewenst of onmogelijk is de KLD te laden, dan kan de Linux binaire compatibiliteit statisch in de kernel gecompileerd worden door options COMPAT_LINUX aan het kernelinstellingenbestand toe te voegen. Daarna kan de nieuwe kernel zoals beschreven in Hoofdstuk 9 geïnstalleerd worden.
Dit kan op twee manieren gedaan worden: door de linux_base port te gebruiken of door ze handmatig te installeren.
Dit is verreweg de gemakkelijkste weg om te bewandelen om de runtime bibliotheken te installeren. Het is net als het installeren van andere ports uit de Portscollectie. Dit kan met het volgende commando:
# cd /usr/ports/emulators/linux_base-f10 # make install distclean
Opmerking: Op FreeBSD-systemen vóór FreeBSD 8.0 dient u de port emulators/linux_base-fc4 in plaats van emulators/linux_base-f10 te gebruiken.
Nu is er werkende Linux binaire compatibiliteit. Sommige programma's kunnen klagen over onjuiste kleine versies van de systeembibliotheken. Over het algemeen schijnt dit echter geen probleem te zijn.
Opmerking: Er kunnen verschillende versies van de emulators/linux_base port beschikbaar zijn, overeenkomend met verschillende versies van verscheidene Linux distributies. Het is verstandig de port te installeren die het meest voldoet aan de eisen van de Linux applicaties die geïnstalleerd gaan worden.
Als de Portscollectie niet is geïnstalleerd, kunnen de bibliotheken met de hand geïnstalleerd worden. Om alles te laten werken moeten de Linux gedeelde bibliotheken waarvan het programma afhankelijk is en de runtime linker geïnstalleerd worden. Ook moet een “shadow root” map aangemaakt worden, /compat/linux, voor Linux bibliotheken op een FreeBSD systeem. Elke gedeelde bibliotheek die wordt geopend door Linux programma's die op FreeBSD draaien, kijken eerst in deze boomstructuur. Dus als een Linux programma bijvoorbeeld /lib/libc.so laadt, probeert FreeBSD eerst /compat/linux/lib/libc.so te openen, en als die niet bestaat, probeert het /lib/libc.so proberen. Gedeelde bibliotheken moeten in de schaduwmapstructuur geïnstalleerd worden in plaats van in de paden die het Linux ld.so rapporteert.
In het algemeen geldt dat alleen de eerste paar keer dat een Linux binary wordt geïnstalleerd op een FreeBSD systeem naar de gedeelde bibliotheken gezocht wordt waar Linux-binairen van afhankelijk zijn. Na een tijd is de verzameling van Linux gedeelde bibliotheken op een systeem voldoende groot om nieuw geïmporteerde Linux-binairen te kunnen draaien zonder enig extra werk.
Wat als de linux_base port is geïnstalleerd en een applicatie nog steeds klaagt over ontbrekende gedeelde bibliotheken? Op zich zijn er twee mogelijkheden (voor het opvolgen van deze instructies zijn root rechten op een FreeBSD systeem vereist).
Als er toegang is tot een Linux systeem kan gekeken worden welke gedeelde bibliotheken de applicatie nodig heeft en kunnen ze gekopieerd worden naar het FreeBSD systeem. Dit wordt toegelicht in het volgende voorbeeld:
Stel dat FTP gebruikt is om de Linux binary van Doom op te halen en die op een Linux systeem staat waar toegang tot is. Dan kan met ldd linuxdoom gecontroleerd worden welke gedeelde bibliotheken er nodig zijn:
% ldd linuxdoom libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0 libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0 libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29
Alle bestanden uit de laatste kolom zijn nodig en moeten onder /compat/linux komen te staat en de namen uit de eerste kolom moeten er als symbolische links naar verwijzen. Dit betekent dat uiteindelijk deze bestanden op een FreeBSD systeem staan:
/compat/linux/usr/X11/lib/libXt.so.3.1.0 /compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0 /compat/linux/usr/X11/lib/libX11.so.3.1.0 /compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0 /compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Opmerking: Als er al een Linux gedeelde bibliotheek met een groot revisienummer overeenstemmend met de eerste kolom van de ldd uitvoer is, dan hoeft het bestand uit de laatste kolom niet naar een systeem gekopieerd te worden. Het bestand dat er al staat moet werken. Het is aan te raden om de gedeelde bibliotheek sowieso te kopiëren als het een nieuwere versie is. De oude kan verwijderd worden, zolang de symbolische link maar naar de nieuwe wijst. Dus als deze bibliotheken op een systeem staan:
/compat/linux/lib/libc.so.4.6.27 /compat/linux/lib/libc.so.4 -> libc.so.4.6.27en een nieuwe binary zegt een latere versie nodig te hebben volgens de uitvoer van ldd:
libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29Als slechts één of twee versies verouderd zijn in het laatste cijfer, dan hoeft /lib/libc.so.4.6.29 niet gekopieerd te worden, omdat het programma goed moet werken met de ietwat oudere versie. Als er echter behoefte aan is, kan besloten worden om libc.so sowieso te verplaatsen, en dat resulteert in:
/compat/linux/lib/libc.so.4.6.29 /compat/linux/libc.so.4 -> lbic.so.4.6.29
Opmerking: Het symbolische linkmechanisme is alleen nodig voor Linux-binairen. De FreeBSD runtime linker zorgt zelf voor het kijken naar passende grote revisienummers en daar hoeft geen zorg over te bestaan.
ELF-binairen hebben soms een extra stap van “branding” nodig. Als er ongemerkte ELF-binairen worden gedraaid, ontstaat er een foutmelding zoals de volgende:
% ./mijn-linux-elf-binary ELF binary type not known Abort
Om de FreeBSD kernel te helpen FreeBSD ELF-binairen en Linux binairen uit elkaar te houden, kan brandelf(1) gebruikt worden.
% brandelf -t Linux mijn-linux-elf-binary
De GNU gereedschapskist plaatst nu automatisch de juiste merkinformatie in ELF-binairen , dus deze stap zou steeds overbodiger moeten worden in de toekomst.
FreeBSD heeft zijn eigen pakketdatabase die wordt gebruikt om alle ports te volgen (ook Linux ports). De Linux RPM-database wordt dus niet gebruikt (noch ondersteund).
Als u echter een willekeurige toepassing die op Linux RPM is gebaseerd moet installeren kan dit bereikt worden met:
# cd /compat/linux # rpm2cpio -q < /pad/naar/linux.archief.rpm | cpio -id
Draai daarna brandelf op de geïnstalleerde ELF-binairen (niet de bibliotheken!). Een schone deïnstallatie is niet mogelijk, maar het kan helpen met testen.
resolv+: "bind" is an invalid keyword resolv+: "hosts" is an invalid keyword
Als DNS niet werkt of de bovenstaande melding ontstaat, dan moet /compat/linux/etc/host.conf ingesteld worden met daarin:
order hosts, bind multi on
De volgorde geeft aan dat /etc/hosts als eerste doorzocht wordt en DNS als tweede. Als /compat/linux/etc/host.conf niet geïnstalleerd is, vinden Linux applicaties /etc/host.conf van FreeBSD en klagen ze over de incompatibele FreeBSD syntaxis. bind moet verwijderd worden als er geen naamserver is ingesteld die gebruik maakt van /etc/resolv.conf.
Dit document beschrijft het installatieproces van de Linux versie van Mathematica 5.X op een FreeBSD systeem.
De Linux versie van Mathematica of Mathematica for Students kan direct bij Wolfram besteld worden op http://www.wolfram.com/.
Ten eerste dient FreeBSD te weten dat de Linux-binairen van Mathematica de Linux ABI gebruiken. De gemakkelijkste manier om dit te doen is om het standaard ELF-merk op Linux te zetten voor alle ongemerkte binairen met het commando:
# sysctl kern.fallback_elf_brand=3
Dit laat FreeBSD aannemen dat alle ongemerkte ELF-binairen de Linux ABI gebruiken en dus zou de installer rechtstreeks van de CD-ROM moeten kunnen draaien.
Kopieer nu het bestand MathInstaller naar de harde schijf:
# mount /cdrom # cp /cdrom/Unix/Installers/Linux/MathInstaller /localdir/
Vervang binnen dit bestand /bin/sh op de eerste regel door /compat/linux/bin/sh. Dit zorgt ervoor dat de installer door de Linux-versie van sh(1) wordt uitgevoerd. Vervang vervolgens met een tekstverwerker of het onderstaande script in de volgende sectie alle voorkomens van Linux) door FreeBSD). Dit zorgt ervoor dat de Mathematica installer, dat uname -s gebruikt om het besturingssysteem te bepalen, om FreeBSD als een Linux-achtig besturingssysteem te behandelen. Het aanroepen van MathInstaller zal nu Mathematica installeren.
De shellscripts die Mathematica aanmaakte tijdens de installatie moeten gewijzigd worden voordat u ze kunt gebruiken. Als u /usr/local/bin kiest als de map om Mathematica-executables in te plaatsen, zult u in deze map symbolische links naar bestanden genaamd math, mathematica, Mathematica, en MathKernel aantreffen. Vervang met een tekstverwerker of het volgende shellscript in elk van deze Linux) door FreeBSD:
#!/bin/sh cd /usr/local/bin for i in math mathematica Mathematica MathKernel do sed 's/Linux)/FreeBSD)/g' $i > $i.tmp sed 's/\/bin\/sh/\/compat\/linux\/bin\/sh/g' $i.tmp > $i rm $i.tmp chmod a+x $i done
Wanneer u Mathematica voor de eerste keer start, zal u om een wachtwoord gevraagd worden. Als u nog geen wachtwoord van Wolfram heeft verkregen, draait u het programma mathinfo in de installatiemap om uw “machine-ID” te verkrijgen. Dit machine-ID is alleen op het MAC-adres van uw eerste Ethernetkaart gebaseerd, zodat u uw kopie van Mathematica niet op andere machines kunt draaien.
Bij een registratie bij Wolfram, per email, telefoon of fax, wordt het “machine ID” opgegeven en zij reageren met een overeenkomstig wachtwoord dat uit groepen getallen bestaat.
Mathematica gebruikt enkele speciale lettertypen om tekens af te beelden die niet aanwezig zijn in een standaard lettertypeverzameling (integralen, sommen, Griekse letters, enzovoort). Het X-protocol vereist dat deze lettertypen lokaal worden geïnstalleerd. Dit betekent dat deze lettertypen gekopieerd moeten worden vanaf de CD-ROM of vanaf een host met Mathematica erop naar de lokale machine. Deze lettertypen worden meestal opgeslagen in /cdrom/Unix/Files/SystemFiles/Fonts op de CD-ROM of in /usr/local/mathematica/SystemFiles/Fonts op de harde schijf. De eigenlijke lettertypen staan in de submap Type1 en X. Er zijn verschillende manieren om ze te installeren, zoals hieronder staat beschreven.
De eerste manier is om ze te kopiëren in één van de bestaande lettertypenmappen in /usr/X11R6/lib/X11/fonts. Hiertoe dient fonts.dir bewerkt te worden door de namen van de lettertypen eraan toe te voegen het aantal lettertypen op de eerste regel te veranderen. Als alternatief kan ook eenvoudig mkfontdir(1) in de map gedraaid worden waar de lettertypen heen zijn gekopieerd.
De tweede manier om dit te doen is door de mappen naar /usr/X11R6/lib/X11/fonts te kopiëren:
# cd /usr/X11R6/lib/X11/fonts # mkdir X # mkdir MathType1 # cd /cdrom/Unix/Files/SystemFiles/Fonts # cp X/* /usr/X11R6/lib/X11/fonts/X # cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1 # cd /usr/X11R6/lib/X11/fonts/X # mkfontdir # cd ../MathType1 # mkfontdir
Voeg nu de nieuwe lettertypenmappen toe aan het lettertypenpad:
# xset fp+ /usr/X11R6/lib/X11/fonts/X # xset fp+ /usr/X11R6/lib/X11/fonts/MathType1 # xset fp rehash
Als de Xorg server gebruikt wordt, kunnen deze lettertypenmappen automatisch geladen worden door ze aan xorg.conf toe te voegen.
Als er nog geen map /usr/X11R6/lib/X11/fonts/Type1 bestaat, kan de naam van de map MathType1 in het bovenstaande voorbeeld veranderd worden naar Type1.
Maple™ is een commercieel wiskundeprogramma vergelijkbaar met Mathematica. De software is te koop op http://www.maplesoft.com/ en kan daar ook geregistreerd worden voor een licentiebestand. Om deze software op FreeBSD te installeren kunnen de volgende eenvoudige stappen gevolgd worden:
Voer het INSTALL> shellscript uit van de productdistributie. Kies de “RedHat” optie als daarom wordt gevraagd door het installatieprogramma. Een typische installatiemap zou /usr/local/maple zijn.
Bestel, als dat nog niet gedaan is, een licentie voor Maple van Maple Waterloo Software (http://register.maplesoft.com/) en kopieer deze naar /usr/local/maple/license/license.dat.
Installeer de FLEXlm licentiebeheerder met het installatieshellscript INSTALL_LIC, dat geleverd wordt bij Maple. Stel de primaire hostnaam voor de machine in voor de licentieserver.
Patch het bestand /usr/local/maple/bin/maple.system.type met het volgende:
----- knip ------------------
*** maple.system.type.orig Sun Jul 8 16:35:33 2001
--- maple.system.type Sun Jul 8 16:35:51 2001
***************
*** 72,77 ****
--- 72,78 ----
# the IBM RS/6000 AIX case
MAPLE_BIN="bin.IBM_RISC_UNIX"
;;
+ "FreeBSD"|\
"Linux")
# the Linux/x86 case
# We have two Linux implementations, one for Red Hat and
----- knip einde van patch -----
Achter "FreeBSD"| mogen geen verdere witvelden staan.
Deze patch instrueert Maple om “FreeBSD” als een Linux systeem te herkennen. Het shellscript bin/maple roept het shellscript bin/maple.system.type aan, dat op zijn beurt uname -a aanroept om achter de naam van het besturingssysteem te komen. Afhankelijk van de naam van het besturingssysteem zoekt het uit welke binairen het moet gebruiken.
Start de licentieserver.
Het volgende script, geïnstalleerd als /usr/local/etc/rc.d/lmgrd.sh, is een gemakkelijke manier om lmgrd op te starten:
----- knip ------------
#! /bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin
PATH=${PATH}:/usr/local/maple/bin:/usr/local/maple/FLEXlm/UNIX/LINUX
export PATH
LICENSE_FILE=/usr/local/maple/license/license.dat
LOG=/var/log/lmgrd.log
case "$1" in
start)
lmgrd -c ${LICENSE_FILE} 2>> ${LOG} 1>&2
echo -n " lmgrd"
;;
stop)
lmgrd -c ${LICENSE_FILE} -x lmdown 2>> ${LOG} 1>&2
;;
*)
echo "Usage: `basename $0` {start|stop}" 1>&2
exit 64
;;
esac
exit 0
----- knip ------------
Maple testen:
% cd /usr/local/maple/bin % ./xmaple
Nu hoort het programma te draaien. Het is belangrijk om Maplesoft te schrijven om ze te laten weten dat een echte FreeBSD versie gewenst is!
De FLEXlm licentiebeheerder kan een lastig programma zijn om mee te werken. Aanvullende documentatie staat op http://www.globetrotter.com/.
lmgrd staat er bekend om erg kieskeurig over het licentiebestand te zijn en core te dumpen als er een probleem is. Een correct licentiebestand ziet er zo uit:
# =======================================================
# License File for UNIX Installations ("Pointer File")
# =======================================================
SERVER chillig ANY
#USE_SERVER
VENDOR maplelmg
FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \
PLATFORMS=i86_r ISSUER="Waterloo Maple Inc." \
ISSUED=11-may-2000 NOTICE=" Technische Universitat Wien" \
SN=XXXXXXXXX
Opmerking: Het serienummer en de sleutel zijn vervangen door “X”'en. chillig is de hostnaam.
Het bewerken van het licentiebestand lukt zolang de regel “FEATURE” niet verandert (die beschermd is door de licentiesleutel).
Dit document beschrijft het installatieproces van de Linux versie van MATLAB 6.5 op een FreeBSD systeem. Het werkt best goed, met uitzondering van de Java Virtual Machine™ (zie Paragraaf 11.5.3).
De Linux versie van MATLAB kan besteld worden bij The MathWorks op http://www.mathworks.com. Er dient ook een licentiebestand of instructies hoe dat te maken te zijn. Het is belangrijk om Maplesoft te schrijven om ze te laten weten dat een echte FreeBSD versie gewenst is!
Om MATLAB te installeren:
Laad de installatie-CD-ROM en koppel die aan. Start het installatiescript als root:
# /compat/linux/bin/sh /cdrom/install
Tip: Het is een grafisch installatieprogramma. Als er foutmeldingen verschijnen dat het programma geen scherm kan openen, kan setenv HOME ~GEBRUIKER uitgevoerd worden, waar GEBRUIKER de gebruiker is waarmee su(1) is gedaan.
Als om de MATLAB rootmap wordt gevraagd, dient /compat/linux/usr/local/matlab opgegeven te worden.
Tip: Voer op de commandoregel het volgende uit om de rest van het installatieproces gemakkelijk te houden: set MATLAB=/compat/linux/usr/local/matlab.
Wijzig het licentiebestand zoals aangegeven tijdens het verkrijgen van de licentie voor MATLAB.
Tip: Dit bestand kan van tevoren gemaakt worden met een tekstverwerker en door het te kopiëren naar $MATLAB/license.dat voordat het installatieprogramma vraagt om het te bewerken.
Maak het installatieproces af.
Nu is de installatie van MATLAB compleet. De volgende stappen “lijmen” het aan het FreeBSD systeem.
Maak symbolische links voor de scriptbestanden van de licentiebeheerder:
# ln -s $MATLAB/etc/lmboot /usr/local/etc/lmboot_TMW # ln -s $MATLAB/etc/lmdown /usr/local/etc/lmdown_TMW
Maak een opstartbestand in /usr/local/etc/rc.d/flexlm.sh. Onderstaand voorbeeld is een gewijzigde versie van het meegeleverde $MATLAB/etc/rc.lm.glnx86. De wijzigingen omvatten bestandslocaties en het starten van de licentiebeheerder onder Linux-emulatie.
#!/bin/sh
case "$1" in
start)
if [ -f /usr/local/etc/lmboot_TMW ]; then
/compat/linux/bin/sh /usr/local/etc/lmboot_TMW -u gebruikersnaam && echo 'MATLAB_lmgrd'
fi
;;
stop)
if [ -f /usr/local/etc/lmdown_TMW ]; then
/compat/linux/bin/sh /usr/local/etc/lmdown_TMW > /dev/null 2>&1
fi
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac
exit 0
Belangrijk: Het bestand moet uitvoerbaar zijn:
# chmod +x /usr/local/etc/rc.d/flexlm.shOok moet bovenstaande gebruikersnaam vervangen worden door een geldige gebruikersnaam op het systeem (maar niet door root).
Start de licentiebeheerder op met het commando:
# /usr/local/etc/rc.d/flexlm.sh start
Verander de Java Runtime Environment Link naar een die werkt op FreeBSD:
# cd $MATLAB/sys/java/jre/glnx86 # unlink jre; ln -s ./jre1.1.8 ./jre
Plaats het volgende startscript in /usr/local/bin/matlab:
#!/bin/sh /compat/linux/bin/sh /compat/linux/usr/local/matlab/bin/matlab "$@"
Geef vervolgens het commando chmod +x /usr/local/bin/matlab.
Tip: Afhankelijk van de versie van emulators/linux_base, kunnen er fouten optreden als dit script draait. Om dat te voorkomen, dient in /compat/linux/usr/local/matlab/bin/matlab de regel:
if [ `expr "$lscmd" : '.*->.*'` -ne 0 ]; then(in versie 13.0.1 staat dit op regel 410) veranderd te worden in:
if test -L $newbase; then
Het volgende is nodig om een probleem op te lossen dat samenhangt met het onjuist afsluiten van MATLAB.
Maak het bestand $MATLAB/toolbox/local/finish.m dat alleen de volgende regel bevat:
! $MATLAB/bin/finish.sh
Opmerking: $MATLAB$ is hier letterlijk bedoeld.
Tip: In dezelfde map staan de bestanden finishsav.m en finishdlg.m, die de mogelijkheid geven om de werkomgeving te bewaren vóór het afsluiten. Als één van deze scripts gebruikt wordt, dient de bovenstaande regel direct na het commando save ingevoegd te worden.
Maak het bestand $MATLAB/bin/finish.sh, dat het volgende bevat:
#!/compat/linux/bin/sh (sleep 5; killall -1 matlab_helper) & exit 0
Maak het bestand uitvoerbaar:
# chmod +x $MATLAB/bin/finish.sh
Hieronder wordt het installatieproces van Oracle 8.0.5 en Oracle 8.0.5.1 Enterprise Edition voor Linux op een FreeBSD-machine beschreven.
Uit de Portscollectie dienen emulators/linux_base en devel/linux_devtools geïnstalleerd te zijn. Als er problemen zijn met deze ports, kan het zijn dat de pakketten of oudere versies uit de Portscollectie gebruikt moeten worden.
Om de intelligente agent te draaien, moet ook het Red Hat Tcl package geïnstalleerd worden: tcl-8.0.3-20.i386.rpm. Het algemene commando om pakketten te installeren met de officiële RPM port (archivers/rpm) is:
# rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm package
De installatie van het package hoort foutloos te verlopen.
Voordat Oracle geïnstalleerd kan worden, moet een juiste omgeving opgezet worden. Dit document beschrijft alleen welke speciale dingen gedaan moeten worden om Oracle voor Linux op FreeBSD te draaien, en niet wat beschreven staat in de Oracle installatiehandleiding.
Zoals beschreven staat in de Oracle installatiehandleiding moet de maximale grootte van het gedeelde geheugen ingesteld worden. Op FreeBSD moet SHMMAX niet gebruikt worden. SHMMAX wordt slechts uit SHMMAXPGS en PGSIZE berekend. Daarom dient SHMMAXPGS gedefinieerd te worden. Alle andere opties kunnen gebruikt worden zoals in de handleiding staat beschreven. Bijvoorbeeld:
options SHMMAXPGS=10000 options SHMMNI=100 options SHMSEG=10 options SEMMNS=200 options SEMMNI=70 options SEMMSL=61
Deze opties kunnen naargelang het gebruik van Oracle ingesteld worden.
Ook de volgende opties dienen in het kernelinstellingenbestand te staan:
options SYSVSHM #SysV gedeeld geheugen options SYSVSEM #SysV semaforen options SYSVMSG #SysV interprocescommunicatie
Creeër een oracle account op dezelfde manier als elk ander account. Het oracle account is alleen bijzonder in het opzicht dat het een Linux shell moet hebben. Dat kan door /compat/linux/bin/bash toe te voegen aan /etc/shells en de shell voor het oracle account in te stellen op /compat/linux/bin/bash.
Naast de normale Oracle variabelen als ORACLE_HOME en ORACLE_SID moeten de volgende omgevingsvariabelen ingesteld worden:
| Variabele | Waarde |
|---|---|
| LD_LIBRARY_PATH | $ORACLE_HOME/lib |
| CLASSPATH | $ORACLE_HOME/jdbc/lib/classes111.zip |
| PATH | /compat/linux/bin; /compat/linux/sbin; /compat/linux/usr/bin; /compat/linux/usr/sbin; /bin; /sbin; /usr/bin; /usr/sbin; /usr/local/bin; $ORACLE_HOME/bin |
Het is aan te raden om alle omgevingsvariabelen in .profile in te stellen. Een volledig voorbeeld is:
ORACLE_BASE=/oracle; export ORACLE_BASE ORACLE_HOME=/oracle; export ORACLE_HOME LD_LIBRARY_PATH=$ORACLE_HOME/lib export LD_LIBRARY_PATH ORACLE_SID=ORCL; export ORACLE_SID ORACLE_TERM=386x; export ORACLE_TERM CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip export CLASSPATH PATH=/compat/linux/bin:/compat/linux/sbin:/compat/linux/usr/bin PATH=$PATH:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin export PATH
Wegens een kleine inconsistentie in de Linux emulator moet de map .oracle aangemaakt worden in /var/tmp voordat het installatieprogramma wordt gestart. De gebruiker oracle moet de eigenaar van deze map zijn. Nu hoort Oracle zonder problemen te installeren. Bij problemen dienen eerst de Oracle distributie en/of de instellingen gecontroleerd te worden! Nadat Oracle is geïnstalleerd, moeten de patches uit de volgende twee secties geïnstalleerd worden.
Een veelvoorkomend probleem is dat de adapter voor het TCP-protocol niet goed is geïnstalleerd. De consequentie daarvan is dat er geen TCP-listeners gestart kunnen worden. De volgende acties helpen om dit probleem op te lossen:
# cd $ORACLE_HOME/network/lib # make -f ins_network.mk ntcontab.o # cd $ORACLE_HOME/lib # ar r libnetwork.a ntcontab.o # cd $ORACLE_HOME/network/lib # make -f ins_network.mk install
Hierna dient root.sh nogmaals te draaien!
Als Oracle geïnstalleerd wordt, worden sommige acties die als root moeten worden uitgevoerd geregistreerd in een shellscript met de naam root.sh. Dit script komt in de map orainst te staan. De volgende patch dient uitgevoerd te worden op root.sh om het de juiste locatie van chown te laten gebruiken of als alternatief kan het script onder een originele Linux shell gedraaid worden
*** orainst/root.sh.orig Tue Oct 6 21:57:33 1998 --- orainst/root.sh Mon Dec 28 15:58:53 1998 *************** *** 31,37 **** # This is the default value for CHOWN # It will redefined later in this script for those ports # which have it conditionally defined in ss_install.h ! CHOWN=/bin/chown # # Define variables to be used in this script --- 31,37 ---- # This is the default value for CHOWN # It will redefined later in this script for those ports # which have it conditionally defined in ss_install.h ! CHOWN=/usr/sbin/chown # # Define variables to be used in this script
Als Oracle niet vanaf een CD-ROM wordt geïnstalleerd, kan de broncode van root.sh aangepast worden. Die heet rthd.sh en staat in de map orainst in de broncodestructuur.
Het script genclntsh wordt gebruikt om é´n enkele gedeelde bibliotheek voor de cliënt aan te maken. Het wordt gebruikt tijdens het maken van de demonstraties. Met de volgende patch wordt de definitie van PATH uitgecommentarieerd:
*** bin/genclntsh.orig Wed Sep 30 07:37:19 1998 --- bin/genclntsh Tue Dec 22 15:36:49 1998 *************** *** 32,38 **** # # Explicit path to ensure that we're using the correct commands #PATH=/usr/bin:/usr/ccs/bin export PATH ! PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH # # each product MUST provide a $PRODUCT/admin/shrept.lst --- 32,38 ---- # # Explicit path to ensure that we're using the correct commands #PATH=/usr/bin:/usr/ccs/bin export PATH ! #PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH # # each product MUST provide a $PRODUCT/admin/shrept.lst
Hier wordt beschreven hoe de Linux binaire
compatibiliteit werkt. Het meeste van wat nu volgt is sterk gebaseerd op een
e-mailbericht van Terry Lambert <tlambert@primenet.com> aan FreeBSD
babbel mailinglijst (Message ID: <199906020108.SAA07001@usr09.primenet.com>).
FreeBSD heeft een abstractie met de naam “execution class loader”. Dit is een wig in de systeemaanroep execve(2).
Wat er gebeurt is dat FreeBSD een lijst van loaders heeft, in plaats van een enkele loader die terugvalt op de #! loader voor het draaien van elke shellinterpreter of shellscript.
Vroeger onderzocht de enige loader op het UNIX platform het magische getal (in het algemeen de eerste 4 of 8 bytes van het bestand) om te zien of het een binary was die het systeem kende en als dat het geval was laadde het de binaire loader.
Als het niet het binaire type voor het systeem was, faalde de aanroep naar execve(2) en probeerde de shell het als shellopdrachten uit te voeren.
Deze aanname was een standaard voor “wat de huidige shell ook is.”
Later werd er een hack gemaakt voor sh(1) om de eerste twee tekens te onderzoeken en als die bestonden uit :\n voerde het in plaats hiervan de csh(1) shell uit (het idee is dat SCO de hack als eerste maakte).
Wat FreeBSD nu doet is door een lijst van loaders gaan met een generieke #! loader die kennis heeft van interpreters in de zin van de karakters die volgen op de volgende witruimte tot de laatste, met uiteindelijk een terugval op /bin/sh.
Voor Linux ABI-ondersteuning ziet FreeBSD het magische getal als een ELF-binary (het maakt op dit punt geen onderscheid tussen FreeBSD, Solaris, Linux of elk ander besturingssysteem dat een ELF-beeldtype heeft).
De ELF loader zoekt naar een gespecialiseerd merk, dat een commentaargedeelte in het ELF-beeld is en dat niet aanwezig is in SVR4/Solaris ELF-binairen.
Om Linux-binairen werkend te krijgen, moeten ze gemerkt worden als het type Linux met brandelf(1):
# brandelf -t Linux bestand
Als dit gedaan is, ziet de ELF loader het Linux-merk in het bestand.
Als de ELF loader het Linux-merk tegenkomt, verplaatst de loader een pointer in de proc-structuur. Alle systeemaanroepen worden met deze pointer geïndexeerd (in een traditioneel UNIX systeem is dit de sysent[]-structuurarray, die de systeemaanroepen bevat). Ook wordt het proces gemerkt voor speciale behandeling door de valstrikvector van de signaal-trampolinecode samen met nog meer (kleine) aanpassingen die door de Linux kernelmodule worden afgehandeld.
De Linux kernelmodule bevat naast andere dingen een lijst van sysent[]-ingangen waarvan de adressen in de kernelmodule staan.
Als een systeemaanroep door de Linux-binary wordt aangeroepen, verwijdert de valstrikcode de referentie aan de functiepointer van de systeemaanroep en geeft die de ingangspunten van de systeemaanroep van Linux en niet van FreeBSD.
Verder reroot de Linux-modus dynamisch lookups. Dit is wat de optie union (niet het unionfs
bestandssysteemtype!) voor het aankoppelen van bestandssystemen effectief doet.
Eerst wordt een poging gedaan om het bestand in de map /compat/linux/origineel-pad
op te zoeken en vervolgens
alleen als dat mislukt, wordt het bestand in /origineel-pad opgezocht. Dit zorgt ervoor dat
binairen die andere binairen nodig hebben kunnen draaien (zo kan bijvoorbeeld de
Linux-gereedschapskist geheel onder Linux ABI-ondersteuning draaien). Dit betekent ook dat
Linux-binairen FreeBSD-binairen kunnen laden en
draaien als er geen overeenkomende Linux-binairen
zijn en dat er een uname(1)-opdracht in
de mappenstructuur /compat/linux gezet kan worden om
er zeker van te zijn dat Linux-binairen niet kunnen
weten dat ze niet op Linux draaien.
Effectief bevindt er zich een Linux-kernel in de FreeBSD-kernel. De verschillende onderliggende functies die alle functies implementeren die de kernel aanbiedt, zijn dezelfde tabelingangen voor de systeemaanroepen van FreeBSD als van Linux: bestandssysteembewerkingen, bewerkingen op het virtuële geheugen, signaalaflevering, System V IPC, enzovoort. Het enige verschil is dat FreeBSD-binairen de lijm functies voor FreeBSD krijgen en dat de Linux-binairen de lijm-functies voor Linux krijgen (de meeste oudere besturingssystemen hadden alleen hun eigen lijm-functies: adressen van functies die in een statische globale sysent[] structuurarray werden opgeslagen, in plaats van adressen van functies waarvan dynamisch een geïnitialiseerde pointer wordt verwijderd in de proc-structuur van het proces dat de aanroep doet).
Welke is de eigenlijke FreeBSD ABI? Dat maakt niet uit. Eigenlijk is het enige verschil dat (op dit moment; dit kan eenvoudig veranderen in een toekomstige uitgave, en dat gebeurt waarschijnlijk na deze uitgave) de lijm-functies van FreeBSD statisch gelinkt zijn in de kernel en dat de lijm-functies van Linux zowel statisch gelinkt kunnen worden als dat ze door een kernelmodule worden benaderd.
Maar is dit nu echt emulatie? Nee. Het is een ABI-implementatie, geen emulatie. Er is geen emulator (of simulator, om de volgende vraag voor te zijn) bij betrokken.
Dus waarom wordt het dan soms “Linux-emulatie” genoemd? Om het moeilijk te maken om FreeBSD te verkopen! Serieus, het is zo omdat de historische implementatie in een tijd werd gedaan toen er echt geen ander woord was om te beschrijven wat er aan de hand was, om te zeggen dat FreeBSD Linux-binairen draaide was niet waar als de code niet in de kernel gecompileerd werd of als een module geladen werd en er moest een woord zijn voor hetgeen geladen werd. Vandaar “de Linux-emulator”.
De verdere hoofdstukken van het FreeBSD handboek beslaan alle aspecten van het FreeBSD systeembeheer. Ieder hoofdstuk begint met een omschrijving van wat de leerstof in een hoofdstuk is en wat de verwachte voorkennis is.
De hoofdstukken zijn ook ontworpen om gelezen te worden als de specifieke informatie nodig is. Ze hoeven niet in een bepaalde volgorde gelezen te worden en ze hoeven ook niet gelezen te zijn voordat een gebruiker met FreeBSD aan de slag kan.
Systeeminstellingen zijn een belangrijk aspect van FreeBSD. Correcte instellingen helpen moeilijkheden bij toekomstige upgrades te voorkomen. In dit hoofdstuk wordt het instellen van FreeBSD beschreven, alsmede een aantal prestatiebevorderende maatregelen waarmee een FreeBSD systeem geoptimaliseerd kan worden.
Na het lezen van dit hoofdstuk weet de lezer:
Hoe efficiënt om te gaan met bestandssystemen en wisselpartities;
De grondbeginselen van het rc.conf instellingensysteem en van het opstarten van toepassingen (diensten) met /usr/local/etc/rc.d;
Hoe een netwerkkaart ingesteld en getest wordt;
Hoe virtuele hosts op netwerkapparatuur ingesteld worden;
Hoe de instellingenbestanden in /etc gebruikt worden;
Hoe FreeBSD geoptimaliseerd kan worden met sysctl-variabelen;
Hoe schijfprestaties te verbeteren en hoe kernelbeperkingen gewijzigd kunnen worden.
Veronderstelde voorkennis:
De grondbeginselen van UNIX en FreeBSD (Hoofdstuk 4) begrijpen;
Bekend zijn met de grondbeginselen van kernelinstellingen en compilatie (Hoofdstuk 9).
Bij het aanmaken van bestandssystemen met bsdlabel(8) of sysinstall(8) is het van belang dat op een harde schijf de gegevensoverdracht het snelst is aan de buitenste sporen en het langzaamst aan de binnenste. Kleinere en veelgebruikte bestandssystemen kunnen daarom het beste aan de buitenkant van de schijf geplaatst worden, terwijl grotere partities als /usr meer naar de binnenkant van de schijf geplaatst kunnen worden. Het is een goed idee om partities aan te maken in deze of gelijksoortige volgorde: root, swap, /var, /usr.
De grootte van de partitie /var hangt af van de wijze waarop de machine gebruikt gaat worden. Het bestandssysteem /var wordt gebruikt voor onder meer postbussen, logbestanden en printergegevens en -wachtrijen. Postbussen en logbestanden kunnen onverwacht groot worden, afhankelijk van het aantal systeemgebruikers en de bewaarduur van logbestanden. De meeste gebruikers zullen zelden meer dan ongeveer een gigabyte aan vrije schijfruimte op /var nodig hebben.
Opmerking: Er zijn een aantal gevallen waar een grote hoeveelheid ruimte in /var/tmp nodig is. Wanneer er nieuwe software wordt geïnstalleerd met pkg_add(1) pakken de pakketprogramma's een tijdelijke kopie van de pakketten uit in /var/tmp. Grote softwarepakketten, zoals Firefox, OpenOffice of LibreOffice kunnen lastig zijn om te installeren wanneer er onvoldoende vrije schijfruimte beschikbaar is onder /var/tmp.
De partitie /usr bevat veel van de benodigde systeembestanden, waaronder de ports(7) collectie (aanbevolen) en de broncode (optioneel). Beide zijn optioneel tijdens de installatie, maar we raden voor deze partitie tenminste 2 gigabyte aan.
Het is verstandig rekening te houden met de vereiste schijfruimte bij het kiezen van partitiegroottes. Als in een partitie onvoldoende vrije schijfruimte is, terwijl een andere vrijwel niet gebruikt wordt, is dat een vervelend en niet optimaal oplosbaar probleem.
Opmerking: sysinstall(8)'s Auto-defaults partitiekeuze kan in de ervaring van sommige gebruikers mogelijk te kleine /var en / partities opleveren. Partitioneren moet verstandig en niet te zuinig gebeuren.
De vuistregel is dat het wisselbestand ongeveer het dubbele van de grootte van het systeemgeheugen (RAM) moet zijn. Als de machine bijvoorbeeld 128 megabytes geheugen heeft, kan het beste een wisselbestand van (tenminste) 256 megabytes gebruikt worden. Minder dan 256 megabytes swap is in dit geval af te raden. Systemen met weinig geheugen kunnen overigens beter functioneren met meer swap. Ook is het verstandig rekening te houden met eventuele geheugenuitbreiding in de toekomst. Bovendien zijn de VM paging-algoritmen van de kernel zo afgestemd dat ze het beste presteren bij een wisselbestand van tenminste tweemaal de grootte van het geheugen. Een te kleine swap kan dus inefficiënties in de VM-code tot gevolg hebben en mogelijk problemen veroorzaken als het systeemgeheugen uitgebreid wordt.
Op grotere systemen met meerdere SCSI-schijven (of meerdere IDE-schijven op verschillende controllers) is het aan te raden om op elke schijf een wisselpartitie in te stellen (dit kan tot en met vier schijven), elk met ongeveer dezelfde grootte. De kernel kan met arbitraire groottes werken, maar interne datastructuren schalen tot viermaal de grootste swappartitie. De kernel kan de beschikbare ruimte voor het wisselbestand het meest optimaal indelen als de partities ongeveer even groot zijn. Een grote swap is prima, ook als ze zelden gebruikt wordt. Zo kan het gemakkelijker zijn om een (uit de hand gelopen) proces dat het systeem grotendeels bezet houdt te beëindigen, voordat er opnieuw opgestart moet worden.
Waarom niet één enkele grote partitie gebruiken? Er zijn verscheidene redenen waarom dit niet zo'n goed idee is. De verschillende partities hebben hun eigen karakteristieke operationele gedrag en vereisten. Door ze te scheiden zijn er betere mogelijkheden om het systeem te optimaliseren. Vanaf de / en /usr partities wordt bijvoorbeeld vooral gelezen en er wordt weinig naar geschreven, terwijl er in /var en /var/tmp zowel veel gelezen als geschreven wordt.
Door een systeem goed te partitioneren wordt vermeden dat fragmentatie die optreedt in de kleinere partities met veel schrijfactiviteit doorsijpelt naar partities die vooral lees-intensief zijn. Door schrijf-intensieve partities aan het begin van de schijf te plaatsen, zijn de prestaties wat betreft invoer/uitvoer het beste daar waar het het meest nodig is. Ofschoon er natuurlijk ook de best mogelijke in/uit prestaties wenselijk zijn in de grotere partities, weegt het plaatsen van deze bestandssystemen aan het begin van de schijf niet tegen de voordelen van het plaatsen van /var aan het begin van de schijf (na root en swap) voor de totale snelheid van het systeem. Tenslotte zijn er veiligheidsoverwegingen. Een compacte en nette rootpartitie die vrijwel alleen-lezen is, heeft een betere kans om een nare crash te overleven.
De voornaamste lokatie voor systeeminstellingen is /etc/rc.conf. Dit bestand bevat een scala aan instellingen, die gebruikt wordt om het systeem in te stellen bij het opstarten. De naam impliceert dit al. Het is informatie voor de rc* bestanden (rc staat voor “resource configuration” of broninstellingen).
De systeembeheerder wordt geacht regels toe te voegen aan rc.conf om de standaardinstellingen uit /etc/defaults/rc.conf aan te passen. Het standaardbestand moet niet letterlijk gekopiëerd worden naar /etc. Het bevat standaardwaardes en is niet bedoeld als voorbeeld. Alle wijzigingen die specifiek zijn voor een systeem horen in /etc/rc.conf thuis.
In een clusterscenario is het nuttig om systeemspecifieke instellingen te scheiden van algemene instellingen die voor het hele cluster gelden. Hiervoor kunnen een aantal strategieën worden gebruikt. De aanbevolen benadering is om systeem-specifieke instellingen in het bestand /etc/rc.conf.local te plaatsen. Een voorbeeld:
/etc/rc.conf:
sshd_enable="YES" keyrate="fast" defaultrouter="10.1.1.254"
/etc/rc.conf.local:
hostname="node1.voorbeeld.org" ifconfig_fxp0="inet 10.1.1.1/8"
rc.conf kan naar elk systeem gedistribueerd worden met rsync of een gelijksoortig programma, terwijl rc.conf.local uniek blijft.
Het actualiseren van het systeem met sysinstall(8) of make world overschrijft rc.conf niet, zodat de bestaande systeeminstellingen niet verloren gaan.
Tip: Het instellingenbestand /etc/rc.conf wordt gelezen door sh(1). Dit stelt systeembeheerders in staat om een zekere hoeveelheid logica aan dit bestand toe te voegen, dat kan helpen in het creëren van zeer ingewikkelde configuratiescenario's. Bekijk rc.conf(5) voor meer informatie over dit onderwerp.
Geïnstalleerde toepassingen hebben meestal hun eigen instellingenbestanden, met hun eigen syntaxis, etc. Het is van belang deze bestanden apart te houden van het basissysteem, zodat ze makkelijk gelokaliseerd kunnen worden en beheerd kunnen worden met de hulpmiddelen voor pakketbeheer.
Deze bestanden worden meestal geïnstalleerd in /usr/local/etc. Als een toepassing een uitgebreide verzameling bestanden voor instellingen heeft, wordt er een submap voor aangemaakt.
Bij de installatie van een port of pakket, worden normaliter ook voorbeeldbestanden met instellingen geïnstalleerd. Deze zijn doorgaans te herkennen aan een toevoegsel .default. Als er geen bestaande instellingenbestanden voor de toepassing zijn, kunnen ze gemaakt worden door de .default-bestanden te kopiëren.
Een voorbeeld is de map /usr/local/etc/apache:
-rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf -rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf.default -rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf -rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf.default -rw-r--r-- 1 root wheel 12205 May 20 1998 magic -rw-r--r-- 1 root wheel 12205 May 20 1998 magic.default -rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types -rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types.default -rw-r--r-- 1 root wheel 7980 May 20 1998 srm.conf -rw-r--r-- 1 root wheel 7933 May 20 1998 srm.conf.default
Aan de grootte van de bestanden is te zien dat alleen srm.conf gewijzigd is. Als later de port Apache wordt vernieuwd, wordt dit bestand niet overschreven.
Veel gebruikers kiezen ervoor om software van derden te installeren op FreeBSD vanuit de Portscollectie. In veel gevallen is het noodzakelijk om de software dusdanig in te stellen dat het opstart tijdens het opstarten van de computer. Diensten zoals mail/postfix of www/apache22 zijn slechts twee voorbeelden van softwarepakketten die gestart kunnen worden tijdens de systeemstart. In deze paragraaf wordt toegelicht hoe software van derde partijen kan worden gestart.
In FreeBSD worden de meeste diensten, zoals cron(8), door de opstartscripts van het systeem gestart. Deze scripts kunnen verschillen tussen FreeBSD en leverancierversies, echter het meest belangrijke aspect om in gedachten te houden is dat hun opstartinstellingen verwerkt kunnen worden door simpele opstartscripts.
Nu FreeBSD rc.d heeft, zijn de instellingen van applicaties die mee moeten opstarten versimpeld en rijker aan mogelijkheden. Door gebruik te maken van de sleutelwoorden die in de paragraaf rc.d behandeld worden, kunnen applicaties nu starten na andere diensten. DNS kan bijvoorbeeld extra opties meekrijgen van /etc/rc.conf in plaats van hard ingestelde opties in het opstartscript. Een basisscript ziet er ongeveer als volgt uit:
#!/bin/sh
#
# PROVIDE: utility
# REQUIRE: DAEMON
# KEYWORD: shutdown
. /etc/rc.subr
name=utility
rcvar=utility_enable
command="/usr/local/sbin/utility"
load_rc_config $name
#
# VERANDER DE STANDAARDWAARDEN HIER NIET
# STEL ZE IN HET BESTAND /etc/rc.conf IN
#
utility_enable=${utility_enable-"NO"}
pidfile=${utility_pidfile-"/var/run/utility.pid"}
run_rc_command "$1"
Dit script zorgt ervoor dat utility wordt gestart na de pseudodienst DAEMON. Het biedt ook de mogelijkheid voor het instellingen en volgen van het PID of het proces-ID bestand.
Voor deze applicatie kan dan de volgende regel in /etc/rc.conf geplaatst worden:
utility_enable="YES"
Deze methode maakt het volgende mogelijk: makkelijker commandoregelopties manipuleren, importeren van standaardfuncties uit /etc/rc.subr, compatibiliteit met het gereedschap rcorder(8) en het levert makkelijkere configuratie via het bestand rc.conf.
Andere diensten, zoals POP3-server daemons, IMAP, enzovoort, kunnen gestart worden door gebruik te maken van inetd(8). Daaraan is voorafgegaan dat die dienst uit de Portscollectie is geïstalleerd en dat er een regel met instellingen is toegevoegd aan /etc/inetd.conf of één van de bestaande niet-actieve regels is geactiveerd. Werken met inetd en zijn instellingen wordt uitgebreid toegelicht in de paragraaf over inetd.
In sommige gevallen is het handiger om cron(8) te gebruiken om diensten te starten. Deze aanpak heeft een aantal voordelen omdat cron start als de eigenaar van crontab. Dit stelt reguliere gebruikers in staat om sommige applicaties te starten en te onderhouden.
cron levert een unieke optie: in plaats van een tijdsspecificatie kan @reboot gebruikt worden. Dit zorgt ervoor dat de taak gestart wordt als cron(8) gestart wordt, meestal tijdens een systeemstart.
Een zeer nuttig hulpprogramma in FreeBSD is cron(8). De daemon cron draait op de achtergrond en controleert voortdurend /etc/crontab. Ook controleert cron de map /var/cron/tabs, op zoek naar nieuwe crontab bestanden. Deze crontab bestanden bevatten informatie over specifieke taken die cron moet verrichten op gezette tijden.
cron gebruikt twee verschillende soorten instellingenbestanden: de systeemcrontab en gebruikerscrontabs. Deze formaten verschillen alleen in het zesde en verdere velden. In de systeemcrontab zal cron het commando draaien als de gebruiker die in het zesde veld is opgegeven. In een gebruikerscrontab draaien alle commando's onder de gebruiker die de crontab heeft aangemaakt, dus is het zesde veld het laatste veld; dit is een belangrijk beveiligingsaspect. Het laatste veld is altijd het commando dat gedraaid wordt.
Opmerking: Gebruikerscrontabs geven individuele gebruikers de mogelijkheid om bepaalde terugkerende taken automatisch te laten uitvoeren zonder dat root-rechten noodig zijn. Commando's in de crontab van een gebruiker worden uitgevoerd met de rechten van de eigenaar.
root kan ook een gebruikerscrontab aanleggen net als elke andere gebruiker. Dit is niet dezelfde als /etc/crontab (de systeemcrontab). Omdat de systeemcrontab in de praktijk de commando's als root uitvoert, is het doorgaans niet nodig om een gebruikerscrontab voor root te maken.
/etc/crontab (de systeemcrontab) ziet er uit als volgt:
# /etc/crontab - root's crontab for FreeBSD # # $FreeBSD: src/etc/crontab,v 1.32 2002/11/22 16:13:39 tom Exp $ ## SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log # # #minuut uur mdag maand wdag wie commando
# # */5 * * * * root /usr/libexec/atrun
![]()




Commando's kunnen een willekeurig aantal opties of argumenten meekrijgen. Als commando's echter meerdere regels nodig hebben moeten deze regels afgebroken worden met een backslash “\” karakter, om aan te geven dat ze op de volgende regel vervolgd worden.
Dit is de basisopzet voor elk crontab bestand. De enige uitzondering is de aanwezigheid van veld zes, waar de gebruikersnaam wordt aangegeven. Dit veld bestaat alleen in het systeembestand /etc/crontab. Voor crontabbestanden van individuele gebruikers moet dit veld worden weggelaten.
Belangrijk: De onderstaande procedure moet niet gebruikt worden om de systeemcrontab /etc/crontab te wijzigen of te installeren. Er kan een gewone editor gebruikt worden. cron ziet dat het bestand veranderd is en begint direct met het gebruiken van de nieuwe versie. Deze FAQ vraag geeft verdere uitleg.
Om een nieuwe crontab te installeren moet eerst een bestand in het juiste formaat gemaakt worden en daarna moet het geiuml;nstalleerd worden met commando crontab:
# crontab crontabbestand
In dit voorbeeld is crontabbestand de naam van een eerder gemaakt crontab-bestand.
Er bestaat ook een optie om een lijst van geïnstalleerde crontab-bestanden op te vragen, namelijk de optie -l van crontab.
Gebruikers die hun eigen crontabbestand willen schrijven zonder het gebruik van een sjabloon, kunnen gebruik maken van crontab -e. Dit opent de EDITOR met een leeg bestand. Als het bestand wordt opgeslagen en de editor wordt afgesloten, wordt het bestand automatisch als crontab geïnstalleerd.
Een gebruikerscrontab kan verwijderd worden door de met
crontab de optie -r te
gebruiken.
Sinds 2002 gebruikt FreeBSD het NetBSD rc.d systeem bij het
opstarten van het systeem. Veel van de bestanden in /etc/rc.d
zijn scripts voor basisdiensten die werken met de opties start, stop en restart, analoog aan hoe diensten die via een port of pakket zijn
geïnstalleerd gestart worden met de scripts in /usr/local/etc/rc.d. sshd(8) kan
bijvoorbeeld als volgt herstart worden:
# /etc/rc.d/sshd restart
Deze procedure is vrijwel gelijk voor andere diensten. Uiteraard worden diensten meestal automatisch tijdens het opstarten van de computer gestart zoals in rc.conf(5) staat. Om de Network Address Translation daemon bij het opstarten te laten starten is de volgende regel in /etc/rc.conf bijvoorbeeld voldoende:
natd_enable="YES"
Als er reeds een natd_enable="NO" regel is, kan NO gewoon in YES veranderd worden. De rc scripts starten, voor zover nodig, automatisch andere afhankelijke diensten.
Omdat het rc.d systeem in eerste instantie bedoeld is om
diensten te starten en stoppen bij het opstarten en afsluiten van het systeem, werken de
standaardopties start, stop en
restart alleen als de juiste variabelen in /etc/rc.conf zijn ingesteld. Het commando sshd
restart alleen dan als sshd_enable de waarde YES heeft in /etc/rc.conf. Als er een
dienst gestart, gestopt of herstart moet worden, ongeacht de definities in /etc/rc.conf, moet het commando voorafgegaan worden door
“one”. Dus om sshd te herstarten ongeacht de
instellingen in /etc/rc.conf, voldoet het volgende
commando:
# /etc/rc.d/sshd onerestart
Het is eenvoudig te controleren of een dienst is ingeschakeld is in /etc/rc.conf door het bijpassende rc.d-script uit te voeren met de optie rcvar. Voor sshd:
# /etc/rc.d/sshd rcvar # sshd $sshd_enable=YES
Opmerking: De tweede regel (# sshd) is de uitvoer van sshd, geen root-console.
De optie status wordt gebruikt om vast te stellen of een
dienst gestart is. Om bijvoorbeeld te controleren of sshd
gestart is:
# /etc/rc.d/sshd status sshd is running as pid 433.
In sommige gevallen is het ook mogelijk om een dienst te herstarten met de optie reload. Dan wordt er getracht een signaal te sturen aan een
individuele dienst, waarbij de dienst de bestanden met instellingen opnieuw in moet
lezen. Meestal komt dit neer op het verzenden van het signaal SIGHUP. Deze optie wordt niet door alle diensten ondersteund.
Het rc.d-systeem wordt niet alleen gebruikt voor netwerkdiensten, maar ook voor het merendeel van de systeemstart. In dit kader is bijvoorbeeld het bestand bgfsck interessant. Als dit script wordt uitgevoerd, wordt de volgende boodschap getoond:
Starting background file system checks in 60 seconds.
Dit script wordt dus gebruikt voor bestandssysteemcontrole in de achtergrond, hetgeen alleen tijdens de systeemstart gebeurt.
Veel systeemdiensten zijn afhankelijk van andere diensten om correct te kunnen functioneren. Zo starten NIS en andere RPC-gebaseerde diensten niet als de dienst rpcbind (portmapper) nog niet draait. Om dit te stroomlijnen wordt informatie over afhankelijkheden en andere metagegevens ingevoegd in het commentaar bovenaan het opstartscript. Deze commentaarregels worden vervolgens tijdens de systeemstart met rcorder(8) verwerkt om zo vast te stellen in welke volgorde de systeemdiensten gestart moeten worden.
De volgende woorden moeten in alle opstartscripts staan (ze zijn benodigd door rc.subr(8) om het opstartscript te activeren):
PROVIDE: geeft aan in welke diensten dit bestand voorziet.
REQUIRE: geeft aan welke andere diensten vereist zijn voor deze dienst. Dit script wordt uitgevoerd na de aangegeven diensten.
BEFORE: geeft diensten aan die afhankelijk zijn van deze dienst. Dit bestand wordt uitgevoerd vóór de aangegeven diensten.
Met deze methode kan een systeembeheerder gemakkelijk systeemdiensten besturen, zonder gedoe met “runlevels” zoals bij sommige andere UNIX systemen.
Meer informatie over het rc.d-systeem staat in rc(8) en rc.subr(8). Als u geïnteresseerd bent in het schrijven van uw eigen rc.d-script of om de huidige scripts te verbeteren is wellicht dit artikel interessant.
Het is tegenwoordig nauwelijks voorstelbaar dat een computer geen netwerkverbinding heeft. Het toevoegen en instellen van een netwerkkaart is een gebruikelijke taak voor een FreeBSD-beheerder.
Voor het zoeken begint, moet duidelijk zijn om welke kaart het gaat, welke chip erop zit en of het een PCI- of ISA-kaart is. FreeBSD ondersteunt vele kaarten. Op de Hardware Compatibiliteitslijst voor de betreffende uitgave staan de kaarten die ondersteund worden.
Als duidelijk is dat een kaart ondersteund wordt, moet vastgesteld worden wat het geschikte stuurprogramma is. In het bestand /usr/src/sys/conf/NOTES staat een lijst van stuurprogramma's voor netwerkinterfaces met wat informatie over de ondersteunde chipsets of kaarten. In geval van twijfel biedt de hulppagina voor het stuurprogramma (man) vaak uitkomst. In het algemeen bevat deze meer informatie over de ondersteunde hardware en mogelijke problemen die kunnen optreden.
Als een veelgebruikte kaart gebruikt wordt, hoeft meestal niet ver gezocht te worden. Stuurprogramma's voor veelvoorkomende netwerkinterfaces zijn al aanwezig in de algemene kernel GENERIC. In dat geval wordt zo'n kaart al gevonden bij het opstarten, bijvoorbeeld met het volgende bericht:
dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38 000ff irq 15 at device 11.0 on pci0 miibus0: <MII bus> on dc0 bmtphy0: <BCM5201 10/100baseTX PHY> PHY 1 on miibus0 bmtphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto dc0: Ethernet address: 00:a0:cc:da:da:da dc0: [ITHREAD] dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30 000ff irq 11 at device 12.0 on pci0 miibus1: <MII bus> on dc1 bmtphy1: <BCM5201 10/100baseTX PHY> PHY 1 on miibus1 bmtphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto dc1: Ethernet address: 00:a0:cc:da:da:db dc1: [ITHREAD]
In dit voorbeeld zitten er twee kaarten in het systeem die het stuurprogramma dc(4) gebruiken.
Als het stuurprogramma voor een NIC geen onderdeel is van de kernel GENERIC, dan dient het juiste stuurprogramma voor die NIC geladen te worden. Dit kan op twee manieren:
De meest eenvoudige manier is het laden van een kernelmodule voor een netwerkkaart met kldload(8) of automatisch tijdens het opstarten van het systeem door de benodigde regel toe te voegen aan /boot/loader.conf. Niet alle NIC-stuurprogramma's zijn als module beschikbaar. Zo zijn er bijvoorbeeld geen modules beschikbaar voor ISA-kaarten.
Ondersteuning voor een kaart kan ook in de kernel gecompileerd worden. In /usr/src/sys/conf/NOTES, /usr/src/sys/arch/conf/NOTES en de hulppagina van het stuurprogramma is na te lezen wat er in het kernelinstellingenbestand moet staan. In Hoofdstuk 9 staat meer informatie over het compileren van een eigen kernel. Als een netwerkkaart al bij het opstarten wordt herkend door de kernel GENERIC, is er geen reden om een andere kernel te bouwen.
Helaas zijn er nog steeds veel leveranciers die geen schema's leveren voor stuurprogramma's aan de open-source gemeenschap, omdat ze deze informatie beschouwen als handelsgeheimen. Als gevolg daarvan hebben de ontwikkelaars van FreeBSD en andere projecten twee keuzes: zelf de stuurprogramma's ontwikkelen door een langdurig en pijnlijk proces van de huidige stuurprogramma's te ontcijferen, of door gebruik te maken van de huidige binaire bestanden voor het Microsoft Windows platform. De meeste ontwikkelaars, inclusief diegeen die gekoppeld zijn aan FreeBSD, hebben voor het laatste gekozen.
Dankzij de bijdragen van Bill Paul (wpaul) is er “native” ondersteuning voor de Network Driver Interface Specification (NDIS). De FreeBSD NDISulator (ook wel bekend als Project Evil) neemt een binair Windows stuurprogramma en doet net alsof deze in een Windows systeem draait. Omdat het stuurprogramma ndis(4) een Windows binary gebruikt; draait het alleen op i386- en amd64-systemen. PCI, CardBus, PCMCIA (PC-Card) en USB-apparaten worden ondersteund.
Om de NDISulator te gebruiken zijn drie dingen nodig:
De bronbestanden van de kernel
Een Windows XP stuurprogramma (met de extensie .SYS)
Een instellingenbestand van het Windows XP stuurprogramma (met de extensie .INF)
Lokaliseer de bestanden voor uw specifieke kaart. Over het algemeen kunnen deze gevonden worden op de bijgeleverde CD's of op de website van de leverancier. In de volgende voorbeelden maken we gebruik van W32DRIVER.SYS en W32DRIVER.INF.
De bit-breedte van het stuurprogramma moet overeenkomen met die van het stuurprogramma. Gebruik voor FreeBSD/i386 een 32-bits Windows stuurprogramma. Voor FreeBSD/amd64 is een 64-bits Windows stuurprogramma nodig.
De volgende stap is het compileren van het binaire stuurprogramma in een laadbare kernelmodule. Gebruik ndisgen(8) als root:
# ndisgen /pad/naar/W32DRIVER.INF /pad/naar/W32DRIVER.SYS
ndisgen(8) is interactief en vraagt om extra informatie als het dat nodig heeft. Een nieuwe kernel-module wordt in de huidige map geschreven. Gebruik kldload(8) om de nieuwe module te laden:
# kldload ./W32DRIVER_SYS.ko
Naast de gegenereerde kernelmodule, moeten ook de modules ndis.ko en if_ndis.ko geladen worden. Dit zou automatisch moeten gebeuren als er een module geladen wordt dit afhankelijk is van ndis(4). Als ze handmatig ingeladen moeten worden gebruik dan de volgende commando's:
# kldload ndis # kldload if_ndis
Het eerste commando laadt de stuurprogrammawrapper voor de NDIS miniport, de tweede laadt de daadwerkelijke netwerkinterface.
Controleer nu dmesg(8) om te zien of er ergens fouten voorkomen. Als alles goed gegaan is ziet u ongeveer het volgende:
ndis0: <Wireless-G PCI Adapter> mem 0xf4100000-0xf4101fff irq 3 at device 8.0 on pci1 ndis0: NDIS API version: 5.0 ndis0: Ethernet address: 0a:b1:2c:d3:4e:f5 ndis0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps ndis0: 11g rates: 6Mbps 9Mbps 12Mbps 18Mbps 36Mbps 48Mbps 54Mbps
Vanaf dit moment kan de ndis0 net zo gebruikt worden als elke andere netwerkkaart (bv. dc0).
Het systeem kan geconfigureerd worden zodat de NDIS-modules automatisch gestart worden tijdens het opstarten van het systeem, net zoals bij andere modules. Kopieer eerst de gegenereerde module W32DRIVER_SYS.ko naar de map /boot/modules. Voeg daarna de volgende regel toe aan /boot/loader.conf:
W32DRIVER_SYS_load="YES"
Nadat een geschikt stuurprogramma geladen is, moet de kaart nog ingesteld worden. Mogelijk is dit al gebeurd door sysinstall tijdens de installatie.
Om de instellen van de netwerkkaarten weer te geven:
% ifconfig
dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80008<VLAN_MTU,LINKSTATE>
ether 00:a0:cc:da:da:da
inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
dc1: flags=8802<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80008<VLAN_MTU,LINKSTATE>
ether 00:a0:cc:da:da:db
inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
media: Ethernet 10baseT/UTP
status: no carrier
plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> metric 0 mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=3<RXCSUM,TXCSUM>
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
inet6 ::1 prefixlen 128
nd6 options=3<PERFORMNUD,ACCEPT_RTADV>
In dit voorbeeld werden de volgende apparaten weergegeven:
dc0: de eerste Ethernet-interface;
dc1: de tweede Ethernet-interface;
plip0: De parallele poort-interface (mits er een parallele poort aanwezig is op de machine)
lo0: het loopback-apparaat;
FreeBSD gebruikt de naam van het stuurprogramma gevolgd door een nummer voor de volgorde waarop de kaarten gedetecteerd zijn bij het opstarten. sis2 is de derde netwerkkaart in het systeem die het stuurprogramma sis(4) gebruikt.
In het vorige voorbeeld is het apparaat dc0 volledig operationeel. Dit blijkt uit de volgende indicatoren:
UP betekent dat de kaart ingesteld is en klaar is voor gebruik;
De kaart heeft een Internet (inet) adres (in dit geval 192.168.1.3);
Het heeft een geldig subnetmasker (netmask; 0xffffff00 is hetzelfde als 255.255.255.0);
Het heeft een geldig broadcastadres (in dit geval 192.168.1.255);
Het MAC-adres van de kaart (ether) is 00:a0:cc:da:da:da;
De fysieke mediaselectie staat in autoselectiemodus (media: Ethernet autoselect (100baseTX <full-duplex>)). dc1 is ingesteld om met 10baseT/UTP-media te werken. Meer informatie over de mogelijke mediatypes staan in de hulppagina's voor het betreffende stuurprogramma.
De status van de verbinding (status) is active, dat wil zeggen dat de drager is gevonden. Bij dc1staat echter status: no carrier. Dit is normaal als er geen Ethernetkabel in de kaart gestoken is.
Als de uitvoer ifconfig(8) er ongeveer zoals hieronder uitziet, dan is de netwerkkaart nog niet ingesteld:
dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80008<VLAN_MTU,LINKSTATE>
ether 00:a0:cc:da:da:da
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
Om de kaart in te stellen zijn root-rechten nodig. De netwerkkaart kan vanaf de console worden ingesteld met ifconfig(8), maar dan moet dat na elke herstart herhaald worden. Daarom wordt het vrijwel altijd in /etc/rc.conf gezet.
In /etc/rc.conf moet voor elke netwerkkaart in een systeem een regel toegevoegd worden. In het huidige voorbeeld zou dat het volgende kunnen zijn:
ifconfig_dc0="inet 192.168.1.3 netmask 255.255.255.0" ifconfig_dc1="inet 10.0.0.1 netmask 255.255.255.0 media 10baseT/UTP"
dc0, dc1, enzovoort, moeten vervangen worden door de correcte stuurprogramma's voor de netwerkkaarten, zo ook de IP-adressen. In de handleiding van het stuurprogramma en van ifconfig(8) staan meer details over de mogelijke opties en in rc.conf(5) staat meer informatie over /etc/rc.conf.
Als het netwerk al is ingesteld tijdens het installeren van FreeBSD staan er al enkele regels met betrekking tot de netwerkkaart(en) in /etc/rc.conf. Het is dus handig /etc/rc.conf te controleren voordat er regels toegevoegd worden.
Ook /etc/hosts moet worden gewijzigd om de namen en IP adressen van verschillende machines op het lokale netwerk, als ze er nog niet in staan. Meer informatie staat in hosts(5) en /usr/share/examples/etc/hosts.
Opmerking: Als internettoegang nodig is met dit apparaat, kan het zijn dat de default gateway en de naamserver handmatig moeten worden ingesteld:
# echo 'defaultrouter="your_default_router"' >> /etc/rc.conf # echo 'nameserver your_DNS_server' >> /etc/resolv.conf
Als de veranderingen in /etc/rc.conf zijn gemaakt, moet het systeem opnieuw gestarten worden (of moeten nauwkeurig alle daemons gestart of herstart worden). Veranderingen aan de interface(s) worden dan toegepast en dan kan er controleerd worden of herstarten goed werkt zonder foutmeldingen. Als alternatief kan ook het netwerk systeem herstart worden:
# /etc/rc.d/netif restart
Opmerking: Als er ook een default gateway ingesteld is in het /etc/rc.conf bestand, moet ook onderstaand command worden gegeven:
# /etc/rc.d/routing restart
Zodra het netwerk systeem is herstart, moeten de netwerk interfaces opnieuw getest worden.
Om te controleren of een ethernet kaart goed geconfigureerd is, moeten er twee dingen gedaan worden. Allereerst, ping de interface zelf, en daarna een andere machine op het LAN.
Test eerst de lokale interface:
% ping -c5 192.168.1.3 PING 192.168.1.3 (192.168.1.3): 56 data bytes 64 bytes from 192.168.1.3: icmp_seq=0 ttl=64 time=0.082 ms 64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.074 ms 64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.076 ms 64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.108 ms 64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.076 ms --- 192.168.1.3 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms
Nu kan er een andere machine op het LAN gepinged worden:
% ping -c5 192.168.1.2 PING 192.168.1.2 (192.168.1.2): 56 data bytes 64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.726 ms 64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.766 ms 64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.700 ms 64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.747 ms 64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.704 ms --- 192.168.1.2 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms
Dit kan ook worden geprobeerd met de machine naam in plaats van met 192.168.1.2 als dit geconfigureerd is in het /etc/hosts bestand.
Het testen en zoeken van problemen is altijd een pijnpunt, welke verminderd kan worden door een aantal simpele dingen eerst te controleren. Is de netwerkkabel ingestoken? Zijn de netwerk instellingen correct opgegeven? Is de firewall goed geconfigureerd? Is de netwerkkaart ondersteund door FreeBSD? Controleer altijd de hardware notities voordat er een probleem rapport wordt verstuurd. Update naar de laatste -STABLE versie, en controleer de mailing lijsten en misschien zelfs het internet.
Als de kaart werkt, maar de prestaties zijn slecht, dan kan het de moeite waard zijn om tuning(7) door te nemen. Incorrecte netwerkinstellingen kunnen ook tot langzame verbindingen leiden.
Soms kunnen enkele “device timeouts” optreden. Met sommige kaarten is dit normaal gedrag. Maar als dit continu gebeurt of storend is, is het verstandig uit te zoeken of er geen sprake is van een hardwareconfict tussen de netwerkkaart en een ander apparaat. Ook dient nogmaals de bekabeling gecontroleerd te worden. Misschien zit er niets anders op dan een andere netwerkkaart te gebruiken.
Het is ook mogelijk dat er “watchdog timeout” foutmeldingen optreden. Als eerste moet dan de netwerkkabel gecontroleerd worden. Veel kaarten hebben een PCI-slot nodig dat Bus Mastering ondersteunt. Sommige oudere moederborden hebben maar één PCI-slot waarmee dit kan (meestal slot 0). In de documentatie van de netwerkkaart en het moederbord is na te gaan of dit het probleem is.
“No route to host” meldingen treden op als het systeem niet in staat is om een pakket naar de eindbestemming te routeren. Dit kan gebeuren als er geen standaardroute aangegeven is of als er een kabel niet verbonden is. De uitvoer van netstat -rn moet gecontroleerd worden of er een geldige route is naar de bestemming. Mocht dit niet het geval zijn, dan staat er meer informatie in Hoofdstuk 32.
“ping: sendto: Permission denied” foutmeldingen worden vaak veroorzaakt door een verkeerd ingestelde firewall. Als de kernel ipfw activeert bij het opstarten zonder dat er firewallregels zijn gedefiniëerd, is het standaardbeleid om alle verkeer te weigeren, zelfs pings! In Hoofdstuk 31 staat meer informatie.
Er kan ook sprake zijn van onvoldoende prestaties doordat de instelling van de mediaselectie niet optimaal is. In dergelijke gevallen is het mogelijk om de mediaselectie niet als autoselect in te stellen, maar expliciet aan te geven wat de mediaselectie moet zijn, bijvoorbeeld 10baseT/UTP voor twisted pair. Hoewel dit voor de meeste hardware helpt, kan het zijn dat de problemen blijven. Dan moeten nogmaals de netwerkinstellingen gecontroleerd worden en geeft de tuning(7) handleiding wellicht meer informatie.
FreeBSD wordt veel gebruikt voor virtuele sitehosting, waarbij één fysieke server er op het netwerk uitziet alsof het meerdere servers zijn. Dit kan bereikt worden door meerdere IP-adressen toe te kennen aan dezelfde interface.
Een bepaalde netwerkinterface heeft een “echt” adres en kan daarnaast een willekeurig aantal “alias”-adressen hebben. Normaliter worden dergelijke aliassen toegevoegd door aliasregels toe te voegen aan /etc/rc.conf.
Een aliasregel voor de interface fxp0 ziet er zo uit:
ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"
De aliasregels moeten beginnen met alias0 en moete elkaar dan opvolgen (bijvoorbeeld _alias1,, _alias2, enzovoort). Het instelproces stopt als er een nummer ontbreekt.
Het is belangrijk dat aliassen het juiste netmasker hebben. Dit is eenvoudig: Een bepaalde interface moet altijd één adres hebben dat het netmasker van het netwerk correct representeert. Elk ander adres binnen dit netwerk op deze interface (alias) moet een netmasker van allemaal 1'en (bits) hebben (getoond als 255.255.255.255 of 0xffffffff).
Een voorbeeld. Stel de interface fxp0 is verbonden met twee netwerken, het netwerk 10.1.1.0 met masker 255.255.255.0 en het netwerk 202.0.75.16 met netmasker 255.255.255.240. Het systeem moet ook de adressen 10.1.1.1 tot en met 10.1.1.5 en 202.0.75.17 tot en met 202.0.75.20 krijgen. Zoals hierboven vermeld, heeft alleen het eerste adres in een netwerkreeks (in dit geval 10.0.1.1 en 202.0.75.17) een geldig netmasker. Alle overige (10.1.1.2 tot en met 10.1.1.5 en 202.0.75.18 tot en met 202.0.75.20) moeten ingesteld worden met het netmasker 255.255.255.255.
De volgende regels voor /etc/rc.conf stellen een adapter in voor het bovenstaande scenario:
ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0" ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255" ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255" ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255" ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255" ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240" ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255" ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255" ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255"
Instellingengegevens wordt in een aantal mappen bewaard. Daar zijn onder andere:
| /etc | Generieke systeeminstellingenbestanden, specifiek voor het systeem. |
| /etc/defaults | De standaardversies van systeeminstellingenbestanden. |
| /etc/mail | Extra sendmail(8) instellingenbestanden of instellingenbestanden voor andere MTAs. |
| /etc/ppp | Instellingen voor zowel gebruiker- als kernel-ppp programma's. |
| /etc/namedb | Standaardlocatie voor named(8) gegevens. Normaal gesproken bevinden zich hier named.conf en zonebestanden. |
| /usr/local/etc | Instellingenbestanden voor geïnstalleerde software. Kan submappen hebben waarin bij elkaar horende instellingengegevens van een applicatie gegroepeerd zijn. |
| /usr/local/etc/rc.d | Start- en stopscripts voor geïnstalleerde diensten. |
| /var/db | Automatisch gemaakte systeemspecifieke databasebestanden, zoals de pakketdatabase, de locate(1) database, enzovoort. |
In /etc/resolv.conf wordt voorgeschreven op welke wijze FreeBSD het Domain Name System (DNS) moet gebruiken.
De meest voorkomende termen in resolv.conf zijn:
| nameserver | Het IP-adres van een naamserver die ondervraagd moet worden voor naam/IP-conversie. De servers worden in volgorde geprobeerd en het maximale aantal is drie. |
| search | Zoeklijst voor het opzoeken van hostnamen. Meestal wordt deze bepaald door het domein waarop de lokale hostnaam zich bevindt. |
| domain | De lokale domeinnaam. |
Een typisch resolv.conf bestand:
search example.com nameserver 147.11.1.11 nameserver 147.11.100.30
Opmerking: search en domain dienen niet tegelijk gebruikt te worden.
Als DHCP wordt gebruikt: dhclient(8) overschrijft meestal resolv.conf met informatie ontvangen van de DHCP-server.
/etc/hosts is een eenvoudige tekstdatabase uit de dagen van het oude Internet. Het werkt samen met DNS en NIS om namen en IP adressen over en weer te vertalen. Lokale computers, verbonden via een LAN, kunnen hier het beste in opgenomen worden om zo op simpele wijze naam/IP conversie voor een LAN te hebben, zonder noodzaak voor een named(8) server. Ook kunnen naamaliassen toegekend worden (vergelijkbaar met CNAMES bij DNS). Op soortgelijke wijze kan /etc/hosts gebruikt worden als een (zeer beperkte) lokale DNS cache.
# $FreeBSD$ # # Host Database # Dit bestand hoort de adressen en aliassen te bevatten # voor de lokale hosts die dit bestand gebruiken. # Bij gebruik van DNS of NIS hoeft dit bestand helemaal niet gebruikt # te worden. Zie /etc/nsswitch.conf voor de volgorde van resolutie. # # ::1 localhost localhost.my.domain myname.my.domain 127.0.0.1 localhost localhost.my.domain myname.my.domain # # Verzonnen netwerk. #10.0.0.2 myname.my.domain myname #10.0.0.3 myfriend.my.domain myfriend # # Volgens RFC 1918 mogen de volgende IP netwerken gebruikt worden # als private netwerken die niet met Internet verbonden zijn: # # 10.0.0.0 - 10.255.255.255 # 172.16.0.0 - 172.31.255.255 # 192.168.0.0 - 192.168.255.255 # # Als er toch verbinding moet zijn met Internet, zijn echte # officieel toegewezen nummers nodig. Probeer ECHT GEEN eigen # netwerknummers te verzinnen, maar vraag ze op bij de provider # (als die er is) of bij de Internet Registry (ftp naar # rs.internic.net, map `/templates'). #
/etc/hosts heeft als formaat:
[Internet address] [official hostname] [alias1] [alias2] ...
Bijvoorbeeld:
10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2
In hosts(5) staat meer informatie.
syslog.conf is het instellingenbestand voor het programma syslogd(8). Het geeft aan welke soorten syslog-berichten er gelogd moeten worden en naar welke logboekbestanden, apparaten, gebruikers of machines.
# $FreeBSD$ # # Spaties zijn TOEGESTAAN als veldscheiding in dit bestand. # Maar andere *nix-achtige systemen eisen nog steeds het gebruik # van tabs als veldscheiding. Als dit bestand gedeeld wordt met # andere systemen, is het verstandig alle tabs als veldscheiding # te gebruiken. # Zie ook de handleding van syslog.conf(5). *.err;kern.debug;auth.notice;mail.crit /dev/console *.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages security.* /var/log/security mail.info /var/log/maillog lpr.info /var/log/lpd-errs cron.* /var/log/cron *.err root *.notice;news.err root *.alert root *.emerg * # verwijder het commentaarkarakter om alle schrijfacties naar # /dev/console naar /var/log/console.log te schrijven. #console.info /var/log/console.log # verwijder het commentaarkarakter om alle berichten naar # /var/log/all.log te schrijven. #*.* /var/log/all.log # # verwijder het commentaarkarakter om alle logs naar een andere # host in te schakelen met de naam loghost. #*.* @loghost # # verwijder het commentaarkarakter als inn draait. # news.crit /var/log/news/news.crit # news.err /var/log/news/news.err # news.notice /var/log/news/news.notice !startslip *.* /var/log/slip.log !ppp *.* /var/log/ppp.log
In syslog.conf(5) staat meer informatie.
newsyslog.conf is het instellingenbestand voor newsyslog(8), een programma dat op gezette tijden via cron(8) wordt uitgevoerd. newsyslog(8) stelt vast wanneer logboekbestanden gearchiveerd moeten worden of anderszins opnieuw gerangschikt moeten worden. logfile wordt hernoemd naar logfile.0, logfile.0 naar logfile.1, enzovoort.
newsyslog.conf geeft aan welke logboekbestanden beheerd moeten worden, hoeveel er in archieven bewaard moeten worden en wanneer ze aangemaakt moeten worden. Logboekbestanden kunnen gereorganiseerd en/of gearchiveerd worden als ze een bepaalde grootte bereikt hebben of op een bepaald periodiek tijdstip of een bepaalde datum.
# instellingenbestand voor newsyslog # $FreeBSD$ # # filename [owner:group] mode count size when [ZB] [/pid_file] [sig_num] /var/log/cron 600 3 100 * Z /var/log/amd.log 644 7 100 * Z /var/log/kerberos.log 644 7 100 * Z /var/log/lpd-errs 644 7 100 * Z /var/log/maillog 644 7 * @T00 Z /var/log/sendmail.st 644 10 * 168 B /var/log/messages 644 5 100 * Z /var/log/all.log 600 7 * @T00 Z /var/log/slip.log 600 3 100 * Z /var/log/ppp.log 600 3 100 * Z /var/log/security 600 10 100 * Z /var/log/wtmp 644 3 * @01T05 B /var/log/daily.log 640 7 * @T00 Z /var/log/weekly.log 640 5 1 $W6D0 Z /var/log/monthly.log 640 12 * $M1D0 Z /var/log/console.log 640 5 100 * Z
In newsyslog(8) staat meer informatie.
sysctl.conf lijkt veel op rc.conf. Waardetoekenning heeft weer de vorm variable=value. De ingestelde sysctl(8)-waarden worden doorgevoerd op het moment dat het systeem naar multi-user modus gaat. Niet alle variabelen kunnen in deze modus gewijzigd worden.
Om te voorkomen dat er logregels geplaatst worden als processen crashen en om te voorkomen dat andere gebruikers kunnen zien welke processen er gestart zijn door een andere gebruiker, kunnen de volgende instellingen worden gezet in sysctl.conf:
#Log exits met fatale signalen niet (bv. sig 11) kern.logsigexit=0 # Voorkom dat gebruikers informatie zien over processen die # worden gedraaid onder een ander UID. security.bsd.see_other_uids=0
sysctl(8) is een interface waarmee veranderingen gemaakt kunnen worden aan een draaiend FreeBSD-systeem. Er zijn onder meer vele geavanceerde opties voor de TCP/IP-stack en het virtuele geheugensysteem, waarmee een ervaren systeembeheerder de systeemprestaties drastisch kan verbeteren. Met sysctl(8) kunnen meer dan vijfhonderd systeemvariabelen opgevraagd en ingesteld worden.
In essentie heeft sysctl(8) twee functies: het lezen en wijzigen van systeeminstellingen.
Om alle leesbare variabelen te tonen:
% sysctl -a
Om een bepaalde variabele op te vragen, bijvoorbeeld kern.maxproc:
% sysctl kern.maxproc kern.maxproc: 1044
Om een bepaalde variabele toe te kennen (te wijzigen), is de syntaxis variable=value:
# sysctl kern.maxfiles=5000 kern.maxfiles: 2088 -> 5000
Waarden van sysctl-variabelen zijn doorgaans strings (tekst), getallen of booleans (1 als waar, 0 als onwaar).
Om automatisch variabelen in te stellen als de machine start, kunnen ze toegevoegd worden aan /etc/sysctl.conf. Meer informatie staat in sysctl.conf(5) en Paragraaf 12.10.4.
In sommige gevallen is het wenselijk om sysctl(8)-waarden die alleen-lezen zijn toch te wijzigen. Hoewel dit soms onontkoombaar is, kan het alleen bij een (her)start gedaan worden.
Op sommige laptops is bijvoorbeeld het apparaat cardbus(4) niet in staat om geheugenregio's af te tasten, met als gevolg foutmeldingen als:
cbb0: Could not map register memory device_probe_and_attach: cbb0 attach returned 12
In dergelijke gevallen moeten er meestal enkele sysctl(8)-instellingen gewijzigd worden die alleen-lezen zijn en een standaardwaarde hebben. Dit kan bereikt worden door sysctl(8) “OIDs” in de lokale /boot/loader.conf te zetten. Standaardinstellingen staan in /boot/defaults/loader.conf.
Om het bovenstaande probleem op te lossen moet in /boot/loader.conf hw.pci.allow_unsupported_io_range=1 ingesteld worden. Dan werkt cardbus(4) wel goed.
vfs.vmiodirenableDe sysctl-variabele vfs.vmiodirenable kan de waarde
0 (uit) of 1 (aan) hebben. De standaardwaarde is 1. Deze variabele bepaalt hoe
mappen door het systeem in een cache bewaard worden. De meeste mappen zijn klein en
gebruiken slechts een klein fragment (typisch 1 K) in het
bestandssysteem en nog minder (typisch 512 bytes) in de buffercache. Als deze
variabele uit staat (op 0) bewaart de buffercache slechts een bepaald aantal mappen
in de cache, ook al is er een overvloed aan geheugen beschikbaar. Wanneer deze
aan staat (op 1), wordt de VM paginacache gebruikt, waardoor voor het cachen
van mappen al het geheugen kan worden gebruikt. Het is echter wel zo dat het
minimale in-core geheugen dat gebruikt wordt om een map te cachen in dat geval
de fysieke paginagrootte is (typisch 4 K) in plaats van 512 bytes.
Het is aan te raden deze optie aan te laten staan als gebruik gemaakt wordt van
diensten die met grote aantallen bestanden werken, zoals webcaches, grote
mailsystemen en newsservers. Als deze optie aan blijft staan, verlaagt die de
prestaties niet, ook al kost het meer geheugen. Door experimenteren is dit voor een
systeem na te gaan.
vfs.write_behindDe sysctl-variabele vfs.write_behind staat
standaard aan (1). Dit betekent dat het bestandssysteem
gegevens naar het medium gaat schrijven op het moment dat er een volledig cluster
aan gegevens verzameld is. Dit is meestal het geval bij het schrijven van grote
sequentiële bestanden. Het idee is om te voorkomen dat de buffercache
verzadigd raakt met vuile buffers zonder dat dit bijdraagt aan de I/O-prestaties.
Dit kan echter processen ophouden en onder sommige omstandigheden is het wellicht
beter deze sysctl uit te zetten.
vfs.hirunningspaceDe sysctl-variabele vfs.hirunningspace bepaalt
hoeveel nog te schrijven gegevens er in het complete systeem op elk moment in de
wachtrij naar schijfcontrollers mag staan. De standaardwaarde is meestal voldoende,
maar op machines met veel schijven, is het beter deze te verhogen naar vier
of vijf megabyte. Het instellen van
een te hoge waarde (groter dan de schrijfdrempel van de buffercache) kan
leiden tot zeer slechte prestaties bij clustering. Stel deze waarde niet arbitrair
hoog in! Hogere schrijfwaarden kunnen vertraging veroorzaken in het lezen, als
dit tegelijk plaatsvindt.
Er zijn verscheidene andere sysctl's voor buffercache en VM-pagecache. Het wordt afgeraden deze te wijzigen. Het VM-systeem is zeer goed in staat zichzelf automatisch te optimaliseren.
vm.swap_idle_enabledDe sysctl-variabele vm.swap_idle_enabled is nuttig
in grote meergebruikersystemen met veel gebruikers die af- en aanmelden en
veel onbenutte processen. Dergelijke systemen hebben de neiging om voortdurend de
vrije geheugenreserves onder druk te zetten. Het is mogelijk om de prioriteit van
geheugenpagina's die verband houden met onbenutte processen sneller te laten
dalen dan met het normale pageout-algoritme, door deze sysctl aan te zetten en via
vm.swap_idle_threshold1 en vm.swap_idle_threshold2 de swapout hysterese (in seconden
onbenut) af te stemmen. Deze optie dient alleen gebruikt te worden als ze echt
nodig is, want de andere kant van de medaille is dat dit eerder pre-page
geheugen inhoudt in plaats van later, waardoor het meer wisselbestand- en
schijfbandbreedte kost. In een klein systeem heeft deze optie een voorspelbaar
effect, maar in grote systemen waar al sprake is van een matige paging kan
deze optie het mogelijk maken voor het VM-systeem om hele processen gemakkelijk in
en uit het geheugen te halen.
hw.ata.wcTen tijde van FreeBSD 4.3 is er geflirt met het uitzetten van
IDE-schrijfcaching. Hierdoor neemt de bandbraadte naar IDE-schijven af, maar het
werd als noodzakelijk beschouwd vanwege ernstige problemen met
gegevensinconsistentie die door harde schijfproducenten geëintroduceerd waren.
Het probleem is dat IDE-schijven niet de waarheid vertellen over wanneer een
schrijfactie klaar is. Door IDE-schrijfcaching wordt data niet alleen
ongeordend geschreven, maar soms kan zelfs het schrijven van sommige blokken
voortdurend uitgesteld worden als er sprake is van een hoge schijfbelasting. Een
crash of stroomstoring kan dan ernstige corruptie aan het bestandssysteem
veroorzaken. Daarom werd de standaardinstelling van FreeBSD voor alle
zekerheid gewijzigd. Helaas was het resultaat een groot verlies aan prestaties en
na die uitgave is de standaardwaarde weer terug veranderd. Met de sysctl-variabele
hw.ata.wc kan gecontroleerd worden of
schrijfcaching aan of uit staat. Als schrijfcaching uit staat, kan het die weer
aangezet worden door hw.ata.wc op 1 te zetten.
Aangezien dit een kernelvariabele is, moet deze ingesteld worden vanuit de
bootloader tijdens het opstarten. Nadat de kernel eenmaal opgestart is, heeft het
wijzigen van deze sysctl geen effect.
Meer informatie staat in ata(4).
kern.cam.scsi_delay)De kernelinstelling SCSI_DELAY kan gebruikt worden om
de opstarttijd te versnellen. De standaardwaarde is nogal hoog en kan 15 seconden vertraging veroorzaken. Met modernere
SCSI-systemen is 5 seconden al voldoende (zeker met
moderne schijven). De kern.cam.scsi_delay opstart
variabele moet hier gebruikt worden. De variabele en kernelconfiguratie-optie
accepteren waarden uitgedrukt in milliseconden en niet in seconden.
tunefs(8) kan gebruikt worden om een bestandsysteem nauwkeurig af te stellen. Het heeft veel opties, maar nu wordt alleen het aan- en uitzetten van softupdates besproken. Dat gaat als volgt:
# tunefs -n enable /filesystem # tunefs -n disable /filesystem
Een bestandssysteem kan niet met tunefs(8) gewijzigd worden als het aangekoppeld is. Softupdates aanzetten wordt dus in het algemeen gedaan vanuit enkelegebruikermodus, voordat partities aangekoppeld zijn.
Softupdates zorgen voor een drastische verbetering van de prestaties met betrekking tot metagegevens, met name het aanmaken en verwijderen van bestanden, door gebruik van een geheugencache. Het wordt dan ook aangeraden om op alle bestandssystemen softupdates te gebruiken. Er zijn twee nadelen aan softupdates: softupdates garanderen een consistent bestandssysteem in geval van een crash, maar het kan makkelijk enkele seconden (zelfs een minuut) achter liggen met het daadwerkelijk bijwerken op de fysieke harde schijf. Als een systeem crasht gaat wellicht meer werk verloren dan anders het geval zou zijn. Daarnaast vertragen softupdates het vrijgeven van bestandssysteemblokken. Als een bestandssysteem (zoals de rootpartitie) bijna vol is, dan kan het verrichten van een grote update, zoals make installworld, ertoe leiden dat het bestandssysteem ruimtegebrek krijgt en dat daardoor de operatie mislukt.
Er zijn traditioneel twee methodes om de metagegevens van een bestandssysteem terug naar de schijf te schrijven. Het bijwerken van metagegevens houdt het bijwerken van van niet-inhoudelijke gegevens zoals inodes of mappen in.
Historisch gezien was het gebruikelijk om updates aan metagegevens synchroon weg te schrijven. Als een map bijvoorbeeld gewijzigd was, wachtte het systeem totdat de verandering daadwerkelijk naar de schijf geschreven was. De gegevensbuffers (de inhoud van een bestand) werden doorgeschoven naar de buffercache en op een later moment asynchroon op de schijf opgeslagen. Het voordeel van deze benadering is dat ze altijd veilig is. Als het systeem faalt tijdens het bijwerken, zijn de metagegevens nog altijd consistent. Een bestand kan volledig gecreëerd zijn of helemaal niet. Als de gegevensblokken van een bestand nog niet van de buffercache naar de schijf geschreven zijn ten tijde van de crash, is fsck(8) in staat om dit te herkennen en het bestandssysteem te repareren door de lengte van het bestand nul te maken. Deze implementatie is ook helder en eenvoudig. Het nadeel is echter dat het wijzigen van metagegevens een traag proces is. Een rm -r benadert bijvoorbeeld alle bestanden in een map sequentiëel, maar elke mapverandering (verwijderen van een bestand) wordt synchroon naar de schijf geschreven. Dit omvat ook het bijwerken van de map zelf, van de inodetabel en mogelijk ook van indirecte blokken die voor het bestand in kwestie zijn gealloceerd. Gelijksoortige processen spelen zich af bij een commando als tar -x, waarbij een grote bestandshiëearchie wordt uitgepakt.
De tweede mogelijkheid is om het bijwerken van metagegevens asynchroon weg te schrijven. Dit is standaard in Linux/ext2fs en als een *BSD UFS-bestandssysteem met mount -o async aangekoppeld is, is de werking hetzelfde. Alle bijwerkingen aan metagegevens worden eenvoudigweg doorgegeven aan de buffercache en vermengd met inhoudelijke updates van de bestandsgegevens. Het voordeel is een grote winst aan snelheid, omdat er niet telkens gewacht hoeft te worden op het bijwerken van metagegevens tot deze daadwerkelijk naar de schijf geschreven zijn. De implementatie is ook in dit geval helder en eenvoudig. Het grote nadeel is uiteraard dat er geen enkele garantie is voor de consistentie van het bestandssysteem. Als het systeem faalt tijdens een operatie waarbij veel metagegevens worden bijgewerkt (bijvoorbeeld door een stroomstoring of iemand drukt op de resetknop), blijft het bestandssysteem in een onvoorspelbare toestand achter. Er is geen mogelijkheid om de toestand van het bestandssysteem te onderzoeken als het systeem weer opstart, want de gegevensblokken van een bestand kunnen al weggeschreven zijn geweest terwijl het wegschrijven van bijwerkingen aan de inodetabel of de bijhorende map nog niet plaats heeft gevonden. Het is zelfs onmogelijk om een fsck te implementeren die de overgebleven chaos kan opruimen: de benodigde informatie is gewoon niet volledig aanwezig op de schijf. Als een bestandssysteem op deze manier onherstelbaar beschadigd is, is de enige optie newfs(8) te gebruiken en vervolgens te herstellen van een backup.
De gebruikelijke oplossing voor dit probleem is het implementeren van dirty region logging, ook wel journaling genoemd, hoewel deze term niet consistent gebruikt wordt en soms ook wordt gebruikt voor andere vormen van transactielogging. Het bijwerken van metagegevens wordt nog steeds synchroon geschreven, maar slechts naar een klein gebied van de schijf. Later worden ze dan naar de juiste locatie verplaatst. Omdat het loggebied klein is, hoeven de koppen van de schijf zelfs tijdens schrijfintensieve operaties nog maar over een kleine fysieke afstand te bewegen en door deze snellere respons zijn dit soort operaties sneller dan op de traditionele manier. De extra complexiteit van de implementatie is nogal beperkt, dus het risico van introductie van extra bugs valt mee. Een nadeel is dat alle metagegevens tweemaal geschreven worden (eerst naar het loggebied en later nog eens naar de definitieve locatie). Dus bij normaal gebruik kan er sprake zijn van wat men wel noemt een “performance pessimization”. Anderzijds kunnen in geval van een crash alle nog uitstaande metagegevensoperaties snel worden teruggedraaid of vanuit het loggebied alsnog worden afgemaakt wanneer de machine weer opstart. Het bestandssysteem start dan snel op.
Kirk McKusick, de vader van het Berkeley FFS, loste dit probleem op met softupdates, wat betekent dat alle uitstaande acties voor het bijwerken van metagegevens in het geheugen bewaard worden en dan geordend naar de schijf geschreven worden. Dit heeft het gevolg dat in geval van intensieve operaties met betrekking tot metagegevens, latere bijwerkingen aan een item eerdere bewerkingen opvangen (“catch”) als deze nog in het geheugen zitten en nog niet weggeschreven waren. Dus alle operaties, op bijvoorbeeld een map, worden in het algemeen eerst in het geheugen uitgevoerd voordat er wordt bijgewerkt naar schijf. De gegevensblokken worden geordend conform hun positie, zodat ze nooit weggeschreven worden voordat hun metagegevens geschreven zijn. Als het systeem een crash ondervindt, veroorzaakt dat impliciet het terugdraaien van uitstaande operaties (“log rewind”): alle operaties die nog niet weggeschreven waren lijken nooit gebeurd te zijn. Zo wordt een consistent bestandssysteem in stand gehouden dat eruit ziet alsof het 30 tot 60 seconden eerder was. Het gebruikte algoritme garandeert dat alle bronnen die in gebruik zijn als zodanig gemarkeerd worden in hun daarvoor geschikte bitmaps: blokken en inodes. Na een crash is de enige allocatiefout die kan optreden dat bronnen gemarkeerd kunnen zijn als in gebruik (“used”), terwijl ze feitelijk alweer beschikbaar (“free”) zijn. fsck(8) herkent deze situatie en stelt dergelijke vrij te maken bronnen opnieuw beschikbaar. Het is volkomen veilig om na een crash te negeren dat het bestandssysteem niet schoon is en het tot aankoppelen te dwingen met mount -f. Om niet langer gebruikte bronnen vrij te maken moet later fsck(8) uitgevoerd worden. Dit is dan ook het idee achter background fsck: op het moment dat het systeem aan het opstarten is, wordt er alleen een snapshot van het systeem bewaard. fsck kan later uitgevoerd worden. Alle bestandssystemen kunnen “dirty” aangekoppeld worden en het systeem kan gewoon verder opstarten naar meergebruikermodus. Vervolgens zijn er fscks gepland die in de achtergrond draaien voor elk bestandssysteem dat niet schoon is en waarmee bezette bronnen vrijgegeven worden. Bestandssystemen die geen gebruik maken van softupdates moeten echter nog steeds gebruik maken van de normale fsck in de voorgrond.
Het voordeel van softupdates is dat operaties op metagegevens bijna net zo snel zijn als asynchrone updates (dat wil zeggen sneller dan met logging, waarbij de metagegevens keer op keer geschreven worden). Nadelen zijn de complexiteit van de code (wat een groter risico op bugs impliceert in een gebied dat bijzonder gevoelig is voor verlies van gebruikersgegevens) en een groter geheugenverbruik. Tevens moet de gebruiker wennen aan enkele eigenaardigheden. Na een crash lijkt de toestand van het bestandssysteem wat “ouder”. In situaties waar de standaard synchrone benadering een aantal lege bestanden zou hebben achtergelaten na fsck, is het met softupdates juist zo dat dergelijke bestanden er helemaal niet zijn, omdat de metagegevens of de bestandsinhoud nooit naar de schijf zijn geschreven. Schijfruimte wordt pas vrijgegeven als de bijwerkingen aan metagegevens en inhoudelijke bestandsgegevens weggeschreven zijn, wat mogelijk pas enige tijd na het uitvoeren van rm plaatsvindt. Dit kan problemen veroorzaken als er grote hoeveelheden gegevens naar een bestandssysteem geschreven worden dat onvoldoende vrije ruimte heeft om alle bestanden twee keer te kunnen bevatten (bijvoorbeeld in /tmp).
kern.maxfileskern.maxfiles kan worden verhoogd of verlaagd,
afhankelijk van de systeembehoeften. Deze variabele geeft het maximale aantal
bestandsdescriptors op een systeem. Als de bestandsdescriptortabel vol is, toont de
systeembuffer meerdere malen “file: table is
full”, hetgeen achteraf te zien is met dmesg.
Elk geopend bestand, socket of fifo heeft een bestandsdescriptor. Een grote produktieserver kan makkelijk enige duizenden bestandsdescriptors nodig hebben, afhankelijk van het soort en aantal diensten die tegelijk draaien.
In oudere versies van FreeBSD werd de standaard waarde van kern.maxfiles afgeleid van de optie maxusers in het kernelconfiguratiebestand. kern.maxfiles groeit evenredig met de waarde van maxusers. Als een aangepaste kernel wordt gebouwd, is het een
goed idee om deze kerneloptie in te stellen afhankelijk van het gebruikt van een
systeem (maar niet te laag). Hoewel een produktieserver misschien niet 256
gelijktijdige gebruikers heeft, kunnen de benodigde systeembronnen het beste
vergeleken worden met een grootschalige webserver.
De optie maxusers stelt de grootte van een aantal belangrijke systeemtabellen in. Dit aantal moet ruwweg gelijk zijn aan het aantal gebruikers dat verwacht wordt gelijktijdig van de machine gebruik te maken.
Vanaf FreeBSD 4.5 wordt kern.maxusers
automatisch ingesteld tijdens het opstarten gebaseerd op de hoeveelheid beschikbare
geheugen in het systeem en kan worden vastgesteld tijdens het draaien door te
kijken naar de alleen-lezen sysctl kern.maxusers.
Sommige configuraties hebben grotere of kleinere waarden nodig van kern.maxusers, deze kunnen worden gezet als een
opstartvariabele. Waardes van 64, 128 en 256 zijn daarin niet ongewoon. We raden
aan om niet boven de 256 te gaan tenzij er heel veel bestandsdescriptors benodigd
zijn; veel van de aanpasbaare waarden die standaard worden bepaald door kern.maxusers kunnen individueel worden overschreven tijdens
het opstarten en/of tijdens het draaien van het systeem in /boot/loader.conf (zie de handleiding loader.conf(5) of het
bestand /boot/defaults/loader.conf voor een paar
aanwijzingen) of zoals elders beschreven in dit document. Systemen die ouder
zijn dan FreeBSD 4.4 moeten deze waarden instellen via de kerneloptie config(8) maxusers.
Voor oudere versies stelt het systeem deze waarde zelf in als deze uitdrukkelijk op 0 is gezet. [5] Als het gewenst is om deze waarde zelf aan te geven, wordt aangeraden om maxusers minstens op 4 te zetten, met name als het X Window systeem in gebruik is of als er software gecompileerd wordt. De reden hiervoor is dat de belangrijkste tabel die door maxusers ingesteld wordt, het maximum aantal processen is, dat ingesteld wordt op 20 + 16 * maxusers, dus als maxusers op 1 ingesteld wordt, zijn er maar 36 gelijktijdige processen mogelijk, inclusief de ongeveer achttien processen die door het systeem tijdens het opstarten start en de ongeveer vijftien processen die waarschijnlijk aangemaakt worden door het opstarten van het X Window systeem. Zelfs een eenvoudige taak als het afbeelden van een hulppagina start negen processen op om de pagina te filteren, te decomprimeren en af te beelden. Als maxusers op 64 ingesteld wordt, zijn er 1044 gelijktijdige processen mogelijk, wat genoeg moet zijn voor bijna alle soorten gebruik. Als echter de gevreesde fout proc table full verschijnt als er geprobeerd wordt om een programma op te starten of als er een server gedraaid wordt met een groot aantal gelijktijdige gebruikers, zoals ftp.FreeBSD.org, kan het getal altijd verhoogd worden en kan de kernel opnieuw gebouwd worden.
Opmerking: maxusers stelt geen grens aan het aantal gebruikers dat zich op de machine kan aanmelden. Het stelt gewoon verschillende tabelgroottes in op redelijke waardes, uitgaande van het maximum aantal gebruikers dat waarschijnlijk de machine gebruikt en van het aantal processen dat elk van deze gebruikers zal draaien. Een sleutelwoord dat wel het aantal gelijktijdige aanmeldingen op afstand en X-terminalvensters begrensd is pseudo-device pty 16. In FreeBSD 5.X kan dit getal genegeerd worden omdat daar het stuurprogramma pty(4) “auto-cloning” is. Er kan eenvoudig gebruik worden gemaakt van de regel device pty in het instellingenbestand.
kern.ipc.somaxconnDe sysctl-variabele kern.ipc.somaxconn beparkt de
grootte van de luisterwachtrij voor het accepteren van nieuwe TCP-verbindingen. De
standaardwaarde van 128 is meestal te laag voor robuuste
behandeling van nieuwe verbindingen in een zwaarbeladen webserveromgeving.
Voor zulke omgevingen wordt aangeraden deze waarde te verhogen tot 1024 of hoger. De dienstdaemon beperkt misschien zelf de
luisterwachtrij (bijvoorbeeld sendmail(8) of
Apache), maar heeft vaak een mogelijkheid in een
configuratiebestand de wachtrijgrootte aan te passen. Grote luisterwachtrijen zijn
ook beter in het ontwijken van Ontzegging van Dienst (DoS) aanvallen.
De kerneloptie NMBCLUSTERS bepaalt het aantal
netwerk-Mbufs dat beschikbaar is voor een systeem. Een veel bezochte server met een
laag aantal Mbufs beperkt de mogelijkheden van FreeBSD. Elk cluster staat voor
ongeveer 2 K geheugen, dus een waarde van 1024 stelt 2 megabyte aan
kernelgeheugen voor, dat is gereserveerd voor netwerkbuffers. Een simpele berekening
geeft aan hoeveel er nodig is. Stel dat een webserver met een maximum van 1000
simultane verbindingen voor elke verbinding 16 K aan
ontvangstnetwerkbuffers en 16 K aan zendbuffers kost, dan is ongeveer
32 MB aan netbuffers nodig voor de webserver. Een goede vuistregel is te
vermeniguldigen met twee, dus 2x32 MB / 2 KB = 64 MB /
2 kB = 32768. Voor machines met veel geheugen wordt 4096 tot 32768
aangeraden. Er moet in geen geval een arbitrair hoge waarde voor deze sysctl
opgegeven worden, want dat kan leiden tot een crash tijdens het opstarten. Met de
optie -m van netstat(1) kan het
clustergebruik van het netwerk bekeken worden.
De loaderparameter kern.ipc.nmbclusters moet
gebruikt worden om dit tijdens het opstarten toe te passen. Alleen voor oudere
versies van FreeBSD is het nodig om de kerneloptie NMBCLUSTERS te gebruiken.
Voor drukke servers die extensief gebruik maken van de systeemaanroep sendfile(2), kan het
nodig zijn het aantal sendfile(2)-buffers te
verhogen via de kerneloptie NSFBUFS of door de waarde in te
stellen in /boot/loader.conf (in loader(8) staan
details). Als er in de procestabel processen staan met een status sfbufa is dat een algemene indicator dat deze parameter
aangepast moet worden. De sysctl-variabele kern.ipc.nsfbufs is alleen-lezen en laat zien op welke waarde
deze kernelvariabele is ingesteld. Deze parameter schaalt engiszins met de variabele
kern.maxusers, maar het kan nodig zijn om deze bij
te stellen.
Belangrijk: Zelfs als een socket als non-blocking gemarkeerd is, dan nog kan het aanroepen van sendfile(2) op de non-blocking socket ertoe leiden dat er toch blokkade optreedt totdat er voldoende struct sf_buf's vrijgemaakt zijn.
net.inet.ip.portrange.*De sysctl-variabelen net.inet.ip.portrange.*
bepalen welke reeks poortnummers automatisch gebonden wordt aan TCP- en
UDP-sockets. Er zijn drie gebieden: een laag gebied, een (standaard) middengebied
en een hoog gebied. De meeste netwerkprogramma's gebruiken het standaardbereik, wat
begrensd wordt door net.inet.ip.portrange.first
en net.inet.ip.portrange.last met
standaardwaarden van respectievelijk 1024 en 5000. Gebonden poortreeksen worden
gebruikt voor uitgaande verbindingen en het is onder bepaalde omstandigheden
mogelijk dat poorten op raken. Dit gebeurt meestal in het geval van een zwaar
belaste webproxy. Poortbereik is niet van belang als vooral diensten draaien
die zich bezighouden met inkomende verbindingen, zoals een normale webserver, of
als het aantal uitgaande verbindingen beperkt is, zoals bij een mailrelay. Voor
situaties waarin een tekort aan poorten dreigt, wordt aangeraden om net.inet.ip.portrange.last bescheiden op te hogen. Een
waarde van 10000, 20000 of
30000 is redelijk. Er moet ook rekening met effecten op
firewalls gehouden worden als de poortreeks gewijzigd wordt. Sommige firewalls
kunnen grote poortreeksen blokkeren, meestal de lagere poorten, en verwachten dat
andere systemen hogere poorten gebruiken voor uitgaande verbindingen. Om deze
reden wordt het niet aanbevolen om net.inet.ip.portrange.first te verlagen.
De TCP-bandbreedtevertragingsproductlimitatie lijkt op TCP/Vegas in NetBSD. Het
kan aangezet worden door de sysctl-variabele net.inet.tcp.inflight.enable de waarde 1 te geven. Het systeem tracht dan het
bandbreedtevertragingssprodukt te berekenen voor elke verbinding en beperkt dan de
hoeveelheid gegevens in de wachtrij naar het netwerk tot de hoeveelheid die vereist
is om maximale doorvoer te kunnen handhaven.
Dit is nuttig bij gebruik van modems, Gigabit Ethernet of zelfs bij
WAN-verbindingen met hoge snelheid (of elke andere verbinding met een groot
bandbreedtevertragingsprodukt), in het bijzonder als ook windowschaling of een
groot verzendwindow gebruikt wordt. Als deze optie aangezet wordt, dient ook
net.inet.tcp.inflight.debug de waarde 0 te krijgen (geen debugging) en voor produktiegebruik kan het
instellen van net.inet.tcp.inflight.min naar minstens
6144 voordeel opleveren. Het instellen van hoge
minima kan effectief het beperken van bandbreedte ondermijnen, afhankelijk van de
verbinding. De mogelijkheid tot limitering zorgt ervoor dat de hoeveelheid gegevens
die opgebouwd wordt, in tussentijdse route- en switchwachtrijen verlaagd kan
worden en tevens kan de hoeveelheid gegevens die opgebouwd wordt in de
interfacewachtrij van de lokale host verlaagd worden. Met minder pakketten in
wachtrijen kunnen interactieve verbindingen opereren met lagere Round Trip tijden, met name over langzame
modems. Deze optie gaat alleen over datatransmissie (upload / serverkant) en
heeft geen effect gegevensontvangst (download / cliëntkant).
Aanpassen van net.inet.tcp.inflight.stab wordt
niet aangeraden. Deze
parameter krijgt standaard een waarde van 20, wat 2 maximale pakketten opgeteld
bij de bandbreedtevensterberekening representeert. Het extra venster is nodig
om het algoritme stabiel te houden en om de reactietijd bij veranderende
omstandigheden te verbeteren, maar het kan ook leiden tot langere pingtijden over
langzame verbindingen (zonder het inflight-algoritme kan dit echter nog erger
zijn). In dergelijke gevallen kan deze parameter misschien verlaagd worden naar 15,
10 of 5 en misschien moet voor het gewenste effect ook net.inet.tcp.inflight.min verlaagd worden (bijvoorbeeld naar
3500). Het verlagen van deze parameters moet pas in laatste instantie overwogen
worden.
kern.maxvnodesEen vnode is de interne representatie van een bestand of een map. Het verlagen van het aantal beschikbare vnodes voor het besturingssysteem leidt dus tot een daling van schijf-I/O. Normaliter wordt dit door het besturingssysteem afgehandeld en hoeft de instelling niet gewijzigd te worden. Im sommige gevallen kan schijf-I/O de beperkende factor zijn en kan het systeem alle beschikbare vnodes in gebruik hebben. Dan dient deze instelling gewijzigd te worden. De hoeveelheid inactief en beschikbaar RAM dient meegenomen te worden in de beslissing.
Het huidige aantal gebruikte vnodes kan als volgt bekeken worden:
# sysctl vfs.numvnodes vfs.numvnodes: 91349
Om het maximale aantal vnodes weer te geven:
# sysctl kern.maxvnodes kern.maxvnodes: 100000
Als het huidige aantal gebruikte vnodes dicht bij het maximale aantal ligt, is
het verstandig om kern.maxvnodes op te hogen met
1.000. Ook vfs.numvnodes dient in de gaten
gehouden te worden. Als de waarde weer tot aan het maximum stijgt, dan moet kern.maxvnodes verder opgehoogd worden. Er dient een
verschuiving op te treden in het door top(1) gerapporteerde
geheugengebruik. Er hoort meer geheugen actief te zijn.
Hoe goed er ook gepland wordt, soms draait een systeem gewoon niet zoals verwacht. Een oorzaak hiervoor kan een tekort aan wisselbestandruimte zijn. Als blijkt dat er meer wisselbestandruimte nodig is, kan dat eenvoudig. Er zijn drie manieren om de totale ruimte beschikbaar als wisselbestand te vergroten: een nieuwe harde schijf toevoegen, swappen over NFS of een wisselbestand maken op een bestaande (UFS of andere) partitie.
Kijk voor informatie over het beveiligen van het wisselbestand, welke opties hiervoor bestaan, en waarom dit gedaan zou moeten worden in Paragraaf 19.17 van het handboek.
Een nieuwe harde schijf voor swap toevoegen geeft betere prestaties dan een partitie aan een bestaande schijf toevoegen. Het aanmaken van partities en harde schijven wordt uitgelegd in Paragraaf 19.3. Paragraaf 12.2 bespreekt de overwegingen van partitie-indelingen en de grootte van swap-partities.
Gebruik swapon(8) om een swap-partitie aan het systeem toe te voegen, bijvoorbeeld:
# swapon /dev/ada1s1p2
WaarschuwingHet is mogelijk om elke partitie te gebruiken die momenteel niet aangekoppeld is, zelfs als deze al gegevens bevat. Het gebruik van swapon(8) op een partitie die gegevens bevat zal deze gegevens overschrijven en vernietigen. Zorg ervoor dat de partitie die als swap toegevoegd wordt echt de bedoelde partitie is voordat swapon(8) gebruikt wordt.
Voeg een regel toe aan /etc/fstab voor de partitie om deze swap-partitie automatisch toe te voegen tijdens het opstarten:
/dev/ada1s1p1 none swap sw 0 0
Raadpleeg fstab(5) voor een uitleg over de regels in /etc/fstab.
In het algemeen wordt swappen over NFS niet aangeraden behalve als het onmogelijk is om naar een lokale schijf te swappen. NFS-swappen wordt gelimiteerd door de hoeveelheid beschikbare bandbreedte en belast het de NFS-server.
Het is mogelijk om een bestand aan te maken van een bepaalde grootte en dit als swap te gebruiken. In dit voorbeeld wordt een bestand van 64 MB gebruikt, /usr/swap0. Uiteraard kan een willekeurige naam gebruikt worden.
Voorbeeld 12-1. Een wisselbestand aanmaken op FreeBSD
De kernel GENERIC bevat reeds het stuurprogramma voor geheugenschijven (md(4)) dat nodig is voor deze bewerking. Zorg ervoor dat tijdens het bouwen van een eigen kernel de volgende regel in uw configuratiebestand zit:
device md
Kijk voor meer informatie over het bouwen van een eigen kernel in Hoofdstuk 9.
Het wisselbestand /usr/swap0 aanmaken:
# dd if=/dev/zero of=/usr/swap0 bs=1024k count=64
De correcte rechten op /usr/swap0 instellen:
# chmod 0600 /usr/swap0
Het wisselbestand opnemen in /etc/rc.conf:
swapfile="/usr/swap0" # Instellen op naam van wisselbestand als hulpwisselbestand gewenst is
De machine moet herstart worden of om het wisselbestand direct in te schakelen:
# mdconfig -a -t vnode -f /usr/swap0 -u 0 && swapon /dev/md0
Het is belangrijk om hardwarebronnen op een efficiënte wijze te benutten. Voordat ACPI geïntroduceerd werd was het lastig en onflexibel om het energieverbruik en de thermische eigenschappen van een systeem te beheersen. De hardware werd beheerst de BIOS en dus had de gebruiker minder controle en zichtbaarheid in de energiebeheerinstellingen. Enige gelimiteerde configuratie was mogelijk via Advanced Power Management (APM). Energie- en bronnenbeheer is een belangrijk onderdeel van moderne machines. Het besturingssysteem moet bijvoorbeeld systeemlimieten in de gaten houdt (en mogelijk een SMS sturen of iets dergelijks) als de systeemtemperatuur onverwacht toeneemt.
In dit deel van het FreeBSD handboek wordt uitgebreide informatie verschaft over ACPI. Aan het einde worden referenties geleverd naar meer leesmateriaal.
Advanced Configuration and Power Interface (ACPI) is een standaard die door een alliantie van producenten geschreven is, met als doel te voorzien in een standaardinterface voor hardwarebronnen- en energiebeheer. Een belangrijk element is dat het meer flexibiliteit en beheersmogelijkheden biedt aan het besturingssysteem (OS). Moderne systemen hebben de limieten van de huidige PNP-interfaces verder opgerekt dan wenselijk en misschien wel mogelijk was. ACPI is de directe opvolger van APM (Advanced Power Management). Centraal is het verleggen van hardwarebeheer en -monitoring naar de OS-laag in plaats van de zeer beperkte BIOS-laag.
Met de Advanced Power Management (APM) faciliteit kan het energieverbruik van een systeem geregeld worden op basis van de systeemactiviteit. Het APM-BIOS wordt geleverd door de systeemproducent of -verkoper en het is specifiek voor dat betreffende hardwareplatform. Een APM-stuurprogramma in het besturingssysteem regelt vervolgens de toegang tot de APM Software Interface, die het besturen van vermogensniveau mogelijk maakt. APM dient nog steeds gebruikt te worden met systemen die gefabriceerd zijn voor het jaar 2000.
Er zijn vier hoofdproblemen met APM te onderscheiden: ten eerste wordt het energiebeheer verricht door een BIOS (afhankelijk van producent) en het besturingssysteem heeft daar geen kennis van. De gebruiker die idle-time waarden instelt voor een harde schijf in het APM-BIOS is hier een voorbeeld van. Dan zal het BIOS de harde schijf langzamer kunnen laten draaien zonder dat het besturingssysteem de noodzaak ziet of het goedkeurt. Ten tweede: de APM-logica is ingebed in de BIOS, waardoor het buiten het besturingssysteem om opereert. Dit houdt in dat gebruikers problemen met hun APM-BIOS alleen kunnen verhelpen door een nieuw BIOS in het ROM te flashen, wat een gevaarlijke en mogelijk onherstelbare operatie is. Ten derde is APM een producent-specifieke technologie, in de zin dat er altijd een hoge mate van duplicatie zal zijn van al dan niet geslaagde pogingen om het wiel opnieuw uit te vinden en uiteraard ook van bugs. Er is geen enkele garantie dat het wegnemen van een bug door een producent ook een zelfde bug wegneemt bij een concurrent. Tenslotte is het van belang te weten dat de APM-BIOS in het algemeen gewoon te weing geheugen kon gebruiken om een ingewikkeld energiebeheer te kunnen implementeren. Laat staan dat deze goed aanpasbaar was aan veranderlijke doelstellingen voor de betreffende machine.
Plug-n-play BIOS (PNPBIOS) was in veel situaties onbetrouwbaar. PNPBIOS is 16-bitstechnologie, dus het besturingssysteem moet 16-bit emulatie gebruiken om met PNPBIOS-methoden te kunnen samenwerken.
Het FreeBSD-stuurprogramma APM is gedocumenteerd in apm(4).
Het stuurprogramma acpi.ko wordt standaard geladen bij het opstarten door de loader(8) en hoeft niet gecompileerd te worden. De redenatie is dat er met modules gemakkelijker gewerkt kan worden, bijvoorbeeld een andere acpi.ko gebruiken zonder dat er een nieuwe kernel gebouwd moet worden. Dit heeft het voordeel dat testen eenvoudiger is. Een andere reden is dat het opstarten van ACPI nadat een systeem eenmaal volledig opgestart is meestal niet goed werkt. Mocht er hinder ondervonden worden, dan kan ACPI beter uitgeschakeld worden. Dit stuurprogramma kan niet gestopt worden als het eenmaal geladen is, omdat de systeembus het gebruikt voor allerlei interacties met hardware. ACPI kan uitgezet worden door het instellen van hint.acpi.0.disabled="1" in /boot/loader.conf of in de loader(8) prompt.
Opmerking: ACPI en APM kunnen niet samenleven en moeten afzonderlijk en exclusief gebruikt worden. De laatste die gestart wordt bepaalt of het stuurprogramma de ander wel of niet ziet.
In haar eenvoudigste vorm kan ACPI
gebruikt worden om het systeem in slaapmodus te zetten met
acpiconf(8) met
de vlag -s en een optie 1-5. De
meeste gebruikers hebben alleen 1 of 3 nodig. De optie 5 verricht een
“soft-off”, wat hetzelfde is als:
# halt -p
Andere opties zijn mogelijk via sysctl(8). Zie de handleidingen van acpi(4) en acpiconf(8) voor meer informatie.
ACPI is een totaal nieuwe manier om apparaten te ontdekken, om energieverbruik te beheren en om een gestandaardiseerde toegang te bieden tot allerlei apparaten die eerder via het BIOS beheerd werden. Er wordt voortdurend vooruitgang geboekt om ACPI op alle systemen te laten werken, maar bugs in de ACPIMachine Language (AML) bytecode van sommige moederborden, onvolledigheden in de subsystemen van de kernel van FreeBSD en bugs in de Intel ACPI-CA interpreter blijven opduiken.
Deze tekst is bedoeld om u te helpen met het bijstaan van de FreeBSD ACPI beheerders met het vinden van de hoofdoorzaken van problemen die u opmerkt en met het debuggen en het vinden van een oplossing.
Opmerking: Voordat een probleem wordt gemeld, moet het zeker zijn dat de laatste BIOS versie draait en indien beschikbaar de geïntregeerde controller firmware versie.
Diegenen die meteen een probleem willen indienen, sturen de volgende informatie naar freebsd-acpi@FreeBSD.org:
Omschrijving van het foutieve gedrag, inclusief systeemtype en -model en alles wat de fout kan veroorzaken. Als het een nieuw fenomeen is, dan dient ook zo accuraat mogelijk aangegeven te worden wanneer de fout het eerst optrad.
De uitvoer van dmesg(8) van boot -v, inclusief foutmeldingen die gegenereerd worden als de fout optreedt.
De uitvoer van dmesg(8) van boot -v met ACPI uitgeschakeld, indien het uitzetten van ACPI het probleem oplost.
Uitvoer van sysctl hw.acpi. Dit is tevens een goede manier om uit te vinden welke ACPI-mogelijkheden een systeem heeft.
Een URL waar de ACPISource Language (ASL) gevonden kan worden. De ASL dient niet rechtstreeks naar de lijst gezonden te worden, omdat deze nogal groot kan zijn. Een kopie van een ASL kan gemaakt worden met het volgende commando:
# acpidump -dt > naam-systeem.asl
(Vervang uw aanmeldnaam door $NAME en producent/model door $SYSTEM. Bijvoorbeeld: njl-FooCo6000.asl)
De meeste FreeBSD-programmeurs lezen de FreeBSD-CURRENT mailinglijst, maar problemen gaan bij voorkeur ook naar freebsd-acpi zodat ze zeker gezien worden. Het kan enige tijd duren voordat er antwoord komt, omdat deze mensen elders ook nog volledige banen hebben. Als de bug niet meteen duidelijk is, komt er waarschijnlijk en verzoek om een PR in te dienen via send-pr(1). Als er een PR moet worden opgesteld, dan dient alle hierboven gevraagde informatie vermeld te worden. Dit helpt om het probleem te kunnen volgen en oplossen. Het sturen van een PR zonder eerst freebsd-acpi te mailen is niet wenselijk, aangezien men PRs gebruikt als herinnering van bestaande problemen, niet als rapportagesysteem. Mogelijk is een probleem al eens door iemand anders gemeld.
ACPI is aanwezig op alle moderne computers die voldoen aan de ia32 (x86), ia64 (Itanium) of amd64 (AMD) architecturen. De volledige standaard heeft vele mogelijkheden zoals CPU-prestatiebeheer, energiebeheer, thermische zones, diverse batterijsystemen, ingebedde controllers en busnummering. De meeste systemen implementeren minder dan de volledige standaard. Een desktopsysteem implementeert bijvoorbeeld meestal alleen busnummering, terwijl laptops mogelijk ook koeling- en batterijbeheer ondersteunen. Laptops hebben ook suspend en resume (slapen en wakker worden) met hun eigen aanverwante comlexiteit.
Een ACPI-compliant systeem heeft verscheidene componenten. Het BIOS- en chipsetverkopers bieden verscheidene vaste tabellen aan zoals FADT in het geheugen die zaken als de APIC-afbeelding (gebruikt voor SMP), configuratieregisters, en eenvoudige configuratiewaarden specificeren. Ook wordt er een tabel van bytecode (de Differentiated System Description Table of DSDT) geleverd die een op een boomstructuur lijkende namespace biedt voor apparaten en methoden.
Het stuurprogramma ACPI moet de voorgedefinieerde tabellen verwerken, een interpreter voor de bytecode implementeren en apparaatstuurprogramma's en de kernel aanpassen om informatie van het ACPI-subsysteem te accepteren. Intel heeft een interpreter beschikbaar gesteld (ACPI-CA) die door FreeBSD en ook door Linux en NetBSD gebruikt wordt. De ACPI-CA-broncode staat in src/sys/contrib/dev/acpica. De lijmcode die ACPI-CA laat werken met FreeBSD staat in src/sys/dev/acpica/Osd. Stuurprogramma's die verscheidene ACPI-apparaten implementeren staan in src/sys/dev/acpica.
Wil ACPI goed werken, dan moeten alle onderdelen goed werken. Hieronder staan enkele algemene problemen in volgorde van hoe vaak ze optreden en enkele mogelijke oplossingen of manieren om de problemen te vermijden.
Soms doet een muis het niet bij het opstarten uit de slaapstand. Een bekend lapmiddel is het toevoegen van hint.psm.0.flags="0x3000" aan het bestand /boot/loader.conf. Als dat niet werkt, dan wordt aangeraden een bugrapport in te sturen, zoals eerder is beschreven.
ACPI heeft drie slaapstanden waarbij het geheugen (RAM) wordt ingezet. Dit zijn de STR-toestanden S1-S3, en nog een slaap-met-gebruik-van-harde-schijf toestand (STD) die S4 heet. S5 is “zacht uit” en is de normale status van een systeem als het is aangesloten maar niet is aangezet. S4 kan feitelijk op twee manieren geïmplementeerd worden: S4BIOS is een slaapstand naar schijf met behulp van het BIOS en S4OS wordt volledig door het besturingssysteem geïmplenteerd.
als eerste dienen de sysctl hw.acpi items die iets met de slaapstand te maken hebben gecontroleerd te worden. Hieronder staan de resultaten voor een Thinkpad:
hw.acpi.supported_sleep_state: S3 S4 S5 hw.acpi.s4bios: 0
Dit betekent dat hier acpiconf -s gebruikt kan worden
om S3, S4OS en S5 te testen. Als s4bios gelijk was aan (1), dan zou
er S4BIOS
ondersteuning zijn in plaats van S4 OS.
Als suspend/resume getest moet worden, dient, indien ondersteund, bij S1 begonnen te worden. Deze toestand heeft de grootste kans om te werken, omdat deze niet veel stuurprogrammaondersteuning vereist. Niemand heeft nog S2 geïmplementeerd, maar het is ongeveer hetzelfde als S1. Daarna wordt S3 getest. Dit is het diepste STR-niveau en heeft uitgebreide ondersteuning van stuurprogramma's nodig om hardware goed opnieuw te kunnen starten. Mochten er blokkades optreden, dan kan naar de freebsd-acpi lijst gemaild worden. Er kan echter geen snelle oplossing verwacht worden, omdat er nog de nodige stuurprogramma's/hardware liggen om getest en bewerkt te worden.
Een veelvoorkomend probleem met suspend/resume is dat veel apparaatstuurprogramma's hun firmware, registers of apparaatgeheugen niet fatsoenlijk opslaan, herstellen, of herinitialiseren. Een eerste poging om het probleem te vinden omvat:
# sysctl debug.bootverbose=1 # sysctl debug.acpi.suspend_bounce=1 # acpiconf -s 3
Deze test emuleert de suspend/resume-cyclus van alle apparaten zonder daadwerkelijk naar de toestand S3 te gaan. In sommige gevallen kunt u zo eenvoudig problemen vaststellen (bijvoorbeeld het verliezen van de firmware-toestand, timeout van de apparaatwaakhond, en steeds opnieuw iets proberen). Merk op dat het systeem niet werkelijk naar de toestand S3 gaat, wat inhoudt dat apparaten geen spanning verliezen waardoor velen prima zullen werken zelfs als de suspend/resume-methoden geheel ontbreken, dit in tegenstelling tot de echte toestand S3.
Moeilijkere gevallen vereisen aanvullende hardware, dat is een serieële poort/kabel voor de serieële console of een Firewire poort/kabel voor dcons(4), en vaardigheden in het debuggen van de kernel.
Om een probleem te kunnen isoleren helpt het om zoveel mogelijk stuurprogramma's
uit de kernel te halen. Als dit werkt, kan er teruggewerkt worden naar het
stuurprogramma dat schuldig is aan het falen. Meestal vertonen binaire
stuurprogramma's als nvidia.ko, X11
beeldschermstuurprogramma's en USB de
meeste problemen, terwijl bijvoorbeeld Ethernet-interfaces meestal meteen goed
werken. Als de stuurprogramma's zonder problemen geladen en verwijderd kunnen
worden, dan is dit te automatiseren door de juiste commando's in /etc/rc.suspend en /etc/rc.resume
te zetten. Er staat een voorbeeld (achter commentaartekens) voor het laden en
verwijderen van een stuurprogramma. Als het beeldscherm er na wakker worden vreemd
uitziet, kan geprobeerd worden hw.acpi.reset_video op
nul te zetten. Met langere of kortere waarden voor hw.acpi.sleep_delay kan bekeken worden of dat helpt.
In geval van problemen is het ook een optie om een recente Linux distibutie met ondersteuning voor ACPI support te starten en daarvan de suspend/resume ondersteuning op dezelfde hardware uit te proberen. Als het werkt met Linux, dan is het waarschijnlijk een FreeBSD stuurprogrammaprobleem en als het mogelijk is uit te vinden over welk stuurprogramma het gaat, kan dat bijdragen aan het oplossen van het probleem. ACPI houdt zich in het algemeen niet bezig met andere stuurprogramma's zoals geluid, ATA, enzovoort. Als er dus een echt probleem met een stuurprogramma is, dan is waarchijnlijk uiteindelijk ook nodig naar de freebsd-current lijst te posten en naar de beheerder van het stuurprogramma. Voor degenen met moed is het vooral aan te raden een paar printf(3)s in problematische stukken van een stuurprogramma te plaatsen voor debugging om na te gaan waar de resumefunctie precies hangt.
Tot slot kan geprobeerd worden om ACPI uit te zetten en in plaats daarvan APM aan te zetten. Als suspend/resume werkt met APM, is het wellicht verstandig het daarbij te houden, vooral met wat oudere apparatuur (voor 2000). Producenten hebben nogal wat tijd nodig gehad om ACPI ondersteuning goed te krijgen en voor oudere hardware is het waarschijnlijker dat er BIOS-problemen zijn met ACPI.
Meestal is het hangen van het systeem het gevolg van verloren interrupts of een interruptstorm. Chipsets kunnen een heleboel problemen hebben, afhankelijk van hoe het BIOS interrupts instelt voor het opstarten, of de APIC (MADT) tabel correct is en de routering van het System Control Interrupt (SCI).
Interruptstorms kunnen onderscheiden worden van verloren geraakte interrupts door de uitvoer van vmstat -i te controleren en de regel met acpi0 goed te lezen. Als de teller in toenemende mate hoger staat dan enkele per seconde, dan is sprake van een interruptstorm. Als het systeem lijkt te hangen, is het wellicht nog mogelijk door te dringen tot de DDB (CTRL+ALT+ESC) en show interrupts uit te voeren.
De beste hoop in geval van interruptproblemen is om APIC-ondersteuning uit te zetten met hint.apic.0.disabled="1" in loader.conf.
Panics zijn relatief zeldzaam met ACPI en krijgen de hoogste prioriteit bij het oplossen. Eerst moeten de verschillende gebeurtenissen waarmee de panic (als mogelijk) te reproduceren is geïsoleerd worden en moet een backtrace gemaakt worden. options DDB dient aangezet te worden en er dient een seriële console (Paragraaf 27.6.5.3) of een dump(8) partitie te komen. In DDB is een backtrace te maken met tr. Als de backtrace handmatig opgeschreven moet worden, is het belangrijk dat in ieder geval de bovenste en onderste vijf (5) regels van de backtrace genoteerd worden.
Daarna dient getracht te worden het systeem te starten zonder ACPI. Als dat werkt, is het ACPI-subsysteem geïsoleerd en kunnen de
verschillende debug.acpi.disable-waarden uitgeprobeerd
worden. In acpi(4) staan enkele
voorbeelden.
hw.acpi.disable_on_poweroff="0" kan uitgezet worden in loader.conf(5). Hierdoor schakelt ACPI bepaalde gebeurtenissen tijdens het afsluitproces niet uit. Om dezelfde redenen moeten sommige systemen deze waarde altijd op 1 (standaard) hebben staan. In het algemeen lost dit een probleem op waarbij een systeem spontaan weer opkomt nadat het in slaapstand is gezet of geheel gestopt is.
Als er nog andere problemen zijn met ACPI (met een docking station of apparaten niet gedetecteerd, enzovoort), dan kan een mail met beschijving naar de mailinglijst gezonden worden. Sommige zaken kunnen echter gerelateerd zijn aan delen van het ACPI-subsysteem die nog niet af zijn, dus het kan in sommige gevallen een tijd duren. Gebruikers moeten soms geduld en de bereidheid om eventuele patches uit te proberen hebben.
Het grootste probleem is dat BIOS-producenten vaak incorrecte (of gewoon foutieve) bytecode leveren. Dit blijkt doorgaans uit kernelboodschappen als:
ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\ (Node 0xc3f6d160), AE_NOT_FOUND
Vaak kunnen dergelijke problemen geoplost worden door de BIOS bij te werken tot de laatste revisie. De meeste
consoleberichten zijn onschuldig, maar als er andere problemen zijn, zoals
batterijstatus die niet werkt, dan ligt het voor de hand te zoeken naar problemen in
de AML-code. De bytecode die
AML genoemd wordt, wordt gecompileerd
van een broncodetaal ASL. Deze staat
weer in een tabel DSDT. Met acpidump(8) kan een
kopie van de ASL gemaakt worden. Dan
moeten zowel de opties -t (laat inhoud van vaste
tabellen zien) als -d (disassembleer AML naar ASL) gebruikt worden. In Debuginformatie aanleveren staat een voorbeeld.
De eenvoudigste eerste controle is de ASL-code opnieuw compileren en kijken of er foutmeldingen optreden. Waarschuwingen kunnen doorgaans genegeerd worden, maar fouten zijn bugs die er meestal toe leiden dat ACPI niet correct werkt. Om ASL te hercompileren:
# iasl eigen.asl
Op langere termijn is het de bedoeling dat voor vrijwel elke machine ACPI werkt zonder enig ingrijpen van de gebruiker. Op dit moment wordt er echter nog gewerkt aan oplossingen voor veel voorkomende vergissingen die BIOS-producenten maken. De Microsoft interpreter (acpi.sys en acpiec.sys) controleert niet strikt of het BIOS volledig aan de standaard voldoet, waardoor het voorkomt dat BIOS-makers die alleen testen onder Windows bepaalde fouten in hun ASL nooit correct repareren. FreeBSD hoopt door te gaan met de identificatie en documentatie van welk niet-standaard gedrag precies wordt toegelaten door Microsoft's interpreter en te dit te repliceren zodat FreeBSD kan werken zonder dat gebruikers zich gedwongen zien om de ASL te repareren. Als een tijdelijke oplossing en om te helpen met het in kaart brengen van bepaald gedrag, kan de ASL handmatig gerepareerd worden. Mocht dit lukken, dan wordt erop aangedrongen een diff(1) van de oude en de nieuwe ASL te mailen, zodat het foutieve gedrag mogelijk in ACPI-CA kan worden verwerkt, waardoor andere gebruikers niet meer handmatig met hun ASL aan de gang hoeven.
Hieronder staat een lijst algemene foutmeldingen, hun oorzaken en hoe ze op te lossen:
Sommige AMLs gaan ervan uit dat de wereld enkel bestaat uit Windows versies. FreeBSD kan zich voordoen als elk OS om te kijken of dit problemen oplost. Een gemakkelijke manier om dit te doen is hw.acpi.osname="Windows 2001" in te stellen in /boot/loader.conf of andere gelijksoortige strings die in een ASL staan.
Sommige methoden hebben geen specifieke returnwaarde, zoals wel vereist wordt
door de standaard. Hoewel ACPI-CA hier
niets mee doet, heeft FreeBSD de mogelijkheid tot impliciete returns. Er kunnen ook
expliciete return-opdrachten toegevoegd worden waar vereist, als het bekend
is welke waarden teruggevoerd moeten worden. Om iasl te
dwingen tot compilatie van ASL kan de
schakeloptie -f gebruikt worden.
Nadat eigen.asl aangepast is, kan deze als volgt gecompileerd worden:
# iasl eigen.asl
Met de optie -f is af te dwingen dat de AML gemaakt wordt, zelfs als er compileerfouten
optreden. Sommige fouten (zoals ontbrekende return-opdrachten) worden automatisch
opgelost door de interpreter.
DSDT.aml is de standaardnaam voor het bestand dat door iasl wordt geproduceerd. Dit is in plaats van de foutieve versie uit het BIOS (die nog steeds aanwezig is in het flashgeneugen) te laden door /boot/loader.conf als volgt te wijzigen:
acpi_dsdt_load="YES" acpi_dsdt_name="/boot/DSDT.aml"
DSDT.aml moet in de map /boot staan.
Het stuurprogramma ACPI heeft een zeer flexibele debugfaciliteit. Er kan zowel een verzameling van subsystemen aangegeven worden als het niveau van uitvoerigheid. De te debuggen subsystemen worden aangegeven als lagen (“layers”) en zijn opgedeeld in ACPI-CA-componenten (ACPI_ALL_COMPONENTS) en ACPI-hardware-ondersteuning (ACPI_ALL_DRIVERS). De uitvoerigheid van debuguitvoer wordt aangegeven als het niveau (“level”) en gaat van CPI_LV_ERROR (alleen fouten rapporteren) tot ACPI_LV_VERBOSE (alles). Het niveau is een bitmasker en dus kunnen er meerdere opties tegelijk ingeschakeld worden (gescheiden door spaties). In de praktijk wordt wellicht een seriële console gebruikt om de uitvoer te loggen als deze zo omvangrijk is dat de console berichtbuffer vol loopt (misschien wel meerdere keren). Een complete lijst van de individuele lagen en niveaus staat in acpi(4).
Debuguitvoer staat standaard niet aan. Door options ACPI_DEBUG toe te voegen aan het bestand met kernelinstellingen als ACPI als de kernel is gebouwd, wordt het ingeschakeld. Door ACPI_DEBUG=1 toe te voegen aan /etc/make.conf wordt het systeembreed ingeschakeld. Als ACPI als module wordt gebruikt (de normale situatie), dan hoeft slechts de module acpi.ko opnieuw gecompileerd te worden:
# cd /sys/modules/acpi/acpi && make clean && make ACPI_DEBUG=1
acpi.ko moet in /boot/kernel komen te staan en de gewenste debuglaag en het gewenste niveau van uitvoerigheid dienen toegevoegd te worden aan loader.conf. Hieronder een voorbeeld waarmee debuguitvoer wordt aangezet voor alle ACPI-CA-componenten en alle ACPI-hardware-stuurprogramma's (CPU, LID, enzovoort. Het niveau van uitvoerigheid is het laagst mogelijke. Er worden alleen fouten gemeld.
debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS" debug.acpi.level="ACPI_LV_ERROR"
Als de gezochte informatie wordt veroorzaakt door een specifieke gebeurtenis (bijvoorbeeld in en uit slaapstand gaan), dan kunnen wijzigingen aan loader.conf achterwege blijven en in plaats daarvan kan sysctl gebruikt worden om laag en niveau in te stellen na het opstarten en zo het systeem voor te bereiden op die specifieke gebeurtenis. De sysctls hebben dezelfde namen als de parameters in loader.conf.
Meer informatie over ACPI staat op de volgende locaties:
De ACPI 2.0 specificatie http://acpi.info/spec.htm
FreeBSD Handleidingen: acpi(4), acpi_thermal(4), acpidump(8), iasl(8), acpidb(8)
DSDT debugging informatie. (Gebruikt Compaq als voorbeeld, maar van algemeen nut).
Het proces van het starten van de computer en het laden van het besturingssysteem wordt het “bootstrapproces” of simpelweg “booten” genoemd. Het FreeBSD opstartproces levert een grote mate van flexibiliteit doordat gewijzigd kan worden wat er gebeurt als het systeem start en geeft de mogelijkheid om te kiezen uit verschillende geïnstalleerde besturingssystemen op dezelfde computer of zelfs verschillende versies van hetzelfde besturingssysteem of geïnstalleerde kernel.
Dit hoofdstuk geeft gedetailleerde informatie over instellingen die gebruikt kunnen worden en hoe het FreeBSD opstartproces veranderd kan worden. Dit omvat alles wat er gebeurt totdat de FreeBSD kernel wordt geladen, gezocht heeft naar apparaten en init(8) start. Dit vindt plaats als tijdens het booten de tekstkleur verandert van helder wit naar grijs.
Na het lezen van dit hoofdstuk weet de lezer:
Wat de onderdelen zijn van het FreeBSD bootstrap-systeem en hoe zij onderling communiceren;
De opties die meegegeven kunnen worden aan de componenten in de bootstrap om het proces te sturen;
Meer over device.hints(5);
Alleen voor x86: Dit hoofdstuk beschrijft alleen het opstartproces van FreeBSD dat draait op een Intel x86 systeem.
Het aanzetten van een computer en het starten van het besturingssysteem zorgt voor een interessant dilemma. Vast staat dat een computer niet weet wat hij moet doen totdat het besturingssysteem gestart is. Daar valt ook het starten van programma's op schijf onder. Dus als een computer geen programma van schijf kan starten zonder besturingssysteem en het besturingssysteem staat op schijf, hoe wordt het besturingssysteem dan gestart?
Dit is een gelijksoortig probleem als dat in het boek De avonturen van Baron von Münchausen. Iemand is in een put gevallen en heeft zichzelf eruit gehaald door zijn laarsriempjes (bootstraps) vast te pakken en zich op te trekken. In het begin van het computertijdperk is de term bootstrap gegeven aan het mechanisme dat het besturingssysteem laadt. Later werd dit afgekort tot “booten”.
Op x86 machines is het Basis Input/Output Systeem (BIOS) verantwoordelijk voor het laden van het besturingssysteem. Om dit te doen zoekt het BIOS op de harde schijf naar het Master Boot Record (MBR), dat op een vaste plek op de schijf staat. Het BIOS heeft voldoende kennis om het MBR te starten en gaat er vanuit dat de MBR de rest van de taken uitvoert die nodig zijn om het besturingssysteem te kunnen laden, mogelijk met hulp van het BIOS.
Aan de code binnen de MBR wordt meestal gerefereerd als een bootmanager, in het bijzonder als die interactie heeft met een gebruiker. In dit geval heeft de bootmanager meestal meer code in de eerste track van een schijf binnen het bestandssysteem van een besturingssysteem. Een bootmanager wordt soms ook boot loader genoemd, maar FreeBSD gebruikt die term voor een later stadium van het starten. Populaire bootmanagers zijn onder andere boot0 (ook bekend als Boot Easy, de standaard FreeBSD bootmanager), Grub, GAG en LILO (alleen boot0 past binnen de MBR.)
Als er maar één besturingssysteem en een schijf geïnstalleerd is, voldoet een standaard PC MBR. Dit MBR zoekt naar de eerste opstartbare (alias actieve) slice op schijf en start de code op deze slice om de rest van het besturingssysteem te laden. De MBR die standaard door fdisk(8) wordt geïnstalleerd is zo'n MBR. Die is gebaseerd op /boot/mbr.
Indien er meerdere besturingssystemen op schijven staan, kan er een andere bootmanager geïnstalleerd worden, een die een lijst toont met verschillende besturingssystemen en de mogelijkheid geeft om er één te kiezen dat opgestart moet worden. In de volgende paragrafen worden er twee beschreven.
Het resterende deel van het FreeBSD bootstrap-systeem is verdeeld in drie fases. De eerste fase wordt gestart door het MBR, dat net voldoende informatie heeft om de computer in een bepaalde toestand te zetten en de tweede fase te starten. De tweede fase kan net iets meer doen voordat hij de derde fase start. De derde fase voltooit het laden van het besturingssysteem. Dit proces is verdeeld in drie fases omdat de PC-standaarden grenzen stellen aan de grootte van programma's die gedraaid kunnen worden in de eerste twee fases van dit proces. Door deze taken aan elkaar te koppelen krijgt FreeBSD een flexibeler laadgedeelte.
Daarna wordt de kernel gestart en begint met het zoeken naar en initialiseren van apparaten. Zodra het kernel-opstartproces klaar is, geeft de kernel de controle over aan het gebruikerproces init(8), dat controleert of de schijven een bruikbare status hebben. Dan start init(8) de instellingen op gebruikersniveau die de bestandssystemen mount, de netwerkkaarten instelt voor communicatie met het netwerk en in het algemeen worden de processen gestart die moeten draaien op een FreeBSD systeem bij het opstarten.
De code in de MBR of bootmanager wordt soms ook wel stage zero van het opstartproces genoemd. In dit onderdeel worden twee eerder genoemde bootmanagers beschreven: boot0 en LILO.
De boot0 bootmanager: De MBR die standaard door de FreeBSD installer of boot0cfg(8) wordt geïnstalleerd is gebaseerd op /boot/boot0. Het programma boot0 is erg eenvoudig, omdat MBR maar 446 bytes lang mag zijn vanwege de slicetabel en de 0x55AA identificatie aan het einde van de MBR. Als de FreeBSD MBR is geïnstalleerd en er staan andere besturingssystemen op een harde schijf, dan is bij het opstarten een scherm te zien dat er ongeveer zo uitziet:
Andere besturingssystemen, Windows in het bijzonder, staan er om bekend dat zij bestaande MBRs overschrijven met die van zichzelf. Als dit is gebeurd of als het bestaande MBR vervangen moet worden door het FreeBSD MBR:
# fdisk -B -b /boot/boot0 apparaat
Waar apparaat het apparaat is waar de computer van boot, zoals ad0 voor de eerste IDE-schijf ad2 voor de eerste IDE-schijf op de tweede IDE-controller, da0 voor de eerste SCSI-schijf, enzovoort. Als het wenselijk is een aangepaste instelling te gebruiken voor de MBR, dan kan boot0cfg(8) gebruikt worden.
De LILO bootmanager: Start, om deze bootmanager te installeren zodat er ook FreeBSD mee gestart kan worden, eerst Linux en voeg het volgende toe aan het bestaande instellingenbestand /etc/lilo.conf:
other=/dev/hdXY table=/dev/hdX loader=/boot/chain.b label=FreeBSD
Geef in de bovenstaande regels de primaire partitie en schijf van FreeBSD op met
Linux instellingen, waarbij X vervangen wordt door de Linux schijfletter en Y
door het primaire partitienummer van Linux. Wijzig
bij gebruik van een SCSI-schijf /dev/hd in iets als /dev/sd. De regel loader=/boot/chain.b kan achterwege blijven als de
besturingssystemen op dezelfde schijf staan. Voer daarna /sbin/lilo -v uit om de wijzigingen vast te leggen.
Controleer het vastleggen door controle van de schermberichten.
Conceptueel zijn de eerste en tweede fase onderdeel van hetzelfde programma op hetzelfde stukje schijf. Door ruimtebeperkingen zijn ze in twee stukken gesplitst. Ze worden echter altijd samen geïnstalleerd. Ze worden gekopieerd uit het gecombineerde bestand /boot/boot door het installatieprogramma of bsdlabel (zie verderop).
Ze staan buiten bestandssystemen in de eerste track van de opstartslice, beginnend bij de eerste sector. Dit is waar boot0 en iedere andere bootmanager een programma verwacht om door te gaan met het opstartproces. Het aantal gebruikte sectoren kan eenvoudig bepaald worden uit de grootte van /boot/boot.
boot1 is erg simpel omdat dit slechts 512 bytes groot kan zijn en net genoeg weet over het FreeBSD bsdlabel, dat informatie bevat over de slice om boot2 te vinden en te starten.
boot2 is iets verfijnder en begrijpt het FreeBSD bestandssysteem genoeg om er bestanden op te vinden en geeft een simpele interface om de kernel of loader te kiezen die gestart moet worden.
boot2 start meestal de loader, doordat deze veel slimmer is en gebruikersvriendelijke opstartinstellingen heeft. Voorheen was het zijn taak direct de kernel te starten.
Als ooit eens de geïnstalleerde boot1 en boot2 vervangen moeten worden kan dat met bsdlabel(8):
# bsdlabel -B schijfslice
In het voorbeeld hierboven is schijfslice de schijf en slice waarvan opgestart wordt, zoals ad0s1 voor de eerste slice op de eerste IDE-schijf.
Gevaarlijk toegewijde modusAls alleen een schijfnaam als ad0 gebruikt wordt in bsdlabel(8) wordt er een gevaarlijk toegewijde schijf zonder slices gemaakt. Dit is niet aan te raden en daarom wordt aangeraden voor het uivoeren van bsdlabel(8) de commandoregel nog een keer te controleren voordat er op Return wordt gedrukt.
De loader is de laatse fase van de drietraps-bootstrap en deze bevindt zich op het bestandssysteem, meestal als /boot/loader.
De loader is bedoeld als een gebruikersvriendelijke manier voor de instelling, door gebruik te maken van een makkelijke commandoverzameling, gesteund door een krachtige vertaler met een wat complexere commandoverzameling.
Tijdens de start zoekt de loader naar een console en schijven en kijkt van welke schijf er opgestart wordt. Variabelen worden hiernaar gezet en er wordt een vertaler gestart zodat gebruikercommando's interactief of via een script kunnen worden doorgegeven.
Dan leest de loader /boot/loader.rc, die dan standaard /boot/defaults/loader.conf leest. Deze plaatst redelijke standaarden in variabelen en leest /boot/loader.conf voor lokale wijzigingen op deze variabelen. loader.rc reageert op deze variabelen door de geselecteerde modules en kernel te laden.
Als laatste wordt standaard door de loader 10 seconden gewacht op toetsinvoer en als dit niet wordt onderbroken laadt loader de kernel. Als het wel wordt onderbroken krijgt de gebruiker een prompt aangeboden die een eenvoudige commandoverzameling begrijpt. Hier kan de gebruiker variabelen wijzigen, alle modules stoppen en/of starten en uiteindelijk opstarten of herstarten.
Hieronder worden de meest gebruikte loadercommando's besproken. Een volledige omschrijving van alle beschikbare commando's staat in loader(8).
Gaat door met het opstarten van de kernel als deze niet wordt onderbroken binnen de opgegeven tijd in seconden. Er wordt een aftelproces getoond dat standaard op 10 seconden staat.
Start direct de kernel op met de opgegeven opties en naam, indien meegegeven. Het opgeven van een kernelnaam op de opdrachtregel is alleen van toepassing nadat een unload-commando is gegeven, anders wordt de kernel die hiervoor was geladen gebruikt.
Doorloopt hetzelfde automatische instellen van modules gebaseerd op variabelen zoals ook gebeurt bij het opstarten. Dit is alleen zinnig als eerst unload is gebruikt en enkele variabelen zijn gewijzigd, meestal kernel.
Toont documentatie uit /boot/loader.help. Als het opgegeven onderwerp index is, wordt een lijst met beschikbare onderwerpen getoond.
Verwerkt het bestand met de opgegeven naam. Het bestand wordt ingelezen en regel voor regel vertaald. Iedere foutmelding stopt direct het include-commando.
-t type] bestandsnaamLaadt de kernel, kernel-module of bestand van opgegeven type en naam. Ieder argument achter de bestandsnaam wordt doorgegeven aan het bestand.
-l] [padnaam]Toont de lijst bestanden in het opgegeven pad of van de rootmap als geen pad
wordt opgegeven. Als -l wordt meegegeven wordt ook
de bestandsgrootte weergegeven.
-v]Toont de lijst met alle apparaten waarvan het mogelijk is om modules te
kunnen laden. Als -v wordt meegegeven worden meer
details getoond.
-v]Toont geladen modules. Als -v wordt meegegeven
worden meer details getoont.
Toont de inhoud van het opgegeven bestand met een pauze na iedere LINES regels.
Herstart het systeem onmiddelijk.
Vult de omgevingsvariabele van de loader.
Verwijdert alle geladen modules.
Hier zijn wat practische voorbeelden van het gebruik van loader:
De kernel opstarten in single-user modus:
boot -s
De gebruikelijke kernel en modules ontladen om daarna de oude (of een andere) kernel te laden:
unload load kernel.old
kernel.GENERIC kan gebruikt worden als de algemene kernel die meegeleverd is bij de installatieschijf of kernel.old om de vorige geïnstalleerde kernel te gebruiken (als bijvoorbeeld de kernel is vervangen).
Opmerking: Zo worden de bekende modules geladen met een andere kernel:
unload set kernel="kernel.old" boot-conf
Voor het laden van een kernelinstellingenscript (een script dat dingen doet die anders met de hand ingegeven zouden worden):
load -t userconfig_script /boot/kernel.conf
Het splash-scherm creëert een visueel aantrekkelijker scherm in vergelijking met de originele opstartberichten. Dit scherm zal worden afgebeeld totdat een aanmeldprompt op de console verschijnt of een X-schermbeheerder een aanmeldprompt aanbiedt.
Er zijn twee basisomgevingen beschikbaar in FreeBSD. De eerste is de verouderde standaardomgeving met de opdrachtregel op de virtuële console. Nadat het systeem klaar is met opstarten, wordt er een aanmeldprompt op de console gepresenteerd. De tweede omgeving is de grafische omgeving van het X11 Bureaublad. Nadat X11 en één van de grafische bureaubladomgevingen, zoals GNOME, KDE, of XFce zijn geïnstalleerd, kan het X11-bureaublad worden gestart door het commando startx te gebruiken.
Sommige gebruikers verkiezen het grafische aanmeldscherm van X11 boven de traditionele op tekst gebaseerde aanmeldprompt. Schermbeheerders zoals XDM voor Xorg, gdm voor GNOME, en kdm voor KDE (en anderen van de Portscollectie) bieden een grafisch aanmeldscherm in plaats van de aanmeldprompt op het console. Na succesvol aanmelden bieden ze de gebruiker een grafisch bureaublad.
In de opdrachtregelomgeving zou het splash-scherm alle berichten over aftasten tijdens het opstarten en het starten van taken verbergen voordat het de aanmeldprompt laat zien. In een X11-omgeving zouden gebruikers een visueel overzichtelijkere opstartervaring krijgen dat meer lijkt op wat een gebruiker van een (Microsoft Windows of niet-Unix-systeem) zou ervaren.
De splash-schermfunctie ondersteunt 256-kleuren-bitmaps ( .bmp), ZSoft PCX ( .pcx) en TheDraw (.bin) bestanden. Verder moeten de splash-afbeeldingsbestanden een resolutie van 320 bij 200 pixels of minder hebben om op de standaard VGA-adapters te werken.
Activeer de VESA-ondersteuning die in FreeBSD zit om grotere afbeeldingen, tot de maximale resolutie van 1024 bij 768 pixels, te gebruiken. Dit kan worden aangezet door de VESA-module tijdens het opstarten van het systeem te laden, of door de kernelconfiguratieoptie VESA toe te voegen en een eigen kernel te bouwen (zie Hoofdstuk 9). De ondersteuning voor VESA geeft gebruikers de mogelijkheid om een splash-schermafbeelding af te beelden dat het hele scherm vult.
Zolang het splash-scherm wordt afgebeeld tijdens het opstartproces, kan het ten alle tijden worden uitgezet door op een toetsenbordtoets te drukken.
Het splash-scherm is standaard ook een schermbeveiliging buiten X11. Na een periode van inactiviteit zal het scherm in het splash-scherm veranderen en herhaald door stappen van het veranderen van de intensiteit van de afbeelding lopen, van helder tot zeer donker. Dit standaardgedrag van het splash-scherm (schermbeveiliging) kan overruled worden door een regel met saver= toe te voegen aan /etc/rc.conf. De optie saver= heeft verschillende ingebouwde schermbeveiligingen om uit te kiezen, de volledige lijst staat in de handleidingpagina splash(4). De standaard schermbeveiliging heet “warp”. Merk op dat de optie saver= die in /etc/rc.conf is gespecificeerd alleen betrekking heeft op virtuele consoles. Het heeft geen effect op X11-schermbeheerders.
Enkele meldingen van de bootloader, inclusief de opties van het opstartmenu en een getimede wachtende aftelprompt worden afgebeeld tijdens het opstarten, zelfs als het splash-scherm aanstaat.
Voorbeelden van splash-schermen kunnen gedownload worden van de galerij op http://artwork.freebsdgr.org/. Door de port sysutils/bsd-splash-changer te installeren, kunnen de splash-afbeeldingen willekeurig elke keer dat er wordt opgestart uit een verzameling worden gekozen.
Het splash-schermbestand (.bmp, .pcx of .bin) moet op de rootpartitie staan, bijvoorbeeld in de map /boot.
Bewerk voor de standaardresolutie van het opstartscherm (256 kleuren, 320 bij 200 pixels, of minder) /boot/loader.conf zodat het volgende erin staat:
splash_bmp_load="YES" bitmap_load="YES" bitmap_name="/boot/splash.bmp"
Bewerk /boot/loader.conf voor grotere videoresoluties (tot maximaal 1024 bij 768 pixels) zodat dit bestand het volgende bevat:
vesa_load="YES" splash_bmp_load="YES" bitmap_load="YES" bitmap_name="/boot/splash.bmp"
Het bovenstaande neemt aan dat /boot/splash.bmp voor het splash-scherm wordt gebruikt. Wanneer een PCX-bestand gewenst is, dienen de volgende opdrachten gebruikt te worden, en afhankelijk van de resolutie de regel vesa_load="YES".
splash_pcx_load="YES" bitmap_load="YES" bitmap_name="/boot/splash.pcx"
In versie 8.3 is een andere mogelijkheid het gebruik van ASCII-kunst in TheDraw formaat.
splash_txt="YES" bitmap_load="YES" bitmap_name="/boot/splash.bin"
De bestandsnaam is niet beperkt tot “splash” zoals in het bovenstaande voorbeeld. Het kan van alles zijn zolang het een van de bovenstaande types is, zoals splash_640x400.bmp of bluewave.pcx.
Enkele andere interessante opties voor loader.conf:
Dit zal het menu met opstartopties niet weergeven, maar de getimede wachtende aftelprompt zal nog steeds aanwezig zijn. Zelfs zonder dat het menu met opstartopties wordt afgebeeld, zal het invoeren van een optie in de getimede wachtende aftelprompt de actie van de overeenkomstige opstartoptie uitvoeren.
Dit zal de standaardwoorden “FreeBSD”, welke rechts van het menu met opstartopties worden afgebeeld vervangen door het gekleurde beastie-logo zoals vroegere uitgaven die hadden.
Raadpleeg voor meer informatie de handleidingpagina's splash(4), loader.conf(5), en vga(4).
Zodra de kernel is geladen door de loader (zoals gewoonlijk) of door boot2 (zonder de loader), wordt er als ze er zijn gekeken naar de opstartvlaggen en wordt het gedrag zo nodig aangepast.
De meest voorkomende opstartvlaggen:
-aVraag tijdens de opstart van de kernel om het apparaat dat gemount moet worden als root bestandssysteem.
-CBoot van cd-rom.
-cStart UserConfig om instellingen te maken voor de kernel tijdens het opstarten.
-sStart naar single-user modus.
-vGeef meer tekst en uitleg tijdens het opstarten van de kernel.
Opmerking: In boot(8) staan alle bootvlaggen beschreven.
Tijdens het opstarten van het systeem leest de boot loader(8) het bestand device.hints(5). Dit bestand slaat opstartinformatie voor de kernel op in variabelen, ook wel “device hints”. Deze “device hints” worden door stuurprogramma's gebruikt voor instelling van apparaten.
Device hints kunnen ook bij het Fase drie, /boot/loader prompt ingevoerd worden. Variabelen kunnen toegevoegd worden met behulp van set, verwijderd worden met unset en bekeken worden met show. Variabelen uit /boot/device.hints kunnen hier ook herroepen worden. Device hints die ingevoerd zijn bij de boot loader zijn niet permanent en zijn bij de volgende boot niet meer aanwezig.
Zodra het systeem opgestart is, kan kenv(1) gebruikt worden om alle variabelen te bekijken.
De schrijfwijze voor /boot/device.hints is één variabele per regel. Het standaard hekje “#” wordtd gebruikt voor commentaar. Regels worden als volgt opgebouwd:
hint.driver.unit.keyword="waarde"
De syntaxis voor de Fase 3 bootloader is:
set hint.driver.unit.keyword=waarde
driver is de naam van het apparaatstuurprogramma, unit is het apparaatnummer van het stuurprogramma en keyword is het hint-sleutelwoord. Dit sleutelwoord kan uit de volgende opties bestaan:
at: beschrijft de bus waarop het apparaat is aangesloten.
port: beschrijft het startadres van de I/O die gebruikt wordt.
irq: beschrijft het interrupt request nummer dat gebruikt wordt.
drq: beschrijft het DMA kanaalnummer.
maddr: beschrijft het fysieke geheugenadres dat gebruikt wordt door het apparaat.
flags: zet verschillende vlagbits voor het apparaat.
disabled: is 1 als het apparaat is uitgezet.
Apparaatstuurprogramma's kunnen hints die hier niet genoemd zijn accepteren (of eisen). Zie hiervoor de betreffende handleiding: device.hints(5), kenv(1), loader.conf(5) en loader(8).
Als de kernel klaar is met opstarten geeft die de besturing over aan het gebruikerproces init(8), te vinden in /sbin/init of de padnaam die staat is in de variabele init_path in loader.
De automatische herstart (“Automatic Reboot Sequence”) controleert of de beschikbare bestandssystemen betrouwbaar zijn. Als dat niet zo is en fsck(8) kan de fouten niet repareren, dan brengt init(8) het systeem terug naar Single-user modus voor de systeembeheerder, die het probleem dan directer kan aanpakken.
Deze modus kan bereikt worden vanuit de Automatische
herstart of door de gebruiker die opstart met de optie -s of door de variabele boot_single aan
te zetten in de loader.
Het kan ook door shutdown(8) te starten
zonder de optie reboot (-r) of halt (-h), vanuit Multi-user modus.
Als het systeem console op insecure staat in /etc/ttys, dan vraagt het systeem om het root wachtwoord voordat de single-user modus wordt gestart.
Voorbeeld 13-3. Onveilige console in /etc/ttys
# name getty type status comments # # Als de console op "insecure" staat vraagt init om het root wachtwoord # voor het naar single-user modus gaan. console none unknown off insecure
Opmerking: Met een insecure console wordt bedoeld dat de fysieke beveiliging van het console niet goed is en dat alleen personen die het root wachtwoord kennen naar single-user modus mogen gaan. Het betekent niet dat het console onveilig wordt ingesteld. Als het veilig moet, wordt er dus voor insecure gekozen en niet voor secure.
Als init(8) vindt dat het bestandssysteem in orde is of zodra de gebruiker klaar is in Single-user modus, gaat het systeem over naar multi-user modus, waarin het de resource configuration (broninstellingen) van het systeem start.
Het broninstellingensysteem leest de standaard instellingen in vanuit /etc/defaults/rc.conf en specifieke systeemdetails uit /etc/rc.conf en gaat daarna door met het mounten van de bestandssystemen voor het systeem die genoemd worden in /etc/fstab, start netwerkdiensten, start andere systeemdaemons en start als laatste de opstartscripts van lokaal geïnstalleerde packages.
rc(8) is een goede referentie voor het broninstellingensysteem. Dat zijn de scripts zelf natuurlijk ook.
Bij een gecontroleerde shutdown met shutdown(8) probeert init(8) om het script /etc/rc.shutdown te starten en daarna aan alle processen het TERM signaal te sturen en eventueel het KILL signaal aan alle processen die niet op tijd zijn gestopt.
Om een FreeBSD machine uit te zetten die energiebeheer ondersteund, kan het commando shutdown -p now gegeven worden om gelijk de stroom af te schakelen. Als er herstart moet worden dan kan shutdown -r now gebruikt worden. De gebruiker die dit uitvoert moet wel root zijn of lid van de operator groep om shutdown(8) te mogen gebruiken. halt(8) en reboot(8) kunnen ook gebruikt worden. Meer informatie is in de betreffende handleidingpagina's te vinden.
Opmerking: Voor energiebeheer is acpi(4) ondersteuning in de kernel nodig of via een module die ingeladen moet worden.
Met FreeBSD is het mogelijk een computer met meerdere gebruikers tegelijkertijd te gebruiken. Natuurlijk kan er op een zeker moment maar één gebruiker achter het scherm en toetsenbord zitten [6] , maar er kan een groot aantal gebruikers zijn aangemeld via het netwerk om dingen met de computer te doen. Om een systeem te gebruiken moet een gebruiker een account hebben.
Na het lezen van dit hoofdstuk weet de lezer:
De verschillen tussen de gebruikersaccounts op een FreeBSD systeem;
Hoe gebruikersaccounts toe te voegen;
Hoe gebruikersaccounts te verwijderen;
Hoe eigenschappen van accounts te wijzigen, zoals de volledige naam van de gebruiker of de voorkeursshell;
Hoe op een per account basis limieten in te stellen om het bronnengebruik van bijvoorbeeld geheugen en processortijd te reguleren voor accounts en accountgroepen;
Hoe groepen te gebruiken om accountbeheer te vereenvoudigen.
Aangeraden voorkennis:
Basisbegrip van UNIX en FreeBSD (Hoofdstuk 4).
Via accounts wordt alle toegang tot een systeem gegeven en alle processen worden door gebruikers gedraaid. Dus gebruikers en accountbeheer zijn van integraal belang op FreeBSD systemen.
Elke account op een FreeBSD systeem heeft een aantal informatievelden waarmee de account geïdentificeerd kan worden.
De gebruikersnaam, zoals die ingevoerd wordt bij het prompt login:. Gebruikersnamen moeten uniek zijn op een computer. Er mogen geen twee gebruikers zijn met dezelfde gebruikersnaam. Er horen een aantal regels bij het maken van geldige gebruikersnamen, die in passwd(5) staan beschreven. Gebruikersnamen bestaan gewoonlijk uit acht of minder karakters (geen hoofdletters).
Bij ieder account hoort een wachtwoord. Het wachtwoord kan leeg zijn. Er is dan geen wachtwoord nodig om toegang te krijgen tot een systeem. Dit is meestal een slecht idee. Ieder account hoort een wachtwoord te hebben.
Het UID is een nummer, traditioneel van 0 tot 65535 [7] , dat wordt gebruikt om een gebruiker op een systeem uniek te identificeren. Intern gebruikt FreeBSD het UID om gebruikers te identificeren. Voor alle FreeBSD commando's waarin een gebruikersnaam wordt opgegeven, wordt eerst geconverteerd naar het UID voordat ermee gewerkt wordt. Dit betekent dat er verschillende accounts kunnen zijn met andere gebruikersnamen maar met hetzelfde UID. Wat FreeBSD betreft zijn al die accounts één gebruiker. Het is onwaarschijnlijk dat het ooit nodig is deze eigenschap te gebruiken.
Het GID is een nummer, traditioneel van 0 tot 65535 [7], gebruikt om de primaire groep waartoe een gebruiker behoort, uniek te identificeren. Groepen zijn een methode waarmee toegang tot bronnen beheerst kan worden, gebaseerd op het GID van een gebruiker in plaats van op een UID. Hiermee kan het aantal instellingen in bepaalde bestanden aanzienlijk verkleind worden. Een gebruiker kan lid zijn van meer dan één groep.
Aanmeldklassen zijn een uitbreiding op het groepenmechanisme waarmee additionele flexibiliteit wordt geboden bij het aanpassen van een systeem op verschillende gebruikers.
Standaard dwingt FreeBSD gebruikers niet tot het periodiek wijzigen van hun wachtwoord. Dit kan wel per gebruiker afgedwongen worden, zodat sommige of alle gebruikers hun wachtwoord na een bepaalde periode moeten wijzigen.
Standaard verlopen accounts op FreeBSD niet. Als er accounts gemaakt worden waarvan bekend is dat ze maar een beperkte tijd nodig zijn, bijvoorbeeld op een school waar accounts bestaan voor studenten, dan kan er aangegeven worden wanneer een account verloopt. Nadat de verloopdatum is verstreken kan de account niet meer gebruikt worden om aan te melden op een systeem, hoewel de mappen en bestanden van de account nog wel blijven bestaan.
De gebruikersnaam identificeert de account uniek voor FreeBSD, maar die geeft niet zonder meer de echte naam van de gebruiker weer. Deze informatie kan aan de account gekoppeld worden.
De thuismap is het volledige pad naar een map op een systeem waar de gebruiker start als die aanmeldt op een systeem. Het is de gewoonte dat alle thuismappen voor gebruikers onder /home/gebruikersnaam of /usr/home/gebruikersnaam staan. Gebruikers slaan hun persoonlijke bestanden op in hun thuismap en in mappen die daaronder worden gemaakt.
De shell biedt een standaardomgeving waarmee gebruikers met een systeem werken. Er zijn vele shells en ervaren gebruikers hebben hun eigen voorkeuren, die hun weerslag kunnen hebben in hun accountinstellingen.
Er zijn drie hoofdtypen accounts: de Superuser, systeemgebruikers en gebruikersaccounts. De Superuser account, die meestal root heet, wordt gebruikt om een systeem te beheren zonder beperkingen. Systeemgebruikers kunnen diensten draaien. Tenslotte kunnen gebruikersaccounts gebruikt worden door echte personen, die aanmelden, email lezen, enzovoort.
De superuser account, die meestal root heet, is al ingesteld om gebruikt te worden voor systeembeheer en hoort niet gebruikt te worden voor dagelijkse werkzaamheden, zoals het sturen en ontvangen van email, het verkennen van het systeem of programmeren.
Dit omdat de Superuser, anders dan gewone gebruikersaccounts, zonder beperkingen kan opereren en misbruik van een Superuser account kan resulteren in spectaculaire problemen. Gebruikersaccounts kunnen niet per ongeluk een systeem vernielen, dus het is aan te raden om wanneer maar mogelijk gewone gebruikersaccounts te gebruiken, tenzij de extra privileges noodzakelijk zijn.
Commando's die als superuser worden uitgevoerd dienen altijd twee of drie keer gecontroleerd te worden voordat ze worden uitgevoerd, omdat een extra spatie of een missend karakter kan leiden tot niet terug te draaien dataverlies.
Als het niet al geregeld is, is het dus na het lezen van dit hoofdstuk aan te raden als eerste een gebruikersaccount zonder bijzondere rechten te maken voor de dagelijkse bezigheden. Dit geldt zowel als het gaat over een machine voor één gebruiker als wanneer het gaat over een machine voor meerdere gebruikers. Later in dit hoofdstuk wordt beschreven hoe additionele accounts gemaakt kunnen worden en hoe er tussen de normale gebruiker en de Superuser gewisseld kan worden.
Systeemgebruikers draaien diensten, zoals DNS, mailservers, webservers, enzovoort. De reden hiervoor is beveiliging. Als alle diensten als Superuser zouden draaien, dan zouden ze zonder beperkingen kunnen opereren.
Voorbeelden van systeemgebruikers zijn daemon, operator, bind (voor de Domain Name Service), news en www.
nobody is de generieke systeemgebruiker zonder bijzondere privileges. Het is wel belangrijk om ervan bewust te zijn dat hoe meer diensten nobody gebruiken, hoe meer bestanden en processen er bij die gebruiker horen en dat de gebruiker daardoor meer privileges kan krijgen.
Gebruikersaccounts zijn het primaire middel dat echte gebruikers gebruiken om toegang te krijgen tot een systeem en die account schermen de gebruiker en de omgeving af, waardoor die gebruikers het systeem of andere gebruikers niet kunnen beschadigen en waardoor gebruikers hun omgeving kunnen aanpassen zonder invloed te hebben op anderen.
Iedereen die toegang heeft tot een systeem hoort een unieke gebruikersaccount te hebben. Hierdoor is het mogelijk uit te vinden wie wat aan het doen is, te voorkomen dat mensen elkaars instellingen kunnen verpesten of elkaars email kunnen lezen, enzovoort.
Iedere gebruiker kan zijn eigen omgeving instellen op een systeem, door andere shells, editors, toetsenbordinstellingen en taal te kiezen.
Er zijn vele commando's beschikbaar in de UNIX omgeving om gebruikersaccounts te manipuleren. De meest gebruikte commando's worden hieronder beschreven, gevolgd door meer gedetailleerde voorbeelden van gebruik.
| Commando | Samenvatting |
|---|---|
| adduser(8) | Het aanbevolen commandoregelprogramma voor het aanmaken van nieuwe gebruikers. |
| rmuser(8) | Het aanbevolen commandoregelprogramma voor het verwijderen van gebruikers. |
| chpass(1) | Een flexibel hulpprogramma voor het wijzigen van informatie in de gebruikersdatabase. |
| passwd(1) | Een eenvoudig commandoregelprogramma voor het wijzigen van wachtwoorden van gebruikers. |
| pw(8) | Een krachtig en flexibel hulpprogramma voor het wijzigen van alle aspecten van gebruikersaccounts. |
adduser(8) is een eenvoudig programma voor het aanmaken van nieuwe gebruikers. Er worden regels mee toegevoegd aan de systeembestanden passwd en group. Het maakt ook een thuismap voor de nieuwe gebruiker, kopieert de standaard instellingenbestanden (“dotfiles”) uit /usr/share/skel en kan, optioneel, de nieuwe gebruiker een welkomstbericht mailen.
Voorbeeld 14-1. Een gebruiker toevoegen aan FreeBSD
# adduser Username: jru Full name: J. Random User Uid (Leave empty for default): Login group [jru]: Login group is jru. Invite jru into other groups? []: wheel Login class [default]: Shell (sh csh tcsh zsh nologin) [sh]: zsh Home directory [/home/jru]: Home directory permissions (Leave empty for default): Use password-based authentication? [yes]: Use an empty password? (yes/no) [no]: Use a random password? (yes/no) [no]: Enter password: Enter password again: Lock out the account after creation? [no]: Username : jru Password : **** Full Name : J. Random User Uid : 1001 Class : Groups : jru wheel Home : /home/jru Shell : /usr/local/bin/zsh Locked : no OK? (yes/no): yes adduser: INFO: Successfully added (jru) to the user database. Add another user? (yes/no): no Goodbye! #
Opmerking: Het wachtwoord wat ingegeven wordt, wordt niet getoond, er worden ook geen sterretjes getoond. Zorg ervoor dat het wachtwoord correct ingevuld wordt.
Met rmuser(8) kan een gebruiker volledig van een systeem verwijderd worden. rmuser(8) voert de volgende stappen uit:
Verwijdert de crontab(1) van de gebruiker (als die bestaat).
Verwijdert bestaande at(1) taken van de gebruiker.
Stopt alle processen van de gebruiker.
Verwijdert de gebruiker uit het lokale wachtwoordbestand van een systeem.
Verwijdert de thuismap van de gebruiker (als de gebruiker daar eigenaar van is).
Verwijdert de inkomende email voor de gebruiker uit /var/mail.
Verwijdert alle bestanden waar de gebruiker eigenaar van is uit opslaggebieden voor tijdelijke bestanden als /tmp.
Als laatste wordt de gebruikersnaam uit alle groepen in /etc/group waar die lid van was verwijderd.
Opmerking: Als een groep leeg raakt en de groepsnaam is hetzelfde als de gebruikersnaam, dan wordt de groep verwijderd. Dit is het tegenovergestelde van wat adduser(8) met een unieke groep per gebruiker.
rmuser(8) kan niet gebruikt worden om superuser accounts te verwijderen, omdat dat vrijwel altijd leidt tot vreselijke verwoesting.
Standaard wordt een interactieve modus gebruikt, die ervoor zorgt dat alle stappen bewust worden genomen.
Voorbeeld 14-2. Interactief accounts verwijderen met rmuser
# rmuser jru Matching password entry: jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh Is this the entry you wish to remove? y Remove user's home directory (/home/jru)? y Updating password file, updating databases, done. Updating group file: trusted (removing group jru -- personal group is empty) done. Removing user's incoming mail file /var/mail/jru: done. Removing files belonging to jru from /tmp: done. Removing files belonging to jru from /var/tmp: done. Removing files belonging to jru from /var/tmp/vi.recover: done. #
chpass(1) wijzigt informatie in de gebruikersdatabase, zoals wachtwoorden, shells en persoonlijke informatie.
Alleen systeembeheerders, zoals de Superuser, mogen de informatie en wachtwoorden voor andere gebruikers wijzigen met chpass(1).
Als er geen opties worden meegegeven, buiten de optionele gebruikersnaam, dan toont chpass(1) een editor waarin de gebruikersinformatie wordt weergegeven. Als de gebruiker de editor verlaat, dan wordt de gebruikersdatabase bijgewerkt met de nieuwe informatie.
Opmerking: Er zal om uw wachtwoord gevraagd worden na het verlaten van de tekstverwerker, als de huidige gebruiker niet de superuser is.
Voorbeeld 14-3. Interactieve chpass door superuser
#Informatie in de gebruikersdatabase wijzigen voor jru. Login: jru Password: * Uid [#]: 1001 Gid [# or name]: 1001 Change [month day year]: Expire [month day year]: Class: Home directory: /home/jru Shell: /usr/local/bin/zsh Full Name: J. Random User Office Location: Office Phone: Home Phone: Other information:
Een normale gebruiker kan slechts een deel van de bovenstaande informatie wijzen en alleen voor zijn eigen account.
Voorbeeld 14-4. Interactieve chpass door een gewone gebruiker
#Informatie in de gebruikersdatabase wijzigen voor jru. Shell: /usr/local/bin/zsh Full Name: J. Random User Office Location: Office Phone: Home Phone: Other information:
Opmerking: chfn(1) en chsh(1) zijn gewoon links naar chpass(1). Dat geldt ook voor ypchpass(1), ypchfn(1) en ypchsh(1). Ondersteuning voor NIS gaat automatisch; er hoeft dus geen yp voor het commando aangegeven te worden. NIS wordt behandeld in Hoofdstuk 30.
Met passwd(1) wijzigt een gebruiker gewoonlijk zijn eigen wachtwoord of dat van een andere gebruiker als het door de Superuser wordt uitgevoerd.
Opmerking: Om onbedoelde of ongeautoriseerde wijzigen te voorkomen moet het originele wachtwoord worden ingegeven voordat een nieuw wachtwoord kan worden ingesteld.
Voorbeeld 14-5. Wachtwoord wijzigen
% passwd Changing local password for jru. Old password: New password: Retype new password: passwd: updating the database... passwd: done
Voorbeeld 14-6. Als superuser het wachtwoord van een andere gebruiker wijzigen
# passwd jru Changing local password for jru. New password: Retype new password: passwd: updating the database... passwd: done
Opmerking: Net als bij chpass(1) is yppasswd(1) gewoon een link naar passwd(1), dus NIS werkt met beide commando's.
pw(8) is een commandoregelhulpprogramma om gebruikers en groepen te maken, verwijderen, aan te passen en weer te geven. Het werkt als een voorkant voor de systeembestanden met gebruikers en groepen. pw(8) heeft een zeer krachtige set commandoregelopties, waardoor het erg geschikt is om in shell scripts gebruikt te worden. Nieuwe gebruikers vinden het wellicht gecompliceerder dan de andere commando's die hier beschreven worden.
Bij het hebben van gebruikers komt wellicht ook de gedachte aan het beperken van de mogelijkheden op een systeem. FreeBSD biedt een aantal mogelijkheden waarmee een beheerder de hoeveelheid systeembronnen die een gebruiker kan aanwenden kan beperken. Die beperkingen zijn onderverdeeld in twee onderdelen: schijfquota en andere beperkingen voor bronnen.
Schijfquota beperken het schijfgebruik voor gebruikers en ze bieden een mogelijkheid om dat gebruik snel te controleren zonder het iedere keer te hoeven berekenen. Quota worden besproken in Paragraaf 19.15.
De overige beperking van bronnen omvat het beperken van het gebruik van CPU, geheugen en andere bronnen die gebruikers tot hun beschikking hebben. Die worden ingesteld in aanmeldklassen en worden hieronder beschreven.
Aanmeldklassen worden ingesteld in /etc/login.conf. De precieze semantiek wordt niet behandeld in dit handboek, maar die staat beschreven in login.conf(5). Hier is het voldoende aan te geven dat iedere gebruiker wordt toegewezen aan een aanmeldklasse (standaard default) en dat iedere aanmeldklasse verbonden is met een groep aanmeldmogelijkheden (login capability). Een aanmeldmogelijkheid is een naam=waarde paar, waar naam een bekende eigenschap is en waarde een arbitraire string is die wordt verwerkt afhankelijk van de naam. Het instellen van aanmeldklassen en -mogelijkheden is een redelijk eenvoudig proces en wordt ook beschreven in login.conf(5).
Opmerking: Een systeem leest de instellingen uit normaal gesproken /etc/login.conf niet direct, maar leest het databasebestand /etc/login.conf.db welke snellere opzoekmogelijkheden biedt. /etc/login.conf.db kan met het volgende commando gemaakt worden uit /etc/login.conf:
# cap_mkdb /etc/login.conf
Beperkingen van bronnen verschillen van standaard aanmeldmogelijkheden op twee manieren. Ten eerste is er voor iedere beperking een zachte en een harde limiet. Een zachte (huidige) limiet kan door een gebruiker of applicatie aangepast worden, maar mag niet hoger zijn dan de harde limiet. De laatste kan door een gebruiker verlaagd worden, maar nooit verhoogd. Deze verschillen worden veroorzaakt door de specifieke behandeling van de beperkingen, niet door de implementatie van het aanmeldmogelijkheden raamwerk, dat wil zeggen dat ze niet echt bijzondere aanmeldmogelijkheden zijn.
Hieronder worden de meest gebruikte beperkingen op bronnen beschreven. De overige mogelijkheden, samen met alle andere aanmeldmogelijkheden, staat beschreven in login.conf(5).
De limiet op de grootte van een corebestand dat wordt gemaakt door een programma is, om verschillende redenen, ondergeschikt aan andere beperkingen op het gebied van schijfgebruik (bijvoorbeeld filesize of schijfquota). Desalniettemin wordt deze instelling vaak gebruikt als een minder zware methode voor het beheersen van het gebruik van schijfruimte. Omdat gebruikers niet hun eigen corebestanden maken en ze vaak niet verwijderen, kan deze instelling helpen te voorkomen dat een schijf vol loopt in het geval een groot programma (bijvoorbeeld emacs) zou crashen.
Dit is de maximale hoeveelheid processortijd die een proces van een gebruiker mag gebruiken. Processen die meer bronnen gebruiken worden afgeschoten door de kernel.
Opmerking: Dit is een beperking op de CPU tijd die wordt gebruikt, niet op een percentage van de CPU, zoals wordt getoond in sommige velden door top(1) en ps(1). Een limiet op de laatste is op het moment van schrijven niet mogelijk en zou ook redelijk waardeloos zijn: een compiler - waarschijnlijk een legitieme taak - kan makkelijk gedurende enige tijd bij 100% van een CPU gebruiken.
Dit is de maximale grootte voor een bestand waar een gebruiker eigenaar van kan zijn. Anders dan bij schijfquota is deze limiet van toepassing op individuele bestanden en niet op alle bestanden samen waarvan een gebruiker eigenaar is.
Dit is het maximale aantal processen dat een gebruiker mag draaien. Hieronder
vallen zowel processen die op de voorgrond draaien als op de achtergrond. Om
duidelijke reden kan deze waarde niet groter zijn dan de ingestelde
systeemlimiet voor kern.maxproc met sysctl(8). Het te laag
zetten van deze instelling kan de productiviteit van een gebruiker schaden: vaak is
het zinvol om meerdere keren aangemeld te zijn of om pipelines uit te voeren.
Sommige taken, zoals het compileren van een groot programma, brengen ook meerdere
processen voort (bijvoorbeeld make(1), cc(1) en andere
tussentijdse preprocessors).
Dit is de maximale hoeveelheid geheugen die een proces mag claimen om te locken in het hoofdgeheugen (zie bijvoorbeeld mlock(2)). Sommige systeemkritische programma's, zoals amd(8), locken in het hoofdgeheugen, zodat zij, in het geval het wisselbestand gebruikt moet worden, niet hoeven bij te dragen aan dat proces als het nodig is.
Dit is de maximale hoeveelheid geheugen die een proces op enig moment mag gebruiken. Hieronder vallen zowel hoofdgeheugen als het gebruik van het wisselbestand. Deze limiet vangt niet al het geheugengebruik af, maar het is een prima begin.
Dit is het maximale aantal bestanden dat een proces open mag hebben. In FreeBSD
representeren bestanden ook sockets en IPC kanalen. Deze limiet mag dus niet te
laag gezet worden. De limiet voor het systeem staat ingesteld in kern.maxfiles van sysctl(8).
Dit is de limiet op de hoeveelheid netwerkgeheugen, en dus mbufs, die een gebruiker ter beschikking staan. Deze waarde komt voort uit het antwoord op een DoS aanval waarmee veel sockets werden gemaakt, maar het kan in het algemeen gebruikt worden om de hoeveelheid netwerkcommunicatie te limiteren.
Dit is de maximale grootte voor een stack van een proces. Deze instelling alleen is niet genoeg om de hoeveelheid geheugen die een programma mag gebruiken te beperken. Daarom moet deze limiet samen met andere limieten gebruikt worden.
Er zijn nog een aantal dingen belangrijk bij het instellen bronbeperkingen. Hierna worden een aantal algemene tips, suggesties en commentaren gegeven.
Processen die bij het opstarten van een systeem gestart worden vanuit /etc/rc worden toegewezen aan de aanmeldklasse daemon.
Hoewel de /etc/login.conf die bij een systeem zit een goede bron is voor redelijke waardes voor de meeste limieten, kan alleen de beheerder van een machine de echt juiste waarden kennen. Het te hoog instellen van een limiet kan een systeem kwetsbaar maken voor misbruik, terwijl het te laag instellen van limieten de productiviteit te veel kan hinderen.
Gebruikers van het X Window systeem (X11) horen waarschijnlijk meer bronnen toegewezen te krijgen dan andere gebruikers. X11 gebruikt zelf al meer bronnen, maar het moedigt gebruikers ook aan om meerdere programma's tegelijkertijd te draaien.
Het is belangrijk niet te vergeten dat veel limieten betrekking hebben op
individuele processen en niet op een hele gebruiker. Het instellen van bijvoorbeeld
openfiles op 50, betekent dat ieder proces dat
een gebruiker draait 50 open bestanden mag hebben. Het totale aantal bestanden dat
een gebruiker dus open kan hebben is het product van de waarde van openfiles en de waarde van maxproc.
Dit geldt ook voor het gebruik van geheugen.
Meer informatie over bronbeperkingen en aanmeldklassen in het algemeen staan in de relevante hulppagina's: cap_mkdb(1), getrlimit(2), login.conf(5).
Een groep is eenvoudigweg een lijst gebruikers. Groepen kunnen geïdentificeerd worden aan de hand van hun naam en GID (Groep ID). In FreeBSD (en de meeste andere UNIX achtige systemen), worden besluiten door de kernel over of een proces iets wel of niet mag doen genomen op basis van het bijbehorende gebruikers ID en een lijst van groepen waar dat bij hoort. Anders dan bij een gebruikers ID, heeft een proces een lijst met bijbehorende groepen. Sommige programma's refereren wel eens aan het “groep ID” van een gebruiker of een proces. Meestal is dit gewoon de eerste groep in de hiervoor genoemde lijst.
De vertaling van groep ID naar groepsnaam staat in /etc/group. Dit is een tekstbestand met vier velden die door het karakter : (dubbele punt) worden gescheiden. Het eerste veld is de groepsnaam, het tweede veld is het versleutelde wachtwoord, het derde het groep ID, het vierde een door komma's gescheiden lijst van leden van de groep. Het bestand kan zonder gevaar met de hand aangepast worden (aangenomen dat er geen fouten in de syntaxis worden gemaakt, natuurlijk). Een volledige beschrijving van de syntaxis staat in group(5).
Als het onwenselijk is om /etc/group met de hand aan te passen, dan kan pw(8) gebruikt worden voor het toevoegen en wijzigen van groepen. Om bijvoorbeeld een groep met de naam teamtwo toe te voegen en daarna het bestaan van die groep te bevestigen:
Voorbeeld 14-7. Groepen toevoegen met pw(8)
# pw groupadd teamtwo # pw groupshow teamtwo teamtwo:*:1100:
Het getal 1100 hierboven is het groep ID van de groep teamtwo. Met de huidige instelling heeft teamtwo geen leden en is die redelijk waardeloos. Dat kan veranderen door jru aan de groep teamtwo toe te voegen.
Voorbeeld 14-8. De lijst van groepsleden instellen met pw(8)
# pw groupmod teamtwo -M jru # pw groupshow teamtwo teamtwo:*:1100:jru
Het argument voor de optie -M is een door komma's
gescheiden lijst van gebruikers die in de aangegeven groep moeten komen. In de voorgaande
paragrafen is al aangegeven dat het wachtwoordbestand ook voor iedere gebruiker een groep
bevat. Een gebruiker wordt automatisch toegevoegd aan de groepenlijst door een systeem.
De gebruiker wordt niet als lid getoond van die groep bij het gebruik van de optie groupshow van pw(8), maar wordt wel
getoond als de informatie wordt opgevraagd via id(1) of met een
soortgelijk programma. Met andere woorden: pw(8) wijzigt alleen
het bestand /etc/group en probeert nooit extra informatie te
lezen uit /etc/passwd.
Voorbeeld 14-9. Een nieuw lid aan een groep toevoegen met pw(8)
# pw groupmod teamtwo -m db # pw groupshow teamtwo teamtwo:*:1100:jru,db
Het argument voor de optie -m is een door komma's
gescheiden lijst van gebruikers die aan de groep worden toegevoegd. In tegenstelling tot
het vorige voorbeeld, worden deze gebruikers aan de groep toegevoegd en vervangen ze de
lijst van gebruikers in de groep niet.
Voorbeeld 14-10. id(1) gebruiken om groepslidmaatschap te bepalen
% id jru uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)
Hierboven is te zien dat jru lid is van de groepen jru en teamtwo.
Meer informatie over pw(8) staat in de hulppagina en meer informatie over de opmaak van /etc/group staat in group(5).
Dit hoofdstuk biedt een basisinleiding in systeembeveiligingsconcepten, een aantal goede basisregels en een paar gevorderde onderwerpen binnen FreeBSD. Veel van de onderwerpen die worden behandeld kunnen ook worden toegepast op systemen en Internet in het algemeen. Het Internet is niet langer een “vriendelijke” omgeving waar iedereen een goede buur wil zijn. Het beveiligen van een systeem is onontbeerlijk als gegevens, intellectueel eigendom, tijd en wat dan ook uit de handen van hackers en dergelijke gehouden moeten worden.
FreeBSD biedt veel hulpmiddelen en mechanismen om te zorgen voor de integriteit en veiligheid van een systeem en netwerk.
Na het lezen van dit hoofdstuk weet de lezer:
Van basis systeembeveiligingsconcepten in relatie tot FreeBSD.
Meer over verschillende versleutelingsmechanismen die beschikbaar zijn in FreeBSD zoals DES en MD5.
Hoe eenmalige wachtwoordautenticatie opgezet kan worden.
Hoe TCP Wrappers in te stellen voor gebruik met inetd.
Hoe Kerberos5 op FreeBSD opgezet kan worden.
Hoe IPsec wordt ingesteld en hoe een VPN op te zetten tussen FreeBSD en Microsoft Windows machines.
Hoe OpenSSH, FreeBSD's SSH implementatie, in te stellen en te gebruiken.
Wat bestandssysteem-ACLs zijn en hoe die te gebruiken;
Hoe het hulpprogramma Portaudit gebruikt kan worden om softwarepakketten uit de Portscollectie te auditen.
Hoe om te gaan met publicaties van FreeBSD beveiligingswaarschuwingen.
Iets van procesaccounting en hoe dat is in te schakelen in FreeBSD.
Er wordt aangenomen dat de lezer van dit hoofdstuk:
Basisbegrip heeft van FreeBSD en Internetconcepten.
In dit boek worden nog meer onderwerpen met betrekking tot beveiliging beschreven. Zo wordt bijvoorbeeld Verplichte Toegangscontrole (Mandatory Access Control) besproken in Hoofdstuk 17 en Internet Firewalls in Hoofdstuk 31.
Beveiliging is een taak die begint en eindigt bij de systeembeheerder. Hoewel alle BSD UNIX meergebruikerssystemen enige inherente beveiliging kennen, is het bouwen en onderhouden van additionele beveiligingsmechanismen om de gebruikers “eerlijk” te houden waarschijnlijk een van de zwaarste taken voor de systeembeheerder. Machines zijn zo veilig als ze gemaakt worden en beveiligingsoverwegingen staan altijd op gespannen voet met de wens om gebruiksvriendelijkheid. UNIX systemen zijn in het algemeen in staat tot het tegelijkertijd uitvoeren van een enorm aantal processen en veel van die processen acteren als server - daarmee wordt bedoeld dat externe entiteiten er verbindingen mee kunnen maken en ertegen kunnen praten. Nu de minicomputers en mainframes van gisteren de desktops van vandaag zijn en computers onderdeel zijn van netwerken en internetwerken, wordt beveiliging nog belangrijker.
Systeembeveiliging heeft ook te maken met het omgaan met verschillende vormen van aanvallen, zoals een poging om een systeem te crashen of op een andere manier onstabiel te maken, zonder te proberen de root account aan te vallen (“break root”). Aandachtspunten voor beveiliging kunnen opgesplitst worden in categorieën:
Ontzeggen van dienst aanvallen (“Denial of Service”).
Gebruikersaccounts compromitteren.
root compromitteren via toegankelijke servers.
root compromitteren via gebruikersaccounts.
Achterdeur creëren (“Backdoor”).
Een ontzegging van dienst (DoS) aanval is een techniek die de machine middelen ontneemt. In het algemeen zijn DoS aanvallen brute kracht mechanismen die proberen de machine te crashen of op een andere manier onbruikbaar te maken door de machine of de netwerkcode te overvragen. Sommige DoS aanvallen proberen misbruik te maken van bugs in de netwerkcode om een machine met een enkel pakket te crashen. Zoiets kan alleen gerepareerd worden door een aanpassing aan de kernel te maken. Aanvallen op servers kunnen vaak hersteld worden door op de juiste wijze opties in stellen om de belasting van servers te limiteren in ongunstige omstandigheden. Omgaan met brute kracht aanvallen is lastiger. Zo is een aanval met gefingeerde pakketten (“spoofed-packet”) vrijwel niet te stoppen, behalve dan door het systeem van Internet los te koppelen. Misschien gaat de machine er niet door plat, maar het kan wel een volledige Internetverbinding verzadigen.
Een gecompromitteerde gebruikersaccount komt nog veel vaker voor dan een DoS aanval. Veel systeembeheerders draaien nog steeds standaard telnetd, rlogind, rshd en ftpd servers op hun machines. Deze servers communiceren standaard niet over beveiligde verbindingen. Het resultaat is dat als er een redelijk grote gebruikersgroep is, er altijd wel van een of meer van de gebruikers die van afstand op dat systeem aanmelden (wat toch de meest normale en makkelijke manier is om op een systeem aan te melden) het wachtwoord is afgeluisterd (“sniffed”). Een oplettende systeembeheerder analyseert zijn logboekbestanden om te zoeken naar verdachte bronadressen, zelfs als het om succesvolle aanmeldpogingen gaat.
Uitgangspunt moet altijd zijn dat als een aanvaller toegang heeft tot een gebruikersaccount, de aanvaller de root account kan compromitteren. In werkelijkheid is het wel zo dat voor een systeem dat goed beveiligd is en goed wordt onderhouden, toegang tot een gebruikersaccount niet automatisch betekent dat de aanvaller ook root privileges kan krijgen. Het is van belang dit onderscheid te maken, omdat een aanvaller zonder toegang tot root in het algemeen zijn sporen niet kan wissen en op z'n best wat kan rommelen met bestanden van de gebruiker of de machine kan crashen. Gecompromitteerde gebruikersaccounts zijn vrij normaal omdat gebruikers normaliter niet de voorzorgsmaatregelen nemen die systeembeheerders nemen.
Systeembeheerders moeten onthouden dat er in potentie heel veel manieren zijn om toegang tot root te krijgen. Een aanvaller zou het root wachtwoord kunnen kennen, een bug kunnen ontdekken in een dienst die onder root draait en daar via een netwerkverbinding op in kunnen breken of een aanvaller zou een probleem kennen met een suid-root programma dat de aanvaller in staat stelt root te worden als hij eenmaal toegang heeft tot een gebruikersaccount. Als een aanvaller een manier heeft gevonden om root te worden op een machine, dan hoeft hij misschien geen achterdeur (“backdoor”) te installeren. Veel bekende manieren die zijn gevonden om root te worden, en weer zijn afgesloten, vereisen veel werk van de aanvaller om zijn rommel achter zich op te ruimen, dus de meeste aanvallers installeren een achterdeur. Een achterdeur biedt de aanvaller een manier om makkelijk opnieuw root toegang tot het systeem te krijgen, maar dit geeft de slimme systeembeheerder ook een makkelijke manier om de inbraak te ontdekken. Het onmogelijk maken een achterdeur te installeren zou best wel eens nadelig kunnen zijn voor beveiliging, omdat hiermee nog niet het gat gedicht is waardoor er in eerste instantie is ingebroken.
Beveiligingsmaatregelen moeten altijd geïmplementeerd worden in een meerlagenmodel en worden als volgt gecategoriseerd:
Beveiligen van root en medewerkersaccounts.
Beveiligen van root - servers onder root en suid-/sgid-binaire bestanden.
Beveiligen van gebruikersaccounts.
Beveiligen van het wachtwoordbestand.
Beveiligen van de kern van de kernel, ruwe apparaten en bestandssystemen.
Snel detecteren van ongeoorloofde wijzigingen aan het systeem.
Paranoia.
In het volgende onderdeel van dit hoofdstuk gaan we dieper in op de bovenstaande punten.
Commando versus protocol: In dit hele document gebruiken we vette tekst om te verwijzen naar een commando of applicatie en een monospaced lettertype om te verwijzen naar specifieke commando's. Protocollen staan vermeld in een normaal lettertype. Dit typografische onderscheid is zinvol omdat bijvoorbeeld ssh zowel een protocol als een commando is.
In de volgende onderdelen behandelen we de methodes uit de vorige paragraaf om een FreeBSD-systeem te beveiligen.
Om te beginnen: doe geen moeite om medewerkersaccounts te beveiligen als de root account niet beveiligd is. Op de meeste systemen heeft de root account een wachtwoord. Als eerste moet aangenomen worden dat dit wachtwoord altijd gecompromitteerd is. Dit betekent niet dat het wachtwoord verwijderd moet worden. Het wachtwoord is namelijk bijna altijd nodig voor toegang via het console van de machine. Het betekent wel dat het niet mogelijk gemaakt moet worden om het wachtwoord te gebruiken buiten het console om en mogelijk zelfs niet via het su(1) commando. Pty's moeten bijvoorbeeld gemarkeerd staan als onveilig (“insecure”) in het bestand /etc/ttys zodat direct aanmelden met root via telnet of rlogin niet wordt toegestaan. Als andere aanmelddiensten zoals sshd gebruikt worden, dan hoort direct aanmelden via root uitgeschakeld staat. Dit kan door het bestand /etc/ssh/sshd_config te bewerken en ervoor te zorgen dat PermitRootLogin op no staat. Dit moet gebeuren voor iedere methode van toegang - diensten zoals FTP worden vaak over het hoofd gezien. Het direct aanmelden van root hoort alleen te mogen via het systeemconsole.
Natuurlijk moet een systeembeheerder de mogelijkheid hebben om root te worden. Daarvoor kunnen een paar gaatjes geprikt worden. Maar dan moet ervoor gezorgd worden dat er voor deze gaatjes extra aanmelden met een wachtwoord nodig is. Eén manier om root toegankelijk te maken is door het toevoegen van de juiste medewerkersaccounts aan de wheel groep (in /etc/group). De medewerkers die lid zijn van de groep wheel mogen su-en naar root. Maak medewerkers nooit “native” lid van de groep wheel door ze in de groep wheel te plaatsen in /etc/group. Medewerkersaccounts horen lid te zijn van de groep staff en horen dan pas toegevoegd te worden aan de groep wheel in het bestand /etc/group. Alleen medewerkers die ook echt toegang tot root nodig hebben horen in de groep wheel geplaatst te worden. Het is ook mogelijk, door een autenticatiemethode als Kerberos te gebruiken, om het bestand .k5login van Kerberos in de root account te gebruiken om een ksu(1) naar root toe te staan zonder ook maar iemand lid te maken van de groep wheel. Dit is misschien wel een betere oplossing, omdat het wheel-mechanisme het nog steeds mogelijk maakt voor een inbreker root te breken als de inbreker een wachtwoordbestand te pakken heeft gekregen en toegang kan krijgen tot één van de medewerkersaccounts. Hoewel het instellen van het wheel-mechanisme beter is dan niets, is het niet per se de meest veilige optie.
Om een account volledig op slot te zetten, dient het commando pw(8) gebruikt te worden:
# pw lock staff
Dit voorkomt dat de gebruiker zich aanmeldt via enig mechanisme, inclusief ssh(1).
Een andere manier om toegang tot accounts te blokkeren is om het versleutelde wachtwoord door een enkel “*”-karakter te vervangen. Dit karakter zal nooit overeenkomen met het versleutelde wachtwoord en dus gebruikerstoegang blokkeren. Het volgende medewerkersaccount bijvoorbeeld:
foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
zou veranderd moeten worden in:
foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
Dit voorkomt dat de gebruiker foobar zich aanmeldt met conventionele methoden. Deze methode om toegang te beperken werkt niet op sites die Kerberos gebruiken of in situaties waarin de gebruiker met ssh(1) sleutels heeft geïnstalleerd.
Deze beveiligingsmechanismen hebben ook als uitgangspunt dat vanaf een zwaarder beveiligde machine wordt aangemeld op een minder beveiligd systeem. Als een hoofdserver bijvoorbeeld allerlei servers draait, zou het werkstation er geen moeten draaien. Om een werkstation redelijk veilig te laten zijn, dienen er zo min mogelijk servers op te draaien, bij voorkeur zelfs geen en er zou een schermbeveiliging met wachtwoordbeveiliging op moeten draaien. Maar als een aanvaller fysieke toegang heeft tot een werkstation, dan kan hij elke beveiliging die erop is aangebracht omzeilen. Dit probleem dient echt overwogen te worden, net als het feit dat de meeste aanvallen van een afstand plaatsvinden, via het netwerk, door mensen die geen fysieke toegang hebben tot werkstations of servers.
Het gebruik van iets als Kerberos geeft de mogelijkheid om het wachtwoord van de account van een medewerker buiten gebruik te stellen of te wijzigen op één plaats, waarbij het meteen actief is op alle machines waarop die medewerker een account heeft. Als de account van een medewerker gecompromitteerd raakt, moet vooral de mogelijkheid om per direct het wachtwoord voor machines te kunnen aanpassen niet onderschat worden. Met afzonderlijke wachtwoorden kan het veranderen van wachtwoorden op N systemen een puinhoop worden. Met Kerberos kunnen ook wachtwoordrestricties opgelegd worden: het is niet alleen mogelijk om een Kerberos “ticket” na een bepaalde tijd te laten verlopen, maar het Kerberos systeem kan afdwingen dat de gebruiker na een bepaalde tijd een nieuw wachtwoord kiest (na bijvoorbeeld een maand).
Een voorzichtige systeembeheerder draait alleen die servers die nodig zijn, niets meer, niets minder. Bedenk dat servers van derde partijen vaak de meeste neiging hebben tot het vertonen van bugs. Zo staat bijvoorbeeld het draaien van een oude versie van imapd of popper gelijk aan het weggeven van de root account aan de hele wereld. Draai nooit een server die niet zorgvuldig is onderzocht. Veel servers hoeven niet te draaien als root. Zo kunnen de ntalk, comsat en finger daemons bijvoorbeeld draaien in speciale gebruikerszandbakken (“sandboxes”). Een zandbak is niet perfect, tenzij er heel veel moeite gedaan wordt, maar de meerlagenbenadering blijft bestaan: als iemand via een server die in een zandbak draait weet in te breken, dan moeten ze eerst nog uit de zandbak komen. Hoe groter het aantal lagen is waar een inbreker doorheen moet, hoe kleiner de kans op succes is. root gaten zijn historisch gezien aanwezig geweest in vrijwel iedere server die ooit als root gedraaid heeft, inclusief de basisservers van een systeem. Op een machine waarop mensen alleen aanmelden via sshd en nooit via telnetd of rshd of rlogind dienen die servers uitgeschakeld te worden!
FreeBSD draait ntalkd, comsat en finger tegenwoordig standaard in een zandbak. Een ander programma dat misschien beter in een zandbak kan draaien is named(8). In /etc/defaults/rc.conf staat als commentaar welke parameters er nodig zijn om named in een zandbak te draaien. Afhankelijk van of het een nieuwe systeeminstallatie of het bijwerken van een bestaand systeem betreft, worden de speciale gebruikersaccounts die bij die zandbakken horen misschien niet geïnstalleerd. Een voorzichtige systeembeheerder onderzoekt en implementeert zandbakken voor servers waar dat ook maar mogelijk is.
Er zijn een aantal diensten die vooral niet in een zandbak draaien: sendmail, popper, imapd, ftpd en andere. Voor sommige servers zijn alternatieven, maar dat kost misschien meer tijd dan er te besteden is (gemak dient de mens). Het kan voorkomen dat deze servers als root moeten draaien en dat er vertrouwd moet worden op andere mechanismen om een inbraak via die servers te detecteren.
De andere grote mogelijkheid voor root gaten in een systeem zijn de suid-root en sgid-binaire bestanden die geïnstalleerd zijn op een systeem. Veel van die bestanden, zoals rlogin, staan in /bin, /sbin, /usr/bin of /usr/sbin. Hoewel het niet 100% veilig is, mag aangenomen worden dat de suid- en sgid-binaire bestanden van een standaardsysteem redelijk veilig zijn. Toch worden er nog wel eens root gaten gevonden in deze bestanden. Zo is er in 1998 een root gat gevonden in Xlib waardoor xterm (die normaliter suid is) kwetsbaar bleek. Een voorzichtige systeembeheerder kiest voor “better to be safe than sorry” door de suid-bestanden die alleen medewerkers hoeven uit te voeren aan een speciale groep toe te wijzen en de suid-bestanden die niemand gebruikt te lozen (chmod 000). Een server zonder monitor heeft normaal gezien xterm niet nodig. Sgid-bestanden kunnen bijna net zo gevaarlijk zijn. Als een inbreker een sgid-kmem stuk kan krijgen, dan kan hij wellicht /dev/kmem lezen en dus het gecodeerde wachtwoordbestand, waardoor mogelijk ieder account met een wachtwoord besmet is. Een inbreker toegang tot de groep kmem kan krijgen, zou bijvoorbeeld mee kunnen kijken met de toetsaanslagen die ingegeven worden via de pty's, inclusief die pty's die gebruikt worden door gebruikers die via beveiligde methodes aanmelden. Een inbreker die toegang krijgt tot de groep tty kan naar bijna alle tty's van gebruikers schrijven. Als een gebruiker een terminalprogramma of een terminalemulator met een toetsenbordsimulatieoptie draait, dan kan de inbreker in potentie een gegevensstroom genereren die ervoor zorgt dat de terminal van de gebruiker een commando echot, dat dan wordt uitgevoerd door die gebruiker.
Gebruikersaccounts zijn gewoonlijk het meest lastig om te beveiligen. Hoewel er allerlei draconische maatregelen genomen kunnen worden met betrekking tot de medewerkers en hun wachtwoorden “weggesterd” kunnen worden, gaat dat waarschijnlijk niet lukken met de gewone gebruikersaccounts. Als er toch voldoende vrijheid is, dan prijst de beheerder zich gelukkig en is het misschien toch mogelijk de accounts voldoende te beveiligen. Als die vrijheid er niet is, dan moeten die accounts gewoon netter gemonitord worden. Het gebruik van ssh en Kerberos voor gebruikersaccounts is problematischer vanwege het extra beheer en de ondersteuning, maar nog steeds een prima oplossing in vergelijking met een versleuteld wachtwoordbestand.
De enige echte oplossing is zoveel mogelijk wachtwoorden wegsterren en ssh of Kerberos gebruiken voor toegang tot die accounts. Hoewel een gecodeerd wachtwoordbestand (/etc/spwd.db) alleen gelezen kan worden door root, is het wel mogelijk dat een inbreker leestoegang krijgt tot dat bestand zonder dat de aanvaller root-schrijftoegang krijgt.
Beveiligingsscripts moeten altijd controleren op en rapporteren over wijzigingen in het wachtwoordbestand (zie ook Bestandsintegriteit Controleren hieronder).
Als een aanvaller toegang krijgt tot root dan kan hij ongeveer alles, maar er zijn een paar slimmigheidjes. Zo hebben bijvoorbeeld de meeste moderne kernels een ingebouwd pakketsnuffelstuurprogramma (“packet sniffing”). Bij FreeBSD is dat het bpf apparaat. Een inbreker zal in het algemeen proberen een pakketsnuffelaar te draaien op een gecompromitteerde machine. De inbreker hoeft deze mogelijkheid niet te hebben en bij de meeste systemen is het niet verplicht het bpf apparaat mee te compileren.
Maar zelfs als het bpf apparaat is uitgeschakeld, dan zijn er nog /dev/mem en /dev/kmem. De inbreker kan namelijk nog schrijven naar ruwe schrijfapparaten. En er is ook nog een optie in de kernel die modulelader (“module loader”) heet, kldload(8). Een ondernemende inbreker kan een KLD-module gebruiken om zijn eigen bpf-apparaat of een ander snuffelapparaat te installeren in een draaiende kernel. Om deze problemen te voorkomen, moet de kernel op een hoger veiligheidsniveau draaien, ten minste securelevel 1.
Het veiligheidsniveau van de kernel kan op een aantal manieren worden ingesteld.
De eenvoudigste manier om het veiligheidsniveau van een draaiende kernel te verhogen
is met sysctl op de kernelvariabele kern.securelevel:
# sysctl kern.securelevel=1
Standaard start de kernel van FreeBSD op met een veiligheidsniveau van -1. Het
veiligheidsniveau blijft -1 tenzij het is veranderd, òfwel door de beheerder
òfwel door init(8) vanwege een
instelling in de opstartscripts. Het veiligheidsniveau kan tijdens het opstarten
van het systeem verhoogd worden door de variabele kern_securelevel_enable op YES te
zetten in het bestand /etc/rc.conf, en de waarde van de
variabele kern_securelevel op het gewenste
veiligheidsniveau in te stellen.
Het standaard veiligheidsniveau van een FreeBSD-systeem direct nadat de opstartscripts zijn uitgevoerd is -1. Dit wordt “onveilige modus” genoemd omdat de onveranderlijke bestandsvlag uitgezet kan worden, er van/naar alle apparaten mag worden gelezen en geschreven, enzovoorts.
Als eenmaal het veiligheidsniveau op 1 of een hogere waarde is ingesteld, worden de alleen-toevoegen en onveranderlijke bestanden gehonoreerd, deze kunnen niet worden uitgezet, en wordt toegang tot rauwe apparaten ontzegd. Hogere niveaus beperken nog meer bewerkingen. Lees, voor een volledige beschrijving van het effect van de verschillende veiligheidsniveaus, de handleidingpagina security(7) (of de handleidingpagina van init(8) voor uitgaven ouder dan FreeBSD 7.0).
Opmerking: Het ophogen van het veiligheidsniveau naar 1 of hoger kan enkele problemen met X11 (toegang tot /dev/io zal worden geblokkeerd), of met de installatie van FreeBSD wanneer die vanaf de broncode is gebouwd (het gedeelte installword van het proces moet tijdelijk de alleen-toevoegen en onveranderlijke vlaggen van sommige bestanden uitzetten), en met enkele andere gevallen veroorzaken. Soms, zoals het geval is met X11, is het mogelijk om dit te omzeilen door xdm(1) behoorlijk vroeg in het opstartproces te starten, wanneer het veiligheidsniveau nog laag genoeg is. Omzeilmethoden zoals deze zijn misschien niet voor alle veiligheidsniveaus of voor alle beperkingen die ze opleggen mogelijk. Wat vooruit plannen is een goed idee. Het is belangrijk om de beperkingen die door elk veiligheidsniveau worden opgelegd te begrijpen omdat ze het gebruiksgemak van het systeem sterk verminderen. Het vergemakkelijkt ook het kiezen van eens standaardinstelling en voorkomt allerlei verassingen.
Als het veiligheidsniveau van de kernel naar 1 of hoger wordt verhoogd, kan het nuttig zijn om de vlag schg aan te zetten voor kritieke opstartprogramma's, mappen, en scriptbestanden (i.e., alles dat gedraaid wordt tot het punt waar het veiligheidsniveau wordt ingesteld). Dit kan overdreven zijn, en het bijwerken van het systeem is veel moeilijker wanneer het op een hoog veiligheidsniveau werkt. Een minder beperkend compromis is om het systeem op een hoger veiligheidsniveau te draaien maar het aanzetten van de vlag schg voor elk systeembestand en -map onder de zon over te slaan. Een andere mogelijkheid is om / en /usr simpelweg als alleen-lezen aan te koppelen. Het dient opgemerkt te worden dat het te draconisch zijn over wat is toegestaan het belangrijke detecteren van een inbraak kan verhinderen.
Als puntje bij paaltje komt kan de kern van een systeem maar tot een bepaald punt beveiligd worden zonder dat het minder prettig werken wordt. Zo werk het zetten van de schg bit met chflags op de meeste bestanden in / en /usr waarschijnlijk averechts, omdat, hoewel de bestanden beschermd zijn, ook het venster waarin detectie plaats kan vinden is gesloten. De laatste laag van beveiliging is waarschijnlijk de meest belangrijke: detectie. Alle overige beveiliging is vrijwel waardeloos (of nog erger: geeft een vals gevoel van beveiliging) als een mogelijke inbraak niet gedetecteerd kan worden. Een belangrijk doel van het meerlagenmodel is het vertragen van een aanvaller, nog meer dan hem te stoppen, om hem op heterdaad te kunnen betrappen.
De beste manier om te zoeken naar een inbraak is zoeken naar gewijzigde, ontbrekende of onverwachte bestanden. De beste manier om te zoeken naar gewijzigde bestanden is vanaf een ander (vaak gecentraliseerd) systeem met beperkte toegang. Met zelfgeschreven scripts op dat extra beveiligde systeem met beperkte toegang is een beheerder vrijwel onzichtbaar voor mogelijke aanvallers en dat is belangrijk. Om het nut te maximaliseren moeten in het algemeen dat systeem met beperkte toegang best veel rechten gegeven worden op de andere machines in het netwerk, vaak via een alleen-lezen NFS-export van de andere machines naar het systeem met beperkte toegang of door ssh sleutelparen in te stellen om het systeem met beperkte toegang een ssh verbinding te laten maken met de andere machines. Buiten het netwerkverkeer, is NFS de minst zichtbare methode. Hierdoor kunnen de bestandssystemen op alle cliëntmachines vrijwel ongezien gemonitord worden. Als de server met beperkte toegang verbonden is met de cliëntmachines via een switch, dan is de NFS-methode vaak de beste keus. Als de server met beperkte toegang met de andere machines is verbonden via een hub of door meerdere routers, dan is de NFS-methode wellicht niet veilig genoeg (vanuit een netwerk standpunt) en kan beter ssh gebruikt worden, ondanks de audit-sporen die ssh achterlaat.
Als de machine met beperkte toegang eenmaal minstens leestoegang heeft tot een cliëntsysteem dat het moet gaan monitoren, dan moeten scripts gemaakt worden om dat monitoren ook echt uit te voeren. Uitgaande van een NFS-koppeling, kunnen de scripts gebruik maken van eenvoudige systeem hulpprogramma's als find(1) en md5(1). We adviseren minstens één keer per dag een md5 te maken van alle bestanden op de cliëntmachine en van instellingenbestanden als in /etc en /usr/local/etc zelfs vaker. Als er verschillen worden aangetroffen ten opzichte van de basis md5 informatie op het systeem met beperkte toegang, dan hoort het script te gillen om een beheerder die het moet gaan uitzoeken. Een goed beveiligingsscript controleert ook op onverwachte suid-bestanden en op nieuwe en verwijderde bestanden op systeempartities als / en /usr.
Als ssh in plaats van NFS wordt gebruikt, dan is het schrijven van het script lastiger. Dan moeten de scripts met scp naar de cliënt verplaatst worden om ze uit te voeren, waardoor ze zichtbaar worden. Voor de veiligheid dienen ook de binaire bestanden die het script gebruikt, zoals find(1), gekopieerd te worden. De ssh-cliënt op de cliënt zou al gecompromitteerd kunnen zijn. Het is misschien noodzakelijk ssh te gebruiken over onveilige verbindingen, maar dat maakt alles een stuk lastiger.
Een goed beveiligingsscript voert ook controles uit op de instellingenbestanden van gebruikers en medewerkers: .rhosts, .shosts, .ssh/authorized_keys, enzovoort. Dat zijn bestanden die buiten het bereik van de MD5-controle vallen.
Als gebruikers veel schijfruimte hebben, dan kan het te lang duren om alle bestanden op deze partitie te controleren. In dat geval is het verstandig de koppelvlaggen zo in te stellen dat suid-binaire bestanden op die partities niet zijn toegestaan. Zie daarvoor de optie nosuid (zie mount(8)). Die partities moeten wel toch nog minstens eens per week doorzocht worden, omdat het doel van deze beveiligingslaag het ontdekken van een inbraakpoging is, of die nu succesvol is of niet.
Procesverantwoording (zie accton(8)) kost relatief gezien weinig en kan bijdragen aan een evaluatie mechanisme voor na inbraken. Het is erg handig om uit te zoeken hoe iemand precies heeft ingebroken op het systeem, mits het bestand nog onbeschadigd is na de inbraak.
Tenslotte horen beveiligingsscripts de logboekbestanden te verwerken en de logboekbestanden zelf horen zo veilig mogelijk tot stand te komen. “remote syslog” kan erg zinvol zijn. Een aanvaller zal proberen zijn sporen uit te wissen en logboekbestanden zijn van groot belang voor een systeembeheerder als het gaat om uitzoeken wanneer en hoe er is ingebroken. Een manier om logboekbestanden veilig te stellen is door het systeemconsole via een seriële poort aan te sluiten op een veilige machine en zo informatie te verzamelen.
Een beetje paranoia is niet verkeerd. Eigenlijk kan de systeembeheerder zoveel beveiligingsopties inschakelen als hij wil, als deze maar geen impact hebben op het gebruiksgemak en de beveiligingsopties die wel impact hebben op het gebruiksgemak kunnen ingeschakeld worden als daar zorgvuldig mee wordt omgegaan. Nog belangrijker is misschien dat er een juiste combinatie wordt gevonden. Als de aanbevelingen uit dit document woord voor woord worden opgevolgd, dan worden daarmee de methodes aan een toekomstige aanvaller verraden, die ook toegang heeft tot dit document.
In deze paragraaf worden Ontzeggen van Dienst aanvallen (“Denial of Service” of DoS) behandeld. Een DoS-aanval wordt meestal uitgevoerd als pakketaanval. Hoewel er weinig gedaan kan worden tegen de huidige aanvallen met gefingeerde pakketten die een netwerk kunnen verzadigen, kan de schade geminimaliseerd worden door ervoor te zorgen dat servers er niet door plat gaan door:
Limiteren van server forks.
Limiteren van springplank (“springboard”) aanvallen (ICMP response aanvallen, ping broadcast, etc.).
De Kernel Route Cache overloaden.
Een veelvoorkomende DoS-aanval is om een server aan te vallen door het zoveel
kindprocessen aan te laten maken dat het hostsysteem uiteindelijk geen
bestandsdescriptors, geheugen enzovoort meer heeft en het dan opgeeft. inetd (zie inetd(8)) kent een
aantal instellingen om dit type aanval af te zwakken. Hoewel het mogelijk is
ervoor te zorgen dat een machine niet plat gaat, is het in het algemeen niet
mogelijk te voorkomen dat de dienstverlening door de aanval wordt verstoord. Meer is
te lezen in de handleiding van inetd en het advies
is in het bijzonder aandacht aan de -c, -C en -R opties te besteden.
Aanvallen met gefingeerde IP adressen
omzeilen de -C optie naar inetd, dus in het algemeen moet een combinatie van opties
gebruikt worden. Sommige op zichzelf staande servers hebben parameters waarmee
het aantal forks gelimiteerd kan worden.
Sendmail heeft de optie -OMaxDaemonChildren die veel beter blijkt te werken dan het
gebruik van de opties van Sendmail waarmee de werklast
gelimiteerd kan worden. De parameter MaxDaemonChildren
moet zodanig ingesteld worden dat als sendmail start;
deze hoog genoeg is om de te verwachten belasting aan te kunnen, maar niet zo
hoog is dat de computer het aantal instanties van Sendmails niet aankan zonder plat te gaan. Het is ook
verstandig om Sendmail in de wachtrijmodus (-ODeliveryMode=queued) te draaien en de daemon (sendmail -bd) los te koppelen van de verwerking van de wachtrij
(sendmail -q15m). Als de verwerking van wachtrij real-time
moet, kunnen de tussenpozen voor verwerking verkort worden door deze
bijvoorbeeld op -q1m in te stellen, maar dan is een
redelijke instelling van MaxDaemonChildren van belang om
die Sendmail te beschermen tegen trapsgewijze fouten.
Syslogd kan direct aangevallen worden en het is sterk
aan te raden de -s optie te gebruiken waar dat ook maar
mogelijk is en anders de -a optie.
Er dient voorzichtig omgesprongen te worden met diensten die terugverbinden zoals TCP Wrapper's reverse-identd die direct aangevallen kan worden. In het algemeen is het hierom onverstandig gebruik te maken van de reverse-ident optie van TCP Wrapper.
Het is een goed idee om interne diensten af te schermen voor toegang van buitenaf
door ze te firewallen op de routers aan de rand van een netwerk (“border
routers”). Dit heeft als achtergrond dat verzadigingsaanvallen voorkomen
van buiten het LAN voorkomen kunnen worden. Daarmee wordt geen aanval op root via het netwerk en die diensten daaraan voorkomen. Er
dient altijd een exclusieve firewall te zijn, dat wil zeggen “firewall alles
behalve poorten A, B, C, D en
M-Z”. Zo worden alle lage poorten gefirewalled behalve die voor
specifieke diensten als named (als er een primary is
voor een zone), ntalkd, sendmail en andere diensten die vanaf Internet toegankelijk
moeten zijn. Als de firewall andersom wordt ingesteld, als een inclusieve of
tolerante firewall, dan is de kans groot dat er wordt vergeten een aantal
diensten af te “sluiten” of dat er een nieuwe interne dienst wordt
toegevoegd en de firewall niet wordt bijgewerkt. Er kan nog steeds voor gekozen
worden de hoge poorten open te zetten, zodat een tolerante situatie ontstaat,
zonder de lage poorten open te stellen. FreeBSD biedt ook de mogelijkheid een
reeks poortnummers die gebruikt worden voor dynamische verbindingen in te stellen
via de verscheidene net.inet.ip.portrange sysctls (sysctl -a | fgrep portrange),
waardoor ook de complexiteit van de firewall instellingen kan vereenvoudigen. Zo kan
bijvoorbeeld een normaal begin tot eindbereik ingesteld worden van 4000 tot
5000 en een hoog poortbereik van 49152 tot 65535. Daarna kan alles onder 4000
op de firewall geblokkeerd worden (met uitzondering van bepaalde poorten die vanaf
Internet bereikbaar moeten zijn natuurlijk).
Een andere veelvoorkomende DoS-aanval is de springplankaanval: een server zo aanvallen dat de respons van die server de server zelf, het lokale netwerk of een andere machine overbelast. De meest voorkomende aanval van dit type is de ICMP ping broadcast aanval. De aanvaller fingeert ping-pakketten die naar het broadcast-adres van het LAN worden gezonden met als bron het IP-adres van de machine die hij eigenlijk aan wil vallen. Als de routers aan de rand van het netwerk niet zijn ingesteld om een ping-pakketten aan een broadcast-adres te blokkeren, dan kan het LAN genoeg antwoorden produceren om de verbinding van het slachtoffer (het gefingeerde bronadres) te verzadigen, zeker als de aanvaller hetzelfde doet met tientallen andere netwerken. Broadcastaanvallen met een volume van meer dan 120 megabit zijn al voorgekomen. Een tweede springplankaanval is er een tegen het ICMP-foutmeldingssysteem. Door een pakket te maken waarop een ICMP-foutmelding komt, kan een aanvaller de inkomende verbinding van een server verzadigen en de uitgaande verbinding laten verzadigen met ICMP-foutmeldingen. Dit type aanval kan een server ook laten crashen door te zorgen dat het geheugen ervan vol zit, zeker als de server de ICMP-antwoorden niet zo snel kwijt kan als dat het ze genereert. Gebruik de sysctl-variabele net.inet.icmp.icmplim om deze aanvallen te beperken. De laatste belangrijke klasse springplankaanvallen hangt samen met een aantal interne diensten van inetd zoals de UDP-echodienst. Een aanvaller fingeert eenvoudigweg een UDP-pakket met als bronadres de echopoort van Server A en als bestemming de echopoort van Server B, waar Server A en B allebei op een LAN staan. Die twee servers gaan dat pakket dan heen en weer kaatsen. Een aanvaller kan beide servers overbelasten door een aantal van deze pakketten te injecteren. Soortgelijke problemen kunnen ontstaan met de poort chargen. Een competente systeembeheerder zal al deze interne inetd testdiensten uitschakelen.
Gefingeerde pakketten kunnen ook gebruikt worden om de kernel route cache te
overbelasten. Raadpleeg daarvoor de net.inet.ip.rtexpire, rtminexpire en rtmaxcache sysctl parameters. Een aanval met gefingeerde pakketten met een
willekeurig bron-IP zorgt ervoor dat de kernel een tijdelijke gecachede route maakt
in de routetabel, die uitgelezen kan worden met netstat -rna
| fgrep W3. Deze routes hebben een levensduur van ongeveer 1600 seconden.
Als de kernel merkt dat de gecachede routetabel te groot is geworden, dan wordt
rtexpire dynamisch verkleind, maar deze waarde
wordt nooit lager dan rtminexpire. Er zijn twee
problemen:
De kernel reageert niet snel genoeg als een laag belaste server wordt aangevallen.
rtminexpire is niet laag genoeg om de kernel de
aanval te laten overleven.
Als servers verbonden zijn met het Internet via een E3 of sneller, dan is het
verstandig om handmatig rtexpire en rtminexpire aan te passen via sysctl(8). Als de een
van de parameters op nul wordt gezet, dan crasht de machine. Het instellen van
beide waarden op 2 seconden is voldoende om de routetabel tegen een aanval te
beschermen.
Er zijn een aantal aandachtspunten die in acht genomen moeten worden als Kerberos
of ssh gebruikt worden. Kerberos 5 is een prima autenticatieprotocol, maar er zitten
bugs in de Kerberos-versies van telnet en rlogin waardoor ze niet geschikt zijn voor binair verkeer.
Kerberos codeert standaard de sessie niet, tenzij de optie -x wordt gebruikt. ssh codeert
standaard wel alles.
Ssh werkt prima, maar het stuurt coderingssleutels standaard door. Dit betekent dat als gegeven een veilig werkstation met sleutels die toegang geven tot de rest van het systeem en ssh wordt gebruikt om verbinding te maken met een onveilige machine, die sleutels gebruikt kunnen worden. De sleutels zelf zijn niet bekend, maar ssh stelt een doorstuurpoort in zolang als een gebruikers aangemeld blijft. Als de aanvaller roottoegang heeft op de onveilige machine, dan kan hij die poort gebruiken om toegang te krijgen tot alle machines waar de sleutels van de gebruiker toegang toe geven.
Het advies is ssh in combinatie met Kerberos te gebruiken voor het aanmelden door medewerkers wanneer dat ook maar mogelijk is. Ssh kan gecompileerd worden met Kerberos-ondersteuning. Dit vermindert de kans op blootstelling van ssh-sleutels en beschermt tegelijkertijd de wachtwoorden met Kerberos. Ssh-sleutels zouden alleen gebruikt moeten worden voor geautomatiseerde taken vanaf veilige machines (iets waar Kerberos ongeschikt voor is). Het advies is om het doorsturen van sleutels uit te schakelen in de ssh-instellingen of om de from=IP/DOMAIN optie te gebruiken die ssh in staat stelt het bestand authorized_keys te gebruiken om de sleutel alleen bruikbaar te maken voor entiteiten die zich aanmelden vanaf vooraf aangewezen machines.
Iedere gebruiker op een UNIX systeem heeft een wachtwoord bij zijn account. Het lijkt voor de hand liggend dat deze wachtwoorden alleen bekend horen te zijn bij de gebruiker en het eigenlijke besturingssysteem. Om deze wachtwoorden geheim te houden, zijn ze gecodeerd in een “eenweg hash” (“one-way hash”), wat betekent dat ze eenvoudig gecodeerd kunnen worden maar niet gedecodeerd. Met andere woorden, wat net gesteld werd is helemaal niet waar: het besturingssysteem kent het echte wachtwoord niet. De enige manier om een wachtwoord in “platte tekst” te verkrijgen, is door er met brute kracht naar te zoeken in alle mogelijke wachtwoorden.
Helaas was DES, de Data Encryption Standard, de enige manier om wachtwoorden veilig te coderen toen UNIX ontstond. Dit was geen probleem voor gebruikers in de VS, maar omdat de broncode van DES niet geëxporteerd mocht worden moest FreeBSD een manier vinden om zowel te gehoorzamen aan de wetten van de Verenigde Staten als aansluiting te houden bij alle andere varianten van UNIX die nog steeds DES gebruikten.
De oplossing werd gevonden in het splitsen van de coderingsbibliotheken zodat gebruikers in de Verenigde Staten de DES-bibliotheken konden installeren en gebruiken en internationale gebruikers een coderingsmethode konden gebruiken die geëxporteerd mocht worden. Zo is het gekomen dat FreeBSD MD5 is gaan gebruiken als coderingsmethode. Van MD5 wordt aangenomen dat het veiliger is dan DES, dus de mogelijkheid om DES te installeren is vooral beschikbaar om aansluiting te kunnen houden.
Op dit moment ondersteunt de bibliotheek DES, MD5 en Blowfish hashfuncties. Standaard gebruikt FreeBSD MD5 om wachtwoorden te coderen.
Het is vrij makkelijk om uit te vinden welke coderingsmethode FreeBSD op een bepaald moment gebruikt. De gecodeerde wachtwoorden in /etc/master.passwd bekijken is een manier. Wachtwoorden die gecodeerd zijn met MD5 zijn langer dan wanneer ze gecodeerd zijn met DES-hash. Daarnaast beginnen ze met de karakters $1$. Wachtwoorden die beginnen met $2a$ zijn gecodeerd met de Blowfish hashfunctie. DES-wachtwoordstrings hebben geen bijzondere kenmerken, maar ze zijn korter dan MD5 wachtwoorden en gecodeerd in een 64-karakter alfabet waar geen $ karakter in zit. Een relatief korte string die niet begint met een dollar teken is dus waarschijnlijk een DES-wachtwoord.
Het wachtwoordformaat voor nieuwe wachtwoorden wordt ingesteld met de passwd_format aanmeldinstelling in /etc/login.conf waar des, md5 of blf mag staan. Zie de login.conf(5) handleiding voor meer informatie over aanmeldinstellingen.
Standaard biedt FreeBSD ondersteuning voor OPIE (Eenmalige Wachtwoorden in Alles - “One-time Passwords In Everything”), wat standaard een MD5-hash gebruikt.
Hier worden drie verschillende soorten wachtwoorden besproken. De eerste is het normale UNIX of Kerberos wachtwoord. Dit heet het “UNIX wachtwoord”. Het tweede type is een eenmalig wachtwoord dat wordt gemaakt met het OPIE-programma opiekey(1) en dat wordt geaccepteerd door opiepasswd(1) en de aanmeldprocedure. Dit heet het “eenmalige wachtwoord”. Het laatste type wachtwoord is het wachtwoord dat wordt opgegeven aan het programma opiekey (en soms aan het programma opiepasswd) dat gebruikt wordt om eenmalige wachtwoorden te maken. Dit type heet “geheim wachtwoord” of gewoon een “wachtwoord” zonder toevoeging.
Het geheime wachtwoord heeft niets te maken met het UNIX wachtwoord; ze kunnen hetzelfde zijn, dat wordt afgeraden. OPIE geheime wachtwoorden kennen niet de beperking van 8 karakters zoals de oude UNIX wachtwoorden. [8] Ze mogen onbeperkt lang zijn. Wachtwoorden van een zes of zeven woorden lange zin zijn niet ongewoon. Voor het overgrote deel werkt het OPIE-systeem volledig onafhankelijk van het UNIX wachtwoordsysteem.
Buiten het wachtwoord zijn er nog twee stukjes gegevens die van belang zijn voor OPIE. Het eerste wordt “zaad” (“seed”) of “sleutel” (“key”) genoemd en bestaat uit twee letters en vijf cijfers. Het tweede stukje gegevens heet de “iteratieteller”, een nummer tussen 1 en 100. OPIE maakt een eenmalig wachtwoord door het zaad en het geheime wachtwoord aaneen te schakelen en daarop het door de iteratieteller aangegeven keren MD5-hash toe te passen. Daarna wordt het resultaat omgezet in zes korte Engelse woorden. Deze zes woorden zijn een eenmalige wachtwoord. Het autenticatiesysteem (hoofdzakelijk PAM) houdt bij welk eenmalig wachtwoord het laatst is gebruikt en de gebruiker wordt geautenticeerd als de hash van het door de gebruiker ingegeven wachtwoord gelijk is aan het vorige wachtwoord. Omdat er een eenweg hash wordt gebruikt, is het onmogelijk om toekomstige eenmalige wachtwoorden te maken als iemand toch een eenmalig wachtwoord heeft afgevangen. De iteratieteller wordt verlaagd na iedere succesvolle aanmelding om de gebruiker en het aanmeldprogramma synchroon te houden. Als de iteratieteller op 1 staat, moet OPIE opnieuw ingesteld worden.
Er zijn enkele programma's bij ieder systeem betrokken die hieronder worden besproken. Het programma opiekey heeft een iteratieteller, zaad en een geheim wachtwoord nodig en maakt dan een eenmalig wachtwoord of een lijst van opeenvolgende eenmalige wachtwoorden. Het programma opiepasswd wordt gebruikt om OPIE te initialiseren en om wachtwoorden, iteratietellers en zaad te wijzigen. Het accepteert zowel wachtwoordzinnen als een iteratieteller, zaad en een eenmalig wachtwoord. Het programma opieinfo bekijkt de relevante bestanden waarin de eigenschappen staan (/etc/opiekeys) en toont de huidige iteratieteller en zaad van de gebruiker die het commando uitvoert.
Nu worden vier verschillende acties besproken. Bij de eerste wordt opiepasswd gebruikt in een beveiligde verbinding om voor het eerst eenmalige wachtwoorden in te stellen of om een wachtwoord of zaad aan te passen. Bij de tweede wordt opiepasswd gebruikt over een onbeveiligde verbinding samen met opiekey over een beveiligde verbinding om hetzelfde te bereiken. In een derde scenario wordt opiekey gebruikt om aan te melden over een onveilige verbinding. Het vierde scenario behandelt het gebruik van opiekey om een aantal sleutels aan te maken die opgeschreven of afgedrukt kunnen worden, zodat ze meegenomen kunnen worden naar een plaats van waar geen enkele veilige verbinding opgezet kan worden.
Gebruik het commando opiepasswd om OPIE voor de eerste keer te initialiseren:
% opiepasswd -c [grimreaper] ~ $ opiepasswd -f -c Adding unfurl: Only use this method from the console; NEVER from remote. If you are using telnet, xterm, or a dial-in, type ^C now or exit with no password. Then run opiepasswd without the -c parameter. Using MD5 to compute responses. Enter new secret pass phrase: Again new secret pass phrase: ID unfurl OTP key is 499 to4268 MOS MALL GOAT ARM AVID COED
Als Enter new secret pass phrase: of Enter secret password: op het scherm verschijnt, dient een wachtwoord of wachtwoordzin ingevoerd te worden. Dit is dus niet het aanmeldwachtwoord is, maar dit wordt gebruikt om eenmalige wachtwoorden te maken. De “ID” regel geeft de parameters van het verzoek weer: de aanmeldnaam, de iteratieteller en zaad. Bij het aanmelden kent het systeem deze parameters en worden deze weergegeven zodat ze niet onthouden hoeven te worden. Op de laatste regel staat het eenmalige wachtwoord dat overeenkomt met die parameters en het geheime wachtwoord. Als de gebruiker direct opnieuw zou aanmelden, zou hij dat eenmalige wachtwoord moeten gebruiken.
Om een wachtwoord te initialiseren of te wijzigen over een onveilige verbinding, moet er al ergens een veilige verbinding bestaan waar de gebruiker opiekey kan uitvoeren. Dit kan een shellprompt zijn op een machine die vertrouwd wordt. De gebruiker moet ook een iteratieteller verzinnen (100 is wellicht een prima getal) en een eigen zaad bedenken of er een laten fabriceren. Over de onveilige verbinding (naar de machine die de gebruiker wil initialiseren) wordt het commando opiepasswd gebruikt:
% opiepasswd Updating unfurl: You need the response from an OTP generator. Old secret pass phrase: otp-md5 498 to4268 ext Response: GAME GAG WELT OUT DOWN CHAT New secret pass phrase: otp-md5 499 to4269 Response: LINE PAP MILK NELL BUOY TROY ID mark OTP key is 499 gr4269 LINE PAP MILK NELL BUOY TROY
Druk op Return om het standaardzaad te accepteren. Voor een toegangswachtwoord wordt ingevoerd, dient eerst gewisseld te worden naar de veilige verbinding en dienen dezelfde parameters ingegeven te worden:
% opiekey 498 to4268 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: GAME GAG WELT OUT DOWN CHAT
In de onveilige verbinding wordt nu het eenmalige wachtwoord in het relevante programma gekopieerd.
Als OPIE eenmaal is ingesteld staat er bij het aanmelden iets als het volgende:
% telnet example.com Trying 10.0.0.1... Connected to example.com Escape character is '^]'. FreeBSD/i386 (example.com) (ttypa) login: <gebruikersnaam> otp-md5 498 gr4269 ext Password:
NB: de OPIE-prompt heeft een handige optie (die hier niet te zien is): als er op Return wordt gedrukt bij de wachtwoordregel, wordt de echo aangezet, zodat de invoer zichtbaar is. Dit is erg handig als er met de hand een wachtwoord wordt ingegeven, zoals wanneer het wordt ingevoerd vanaf een afdruk.
Nu moet het eenmalige wachtwoord gemaakt worden om het aanmeldprompt mee te antwoorden. Dit moet gedaan worden op een vertrouwd systeem waarop opiekey beschikbaar is. Er zijn ook versies voor MS-DOS, Windows en Mac OS. Voor het commando moet zowel de iteratieteller als het zaad ingeven worden op de commandoregel. Deze kan zo overgenomen worden vanaf het aanmeldprompt op de machine waarop de gebruiker zich wil aanmelden.
Op het vertrouwde systeem:
% opiekey 498 to4268 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: GAME GAG WELT OUT DOWN CHAT
Nu het eenmalige wachtwoord er is, kan het aanmelden doorgang vinden.
Soms moet een gebruiker ergens naar toe gaan waar er geen toegang is tot een vertrouwde machine of een beveiligde verbinding. In dat geval is het mogelijk om met het commando opiekey een aantal eenmalige wachtwoorden te maken om uit te printen en mee te nemen:
% opiekey -n 5 30 zz99999 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: <geheim wachtwoord> 26: JOAN BORE FOSS DES NAY QUIT 27: LATE BIAS SLAY FOLK MUCH TRIG 28: SALT TIN ANTI LOON NEAL USE 29: RIO ODIN GO BYE FURY TIC 30: GREW JIVE SAN GIRD BOIL PHI
Met -n 5 worden vijf opeenvolgende sleutels
aangevraagd, 30 geeft aan wat het laatste iteratiegetal
moet zijn. Deze wachtwoorden worden weergegeven in omgekeerde volgorde voor gebruik. Als de gebruiker echt
paranoïde bent kan hij ze opschrijven of hij kan er ook voor kiezen ze af te
drukken met lpr. Op iedere regel staat dus de
iteratieteller en het eenmalige wachtwoord, maar misschien is het toch handig
om ze na gebruik af te strepen.
Met OPIE kan paal en perk gesteld worden aan het gebruik van UNIX wachtwoorden op basis van het IP-adres van een aanmeldsessie. Dat kan met het bestand /etc/opieaccess dat standaard aanwezig is. Bij opieaccess(5) staat meer informatie over dit bestand en welke beveiligingsoverwegingen bestaan bij het gebruik.
Hieronder een voorbeeld voor een opieaccess bestand:
permit 192.168.0.0 255.255.0.0
In deze regel (permit Internet) staat dat gebruikers met een bron IP adres (wat gefingeerd kan worden) dat past binnen de aangegeven waarde en masker altijd UNIX wachtwoorden mogen gebruiken.
Als geen van de regels uit opieaccess van toepassing is, worden standaard pogingen zonder OPIE geweigerd.
Iedereen die bekend is met inetd(8) heeft waarschijnlijk wel eens van TCP Wrappers gehoord. Maar slechts weinigen lijken volledig te begrijpen hoe ze in een netwerkomgeving toegepast kunnen worden. Het schijnt dat iedereen een firewall wil hebben om netwerkverbindingen af te handelen. Ondanks dat een firewall veel kan, zijn er toch dingen die het niet kan, zoals tekst terugsturen naar de bron van een verbinding. De TCP Wrappers software kan dat en nog veel meer. In dit onderdeel worden de mogelijkheden van TCP Wrappers besproken en, waar dat van toepassing is, worden ook voorbeelden voor implementatie gegeven.
De TCP Wrappers software vergroot de mogelijkheden van inetd door de mogelijkheid al zijn serverdaemons te controleren. Met deze methode is het mogelijk om te loggen, berichten te zenden naar verbindingen, een daemon toe te staan alleen interne verbindingen te accepteren, etc. Hoewel een aantal van deze mogelijkheden ook ingesteld kunnen worden met een firewall, geeft deze manier niet alleen een extra laag beveiliging, maar gaat dit ook verder dan wat een firewall kan bieden.
De toegevoegde waarde van TCP Wrappers is niet dat het een goede firewall vervangt. TCP Wrappers kunnen samen met een firewall en andere beveiligingsinstellingen gebruikt worden om een extra laag van beveiliging voor het systeem te bieden.
Omdat dit een uitbreiding is op de instellingen van inetd, wordt aangenomen dat de lezer het onderdeel inetd configuratie heeft gelezen.
Opmerking: Hoewel programma's die onder inetd(8) draaien niet echt “daemons” zijn, heten ze traditioneel wel zo. Deze term wordt hier dus ook gebruikt.
De enige voorwaarde voor het gebruiken van TCP Wrappers in FreeBSD is ervoor te zorgen dat de server inetd gestart wordt vanuit rc.conf
met de optie -Ww; dit is de standaardinstelling. Er
wordt vanuit gegaan dat /etc/hosts.allow juist is
ingesteld, maar als dat niet zo is, dan zal syslogd(8) dat
melden.
Opmerking: In tegenstelling tot bij andere implementaties van TCP Wrappers is het gebruik van hosts.deny niet langer mogelijk. Alle instellingen moeten in /etc/hosts.allow staan.
In de meest eenvoudige instelling worden verbindingen naar daemons toegestaan of geweigerd afhankelijk van de opties in /etc/hosts.allow. De standaardinstelling in FreeBSD is verbindingen toe te staan naar iedere daemon die met inetd is gestart. Na de basisinstelling wordt aangegeven hoe dit gewijzigd kan worden.
De basisinstelling heeft meestal de vorm daemon : adres : actie. daemon is de daemonnaam die inetd heeft gestart. Het adres kan een geldige hostnaam, een IP-adres of een IPv6-adres tussen blokhaken ([ ]) zijn. Het veld actie kan allow of deny zijn, afhankelijk van of toegang toegestaan of geweigerd moet worden. De instellingen werken zo dat ze worden doorlopen van onder naar boven om te kijken welke regel als eerste van toepassing is. Als een regel van toepassing is gevonden, dan stop het zoekproces.
Er zijn nog andere mogelijkheden, maar die worden elders toegelicht. Een eenvoudige instelling kan al van met deze informatie worden gemaakt. Om bijvoorbeeld POP3 verbindingen toe te staan via de mail/qpopper daemon, zouden de volgende instellingen moeten worden toegevoegd aan hosts.allow:
# Deze regel is nodig voor POP3-verbindingen qpopper : ALL : allow
Nadat deze regel is toegevoegd moet inetd herstart
worden. Dit gaat met het commando kill(1) of met de
parameter restart met /etc/rc.d/inetd.
TCP Wrappers hebben ook gevorderde instellingen. Daarmee komt meer controle over de wijze waarop er met verbindingen wordt omgegaan. Soms is het een goed idee om commentaar te sturen naar bepaalde hosts of daemonverbindingen. In andere gevallen moet misschien iets in een logboekbestand geschreven worden of een email naar de beheerder gestuurd worden. Dit kan allemaal met instellingen die wildcards, uitbreidingskarakters (expansion characters) en het uitvoeren van externe commando's heten. De volgende twee paragrafen beschrijven deze mogelijkheden.
Stel dat zich de situatie voordoet waar een verbinding geweigerd moet worden,
maar er een reden gestuurd moet worden naar het individu dat die verbinding
probeerde op te zetten. Hoe gaat dat? Dat is mogelijk door gebruik te maken
van de optie twist. Als er een poging tot verbinding
wordt gedaan, wordt er met twist een shellcommando of
script uitgevoerd. Er staat al een voorbeeld in hosts.allow:
# De andere daemons zijn beschermd. ALL : ALL \ : severity auth.info \ : twist /bin/echo "You are not welcome to use %d from %h."
Dit voorbeeld geeft aan dat het bericht “You are not allowed to use daemon from hostname.” wordt teruggestuurd voor iedere daemon die niet al is ingesteld in het toegangsbestand. Het is erg handig om een antwoord terug te sturen naar degene die een verbinding op heeft willen zetten meteen nadat een tot stand gekomen verbinding is verbroken. Let wel dat alle berichten die gezonden worden moeten staan tussen " karakters. Hier zijn geen uitzonderingen op.
Waarschuwing Het is mogelijk een ontzegging van dienst aanval uit te voeren op de server als een aanvaller, of een groep aanvallers, deze daemons kan overstromen met verzoeken om verbindingen te maken.
Het is ook mogelijk hier de optie spawn te
gebruiken. Net als twist weigert de optie spawn impliciet de verbinding en kan het gebruikt worden om
shellcommando's of scripts uit te voeren. Anders dan bij twist stuurt spawn geen bericht
aan degene die de verbinding wilde maken. Zie bijvoorbeeld de volgende
instelling:
# Geen verbindingen van example.com: ALL : .example.com \ : spawn (/bin/echo %a from %h attempted to access %d >> \ /var/log/connections.log) \ : deny
Hiermee worden alle verbindingen van het domein *.example.com geweigerd. Tegelijkertijd worden ook hostnaam, IP adres en de daemon waarmee verbinding werd gemaakt naar /var/log/connections.log geschreven.
Naast de vervangingskarakters die al zijn toegelicht, zoals %a, bestaan er nog een paar andere. In de handleiding van hosts_access(5) staat een volledige lijst.
Tot nu toe is in ieder voorbeeld ALL gebruikt. Er bestaan nog andere opties waarmee de mogelijkheden nog verder gaan. Zo kan ALL gebruikt worden om van toepassing te zijn op iedere instantie van een daemon, domein of een IP adres. Een andere wildcard die gebruikt kan worden is PARANOID. Daarmee wordt iedere host die een IP-adres geeft dat gefingeerd kan zijn aangeduid. Met andere woorden: PARANOID kan gebruikt worden om een actie aan te geven als er een IP-adres gebruikt wordt dat verschilt van de hostnaam. Het volgende voorbeeld kan wat verheldering brengen:
# Weiger mogelijke gespoofte verzoeken aan sendmail: sendmail : PARANOID : deny
In het voorgaande voorbeeld worden alle verbindingsverzoeken aan sendmail met een IP-adres dat verschilt van de hostnaam geweigerd.
Let opHet gebruik van de wildcard PARANOID kan nogal wat schade aanrichten als de cliënt of de server kapotte DNS-instellingen heeft. Voorzichtigheid van de beheerder is geboden.
De handleiding van hosts_access(5) geeft meer uitleg over wildcards en de mogelijkheden die ze bieden.
Voordat de bovenstaande instellingen werken, dient de eerste regels in hosts.allow als commentaar gemarkeerd te worden.
Kerberos is een netwerkdienst, protocol en systeem waarmee gebruikers zich kunnen aanmelden met behulp van een dienst op een veilige server. Diensten als op een andere server aanmelden, op afstand kopiëren, veilig tussen systemen kopiëren en andere taken met een hoog risico worden aanmerkelijk veiliger en beter controleerbaar.
Kerberos kan omschrijven worden als identiteitbevestigend proxy systeem. Het kan ook omschreven worden als een vertrouwd autenticatiesysteem van een derde partij. Kerberos vervult maar één taak: het veilig autenticeren van gebruikers op het netwerk. Het vervult geen autorisatietaken (wat gebruikers mogen) en controleert ook niets (wat gebruikers hebben gedaan). Nadat een cliënt en server Kerberos hebben gebruikt om hun identiteit vast te stellen kunnen ze ook al hun communicatie coderen om hun privacy en gegevensintegriteit te garanderen.
Daarom wordt het sterk aangeraden om Kerberos samen met andere beveiligingsmechanismen te gebruiken die autorisatie en controlemogelijkheden bieden.
De aanwijzingen die nu volgen kunnen gebruikt worden als werkinstructie om Kerberos in te stellen zoals dat wordt meegeleverd met FreeBSD. Een complete beschrijving staat in de handleiding.
Voor demonstratie van de installatie van Kerberos wordt gebruik gemaakt van de volgende naamgeving:
Het DNS domein (“zone”) is example.org.
De Kerberos wereld is EXAMPLE.ORG.
Opmerking: Het advies is voor installaties van Kerberos echte domeinnamen te gebruiken, zelfs als het alleen intern wordt gebruikt. Hiermee worden DNS problemen voorkomen is een goede samenwerking met andere Kerberos werelden verzekerd.
Kerberos is ontworpen door MIT als oplossing voor netwerkbeveiligingsproblemen. Het Kerberos protocol gebruikt sterke codering zodat een cliënt zijn identiteit kan bewijzen aan een server (en andersom) over een onveilige netwerkverbinding.
Kerberos is zowel de naam van een netwerkautorisatieprotocol als een bijvoeglijk naamwoord om de programma's te beschrijven die gebruik maken van het programma (zoals Kerberos telnet). De huidige versie van het protocol is versie 5 en is beschreven in RFC 1510.
Er zijn een aantal vrij beschikbare implementaties van dit protocol beschikbaar voor veel systemen. Het Massachusetts Institute of Technology (MIT), waar Kerberos ooit is ontwikkeld, ontwikkelt nog steeds door aan hun Kerberos pakket. Het wordt in de VS veel gebruikt als coderingspakket en daarom wordt het ook geraakt door de exportwetgeving van de VS. Kerberos van MIT is beschikbaar als port (security/krb5). Heimdal Kerberos is een andere implementatie van versie 5 die expliciet buiten de VS is ontwikkeld om de exportwetgeving de omzeilen (en wordt daarom vaak gebruikt in niet-commerciële UNIX varianten). De Heimdal Kerberos distributie is beschikbaar als port (security/heimdal) en er zit een minimale installatie in de basisinstallatie van FreeBSD.
Om het grootst mogelijke publiek te bereiken gaan deze instructies ervan uit dat de Heimdal distributie die bij FreeBSD zit wordt gebruikt.
Het Sleutel Distributie Centrum (KDC, voluit “Key Distribution Center”) is de gecentraliseerde autenticatiedienst die Kerberos levert. Het is de computer die Kerberos tickets uitgeeft. Het KDC wordt “vertrouwd” door alle andere computer in de Kerberos wereld en daarom dient er een strenger beveiligingsregime op van kracht te zijn.
Hoewel het draaien van de Kerberos dienst erg weinig van een systeem vraagt, wordt het wel aangeraden om een machine in te richten exclusief voor het KDC om beveiligingsredenen.
Het opzetten van een KDC begint met de controle of de instellingen in /etc/rc.conf juist zijn om te functioneren als KDC (misschien moeten paden veranderd worden voor een eigen systeem):
kerberos5_server_enable="YES" kadmind5_server_enable="YES"
Daarna wordt het Kerberos-instellingenbestand /etc/krb5.conf aangemaakt:
[libdefaults]
default_realm = EXAMPLE.ORG
[realms]
EXAMPLE.ORG = {
kdc = kerberos.example.org
admin_server = kerberos.example.org
}
[domain_realm]
.example.org = EXAMPLE.ORG
/etc/krb5.conf gaat ervan uit dat de KDC de volledig gekwalificeerde hostnaam kerberos.example.org heeft. Als de KDC een andere hostnaam heeft, moet er nog een CNAME (alias) toegevoegd aan de zonefile.
Opmerking: Voor grotere netwerken met een juist ingestelde BIND DNS server kan het bovenstaande voorbeeld ingekort worden tot:
[libdefaults] default_realm = EXAMPLE.ORGDoor de volgende regels toe te voegen aan het zonebestand voor example.org:
_kerberos._udp IN SRV 01 00 88 kerberos.example.org. _kerberos._tcp IN SRV 01 00 88 kerberos.example.org. _kpasswd._udp IN SRV 01 00 464 kerberos.example.org. _kerberos-adm._tcp IN SRV 01 00 749 kerberos.example.org. _kerberos IN TXT EXAMPLE.ORG
Opmerking: Om cliënten de Kerberos-diensten te kunnen laten vinden, moet er een volledig ingestelde /etc/krb5.conf zijn of een minimaal ingestelde /etc/krb5.conf en een correct ingestelde DNS-server.
Nu wordt de Kerberos database aangemaakt. Deze database bevat de sleutels voor alle principals en zijn versleuteld met een hoofdwachtwoord. Dit wachtwoord hoeft niet onthouden te worden omdat het wordt opgeslagen in (/var/heimdal/m-key). De hoofdsleutel wordt aangemaakt door kstash te starten en een wachtwoord in te voeren.
Als de hoofdsleutel is gemaakt, kan de database ingeschakeld worden met kadmin met de optie -l (die staat voor “local”). Deze optie geeft kadmin de opdracht om de databasebestanden direct te wijzigingen in plaats van via de kadmind netwerkdienst. Hiermee wordt het kip-ei-probleem opgelost waarbij een verbinding wordt gemaakt met de database voordat hij bestaat. Op het prompt van kadmin kan met init de database met de werelden aangemaakt worden.
Tenslotte, nog steeds in kadmin, kan de eerste principal gemaakt worden met add. De standaardopties voor de principal worden nu aangehouden. Deze kunnen later altijd nog gewijzigd worden met modify. Met het commando ? kunnen alle beschikbare mogelijkheden getoond worden.
Hieronder een sessie waarin een voorbeelddatabase wordt aangemaakt:
# kstash Master key: xxxxxxxx Verifying password - Master key: xxxxxxxx # kadmin -l kadmin> init EXAMPLE.ORG Realm max ticket life [unlimited]: kadmin> add tillman Max ticket life [unlimited]: Max renewable life [unlimited]: Attributes []: Password: xxxxxxxx Verifying password - Password: xxxxxxxx
Nu kan de KDC dienst gestart worden met /etc/rc.d/kerberos start en /etc/rc.d/kadmind start. Op dit moment draait er nog geen enkele daemon die gebruik maakt van Kerberos. Bevestiging dat KDC draait is te krijgen door een ticket te vragen en dat uit te lezen voor de principal (gebruiker) die zojuist is aangemaakt vanaf de commandoregel van het KDC zelf:
% kinit tillman tillman@EXAMPLE.ORG's Password: % klist Credentials cache: FILE:/tmp/krb5cc_500 Principal: tillman@EXAMPLE.ORG Issued Expires Principal Aug 27 15:37:58 Aug 28 01:37:58 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG
Het ticket kan worden ingenomen wanneer u klaar bent:
% kdestroy
Als eerste is een kopie van het instellingenbestand van Kerberos nodig, /etc/krb5.conf. Dit bestand kan eenvoudigweg op een veilige manier (met netwerkprogramma's als scp(1), of fysiek via een floppy) naar de cliëntcomputer gekopieerd worden vanaf de KDC.
Hierna is het /etc/krb5.keytab nodig. Dit is het belangrijkste verschil tussen een server die een daemons met Kerberos aanbiedt en een werkstation: de server heeft het bestand keytab nodig. Dit bestand bevat de hostsleutel van de server waardoor het werkstation en de KDC elkaars identiteit kunnen bevestigen. Dit bestand dient veilig overgebracht te worden omdat de beveiliging van de server doorbroken kan worden als de sleutel openbaar wordt gemaakt. Dit betekent expliciet dat overdracht via een protocol dat platte tekst gebruikt, bijvoorbeeld FTP, een slecht idee is.
Meestal wordt keytab naar de server gebracht met kadmin. Dat werkt handig omdat ook de host principal (het KDC onderdeel van krb5.keytab) aangemaakt moet worden met kadmin.
Let wel op dat er al een ticket moet zijn en dat dit ticket de kadmin interface moet mogen gebruiken in kadmind.acl. Zie “Beheer op Afstand” in de Heimdal informatiepagina's (info heimdal) voor details over het ontwerpen van toegangscontrole. Als kadmin via het netwerk geen toegang mag hebben, dan kan ook op een veilige verbinding gemaakt worden met de KDC (via het lokale console, ssh(1) of Kerberos telnet(1)) zodat alles lokaal uitgevoerd kan worden met kadmin -l.
Na het installeren van /etc/krb5.conf kan kadmin van de Kerberos server gebruikt worden. Met add --random-key kan de host principal toegevoegd worden en met ext kan de host principal van de server naar zijn eigen keytab getrokken worden. Bijvoorbeeld:
# kadmin kadmin> add --random-key host/myserver.example.org Max ticket life [unlimited]: Max renewable life [unlimited]: Attributes []: kadmin> ext host/myserver.example.org kadmin> exit
Let op: ext slaat de sleutel standaard op in /etc/krb5.keytab.
Als kadmind niet beschikbaar is op de KDC (wellicht om beveiligingsredenen) en er via het netwerk dus geen toegang is tot kadmin, dan kan de host principal (host/myserver.EXAMPLE.ORG) ook direct aan de KDC toegevoegd worden en daarna in een tijdelijk bestand gezet worden. Het volgende kan gebruikt worden om te voorkomen dat /etc/krb5.keytab op de KDC) wordt overschreven:
# kadmin kadmin> ext --keytab=/tmp/example.keytab host/myserver.example.org kadmin> exit
Hierna kan de keytab veilig gekopieerd worden naar de server (met scp of een floppy). Geef een niet-standaard naam op voor de keytab om te voorkomen dat de keytab op de KDC wordt overschreven.
Nu kan de server communiceren met de KDC (vanweg krb5.conf) en zijn identiteit bewijzen (vanwege krb5.keytab). Nu is de server klaar om er een aantal Kerberos diensten op te activeren. In dit voorbeeld wordt de dienst telnet geactiveerd door de volgende regel in /etc/inetd.conf te zetten en dan inetd(8) te herstarten met /etc/rc.d/inetd restart:
telnet stream tcp nowait root /usr/libexec/telnetd telnetd -a user
Het belangrijkste is dat de typering -a (van autenticatie) op user staat. Meer details zijn in telnetd(8) te vinden.
Het opzetten van een cliëntcomputer is eigenlijk kinderlijk eenvoudig. Wat betreft de Kerberos instelling is alleen het Kerberos instellingenbestand (/etc/krb5.conf) nodig. Dat kan eenvoudigweg naar de cliëntcomputer gekopieerd worden vanaf de KDC.
Test de cliënt met kinit, klist en kdestroy vanaf de cliënt om een ticket te krijgen, te bekijken en daarna te verwijderen voor de principal die hierboven is aangemaakt. Nu moeten ook Kerberos applicaties gebruikt kunnen worden om verbindingen te maken met servers waarop Kerberos is geactiveerd. Als dat niet lukt en het verkrijgen van een ticket is wel mogelijk, dan ligt dat hoogstwaarschijnlijk aan de server en niet aan de cliënt of de KDC.
Bij het testen van een applicatie als telnet kan het beste een pakketsnuffelaar (bijvoorbeeld tcpdump(1)) gebruikt worden om te bevestigen dat een wachtwoord niet als tekst wordt verzonden. Gebruik telnet met de optie -x. Dan wordt de complete gegevensstroom versleuteld (vergelijkbaar met ssh).
Er worden standaard ook andere Kerberos applicaties op de cliënt geïnstalleerd. Hier komt de “minimalistische” natuur van de basisinstallatie van Heimdal boven drijven: telnet is de enige dienst waarvoor Kerberos geactiveerd is.
De port Heimdal voegt een aantal ontbrekende cliëntapplicaties toe: versies met ondersteuning voor Kerberos van ftp, rsh, rcp, rlogin en een paar minder gebruikelijke programma's. De MIT port bevat ook een volledig gamma aan Kerberos cliëntapplicaties.
Voor gebruikers binnen een wereld wijst hun Kerberos principal (bv. tillman@EXAMPLE.ORG) gewoonlijk naar een lokale gebruikersaccount (bijvoorbeeld een lokale account met de naam tillman). Voor cliëntapplicaties als telnet is gewoonlijk geen gebruikersnaam of principal nodig.
Soms moet iemand zonder bijpassende Kerberos principal toch toegang hebben tot een lokale gebruikersaccount. tillman@EXAMPLE.ORG zou bijvoorbeeld toegang nodig kunnen hebben tot de lokale gebruikersaccount webdevelopers. Andere principals zouden die toegang wellicht ook nodig kunnen hebben.
De bestanden .k5login en .k5users uit de gebruikersmap kunnen op eenzelfde manier gebruikt worden als .hosts en .rhosts. Zo wordt het voorgaande probleem opgelost. Als bijvoorbeeld een .k5login met de volgende inhoud:
tillman@example.org jdoe@example.org
in de thuismap van de lokale gebruiker webdevelopers gezet wordt dan zouden beide principals toegang hebben tot die account zonder dat ze een wachtwoord hoeven te delen.
We raden aan de handleidingen voor deze commando's te lezen. Let op dat de ksu handleiding .k5users behandelt.
Als de Heimdal of MIT Kerberos port wordt gebruikt dan dient de PATH omgevingsvariabele de Kerberos versies van de cliëntapplicaties te tonen voor de systeemversies.
Hebben alle computers in de wereld hun tijd gesynchroniseerd? Als dat niet zo is, dan slaagt de autenticatie wellicht niet. Paragraaf 30.10 beschrijft hoe klokken met NTP gesynchroniseerd kunnen worden.
MIT en Heimdal werken prima samen. Dit geldt niet voor kadmin omdat daarvoor geen protocolstandaard is.
Als een hostnaam wordt gewijzigd, dan moet ook de host/ principal aangepast en de keytab. Dit geldt ook voor bijzondere instellingen in de keytab zoals de www/ principal voor www/mod_auth_kerb van Apache.
Alle hosts in een wereld moeten oplosbaar (resolvable) zijn (zowel vooruit als achteruit) in de DNS (of tenminste in /etc/hosts). CNAMEs werken wel, maar de A en PTR records moeten juist en actief zijn. De foutmelding is niet erg duidelijk: “Kerberos5 refuses authentication because Read req failed: Key table entry not found”.
Sommige besturingssystemen van cliënten voor een KDC zetten wellicht geen setuid root voor ksu. Dit betekent dat ksu niet werkt. Dat is vanuit beveiligingsoogpunt een prima idee, maar wel lastig. Dit is dus geen KDC-fout.
Als met MIT Kerberos een principal een ticket moet krijgen dat langer geldig is dan de standaard van tien uur, dan moet modify_principal in kadmin gebruikt worden om de maximale geldigheidsduur (maxlife) van zowel de principal waar het om gaat als de krbtgt principal aan te passen. Dan kan de principal kinit -l gebruiken om een ticket met een langere levensduur aan te vragen.
Opmerking: Als een pakketsnuffelaar op de KDC draait bij om te helpen bij het oplossen van problemen en dan kinit vanaf een werkstation wordt gestart, dan wordt zichtbaar dat de TGT meteen wordt verstuurd als kinit start, zelfs nog voor het wachtwoord! De reden hiervoor is dat de Kerberos server vrijelijk een TGT (Ticket Granting Ticket) verstuurt op iedere niet geautoriseerd verzoek. Maar iedere TGT is versleuteld met een sleutel die is afgeleid van het wachtwoord van de gebruiker. Als een gebruiker zijn wachtwoord ingeeft, wordt dat dus niet naar de KDC gezonden, maar ontcijfert het de TGT die kinit al heeft ontvangen. Als de ontcijfering resulteert in een geldige ticket met een geldige tijdstempel, dan heeft de gebruiker geldige Kerberos rechten. Deze rechten bevatten ook een sessiesleutel voor het opzetten van beveiligde communicatie met de Kerberos server in de toekomst en de eigenlijke ticket-granting ticket, die is versleuteld met de sleutel van de Kerberos server zelf. Deze tweede laag van versleuteling is niet bekend voor de gebruiker, maar het stelt de Kerberos server in staat om de juistheid van iedere TGT te bevestigen.
Als tickets worden gebruik die lang geldig zijn (bv. een week) en OpenSSH wordt gebruikt om een verbinding te maken met de
machine waarop het ticket staat, zorg er dan voor dat de Kerberos optie TicketCleanup op
no staat in sshd_config want
anders worden tickets verwijderd bij afmelden.
Hostprincipals kunnen ook een langere levensduur hebben. Als een gebruikers principal een levensduur van een week heeft, maar de host waar de verbinding mee gemaakt wordt heeft een levensduur van negen uur, dan heb staat er een verlopen host principal in de cache en dan werkt een en ander niet zoals verwacht.
Een krb5.dict bestand om het gebruik van bepaalde slechte wachtwoorden te voorkomen (dit wordt kort behandeld in de handleiding voor kadmind) heeft alleen betrekking op principals waar een wachtwoordbeleid voor geldt. De opmaak van krb5.dict is eenvoudig: een rij tekens per regel. Een symbolische link maken naar /usr/share/dict/words is misschien handig.
Het belangrijkste verschil tussen de MIT en Heimdal installatie heeft betrekking op kadmin, dat een andere (maar gelijkwaardige) set commando's kent en een andere protocol gebruikt. Dit betekent nogal wat als een KDC MIT is, omdat dan de kadmin van Heimdal niet gebruikt kan worden om de KDC vanaf afstand te beheren (dat geldt trouwens ook vice versa).
De cliëntapplicaties kunnen ook commandoregelopties gebruiken die een beetje verschillen, maar waarmee wel hetzelfde wordt bereikt. We raden aan de instructies op de MIT Kerberos website (http://web.mit.edu/Kerberos/www/) te volgen. Wees voorzichtig met paden: de MIT-port installeert standaard in /usr/local/ en dus kunnen de “normale” systeemapplicaties gestart worden in plaats van die van MIT als de PATH omgevingsvariabele de systeemmappen als eerste weergeeft.
Opmerking: Als de MIT security/krb5 port die bij FreeBSD zit wordt gebruikt, dan zorgt het lezen van /usr/local/share/doc/krb5/README.FreeBSD dat bij de port wordt geïnstalleerd voor een beter begrip over waarom het aanmelden via telnetd en klogind soms wat vreemd verloopt. Als belangrijkste wijzen we erop dat het bij het corrigeren van “onjuiste rechten op het cachebestand” noodzakelijk is dat het binaire bestand login.krb5 wordt gebruikt voor autenticatie zodat het op de juiste wijze eigenaarschap kan wijzigen voor de doorgegeven rechten.
Het bestand rc.conf moet ook gewijzigd worden zodat het de volgende configuratie bevat:
kerberos5_server="/usr/local/sbin/krb5kdc" kadmind5_server="/usr/local/sbin/kadmind" kerberos5_server_enable="YES" kadmind5_server_enable="YES"
Dit is gedaan omdat de applicaties voor MIT-Kerberos binairen in de hiërarchie /usr/local installeren.
Iedere ingeschakelde dienst op het netwerk moet aangepast worden om met Kerberos te werken (of op een andere manier beschermd zijn tegen netwerkaanvallen), want anders kunnen gebruikersrechten worden gestolen en herbruikt. Een voorbeeld hier van is het inschakelen van Kerberos voor alle shells op afstand (via rsh en telnet bijvoorbeeld), maar de POP3 mailserver die wachtwoorden als platte tekst verzend ongemoeid laten.
In een meergebruikersomgeving is Kerberos minder veilig. Dit komt doordat de tickets worden opgeslagen in de map /tmp, waar gelezen kan worden door alle gebruikers. Als een gebruiker een computer deelt met andere gebruikers op hetzelfde moment (dus multi-user), dan is het mogelijk dat een ticket van een gebruiker wordt gestolen (gekopieerd) door een andere gebruiker.
Dit kan voorkomen worden met de commandoregeloptie “-c bestandsnaam” of (bij voorkeur) de omgevingsvariabele KRB5CCNAME, maar dat wordt zelden gedaan. In principe kan het opslaan van een ticket in de thuismap van een gebruiker in combinatie met eenvoudige bestandsrechten dit probleem verhelpen.
Zoals het is ontworpen, moet de KDC zo goed mogelijk beveiligd zijn, omdat de hoofdwachtwoorddatabase erop staat. De KDC hoort geen enkele andere dienst aan te bieden en moet ook fysiek afgeschermd worden. Het gevaar is groot, omdat Kerberos alle wachtwoorden versleutelt met dezelfde sleutel (de “master” sleutel) die als een bestand op de KDC staat.
Toch is een gecompromitteerde mastersleutel niet zo'n groot probleem als wellicht wordt verondersteld. De mastersleutel wordt alleen gebruikt om de Kerberos database te versleutelen en als zaad voor de generator van willekeurige nummers. Zo lang als de toegang tot de KDC is beveiligd, kan een aanvaller niet echt iets doen met de mastersleutel.
Als de KDC niet beschikbaar is (misschien door een ontzeggen van dienst aanval of netwerkproblemen) kunnen de netwerkdiensten niet gebruikt worden omdat er geen autenticatie uitgevoerd kan worden; een recept voor een ontzeggen van dienst aanval. Dit risico kan omzeild worden door meerdere KDC's (één master en één of meer slaven) en een zorgvuldige implementatie van secundaire of fall-back autenticatie. PAM is hier uitermate geschikt voor.
Kerberos stelt gebruikers, hosts en diensten in staat om elkaar te autenticeren. Maar het heeft geen mechanisme om de KDC te autenticeren aan de gebruikers, hosts of diensten. Dit betekent dat bijvoorbeeld een vervalste kinit alle gebruikersnamen en wachtwoorden zou kunnen afluisteren. Iets als security/tripwire of andere controle-instrumenten voor de integriteit van bestandssystemen kunnen hier verlichting brengen.
Een toepassing die bij FreeBSD zit die veel gebruikers over het hoofd zien is OpenSSL. OpenSSL biedt een versleutelde transportlaag bovenop de normale communicatielaag. Daardoor biedt het de mogelijkheid met veel netwerktoepassingen en diensten verweven te raken.
Een aantal toepassingen van OpenSSL zijn versleutelde autenticatie van mailcliënten, webgebaseerde transacties als creditcardbetalingen en nog veel meer. Veel ports zoals www/apache22 en mail/claws-mail bieden tijdens het compileren ondersteuning om OpenSSL in te bouwen.
Opmerking: In de meeste gevallen zal de Portscollectie proberen de port security/openssl te bouwen, tenzij de make variabele WITH_OPENSSL_BASE expliciet naar “yes” is gezet.
De versie van OpenSSL die bij FreeBSD zit ondersteunt Secure Sockets Layer v2/v3 (SSLv2/SSLv3), Transport Layer Security v1 (TLSv1) netwerkbeveiligingsprotocollen en kan gebruikt worden als generieke versleutelingsbibliotheek.
Opmerking: Hoewel OpenSSL ondersteuning biedt voor het IDEA algoritme, is dat standaard uitgeschakeld in verband met patenten in de Verenigde Staten. Om het te gebruiken dient de licentie gelezen te worden en, als de restricties aanvaardbaar zijn, dient de make-variabele MAKE_IDEA ingesteld te worden in make.conf.
Een van de meest gebruikte toepassingen van OpenSSL is het leveren van certificaten voor gebruik met softwaretoepassingen. Deze certificaten verzekeren dat de eigenschappen van een bedrijf of individu geldig zijn en niet vervalst. Als het certificaat in kwestie niet geldig verklaard is door een van de “Certificate Authorities” of CA's, dan komt er een waarschuwing. Een Certificate Authority is een bedrijf, zoals VeriSign, dat certificaten ondertekent zodat de eigenschappen van een bedrijf of individu geldig verklaard kunnen worden. Dit proces kost geld en het is zeker geen voorwaarde voor het gebruik van certificaten. Het stelt wel de meer paranoïde gebruikers gerust.
Voor het maken van certificaten is het volgende commando beschikbaar:
# openssl req -new -nodes -out req.pem -keyout cert.pem Generating a 1024 bit RSA private key ................ ....................................... writing new private key to 'cert.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:PA Locality Name (eg, city) []:Pittsburgh Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Organizational Unit Name (eg, section) []:Systems Administrator Common Name (eg, YOUR name) []:localhost.example.org Email Address []:trhodes@FreeBSD.org Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:SOME PASSWORD An optional company name []:Another Name
Let op dat het antwoord direct na “Common Name” een domeinnaam weergeeft. De prompt wil dat er een servernaam wordt ingegeven voor het verificatieproces. Het plaatsen van iets anders dan een domeinnaam zorgt ervoor dat het certificaat waardeloos wordt. Er zijn ook andere opties als verloopdatum, andere versleutelingsalgoritmes, etc, beschikbaar. Een volledige lijst is na te lezen in de handleiding van openssl(1).
Er horen nu twee bestanden te staan in de map waarin het voorgaande commando is uitgevoerd. Het certificaatverzoek, req.pem, kan naar een certificaat autoriteit gestuurd worden die de bijgevoegde gegevens kan valideren, het verzoek kan tekenen en het certificaat kan retourneren. Het tweede bestand heet cert.pem en is de geheime sleutel voor het certificaat. Deze dient zorgvuldig beschermd te worden. Als de geheime sleutel in de handen van anderen valt kan die gebruikt worden om de identiteit van de eigenaar (of server) aan te nemen.
In gevallen waar ondertekening door een CA niet vereist is, kan een zelfondertekend certificaat gemaakt worden. Maak als eerste de RSA sleutel:
# openssl dsaparam -rand -genkey -out myRSA.key 1024
Hierna kan de CA sleutel gemaakt worden:
# openssl gendsa -des3 -out myca.key myRSA.key
Deze sleutel kan gebruikt worden om een certificaat te maken:
# openssl req -new -x509 -days 365 -key myca.key -out new.crt
Er zouden nu twee bestanden bijgekomen moeten zijn in de map: een certificaatautoriteit ondertekeningsbestand myca.key en new.crt, het certificaat zelf. Deze moeten in een map geplaatst worden, bij voorkeur onder /etc waar alleen root kan lezen. De rechten 0700 zijn hier prima en die kunnen ingesteld worden met chmod.
En wat kunnen deze bestanden? Een prima toepassing zou het versleutelen van verbindingen naar de Sendmail MTA kunnen zijn. Daardoor zouden gebruikers niet langer platte tekst hoeven te autenticeren om mail te sturen via de lokale MTA.
Opmerking: Dit is niet de best denkbare toepassing omdat sommige MUA's de gebruiker een foutmelding geven als ze het certificaat niet lokaal geïnstalleerd hebben. De documentatie bij de software geeft meer informatie over het installeren van certificaten.
De volgende regels moeten opgenomen worden in het lokale .mc bestand:
dnl SSL Options define(`confCACERT_PATH',`/etc/certs')dnl define(`confCACERT',`/etc/certs/new.crt')dnl define(`confSERVER_CERT',`/etc/certs/new.crt')dnl define(`confSERVER_KEY',`/etc/certs/myca.key')dnl define(`confTLS_SRV_OPTIONS', `V')dnl
/etc/certs/ is de map die gebruikt wordt voor het lokaal opslaan van certificaten en sleutels. De laatste voorwaarde het is opnieuw aanmaken van het lokale .cf bestand. Dit gaat door eenvoudigweg make install te typen in de map /etc/mail. Laat dat volgen door make install waardoor de daemon Sendmail herstart zou moeten worden.
Als alles goed is gegaan, dan staan er geen foutmeldingen /var/log/maillog en is Sendmail zichtbaar in de proceslijst.
Maak als eenvoudige test een verbinding met de mailserver met telnet(1):
# telnet example.com 25 Trying 192.0.34.166... Connected to example.com. Escape character is '^]'. 220 example.com ESMTP Sendmail 8.12.10/8.12.10; Tue, 31 Aug 2004 03:41:22 -0400 (EDT) ehlo example.com 250-example.com Hello example.com [192.0.34.166], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 250-DSN 250-ETRN 250-AUTH LOGIN PLAIN 250-STARTTLS 250-DELIVERBY 250 HELP quit 221 2.0.0 example.com closing connection Connection closed by foreign host.
Als de regel “STARTTLS” verschijnt in de uitvoer dan werkt alles correct.
Een VPN opzetten met FreeBSD gateways tussen twee netwerken die gescheiden zijn door Internet.
Deze paragraaf is een gids in het proces van het opzetten van IPsec. Voordat IPsec opgezet kan worden dient de lezer bekend te zijn met de concepten die nodig zijn om een aangepaste kernel te bouwen (zie Hoofdstuk 9).
IPsec is een protocol dat bovenop de Internet Protocol (IP) laag ligt. Hiermee kunnen twee of meer host op een veilige manier communiceren (vandaar de naam). De FreeBSD IPsec “netwerk wachtrij (stack)” is gebaseerd op de KAME-implementatie, die zowel de protocolfamilies IPv4 als de IPv6 ondersteunt.
IPsec bestaat uit twee subprotocollen:
Encapsulated Security Payload (ESP) beschermt de IP-pakketdata tegen inmenging door een derde partij door de inhoud te versleutelen met symmetrische versleutelingsalgoritmes (zoals Blowfish en 3DES).
Authentication Header (AH) beschermt de IP-pakketkop tegen inmenging door een derde partij en spoofing door een cryptografische checksum te berekenen en de IP-pakketkopvelden te hashen met een veilige hashfunctie. Hierna wordt een extra kop ingevoegd die de hash bevat zodat de informatie in het pakket geautenticeerd kan worden.
ESP en AH kunnen samen of apart gebruikt worden, afhankelijk van de omgeving.
IPsec kan gebruikt worden om het verkeer tussen twee hosts direct te versleutelen (dat heet Transport Mode) of door “virtuele tunnels” te bouwen tussen twee subnetten die gebruikt kunnen worden voor veilige communicatie tussen twee bedrijfsnetwerken (dat heet Tunnel Mode). De laatste versie staat beter bekend als Virtual Private Network (VPN). In ipsec(4) staat gedetailleerde informatie over het IPsec subsysteem in FreeBSD.
Voor ondersteuning voor IPsec in de kernel zijn de volgende opties nodig in het kernelinstellingenbestand:
options IPSEC #IP-beveiliging device crypto
Als er ook fouten in IPsec (debugging) verwijderd moeten kunnen worden, dan is de volgende optie ook nodig:
options IPSEC_DEBUG #debug voor IP-beveiliging
Er bestaat geen standaard voor wat een VPN is. VPN's kunnen opgezet worden met behulp van een aantal verschillende technologieën die allemaal hun eigen voor- en nadelen hebben. Dit onderdeel bevat een scenario en de strategieën die gebruikt kunnen worden voor het implementeren van een VPN in iedere situatie.
Dit is het uitgangspunt:
Er zijn tenminste twee locaties
Beide locaties gebruiken IP
Beide locaties hebben een Internetverbinding via een gateway waarop FreeBSD draait.
De gateway op ieder netwerk heeft tenminste één publiek IP-adres.
De interne adressen van de twee netwerken mogen publieke of private IP-adressen zijn, dat maakt niet uit. Ze mogen alleen niet botsen; bijvoorbeeld: ze mogen niet beide 192.168.1.x gebruiken.
Om te beginnen moet de port security/ipsec-tools geïnstalleerd zijn vanuit de Portscollectie. Dit softwarepakket van een derde partij biedt een aantal applicaties die helpen de configuratie te ondersteunen.
De volgende benodigdheid is om twee gif(4) pseudo-apparaten aan te maken om de pakketten te tunnelen en beide netwerken in staat stellen om op een juiste wijze te communiceren. Draai als root de volgende commando's, waarbij de items intern en extern met de echte interne en externe gateways:
# ifconfig gif0 create
# ifconfig gif0 intern1 intern2
# ifconfig gif0 tunnel extern1 extern2
Het publieke IP van het LAN van de onderneming is bijvoorbeeld 172.16.5.4 en het heeft een privaat IP 10.246.38.1. Het publieke IP van het LAN van huis is 192.168.1.12 met een intern privaat IP 10.0.0.5.
Dit kan verwarrend lijken, dus bekijk de volgende voorbeeld van het commando ifconfig(8):
Gateway 1: gif0: flags=8051 mtu 1280 tunnel inet 172.16.5.4 --> 192.168.1.12 inet6 fe80::2e0:81ff:fe02:5881%gif0 prefixlen 64 scopeid 0x6 inet 10.246.38.1 --> 10.0.0.5 netmask 0xffffff00 Gateway 2: gif0: flags=8051 mtu 1280 tunnel inet 192.168.1.12 --> 172.16.5.4 inet 10.0.0.5 --> 10.246.38.1 netmask 0xffffff00 inet6 fe80::250:bfff:fe3a:c1f%gif0 prefixlen 64 scopeid 0x4
Eenmaal compleet zouden beide private IP's bereikbaar moeten zijn met het commando ping(8) zoals de volgende uitvoer suggereert:
priv-net# ping 10.0.0.5 PING 10.0.0.5 (10.0.0.5): 56 data bytes 64 bytes from 10.0.0.5: icmp_seq=0 ttl=64 time=42.786 ms 64 bytes from 10.0.0.5: icmp_seq=1 ttl=64 time=19.255 ms 64 bytes from 10.0.0.5: icmp_seq=2 ttl=64 time=20.440 ms 64 bytes from 10.0.0.5: icmp_seq=3 ttl=64 time=21.036 ms --- 10.0.0.5 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max/stddev = 19.255/25.879/42.786/9.782 ms corp-net# ping 10.246.38.1 PING 10.246.38.1 (10.246.38.1): 56 data bytes 64 bytes from 10.246.38.1: icmp_seq=0 ttl=64 time=28.106 ms 64 bytes from 10.246.38.1: icmp_seq=1 ttl=64 time=42.917 ms 64 bytes from 10.246.38.1: icmp_seq=2 ttl=64 time=127.525 ms 64 bytes from 10.246.38.1: icmp_seq=3 ttl=64 time=119.896 ms 64 bytes from 10.246.38.1: icmp_seq=4 ttl=64 time=154.524 ms --- 10.246.38.1 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max/stddev = 28.106/94.594/154.524/49.814 ms
Zoals verwacht hebben beide kanten de mogelijkheid om ICMP-pakketten te verzenden en te ontvangen van de privaat geconfigureerde adressen. Vervolgens dient aan beide gateways verteld te worden hoe pakketten te routeren om op de juiste wijze verkeer van een van de netwerken te versturen. Het volgende commando doet dit:
# corp-net# route add 10.0.0.0 10.0.0.5 255.255.255.0
# corp-net# route add net 10.0.0.0: gateway 10.0.0.5
# priv-net# route add 10.246.38.0 10.246.38.1 255.255.255.0
# priv-net# route add host 10.246.38.0: gateway 10.246.38.1
Op dit moment dienen interne machines bereikbaar te zijn vanuit elke gateway alsook als vanuit machines achter de gateways. Dit is eenvoudig te zien aan het volgende voorbeeld:
corp-net# ping 10.0.0.8 PING 10.0.0.8 (10.0.0.8): 56 data bytes 64 bytes from 10.0.0.8: icmp_seq=0 ttl=63 time=92.391 ms 64 bytes from 10.0.0.8: icmp_seq=1 ttl=63 time=21.870 ms 64 bytes from 10.0.0.8: icmp_seq=2 ttl=63 time=198.022 ms 64 bytes from 10.0.0.8: icmp_seq=3 ttl=63 time=22.241 ms 64 bytes from 10.0.0.8: icmp_seq=4 ttl=63 time=174.705 ms --- 10.0.0.8 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max/stddev = 21.870/101.846/198.022/74.001 ms priv-net# ping 10.246.38.107 PING 10.246.38.1 (10.246.38.107): 56 data bytes 64 bytes from 10.246.38.107: icmp_seq=0 ttl=64 time=53.491 ms 64 bytes from 10.246.38.107: icmp_seq=1 ttl=64 time=23.395 ms 64 bytes from 10.246.38.107: icmp_seq=2 ttl=64 time=23.865 ms 64 bytes from 10.246.38.107: icmp_seq=3 ttl=64 time=21.145 ms 64 bytes from 10.246.38.107: icmp_seq=4 ttl=64 time=36.708 ms --- 10.246.38.107 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max/stddev = 21.145/31.721/53.491/12.179 ms
De tunnels opzetten is het eenvoudige deel. Het configureren van een veilige verbinding is een veel diepgaander proces. De volgende configuratie gebruikt vooraf gedeelde (PSK) RSA-sleutels. Afgezien van de IP-adressen zijn beide bestanden /usr/local/etc/racoon/racoon.conf identiek en zien ze er ongeveer als volgt uit:
path pre_shared_key "/usr/lcoal/etc/racoon/psk.txt"; # plaats van bestand vooraf gedeelde sleutels
log debug; # verbositeitsinstelling van loggen: op 'notify' zetten als testen en debuggen klaar is
padding # opties moeten niet veranderd worden
{
maximum_length 20;
randomize off;
strict_check off;
exclusive_tail off;
}
timer # timingopties, veranderen indien nodig
{
counter 5;
interval 20 sec;
persend 1;
# natt_keepalive 15 sec;
phase1 30 sec;
phase2 15 sec;
}
listen # adres [poort] waarop racoon luistert
{
isakmp 172.16.5.4 [500];
isakmp_natt 172.16.5.4 [4500];
}
remote 192.168.1.12 [500]
{
exchange_mode main,aggressive;
doi ipsec_doi;
situation identity_only;
my_identifier address 172.16.5.4;
peers_identifier address 192.168.1.12;
lifetime time 8 hour;
passive off;
proposal_check obey;
# nat_traversal off;
generate_policy off;
proposal {
encryption_algorithm blowfish;
hash_algorithm md5;
authentication_method pre_shared_key;
lifetime time 30 sec;
dh_group 1;
}
}
sainfo (address 10.246.38.0/24 any address 10.0.0.0/24 any) # adres $netwerk/$netmasker $type adres $netwerk/$netmasker $type ( $type is any of esp)
{
pfs_group 1;
lifetime time 3600 sec;
encryption_algorithm blowfish,3des,des;
authentication_algorithm hmac_md5,hmac_sha1;
compression_algorithm deflate;
}
Het uitleggen van elke beschikbare optie, samen met diegenen in deze voorbeelden valt buiten het bereik van dit document. De configuratiehandleiding van racoon staat vol relevante informatie.
De SPD-beleiden moeten geconfigureerd worden zodat FreeBSD en racoon in staat zijn om netwerkverkeer tussen hosts te versleutelen en te ontsleutelen.
Deze taak kan met een eenvoudig shellscript zoals het volgende dat op de gateway van de onderneming staat worden uitgevoerd. Dit bestand wordt gebruikt tijdens de systeeminitialisatie en dient bewaard te worden als /usr/local/etc/racoon/setkey.conf.
flush; spdflush; # Naar het thuisnetwerk spdadd 10.246.38.0/24 10.0.0.0/24 any -P out ipsec esp/tunnel/172.16.5.4-192.168.1.12/use; spdadd 10.0.0.0/24 10.246.38.0/24 any -P in esp/tunnel/192.168.1.12-172.16.5.4/use;
Eenmaal aanwezig kan racoon op beide gateways gestart worden met het volgende commando:
# /usr/local/sbin/racoon -F -f /usr/local/etc/racoon/racoon.conf -l /var/log/racoon.log
De uitvoer moet ongeveer gelijk zijn aan de volgende:
corp-net# /usr/local/sbin/racoon -F -f /usr/local/etc/racoon/racoon.conf Foreground mode. 2006-01-30 01:35:47: INFO: begin Identity Protection mode. 2006-01-30 01:35:48: INFO: received Vendor ID: KAME/racoon 2006-01-30 01:35:55: INFO: received Vendor ID: KAME/racoon 2006-01-30 01:36:04: INFO: ISAKMP-SA established 172.16.5.4[500]-192.168.1.12[500] spi:623b9b3bd2492452:7deab82d54ff704a 2006-01-30 01:36:05: INFO: initiate new phase 2 negotiation: 172.16.5.4[0]192.168.1.12[0] 2006-01-30 01:36:09: INFO: IPsec-SA established: ESP/Tunnel 192.168.1.12[0]->172.16.5.4[0] spi=28496098(0x1b2d0e2) 2006-01-30 01:36:09: INFO: IPsec-SA established: ESP/Tunnel 172.16.5.4[0]->192.168.1.2[0] spi=47784998(0x2d92426) 2006-01-30 01:36:13: INFO: respond new phase 2 negotiation: 172.16.5.4[0]192.168.1.12[0] 2006-01-30 01:36:18: INFO: IPsec-SA established: ESP/Tunnel 192.168.1.12[0]->172.16.5.4[0] spi=124397467(0x76a279b) 2006-01-30 01:36:18: INFO: IPsec-SA established: ESP/Tunnel 172.16.5.4[0]->192.168.1.12[0] spi=175852902(0xa7b4d66)
Om er zeker van te zijn dat de tunnel correct werkt, dient naar een ander console geschakeld te worden en tcpdump(1) gebruikt te worden om hiermee het netwerkverkeer te bekijken. Vervang em0 door de netwerkinterfacekaart indien nodig.
# tcpdump -i em0 host 172.16.5.4 and dst 192.168.1.12
Gegevens lijkend op de volgende zouden op het console moeten verschijnen. Indien niet, dan is er iets aan de hand, en is het nodig om de teruggegeven gegevens te debuggen.
01:47:32.021683 IP corporatenetwork.com > 192.168.1.12.privatenetwork.com: ESP(spi=0x02acbf9f,seq=0xa) 01:47:33.022442 IP corporatenetwork.com > 192.168.1.12.privatenetwork.com: ESP(spi=0x02acbf9f,seq=0xb) 01:47:34.024218 IP corporatenetwork.com > 192.168.1.12.privatenetwork.com: ESP(spi=0x02acbf9f,seq=0xc)
Op dit punt zouden beide netwerken beschikbaar moeten zijn en deel lijken van hetzelfde netwerk. Waarschijnlijk zijn beide netwerken beschermt door een firewall, zoals het hoort. Om verkeer tussen hen toe te staan, moeten er regels worden toegevoegd om pakketten heen en terug door te laten. Voeg voor de firewall ipfw(8) de volgende regels toe aan het instellingenbestand van de firewall:
ipfw add 00201 allow log esp from any to any ipfw add 00202 allow log ah from any to any ipfw add 00203 allow log ipencap from any to any ipfw add 00204 allow log udp from any 500 to any
Opmerking: Afhankelijk van de huidige hostconfiguratie dienen de regelnummers gewijzigd te worden.
Voor gebruikers van pf(4) of ipf(8) zouden de volgende regels moeten volstaan:
pass in quick proto esp form any to any pass in quick proto ah from any to any pass in quick proto ipencap from any to any pass in quick proto udp form any port = 500 to any port = 500 pass in quick on gif0 from any to any pass out quick proto esp from any to any pass out quick proto ah from any to any pass out quick ptoto ipencap from any to any pass out quick proto udp from any port = 500 to any port = 500 pass out quick on gif0 from any to any
Ter afsluiting, voeg de volgende regels toe aan /etc/rc.conf om de machine toe te staan om ondersteuning voor het VPN te starten tijdens de systeeminitialisatie:
ipsec_enable="YES" ipsec_program="/usr/local/sbin/setkey" ipsec_file="/usr/local/etc/racoon/setkey.conf" # staat toe om spd-beleiden tijdens het opstarten op te zetten racoon_enable="yes"
OpenSSH is een groep netwerkverbindingsprogramma's waarmee computers via het netwerk veilig benaderd kunnen worden. Het kan ingezet worden als een directe vervanger van rlogin, rsh, rcp en telnet. Daarnaast kunnen TCP/IP-verbindingen veilig getunneld of geforward worden door SSH. OpenSSH versleutelt al het verkeer om afluisteren, het stelen van een verbinding en andere netwerkaanvallen effectief te voorkomen.
OpenSSH wordt onderhouden door het OpenBSD project en is gebaseerd op SSH v1.2.12 met alle recente bugfixes en updates. Het is compatibel met beide protocollen SSH 1 en 2.
Als gewoonlijk telnet(1) of rlogin(1) wordt gebruikt, wordt de data in platte tekst en niet versleuteld verzonden. Netwerksnuffelaars die ergens tussen de cliënt en de server meeluisteren, kunnen een gebruikersnaam en wachtwoord stelen en zien welke gegevens er worden overgezonden tijdens een sessie. OpenSSH biedt een verscheidenheid aan autenticatie en versleutelingsmethoden die het voorgaande voorkomen.
De sshd is een optie die wordt aangeboden tijdens een Standard-installatie van FreeBSD. sshd is ingeschakeld als de volgende regel voorkomt in rc.conf:
sshd_enable="YES"
Hierdoor wordt sshd(8) geladen, het daemonprogramma voor OpenSSH, als het systeem de volgende keer opstart. Als alternatief is het mogelijk om het rc(8)-script /etc/rc.d/sshd te gebruiken om OpenSSH te starten:
# /etc/rc.d/sshd start
ssh(1) werkt net zoals rlogin(1).
# ssh user@example.com Host key not found from the list of known hosts. Are you sure you want to continue connecting (yes/no)? yes Host 'example.com' added to the list of known hosts. user@example.com's password: *******
Het aanmelden gaat nu net zoals het zou gaan als wanneer er een sessie gestart zou worden met rlogin of telnet. SSH maakt gebruik van een systeem met vingerafdrukken als sleutels voor het vaststellen met welke server verbinding wordt gemaakt op het moment dat de cliënt verbinding zoekt. De gebruiker krijgt alleen de eerste keer dat verbinding wordt gezocht met de server een vraag waarop yes geantwoord dient te worden. Bij volgende pogingen om aan te melden wordt de vingerafdruksleutel vergeleken met de sleutel die is opgeslagen. De SSH-cliënt alarmeert de gebruiker als de opgeslagen vingerafdruk sleutel anders is dan de sleutel die de server meldt. De vingerafdrukken worden opgeslagen in ~/.ssh/known_hosts of in ~/.ssh/known_hosts2 voor SSH v2 vingerafdrukken.
Recente OpenSSH servers staan standaard ingesteld om
alleen SSH v2 connecties toe te staan. De cliënt gebruikt versie 2 als dat
mogelijk is en valt anders terug op versie 1. De cliënt kan ook gedwongen
worden om een van de twee protocollen te gebruiken door de optie -1 of -2 voor respectievelijk
versie 1 en versie 2 aan te geven. De mogelijkheid versie 1 te gebruiken blijft
in de cliënt bestaan om compatibiliteit met oudere versies te behouden.
Het commando scp(1) (secure copy) werkt gelijk aan rcp(1). Het kopieert een bestand van of naar een andere machine, maar doet dat veilig.
# scp user@example.com:/COPYRIGHT COPYRIGHT user@example.com's password: ******* COPYRIGHT 100% |*****************************| 4735 00:00 #
Omdat de vingerafdruk al is opgeslagen voor deze host in het vorige voorbeeld, is die al geverifieerd als scp(1) gebruik wordt.
De argumenten die aan scp(1) gegeven worden
zijn vrijwel gelijk aan die voor cp(1) met het bestand
of de bestanden als het eerste argument en de bestemming als het tweede. Omdat
het bestand over het netwerk gaat, door SSH, hebben een of meer van de
bestandsargumenten de vorm user@host:<path_to_remote_file>.
Het instellingenbestand dat voor het hele systeem geldt voor zowel de OpenSSH daemon als cliënt staat in de map /etc/ssh.
ssh_config bevat de instellingen voor de cliënt en sshd_config bevat ze voor de daemon.
Daarnaast bieden het sshd_program (standaard /usr/sbin/sshd) en sshd_flags rc.conf opties nog meer mogelijkheden voor instellingen.
In plaats van het gebruik van wachtwoorden kan ssh-keygen(1) gebruikt worden om DSA en RSA sleutels te maken om een gebruiker te autenticeren:
% ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/user/.ssh/id_dsa): Created directory '/home/user/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_dsa. Your public key has been saved in /home/user/.ssh/id_dsa.pub. The key fingerprint is: bb:48:db:f2:93:57:80:b6:aa:bc:f5:d5:ba:8f:79:17 user@host.example.com
ssh-keygen(1) maakt een publiek en privaat sleutelpaar aan dat gebruikt kan worden voor autenticatie. De private sleutel staat opgeslagen in ~/.ssh/id_dsa of ~/.ssh/id_rsa en de publieke sleutel staat in ~/.ssh/id_dsa.pub of ~/.ssh/id_rsa.pub voor respectievelijk sleuteltypen DSA en RSA. De publieke sleutel moet voor beide RSA- of DSA-sleutels in het bestand ~/.ssh/authorized_keys van de andere machine staan om dit te laten werken.
Nu is het mogelijk een verbinding te maken met een andere machine die gebaseerd is op SSH sleutels in plaats van op wachtwoorden.
Als er een wachtwoordzin is gebruikt bij ssh-keygen(1) dan wordt de gebruiker iedere keer dat de private sleutel wordt gebruikt een wachtwoord gevraagd. ssh-agent(1) kan het ongemak van steeds opnieuw een lange wachtwoordzin moeten ingeven verlichten en wordt beschreven in het onderdeel Paragraaf 15.10.7.
WaarschuwingAfhankelijk van de gebruikte versie van OpenSSH kunnen opties en bestanden verschillen. Het is verstandig de handleiding ssh-keygen(1) te raadplegen.
De hulpprogramma's ssh-agent(1) en ssh-add(1) bieden de mogelijkheid om SSH in het geheugen te laden zodat niet iedere keer de wachtwoordzin ingegeven hoeft te worden.
Het hulpprogramma ssh-agent(1) handelt de autenticatie af voor de geheime sleutels die erin geladen zijn. ssh-agent(1) wordt gebruikt om andere programma's te starten. Bij eenvoudig gebruik kan er een shell mee gestart worden of meer complex een schermbeheerprogramma.
Voordat ssh-agent(1) in een shell gebruikt kan worden dient het eerst gestart te worden met een shell als argument. Daarna kan de identiteit toegevoegd worden daar ssh-add(1) aan te roepen en de wachtwoordzin voor de geheime sleutel op te geven. Als deze stappen zijn voltooid kan een gebruiker met ssh(1) naar iedere host waar de corresponderende publieke sleutel is geïnstalleerd:
% ssh-agent csh % ssh-add Enter passphrase for /home/user/.ssh/id_dsa: Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa) %
Om ssh-agent(1) te gebruiken in X11 dient er een verwijzing naar ssh-agent(1) in ~/.xinitrc te staan. Dan zijn de diensten van ssh-agent(1) beschikbaar voor alle programma's die in X11 gestart worden. Een ~/.xinitrc zou er als volgt uit kunnen zien:
exec ssh-agent startxfce4
Hiermee wordt ssh-agent(1) gestart die op zijn beurt XFCE start, iedere keer dat X11 start. Als dat is gebeurd en X11 is herstart zodat de wijzigingen actief zijn, dan kan eenvoudigweg ssh-add(1) gestart worden om alle beschikbare SSH sleutels te laden.
OpenSSH kan een tunnel maken waarin een ander protocol ingepakt kan worden zodat er een versleutelde sessie ontstaat.
Het volgende commando geeft ssh(1) aan dat er een tunnel voor telnet gemaakt moet worden:
% ssh -2 -N -f -L 5023:localhost:23 user@foo.example.com %
Aan het ssh commando worden de volgende opties meegegeven:
-2Dit dwingt ssh om versie 2 van het protocol te gebruiken. Gebruik van deze optie wordt afgeraden als er verbinding wordt gemaakt met oudere SSH servers.
-NDit geeft aan dat er geen commando volgt, maar dat er een tunnel opgezet moet worden. Als deze optie niet aanwezig was, zou ssh een normale sessie starten.
-fDit dwingt ssh om in de achtergrond te draaien.
-LDit geeft aan dat de lokaal een tunnel wordt gemaakt in de vorm lokale_poort:netwerk_host:netwerk_poort.
user@foo.example.comWijst naar een gebruiker op de SSH server op het netwerk.
Een SSH tunnel werkt doordat een luistersocket wordt gemaakt op localhost op de aangegeven poort. Die stuurt dan iedere ontvangen verbinding op de lokale host/poort via de SSH verbinding door naar de aangegeven host en poort op het netwerk.
In het voorbeeld wordt poort 5023 op localhost doorgestuurd naar poort 23 op localhost van de machine op het netwerk. Omdat 23 telnet is, zou dit een veilige telnet verbinding opleveren door een SSH tunnel.
Dit kan gebruikt worden om ieder willekeurig onveilig TCP protocol in te pakken als SMTP, POP3, FTP, etc.
Voorbeeld 15-1. SSH gebruiken om een veilige tunnel te maken voor SMTP
% ssh -2 -N -f -L 5025:localhost:25 user@mailserver.example.com user@mailserver.example.com's password: ***** % telnet localhost 5025 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mailserver.example.com ESMTP
Dit kan samen met een ssh-keygen(1) en extra gebruikersaccounts gebruikt worden om een min of meer naadloze en eenvoudige SSH tunnelomgeving te maken. In plaats van wachtwoorden kunnen sleutels gebruikt worden en de tunnels kunnen in de omgeving van een aparte gebruiker draaien.
Op het werk staat een SSH server die verbindingen van buitenaf toestaat. Op hetzelfde netwerk op kantoor staat een mailserver waarop POP3 draait. Het netwerk of het netwerkpad tussen de locatie op Internet en kantoor is wellicht niet helemaal te vertrouwen. Om deze reden dient de mailserver op een veilige manier benaderd te worden. De oplossing is een SSH verbinding opzetten naar de SSH server op kantoor en dan door de tunnel heen een verbinding opzetten met de mailserver.
% ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com user@ssh-server.example.com's password: ******
Als de tunnel eenmaal draait, dan kan de mailcliënt naar localhost poort 2110 gewezen worden. Alle verbinding naar die poort worden veilig doorgestuurd door de tunnel naar mail.example.com.
Sommige netwerkbeheerders stellen draconische firewallregels op en filteren niet alleen inkomende verbindingen, maar ook uitgaande. Meestal mag dan alleen maar verbinding gemaakt worden met andere machines op poorten 22 en 80 voor SSH en websurfen.
Soms wil een gebruiker dan toch toegang krijgen tot andere (wellicht niet netwerkgerelateerde) diensten, zoals een Ogg Vorbis server om muziek te streamen. Als die Ogg Vorbis server streamt op een andere poort dan 22 of 80, dan kan deze niet bereikt worden.
De oplossing ligt in het opzetten van een SSH verbinding naar een machine buiten de firewall en die tunnel te gebruiken om bij de Ogg Vorbis server te komen.
% ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.org user@unfirewalled-system.example.org's password: *******
De streamingcliënt kan nu gewezen worden naar localhost poort 8888 vanwaar er wordt doorverwezen naar music.example.com poort 8000 en zo wordt de firewall succesvol ontwerken.
AllowUsersVaak is het verstandig om beperkingen aan te brengen op het gebied van welke gebruikers kunnen aanmelden en van waar. De optie AllowUsers biedt deze mogelijkheid. Om bijvoorbeeld alleen root toe te staan zich aan te melden van 192.168.1.32, kan iets als de volgende regel worden opgenomen in het bestand /etc/ssh/sshd_config:
AllowUsers root@192.168.1.32
Om de gebruiker admin het recht te geven zich van overal aan te melden hoeft alleen de gebruikersnaam vermeld te worden:
AllowUsers admin
Meerdere gebruikers met rechten of beperkingen horen op dezelfde regel te staan:
AllowUsers root@192.168.1.32 admin
Opmerking: Het is van belang dat iedere gebruiker die zich moet kunnen aanmelden wordt genoemd. De overige gebruikers worden buitengesloten.
Nadat er wijzigingen zijn gemaakt aan /etc/ssh/sshd_config dienen de bestanden in sshd(8) geladen te worden:
# /etc/rc.d/sshd reload
In combinatie met verbeteringen als snapshots, biedt FreeBSD de veiligheid van Toegangscontrolelijsten voor Bestandssystemen (Access Control Lists, ACLs).
Met toegangscontrolelijsten wordt het standaard UNIX rechtenmodel uitgebreid op een zeer verenigbare (POSIX.1e) manier. Deze methodes stellen een beheerder in staat om gebruik te maken en voordeel te halen uit een geraffineerder beveiligingsmodel.
Om ondersteuning voor ACLs voor bestandssystemen in te schakelen dient het volgende in de kernel gecompileerd te worden:
options UFS_ACL
Als deze optie niet aanwezig is, dan wordt er een waarschuwing weergegeven als er wordt geprobeerd een bestandssysteem aan te koppelen dat gebruik maakt van ACLs. Deze optie is al geactiveerd in de GENERIC kernel. ACLs zijn afhankelijk van uitgebreide attributen die zijn ingeschakeld op het bestandssysteem. Uitgebreide attributen worden standaard ondersteund in het volgende generatie UNIX bestandssysteem UFS2.
Opmerking: Er is meer administratieve rompslomp nodig om uitgebreide attributen in te stellen op UFS1 dan op UFS2. De prestaties van uitgebreide attributen zijn op UFS2 ook veel beter. Daarom wordt UFS2 ook meestal aangeraden boven UFS1 bij het gebruik van toegangscontrolelijsten.
ACLs worden ingeschakeld door de
beheersvlag acls op het moment van aankoppelen. Dit kan ook
in /etc/fstab staan. De vlag op het moment van aankoppelen kan
ook automatisch gezet worden op een persistente wijze met tunefs(8) door een
superblok in de bestandssysteemkop te wijzigen. In het algemeen wordt de voorkeur gegeven
aan de vlag in het superblok om een aantal redenen:
De ACLs vlag op het moment van
aankoppelen kan niet gewijzigd worden bij opnieuw aankoppelen (mount(8) -u), maar alleen door een volledige umount(8) en een verse
mount(8). Dit
betekent dat ACLs niet ingeschakeld kunnen
worden op root-bestandssysteem na het opstarten. Het betekent ook dat de aard
van een bestandssysteem niet veranderd kan worden als het eenmaal in gebruik
is.
Het inschakelen van de superblokvlag zorgt ervoor dat het bestandssysteem altijd wordt aangekoppeld met de ACLs ingeschakeld, zelfs als het niet in fstab staat of als de apparaten van plaats veranderen. Hiermee wordt voorkomen dat het bestandssysteem wordt gebruikt zonder dat ACLs ingeschakeld zijn, wat ervoor zou kunnen zorgen dat ACLs onjuist worden toegepast wat weer kan zorgen voor beveiligingsproblemen.
Opmerking: Wellicht wordt het mogelijk om de ACLs via de vlag in te schakelen zonder een compleet verse mount(8), maar de ontwikkelaars vinden het wenselijk om het per ongeluk zonder ACLs aankoppelen te ontmoedigen, omdat er bijzonder vervelende gevolgen kunnen zijn als ACLs worden ingeschakeld, daarna worden uitgezet en weer worden ingeschakeld zonder dat de uitgebreide attributen worden geschoond. In het algemeen geldt dat als ACLs eenmaal zijn ingeschakeld voor een bestandssysteem, ze niet meer uitgeschakeld moeten worden, omdat de resulterende bestandsbescherming wellicht niet compatibel is met dat wat gebruikers van het systeem nodig hebben en het opnieuw aanzetten van ACLs kan leiden tot het opnieuw koppelen van voorheen bestaande ACLs aan bestanden waarvoor de toegangsrechten sindsdien zijn aangepast, wat kan leiden tot onverwachte situaties.
Bestandssystemen waarvoor ACLs zijn ingeschakeld worden weergegeven met een + (plus) teken als de toegangsrechten worden bekeken:
drwx------ 2 robert robert 512 Dec 27 11:54 private drwxrwx---+ 2 robert robert 512 Dec 23 10:57 directory1 drwxrwx---+ 2 robert robert 512 Dec 22 10:20 directory2 drwxrwx---+ 2 robert robert 512 Dec 27 11:57 directory3 drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html
Hierboven is te zien dat mappen directory1, directory2 en directory3 allemaal gebruik maken van ACLs. De map public_html doet dat niet.
De ACLs van het bestandssysteem kunnen bekeken worden met het hulpprogramma getfacl(1). Om de ACL op het bestand test te bekijken zou het volgende commando nodig zijn:
% getfacl test #file:test #owner:1001 #group:1001 user::rw- group::r-- other::r--
Om de ACL op dit bestand te wijzigen wordt het hulpprogramma setfacl(1) als volgt gebruikt:
% setfacl -k test
De vlag -k verwijdert alle bestaande ACLs van een bestand of bestandssysteem. De
methode die de voorkeur geniet is -b gebruiken
omdat die optie de basisvelden die nodig zijn voor het laten werken van de
ACLs laat staan.
% setfacl -m u:trhodes:rwx,group:web:r--,o::--- test
Bij het commando hierboven, werd de optie -m gebruikt
om de standaard ACL aan te passen. Omdat
er geen voorgedefinieerde instellingen waren, die waren verwijderd door het
commando daarvoor, werden nu de standaardinstellingen hersteld en de rechten die
werden aangegeven toegevoegd. Let op dat bij het toevoegen van een gebruiker of een
groep die niet bekend is op het systeem een foutmelding “Invalid argument” wordt geschreven naar stdout.
In de afgelopen jaren zijn er in de beveiligingswereld veel vorderingen gemaakt op het gebied van inzicht in kwetsbaarheden. Als er software naast het besturingssysteem wordt geïnstalleerd en ingesteld neemt op vrijwel ieder besturingssysteem het risico op inbraak toe.
Inzicht in kwetsbaarheid is een vitale factor in beveiliging en hoewel FreeBSD waarschuwingen publiceert voor het basissysteem, gaat het publiceren van waarschuwingen voor alle overige software de scope van het FreeBSD Project te buiten. Er is een manier om inzicht te krijgen in de kwetsbaarheden voor additionele software en als beheerder gewaarschuwd te worden. Voor dit doel bestaat het FreeBSD hulpprogramma Portaudit.
De port ports-mgmt/portaudit zoekt naar bekende beveiligingsproblemen in een database die wordt bijgewerkt en onderhouden door het FreeBSD Security Team en portontwikkelaars.
Voordat Portaudit gebruikt kan worden dient het geïnstalleerd te worden uit de Portscollectie:
# cd /usr/ports/ports-mgmt/portaudit && make install clean
Tijdens het installatieproces worden de instellingenbestanden voor periodic(8) bijgewerkt, waardoor Portaudit uitvoer in de dagelijkse security runs meekomt. Het is van belang dat de emails die aan de emailaccount van root worden gezonden en uit de dagelijkse beveiligingsronde komen ook echt worden gelezen. Er zijn geen verdere instellingen nodig.
Na de installatie kan de beheerder de database bijwerken en bekende kwetsbaarheden in geïnstalleerde pakketten bekijken met het volgende commando:
# portaudit -Fda
Opmerking: De database wordt automatisch bijgewerkt tijdens de periodic(8) run; dus het voorgaande commando is volledig optioneel. Het is alleen nodig om de volgende voorbeelden na te kunnen doen.
De software de uit de Portscollectie is geïnstalleerd kan op elk moment door een beheerder ge-audit worden met:
# portaudit -a
Portaudit zal iets als het volgende produceren voor kwetsbare pakketten:
Affected package: cups-base-1.1.22.0_1 Type of problem: cups-base -- HPGL buffer overflow vulnerability. Reference: <http://www.FreeBSD.org/ports/portaudit/40a3bca2-6809-11d9-a9e7-0001020eed82.html> 1 problem(s) in your installed packages found. You are advised to update or deinstall the affected package(s) immediately.
Door met een webbrowser naar de aangegeven URL te gaan kan een beheerder meer informatie over de bewust kwetsbaarheid krijgen, waaronder de versies die het betreft, volgens de FreeBSD Port versie en andere websites waarop beveiligingswaarschuwingen te lezen zijn.
In het kort is Portaudit een krachtig hulpprogramma dat bijzonder handig is als het wordt gekoppeld aan het gebruik van de port Portupgrade.
Net als veel andere kwalitatief goede productiebesturingssystemen publiceert FreeBSD “Beveiligingswaarschuwingen”. Deze waarschuwingen worden meestal pas naar de beveiligingslijst gemaild en gedocumenteerd in de Errata als de van toepassing zijnde uitgaven gepatcht zijn. In deze paragraaf wordt toegelicht wat een waarschuwing is, hoe die te begrijpen en welke maatregelen er genomen moeten worden om een systeem bij te werken.
De FreeBSD beveiligingswaarschuwingen zien er ongeveer uit als die hieronder die van de freebsd-security-notifications mailinglijst komt.
=============================================================================
FreeBSD-SA-XX:XX.UTIL Security Advisory
The FreeBSD Project
Topic: denial of service due to some problem
Category: core
Module: sys
Announced: 2003-09-23
Credits: Person
Affects: All releases of FreeBSD
FreeBSD 4-STABLE prior to the correction date
Corrected: 2003-09-23 16:42:59 UTC (RELENG_4, 4.9-PRERELEASE)
2003-09-23 20:08:42 UTC (RELENG_5_1, 5.1-RELEASE-p6)
2003-09-23 20:07:06 UTC (RELENG_5_0, 5.0-RELEASE-p15)
2003-09-23 16:44:58 UTC (RELENG_4_8, 4.8-RELEASE-p8)
2003-09-23 16:47:34 UTC (RELENG_4_7, 4.7-RELEASE-p18)
2003-09-23 16:49:46 UTC (RELENG_4_6, 4.6-RELEASE-p21)
2003-09-23 16:51:24 UTC (RELENG_4_5, 4.5-RELEASE-p33)
2003-09-23 16:52:45 UTC (RELENG_4_4, 4.4-RELEASE-p43)
2003-09-23 16:54:39 UTC (RELENG_4_3, 4.3-RELEASE-p39)
CVE Name: CVE-XXXX-XXXX
For general information regarding FreeBSD Security Advisories,
including descriptions of the fields above, security branches, and the
following sections, please visit
http://www.FreeBSD.org/security/.
I. Background
II. Problem Description
III. Impact
IV. Workaround
V. Solution
VI. Correction details
VII. References















Procesaccounting is een beveiligingsmethode die een beheerder in staat stelt om in de gaten te houden welke systeembronnen worden gebruikt, hoe ze over gebruikers verdeeld zijn, systeemmonitoring biedt en op minimalistische wijze het gebruik van commando's door gebruikers volgt.
Deze methode heeft voordelen en nadelen. Eén van de positieve punten is dat een inbraak gevolgd kan worden tot het moment waarop die zich voordeed. Nadelen zijn de grootte van de logboeken die door procesaccounting worden gegenereerd en de schijfruimte die dat kost. In dit onderdeel wordt een beheerder de basis van procesaccounting getoond.
Voordat procesaccounting gebruikt kan worden dient het te worden ingeschakeld met de volgende commando's:
# touch /var/account/acct # accton /var/account/acct # echo 'accounting_enable="YES"' >> /etc/rc.conf
Eenmaal ingeschakeld begint accounting met het bijhouden van CPU statistieken, commando's, enzovoort. Alle accounting logboeken worden in een niet leesbaar formaat bijgehouden en zijn uit te lezen met sa(8). Bij het uitvoeren zonder opties, toont sa informatie gerelateerd aan het aantal aanroepen per gebruiker, de totale tijd in minuten die is verstreken, de totale CPU- en gebruikerstijd in minuten, gemiddeld aantal I/O operaties, enzovoort.
Informatie over uitgevoerde commando's kan bekeken worden met lastcomm(1). Zo kan met lastcomm bijvoorbeeld weergegeven worden welke commando's door gebruikers op een specifieke ttys(5) zijn uitgevoerd:
# lastcomm ls trhodes ttyp1
Het bovenstaande commando toont ieder bekend gebruikt van ls door de gebruiker trhodes op terminal ttyp1.
Veel andere handige opties staan beschreven in lastcomm(1), acct(5) en sa(8).
Dit hoofdstuk levert een uitleg van wat FreeBSD jails zijn en hoe ze gebruikt kunnen worden. Jails, soms ook wel bekend als een verbeterde vervanging van chroot omgevingen, zijn een erg krachtige tool voor systeem beheerders, maar het standaard gedrag kan ook interessant zijn voor gevorderde gebruikers.
Na het lezen van dit hoofdstuk weet de lezer:
Wat een jail is, en welk doel het kan dienen in een FreeBSD installatie.
Hoe men een jail opbouwt, start en stopt.
De basis over jail beheer, zowel van binnen in de jail, als van buitenaf.
Andere bronnen met nuttige informatie over jails zijn:
De jail(8) handleiding. Hier kan de volledige referentie gevonden worden van het jail commando -- de administratieve tool die in FreeBSD gebruikt kan worden om FreeBSD jails mee te beheren, te starten en te stoppen.
De mailinglijsten en de archieven hiervan. De archieven van de FreeBSD algemene vragen mailinglijst en andere mailing lijsten die gehost worden door de FreeBSD nlijstserver bevatten reeds een rijke bron van informatie over jails. Het zou altijd aantrekkelijk moeten zijn om informatie in de archieven te zoeken, of een nieuwe vraag stellen aan de freebsd-questions mailinglijst.
Om een beter begrip te geven over de onderdelen van FreeBSD die gerelateerd zijn aan jails, de werking ervan, en hoe ze omgaan met de rest van FreeBSD worden de volgende termen gebruikt in het hoofdstuk:
Hulpmiddel dat de systeemaanroep chroot(2) van FreeBSD gebruikt om de rootmap van een proces en alle afstammelingen te veranderen.
Een omgeving van processen die draaien in een “chroot”. Dit is inclusief bronnen die gebruikt worden, zoals bijvoorbeeld het gedeelte van het bestandssysteem dat zichtbaar is, de gebruiker en groep ID's welke beschikbaar zijn, netwerkkaarten en andere IPC-mechanismes, etcetera.
De systeem utility die het mogelijk maakt om processen binnenin een jail te starten.
Het controlerende systeem van een jail omgeving. Het host systeem heeft toegang tot alle beschikbare hardware bronnen en kan processen controleren zowel buiten als binnenin een jail. Één van de belangrijkste verschillen van het host systeem met een jail zijn de limitaties die van toepassing zijn op super-gebruiker processen binnenin een jail, niet geforceerd worden voor processen in het host systeem.
Een proces, gebruiker, of andere entiteit wiens toegang tot bronnen is gelimiteerd door een FreeBSD jail.
Omdat systeem beheer een complexe en enorme taak is, zijn er vele sterke tools ontwikkeld om het leven van een systeem beheerder makkelijker te maken. Deze tools leveren meestal verbeteringen op de manier waarop systemen worden geïnstalleerd, geconfigureerd en onderhouden. Een deel van de taken waarvan verwacht wordt dat die uitgevoerd wordt door de systeem beheerder is het goed configureren van de beveiliging van een systeem, zodat het kan blijven doorgaan met het serveren van de taak, zonder dat er beveiligingsproblemen optreden.
Één van de tools welke gebruikt kan worden om de beveiliging van een
FreeBSD systeem te verbeteren zijn jails. Jails zijn geïntroduceerd in FreeBSD 4.X
door Poul-Henning Kamp <phk@FreeBSD.org>, maar zijn grotendeels
verbeterd in FreeBSD 5.X om ze nog sterker en krachtiger te maken. De ontwikkeling
gaat nog steeds door met verbeteringen voor het gebruik, performance, betrouwbaarheid en
beveiliging.
BSD achtige systemen hebben sinds 4.2-BSD ondersteuning voor chroot(2). De chroot(8) utility kan gebruikt worden om de root directory van een set processen te wijzigen waardoor een veilige omgeving wordt gecreeërd voor de rest van het systeem. Processen die gemaakt worden in een chroot omgeving kunnen bestanden en bronnen daarbuiten niet benaderen. Daardoor zou een compromitering van een dienst die in een chroot omgeving draait niet direct betekenen dat het hele systeem gecompromiteerd is. De chroot(8) utility is goed genoeg voor simpele taken, waarbij flexibiliteit en geavanceerde en complexe opties niet nodig zijn. Sinds het uitvinden van het chroot concept, zijn er vele mogelijkheden gevonden om hieruit te kunnen komen en alhoewel ze verbeterd zijn in moderne versies van FreeBSD, werd het duidelijk dat chroot(2) niet de meest ideale oplossing was voor het beveiligen van diensten. Er moest een nieuw subsysteem ontwikkeld worden.
Dit is één van de redenen waarom jails zijn ontwikkeld.
Jails zijn een verbeterd concept van de chroot(2) omgeving, in verschillende opzichten. In een traditionele chroot(2) omgeving worden processen alleen gelimiteerd in het deel van het bestandssysteem die ze kunnen benaderen. De rest van de systeem bronnen (zoals de set van systeem gebruikers, de draaiende processen of het netwerk subsysteem) worden gedeeld door het chrooted proces en de processen op het host systeem. Jails breiden dit model uit door het niet alleen virtualizeren van de toegang tot het bestandssysteem maar ook tot de set van gebruikers, het netwerk subsysteem van de FreeBSD kernel en een aantal andere delen. Een meer complete set van gespecificeerde controle mogelijkheden die beschikbaar zijn voor het personaliseren van de toegang tot een jail omgeving wordt beschreven in Paragraaf 16.5.
Een jail heeft vier kenmerken:
Een eigen directory structuur -- het startpunt van waaruit een jail benaderd wordt. Zodra men in de jail zit, mogen processen niet buiten deze directory structuur komen. Traditionele problemen die chroot(2)'s ontwerp getart hebben, hebben geen invloed op FreeBSD jails.
Een hostname -- de hostnaam die gebruikt wordt in de jail. Jails worden met name gebruikt voor het hosten van netwerk diensten, daardoor kan het de systeembeheerder heel erg helpen als er beschrijvende hostnames worden gekozen.
Een IP adres -- deze wordt gekoppeld aan de jail en kan op geen enkele manier worden gewijzigd tijdens het leven van de jail. Het IP adres van een jail is meestal een alias op een reeds bestaande netwerk interface, maar dit is niet noodzakelijk.
Een commando -- het padnaam van een uitvoerbaar bestand in de jail. Deze is relatief aan de rootdirectory van de jail omgeving en verschilt per situatie, afhankelijk van het type van de specifieke jail omgeving.
Buiten deze kenmerken, kunnen jails hun eigen set aan gebruikers en root gebruiker hebben. Uiteraard zijn de mogelijkheden van de root gebruiker beperkt tot de jail omgeving en, vanuit het host systeem gezien, is de root gebruiker geen super-gebruiker. Daarnaast is het de root gebruiker in een jail omgeving niet toegestaan om kritieke operaties uit te voeren op het systeem buiten de gedefinieerde jail omgeving. Meer informatie over de mogelijkheden en beperkingen van de root gebruiker kan gevonden worden in Paragraaf 16.5hieronder.
Sommige beheerders kiezen ervoor om jails op te delen in de volgende twee types: “complete” jails, welke een volledig FreeBSD systeem emuleert en “service” jails, gericht op één applicatie of dienst, mogelijkerwijs draaiende met privileges. Dit is alleen een conceptuele splitsing, de manier van het opbouwen van een jail wordt hierdoor niet veranderd. De jail(8) handleiding is heel duidelijk over de procedure voor het maken van een jail:
# setenv D /here/is/the/jail # mkdir -p $D# cd /usr/src # make buildworld
# make installworld DESTDIR=$D
# make distribution DESTDIR=$D
# mount -t devfs devfs $D/dev
![]()





Zodra een jail is geïnstalleerd, kan het opgestart worden door de jail(8) applicatie. De
jail(8) applicatie
heeft vier benodigde argumenten welke beschreven worden in Paragraaf 16.3.1. Er kunnen ook andere argumenten gebruikt worden,
om bijvoorbeeld de jail te starten met de instellingen van een specifieke gebruiker. Het
commando argument hangt
af van het type jail, voor een virtueel
systeem is /etc/rc een goede keuze, omdat het de
reguliere opstart procedure nabootst van een FreeBSD systeem. Voor een dienst jail is het geheel afhankelijk van
de dienst of applicatie die in de jail gaat draaien.
Jails worden over het algemeen gestart tegelijkertijd met de rest van het systeem. Het FreeBSD rc mechanisme levert een makkelijke manier om dat te doen:
Een lijst van jails die opgestart moeten worden tijdens het opstarten van het systeem, moeten worden toegevoegd aan het rc.conf(5) bestand:
jail_enable="YES" # Stel dit in op NO om te voorkomen dat er jails gestart worden jail_list="www" # Door spaties gescheiden lijst van jails
Opmerking: De jail namen in
jail_listmogen alleen alfanumerieke karakters bevatten.
Voor elke jail die gespecificeerd is in jail_list
moet een groep van rc.conf(5)
instellingen worden toegevoegd:
jail_www_rootdir="/usr/jail/www" # de hoofd directory van de jail jail_www_hostname="www.example.org" # de hostnaam van de jail jail_www_ip="192.168.0.10" # het IP adres van de jail jail_www_devfs_enable="YES" # moet devfs wel of niet gekoppeld worden in de jail jail_www_devfs_ruleset="www_ruleset" # welke devfs ruleset gebruikt moet worden voor de jail
De standaard opstart variabelen in rc.conf(5)
gebruiken het /etc/rc bestand om de jail op te starten,
wat er vanuit gaat dat de jail een compleet virtueel systeem is. Voor service jails
moet het standaard opstart commando worden gewijzigd door het aanpassen van de
jail_jailname_exec_start optie.
Opmerking: Voor een complete lijst van beschikbare opties, zie de rc.conf(5) handleiding.
Het /etc/rc.d/jail bestand kan worden gebruikt om jails handmatig te starten en te stoppen, mits er een overeenkomstige set regels bestaat in /etc/rc.conf.
# /etc/rc.d/jail start www # /etc/rc.d/jail stop www
Er is op dit moment geen nette methode om een jail te stoppen. Dit komt omdat de benodigde applicaties die een nette afsluiting verzorgen, niet beschikbaar zijn in een jail. De beste manier om een jail af te sluiten is door het volgende commando van binnenin de jail uit te voeren of door middel van het jexec(8) commando:
# sh /etc/rc.shutdown
Meer informatie hierover kan gevonden worden in de jail(8) handleiding.
Er zijn meerdere opties beschikbaar die ingesteld kunnen worden voor elke jail, en er zijn meerdere mogelijkheden om een FreeBSD host systeem te combineren met jails om een betere scheiding tussen systeem en applicaties te verkrijgen. Deze sectie leert:
Een aantal opties zijn beschikbaar voor het optimaliseren van het gedrag en beveiligings beperkingen die geïmplementeerd worden in een jail.
Een aantal “high-level” applicaties die gebruikt worden voor het beheren van jails, welke beschikbaar zijn via de FreeBSD Ports Collectie en kunnen gebruikt worden om een complete jail-gebaseerde oplossing te creeëren.
Het goed kunnen optimaliseren van een jail configuratie wordt veelal gedaan door
het instellen van sysctl(8) variabelen.
Er bestaat een speciale subtak van sysctl voor het organiseren van alle
relevante opties: de security.jail.* hierarchie binnen
de FreeBSD kernel. Hieronder staat een lijst van de belangrijkste jail-gerelateerde
sysctl variabelen, met informatie over de standaard waarden. De benaming zou
zelf beschrijvend moeten zijn, maar voor meer informatie kunnen de jail(8) en sysctl(8)
handleidingen geraadpleegd worden.
security.jail.set_hostname_allowed: 1
security.jail.socket_unixiproute_only: 1
security.jail.sysvipc_allowed: 1
security.jail.enforce_statfs: 2
security.jail.allow_raw_sockets: 0
security.jail.chflags_allowed: 0
security.jail.jailed: 0
Deze variabelen kunnen door de systeem beheerder gebruikt worden op het host systeem om limitaties toe te
voegen of te verwijderen, welke standaard opgedwongen worden aan de root gebruiker. Let op, een aantal beperkingen kan niet worden
aangepast. De root gebruiker mag geen bestandssystemen
koppelen of ontkoppelen binnenin een jail(8). De root gebruiker mag ook geen devfs(8) rulesets
laden of ontladen, firewall rules plaatsen of andere taken uitvoeren die vereisen
dat de in-kernel data wordt aangepast, zoals het aanpassen van de securelevel variabele in de kernel.
Het basis systeem van FreeBSD bevat een basis set van applicaties voor het inzien van de actieve jails, en voor het uitvoeren van administratieve commando's in een jail. De jls(8) en jexec(8) commando's zijn onderdeel van het basis systeem en kunnen gebruikt worden voor het uitvoeren van de volgende simpele taken:
Het printen van een lijst van actieve jails met het corresponderende jail ID (JID), IP adres, de hostnaam en het pad.
Het koppelen met een actieve jail vanuit het host systeem, en voor het uitvoeren van administratieve taken in de jail zelf. Dit is bijzonder handig wanneer de root gebruiker een jail netjes wilt afsluiten. Het jexec(8) commando kan ook gebruikt worden om een shell te starten in een jail om daarmee administratieve taken uit te voeren; bijvoorbeeld met:
# jexec 1 tcsh
Tussen de vele software van derde partijen voor jail beheer, is één van de meest complete en bruikbare paketten: sysutils/jailutils. Dit is een set van kleine applicaties, die bijdragen aan jail(8) beheer. Kijk op de web pagina voor meer informatie.
Deze sectie is gebaseerd op een idee van Simon L. Nielsen <simon@FreeBSD.org> op http://simon.nitro.dk/service-jails.html, en een geupdate artikel
door Ken Tom <locals@gmail.com>. Deze sectie illusteert
hoe een FreeBSD systeem opgezet kan worden met een extra laag beveiliging door
gebruik te maken van jail(8). Er wordt
vanuit gegaan dat het betrokken systeem minstens RELENG_6_0 draait en dat de
informatie eerder in dit hoofdstuk goed begrepen is.
Één van de grootste problemen met jails is het beheer van het upgrade proces. Dit is meestal een probleem omdat elke jail vanaf het begin af aan moet worden opgebouwd wanneer er geupdate wordt. Meestal is dit voor een enkele jail geen probleem, omdat het update proces redelijk simpel is, maar het kan een vervelende tijdrovende klus zijn als er meerdere jails zijn.
WaarschuwingDeze opstelling vereist uitgebreide kennis en ervaring van FreeBSD en zijn mogelijkheden. Als onderstaande stappen te lastig lijken te zijn, wordt aangeraden om een simpeler systeem te bekijken zoals sysutils/ezjail, welke een simpele manier geeft voor het beheren van FreeBSD jails en niet zo complex is als deze opstelling.
Het idee werd geopperd om zulke problemen zoveel als mogelijk te voorkomen door zoveel als mogelijk te delen tussen de verschillende jails op een zo veilig mogelijke manier -- door gebruik te maken van alleen-lezen mount_nullfs(8) koppelingen, zodat het upgraden simpeler wordt en het inzetten van jails voor enkele diensten interessanter wordt. Daarnaast geeft het een simpele manier om nieuwe jails toe te voegen of te verwijderen en om deze te upgraden.
Opmerking: Voorbeelden binnen deze context zijn: een HTTP server, een DNS server, een SMTP server enzovoorts.
De doelen van de opstelling zoals beschreven in dit hoofdstuk zijn:
Het creeëren van een simpele en makkelijk te begrijpen jail structuur. Dit impliceert dat er niet elke keer een volledige installworld gedraaid hoeft te worden voor elke jail.
Het makkelijk maken van het aanmaken en verwijderen van jails.
Het makkelijk maken van het updaten en upgraden van bestaande jails.
Het mogelijk maken van het draaien van een eigen gemaakte FreeBSD tak.
Paranoia zijn over beveiliging, zoveel mogelijk beperken, om de kans op inbraak zo klein mogelijk te maken.
Het zoveel mogelijk besparen van ruimte en inodes.
Zoals reeds besproken is dit ontwerp sterk afhankelijk van het hebben van een “master-template”, welke alleen-lezen (beter bekend als nullfs) gekoppeld is binnen elke jail, en een beschrijfbaar apparaat per jail. Een apparaat kan hierin zijn een aparte fysieke schijf, een partitie, of een door vnodes ondersteunde md(4) apparaat. In dit voorbeeld wordt gebruik gemaakt van lezen-schrijven nullfs koppelpunten.
Het gebruikte bestandssysteem wordt beschreven door de volgende lijst:
Elke jail zal gekopeld worden onder de /home/j directory.
/home/j/mroot is de template voor elke jail en tevens de alleen-lezen partitie voor elke jail.
Voor elke jail zal een lege directory structuur gemaakt worden, welke valt onder de /home/j directory.
Elke jail heeft een /s directory, welke gekoppeld zal worden aan het beschrijfbare gedeelte van het systeem.
Elke jail zal zijn eigen beschrijfbaar systeem hebben welke gebaseerd is op /home/j/skel.
Elke jail ruimte (het beschrijfbare gedeelte van de jail), wordt gecreeërd in de /home/js directory.
Opmerking: De voorbeelden gaan er vanuit dat de jails geplaatst worden in /home partitie. Dit kan uiteraard aangepast worden, maar dan moeten de voorbeelden hieronder ook worden aangepast naar de plek die gebruikt zal worden.
Deze sectie leert welke stappen er genomen moeten worden om de master-template te maken. Deze zal het alleen-lezen gedeelte vormen van de jails.
Het is altijd een goed idee om ervoor te zorgen dat het FreeBSD systeem de laatst beschikbare -RELEASE versie draait. Zie het corresponderende hoofdstuk in het Handboek om te lezen hoe dit gedaan wordt. In het geval dat het de moeite niet is om te updaten, zal een buildworld nodig zijn voordat er verder gegaan kan worden. Daarnaast is het sysutils/cpdup pakket benodigd. Er wordt gebruik gemaakt van deportsnap(8) applicatie om de FreeBSD Ports Collectie te downloaden. Het handbook met het hoofdstuk over Portsnap, is een aanrader voor nieuwe gebruikers.
Als eerste moet er een directory structuur gecreeërd worden voor het alleen-lezen bestandssysteem, welke de FreeBSD binaries zal bevatten voor de jails. Daarna wordt het alleen-lezen bestandssysteem geïnstalleerd vanuit de FreeBSD broncode directory in de jail template:
# mkdir /home/j /home/j/mroot # cd /usr/src # make installworld DESTDIR=/home/j/mroot
Hierna moet de FreeBSD Ports Collectie worden voorbereid, evenals de FreeBSD broncode directory, wat voor mergemaster vereist is:
# cd /home/j/mroot # mkdir usr/ports # portsnap -p /home/j/mroot/usr/ports fetch extract # cpdup /usr/src /home/j/mroot/usr/src
Nu moet er een “skelet” gecreeërd worden voor het bechrijfbare gedeelte van het systeem:
# mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles # mv etc /home/j/skel # mv usr/local /home/j/skel/usr-local # mv tmp /home/j/skel # mv var /home/j/skel # mv root /home/j/skel
De mergemaster applictie moet gebruikt worden om de ontbrekende configuratie bestanden te installeren. Erna moeten alle overtollige directories die gecreeërd zijn door mergemaster verwijderd worden:
# mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i # cd /home/j/skel # rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev
Nu moet er een symbolische link gemaakt worden tussen het beschrijfbare bestandssysteem en het alleen-lezen bestandssysteem, zorg ervoor dat de links gemaakt worden in de juiste /s directory. Als hier echte directories worden gemaakt of de directories worden op de verkeerde plak aangemaakt zal dit resulteren in een mislukte installatie:
# cd /home/j/mroot # mkdir s # ln -s s/etc etc # ln -s s/home home # ln -s s/root root # ln -s ../s/usr-local usr/local # ln -s ../s/usr-X11R6 usr/X11R6 # ln -s ../../s/distfiles usr/ports/distfiles # ln -s s/tmp tmp # ln -s s/var var
Als laatste stap moet er een generieke /home/j/skel/etc/make.conf gemaakt worden met de volgende inhoud:
WRKDIRPREFIX?= /s/portbuild
Door het gebruik van WRKDIRPREFIX op deze manier, is het mogelijk om per jail FreeBSD ports te compileren. Onthoud dat de ports directory onderdeel is van het alleen-lezen bestandssysteem. Het eigen pad voor WRKDIRPREFIX maakt het mogelijk dat port builds gedaan worden op het beschrijfbare gedeelte van elke jail.
Nu we een complete FreeBSD template hebben, kunnen we de jails opzetten en configureren in /etc/rc.conf. Dit voorbeeld demonstreert het creeëren van drie jails: “NS”, “MAIL” en “WWW”.
Zet het volgende in /etc/fstab zodat de alleen-lezen template voor de jails en de beschrijfbare partititie beschikbaar zijn in de respectievelijke jails:
/home/j/mroot /home/j/ns nullfs ro 0 0 /home/j/mroot /home/j/mail nullfs ro 0 0 /home/j/mroot /home/j/www nullfs ro 0 0 /home/js/ns /home/j/ns/s nullfs rw 0 0 /home/js/mail /home/j/mail/s nullfs rw 0 0 /home/js/www /home/j/www/s nullfs rw 0 0
Opmerking: Partities die gemarkeerd zijn met een 0 als “passnummer” worden niet gecontroleerd door fsck(8) tijdens het opstarten, en partities met een “dumpnummer” van 0 worden niet gebackupped door dump(8). Het is niet gewenst dat fsck de nullfs koppelingen controleert of dat dump een backup maakt van de alleen-lezen nullfs koppelingen van de jails. Daarom worden ze gemarkeerd met “0 0” in de laatste twee kolommen van elke fstab regel hierboven.
Configureer de jails in /etc/rc.conf:
jail_enable="YES" jail_set_hostname_allow="NO" jail_list="ns mail www" jail_ns_hostname="ns.example.org" jail_ns_ip="192.168.3.17" jail_ns_rootdir="/usr/home/j/ns" jail_ns_devfs_enable="YES" jail_mail_hostname="mail.example.org" jail_mail_ip="192.168.3.18" jail_mail_rootdir="/usr/home/j/mail" jail_mail_devfs_enable="YES" jail_www_hostname="www.example.org" jail_www_ip="62.123.43.14" jail_www_rootdir="/usr/home/j/www" jail_www_devfs_enable="YES"
WaarschuwingDe reden dat de
jail_name_rootdirvariabele verwijst naar de /usr/home directory in plaats van naar /home komt doordat het fysieke pad van de /home directory op een standaard FreeBSD installatie verwijst naar /usr/home. Dejail_name_rootdirvariabele mag niet ingesteld worden op een symbolische link, omdat dan de jail weigert te starten. Gebruik het realpath(1) programma om te zien welke waarde ingesteld moet worden voor deze variabele. Zie de FreeBSD-SA-07:11.jail waarschuwing voor meer informatie.
Creeër de benodigde koppelpunten voor het alleen-lezen bestandssysteem van elke jail:
# mkdir /home/j/ns /home/j/mail /home/j/www
Installeer de beschrijfbare template in elke jail. Let op het gebruik van sysutils/cpdup, wat helpt om een goede kopie te maken in elke directory:
# mkdir /home/js # cpdup /home/j/skel /home/js/ns # cpdup /home/j/skel /home/js/mail # cpdup /home/j/skel /home/js/www
In deze fase zijn de jails gebouwd en voorbereid om op te starten. Koppel eerst de benodigde bestandssystemen voor elke jail, en start ze vervolgens door gebruik te maken van het /etc/rc.d/jail bestand:
# mount -a # /etc/rc.d/jail start
De jails zouden nu gestart moeten zijn. Om te zien of ze correct gestart zijn, wordt het jls(8) programma gebruikt. Het resultaat hiervan ziet er ongeveer als volgend uit:
# jls
JID IP Address Hostname Path
3 192.168.3.17 ns.example.org /home/j/ns
2 192.168.3.18 mail.example.org /home/j/mail
1 62.123.43.14 www.example.org /home/j/www
Op dit moment, zou het mogelijk moeten zijn om op elke jail aan te loggen, nieuwe gebruikers toe te voegen en het configureren van daemons. De JID kolom geeft het identificatie nummer voor elke gestarte jail. Gebruik het volgende commando om administratieve commando's uit te voeren in de jail met het JID 3:
# jexec 3 tcsh
Naarmate de tijd verstrijkt komt de noodzaak om het systeem te updaten naar een nieuwere versie van FreeBSD, danwel vanwege een veiligheids waarschuwing danwel vanwege nieuwe mogelijkheden die geïmplementeerd zijn en nuttig zijn voor de jails. Het ontwerp van deze opzet levert een makkelijke manier voor het upgraden van jails. Daarnaast minimaliseert het de “down-time”, omdat de jails alleen in de allerlaatste minuut uitgeschakeld worden. Het geeft ook de mogelijkheid om terug te keren naar een oudere versie, voor het geval er problemen ontstaan.
De eerste stap is het upgraden van het host systeem zelf, waarna een nieuwe alleen-lezen template gemaakt wordt in /home/j/mroot2.
# mkdir /home/j/mroot2 # cd /usr/src # make installworld DESTDIR=/home/j/mroot2 # cd /home/j/mroot2 # cpdup /usr/src usr/src # mkdir s
Het installworld doel creeërt een aantal onnodige directories, welke verwijderd moeten worden:
# chflags -R 0 var # rm -R etc var root usr/local tmp
Maak opnieuw de beschrijfbare symbolische linken voor het hoofd bestandssysteem:
# ln -s s/etc etc # ln -s s/root root # ln -s s/home home # ln -s ../s/usr-local usr/local # ln -s ../s/usr-X11R6 usr/X11R6 # ln -s s/tmp tmp # ln -s s/var var
Dit is het juiste moment om de jails te stoppen:
# /etc/rc.d/jail stop
Ontkoppel de originele bestandssystemen:
# umount /home/j/ns/s # umount /home/j/ns # umount /home/j/mail/s # umount /home/j/mail # umount /home/j/www/s # umount /home/j/www
Opmerking: Het beschrijfbare gedeelte van de jail is gekoppeld aan het alleen-lezen gedeelte (/s) en moet derhalve eerst ontkoppeld worden.
Verplaatst het oude alleen-lezen systeem en vervang het door de nieuwe systeem. Het oude systeem dient als reservekopie voor het geval er iets misgaat. De naam moet het zelfde zijn als bij de installatie van het nieuwe systeem. Verplaats de FreeBSD Ports Collectie naar het nieuwe bestandssysteem om ruimte en inodes te besparen:
# cd /home/j # mv mroot mroot.20060601 # mv mroot2 mroot # mv mroot.20060601/usr/ports mroot/usr
Op dit moment is het alleen-lezen gedeelte klaar, de enig overgebleven taak is nu om alle bestandssystemen opnieuw te koppelen en om de jails weer op te starten:
# mount -a # /etc/rc.d/jail start
Gebruik het jls(8) programma om te zien of de jails correct zijn opgestart. Vergeet niet om in elke jail het mergemaster programma te starten. Ook moeten de configuratie bestanden en de rc.d scripts geupdate worden.
In FreeBSD 5.X werden nieuwe beveiligingsuitbreidingen geïntroduceerd uit het TrustedBSD project, dat is gebaseerd op de POSIX.1e draft. Twee van de meest significante nieuwe beveiligingsmechanismen zijn faciliteiten voor Toegangscontrolelijsten voor bestandssystemen (ACLs) en Verplichte Toegangscontrole (Mandatory Access Control of MAC). Met Verplichte Toegangscontrole kunnen nieuwe toegangscontrolemodules geladen worden, waarmee nieuw beveiligingsbeleid opgelegd kan worden. Een aantal daarvan bieden beveiliging aan hele kleine onderdelen van het systeem, waardoor een bepaalde dienst weerbaarder wordt. Andere bieden allesomvattende gelabelde beveiliging op alle vlakken en objecten. Het verplichte deel van de definitie komt van het feit dat het opleggen van de controle wordt gedaan door beheerders en het systeem en niet wordt overgelaten aan de nukken van gebruikers, zoals wel wordt gedaan met toegangscontrole naar goeddunken (discretionary access control of DAC, de standaardrechten voor bestanden en System V IPC rechten in FreeBSD).
In dit hoofdstuk wordt de nadruk gelegd op het Verplichte Toegangscontrole Raamwerk (MAC Framework) en een verzameling van te activeren beveiligingsbeleidsmodules waarmee verschillende soorten beveiligingsmechanismen wordt ingeschakeld.
Na het lezen van dit hoofdstuk weet u:
Welke MAC beveiligingsbeleidsmodules op dit moment in FreeBSD beschikbaar zijn en welke mechanismen daarbij horen.
Wat MAC beveiligingsbeleidsmodules implementeren en het verschil tussen gelabeld en niet-gelabeld beleid.
Hoe een systeem efficiënt ingesteld kan worden om met het MAC-raamwerk te werken.
Hoe het beleid van de verschillende beveiligingsbeleidsmodules die in het MAC-raamwerk zitten ingesteld kunnen worden.
Hoe een veiligere omgeving gemaakt kan worden met het MAC-raamwerk en de getoonde voorbeelden;
Hoe de MAC-instellingen getest kunnen worden om er zeker van te zijn dat het raamwerk juist is geïmplementeerd.
Aangeraden voorkennis:
Begrip van UNIX en FreeBSD basiskennis (Hoofdstuk 4);
Bekend zijn met de beginselen van het instellen en compileren van de kernel (Hoofdstuk 9);
Enigszins bekend zijn met beveiliging en wat dat te maken heeft met FreeBSD (Hoofdstuk 15).
WaarschuwingHet verkeerd gebruiken van de informatie die hierin staat kan leiden tot het niet langer toegang hebben tot een systeem, ergernis bij gebruikers, of het niet langer kunnen gebruiken van de mogelijkheden die X11 biedt. Nog belangrijker is dat niet alleen op MAC vertrouwd moet worden voor de beveiliging van een systeem. Het MAC-raamwerk vergroot alleen het bestaande beveiligingsbeleid; zonder goede beveiligingsprocedures en regelmatige beveiligingscontroles is een systeem nooit helemaal veilig.
Het is ook van belang op te merken dat de voorbeelden in dit hoofdstuk alleen voorbeelden zijn. Het is niet aan te raden ze uit te rollen op een productiesysteem. Het implementeren van de verschillende beveiligingsbeleidsmodules dient goed overdacht en getest te worden. Iemand die niet helemaal begrijpt hoe alles werkt, komt er waarschijnlijk achter dat die het complete systeem van voor naar achter en weer terug doorloopt en vele bestanden en mappen opnieuw moet instellen.
In dit hoofdstuk wordt een brede reeks beveiligingsonderwerpen met betrekking tot het MAC-raamwerk behandeld. De ontwikkeling van nieuwe MAC-beveiligingsbeleidsmodules wordt niet behandeld. Een aantal modules die bij het MAC-raamwerk zitten hebben specifieke eigenschappen voor het testen en ontwikkelen van nieuwe modules. Daaronder vallen mac_test(4), mac_stub(4) en mac_none(4). Meer informatie over deze beveiligingsbeleidsmodules en de mogelijkheden die ze bieden staan in de hulppagina's.
Voordat dit hoofdstuk gelezen wordt, moeten er een aantal sleuteltermen toegelicht worden. Hiermee wordt hopelijk mogelijke verwarring en de abrupte introductie van nieuwe termen en informatie voorkomen.
compartiment: een compartiment is een verzameling van programma's en gegevens die gepartitioneerd of gescheiden dient te worden en waartoe gebruikers expliciet toegang moeten krijgen op een systeem. Een compartiment staat ook voor een groep, zoals een werkgroep, afdeling, project, of onderwerp. Door gebruik te maken van compartimenten is het mogelijk om een “need-to-know” beveiligingsbeleid in te stellen.
hoogwatermarkering: Een hoogwatermarkeringsbeleid is een beleid dat toestaat om beveiligingsniveaus te verhogen met het doel informatie dat op een hoger niveau aanwezig is te benaderen. In de meeste gevallen wordt het originele niveau hersteld nadat het proces voltooid is. Momenteel heeft het MAC-raamwerk van FreeBSD hier geen beleid voor, maar de definitie is voor de volledigheid opgenomen.
integriteit: integriteit, als sleutelconcept, is het niveau van vertrouwen dat in gegevens gesteld kan worden. Als de integriteit van gegevens wordt vergroot, dan geldt dat ook voor het vertrouwen dat in die gegevens gesteld kan worden.
label: een label is een beveiligingsattribuut dat toegepast kan worden op bestanden, mappen of andere onderdelen van een systeem. Het kan gezien worden als een vertrouwelijkheidsstempel: als er een label op een bestand is geplaatst, beschrijft dat de beveiligingseigenschappen voor dat specifieke bestand en is daarop alleen toegang voor bestanden, gebruikers, bronnen, enzovoort, met gelijke beveiligingsinstellingen. De betekenis en interpretatie van labelwaarden hangt af van de beleidsinstellingen: hoewel sommige beleidseenheden een label beschouwen als representatie van de integriteit of het geheimhoudingsniveau van een object, kunnen andere beleidseenheden labels gebruiken om regels voor toegang in op te slaan.
niveau: de verhoogde of verlaagde instelling van een beveiligingsattribuut. Met het stijgen van het niveau wordt ook aangenomen dat de veiligheid stijgt.
laagwatermarkering: Een laagwatermarkeringsbeleid is een beleid dat toestaat om de beveiligingsniveaus te verlagen met het doel informatie te benaderen die minder veilig is. In de meeste gevallen wordt het originele beveiligingsniveau van de gebruiker hersteld nadat het proces voltooid is. De enige beveiligingsbeleidsmodule in FreeBSD die dit gebruikt is mac_lomac(4).
meervoudig label: de eigenschap
multilabel is een optie van het bestandssysteem
die in enkelegebruikersmodus met tunefs(8), tijdens het
opstarten via het bestand fstab(5) of tijdens
het maken van een nieuw bestandssysteem ingesteld kan worden. Met deze optie wordt
het voor een beheerder mogelijk om verschillende MAC-labels op verschillende objecten toe te passen. Deze optie
is alleen van toepassing op beveiligingsbeleidsmodules die labels ondersteunen.
object: een object of systeemobject is een entiteit waar informatie doorheen stroomt op aanwijzing van een subject. Hieronder vallen mappen, bestanden, velden, schermen, toetsenborden, geheugen, magnetische opslag, printers en alle andere denkbare apparaten waarmee gegevens kunnen worden vervoerd of kunnen worden opgeslagen. In de basis is een object een opslageenheid voor gegevens of een systeembron; toegang tot een object betekent in feite toegang tot de gegevens.
beleidseenheid: een verzameling van regels die aangeven hoe doelstellingen bereikt moeten worden. In een beleidseenheid staat meestal beschreven hoe bepaalde eenheden behandeld dienen te worden. In dit hoofdstuk wordt de term beleidseenheid in deze context gezien als een beveiligingsbeleidseenheid, wat zoveel wil zeggen als een verzameling regels die bepaalt hoe gegevens en informatie stroomt en aangeeft wie toegang tot welke gegevens en informatie heeft.
gevoeligheid: meestal gebruikt bij het bespreken van MLS. Een gevoeligheidsniveau is een term die gebruikt wordt om te beschrijven hoe belangrijk of geheim de gegevens horen te zijn. Met het stijgen van het gevoeligheidsniveau stijgt ook het belang van de geheimhouding of de vertrouwelijkheid van de gegevens.
enkelvoudig label: een
enkelvoudig label wordt gebruikt als een heel bestandssysteem gebruik maakt
van één label om het toegangsbeleid over de gegevensstromen af te
dwingen. Als dit voor een bestandssysteem is ingesteld, wat geldt als er geen
gebruik gemaakt wordt van de optie multilabel, dan
gehoorzamen alle bestanden aan dezelfde labelinstelling.
subject: een subject is een gegeven actieve entiteit die het stromen van informatie tussen objecten veroorzaakt, bijvoorbeeld een gebruiker, gebruikersprocessor, systeemproces, enzovoort. Op FreeBSD is dit bijna altijd een thread die in een proces namens een gebruiker optreedt.
Met al deze nieuwe termen in gedachten, kan overdacht worden hoe het MAC-raamwerk de complete beveiliging van een systeem kan vergroten. De verschillende beveiligingsbeleidsmodules die het MAC-raamwerk biedt zouden gebruikt kunnen worden om het netwerk en bestandssystemen te beschermen, gebruikers toegang tot bepaalde poorten en sockets kunnen ontzeggen, en nog veel meer. Misschien kunnen de beleidsmodules het beste gebruikt worden door ze samen in te zetten, door meerdere beveiligingsbeleidsmodules te laden om te komen tot een omgeving waarin de beveiliging uit meerdere lagen is opgebouwd. In een omgeving waarin de beveiliging uit meerdere lagen is opgebouwd zijn meerdere beleidsmodules actief om de beveiliging in de hand te houden. Deze aanpak is anders dan een beleid om de beveiliging sec beter te maken, omdat daarmee in het algemeen elementen in een systeem beveiligd worden dat voor een specifiek doel wordt gebruikt. Het enige nadeel is het benodigde beheer in het geval van meervoudige bestandssysteemlabels, het instellen van toegang tot het netwerk per gebruiker, enzovoort.
De nadelen zijn wel minimaal als ze worden vergeleken met het immer durende effect van het raamwerk. Zo zorgt bijvoorbeeld de mogelijkheid om te kiezen welke beleidseenheden voor een specifiek gebruik nodig zijn voor het zo laag mogelijk houden van de beheerslast. Het terugdringen van ondersteuning voor onnodige beleidseenheden kan de beschikbaarheid van systemen verhogen en ook de keuzevrijheid vergroten. Voor een goede implementatie worden alle beveiligingseisen in beschouwing genomen en daarna worden de verschillende beveiligingsbeleidsmodules effectief door het raamwerk geïmplementeerd.
Een systeem dat gebruik maakt van de mogelijkheden van MAC dient dus tenminste de garantie te bieden dat een gebruiker niet de mogelijkheid heeft naar eigen inzicht beveiligingsattributen te wijzigen. Alle gebruikersprogramma's en scripts moeten werken binnen de beperkingen die de toegangsregels voorschrijven volgens de geselecteerde beveiligingsbeleidsmodules. Het voorgaande impliceert ook dat de volledige controle over de MAC-toegangsregels bij de systeembeheerder ligt.
Het is de taak van de systeembeheerder om zorgvuldig de juiste beveiligingsbeleidsmodules te kiezen. Voor sommige omgevingen kan het nodig zijn dat de toegang tot het netwerk wordt beperkt. In dat soort gevallen zijn de beleidsmodules mac_portacl(4), mac_ifoff(4) en zelfs mac_biba(4) goede startpunten. In andere gevallen kan de strikte vertrouwelijkheid van bestandssysteemobjecten van belang zijn. Dan zijn beleidsmodules zoals mac_bsdextended(4) en mac_mls(4) voor dit doel gemaakt.
Beslissingen over beleid zouden gemaakt kunnen worden op basis van het netwerkontwerp. Wellicht wordt alleen bepaalde gebruikers toegestaan gebruik te maken van de mogelijkheden van ssh(1) om toegang te krijgen tot het netwerk of Internet. In dat geval is de juiste beleidsmodule mac_portacl(4). Maar wat te doen voor bestandssystemen? Moet alle toegang tot bepaalde mappen worden afgesneden van andere gebruikersgroepen of specifieke gebruikers, of moeten de toegang voor gebruikers of programma's tot bepaalde bestanden worden ingesteld door bepaalde objecten als geheim te bestempelen?
In het geval van het bestandssysteem, kan ervoor gekozen worden om de toegang voor sommige objecten voor bepaalde gebruikers als geheim te bestempelen, maar voor andere niet. Bijvoorbeeld: een groot ontwikkelteam wordt opgedeeld in kleinere eenheden van individuen. Ontwikkelaars in project A horen geen toegang te hebben tot objecten die zijn geschreven door ontwikkelaars in project B. Maar misschien moeten ze wel toegang hebben tot objecten die zijn geschreven door ontwikkelaars in project C. Dat is nogal wat. Door gebruik te maken van de verschillende beveiligingsbeleidsmodules in het MAC-raamwerk kunnen gebruikers in hun groepen worden opgedeeld en kan ze toegang gegeven worden tot de juiste locaties zonder dat er angst hoeft te zijn voor het lekken van informatie.
Zo heeft dus iedere beveiligingsbeleidsmodule een unieke wijze om om te gaan met de totale beveiliging van een systeem. Het kiezen van modules hoort gebaseerd te zijn op een zorgvuldig uitgedacht beveiligingsbeleid. In veel gevallen wordt het totale beveiligingsbeleid aangepast en opnieuw toegepast op het systeem. Een goed begrip van de verschillende beveiligingsbeleidsmodules die het MAC-raamwerk biedt helpt beheerders bij het kiezen van de juiste beleidseenheden voor hun situatie.
De standaard FreeBSD-kernel kent geen ondersteuning voor het MAC-raamwerk en daarom dient de volgende kerneloptie toegevoegd te worden voordat op basis van de voorbeelden of informatie uit dit hoofdstuk wijzigen worden gemaakt:
options MAC
Hierna dient de kernel herbouwd en opnieuw geïnstalleerd te worden.
Let opHoewel in de verschillende hulppagina's voor MAC-beleidsmodules staat dat ze in de kernel gebouwd kunnen worden, is het mogelijk het systeem van het netwerk af te sluiten en meer. Het implementeren van MAC is net zoiets als het implementeren van een firewall en er moet opgepast worden dat een systeem niet totaal op slot gaat. Er dient rekening gehouden te worden met het teruggaan naar een vorige instelling en het op afstand implementeren van MAC dient bijzonder voorzichtig te gebeuren.
Een MAC-label is een beveiligingsattribuut dat toegepast kan worden op subjecten en objecten die door het systeem gaan.
Bij het instellen van een label moet de gebruiker in staat zijn om precies te begrijpen wat er gebeurt. De attributen die voor een object beschikbaar zijn hangen af van de geladen beleidsmodule en die interpreteren hun attributen op nogal verschillende manieren. Het resultaat kan resulteren in onverwacht en wellicht ongewenst gedrag van een systeem als het beleid door een gebrek aan begrip verkeerd is ingesteld.
Het beveiligingslabel op een object wordt gebruikt als onderdeel van een beveiligingstoegangscontrolebeslissing door een beleidseenheid. Voor sommige beleidseenheden bevat het label zelf alle informatie die nodig is voor het maken van een beslissing; in andere modellen kunnen de labels als onderdeel van een grotere verzameling verwerkt worden, enzovoort.
Zo staat bijvoorbeeld het instellen van het label biba/low op een bestand voor een label dat wordt beheerd door de beveiligingsbeleidsmodule Biba, met een waarde van “low”.
Een aantal beleidsmodules die in FreeBSD de mogelijkheid voor labelen ondersteunen, bieden drie specifieke voorgedefinieerde labels: low, high en equal. Hoewel ze in verschillende beleidsmodules op een andere manier toegangscontrole afdwingen, is er de garantie dat het label low de laagst mogelijke instelling is, het label equal het subject of object uitschakelt of ongemoeid laat en het label high de hoogst mogelijk instelling afdwingt die beschikbaar is in de beleidsmodules Biba en MLS.
Binnen een bestandssysteemomgeving met een enkelvoudig label kan er maar
één label gebruikt worden op objecten. Hiermee wordt een verzameling van
toegangsrechten op het hele systeem opgelegd en dat is voor veel omgevingen voldoende. Er
zijn echter een aantal gevallen waarin het wenselijk is meervoudige labels in te stellen
op subjecten of objecten in het bestandssysteem. In die gevallen kan de optie multilabel meegegeven worden aan tunefs(8).
In het geval van Biba en MLS kan er een numeriek label gezet worden om het precieze niveau van de hiërarchische controle aan te geven. Dit numerieke niveau wordt gebruikt om informatie in verschillende groepen te partitioneren of te sorteren voor het classificeren voor het geven van toegang voor een bepaalde groep of een groep van een hoger niveau.
In de meeste gevallen stelt een beheerder alleen maar een enkelvoudig label in dat door het hele bestandssysteem wordt gebruikt.
Wacht eens, dat klinkt net als DAC! MAC gaf de controle toch strikt aan de beheerder? Dat klopt nog steeds, root heeft nog steeds de controle in handen en is degene die het beleid instelt zodat gebruikers in de juiste categorie en/of toegangsniveaus worden geplaatst. Daarnaast kunnen veel beleidsmodules ook de gebruiker root beperkingen opleggen. Dan wordt de controle overgedragen aan een groep, maar kan root de instellingen op ieder gewenst moment intrekken of wijzigen. Dit is het hiërarchische of toegangsmodel dat wordt afgedekt door beleidseenheden zoals Biba en MLS.
Vrijwel alle aspecten voor het instellen van labelbeleid worden uitgevoerd met basissysteemprogramma's. Die commando's bieden een eenvoudige interface voor object- of subjectinstellingen of de manipulatie en verificatie van de instellingen.
Alle instellingen kunnen gemaakt worden met de hulpprogramma's setfmac(8) en setpmac(8). Het commando setfmac wordt gebruikt om MAC labels op systeemobjecten in te stellen en setpmac voor het instellen van de labels op systeemsubjecten:
# setfmac biba/high test
Als het bovenstaande commando geen foutmeldingen heeft veroorzaakt, dan komt er een prompt terug. Deze commando's geven nooit uitvoer, tenzij er een fout is opgetreden; net als bij de commando's chmod(1) en chown(8). In sommige gevallen kan de foutmelding “Permission denied” zijn en deze treedt meestal op als het label wordt ingesteld of gewijzigd op een object dat is beperkt. [9] De systeembeheerder kan de volgende commando's gebruiken om dit probleem te voorkomen:
# setfmac biba/high test “Permission denied” # setpmac biba/low setfmac biba/high test # getfmac test test: biba/high
Hierboven is te zien dat setpmac gebruikt kan worden om
aan de instellingen van een beleidsmodules voorbij te gaan door een ander label toe
te wijzen aan het aangeroepen proces. Het hulpprogramma getpmac wordt meestal toegepast op processen die al draaien,
zoals sendmail: hoewel er een proces-ID nodig is in
plaats van een commando, is de logica gelijk. Als gebruikers proberen een bestand te
manipuleren waar ze geen toegang tot hebben, onderhevig aan de regels van de geladen
beleidsmodules, dan wordt de foutmelding “Operation
not permitted” weergegeven door de functie mac_set_link.
Met de beleidsmodules mac_biba(4), mac_mls(4) en mac_lomac(4) is het mogelijk eenvoudige labels toe te wijzen. Die kunnen hoog, gelijk aan en laag zijn. Hieronder een beschrijving van wat die labels betekenen:
Het label low is de laagst mogelijke labelinstelling die een object of subject kan hebben. Deze instelling op objecten of subjecten blokkeert hun toegang tot objecten of subjecten met de markering hoog.
Het label equal hoort alleen ingesteld te worden op objecten die uitgesloten moeten worden van een beleidsinstelling.
Het label high geeft een object of subject de hoogst mogelijke instelling.
Afhankelijke van iedere beleidsmodule heeft iedere instelling een ander informatiestroomdirectief tot gevolg. Het lezen van de hulppagina's die van toepassing zijn geeft inzicht in de precieze eigenschappen van de standaard labelinstellingen.
Dit zijn de labels met numerieke graden die gebruikt worden voor vergelijking:afdeling+afdeling.
biba/10:2+3+6(5:2+3-20:2+3+4+5+6)
Het bovenstaande kan dus geïnterpreteerd worden als:
“Biba-beleidslabel”/“Graad 10”:“Afdelingen 2, 3 en 6”: (“graad 5 ...”)
In dit voorbeeld is de eerste graad de “effectieve graad” met de “effectieve afdelingen”, de tweede graad is de lage graad en de laatste is de hoge graad. In de meeste instellingen worden deze instellingen niet gebruikt. Ze zijn inderdaad instellingen voor gevorderden.
Als ze worden toegepast op systeemobjecten, hebben ze alleen een huidige graad/afdeling in vergelijking met systeemsubjecten, omdat ze de reikwijdte van rechten in het systeem en op netwerkinterfaces aangeven, waar ze gebruikt worden voor toegangscontrole.
De graad en afdelingen in een subject en object paar wordt gebruikt om een relatie te construeren die “dominantie” heet, waar een subject een object domineert, geen van beiden domineert, of beiden elkaar domineren. Het geval “beiden domineren” komt voor als de twee labels gelijk zijn. Vanwege de natuur van de informatiestroom van Biba, heeft een gebruiker rechten op een verzameling van afdelingen, “need to know”, die overeen zouden kunnen komen met projecten, maar objecten hebben ook een verzameling van afdelingen. Gebruikers dienen wellicht hun rechten onder te verdelen met su of setpmac om toegang te krijgen tot objecten in een afdeling die geen verboden terrein voor ze zijn.
Gebruikers moeten zelf labels hebben, zodat hun bestanden en processen juist kunnen samenwerken met het beveiligingsbeleid dat op een systeem is ingesteld. Dit wordt ingesteld via het bestand login.conf door gebruik te maken van aanmeldklassen. Iedere beleidsmodule die labels gebruikt implementeert ook de instelling van de gebruikersklasse.
Een voorbeeld dat iedere instelling uit de beleidsmodule bevat is hieronder te zien:
default:\
:copyright=/etc/COPYRIGHT:\
:welcome=/etc/motd:\
:setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\
:path=~/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:\
:manpath=/usr/share/man /usr/local/man:\
:nologin=/usr/sbin/nologin:\
:cputime=1h30m:\
:datasize=8M:\
:vmemoryuse=100M:\
:stacksize=2M:\
:memorylocked=4M:\
:memoryuse=8M:\
:filesize=8M:\
:coredumpsize=8M:\
:openfiles=24:\
:maxproc=32:\
:priority=0:\
:requirehome:\
:passwordtime=91d:\
:umask=022:\
:ignoretime@:\
:label=partition/13,mls/5,biba/10(5-15),lomac/10[2]:
De optie label wordt gebruikt om het standaardlabel voor aanmeldklasse in te stellen dat door MAC wordt afgedwongen. Het wordt gebruikers nooit toegestaan deze waarde te wijzigen, dus kan het gezien worden als niet optioneel vanuit het perspectief van de gebruiker. In de echte wereld besluit een beheerder echter nooit iedere beleidsmodule te activeren. Het wordt sterk aangeraden de rest van die hoofdstuk te lezen alvorens (een deel van) de bovenstaande instellingen te implementeren.
Opmerking: Gebruikers kunnen hun label wijzigen na het initiële aanmelden, maar dit is wel afhankelijk van de beperkingen van een beleidsinstelling. Het bovenstaande voorbeeld vertelt de beleidseenheid Biba dat de minimale integriteit van een proces 5 en het maximum 15, maar dat het effectieve label standaard 10 is. Het proces draait op niveau 10, totdat het proces het label wijzigt, misschien door een gebruiker die setpmac gebruikt, bij het aanmelden beperkt tot de door Biba ingestelde reeks.
In alle gevallen dient de database met aanmeldklassemogelijkheden opnieuw gebouwd te worden met cap_mkdb na het wijzigen van login.conf. Dit wordt ook in alle komende voorbeelden en beschrijvingen gedaan.
Het is belangrijk op te merken dat in veel gevallen sites te maken hebben met bijzonder grote aantallen gebruikers waardoor er een aantal verschillende aanmeldklassen nodig zijn. Het is dan nodig gedetailleerd te plannen omdat dit anders bijzonder complex wordt om te onderhouden.
Labels kunnen ook ingesteld worden op netwerkinterfaces om te assisteren bij het controleren van het stromen van gegevens over het netwerk. In alle gevallen werken ze op dezelfde wijze als het beleid werkt ten aanzien van objecten. Gebruikers met bijvoorbeeld een hoge instelling in biba krijgen geen toegang tot interfaces met een laag label.
Het maclabel kan meegegeven worden aan ifconfig als het MAC-label op netwerkinterfaces wordt ingesteld:
# ifconfig bge0 maclabel biba/equal
In het bovenstaande voorbeeld wordt het MAC-label biba/equal ingesteld op de interface bge(4). Als er een instelling wordt gebruikt die gelijkvormig is aan biba/high(low-high), dan moet het volledige label worden ingegeven, anders treedt er een fout op.
Iedere beleidsmodule die labels ondersteunt een instelling waarmee het MAC-label op netwerkinterfaces kan worden
uitgeschakeld. Het label instellen op equal heeft
hetzelfde effect. Deze instellingen zijn na te kijken in de uitvoer van sysctl, de hulppagina van het beleid en zelfs later in dit
hoofdstuk.
Standaard gebruikt een systeem de optie singlelabel.
Wat betekent dit voor een beheerder? Er zijn een aantal verschillen die allemaal hun
eigen voor- en nadelen hebben voor de flexibiliteit in het beveiligingsmodel
voor een systeem.
Bij gebruik van singlelabel kan er maar
één label, bijvoorbeeld biba/high,
gebruikt worden voor ieder subject of object. Hierdoor is er minder beheer nodig,
maar de flexibiliteit voor beleid dat labels ondersteunt daalt erdoor. Veel
beheerders willen de optie multilabel gebruiken in hun
beveiligingsmodel.
De optie multilabel staat ieder subject of object toe
om zijn eigen onafhankelijke MAC-label
te hebben in plaats van de standaardoptie singlelabel,
die maar één label toestaat op een hele partitie. De labelopties
multilabel en single zijn
alleen verplicht voor de beleidseenheden die de mogelijkheid bieden om te labelen,
waaronder de beleidsmogelijkheden van Biba, Lomac, MLS en SEBSD.
In veel gevallen hoeft multilabel niet eens ingesteld
te worden. Stel er is de volgende situatie en beveiligingsmodel:
FreeBSD-webserver die gebruik maakt van het MAC-raamwerk en een mengeling van verschillende beleidseenheden.
De webserver heeft maar één label nodig, biba/high, voor alles in het systeem. Hier is de optie multilabel voor het bestandssysteem niet nodig, omdat een
enkelvoudig label altijd van toepassing is.
Maar omdat de machine als webserver dienst gaat doen, dient de webserver te draaien als biba/low om administratiemogelijkheden te voorkomen. Later wordt beschreven hoe de beleidseenheid Biba werkt, dus als de voorgaande opmerking wat lastig te begrijpen is, lees dan verder en kom later nog een keer terug. De server zou een aparte partitie kunnen gebruiken waarop biba/low van toepassing kan zijn voor de meeste, zo niet alle, runtime-statussen. Er ontbreekt veel in dit voorbeeld, bijvoorbeeld de restricties op gegevens en (gebruikers)instellingen. Dit was slechts een snel voorbeeld om de hiervoor aangehaalde stelling te ondersteunen.
Als er een niet-labelende beleidseenheid wordt gebruikt, dan is de optie multilabel nooit verplicht. Hieronder vallen de
beleidseenheden seeotheruids, portacl en partition.
Bij gebruik van multilabel voor een partitie en het
neerzetten van een beveiligingsmodel gebaseerd op multilabel functionaliteit gaat de deur open voor hogere
administratieve rompslomp, omdat alles in een bestandssysteem een label krijgt.
Hieronder vallen mappen, bestanden en zelfs apparaatknooppunten.
Het volgende commando stelt multilabel in op de
bestandssystemen om meerdere labels te kunnen krijgen. Dit kan alleen uitgevoerd
worden in enkele gebruikersmodus:
# tunefs -l enable /
Dit is geen criterium voor het wisselbestandssysteem.
Opmerking: Sommige gebruikers hebben problemen ondervonden met het instellen van de vlag
multilabelop de rootpartitie. Als dit het geval is, kijk dan naar Paragraaf 17.17 van dit hoofdstuk.
Wanneer een nieuwe technologie wordt geïmplementeerd is een planningsfase altijd een goed idee. Tijdens de planningsfases zou een beheerder in het algemeen naar de “big picture” moeten kijken, en daarbij minstens het volgende in de gaten proberen te houden:
De implementatiebenodigdheden;
De implementatiedoelen;
Voor MAC-installaties houden deze in:
Hoe de beschikbare informatie en bronnen die op het doelsysteem aanwezig zijn te classificeren.
Voor wat voor soort informatie of bronnen de toegang te beperken samen met het type van de beperkingen die dienen te worden toegepast.
Welke MAC-module(s) nodig zullen zijn om dit doel te bereiken.
Het is altijd mogelijk om de systeembronnen en de beveiligingsinstellingen te veranderen en te herconfigureren, het komt vaak erg ongelegen om het systeem te doorzoeken en bestaande bestanden en gebruikersaccounts te repareren. Plannen helpt om zeker te zijn van een probleemloze en efficiënte systeemimplementatie. Het is vaak vitaal en zeker in uw voordeel om een proefronde van het vertrouwde systeem, inclusief de configuratie, te draaien vóórdat een MAC-implementatie wordt gebruikt op productiesystemen. Het idee om een systeem met MAC gewoon los te laten is als het plannen van mislukkingen.
Verschillende omgevingen kunnen verschillende behoeften en benodigdheden nodig hebben. Het opzetten van een diepgaand en compleet beveiligingsprofiel zal de noodzaak van verandering verminderen wanneer het systeem in gebruik wordt genomen. Zodoende zullen de toekomstige secties de verschillende modules die beschikbaar zijn voor beheerders behandelen; hun gebruik en configuratie beschrijven; en in sommige gevallen inzicht bieden in welke situaties ze het beste tot hun recht komen. Een webserver bijvoorbeeld zou de beleiden mac_biba(4) en mac_bsdextended(4) in gebruik nemen. In andere gevallen kan voor een machine met erg weinig lokale gebruikers mac_partition(4) een goede keuze zijn.
Iedere module uit het MAC-raamwerk kan zoals zojuist aangegeven in de kernel worden gecompileerd of als runtime-kernelmodule geladen worden. De geadviseerde methode is de naam van een module toevoegen aan het bestand /boot/loader.conf zodat die wordt geladen tijdens de eerste fase van het starten van een systeem.
In de volgende onderdelen worden de verschillende MAC-modules en hun mogelijkheden beschreven. De implementatie in een
specifieke omgeving wordt ook in dit hoofdstuk beschreven. Een aantal modules ondersteunt
het gebruik van labelen, wat het beperken van toegang is door een label als “dit is
toegestaan en dat niet” af te dwingen. Een labelinstellingenbestand kan bepalen hoe
bestanden kunnen worden benaderd, hoe netwerkcommunicatie wordt uitgewisseld, en meer. In
het vorige onderdeel is beschreven hoe de vlag multilabel
ingesteld kon worden op bestandssystemen om per bestand of per partitie toegangscontrole
in te schakelen.
Een instelling met een enkelvoudig label zou maar één label over een
heel systeem afdwingen, daarom wordt de optie tunefs multilabel genoemd.
Modulenaam: mac_seeotheruids.ko
Kernelinstelling: options MAC_SEEOTHERUIDS
Opstartoptie: mac_seeotheruids_load="YES"
De module mac_seeotheruids(4) imiteert de sysctl-tunables security.bsd.see_other_uids en security.bsd.see_other_gids en breidt deze uit. Voor deze optie hoeven geen labels ingesteld te worden voor de instelling en hij werkt transparant met de andere modules.
Na het laden van de module kunnen de volgende sysctl-tunables gebruikt worden om de opties te beheren:
security.mac.seeotheruids.enabled schakelt de opties van de module in en gebruikt de standaardinstellingen. Deze standaardinstellingen ontzeggen gebruikt de mogelijkheid processen en sockets te zien die eigendom zijn van andere gebruikers.
security.mac.seeotheruids.specificgid_enabled staat toe dat een bepaalde groep niet onder dit beleid valt. Om bepaalde groepen van dit beleid uit te sluiten, kan de sysctl-tunable security.mac.seeotheruids.specificgid=XXX gebruikt worden. In het bovenstaande voorbeeld dient XXX vervangen te worden door het numerieke ID van een groep die uitgesloten moet worden van de beleidsinstelling.
security.mac.seeotheruids.primarygroup_enabled wordt gebruikt om specifieke primaire groepen uit te sluiten van dit beleid. Als deze tunable wordt gebruikt, mag security.mac.seeotheruids.specificgid_enabled niet gebruikt worden.
Modulenaam: mac_bsdextended.ko
Kernelinstelling: options MAC_BSDEXTENDED
Opstartoptie: mac_bsdextended_load="YES"
De module mac_bsdextended(4) dwingt de bestandssysteemfirewall af. Het beleid van deze module biedt een uitbreiding van het standaard rechtenmodel voor bestandssystemen, waardoor een beheerder een firewallachtige verzameling met regels kan maken om bestanden, programma's en mappen in de bestandssysteemhiërarchie te beschermen. Wanneer geprobeerd wordt om toegang tot een object in het bestandssysteem te krijgen, wordt de lijst met regels afgelopen totdat er òf een overeenkomstige regel is gevonden òf het einde van de lijst is bereikt. Dit gedrag kan veranderd worden door het gebruik van de sysctl(8)-parameter security.mac.bsdextended.firstmatch_enabled. Net zoals andere firewall-modules in FreeBSD kan een bestand dat regels voor toegangscontrole bevat tijdens het opstarten door het systeem worden aangemaakt en gelezen door een rc.conf(5)-variabele te gebruiken.
De lijst met regels kan ingevoerd worden met het hulpprogramma ugidfw(8), dat een syntaxis heeft die lijkt op die van ipfw(8). Meer hulpprogramma's kunnen geschreven worden met de functies in de bibliotheek libugidfw(3).
Bij het werken met deze module dient bijzondere voorzichtigheid in acht te worden genomen. Verkeerd gebruik kan toegang tot bepaalde delen van het bestandssysteem blokkeren.
Nadat de module mac_bsdextended(4) is geladen, kan met het volgende commando de huidige regels getoond worden:
# ugidfw list 0 slots, 0 rules
Zoals verwacht zijn er geen regels ingesteld. Dit betekent dat alles nog steeds volledig toegankelijk is. Om een regel te maken die alle toegang voor alle gebruikers behalve root ontzegt:
# ugidfw add subject not uid root new object not uid root mode n
Dit is een slecht idee, omdat het voorkomt dat alle gebruikers ook maar het meest eenvoudige commando kunnen uitvoeren, zoals ls. Een betere lijst met regels zou kunnen zijn:
# ugidfw set 2 subject uid gebruiker1 object uid gebruiker2 mode n # ugidfw set 3 subject uid gebruiker1 object gid gebruiker2 mode n
Hiermee wordt alle toegang, inclusief het tonen van mapinhoud, tot de thuismap van gebruiker2 ontzegd voor de gebruikersnaam gebruiker1.
In plaats van gebruiker1, zou not
uid gebruiker2 kunnen worden opgegeven.
Hierdoor worden dezelfde restricties als hierboven actief voor alle gebruikers in
plaats van voor slechts één gebruiker.
Opmerking: De gebruiker root blijft onaangetast door deze wijzigingen.
Met deze informatie zou een basisbegrip moeten zijn ontstaan over hoe de module mac_bsdextended(4) gebruikt kan worden om een bestandssysteem te beschermen. Meer informatie staat in de hulppagina's van mac_bsdextended(4) en ugidfw(8).
Modulenaam: mac_ifoff.ko
Kernelinstelling: options MAC_IFOFF
Opstartoptie: mac_ifoff_load="YES"
De module mac_ifoff(4) bestaat alleen om netwerkinterfaces tijdens het draaien uit te schakelen en om te verhinderen dat netwerkinterfaces tijdens het initiële opstarten worden geactiveerd. Er hoeven geen labels ingesteld te worden, noch is deze module afhankelijk van andere MAC-modules.
Het meeste beheer wordt gedaan met de sysctl-tunables die hieronder zijn vermeld.
security.mac.ifoff.lo_enabled schakelt alle verkeer op het teruglusinterface (lo(4)) in of uit.
security.mac.ifoff.bpfrecv_enabled schakelt alle verkeer op het Berkeley Packet Filterinterface (bpf(4)) in of uit.
security.mac.ifoff.other_enabled schakelt alle verkeer op alle andere interfaces in of uit.
mac_ifoff(4) wordt het meest gebruikt om netwerken te monitoren in een omgeving waar netwerkverkeer niet toegestaan zou moeten zijn tijdens het opstarten. Een ander voorgesteld gebruik zou het schrijven van een script zijn dat security/aide gebruikt om automatisch netwerkverkeer te blokkeren wanneer het nieuwe of veranderde bestanden in beschermde mappen vindt.
Modulenaam: mac_portacl.ko
Kernelinstelling: MAC_PORTACL
Opstartoptie: mac_portacl_load="YES"
De module mac_portacl(4) wordt gebruikt om het binden aan lokale TCP- en UDP-poorten te begrenzen door een waaier aan sysctl-variabelen te gebruiken. In essentie maakt mac_portacl(4) het mogelijk om niet-root-gebruikers in staat te stellen om aan gespecificeerde geprivilegieerde poorten te binden, dus poorten lager dan 1024.
Eenmaal geladen zal deze module het MAC-beleid op alle sockets aanzetten. De volgende tunables zijn beschikbaar:
security.mac.portacl.enabled schakelt het beleid volledig in of uit.
security.mac.portacl.port_high stelt het hoogste poortnummer in waarvoor mac_portacl(4) bescherming biedt.
security.mac.portacl.suser_exempt sluit de gebruiker root uit van dit beleid wanneer het op een waarde anders dan nul wordt ingesteld.
security.mac.portacl.rules specificeert het eigenlijke beleid van mac_portacl; zie onder.
Het eigenlijke beleid van mac_portacl, zoals gespecificeerd
in de sysctl security.mac.portacl.rules, is een tekststring van
de vorm: regel[,regel,...] met zoveel regels als nodig. Elke
regel heeft de vorm: idtype:id:protocol:poort. De parameter
idtype kan uid of gid zijn en wordt gebruikt om de parameter id als respectievelijk een gebruikers-id of groeps-id te
interpreteren. De parameter protocol wordt gebruikt om te
bepalen of de regel op TCP of UDP moet worden toegepast door de parameter op tcp of udp in te stellen. De laatste
parameter poort is het poortnummer waaraan de
gespecificeerde gebruiker of groep zich mag binden.
Opmerking: Aangezien de regelverzameling direct door de kernel wordt geïnterpreteerd kunnen alleen numerieke waarden voor de parameters voor de gebruikers-ID, groeps-ID, en de poort gebruikt worden. Voor gebruikers, groepen, en poortdiensten kunnen dus geen namen gebruikt worden.
Standaard kunnen op UNIX-achtige systemen poorten lager dan 1024 alleen aan geprivilegieerde processen gebonden worden, dus diegenen die als root draaien. Om mac_portacl(4) toe te laten staan om ongeprivilegieerde processen aan poorten lager dan 1024 te laten binden moet deze standaard UNIX-beperking uitgezet worden. Dit kan bereikt worden door de sysctl(8)-variabelen net.inet.ip.portange.reservedlow en net.inet.ip.portrange.reservedhigh op nul te zetten.
Zie de onderstaande voorbeelden of bekijk de handleidingpagina voor mac_portacl(4) voor meer informatie.
De volgende voorbeelden zouden de bovenstaande discussie wat moeten toelichten:
# sysctl security.mac.portacl.port_high=1023 # sysctl net.inet.ip.portrange.reservedlow=0 net.inet.ip.portrange.reservedhigh=0
Eerst wordt mac_portacl(4) ingesteld om de standaard geprivilegieerde poorten te dekken en worden de normale bindbeperkingen van UNIX uitgeschakeld.
# sysctl security.mac.portacl.suser_exempt=1
De gebruiker root zou niet beperkt moeten worden door dit beleid, stel security.mac.portacl.suser_exempt dus in op een waarde anders dan nul. De module mac_portacl(4) is nu ingesteld om zich op de zelfde manier te gedragen als UNIX-achtige systemen zich standaard gedragen.
# sysctl security.mac.portacl.rules=uid:80:tcp:80
Sta de gebruiker met UID 80 (normaliter de gebruiker www) toe om zich aan poort 80 te binden. Dit kan gebruikt worden om de gebruiker www toe te staan een webserver te draaien zonder ooit root-rechten te hebben.
# sysctl security.mac.portacl.rules=uid:1001:tcp:110,uid:1001:tcp:995
Sta de gebruiker met UID 1001 om zich aan de TCP-poorten 110 (“pop3”) en 995 (“pop3s”) te binden. Dit staat deze gebruiker toe om een server te starten die verbindingen accepteert op poorten 110 en 995.
Modulenaam: mac_partition.ko
Kernelinstelling: options MAC_PARTITION
Opstartoptie: mac_partition_load="YES"
Het beleid mac_partition(4) plaatst processen in specifieke “partities” gebaseerd op hun MAC-label. Zie dit als een speciaal soort jail(8), hoewel dit nauwelijks een waardige vergelijking is.
Dit is één module die aan het bestand loader.conf(5) dient te worden toegevoegd zodat het het beleid tijdens het opstartproces laadt en aanzet.
De meeste configuratie van dit beleid wordt gedaan met het gereedschap setpmac(8), wat hieronder zal worden uitgelegd. De volgende sysctl-tunable is beschikbaar voor dit beleid:
security.mac.partition.enabled zet het afdwingen van MAC-procespartities aan.
Wanneer dit beleid aanstaat, mogen gebruikers alleen hun eigen processen zien, en elke andere in hun partitie, maar mogen niet met gereedschappen buiten deze partitie werken. Bijvoorbeeld, een gebruiker in de klasse insecure heeft geen toegang tot het commando top noch tot vele andere commando's die een proces moeten draaien.
Gebruik het gereedschap setpmac om gereedschappen in te stellen of ze in een partitielabel te plaatsen:
# setpmac partition/13 top
Dit zal het commando top toevoegen aan het label dat voor gebruikers in de klasse insecure gebruikt wordt. Merk op dat alle processen gestart door gebruikers in de klasse insecure in het label partition/13 zullen blijven.
Het volgende commando laat de partitielabel en de proceslijst zien:
# ps Zax
Het volgende commando staat toe om het procespartitielabel van een andere gebruiker en de momenteel draaiende processen van die gebruiker te zien:
# ps -ZU trhodes
Opmerking: Gebruikers kunnen processen in het label van root zien tenzij het beleid mac_seeotheruids(4) is geladen.
Een echte vakmansimplementatie zou alle diensten in /etc/rc.conf uitzetten en deze door een script met de juiste labeling laten starten.
Opmerking: De volgende beleiden ondersteunen integerinstellingen in plaats van de drie standaardlabels die aangeboden worden. Deze opties, inclusief hun beperkingen, worden verder uitgelegd in de handleidingpagina's van de modules.
Modulenaam: mac_mls.ko
Kernelinstelling: options MAC_MLS
Opstartoptie: mac_mls_load="YES"
Het beleid mac_mls(4) beheert toegang tussen subjecten en objecten in het systeem door een strikt beleid voor informatiestromen af te dwingen.
In MLS-omgevingen wordt een “toestemming”-niveau ingesteld in het label van elk subject of object, samen met compartimenten. Aangezien deze toestemmings- of zinnigheidsniveaus getallen groter dan zesduizend kunnen bereiken; zou het voor elke systeembeheerder een afschrikwekkende taak zijn om elk subject of object grondig te configureren. Gelukkig worden er al drie “kant-en-klare” bij dit beleid geleverd.
Deze labels zijn mls/low, mls/equal en mls/high. Aangezien deze labels uitgebreid in de handleidingpagina worden beschreven, worden ze hier slechts kort beschreven:
Het label mls/low bevat een lage configuratie welke het toestaat om door alle andere objecten te worden gedomineerd. Alles dat met mls/low is gelabeld heeft een laag toestemmingsniveau en heeft geen toegang tot informatie van een hoger niveau. Ook voorkomt dit label dat objecten van een hoger toestemmingsniveau informatie naar hen schrijven of aan hen doorgeven.
Het label mls/equal dient geplaatst te worden op objecten die geacht te zijn uitgesloten van het beleid.
Het label mls/high is het hoogst mogelijke toestemmingsniveau. Objecten waaraan dit label is toegekend zijn dominant over alle andere objecten in het systeem; ze mogen echter geen informatie lekken naar objecten van een lagere klasse.
MLS biedt:
Een hiërarchisch beveiligingsniveau met een verzameling niet-hiërarchische categoriën;
Vaste regels: niet naar boven lezen, niet naar beneden schrijven (een subject kan leestoegang hebben naar objecten op zijn eigen niveau of daaronder, maar niet daarboven. Evenzo kan een subject schrijftoegang hebben naar objecten op zijn eigen niveau of daarboven maar niet daaronder.);
Geheimhouding (voorkomt ongeschikte openbaarmaking van gegevens);
Een basis voor het ontwerp van systemen die gelijktijdig gegevens op verschillende gevoeligheidsniveaus behandelen (zonder informatie tussen geheim en vertrouwelijk te lekken).
De volgende sysctl-tunables zijn beschikbaar voor de configuratie van speciale diensten en interfaces:
security.mac.mls.enabled wordt gebruikt om het MLS-beleid in en uit te schakelen.
security.mac.mls.ptys_equal labelt alle pty(4)-apparaten als mls/equal wanneer ze worden aangemaakt.
security.mac.mls.revocation_enabled wordt gebruikt om toegang tot objecten in te trekken nadat hun label in die van een lagere graad verandert.
security.mac.mls.max_compartments wordt gebruikt om het maximaal aantal compartimentniveaus met objecten in te stellen; in feite het maximale compartimentnummer dat op een systeem is toegestaan.
Het commando setfmac(8) kan gebruikt worden om de MLS-labels te manipuleren. Gebruik het volgende commando om een label aan een object toe te kennen:
# setfmac mls/5 test
Gebruik het volgende commando om het MLS-label voor het bestand test te verkrijgen:
# getfmac test
Dit is een samenvatting van de mogelijkheden van het beleid MLS. Een andere manier is om een meesterbeleidsbestand in /etc aan te maken dat de MLS-informatie bevat en om dat bestand aan het commando setfmac te geven. Deze methode wordt uitgelegd nadat alle beleiden zijn behandeld.
Met de beleidsmodule voor meerlaagse beveiliging plant een beheerder het beheren van gevoelige informatiestromen. Standaard zet het systeem met zijn natuur van lezen naar boven blokkeren en schrijven naar beneden blokkeren alles in een lage toestand. Alles is beschikbaar en een beheerder verandert dit langzaam tijdens de configuratiefase; waarbij de vertrouwelijkheid van de informatie toeneemt.
Buiten de bovengenoemde drie basisopties voor labels, kan een beheerder gebruikers en groepen indelen als nodig om de informatiestroom tussen hun te blokkeren. Het is misschien gemakkelijker om naar de informatie te kijken in toestemmingsniveaus waarvoor bekende woorden bestaan, zoals Vertrouwelijk, Geheim en Strikt Geheim. Sommige beheerders zullen verschillende groepen aanmaken gebaseerd op verschillende projecten. Ongeacht de classificatiemethode moet er een goed overwogen plan bestaan voordat zo'n berperkend beleid wordt geïmplementeerd.
Wat voorbeeldsituaties voor deze beveiligingsbeleidsmodule kunnen een e-commerce webserver, een bestandsserver die kritieke bedrijfsinformatie, en omgevingen van financiële instellingen zijn. De meest onwaarschijnlijke plaats zou een persoonlijk werkstation met slechts twee of drie gebruikers zijn.
Modulenaam: mac_biba.ko
Kernelinstelling: options MAC_BIBA
Opstartoptie: mac_biba_load="YES"
De module mac_biba(4) laadt het beleid MAC Biba. Dit beleid werkt vaak zoals dat van MLS behalve dat de regels voor de informatiestroom lichtelijk zijn omgedraaid. Dit is gezegd om de neerwaartse stroom van gevoelige informatie te voorkomen terwijl het beleid MLS de opwaartse stroom van gevoelige informatie voorkomt; veel van deze sectie is dus op beide beleiden toepasbaar.
In Biba-omgevingen wordt een “integriteits”-label op elk subject of object ingesteld. Deze labels bestaan uit hiërarchische graden, en niet-hiërarchische componenten. Een graad van een object of subject stijgt samen met de integriteit.
Ondersteunde labels zijn biba/low, biba/equal, en biba/high; zoals hieronder uitgelegd:
Het label biba/low wordt gezien als de laagste integriteit die een object of subject kan hebben. Dit instellen op objecten of subjecten zal hun schrijftoegang tot objecten of subjecten die als hoog zijn gemarkeerd blokkeren. Ze hebben echter nog steeds leestoegang.
Het label biba/equal dient alleen geplaatst te worden op objecten die geacht te zijn uitgesloten van het beleid.
Het label biba/high staat schrijven naar objecten met een lager label toe maar sluit het lezen van dat object uit. Het wordt aangeraden om dit label te plaatsen op objecten die de integriteit van het gehele systeem beïnvloeden.
Biba biedt:
Hiërarchische integriteitsniveaus met een verzameling niet-hiërarchische integriteitscategoriën;
Vaste regels: niet naar boven schrijven, niet naar beneden lezen (tegenovergestelde van MLS). Een subject kan schrijftoegang hebben naar objecten op hetzelfde niveau of daaronder, maar niet daarboven. Evenzo kan een subject leestoegang naar objecten op hetzelfde niveau of daarboven hebben, maar niet daaronder;
Integriteit (voorkomt oneigenlijk wijzigen van gegevens);
Integriteitsniveaus (in plaats van de gevoeligheidsniveaus van MLS)
De volgende sysctl-tunables kunnen gebruikt worden om het Biba-beleid te manipuleren.
security.mac.biba.enabled kan gebruikt worden om het afdwingen van het Biba-beleid op de doelmachine aan en uit te zetten.
security.mac.biba.ptys_equal kan gebruikt worden om het Biba-beleid op pty(4)-apparaten uit te zetten.
security.mac.biba.revocation_enabled dwingt het herroepen van toegang tot objecten af als het label is veranderd om het subject te domineren.
Gebruik de commando's setfmac en getfmac om de instellingen van het Biba-beleid op systeemobjecten te benaderen:
# setfmac biba/low test # getfmac test test: biba/low
Integriteit, anders dan gevoeligheid, garandeert dat de informatie nooit door onvertrouwde gebruikers zal worden gemanipuleerd. Dit geldt ook voor informatie die tussen subjecten, objecten, of beiden wordt doorgegeven. Het verzekert dat gebruikers alleen de informatie kunnen wijzigen en in sommige gevallen zelfs benaderen die ze expliciet nodig hebben.
De beveiligingsbeleidsmodule mac_biba(4) staat een beheerder in staat om te bepalen welke bestanden en programma's een gebruiker of gebruikers mogen zien en draaien terwijl het verzekert dat de programma's en bestanden vrij zijn van dreigingen en vertrouwt zijn door het systeem voor die gebruiker of groep van gebruikers.
Tijdens de initiële planningsfase moet een beheerder bereid zijn om gebruikers in gradaties, niveaus, en gebieden in te delen. Gebruikers zal toegang tot niet alleen gegevens maar ook tot programma's en hulpmiddelen ontzegt worden zowel voordat en nadat ze beginnen. Het systeem zal standaard een hoog label instellen nadat deze beleidsmodule is ingeschakeld, en het is aan de beheerder om de verschillende gradaties en niveaus voor gebruikers in te stellen. In plaats van toestemmingsniveaus zoals boven beschreven te gebruiken, kan een goede planningsmethode onderwerpen bevatten. Bijvoorbeeld, geef alleen ontwikkelaars veranderingstoegang tot het broncoderepository, de broncodecompiler, en andere ontwikkelgereedschappen. Andere gebruikers zouden in andere groepen zoals testers, ontwerpers, of gewone gebruikers worden ingedeeld en zouden alleen leestoegang hebben.
Met zijn natuurlijke beveiligingsbeheer kan een subject van lagere integriteit niet schijven naar een subject van hogere integriteit; een subject van hogere integriteit kan geen subject van lagere integriteit observeren of lezen. Een label op de laagst mogelijke graad instellen kan het ontoegankelijk voor subjecten maken. Sommige succesvolle omgevingen voor deze beveiligingsbeheermodule zijn een beperkte webserver, een ontwikkel- en testmachine, en broncoderepositories. Minder nuttige implementaties zouden een persoonlijk werkstation, een machine gebruikt als router, of een netwerkfirewall zijn.
Modulenaam: mac_lomac.ko
Kernelinstelling: options MAC_LOMAC
Opstartoptie: mac_lomac_load="YES"
In tegenstelling tot het beleid MAC Biba, staat het beleid mac_lomac(4) toegang tot objecten van lagere integriteit slechts toe nadat het integriteitsniveau is verlaagt om de integriteitsregels niet te verstoren.
De MAC-versie van het laagwatermarkeringsintegreitsbeleid, niet te verwarren met de oudere implementatie van lomac(4), werkt bijna hetzelfde als Biba maar met de uitzondering dat er drijvende labels worden gebruikt om subjectdegradatie via een hulpcompartiment met graden te ondersteunen. Dit tweede compartiment heeft de vorm [hulpgraad]. Wanneer een lomac-beleid met een hulpgraad wordt toegekend, dient het er ongeveer uit te zien als: lomac/10[2] waar het getal twee (2) de hulpgraad is.
Het beleid MAC LOMAC berust op het overal labelen van alle systeemobjecten met integriteitslabels, waardoor subjecten wordt toegestaan om te lezen van objecten van lage integriteit en om daarna het label op subject te degraderen om toekomstig schrijven naar objecten van hoge integriteit te voorkomen. Dit is de hierboven besproken optie [hulpgraad], dus biedt het beleid grotere compatibiliteit en vereist het minder initiële configuratie dan Biba.
Net zoals bij de beleiden Biba en MLS kunnen de commando's setfmac en setpmac gebruikt worden om labels op systeemobjecten te plaatsen:
# setfmac /usr/home/trhodes lomac/high[low] # getfmac /usr/home/trhodes lomac/high[low]
Merk op dat de hulpgraad hier low is, dit is een mogelijkheid die alleen door het beleid MAC LOMAC wordt geboden.
De volgende demonstratie zal een veilige omgeving implementeren door verschillende MAC-modules te gebruiken met juist ingestelde beleiden. Dit is slechts een test en dient niet gezien te worden als het volledige antwoord op de beveiligingszorgen van iedereen. Gewoon een beleid implementeren en het verder negeren werkt nooit en kan rampzalig zijn in een productieomgeving.
Voordat met dit proces wordt begonnen, moet de optie multilabel zijn geactiveerd op elk bestandssysteem zoals vermeld aan het begin van dit hoofdstuk. Nalatigheid zal in fouten resulteren. Zorg er ook voor dat de ports net-mgmt/nagios-plugins, net-mgmt/nagios, en www/apache22 allemaal geïnstalleerde en geconfigureerd zijn en correct werken.
Begin de procedure door de volgende gebruikersklasse toe te voegen aan het bestand /etc/login.conf:
insecure:\
:copyright=/etc/COPYRIGHT:\
:welcome=/etc/motd:\
:setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\
:path=~/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
:manpath=/usr/share/man /usr/local/man:\
:nologin=/usr/sbin/nologin:\
:cputime=1h30m:\
:datasize=8M:\
:vmemoryuse=100M:\
:stacksize=2M:\
:memorylocked=4M:\
:memoryuse=8M:\
:filesize=8M:\
:coredumpsize=8M:\
:openfiles=24:\
:maxproc=32:\
:priority=0:\
:requirehome:\
:passwordtime=91d:\
:umask=022:\
:ignoretime@:\
:label=biba/10(10-10):
Voeg de volgende regel toe aan de standaard gebruikersklasse:
:label=biba/high:
Wanneer dit voltooid is, moet het volgende commando gedraaid worden om de database te herbouwen:
# cap_mkdb /etc/login.conf
Start nog niet opnieuw op, voeg alleen de volgende regels toe aan /boot/loader.conf zodat de benodigde modules worden geladen tijdens systeeminitialisatie:
mac_biba_load="YES" mac_seeotheruids_load="YES"
Stel de gebruiker root in op de standaardklasse met:
# pw usermod root -L default
Alle gebruikersaccounts die geen root of systeemgebruikers zijn hebben nu een aanmeldklasse nodig. De aanmeldklasse is nodig om te voorkomen dat gebruikers geen toegang hebben tot gewone commando's als vi(1). Het volgende sh-script zou moeten werken:
# for x in `awk -F: '($3 >= 1001) && ($3 != 65534) { print $1 }' \
/etc/passwd`; do pw usermod $x -L default; done;
Laat de gebruikers nagios en www in de klasse insecure vallen:
# pw usermod nagios -L insecure
# pw usermod www -L insecure
Nu dient een contextbestand aangemaakt te worden; het volgende voorbeeld dient geplaatst te worden in /etc/policy.contexts.
# Dit is het standaard-BIBA-beleid voor dit systeem. # Systeem: /var/run biba/equal /var/run/* biba/equal /dev biba/equal /dev/* biba/equal /var biba/equal /var/spool biba/equal /var/spool/* biba/equal /var/log biba/equal /var/log/* biba/equal /tmp biba/equal /tmp/* biba/equal /var/tmp biba/equal /var/tmp/* biba/equal /var/spool/mqueue biba/equal /var/spool/clientmqueue biba/equal #Voor Nagios: /usr/local/etc/nagios /usr/local/etc/nagios/* biba/10 /var/spool/nagios biba/10 /var/spool/nagios/* biba/10 #Voor Apache: /usr/local/etc/apache biba/10 /usr/local/etc/apache/* biba/10
Dit beleid zal beveiliging afdwingen door beperkingen aan de informatiestroom te stellen. In deze specifieke configuratie mogen gebruikers, inclusief root, nooit toegang hebben tot Nagios. Instellingenbestanden en processen die deel zijn van Nagios zullen geheel in zichzelf of in een jail zitten.
Dit bestand kan nu in ons systeem worden gelezen door ons systeem door het volgende commando uit te voeren:
# setfsmac -ef /etc/policy.contexts / # setfsmac -ef /etc/policy.contexts /
Opmerking: De bovenstaande indeling van het bestandssysteem kan afhankelijk van de omgeving verschillen; het moet echter op elk bestandssysteem gedraaid worden.
Het bestand /etc/mac.conf dient als volgt in de hoofdsectie gewijzigd te worden:
default_labels file ?biba default_labels ifnet ?biba default_labels process ?biba default_labels socket ?biba
Voeg de volgende regel toe aan /boot/loader.conf:
security.mac.biba.trust_all_interfaces=1
En voeg het volgende toe aan de instellingen van de netwerkkaart opgeslagen in rc.conf. Als de primaire Internetconfiguratie via DHCP wordt gedaan, kan het nodig zijn om dit handmatig te configureren telkens nadat het systeem is opgestart:
maclabel biba/equal
Controleer dat de webserver en Nagios niet tijdens de systeeminitialisatie worden gestart, en start opnieuw op. Controleer dat de gebruiker root geen enkel bestand in de instellingenmap van Nagios kan benaderen. Als root het commando ls(1) op /var/spool/nagios kan uitvoeren, is er iets verkeerd. Anders zou er een fout “Permission denied” teruggegeven moeten worden.
Als alles er goed uitziet, kunnen Nagios, Apache, en Sendmail nu gestart worden op een manier die past in het beveiligingsbeleid. De volgende commando's zorgen hiervoor:
# cd /etc/mail &↦ make stop && \ setpmac biba/equal make start && setpmac biba/10\(10-10\) apachectl start && \ setpmac biba/10\(10-10\) /usr/local/etc/rc.d/nagios.sh forcestart
Controleer nogmaals om er zeker van te zijn dat alles juist werkt. Indien niet, controleer dan de logbestanden of de foutmeldingen. Gebruik het hulpprogramma sysctl(8) om de beveiligingsbeleidsmodule mac_biba(4) uit te schakelen en probeer om alles opnieuw op te starten, zoals gewoonlijk.
Opmerking: De gebruiker root kan zonder angst de afgedwongen beveiliging veranderen en de instellingenbestanden bewerken. Het volgende commando staat toe om het beveiligingsbeleid naar een lagere graad te degraderen voor een nieuw voortgebrachte shell:
# setpmac biba/10 cshOm te voorkomen dat dit gebeurt, kan de gebruiker via login.conf(5) in een bereik worden gedwongen. Als setpmac(8) probeert om een commando buiten het bereik van het compartiment te draaien, zal er een fout worden teruggegeven en wordt het commando niet uitgevoerd. Zet in dit geval root op biba/high(high-high).
Dit voorbeeld gaat over een relatief klein opslagsysteem met minder dan vijftig gebruikers. Gebruikers kunnen zich aanmelden, en mogen zowel gegevens opslaan als bronnen benaderen.
Voor dit scenario kunnen mac_bsdextended(4) gecombineerd met mac_seeotheruids(4) naast elkaar bestaan en zowel toegang tot systeemobjecten als tot gebruikersprocessen ontzeggen.
Begin door de volgende regel aan /boot/loader.conf toe te voegen:
mac_seeotheruids_load="YES"
Het beveiligingsbeleidsmodule mac_bsdextended(4) kan door volgende variabele in rc.conf geactiveerd worden:
ugidfw_enable="YES"
De standaardregels in /etc/rc.bsdextended zullen tijdens de systeeminitialisatie worden geladen; het kan echter nodig zijn om de standaardregels te wijzigen. Aangezien van deze machine alleen verwacht wordt dat het gebruikers bedient, kunnen alle regels uitgecommentarieerd blijven behalve de laatste twee. Deze forceren het standaard laden van systeemobjecten die eigendom zijn van gebruikers.
Voeg de benodigde gebruikers toe aan deze machine en start opnieuw op. Probeer, voor testdoeleinden, u aan te melden als een andere gebruiker over twee consoles. Draai het commando ps aux om te zien of processen van andere gebruikers zichtbaar zijn. Probeer om ls(1) te draaien op de thuismap van een andere gebruiker, dit zou moeten mislukken.
Probeer niet te testen met de gebruiker root tenzij de specifieke sysctl's om supergebruikertoegang te blokkeren zijn aangepast.
Opmerking: Wanneer een nieuwe gebruiker is toegevoegd, zit de mac_bsdextended(4)-regel van die gebruiker niet in de lijst van regelverzamelingen. Om de regelverzameling snel bij te werken, kan simpelweg de beveiligingsbeleidsmodule worden herladen met de gereedschappen kldunload(8) en kldload(8).
Tijdens de ontwikkeling hebben een aantal gebruikers problemen aangegeven met normale instellingen. Hieronder worden een aantal van die problemen beschreven:
multilabel kan niet ingeschakeld worden op /De vlag multilabel blijft niet ingeschakeld op de
rootpartitie (/)!
Het lijkt er inderdaad op dat een paar procent van de gebruikers dit probleem heeft. Nadere analyse van het probleem doet vermoeden dat deze zogenaamde “bug” het resultaat is van òfwel onjuiste documentatie òfwel verkeerde interpretatie van de documentatie. Hoe het probleem ook is ontstaan, met de volgende stappen is het te verhelpen:
Wijzig /etc/fstab en stel de rootpartitie in op ro voor alleen-lezen.
Herstart in enkele-gebruikersmodus.
Draai tunefs -l enable op
/.
Herstart in normale modus.
Draai mount -urw / en wijzig ro terug in rw in /etc/fstab en start het
systeem opnieuw.
Controleer de uitvoer van mount om zeker te zijn dat
multilabel juist is ingesteld op het
rootbestandssysteem.
Na het instellen van een beveiligde omgeving met MAC start X niet meer!
Dit kan komen door de MAC-beleidseenheid partition of door een verkeerde labeling van een van de MAC-labeling beleidseenheden. Probeer als volgt te debuggen:
Controleer de foutmelding. Als de gebruiker in de klasse insecure zit, kan de beleidseenheid partition het probleem zijn. Zet de klasse voor de gebruiker terug naar de klasse default en herbouw de database met het commando cap_mkdb. Ga naar stap twee als hiermee het probleem niet is opgelost.
Controleer de labelbeleidseenheden nog een keer. Stel zeker dat het beleid voor de bewuste gebruiker, de X11-applicatie, en de onderdelen van /dev juist zijn ingesteld.
Als geen van beide methodes het probleem oplossen, stuur dan de foutmelding en een beschrijving van de omgeving naar de TrustedBSD-discussielijsten van de TrustedBSD website of naar de FreeBSD algemene vragen mailinglijst mailinglijst.
Bij het wisselen van de gebruiker root naar een andere gebruiker in het systeem, verschijnt de foutmelding “_secure_path: unable to state .login_conf”.
Deze melding komt meestal voor als de gebruiker een hogere labelinstelling heeft
dan de gebruiker waarnaar wordt gewisseld. Als bijvoorbeeld gebruiker joe een standaardlabel biba/low
heeft, dan kan gebruiker root, die een label biba/high heeft, de thuismap van joe
niet zien. Dit gebeurt zonder rekening te houden met de mogelijkheid dat root met su de identiteit van joe heeft aangenomen. In dit scenario staat het
integriteitsmodel van Biba niet toe dat root objecten kan
zien van een lager integriteitsniveau.
In normale, of zelfs in enkelegebruikersmodus, wordt root niet herkend. Het commando whoami geeft 0 (nul) terug en su heeft als resultaat “who are you?”. Wat is er aan de hand?
Dit kan gebeuren als een labelbeleid is uitgeschakeld, òfwel door sysctl(8) òf
doordat de beleidsmodule niet meer is geladen. Als de beleidseenheid
(tijdelijk) is uitgeschakeld dan moet de database met aanmeldmogelijkheden
opnieuw worden ingesteld, waarbij de optie label wordt
verwijderd. Er dient voor te worden zorggedragen dat het bestand login.conf wordt ontdaan van alle opties met label, waarna de database opnieuw gebouwd kan worden met cap_mkdb.
Dit kan ook gebeuren als een beleid toegang verhinderd tot het bestand of de database master.passwd. Meestal wordt dit veroorzaakt door een beheerder die het bestand veranderd onder een label welke conflicteert met het globale beleid dat gebruikt wordt op het systeem. In deze gevallen wordt de gebruikersinformatie gelezen door het systeem en wordt de toegang geblokkeerd omdat het bestand het nieuwe label erft. Zet het beleid uit door middel van sysctl(8) en alles zou weer normaal moeten zijn.
Het besturingssysteem FreeBSD heeft ondersteuning voor diepgaande beveiligingsauditing van evenementen. Evenement auditing maakt het mogelijk dat er diepgaande en configureerbare logging van een variateit aan beveiligings-gerelateerde systeem evenementen, waaronder logins, configuratie wijzigingen, bestands- en netwerk toegang. Deze log regels kunnen erg belangrijk zijn voor live systeem monitoring, intrusion detection en postmortem analyse. FreeBSD implementeert Sun's gepubliceerde BSM API en bestandsformaat en is uitwisselbaar met zowel Sun's Solaris als Apple®'s Mac OS X audit implementaties.
Dit hoofdstuk richt zich op de installatie en configuratie van evenement auditing. Het legt audit policies uit en geeft voorbeelden van audit configuraties.
Na het lezen van dit hoofdstuk weet de lezer:
Wat evenement auditing is en hoe het werkt.
Hoe evenement auditing geconfigureerd kan worden voor FreeBSD voor gebruikers en processen.
Hoe de audittrail bekeken kan worden door gebruik te maken van de audit reduction en onderzoek programma's.
Voordat verder gegaan wordt moet het volgende bekend zijn:
UNIX en FreeBSD basishandelingen begrijpen (Hoofdstuk 4).
Bekend zijn met de basishandelingen van kernel configuratie/compilatie (Hoofdstuk 9).
Bekend zijn met beveiliging en hoe dat relateert aan FreeBSD (Hoofdstuk 15).
WaarschuwingDe audit-faciliteiten hebben enkele bekende beperkingen waaronder dat niet alle beveiligings-relevante systeemevenementen geaudit kunnen worden en dat sommige login-mechanismes, zoals X11-gebaseerde display managers en programma's van erde partijen geen (goede) ondersteuning bieden voor het auditen van login-sessies van gebruikers.
De beveiligings evenement auditing faciliteit is in staat om erg gedetailleerde logs van systeem activiteiten op een druk systeem te genereren, trail bestands data kan erg groot worden wanneer er erg precieze details worden gevraagd, wat enkele gigabytes per week kan behalen in sommige configuraties. Beheerders moeten rekening houden met voldoende schijfruimte voor grote audit configuraties. Bijvoorbeeld het kan gewenst zijn om eigen bestandsysteem aan /var/audit toe te wijzen zo dat andere bestandssystemen geen hinder ondervinden als het audit bestandssysteem onverhoopt vol raakt.
Voordat dit hoofdstuk gelezen kan worden, moeten er een aantal audit gerelateerde termen uitgelegd worden:
evenement: Een auditbaar evenement is elk evenement dat gelogged kan worden door het audit subsysteem. Voorbeelden van beveiligings gerelateerde evenementen zijn het creëeren van een bestand, het opzetten van een netwerk verbinding, of van een gebruiker die aanlogt. Evenementen zijn ofwel “attributable” wat betekend dat ze getraceerd kunnen worden naar een geauthoriseerde gebruiker, of “non-attributable” voor situaties waarin dat niet mogelijk is. Voorbeelden van non-attributable evenementen zijn elk evenement dat gebeurd voordat authorisatie plaatsvind in het login proces, zoals bij foutieve inlog pogingen.
class: Evenement klassen zijn benoemde sets van gerelateerde evenementen en worden gebruikt in selectie expressies. Veel gebruikte klassen van evenementen zijn “bestands creatie” (fc), “exec” (ex) en “login_logout” (lo).
record: Een record is een audit log regel die het beveiligings evenement beschrijft. Records bevatten een record evenement type, informatie over het onderwerp (de gebruiker) welke de actie uitvoerd, de datum en de tijd, informatie over de objecten of argumenten, en een conditie die aangeeft of de actie geslaagd of mislukt is.
trail: Een audit trail, of log bestand bestaat uit een serie van audit records welke beveiligings evenementen beschrijft. Meestal lopen deze trails in chronologische orde, gebaseerd op de tijd dat het evenement optrad. Alleen geauthoriseerde processen mogen records toevoegen aan de audit trail.
selection expression: Een selectie expressie is een string welke een lijst bevat van prefixes en audit evenement klasse namen die overeenkomen met evenementen.
preselection: Het proces waarbij het systeem bepaald welke evenementen interessant zijn voor de beheerder, zodat wordt voorkomen dat er audit records worden gegenereerd voor evenementen die niet interessant zijn. De “preselection” configuratie gebruikt een serie van selectie expressies om te identificeren welke klassen van evenementen van toepassing zijn op gebruikers en globale instellingen voor zowel geauthoriseerde als ongeauthoriseerde processen.
reduction: Het proces waarbij records van bestaande audit trails worden geselecteerd voor bewaring, uitprinten of analyse. Ook is dit het proces waarbij ongewenste audit records worden verwijderd uit het audit trail. Door gebruik te maken van reduction kunnen beheerders policies implementeren die het bewaren van audit data verzorgen. Bijvoorbeeld gedetailleerde audit trails kunnen één maand bewaard worden maar erna worden trails gereduceerd zodat alleen login informatie bewaard worden voor archiverings redenen.
Ondersteuning in de gebruikersomgeving voor evenement auditing wordt geïnstalleerd als onderdeel van het basis FreeBSD besturingssysteem. Kernel-ondersteuning voor evenement-auditing wordt standaard meegenomen tijdens compilatie, maar moet expliciet in de kernel gecompileerd worden door de volgende regel toe te voegen aan het configuratiebestand van de kernel:
options AUDIT
Bouw en herinstalleer de kernel volgens het normale proces zoals beschreven in Hoofdstuk 9.
Zodra een audit ondersteunende kernel is gebouwd en geïnstalleerd en deze is opgestart kan de audit daemon aangezet worden door de volgende regel aan rc.conf(5) toe te voegen:
auditd_enable="YES"
Audit ondersteuning moet daarna aangezet worden door een herstart van het systeem of door het handmatig starten van de audit daemon:
/etc/rc.d/auditd start
Alle configuratie bestanden voor beveiligings audit kunnen worden gevonden in /etc/security. De volgende bestanden moeten aanwezig zijn voor de audit daemon wordt gestart:
audit_class - Bevat de definities van de audit klasses.
audit_control - Controleert aspecten van het audit subsysteem, zoals de standaard audit klassen, minimale hoeveelheid diskruimte die moet overblijven op de audit log schijf, de maximale audit trail grootte, etc.
audit_event - Tekst namen en beschrijvingen van systeem audit evenementen, evenals een lijst van klassen waarin elk evenement zich bevind.
audit_user - Gebruiker specifieke audit benodigdheden welke gecombineerd worden met de globale standaarden tijdens het inloggen.
audit_warn - Een bewerkbaar shell script gebruikt door de auditd applicatie welke waarschuwings berichten genereert in bijzondere situaties zoals wanneer de ruimte voor audit records te laagis of wanneer het audit trail bestand is geroteerd.
WaarschuwingAudit configuratie bestanden moeten voorzichtig worden bewerkt en onderhouden, omdat fouten in de configuratie kunnen resulteren in het verkeerd loggen van evenementen.
Selectie expressies worden gebruikt op een aantal plaatsen in de audit configuratie om te bepalen welke evenementen er geaudit moeten worden. Expressies bevatten een lijst van evenement klassen welke gelijk zijn aan een prefix welke aangeeft of gelijke records geaccepteerd moeten worden of genegeerd en optioneel om aan te geven of de regel is bedoeld om succesvolle of mislukte operaties te matchen. Selectie expressies worden geevalueerd van links naar rechts en twee expressies worden gecombineerd door de één aan de ander toe te voegen.
De volgende lijst bevat de standaard audit evenement klassen welke aanwezig zijn in het audit_class bestand:
all - all - Matched alle evenement klasses.
ad - administrative - Administratieve acties welke uitgevoerd worden op het gehele systeem.
ap - application - Applicatie gedefinieerde acties.
cl - file
close - Audit aanroepen naar de close
systeem aanroep.
ex - exec - Audit programma uitvoer. Het auditen van command line argumenten en omgevings variabelen wordt gecontroleerd via audit_control(5) door gebruik te maken van de argv en envv parameters in de policy setting.
fa - file attribute access - Audit de toevoeging van object attributen zoals stat(1), pathconf(2) en gelijkwaardige evenementen.
fc - file create - Audit evenementen waar een bestand wordt gecreëerd als resultaat.
fd - file delete - Audit evenementen waarbij bestanden verwijderd worden.
fm - file attribute modify - Audit evenementen waarbij bestandsattribuut wijzigingen plaatsvinden zoals bij chown(8), chflags(1), flock(2), etc.
fr - file read - Audit evenementen waarbij data wordt gelezen, bestanden worden geopend voor lezen etc.
fw - file write - Audit evenementen waarbij data wordt geschreven, bestanden worden geschreven of gewijzigd, etc.
io - ioctl - Audit het gebruik van de ioctl(2) systeem aanroep.
ip - ipc - Audit verschillende vormen van Inter-Process Communication, zoals POSIX pipes en System V IPC operaties.
lo - login_logout - Audit login(1) en logout(1) evenementen die plaatsvinden op het systeem.
na - non attributable - Audit non-attributable evenementen.
no - invalid class - Matched geen enkel audit evenement.
nt - network - Audit evenementen die gerelateerd zijn aan netwerk acties zoals connect(2) en accept(2).
ot - other - Audit diverse evenementen.
pc - process - Audit process operaties zoals exec(3) en exit(3)
Deze audit evenement klassen kunnen veranderd worden door het wijzigingen van de audit_class en audit_event configuratie bestanden.
Elke audit klasse in de lijst wordt gecombineerd met een voorzetsel welke aangeeft of er succesvolle of mislukte operaties hebben plaatsgevonden en of de regel wordt toegevoegd of verwijderd van het matchen van de klasse en het type.
(none) Audit zowel succesvolle als mislukte informatie van het evenement.
+ Audit succesvolle evenementen in deze klasse.
- Audit mislukte evenementen in deze klasse.
^ Audit geen enkele succesvolle of mislukte evenementen in deze klasse.
^+ Audit geen succesvolle evenementen in deze klasse.
^- Audit geen mislukte evenementen in deze klasse.
De volgende voorbeeld selectie strings selecteren zowel succesvolle als mislukte login/logout evenementen, maar alleen succesvolle uitvoer evenementen:
lo,+ex
In de meeste gevallen moet een beheerder twee bestanden wijzigingen wanneer het audit systeem wordt geconfigureerd: audit_control en audit_user. Het eerste controleert systeem brede audit eigenschappen en policies, het tweede kan gebruikt worden om diepgaande auditing per gebruiker uit te voeren.
Het audit_control bestand specificeert een aantal standaarden van het audit subsysteem. Als de inhoud bekeken wordt van dit bestand is het volgende te zien:
dir:/var/audit flags:lo minfree:20 naflags:lo policy:cnt filesz:0
De dir optie wordt gebruikt om één of
meerdere directories te specificeren die gebruikt worden voor de opslag van audit
logs. Als er meer dan één directory wordt gespecificeerd, worden ze
op volgorde gebruikt naarmate ze gevuld worden. Het is standaard dat audit
geconfigureerd wordt dat audit logs worden bewaard op een eigen bestandssysteem, om
te voorkomen dat het audit subsysteem en andere subsystemen met elkaar botsen
als het bestandssysteem volraakt.
Het flags veld stelt de systeem brede standaard
preselection maskers voor attributable evenementen in. In het voorbeeld boven
worden succesvolle en mislukte login en logout evenementen geaudit voor alle
gebruikers.
De minfree optie definieerd het minimale percentage
aan vrije ruimte voor dit bestandssysteem waar de audit trails worden opgeslagen.
Wanneer deze limiet wordt overschreven wordt er een waarschuwing gegenereerd. In
het bovenstaande voorbeeld wordt de minimale vrije ruimte ingesteld op 20
procent.
Denaflags optie specificeerd audit klasses welke
geaudit moeten worden voor non-attributed evenementen zoals het login proces en
voor systeem daemons.
Depolicy optie specificeert een komma gescheiden
lijst van policy vlaggen welke diverse aspecten van het audit proces beheren. De
standaard cnt vlag geeft aan dat het systeem moet
blijven draaien ook al treden er audit fouten op (deze vlag wordt sterk
aangeraden). Een andere veel gebruikte vlag is argv, wat
het mogelijk maakt om command line argumenten aan de execve(2) systeem
aanroep te auditen als onderdeel van het uitvoeren van commando's.
De filesz optie specificeert de maximale grootte in
bytes hoeveel een audit trail bestand mag groeien voordat het automatisch
getermineerd en geroteerd wordt. De standaard, 0, schakelt automatische log rotatie
uit. Als de gevraagde bestands grootte niet nul is en onder de minimale 512k
zit, wordt de optie genegeerd en wordt er een log bericht gegenereerd.
Het audit_user bestand staat de beheerder toe om verdere audit benodigdheden te specificeren voor gebruikers. Elke regel configureert auditing voor een gebruiker via twee velden, het eerste is het alwaysaudit veld, welke een set van evenementen specificeert welke altijd moet worden geaudit voor de gebruiker, en de tweede is het neveraudit veld, welke een set van evenementen specificeerd die nooit geaudit moeten worden voor de gebruiker.
Het volgende voorbeeld audit_user bestand audit login/logout evenementen en succesvolle commando uitvoer voor de root gebruiker, en audit bestands creatie en succesvolle commando uitvoer voor de www gebruiker. Als dit gebruikt wordt in combinatie met het voorbeeld audit_control bestand hierboven, is de root regel dubbelop en zullen login/logout evenementen ook worden geaudit voor de www gebruiker.
root:lo,+ex:no www:fc,+ex:no
Audit trails worden opgeslagen in het BSM binaire formaat, dus ondersteunende programma's moeten worden gebruikt om de informatie te wijzigen of converteren naar tekst. Het praudit(1) commando converteert trail bestanden naar een simpel tekst formaat; het auditreduce(1) commando kan gebruikt worden om de audit trail te reduceren voor analyse, archivering of voor het uitprinten van de data. auditreduce ondersteund een variateit aan selectie parameters, zoals evenement type, evenement klasse, gebruiker, datum of tijd van het evenement en het bestandspad of object dat gebruikt wordt.
Bijvoorbeeld, het praudit programma zal een dump maken van de volledige inhoud van een gespecificeerd audit log bestand in normale tekst:
# praudit /var/audit/AUDITFILE
Waar AUDITFILE het audit bestand is dat ingelezen moet worden.
Audit trails bestaan uit een serie van audit records die gevormd worden door tokens, welke praudit sequentieel print één per regel. Elke token is van een specifiek type, zoals een header welke de audit record header bevat, of path welke het bestandspad bevat van een lookup. Het volgende is een voorbeeld van een execve evenement:
header,133,10,execve(2),0,Mon Sep 25 15:58:03 2006, + 384 msec exec arg,finger,doug path,/usr/bin/finger attribute,555,root,wheel,90,24918,104944 subject,robert,root,wheel,root,wheel,38439,38032,42086,128.232.9.100 return,success,0 trailer,133
Deze audit representeert een succesvolle execve aanroep, waarbij het commando finger doug is aangeroepen. Het argument token bevat beide commando's gerepresenteerd door de shell aan de kernel. Het path token bevat het pad naar het uitvoerbare bestand zoals opgezocht door de kernel. Het attribute token beschrijft de binary en om precies te zijn bevat het de bestands mode welke gebruikt kan worden om te zien of het bestand setuid was. Het subject token beschrijft het onderwerp proces en bevat sequentieel het audit gebruikers ID, effectieve gebruikers ID en groep ID, echte gebruikers ID, groep ID, proces ID, sessie ID, port ID en login adres. Let op dat het audit gebruikers ID en het echte gebruikers ID van elkaar verschillen omdat de gebruiker robert veranderd is naar de root gebruiker voordat het commando werd uitgevoerd, maar welke geaudit wordt als de originele geauthoriseerde gebruiker. Als laatste wordt de return token gebruikt om aan te geven dat er een succesvolle uitvoer is geweest en trailer geeft het einde aan van het record.
praudit ook een XML output formaat, welke geselecteerd
kan worden door gebruik te maken van het x argument.
Omdat audit logs erg groot kunnen worden, zal de beheerder waarschijnlijk een subset van records willen selecteren om te gebruiken, zoals records die gekoppeld zijn aan een specifieke gebruiker:
# auditreduce -u trhodes /var/audit/AUDITFILE | praudit
Dit selecteert alle audit records die geproduceert zijn voor de gebruiker trhodes die opgeslagen is in het AUDITFILE bestand.
Leden van de audit groep krijgen permissie om de audit trails te lezen in /var/audit; standaard is deze groep leeg en kan alleen de root gebruiker deze audit trails lezen. Gebruikers kunnen toegevoegd worden aan de audit groep zodat onderzoek rechten kunnen worden gedelegeerd aan de geruiker. Omdat de mogelijkheid van het inzien van audit log inhoud significante inzicht kan geven in het gedrag van gebruikers en processen, wordt het aangeraden dat de delagatie van onderzoek rechten eerst goed overdacht wordt.
Audit pipes zijn gecloonde pseudo-devices in het device bestands systeem, welke applicaties toestaat om een tap te plaatsen in de live audit record stream. Dit is primair interessant voor schrijvers van intrusion detection en systeem monitoring applicaties. Echter, voor een beheerder is het audit pipe device een makkelijke manier om live monitoring toe te staan zonder dat er problemen kunnen ontstaan met het eigenaarschap van het audit trail bestand, of dat een log rotatie de evenementen stroom in de weg zit. Om de live audit evenementen stroom te kunnen inzien is het volgende commando benodigd:
# praudit /dev/auditpipe
Standaard zijn de audit pipe device nodes alleen toegankelijk voor de root gebruiker. Om deze toegankelijk te maken voor leden van de audit groep, moet een devfs regel toegevoegd worden aan het devfs.rules bestand:
add path 'auditpipe*' mode 0440 group audit
Zie devfs.rules(5) voor meer informatie over het configureren van het devfs bestands systeem.
WaarschuwingHet is makkelijk om audit evenement terugkoppeling cyclussen te creëeren, waarbij het tonen van elk audit evenement resulteert in het genereren van nog meer audit evenementen. Bijvoorbeeld, als alle netwerk I/O wordt geaudit en praudit(1) wordt gestart vanuit een SSH sessie, wordt er een grote continue stroom aan audit evenementen gegenereert doordat elk getoond evenement een nieuw evenement genereert. Het is verstandig om praudit te draaien op een audit pipe device voor sessies zonder diepgaande I/O auditing om te voorkomen dat dit gebeurd.
Audit trails worden alleen beschreven door de kernel en alleen beheerd worden door de audit daemon, auditd. Beheerders mogen geen gebruik maken van newsyslog.conf(5) of soortgelijke programma's om de audit files te roteren. In plaats daarvan kan het audit management programma gebruikt worden om auditing te stoppen, het audit systeem te herconfigureren en log rotatie uit te voeren. Het volgende commando zorgt ervoor dat de audit daemon een nieuwe audit log maakt, en vervolgens de kernel een signaal stuurt om het nieuwe logbestand te gaan gebruiken. Het oude logbestand wordt getermineerd en hernoemd, waarna het bestand gemanipuleerd kan worden door de beheerder.
# audit -n
WaarschuwingAls de auditd daemon op dit moment niet actief is, zal het commando falen en zal er een error bericht worden geproduceerd.
Als de volgende regel wordt toegevoegd aan het /etc/crontab bestand, zal er elke twaalf uur een rotatie plaatsvinden door middel van cron(8):
0 */12 * * * root /usr/sbin/audit -n
Deze wijziging wordt van kracht op het moment dat het nieuwe /etc/crontab bestand wordt opgeslagen.
Automatische rotatie van het audit trail bestand gebaseerd op de bestand grootte
is mogelijk via de filesz optie in audit_control(5) en
wordt beschreven in de configuratie bestanden sectie van dit hoofdstuk.
Omdat audit trail bestanden erg groot kunnen worden, is het meestal gewenst om de trails te comprimeren of op een andere manier te archiveren zodra ze afgesloten zijn door de audit daemon. Het audit_warn script kan gebruikt worden om bewerkte operaties te doen voor een variateit aan audit gerelateerde evenementen inclusief een nette terminatie van audit trails wanneer deze geroteerd worden. Bijvoorbeeld het volgende kan worden toegevoegd aan het audit_warn script, dat de audit trails comprimeert zodra ze afgesloten worden:
#
# Compress audit trail files on close.
#
if [ "$1" = closefile ]; then
gzip -9 $2
fi
Andere archiverings activiteiten kunnen zijn het kopieren van trail bestanden naar een gecentraliseerde server, het verwijderen van oude trail bestanden of het reduceren van de audit trail om onnodige records te verwijderen. Het script zal alleen draaien als audit trail bestanden netjes worden afgesloten, wat betekend dat het script niet uitgevoerd wordt op trails die niet netjes afgesloten zijn, waardoor bestanden corrupt kunnen raken.
Dit hoofdstuk behandelt het gebruik van schijven in FreeBSD. Dit omvat geheugenschijven, schijven die met het netwerk verbonden zijn, SCSI/IDE-opslagapparaten en apparaten die gebruik maken van de USB-interface.
Na het lezen van dit hoofdstuk weet de lezer:
Welke terminologie FreeBSD gebruikt om de gegevensindeling op een fysieke schijf te beschrijven (partities en slices);
Hoe aanvullende harde schijven aan een systeem toe te voegen;
Hoe FreeBSD in te stellen om het gebruik te laten maken van USB-opslagapparaten;
Hoe virtuële bestandssystemen, zoals geheugenschijven, aan te maken;
Hoe quota te gebruiken om het schijfgebruik te beperken;
Hoe schijven te versleutelen om ze tegen inbrekers te beschermen;
Hoe vanuit FreeBSD CD's en DVD's aan te maken en te branden;
Wat de verschillende mogelijkheden zijn voor opslagmedia voor back-ups;
Hoe back-upprogramma's te gebruiken die beschikbaar zijn in FreeBSD;
Hoe een back-up naar diskettes te maken;
Wat bestandssysteem snapshots zijn en hoe ze efficiënt te gebruiken.
Aangeraden voorkennis:
Hoe een nieuwe FreeBSD-kernel in te stellen en te installeren (Hoofdstuk 9).
De volgende lijst noemt de fysieke opslagapparaten die in FreeBSD ondersteund worden, samen met de bijhorende namen.
Tabel 19-1. Naamconventies voor fysieke Schijven
| Type medium | Apparaatnaam medium |
|---|---|
| IDE harde schijven | ad |
| IDE CD-ROM-stations | acd |
| SCSI harde schijven en USB-apparaten voor massa-opslag | da |
| SCSI CD-ROM-schijven | cd |
| Overige niet-standaard-CD-ROM-stations | mcd voor Mitsumi CD-ROM en scd voor Sony CD-ROM apparaten. |
| Diskettestations | fd |
| SCSI bandstations | sa |
| IDE bandstations | ast |
| Flashdrives | fla voor DiskOnChip® flashapparaten |
| RAID-schijven | aacd voor Adaptec® AdvancedRAID, mlxd en mlyd voor Mylex®, amrd voor AMI MegaRAID®, idad voor Compaq Smart RAID, twed voor 3ware® RAID. |
De volgende sectie beschrijft hoe een nieuwe SCSI schijf aan een machine toe te voegen die slechts een enkele drive heeft. Ten eerste dient de computer uitgeschakeld te worden en dient de schijf volgens de instructies van de computer, controller en schijffabrikant geïnstalleerd te worden. Wegens de grote variéteiten om dit soort procedures uit te voeren, vallen de details buiten het bereik van dit document.
Er dient als gebruiker root ingelogd te worden. Nadat de schijf is toegevoegd, dient /var/run/dmesg.boot bekeken te worden om er zeker van te zijn dat de nieuwe schijf is gevonden. Volgens het voorbeeld heet de nieuw toegevoegde schijf da1 en die wordt aangekoppeld op /1 (als er een IDE-schijf wordt toegevoegd, is de apparaatnaam ad1).
FreeBSD draait op IBM-PC-compatibele computers. Daarom moet het rekening houden met de PC-BIOS-partities. Deze wijken af van de traditionele BSD-partities. Een PC-schijf bevat tot vier ingangen voor BIOS-partities. Indien de schijf geheel aan FreeBSD wordt gewijd, kan de toegewijde-modus gebruikt worden. In het andere geval moet FreeBSD binnen één van de vier PC-BIOS-partities draaien. De PC-BIOS-partities worden door FreeBSD slices genoemd om ze niet met de traditionele BSD-partities te verwarren. Slices kunnen ook op een schijf worden gebruikt die toegewijd is aan FreeBSD, maar in een computer zit die ook andere besturingssystemen heeft geïnstalleerd. Dit is een goede manier om verwarring met het programma fdisk van andere, niet-FreeBSD besturingssystemen te voorkomen.
Als er met slices gewerkt wordt, wordt de schijf toegevoegd als /dev/da1s1e. Dit moet worden gelezen als: SCSI-schijf, eenheid 1 (tweede SCSI-schijf), slice 1 (PC-BIOS-partitie 1) en BSD-partitie e. Als de schijf toegewijd is, wordt deze simpelweg als /dev/da1e toegevoegd.
Omdat 32-bit-integers worden gebruikt om het aantal sectoren op te slaan, is bsdlabel(8) beperkt tot 2^32-1 sectoren per schijf, wat meestal neerkomt op 2 TB. Het programma fdisk(8) staat geen hogere startsector toe dan 2^32-1 en geen grotere lengte dan 2^32-1, meestal worden hiermee partities tot 2 TB begrensd en schijven tot 4 TB. Het formaat van sunlabel(8) is beperkt tot 2^32-1 sectoren per partitie en 8 partities per schijf, in totaal dus 16 TB. Voor grotere schijven kan gpart(8) worden gebruikt om GPT-partities aan te maken. GPT heeft het bijkomende voordeel dat het niet tot 4 slices beperkt is.
Navigeren door sysinstall
sysinstall kan gebruikt worden om een nieuwe schijf te partitioneren en te labelen met eenvoudig te gebruiken menu's. Hiervoor dient òfwel als gebruiker root ingelogd te zijn, òfwel gebruik te worden gemaakt van su. Draai sysinstall en ga naar het menu Configure. Scroll binnen het FreeBSD Configuration Menu naar beneden en kies de optie Fdisk.
fdisk partitie-bewerker
Eenmaal binnen fdisk kan op A gedrukt worden om de gehele schijf voor FreeBSD te gebruiken. Wanneer gevraagd wordt of het systeem compatibel dient te blijven met mogelijk toekomstige besturingssystemen, dient met YES geantwoord te worden. Met W kunnen de veranderingen naar de schijf worden geschreven. Nu dient de FDISK-bewerker verlaten te worden door op Q te drukken. Vervolgens wordt er een vraag gesteld over het “Master Boot Record”. Omdat er een schijf aan een reeds draaiend systeem wordt toegevoegd, dient hier None gekozen te worden.
Schijflabelbewerker
Vervolgens dient sysinstall verlaten en opnieuw gestart te worden. Volg bovenstaande aanwijzingen, maar kies deze keer voor de optie Label. Dit geeft toegang tot de Disk Label Editor. Hier worden de traditionele BSD-partities aangemaakt. Een schijf kan tot acht partities bevatten, gelabeld a-h. Enkele partitielabels hebben een speciale functie. De partitie a wordt gebruikt voor de rootpartitie (/). Alleen de systeemschijf (bijvoorbeeld de schijf van waaruit opgestart wordt) moet een partitie a hebben. De partitie b wordt voor swappartities gebruikt, en het is mogelijk om vele schijven met swappartities te hebben. De partitie c adresseert de gehele schijf in toegewijde modus, of de gehele FreeBSD-slice in slice-modus. De andere partities zijn voor algemeen gebruik.
sysinstall's Labelbewerker heeft een voorkeur voor de partitie e voor niet-root-niet-swap-partities. Binnen de Labelbewerker dient een enkel bestandssysteem te worden aangemaakt door op C te drukken. Kies FS wanneer gevraagd wordt of dit een FS (file system) of swap wordt, en geef een koppelpunt in (bijvoorbeeld /mnt). Wanneer een schijf in post-installatie-modus wordt toegevoegd, maakt sysinstall geen ingangen aan in /etc/fstab, dus dan is het opgegeven koppelpunt niet van belang.
Nu kan het nieuwe label naar de schijf worden geschreven en er een bestandssysteem op aangemaakt worden. Dit kan gedaan worden door op W te drukken. Fouten van sysinstall dat de nieuwe partitie niet aankoppeld kon worden kunnen genegeerd worden. De Labelbewerker en sysinstall kunnen nu volledig verlaten worden.
Afronden
De laatste stap bestaat uit het bewerken van /etc/fstab om hier een regel voor de nieuwe schijf aan toe te voegen.
Deze installatie zorgt ervoor dat de schijf correct samenwerkt met andere besturingssystemen die eventueel op de computer zijn geïnstalleerd en dat de fdisk-gereedschappen van andere besturingssystemen niet verward raken. Het wordt aangeraden om deze methode te gebruiken voor de installatie van nieuwe schijven. Gebruik de toegewijde modus alleen als hier een goede reden voor bestaat!
# dd if=/dev/zero of/dev/da1 bs=1k count=1 # fdisk -BI da1 # Initialiseer de nieuwe schijf. # bsdlabel -B -w da1s1 auto # Label de schijf. # bsdlabel -e da1s1 # Bewerk de zojuist aangemaakte schijflabel en voeg partities toe. # mkdir -p /1 # newfs /dev/da1s1e # Herhaal dit voor alle aangemaakte partities. # mount /dev/da1s1e /1 # Mount de partitie(s). # vi /etc/fstab # Voeg de juiste regel(s) aan /etc/fstab toe.
Vervang voor een IDE-schijf da door ad.
Indien de nieuwe schijf niet met een ander besturingssysteem gedeeld wordt, kan de toegewijde modus gebruikt worden. Denk eraan dat deze modus besturingssystemen van Microsoft kan verwarren. Ze richten echter geen schade aan. IBM's OS/2 “fatsoeneert” echter partities die het niet begrijpt.
# dd if=/dev/zero of=/dev/da1 bs=1k count=1 # bsdlabel -Bw da1 auto # bsdlabel -e da1 # Maak de `e'-partitie aan. # newfs /dev/da1e # mkdir -p /1 # vi /etc/fstab # Voeg een regel voor /dev/da1e toe. # mount /1
Een alternatieve methode is:
# dd if=/dev/zero of=/dev/da1 count=2 # bsdlabel /dev/da1 | bsdlabel -BR da1 /dev/stdin # newfs /dev/da1e # mkdir -p /1 # Voeg een regel voor /dev/da1e toe. # mount /1
Bij het kiezen van een medium voor massa-opslag zijn de belangrijkste afwegingen snelheid, betrouwbaarheid en kosten. Het komt zelden voor dat alle drie in balans zijn. Normaalgesproken is een snel, betrouwbaar apparaat voor massa-opslag duur en kosten sparen gaat ten koste van òfwel snelheid òfwel betrouwbaarheid.
Bij het ontwerpen van het onderstaande systeem werd primair op de kosten gelet, gevolgd door snelheid en als laatste betrouwbaarheid. De overdrachtsnelheid van gegevens wordt voor dit systeem uiteindelijk beperkt door het netwerk. En hoewel betrouwbaarheid erg belangrijk is, wordt onderstaande CCD-schijf gebruikt voor het serven van on-line gegevens die reeds volledig op CD-R's zijn geback-upt en eenvoudig vervangen kunnen worden.
De eerste stap in het kiezen van een massa-opslagoplossing is het bepalen van de eigen benodigdheden. Indien snelheid belangrijker is dan betrouwbaarheid of kosten, wijkt de oplossing af van het systeem dat in deze sectie wordt beschreven.
Als aanvulling op de IDE systeemschijf zijn drie Western Digital IDE-schijven van 30 GB, 5400 RPM vanuit de kern van de onderstaande CCD-schijf aanwezig, die ongeveer 90 GB aan on-line opslag bieden. Ideaal gezien heeft iedere IDE-schijf een eigen IDE-controller en kabel, maar om de kosten te minimaliseren zijn geen aanvullende IDE-kabels gebruikt. In plaats hiervan zijn de schijven zodanig met jumpers ingesteld dat elke IDE-controller één master en één slave heeft.
Tijdens het opnieuw opstarten werd het systeem-BIOS zodanig ingesteld dat het automatisch de aangekoppelde schijven detecteerde. Het was belangrijker dat FreeBSD ze tijdens het opnieuw opstarten herkende:
ad0: 19574MB <WDC WD205BA> [39770/16/63] at ata0-master UDMA33 ad1: 29333MB <WDC WD307AA> [59598/16/63] at ata0-slave UDMA33 ad2: 29333MB <WDC WD307AA> [59598/16/63] at ata1-master UDMA33 ad3: 29333MB <WDC WD307AA> [59598/16/63] at ata1-slave UDMA33
Opmerking: Indien FreeBSD niet alle schijven detecteert, moet gecontroleerd worden of de jumpers juist zijn ingesteld. De meeste IDE-schijven hebben ook een jumper voor “Cable Select”. Dit is niet de jumper voor de master/slave-instelling. Voor hulp met het identificeren van de juiste jumper dient de documentatie van de schijf geraadpleegd te worden.
Vervolgens dient besloten te worden hoe ze deel gaan uitmaken van het bestandssysteem. Hiervoor dienen vinum(4) (Hoofdstuk 22) en ccd(4) bestudeerd te worden. Voor deze instellingen werd voor ccd(4) gekozen.
Het stuurprogramma ccd(4) biedt de mogelijkheid om meerdere identieke schijven aaneen te rijgen tot één logisch bestandssysteem. Om gebruik te kunnen maken van ccd(4) is een kernel met ingebouwde ondersteuning voor ccd(4) nodig. De volgende regel dient toegevoegd te worden aan het kernelinstellingenbestand en de kernel dient opnieuw gebouwd en geïnstalleerd te worden:
device ccd
Om ccd(4) te installeren dient eerst bsdlabel(8) gebruikt te worden om de schijven te labelen:
bsdlabel -w -ad1 auto bsdlabel -w ad2 auto bsdlabel -w ad3 auto
Bovenstaande maakt een schijflabel aan voor ad1c, ad2c en ad3c die de gehele schijf beslaat.
Vervolgens dient het labeltype van de schijf veranderd te worden. Voor het bewerken van de schijven kan bsdlabel(8) gebruikt worden:
bsdlabel -e ad1 bsdlabel -e ad2 bsdlabel -e ad3
Dit zorgt ervoor dat het huidige schijflabel van elke schijf met de tekstverwerker wordt geopend die door de omgevingsvariabele EDITOR wordt gespecificeerd, vaak vi(1).
Een ongewijzigd schijflabel ziet er ongeveer als volgt uit:
8 partitions: # size offset fstype [fsize bsize bps/cpg] c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597)
Er dient een nieuwe partitie e toegevoegd te worden die
door ccd(4) gebruikt kan
worden. Deze kan gewoonlijk van partitie c
overgenomen worden, maar het fstype moet 4.2BSD zijn. Het schijflabel ziet er nu ongeveer als volgt
uit:
8 partitions: # size offset fstype [fsize bsize bps/cpg] c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597) e: 60074784 0 4.2BSD 0 0 0 # (Cyl. 0 - 59597)
Nu alle schijven gelabeld zijn, moet de ccd(4) gebouwd worden. Om dit te doen, dient ccdconfig(8) gebruikt te worden met opties die ongeveer gelijk zijn aan de volgende:
ccdconfig ccd032
0
/dev/ad1e
/dev/ad2e /dev/ad3e
Hieronder staat het gebruik en de betekenis van elke optie:




Nadat ccdconfig(8) gedraaid is, is de ccd(4) ingesteld. Er kan een bestandssysteem worden geïnstalleerd. Er kan in newfs(8) worden gekeken voor opties, of het draaien van het onderstaande commando is ook toereikend:
newfs /dev/ccd0c
In het algemeen is het wenselijk om de ccd(4) telkens te mouten wanneer er opnieuw opgestart wordt. Dit dient eerst ingesteld te worden. Met het volgende commando worden de huidige instellingen naar /etc/ccd.conf geschreven:
ccdconfig -g > /etc/ccd.conf
Tijdens het opstarten draait het script /etc/rc ccdconfig -C indien /etc/ccd.conf bestaat. Dit stelt automatisch de ccd(4) in, zodat die kan worden aangekoppeld.
Opmerking: Indien er in enkele-gebruiker-modus wordt opgestart, dient het volgende commando te worden uitgevoerd om de rij in te stellen voordat de ccd(4) aangekoppeld kan worden:
ccdconfig -C
Om de ccd(4) automatisch aan te koppelen, kan er een regel voor de ccd(4) in /etc/fstab geplaatst worden, zodat die tijdens het opstarten aangekoppeld wordt:
/dev/ccd0c /media ufs rw 2 2
De volumebeheerder Vinum is een blokstuurprogramma dat virtuele schijven implementeert. Het isoleert schijfhardware van de blokapparaat-interface en projecteert gegevens op een manier die de flexibiliteit, prestatie en betrouwbaarheid verhoogt in vergelijking met de traditionele slice-blik op schijfopslag. vinum(4) implementeert de modellen RAID-0, RAID-1 en RAID-5, zowel individueel als als combinatie.
In Hoofdstuk 22 staat meer informatie over vinum(4).
FreeBSD ondersteunt ook een verscheidenheid aan hardwarematige RAID-stuurprogramma's. Deze apparaten besturen een RAID-deelsysteem zonder dat er FreeBSD-specifieke software nodig is om de rij te beheren.
Door gebruik te maken van een BIOS die op de kaart aanwezig is, beheert de kaart de meeste schijfbewerkingen zelf. Nu volgt een korte beschrijving van een opzet waarbij een Promise IDE-stuurprogramma is gebruikt. Wanneer deze kaart geïnstalleerd en het systeem opgestart is, beeldt het een prompt af waarbij om informatie wordt gevraagd. De instructies dienen opgevolgd te worden om bij het instelscherm van de kaart te komen. Van hieruit kunnen alle aangekoppelde schijven gecombineerd worden. Nadat dit gedaan is, zien de schijven er voor FreeBSD als één enkele schijf uit. Andere RAID-niveaus kunnen overeenkomstig ingesteld worden.
Met FreeBSD is het mogelijk om een defecte schijf in een rij te vervangen terwijl de computer aanstaat (“hot replace”). Hiervoor dient de schijf vóór het opnieuw opstarten vervangen te zijn.
Waarschijnlijk is zoiets als het volgende in /var/log/messages of in de uitvoer van dmesg(8) te zien:
ad6 on monster1 suffered a hard error. ad6: READ command timeout tag=0 serv=0 - resetting ad6: trying fallback to PIO mode ata3: resetting devices .. done ad6: hard error reading fsbn 1116119 of 0-7 (ad6 bn 1116119; cn 1107 tn 4 sn 11)\\ status=59 error=40 ar0: WARNING - mirror lost
Meer informatie kan met behulp van atacontrol(8) gezocht worden:
# atacontrol list ATA channel 0: Master: no device present Slave: acd0 <HL-DT-ST CD-ROM GCR-8520B/1.00> ATA/ATAPI rev 0 ATA channel 1: Master: no device present Slave: no device present ATA channel 2: Master: ad4 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5 Slave: no device present ATA channel 3: Master: ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5 Slave: no device present # atacontrol status ar0 ar0: ATA RAID1 subdisks: ad4 ad6 status: DEGRADED
Ontkoppel eerst het ata kanaal met de falende schijf zodat deze veilig kan worden verwijderd:
# atacontrol detach ata3
Vervang de schijf.
Koppel het ata kanaal opnieuw aan:
# atacontrol attach ata3 Master: ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5 Slave: no device present
Voeg de nieuwe schijf toe aan de rij als reserve:
# atacontrol addspare ar0 ad6
De rij dient nu opnieuw opgebouwd te worden:
# atacontrol rebuild ar0
Het is mogelijk de voortgang te volgen met het volgende commando:
# dmesg | tail -10 [uitvoer verwijderd] ad6: removed from configuration ad6: deleted from ar0 disk1 ad6: inserted into ar0 disk1 as spare # atacontrol status ar0 ar0: ATA RAID1 subdisks: ad4 ad6 status: REBUILDING 0% completed
Nu moet er gewacht worden tot de bewerking voltooid is.
Veel externe opslagoplossingen gebruiken tegenwoordig de Universele Seriële Bus (USB): harde schijven, USB-duimdrives, CD-R-branders, etc. FreeBSD biedt voor al dit soort apparaten ondersteuning.
Het stuurprogramma umass(4) biedt de ondersteuning voor USB-opslagapparaten. Indien de kernel GENERIC wordt gebruikt, hoeft er niets aan de instellingen gewijzigd te worden. Als er een eigen kernel wordt gebruikt, dienen de volgende regels in het kernelinstellingenbestand aanwezig zijn:
device scbus device da device pass device uhci device ohci device ehci device usb device umass
Het stuurprogramma umass(4) gebruikt het subsysteem SCSI om toegang te krijgen tot de USB-opslagapparaten. Het USB-apparaat wordt door het systeem als een SCSI-apparaat gezien. Afhankelijk van de chipset op het moederbord is slechts òf device uhci òf device ohci nodig voor ondersteuning van USB 1.X. Het kan echter geen kwaad om ze beiden in het kernelinstellingenbestand te hebben. Ondersteuning voor USB 2.0 wordt geleverd door het stuurprogramma ehci(4) (de regel met device ehci). Indien er regels zijn toegevoegd dient de kernel opnieuw gecompileerd en geïnstalleerd te worden.
Opmerking: Indien het USB-apparaat een CD-R- of DVD-brander is, dient het SCSI CD-ROM-stuurprogramma cd(4) met de volgende regel aan de kernel toegevoegd te worden:
device cdAangezien de brander als een SCSI-schijf gezien wordt, dient het stuurprogramma atapicam(4) niet in de kernelinstellingen gebruikt te worden.
De instellingen zijn klaar om getest te worden: het USB-apparaat dient aangesloten te worden en in de buffer voor systeemmeldingen (dmesg(8)) dient het stuurprogramma ongeveer als volgt te verschijnen:
umass0: USB Solid state disk, rev 1.10/1.00, addr 2 GEOM: create disk da0 dp=0xc2d74850 da0 at umass-sim0 bus 0 target 0 lun 0 da0: <Generic Traveling Disk 1.11> Removable Direct Access SCSI-2 device da0: 1.000MB/s transfers da0: 126MB (258048 512 byte sectors: 64H 32S/T 126C)
Uiteraard kunnen het merk, de apparaatnode (da0) en andere details verschillen naar gelang de instelling.
Aangezien het USB-apparaat als een SCSI-apparaat gezien wordt, kan het commando camcontrol gebruikt worden om de USB-opslagapparaten weer te geven die aan het systeem gekoppeld zijn:
# camcontrol devlist <Generic Traveling Disk 1.11> at scbus0 target 0 lun 0 (da0,pass0)
Indien er een bestandssysteem op de schijf aanwezig is, kan dat aangekoppeld worden. Paragraaf 19.3 biedt indien nodig hulp bij het formatteren en aanmaken van partities op de USB-drive.
WaarschuwingDoor het toestaan dat gewone gebruikers verschillende media kunnen koppelen door bijvoorbeeld het aanzetten van vfs.usermount zoals hieronder beschreven, zou niet als veilig beschoud moeten worden uit een beveiligings oogpunt. Veel bestandssystemen in FreeBSD zijn niet geschreven om beveiliging te bieden tegen kwaadaardige apparaten.
Om het apparaat koppelbaar te maken voor de gewone gebruiker moeten er een aantal stappen ondernomen worden. Als eerste moeten de apparaten die gecreeerd worden wanneer het USB opslag- medium wordt toegevoegd toegankelijk zijn voor de gebruiker. Een oplossing is om alle gebruikers die deze rechten nodig hebben toe te voegen aan de operator groep. Dit kan gedaan worden met pw(8). Daarna moet het voor de operator groep mogelijk zijn te lezen en te schrijven naar de gecreeerde apparaten. Dit kan bewerkstelligd worden door de volgende regels toe te voegen aan /etc/devfs.rules:
[localrules=5] add path 'da*' mode 0660 group operator
Opmerking: Als er SCSI schijven in het systeem aanwezig zijn moet dit anders aangepakt worden. Stel dat het systeem reeds over de volgende schijven beschikt da0 tot en met da2, verander de regel dan in het volgende:
add path 'da[3-9]*' mode 0660 group operatorDit sluit de reeds bestaande schijven buiten van toegang door de operator groep.
Erna moet ook de nieuwe ruleset voor devfs.rules(5) ingeschakeld worden door middel van /etc/rc.conf:
devfs_system_ruleset="localrules"
Hierna moet de kernel worden geconfigureerd zodat gewone gebruikers rechten krijgen om bestandssystemen te koppelen. De makkelijkste manier is door de volgende regel toe te voegen aan /etc/sysctl.conf:
vfs.usermount=1
Let op, deze wijziging wordt pas actief na de volgende start van het systeem. Als alternatief kan ook sysctl(8) gebruikt worden om deze variabele te zetten.
De laatste stap is het creëeren van de map waar het bestandssysteem gekoppeld wordt. Deze map moet eigendom zijn van de gebruiker die het bestandssysteem gaat koppelen. Een manier om dat te bewerkstelligen is door met de gebruiker root een submap aan te maken die eigendom is van de gebruiker als /mntgebruikersnaam (verander gebruikersnaam door de loginnaam van de daadwerkelijke gebruiker en gebruikersgroep door de primaire groep van de gebruiker):
# mkdir /mnt/gebruikersnaam # chown gebruikersnaam:gebruikersgroep /mnt/gebruikersnaam
Stel dat er vervolgens een USB-stick ingeplugged wordt en er een /dev/da0s1 aangemaakt wordt. Omdat deze apparaten meestal voorgeformatteerd met een FAT-bestandssysteem komen, kan deze als volgende gekoppeld worden:
% mount -t msdosfs -o -m=644,-M=755 /dev/da0s1 /mnt/gebruikersnaam
Indien het apparaat losgekoppeld wordt (nadat de schijf afgekoppeld is), dient in de buffer voor systeemmeldingen iets als het volgende te zien te zijn:
umass0: at uhub0 port 1 (addr2) disconnected (da0:umass-sim0:0:0:0): lost device (da0:umass-sim0:0:0:0): removing device entry GEOM: destroy disk da0 dp=0xc2d74850 umass0: detached
Naast de onderdelen Schijven toevoegen en Bestandssystemen aan- en afkoppelen, kunnen de volgende hulppagina's ook nuttig zijn: umass(4), camcontrol(8) en usbconfig(8) voor FreeBSD 8.X of usbdevs(8) voor eerdere versies van FreeBSD.
CD's hebben een aantal eigenschappen waardoor ze verschillen van conventionele schijven. Initieel zijn ze door de gebruiker niet beschrijfbaar. Ze zijn zó ontworpen dat ze continu, zonder vertragingen van het verplaatsen van de kop tussen tracks, gelezen kunnen worden. Ze zijn ook veel gemakkelijker tussen twee systemen te verplaatsen dan gelijksoortige media in hun tijd waren.
CD's hebben tracks, maar die verwijzen naar secties van gegevens die continu gelezen dienen te worden en niet naar fysieke eigenschappen van de schijf. Om een CD op FreeBSD te produceren, dienen de gegevensbestanden waaruit de tracks op de CD gaan bestaan te worden voorbereid, waarna de tracks op de CD worden geschreven.
Het bestandssysteem ISO 9660 is ontworpen om met deze verschillen om te gaan. Helaas codeert het bestandssysteemgrenzen die destijds gebruikelijk waren. Gelukkig biedt het een uitbreidingsmechanisme dat correct geschreven CD's toestaat om deze grenzen te overschrijden en nog steeds te werken met systemen die deze uitbreidingen niet ondersteunen.
De port sysutils/cdrtools bevat mkisofs(8), een programma dat gebruikt kan worden om een gegevensbestand aan te maken dat een ISO 9660-bestandssysteem bevat. Het bevat opties die verschillende uitbreidingen ondersteunen en wordt hieronder beschreven.
Het gereedschap om de CD te branden hangt af van het feit of de CD-brander ATAPI of iets anders is. ATAPI CD-branders gebruiken het programma burncd dat deel uitmaakt van het basissysteem. SCSI en USB CD-branders dienen cdrecord van de port sysutils/cdrtools te gebruiken. Het is ook mogelijk om cdrecord en andere gereedschappen voor SCSI-drives op ATAPI-hardware te gebruiken door middel van de module ATAPI/CAM.
Indien CD-brandsoftware met een grafische gebruikersinterface gewenst is, is X-CD-Roast of K3b een mogelijkheid. Deze gereedschappen zijn beschikbaar als package of vanuit de ports sysutils/xcdroast en sysutils/k3b. X-CD-Roast en K3b hebben de module ATAPI/CAM met ATAPI-hardware nodig.
Het programma mkisofs(8), dat deel uitmaakt van de port sysutils/cdrtools, maakt een ISO 9660-bestandssysteem aan dat een beeld is van een boomstructuur in de UNIX bestandssysteem-namespace. De eenvoudigste gebruiksvorm is:
# mkisofs -o beeldbestand.iso /pad/naar/boomstructuur
Dit commando maakt een beeldbestand.iso aan dat een ISO 9660-bestandssysteem bevat dat een kopie is van de boomstructuur in /pad/naar/boomstructuur. Tijdens het proces beeldt het bestandsnamen af op namen die aan de beperkingen van het standaard ISO 9660-bestandssysteem voldoen en sluit het bestanden uit die namen hebben die niet karakteristiek zijn voor ISO-bestandssystemen.
Er is een aantal opties beschikbaar om over deze beperkingen heen te komen. In
het bijzonder zet -R de Rock Ridge-uitbreidingen aan die
gangbaar zijn voor UNIX systemen, zet -J de Rock Ridge-uitbreidingen aan die gebruikt worden op
Microsoft-systemen en -hfs kan gebruikt worden om
HFS-bestandssystemen aan te maken die door Mac OS
gebruikt worden.
Voor CD's die alleen op FreeBSD-systemen gebruikt gaan worden, kan -U gebruikt worden om alle restricties op bestandsnamen uit te
zetten. Indien het met -R gebruikt wordt, maakt het een
bestandssysteembeeld aan dat identiek is aan de FreeBSD-boomstructuur van
waaruit begonnen is, alhoewel het mogelijk is dat het zich op aantal manieren niet
aan de ISO 9660-standaard houdt.
De laatste optie voor algemeen gebruik is -b. Deze
wordt gebruikt om de plaats van het opstartbeeld aan te geven om een “El
Torito” opstartbare CD te maken. Deze optie heeft een argument nodig,
namelijk het pad naar een opstartbeeld dat het begin van de boomstructuur die
naar de CD geschreven wordt voorstelt. Gewoonlijk maakt
mkisofs(8) een
ISO-beeld aan in de zogenaamde “diskette-emulatie”-modus en verwacht
het dus dat het beeldbestand exact 1200, 1440 of 2880 KB groot is. Sommige
bootloaders, zoals degene die door de distributieschijven van FreeBSD wordt
gebruikt, gebruiken de emulatiemodus niet. In dat geval dient de optie -no-emul-boot gebruikt te worden. Dus indien /tmp/myboot een opstartbaar FreeBSD-systeem met het
beeldbestand in /tmp/myboot/boot/cdboot bevat, kan het
beeld van een ISO 9660-bestandssysteem als volgt in /tmp/bootable.iso aangemaakt worden:
# mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot
Als dit gedaan is en md in de kernel is ingesteld, kan het bestandssysteem gekoppeld worden:
# mdconfig -a -t vnode -f /tmp/bootable.iso -u 0 # mount -t cd9660 /dev/md0 /mnt
Nu kan gecontroleerd worden of /mnt en /tmp/myboot identiek zijn.
Er zijn vele andere opties die met mkisofs(8) gebruikt kunnen worden om het gedrag af te stemmen. In het bijzonder wijzigingen aan een ISO 9660-structuur en het aanmaken van Joliet- en HFS-schijven. Details staan in mkisofs(8).
Indien er een ATAPI CD-brander aanwezig is, kan het commando burncd gebruikt worden om een ISO-beeld naar een CD te branden. burncd maakt deel uit van het basissysteem en is geïnstalleerd als /usr/sbin/burncd. Het gebruik is erg eenvoudig, aangezien het weinig opties heeft.
# burncd -f cd-apparaat gegevens beeldbestand.iso fixate
Het bovenstaande commando brandt een kopie van beeldbestand.iso naar cd-apparaat. Het standaardapparaat is /dev/acd0. Opties om de schrijfsnelheid in te stellen, de CD na het branden uit te werpen en geluidsgegevens te schrijven staan in burncd(8).
Indien er geen ATAPI CD-brander aanwezig is, dient cdrecord gebruikt te worden om CD's te branden. cdrecord maakt geen deel uit van het basissysteem. Het dient òfwel vanuit de port in sysutils/cdrtools òfwel als package geïnstalleerd te worden. Veranderingen in het basissysteem kunnen ervoor zorgen dat binaire versies van dit programma falen, wat mogelijk tot een “coaster” leidt. Daarom dient òfwel de port bijgewerkt te worden als het systeem wordt bijgewerkt, òwel, als -STABLE gevolgd wordt, dient de port bijgewerkt te worden wanneer er een nieuwe versie beschikbaar komt.
Hoewel cdrecord vele opties heeft, is het gebruik voor gewone situaties nog eenvoudiger dan dat van burncd. Een ISO 9660-beeld kan gebrand worden met:
# cdrecord dev=device beeldbestand.iso
Het lastige gedeelte in het gebruik van cdrecord is het
vinden van de juiste dev. Om de juiste instelling te
vinden, kan de vlag -scanbus van cdrecord gebruikt worden, wat resultaten zoals de onderstaande
kan geven:
# cdrecord -scanbus
Cdrecord-Clone 2.01 (i386-unknown-freebsd7.0) Copyright (C) 1995-2004 Jörg Schilling
Using libscg version 'schily-0.1'
scsibus0:
0,0,0 0) 'SEAGATE ' 'ST39236LW ' '0004' Disk
0,1,0 1) 'SEAGATE ' 'ST39173W ' '5958' Disk
0,2,0 2) *
0,3,0 3) 'iomega ' 'jaz 1GB ' 'J.86' Removable Disk
0,4,0 4) 'NEC ' 'CD-ROM DRIVE:466' '1.26' Removable CD-ROM
0,5,0 5) *
0,6,0 6) *
0,7,0 7) *
scsibus1:
1,0,0 100) *
1,1,0 101) *
1,2,0 102) *
1,3,0 103) *
1,4,0 104) *
1,5,0 105) 'YAMAHA ' 'CRW4260 ' '1.0q' Removable CD-ROM
1,6,0 106) 'ARTEC ' 'AM12S ' '1.06' Scanner
1,7,0 107) *
Dit geeft de gepaste dev-waarden voor de apparaten in
de lijst. De CD-brander dient gezocht te worden, waarna de drie getallen gescheiden
door komma's gebruikt kunnen worden als de waarde voor dev. In dit geval is het CD-RW-apparaat 1,5,0, dus is de
juiste invoer dev=1,5,0. Er zijn eenvoudigere manieren
om deze waarde te specificeren. In
cdrecord(1)
staan meer details. Hier staat ook informatie over geluidstracks, de snelheid
instellen en meer.
Een audio-CD kan gedupliceerd worden door de geluidsgegevens van de CD naar een serie bestanden te schrijven en deze bestanden daarna naar een lege CD te schrijven. Het proces verschilt licht tussen ATAPI- en SCSI-drives.
SCSI-drives
Onttrek cdda2wav de audio:
% cdda2wav -vall -D2,0 -B -Owav
Schrijf met cdrecord de .wav-bestanden:
% cdrecord -v dev=2,0 -dao -useinfo *.wav
Controleer of 2,0 juist is opgegeven, zoals beschreven in Paragraaf 19.6.4.
ATAPI-drives
Opmerking: Met behulp van de ATAPI/CAM module kan cdda2wav ook gebruikt worden voor ATAPI-drives. Dit gereedschap is vaak een betere keuze voor de meeste gebruikers (jitter-correctie, endianness-zaken, etc.) dan de methode die hieronder wordt voorgesteld.
Het ATAPI CD-stuurprogramma maakt elke track beschikbaar als /dev/acddtnn, waarin d het stationsnummer is en nn het tracknummer is in twee decimale cijfers, dat indien nodig vooraf wordt gegaan door een nul. Dus is de eerste track op de eerste schijf /dev/acd0t01, de tweede /dev/acd0t02, de derde /dev/acd0t03, enzovoort.
Controleer of de juiste bestanden in /dev bestaan. Als de benodigde namen er niet bijstaan, forceer het systeem dan om opnieuw te kijken:
# dd if=/dev/acd0 of=/dev/null count=1
De track kan met dd(1) onttrokken worden. Bij het onttrekken van de bestanden dient een specifieke blokgrootte gebruikt te worden.
# dd if=/dev/acd0t01 of=track1.cdr bs=2352 #dd if=/dev/acd0t02 of=track2.cdr bs=2352 ...
Brand de onttrokken bestanden met burncd. Er dient opgegeven te worden dat het geluidsbestanden zijn en dat burncd de schijf moet fixeren wanneer na afronding van het proces.
# burncd -f /dev/acd0 audio track1.cdr track2.cdr ... fixate
Een gegevens-CD kan gekopieerd worden naar een beeldbestand dat functioneel gelijk is aan het beeldbestand dat met mkisofs(8) gemaakt is en het kan gebruikt worden om elke gegevens-CD te dupliceren. Het hier gegeven voorbeeld neemt aan dat het CD-ROM-apparaat acd0 is.
# dd if=/dev/acd0 of=bestand.iso bs=2048
Nu het beeld beschikbaar is, kan het naar CD geschreven worden zoals hierboven beschreven.
Nu er een standaard gegevens-CD-ROM is aangemaakt moet deze waarschijnlijk aangekoppeld worden om de gegevens die er op staan te lezen. Normaalgesproken neemt mount(8) aan dat een bestandssysteem van het soort ufs is. Als zoiets als onderstaande geprobeerd wordt komt er een klacht over “Incorrect super block” en wordt er niet aangekoppeld:
# mount /dev/cd0 /mnt
De CD-ROM bevat geen UFS-bestandssysteem, dus pogingen
om zo aan te koppelen mislukken. Er dient aan mount(8) verteld te
worden dat het bestandssysteem van het soort ISO9660
is en dan werkt alles. Dit kan door de optie -t cd9660
van mount(8) op te
geven. Het CD-ROM-apparaat /dev/cd0 onder /mnt aankoppelen kan zo:
# mount -t cd9660 /dev/cd0 /mnt
De apparaatnaam (in dit voorbeeld /dev/cd0) kan
afwijken, afhankelijk van de interface die de CD-ROM gebruikt. Verder voert de optie
-t cd9660 gewoon mount_cd9660(8) uit.
Bovenstaand voorbeeld kan verkort worden tot:
# mount_cd9660 /dev/cd0 /mnt
Het is in het algemeen mogelijk om gegevens-CD-ROMs van elke fabrikant op deze
manier te gebruiken. Schijven met bepaalde uitbreidingen op ISO 9660 kunnen zich
echter vreemd gedragen. Joliet-schijven bijvoorbeeld, slaan alle bestandsnamen
op in twee-byte Unicode-karakters. De FreeBSD-kernel spreekt geen Unicode, maar het
FreeBSD CD9660 stuurprogramma is in staat om Unicode karakters direct te
converteren. Als er niet-Engelse karakters verschijnen als vraagtekens, moet de
lokale karakterset gedefinieerd worden met de -C optie.
Zie de mount_cd9660(8)
handleiding voor meer informatie.
Opmerking: Om in staat te zijn om de karakter conversie te doen met behulp van de
-Coptie, heeft de kernel de cd9660_iconv.ko module nodig. Deze kan ingeladen worden door het volgende toe te voegen aan /boot/loader.conf:cd9660_iconv_load="YES"en daarna de machine te herstarten of door de module direct in te laden met kldload(8).
Zo nu en dan kan “Device not configured” verschijnen als geprobeerd wordt om een CD-ROM aan te koppelen. Dit betekent meestal dat het CD-ROM-station denkt dat er geen schijf in de lade ligt of dat het station niet zichtbaar is op de bus. Omdat het enkele seconden kan duren voordat een CD-ROM-station doorheeft dat er een CD-ROM in ligt, is geduld geboden.
Soms wordt een SCSI CD-ROM gemist omdat het station niet genoeg tijd had om antwoord te geven op de busreset. Indien er een SCSI CD-ROM aanwezig is, dient de volgende optie aan de kernelinstellingen toegevoegd te worden en de kernel opnieuw gebouwd te worden.
options SCSI_DELAY=15000
Dit zorgt ervoor dat de SCSI-bus 15 seconden pauzeert tijdens het opstarten opdat het CD-ROM-station elke gelegenheid krijgt om de busreset te beantwoorden.
Een bestand kan direct naar CD geschreven worden zonder een ISO 9660-bestandssysteem aan te maken. Sommige mensen doen dit voor back-updoeleinden. Dit gaat sneller dan een standaard-CD branden:
# burncd -f /dev/acd1 -s 12 gegevens archief.tar.gz fixate
Om de gegevens terug te halen die op zo'n CD gebrand zijn, is het noodzakelijk om gegevens van de rauwe apparaatnode te lezen:
# tar xzvf /dev/acd1
Het is niet mogelijk om deze schijf aan te koppelen zoals dat voor een normale CD-ROM gedaan wordt. Zo'n CD-ROM kan onder geen enkel besturingssysteem, behalve FreeBSD, gelezen worden. Om de CD aan te kunnen koppelen of gegevens te delen met een ander besturingssysteem, dient mkisofs(8) gebruikt te worden, zoals boven beschreven is.
Dit stuurprogramma stelt ATAPI-apparaten (CD-ROM, CD-RW, DVD-stations, enzovoort) in staat om vanuit het SCSI-subsysteem benaderd te worden en maakt daarmee het gebruik van applicaties zoals sysutils/cdrdao of cdrecord(1) mogelijk.
Om dit stuurprogramma te gebruiken, is het noodzakelijk om de volgende regel aan het /boot/loader.conf bestand toe te voegen:
atapicam_load="YES"
om daarna de machine opnieuw op te starten.
Opmerking: Als het noodzakelijk is om atapicam(4) statisch toe te voegen aan de kernel moet de volgende regel worden toegevoegd aan het kernelinstellingenbestand:
device atapicamOok zijn de volgende regels in het kernelinstellingenbestand nodig, die meestal wel aanwezig zijn:
device ata device scbus device cd device passHierna dient de nieuwe kernel opnieuw gebouwd en geïnstalleerd te worden en dient de machine opnieuw gestart te worden.
Tijdens het opstartproces dient de brander als volgt te verschijnen:
acd0: CD-RW <MATSHITA CD-RW/DVD-ROM UJDA740> at ata1-master PIO4 cd0 at ata1 bus 0 target 0 lun 0 cd0: <MATSHITA CD-RW/DVD UJDA740 1.00> Removable CD-ROM SCSI-0 device cd0: 16.000MB/s transfers cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closed
Het station is nu toegankelijk via de apparaatnaam /dev/cd0. Om bijvoorbeeld een CD-ROM op /mnt aan te koppelen:
# mount -t cd9660 /dev/cd0 /mnt
Als root kan het volgende commando gegeven worden om het SCSI-adres van de brander te verkrijgen:
# camcontrol devlist <MATSHITA CD-RW/DVD UJDA740 1.00> at scbus1 target 0 lun 0 (pass0,cd0)
Dus 1,0,0 is het SCSI-adres dat met cdrecord(1) en andere SCSI-toepassingen gebruikt dient te worden.
Meer informatie over het ATAPI/CAM en het SCSI-systeem staat in de hulppagina's van atapicam(4) en cam(4).
Vergeleken met de CD behoort de DVD de tot de volgende generatie van optische media-opslagtechnologie. De DVD kan meer gegevens bevatten dan enige CD en is tegenwoordig de standaard voor videopublicatie.
Er kunnen vijf fysieke opneembare formaten gedefinieerd worden die opneembare DVD heten:
DVD-R: dit was het eerst beschikbare opneembare DVD-formaat. De DVD-R-standaard is gedefinieerd door het DVD Forum. Dit formaat is voor eenmalig schrijven.
DVD-RW: dit is de herschrijfbare versie van de DVD-R-standaard. Een DVD-RW kan tot ongeveer 1.000 maal herschreven worden.
DVD-RAM: dit is ook een herschrijfbaar formaat dat door het DVD Forum ondersteund wordt. Een DVD-RAM kan gezien worden als een verwisselbare harde schijf. Dit medium is echter niet uitwisselbaar met de meeste DVD-ROM-stations en DVD-Video-spelers. Slechts enkele DVD-schrijvers ondersteunen het DVD-RAM-formaat. Lees Paragraaf 19.7.9 voor meer informatie over het gebruik van DVD-RAM.
DVD+RW: dit is het herschrijfbare formaat dat is gedefinieerd door de DVD+RW Alliance. Een DVD+RW kan tot ongeveer 1.000 maal herschreven worden.
DVD+R: dit formaat is de eenmalig beschrijfbare versie van het DVD+RW-formaat.
Een enkellaags opneembare DVD kan maximaal 4.700.000.000 bytes bevatten, wat eigenlijk 4,38 GB of 4.485 MB is (1 kB is 1024 bytes).
Opmerking: Er dient onderscheid gemaakt te worden tussen het fysieke medium en de toepassing. Een DVD-Video bijvoorbeeld is een specifiek bestandsschema dat op elk fysiek opneembaar DVD-medium geschreven kan worden: DVD-R, DVD+R, DVD-RW, enzovoort. Voordat het mediumtype gekozen wordt, dient het zeker te zijn dat zowel de brander als de DVD-Video-speler (een onafhankelijke speler of een DVD-ROM-station in een computer) overweg kunnen met het overwogen medium.
Het programma growisofs(1) wordt gebruikt om DVD's op te nemen. Dit commando is deel van de dvd+rw-tools gereedschappen (sysutils/dvd+rw-tools). dvd+rw-tools ondersteunt alle types DVD-media.
Deze gereedschappen gebruiken het SCSI-subsysteem om toegang tot de apparaten te krijgen, daarvoor moet ondersteuning voor ATAPI/CAM aan de kernel toegevoegd worden. Indien de brander de USB-interface gebruikt, is deze toevoeging nutteloos en dient Paragraaf 19.5 gelezen te worden voor meer details over het instellen van USB-apparaten.
De DMA-toegang voor ATAPI-apparaten dient ook aangezet te worden door de volgende regel aan het bestand /boot/loader.conf toe te voegen:
hw.ata.atapi_dma="1"
Voordat de dvd+rw-tools gebruikt kunnen worden, dienen de dvd+rw-tools' hardware compatibility notes geraadpleegd te worden voor enige informatie die betrekking heeft op de DVD-brander.
Opmerking: Indien een grafische gebruikersinterface gewenst is, is K3b (sysutils/k3b), die een gebruikersvriendelijke interface biedt voor growisofs(1) en vele andere brandprogramma's, het bekijken waard.
Het commando growisofs(1) is een frontend voor mkisofs. Het roept mkisofs(8) aan om het bestandssysteemoverzicht aan te maken en het schrijft naar de DVD. Hierdoor is het niet nodig om een beeld van de gegevens aan te maken voordat met branden begonnen wordt.
Om de gegevens uit de map /pad/naar/gegevens op een DVD+R of een DVD-R te branden:
# growisofs -dvd-compat -Z /dev/cd0 -J -R /pad/naar/gegevens
De opties -J -R worden doorgegeven aan
mkisofs(8) voor
het aanmaken van het bestandssysteem (in dit geval een ISO 9660-bestandssysteem met
Joliet en Rock Ridge uitbreidingen). Meer details staan in de hulppagina
mkisofs(8).
De optie -Z wordt gebruikt voor het opnemen van de
eerste sessie, ook bij meerdere sessies. Het DVD-apparaat, /dev/cd0, dient aan de hand van de instellingen
aangepast te worden. De parameter -dvd-compat sluit de
schijf zodat er niets aan de opname toegevoegd kan worden. Dit zou als
tegenprestatie betere uitwisselbaarheid met DVD-ROM-stations moeten geven.
Het is ook mogelijk om een vooraf gemastered beeld te branden, om bijvoorbeeld het beeld beeldbestand.iso te branden:
# growisofs -dvd-compat -Z /dev/cd0=beeldbestand.iso
De schrijfsnelheid moet automatisch gedetecteerd en ingesteld worden, afhankelijk
van het medium en het gebruikte station. Om de schrijfsnelheid te forceren, dient de
parameter -speed= gebruikt te worden. Meer informatie
staat in de hulppagina
growisofs(1).
Opmerking: Om bestanden groter dan 4,38GB in de compilatie op te nemen dient een UDF/ISO-9660 hybride bestandssysteem aangemaakt te worden door de aanvullende parameter
-udf -iso-level 3aan mkisofs(8) en alle gerelateerde programma's (i.e. growisofs(1)) door te geven. Dit is alleen nodig als een ISO beeldbestand wordt aangemaakt, of als bestanden direct naar een schijf worden geschreven. Schijven die op deze manier zijn aangemaakt moeten als een UDF-bestandssysteem worden aangekoppeld met het hulpmiddel mount_udf(8), zodat het alleen bruikbaar is op een besturingssysteem dat zich van UDF bewust is, anders zal het lijken of er corrupte bestanden op staan.Om zo'n ISO-bestand aan te maken:
% mkisofs -R -J -udf -iso-level 3 -o beeldbestand.iso /pad/naar/gegevensOm de bestanden direct naar een schijf te schrijven:
# growisofs -dvd-compat -udf -iso-level 3 -Z /dev/cd0 -J -R /pad/naar/gegevensWanneer u een ISO-beeld heeft dat al grote bestanden bevat, zijn er geen extra opties nodig om met growisofs(1) het beeld naar een schijf te schrijven.
Zorg er ook voor dat u een actuele versie van sysutils/cdrtools heeft (welke mkisofs(8) bevat), aangezien oudere versies geen ondersteuning voor grote bestanden bieden. Als u problemen tegenkomt, gebruik dan de ontwikkelversie, sysutils/cdrtools-devel en lees de handleidingpagina mkisofs(8).
Een DVD-Video is een specifiek bestandsschema dat gebaseerd is op de ISO 9660 en de micro-UDF (M-UDF) specificaties. DVD-Video heeft ook een specifieke hiërarchie voor de gegevensstructuur, de reden waarom een speciaal programma zoals multimedia/dvdauthor nodig is om de DVD te schrijven.
Indien er reeds een beeld van het bestandssysteem van de DVD-Video beschikbaar is, kan het zoals elk ander beeld gebrand worden. In de vorige sectie staat een voorbeeld. Als het resultaat voor de inhoud voor de DVD bijvoorbeeld in de map /pad/naar/video staat, kan de DVD-Video als volgt gebrand worden:
# growisofs -Z /dev/cd0 -dvd-video /pad/naar/video
De optie -dvd-video wordt doorgegeven aan
mkisofs(8) en
geeft het opdracht om een bestandssysteemschema voor een DVD-Video aan te maken.
Verder impliceert de optie -dvd-video de optie
-dvd-compat van
growisofs(1).
In tegenstelling tot een CD-RW dient een nieuwe DVD+RW voor het eerste gebruik geformatteerd te worden. Het programma growisofs(1) regelt dit automatisch als nodig. Dit is de aanbevolen manier. Het is ook mogelijk om dvd+rw-format te gebruiken om een DVD+RW te formatteren:
# dvd+rw-format /dev/cd0
Deze operatie hoeft slechts één maal uitgevoerd te worden. Onthoud dat alleen nieuwe DVD+RW-media geformatteerd dienen te worden. Daarna is het mogelijk om de DVD+RW op dezelfde manier te branden zoals in bovenstaande secties staat vermeldt.
Om nieuwe gegevens op een DVD+RW te branden (een geheel nieuw bestandssysteem branden, niet wat gegevens toevoegen), is het niet nodig om deze te wissen. Het is voldoende om de vorige opname te overschrijven (tijdens het aanmaken van een initiële sessie), zoals hieronder:
# growisofs -Z /dev/cd0 -J -R /pad/naar/nieuwe gegevens
Het DVD+RW-formaat biedt de mogelijkheid om eenvoudig nieuwe gegevens aan een vorige opname toe te voegen. De operatie bestaat uit het samenvoegen van een nieuwe sessie en de bestaande. Het is geen multisessie-schrijven. growisofs(1) laat het ISO 9660-bestandssysteem dat aanwezig is op het medium groeien.
Om gegevens aan de vorige DVD+RW toe te voegen:
# growisofs -M /dev/cd0 -J -R /pad/naar/volgende gegevens
Dezelfde opties van mkisofs(8) die gebruikt werden om de initiële sessie te branden, dienen gebruikt te worden tijdens schrijfsessies.
Opmerking: De optie
-dvd-compatkan gebruikt worden als betere uitwisselbaarheid met DVD-ROM-stations gewenst is. In het geval van een DVD+RW verhindert dit het toevoegen van gegevens niet.
Om het medium te wissen:
# growisofs -Z /dev/cd0=/dev/zero
Een DVD-RW accepteert twee schijfformaten: de incrementele sequentiële en beperkt overschrijven. Standaard zijn DVD-RW-schijven in het sequentiële formaat.
Een nieuwe DVD-RW kan direct beschreven worden zonder deze te formatteren. Een gebruikte DVD-RW in sequentieel formaat dient echter gewist te worden voordat het mogelijk is om een nieuwe initiële sessie te schrijven.
Om een DVD-RW in sequentiële toestand te wissen, dient het volgende gedaan te worden:
# dvd+rw-format -blank=full /dev/cd0
Opmerking: Volledig wissen (
-blank=full) neemt ongeveer één uur in beslag op een 1x-medium. Het is mogelijk om snel te wissen door gebruik te maken van de optieblankals de DVD-RW in Disk-At-Once-modus (DAO) wordt opgenomen. Om de DVD-RW in DAO-modus te branden:# growisofs -use-the-force-luke=dao -Z /dev/cd0=beeldbestand.isoDe optie
-use-the-force-luke=daois niet nodig aangezien growisofs(1) probeert om minimale (snel gewiste) media te detecteren en gebruik te maken van DAO-schrijven.Eigenlijk moet beperkt overschrijven gebruikt worden met elke DVD-RW. Dit formaat is flexibeler dan het standaard incrementeel sequentiële.
Om gegevens op een sequentiële DVD-RW te schrijven, worden dezelfde instructies gebruikt als voor de andere DVD-formaten:
# growisofs -Z /dev/cd0 -J -R /pad/naar/gegevens
Om wat gegevens aan de vorige opname toe te voegen, dient de optie -M van
growisofs(1)
gebruikt te worden. Als echter gegevens aan een DVD-RW in incrementeel
sequentiële modus worden toegevoegd, wordt een nieuwe sessie op de schijf
aangemaakt wat resulteert in een multisessie schijf.
Een DVD-RW in het beperkt overschrijven formaat hoeft niet gewist te worden
vóór een nieuwe initiële sessie. Het is voldoende om de schijf te
overschrijven met de optie -Z, wat analoog is aan het
geval van de DVD+RW. Het is ook mogelijk om een bestaand ISO
9660-bestandssysteem te laten groeien op soortgelijke wijze als voor een DVD+RW
met de optie -M. Het resultaat is een enkelsessie
DVD.
Om een DVD-RW in het beperkt overschrijven-formaat te zetten:
# dvd+rw-format /dev/cd0
Om terug te gaan naar het sequentiële formaat:
# dvd+rw-format -blank=full /dev/cd0
Multisessie DVD's worden door zeer weinig DVD-ROM-stations geaccepteerd en meestal lezen ze hopelijk tenminste de eerste sessie. DVD+R, DVD-R en DVD-RW kunnen in het sequentiële formaat meerdere sessies accepteren. Het idee van meerdere sessies bestaat niet voor de formaten DVD+RW en DVD-RW in beperkt overschrijven.
Om een nieuwe sessie achter een initiële (niet-gesloten) sessie op een DVD+R, DVD-R of DVD-RW in sequentieel formaat toe te voegen:
# growisofs -M /dev/cd0 -J -R /pad/naar/volgende gegevens
Het gebruik van dit commando met een DVD+RW of een DVD-RW in beperkt overschrijven-formaat voegt gegevens toe door de nieuwe sessie samen te voegen met de bestaande. Dit leidt tot een enkelsessie schijf. Deze manier kan gebruikt worden om gegevens achter een initiële sessie aan deze media toe te voegen.
Opmerking: Op deze media wordt wat ruimte gebruikt tussen elke sessie om het einde en begin van de sessies aan te geven. Daarom dienen sessies met grote hoeveelheden gegevens toegevoegd te worden om de mediaruimte te optimaliseren. Het aantal sessies is beperkt tot 154 voor een DVD+R, ongeveer 2000 voor een DVD-R en 127 voor een dubbellaags DVD+R.
Om meer informatie over een DVD te verkrijgen kan het commando dvd+rw-mediainfo /dev/cd0 met de schijf in het station gebruikt worden.
Meer informatie over dvd+rw-tools staat in de hulppagina growisofs(1), op de dvd+rw-tools website en in de archieven van de cdwrite mailing list.
Opmerking: De uitvoer van dvd+rw-mediainfo met betrekking tot de resulterende opname of het medium met problemen is verplicht voor elk probleemrapport. Zonder deze uitvoer volgt geen hulp.
DVD-RAM schrijvers komen met of een SCSI of een ATAPI interface. DMA toegang voor ATAPI apparaten moet worden ingeschakeld, wat gedaan kan worden door de volgende regel toe te voegen aan /boot/loader.conf:
hw.ata.atapi_dma="1"
Zoals vermeld in de introductie van dit hoofdstuk kan DVD-RAM gezien worden als een verwijderbare harde schijf. Zoals elke andere harde schijf moet de DVD-RAM “voorbereid” worden voor het eerste gebruik. In het voorbeeld wordt alle beschikbare ruimte gebruikt voor een standaard UFS2 bestandssysteem:
# dd if=/dev/zero of=/dev/acd0 bs=2k count=1 # bsdlabel -Bw acd0 # newfs /dev/acd0
Het DVD apparaat, acd0 moet worden gewijzigd naar gelang de configuratie.
Zodra de voorgaande operaties uitgevoerd zijn op de DVD-RAM kan het gekoppeld worden net als een normale harde schijf:
# mount /dev/acd0 /mnt
Hierna zal de DVD-RAM zowel lees- als beschrijfbaar zijn.
Soms is het opslaan van gegevens op een diskette nuttig, bijvoorbeeld als er geen andere verwijderbare opslagmedia beschikbaar zijn of als kleine hoeveelheden gegevens naar een andere computer moeten worden overgedragen.
In deze sectie wordt beschreven hoe diskettes in FreeBSD gebruikt dienen te worden. Hier worden hoofdzakelijk het formatteren en gebruik van 3,5 inch DOS-diskettes behandeld, maar de concepten zijn vergelijkbaar voor andere disketteformaten.
Diskettes worden benaderd door ingangen in /dev net zoals andere apparaten. Om een rauwe floppy te benaderen gebruikt u /dev/fdN.
Een diskette dient op laag niveau geformatteerd te worden voordat deze kan worden gebruikt. Dit wordt meestal door de fabrikant gedaan, maar formatteren is een goede manier om de integriteit van het medium te controleren. Hoewel het mogelijk is om grotere (of kleinere) schijfgroottes te forceren, zijn de meeste diskettes ontworpen voor 1440kB.
Een diskette kan op laag niveau geformatteerd worden met fdformat(1). Dit gereedschap verwacht de apparaatnaam als parameter.
Op basis van eventuele foutmeldingen kan bepaald worden of een schijf goed of slecht is.
Voor het formatteren van de diskette dienen de apparaten /dev/fdN gebruikt te worden. Nadat een 3,5 inch diskette in het station is gestoken:
# /usr/sbin/fdformat -f 1440 /dev/fd0
Nadat de diskette op laag niveau is geformatteerd, dient er schijflabel aan gekoppeld te worden. Dit schijflabel wordt later vernietigd, maar het systeem heeft het nodig om later de grootte en de geometrie van de schijf te bepalen.
Het nieuwe schijflabel neemt de gehele schijf over en bevat alle benodigde informatie over de geometrie van de diskette. De geometriewaarden van het schijflabel staan vermeld in /etc/disktab.
Nu kan bsdlabel(8) als volgt gedraaid worden:
# /sbin/bsdlabel -B -w /dev/fd0 fd1440
Nu is de diskette klaar om op hoog niveau geformatteerd te worden. Hiermee wordt een nieuw bestandssysteem opgezet, wat FreeBSD in staat stelt om naar de schijf te lezen en te schrijven. Nadat het nieuwe bestandssysteem is aangemaakt, wordt het schijflabel vernietigd, dus om de schijf te herformatteren is het noodzakelijk om het schijflabel opnieuw aan te maken.
Het bestandssysteem voor diskettes kan zowel UFS als FAT zijn. FAT is over het algemeen een betere keuze voor diskettes.
Om een nieuw bestandssysteem op de diskettes te zetten:
# /sbin/newfs_msdos /dev/fd0
De schijf is nu klaar voor gebruik.
Om de diskette te gebruiken kan mount_msdosfs(8) gebruikt worden om het medium aan te koppelen. Ook kan emulators/mtools uit de Portscollectie worden gebruikt.
De belangrijkste bandmedia zijn de 4mm, 8mm, QIC, mini-cartridge en DLT.
4mm-banden vervangen steeds vaker QIC-banden als back-upmedium voor werkstations. Deze trend werd versneld toen Connor Archive, een toonaangevende fabrikant van QIC-stations, overnam en daarna de productie van QIC-stations stopte. 4mm-stations zijn klein en stil maar genieten niet de betrouwbaarheidsreputatie van 8mm-stations. De cartridges zijn minder duur en kleiner (3 x 2 x 0,5 inch, 76 x 51 x 12 mm) dan 8mm-cartridges. Net zoals bij 8mm hebben de koppen bij 4mm een vergelijkbaar kort leven, omdat beiden gebruik maken van een helische scan.
De gegevensdoorvoer op deze stations begint bij ongeveer 150 kB/s, met pieken van 500 kB/s. De opslagcapaciteit begint bij 1,3 GB en eindigt bij 2,0 GB. Hardwarecompressie, die voor de meeste stations beschikbaar is, zorgt voor ongeveer een verdubbeling van de capaciteit. Bibliotheekeenheden van multi-station bandbiliotheken kunnen 6 stations in een enkel kabinet bevatten met automatische wisseling van de banden. De capaciteit van een bibliotheek loopt op tot 240 GB.
Door de DDS-3-standaard worden bandcapaciteiten van 12 GB (of 24 GB met compressie) ondersteund.
Net als 8mm-drives gebruiken 4mm-drives helische scan. Alle voor- en nadelen van helische scan gelden voor zowel 4mm- als 8mm-stations.
Banden dienen na 2.000 maal of 100 volledige back-ups afgedankt te worden.
8mm-banden zijn de meest gebruikte SCSI-banden. Ze vormen de beste keuze met betrekking tot het uitwisselen van banden. Bijna elk bedrijf heeft een Exabyte 2 GB 8mm-bandstation. 8mm-stations zijn betrouwbaar, gemakkelijk en stil. Cartridges zijn niet duur en klein (4,8 x 3,3 x 0,6 inch; 122 x 84 x 15 mm). Een nadeel van 8mm-banden is de relatief korte levensduur van de kop en band vanwege de hoge mate van relatieve beweging tussen de band en de koppen.
De gegevensdoorvoer varieert van ~250 kB/s tot ~500 kB/s. De gegevensomvang begint bij 300 MB en kan oplopen tot 7 GB. Hardwarecompressie, waarmee de meeste stations van deze soort zijn uitgerust, zorgt voor ongeveer een verdubbeling van de capaciteit. Deze stations zijn los of als multi-station bandbiliotheken met 6 stations en 120 banden in een enkele kast beschikbaar. In het laatste geval worden banden automatisch per stuk verwisseld. De capaciteit van een bibliotheek kan oplopen tot meer dan 840 GB.
Het model “Mammoth” van Exabyte ondersteunt een capaciteit van 12 GB (24 GB met compressie) per band en kost ongeveer twee maal zoveel als een gewoon bandstation.
Gegevens worden door middel van helische scan op de band gezet en de koppen zijn onder een hoek (ongeveer 6 graden) op het medium gepositioneerd. De band wordt 270 graden om de spoel gewikkeld die de koppen vasthoudt. Dit resulteert in een hoge gegevensdichtheid en dicht bij elkaar staande sporen die een hoek van de ene naar de andere kant van de band maken.
De banden en stations voor de QIC-150 zijn misschien de meest voorkomende bandstations en bandmedia. QIC-bandstations zijn de minst dure “serieuze” back-upstations. Het nadeel is de prijs van de media. QIC-banden zijn duur in vergelijking met 8mm- of 4mm-banden. De prijs per GB opslagruimte kan tot 5 maal zo hoog zijn. Indien een half dozijn banden toereikend is, zijn QIC-banden waarschijnlijk de juiste keuze. QIC is het meest voorkomende bandstation. Elk bedrijf heeft QIC-stations met een bepaalde capaciteit. QIC heeft namelijk een groot aantal capaciteiten per type band, die fysiek vergelijkbaar (soms identiek) zijn. QIC-banden zijn niet stil. Deze stations maken een hoorbaar geluid tijdens het zoeken voordat ze beginnen met het opnemen van gegevens en zijn duidelijk hoorbaar tijdens het lezen, schrijven en zoeken. QIC-banden zijn 6 x 4 x 0,7 inch of 152 x 102 x 17 mm groot.
De gegevensdoorvoer varieert van ~150 kB/s tot ~500 kB/s. Hardwarecompressie is mogelijk met veel van de nieuwere bandstations. QIC-stations worden steeds minder vaak geïnstalleerd. Ze worden vervangen door DAT-stations.
Gegevens worden in sporen op de band gezet. De sporen lopen parallel aan de lange as van het bandmedium van het ene naar het andere einde. Het aantal sporen, en daarmee de breedte van een spoor, varieert met de capaciteit van de band. De meeste, zo niet alle, nieuwe stations bieden achterwaartse leescompatibiliteit (en vaak ook achterwaartse schrijfcompabiliteit). QIC heeft een goede reputatie op het gebied van gegevensveiligheid (de mechanismen zijn eenvoudiger en robuuster dan die van helische scan-stations).
Banden dienen na 5.000 back-ups afgedankt te worden.
DLT-banden hebben de snelste gegevensdoorvoer van alle hiergenoemde bandstations. De band van 1/2 inch (12,5 mm) zit in een cartridge (4 x 4 x 1 inch; 100 x 100 x 25 mm) op één enkele haspel. De cartridge heeft een opklapbare opening aan één gehele kant van de cartridge. Het mechanisme van het station opent deze opening om de bandleider eruit te halen. De bandleider heeft een ovaal gat dat door het station gebruikt wordt om de band “vast te zetten”. De haspel die de band aanpakt is in het bandstation gesitueerd. Bij alle andere bandcartridges die hier genoemd zijn (9-sporige banden zijn de enige uitzondering) zitten zowel de haspel die de band levert als de haspel die de band aanpakt in de bandcartridge zelf.
De gegevensdoorvoer bedraagt ongeveer 1.5 MB/s, drie maal de doorvoer van 4mm-, 8mm-, en QIC-bandstations. De gegevenscapaciteit varieert van 10 GB tot 20 GB per stations. Stations zijn als meerdere-bandwisselaars en als bibliotheken van meerdere banden en meerdere stations beschikbaar, die 5 tot 900 banden bevatten verspreid over 1 tot 20 stations, waardoor een opslagcapaciteit van 50 GB tot 9 TB geleverd wordt.
Met compressie levert het formaat DLT Type IV tot 70 GB aan capaciteit.
Gegevens worden in sporen die parallel aan de looprichting lopen op de band gezet (net als met QIC-banden). Er worden twee sporen per keer geschreven. De levensduur van de lees- en schrijfkoppen is relatief lang. Als de band eenmaal stilstaat, is er geen relatieve beweging tussen de koppen en de band.
AIT is een nieuw formaat van Sony dat (met compressie) tot 50 GB gegevens per band kan bevatten. De band bevat geheugenchips die een index van de inhoud van de band bevatten. Deze index kan snel door het bandstation gelezen worden voor het bepalen van de positie van bestanden op de band, in plaats van de enkele minuten die nodig zijn voor andere banden. Software als SAMS:Alexandria kan meer dan veertig AIT-bandbibliotheken beheren, waarbij het direct met de geheugenchip van de band communiceert om de inhoud op het scherm te tonen, om te bepalen welke bestanden naar welke band zijn geback-upped en om de correcte band te vinden, laden en de gegevens ervan terug te zetten.
Dit soort bibliotheken kosten rond de $ 20.000, waardoor ze enigszins boven het budget van de hobbyist liggen.
Als de eerste keer van een nieuwe, geheel lege band wordt gelezen of ernaar wordt geschreven, mislukt dit. Het bericht op de console zier er analoog aan het volgende uit:
sa0(ncr1:4:0): NOT READY asc:4,1 sa0(ncr1:4:0): Logical unit is in process of becoming ready
De band bevat geen Identifier Block (bloknummer 0). Alle QIC-bandstations sinds de adoptie van de standaard QIC-525 schrijven een Identifier Block naar de band. Er zijn twee oplossingen:
mt fsf 1 zorgt ervoor dat het bandstation een Identifier Block naar de band schrijft.
De knop aan de voorkant van het paneel dient gebruikt te worden om de band uit te werpen.
De band dient opnieuw in het station gestoken te worden en met dump worden gegevens naar de band gedumpt.
dump geeft “DUMP: End of tape detected” en de console laat het volgende zien:“HARDWARE FAILURE info:280 asc:80,96”.
De band kan met mt rewind teruggespoeld te worden.
Hierna zijn alle bandbewerkingen succesvol.
Diskettes zijn niet bepaald een geschikt medium om back-ups mee te maken, omdat:
Het medium onbetrouwbaar is, in het bijzonder op de langere termijn;
Het back-uppen en terugzetten erg traag is;
Diskettes een zeer beperkte capaciteit hebben. De tijden dat een hele harde schijf naar een tiental diskettes kon worden geback-upped zijn allang verstreken.
Maar als er geen andere manier beschikbaar is om de gegevens te back-uppen, is een back-up naar diskettes beter dan helemaal geen back-up.
Gebruikte diskettes moet van goede kwaliteit zijn. Diskettes die al jaren op kantoor rondgeslingerd hebben, zijn een slechte keuze. In het ideale geval dienen nieuwe diskettes van een reputabele fabrikant gebruikt te worden.
Het beste kan naar diskettes worden geback-upped door gebruik te maken van tar(1) met de optie
-M (meerdere volumes), die back-ups over meerdere
diskettes ondersteunt.
Om alle bestanden in de huidige map en de submappen te back-uppen (als root):
# tar Mcvf /dev/fd0 *
Als de eerste diskette vol is, vraagt tar(1) om het volgende volume. Omdat tar(1) media-onafhankelijk is, refereert het aan volumes, in deze context diskettes.
Prepare volume #2 for /dev/fd0 and hit return:
Dit wordt herhaald (met oplopend volumenummer) totdat alle gespecificeerde bestanden zijn geback-upped.
Helaas staat tar(1) het gebruik van
de optie -z niet toe voor archieven over meerdere
volumes. Het is uiteraard mogelijk om alle bestanden met gzip(1) te
comprimeren, ze met tar(1) op diskettes te
zetten en ze daarna met gunzip(1) weer te
decomprimeren!
Om een volledige archief terug te zetten:
# tar Mxvf /dev/fd0
Er zijn twee manieren om alleen specifieke bestanden terug te zetten. Ten eerste kan met de eerste diskette begonnen worden:
# tar Mxvf /dev/fd0 bestandsnaam
Het programma tar(1) vraagt om de vervolgdiskettes totdat het benodigde bestand is gevonden.
Als alternatief kan, als bekend is op welke diskette het bestand staat, de betreffende diskette worden ingestoken en bovenstaand commando gebruikt worden. Als het eerste bestand op de diskette een vervolg is van de vorige diskette, waarschuwt tar(1) dat het bestand niet teruggezet kan worden, zelfs als hier niet om gevraagd is!
Het eerste wat nodig is voor het ontwepken van een back-upplan, is er voor te zorgen dat de volgende mogelijke problemen worden ondervangen:
Schijffalen
Per ongeluk verwijderde bestanden
Willekeurige bestandscorruptie
Complete machinevernietiging (door bijvoorbeeld brand), inclusief de vernietiging van lokaal beschikbare back-ups.
Het is goed mogelijk dat een aantal systemen het best geholpen zijn door voor al deze problemen een andere techniek te gebruiken. Behalve voor volledig persoonlijke systemen met niet echt belangrijke gegevens, is het zelfs onwaarschijnlijk dat één techniek alle mogelijke problemen kan afvangen.
Een aantal technieken in de gereedschapskist zijn:
Archiveren van een heel systeem op een back-up die niet lokaal wordt bewaard. Dit biedt bescherming tegen alle hierboven beschreven problemen, maar het is langzaam en onhandig om er een restore van te maken. Het is mogelijk om lokaal een kopie aan te houden en/of online, maar dan zijn er nog steeds onhandigheden, in het bijzonder voor restores voor gebruikers met beperkte rechten.
Snapshots van bestandssystemen. Dit werkt eigenlijk alleen in het geval bestanden per ongelijk verwijderd worden, maar het kan in dat geval erg handig zijn en het werkt snel en eenvoudig.
Een kopie maken van hele bestandssystemen en/of schijven (bijvoorbeeld een periodieke rsync(1) van een hele machine). Dit is in het algemeen het meest bruikbaar in netwerken met specifieke eisen. Voor algemene bescherming tegen het falen van een schijf, is het meestal minder geschikt dan RAID. Voor het herstellen van per ongeluk verwijderde bestanden is het vergelijkbaar aan UFS snapshots, maar dat hangt af van persoonlijke voorkeuren.
RAID. Minimaliseert of voorkomt downtijd als een schijf faalt. Dit ten koste van het vaker hebben van schijven die falen (omdat er meer van zijn), maar wel met een veel lagere urgentie.
Controleren van fingerprints van bestanden. Het hulpprogramma mtree(8) kan hier bij helpen. Hoewel dit geen back-uptechniek is, zorgt het er wel voor dat kan worden opgemerkt wanneer back-ups geraadpleegd moeten worden. Dit is in het bijzonder belangrijk voor offline back-ups en de fingerprints horen periodiek gecontroleerd te worden.
Het is makkelijk om met nog meer technieken op de proppen te komen, waaronder veel variaties op de bovengenoemde. Bijzondere eisen leiden vaak tot bijzondere oplossingen. Het back-uppen van een draaiende database vereist bijvoorbeeld een methode die toegespitst is op de gebruikte database software als tussenstap. Het is van groot belang om te onderkennen tegen welke gevaren er bescherming dient te zijn en hoe daarmee om te gaan.
De drie grote back-upprogramma's zijn dump(8), tar(1) en cpio(1).
De traditionele back-upprogramma's voor UNIX zijn dump en restore. Deze zien het station als een verzameling van schijfblokken, onder de abstracties van bestanden, koppelingen en mappen die door de bestandssystemen worden aangemaakt. In tegenstelling tot andere back-upprogramma's, verzorgt dump een back-up van een compleet bestandssysteem op een apparaat. Het is niet in staat om slechts een gedeelte van een bestandssysteem of een mapstructuur die meer dan één bestandssysteem in beslag neemt te back-uppen. Het commando dump schrijft geen bestanden en mappen naar band, maar de rauwe gegevensblokken waaruit de bestanden en mappen bestaan. Wanneer het gebruikt wordt om gegevens te extraheren, slaat restore tijdelijke bestanden standaard op in /tmp/ -- als u werkt vanaf een herstelschijf met een kleine map /tmp, moet u wellicht de omgevingsvariabele TMPDIR op een map met meer vrije ruimte instellen zodat de restore kan slagen.
Opmerking: Indien dump op een hoofdmap wordt gebruikt, wordt er geen back-up gemaakt van /home , /usr of van de vele andere mappen, aangezien dit typisch koppelpunten voor andere bestandssystemen of symbolische koppelingen binnen deze bestandssystemen zijn.
dump bevat eigenaardigheden die uit de begintijd in Versie 6 van AT&T UNIX (circa 1975) zijn overgebleven. De standaardparameters zijn geschikt voor banden met 9 sporen (6.250 bpi), niet voor de media met hoge dichtheid die vandaag beschikbaar zijn (tot 62.182 ftpi). Deze standaardwaarden dienen op de opdrachtregel overschreven te worden om de capaciteit van de huidige bandstations te benutten.
Het is ook mogelijk om gegevens met rdump en rrestore over een netwerk naar een bandstation dat aan een andere computer gekoppeld is te back-uppen. Beide programma's maken gebruik van rcmd(3) en ruserok(3) om toegang tot het bandstation op afstand te krijgen. De gebruiker die de back-up uitvoert moet vermeld staat in het bestand .rhosts op de computer op afstand. De argumenten die aan rdump en rrestore gegeven worden dienen geschikt te zijn voor gebruik op de computer op afstand. Als rdump gebruikt wordt om een dump te maken van een FreeBSD computer naar een Exabyte-bandstation dat met een Sun-computer genaamd komodo verbonden is:
# /sbin/rdump 0dsbfu 54000 13000 126 komodo:/dev/nsa8 /dev/da0a 2>&1
Let op: er kleven veiligheidsbezwaren aan het toestaan van authenticatie met .rhosts. De situatie dient goed geëvalueerd te worden.
Het is ook mogelijk om dump en restore op een veiligere manier via ssh te gebruiken.
Voorbeeld 19-1. Het gebruik van dump via ssh
# /sbin/dump -0uan -f - /usr | gzip -2 | ssh -c blowfish \ doelgebruiker@doelmachine.voorbeeld.com dd of=/mijngrotebestanden/dump-usr-10.gz
Ook kan de ingebouwde manier van dump gebruikt worden, door de omgevingsvariabele RSH in te stellen:
tar(1) stamt ook uit de tijd van Versie 6 van AT&T UNIX (circa 1975). Het werkt samen met het bestandssysteem. tar schrijft bestanden en mappen naar band en ondersteunt niet het volledige scala aan opties dat beschikbaar is met cpio(1), maar tar heeft niet de ongebruikelijke opdrachtpijplijn nodig die cpio gebruikt.
Om tar toe te passen op een Exabyte-bandstation die met een Sun genaamd komodo verbonden is:
# tar cf - . | rsh komodo dd of=tape-device obs=20b
Indien de veiligheid van back-uppen over een netwerk een punt is, dient gebruik te worden gemaakt van het commando ssh en niet van rsh.
cpio(1) is het originele UNIX bandprogramma voor magnetische media om bestanden uit te wisselen. cpio heeft opties (naast vele anderen) om byte-swapping uit te voeren, een aantal verschillende archiefformaten te schrijven en de gegevens over een pijplijn naar andere programma's te voeren. Deze laatste optie maakt cpio een uitstekende keuze voor installatiemedia. cpio weet niet hoe het door een mapstructuur moet lopen. Er dient een lijst met bestanden door stdin aangeleverd te worden.
cpio biedt geen ondersteuning voor back-ups over het netwerk. Er kan gebruik worden gemaakt van een pijplijn en rsh om de gegevens naar een banddrive op afstand te sturen.
# for f in maplijst; do find $f >> back-up.lijst done # cpio -v -o --format=newc < back-up.lijst | ssh gebruiker@host "cat > back-upapparaat"
Hier is maplijst een lijst van de mappen waarvan een back-up gemaakt dient te worden, gebruiker@host de gebruiker/hostnaam-combinatie die de back-ups uitvoert, en back-upapparaat het apparaat waar de back-ups naar toe geschreven te worden (bijvoorbeeld /dev/nsa0).
pax(1) is het antwoord van IEEE en POSIX op tar en cpio. In de loop der jaren zijn de verscheidene versies van tar en cpio licht incompatibel geworden. Dus in plaats van dit uit te vechten en ze volledig te standaardiseren, heeft POSIX een nieuw archiveringsprogramma gemaakt. pax poogt om veel van de verscheidene formaten van cpio en tar te lezen en te schrijven, met daarbij nog nieuwe, eigen formaten. De commandoverzameling lijkt meer op die van cpio dan op die van tar.
Amanda (Advanced Maryland Network Disk Archiver) is een client/server-back-upsysteem, in plaats van een enkel programma. Een Amanda server back-upt elk aantal computers dat een Amanda client en een netwerkverbinding met de Amanda server heeft naar een enkel bandstation. Een veelvoorkomend probleem bij bedrijven met een groot aantal schijven is dat de tijd die nodig is om de gegevens direct naar band te back-uppen langer is dan de tijd die voor de taak gereserveerd is. Amanda lost dit probleem op. Amanda kan gebruik maken van een “tussenschijf” om verschillende bestandssystemen tegelijkertijd te back-uppen. Amanda maakt “archiefverzamelingen” aan, een groep banden die gedurende een tijd gebruikt wordt om volledige back-ups te maken van alle bestandssystemen die in het instellingenbestand van Amanda vermeld staan. De “archiefverzameling” bevat ook incrementele (of differentiële) back-ups van alle bestandssystemen. Voor het herstellen van een beschadigd bestandssysteem zijn de meest recente volledige back-up en de incrementele back-ups nodig.
Het instellingenbestand biedt verfijnde controle over de back-ups en het netwerkverkeer door Amanda. Amanda kan elk bovenstaand back-upprogramma gebruiken om de gegevens naar de band te schijven. Amanda is òf als port òf als package beschikbaar.
“Nietsdoen” is geen computerprogramma, maar de de meest gebruikte back-upstrategie. Er zijn geen initiële kosten. Er is geen back-upschema om te volgen. Zeg gewoon nee. Als er iets met gegevens gebeurt, lach erom en leef ermee!
Als tijd en gegevens weinig tot niets waard zijn, is “Nietsdoen” het meest geschikte back-upprogramma. Maar wees bedacht, UNIX is een nuttig stuk gereedschap en er is zo maar binnen zes maanden een verzameling bestanden die wèl van waarde is.
“Nietsdoen” is de juiste back-upmethode voor /usr/obj en andere mapstructuren die zo opnieuw aangemaakt kunnen worden. Een voorbeeld zijn de bestanden waaruit de HTML- of PostScript versie van dit Handboek bestaan. Deze documentformaten zijn vanuit SGML-invoerbestanden aangemaakt. Het back-uppen van de HTML- of PostScript bestanden is niet nodig. Van de SGML-bestanden dient regelmatig een back-up gemaakt te worden.
dump(8). Punt uit.. Elizabeth D. Zwicky heeft stresstesten op alle hierboven besproken back-upprogramma's uitgevoerd. De heldere keuze voor het behouden van alle gegevens en alle eigenaardigheden van UNIX bestandssystemen is dump. Elizabeth heeft bestandssystemen aangemaakt met een grote verscheidenheid aan ongewone omstandigheden (en enkele minder ongebruikelijke) en heeft elk programma getest door een back-up van die bestandssystemen uit te voeren en ze te herstellen. De eigenaardigheden omvatten bestanden met gaten, bestanden met gaten en een blok nullen, bestanden met vreemde tekens in hun namen, onleesbare en onschrijfbare bestanden, apparaten, bestanden waarvan de grootte verandert tijdens het back-uppen, bestanden die aangemaakt/verwijderd worden tijdens het back-uppen en meer. Ze presenteerde de resultaten op LISA V in oktober 1991. Zie torture-testing Backup and Archive Programs.
Er zijn slechts vier stappen om te volgen bij het voorbereiden op elke ramp die voor kan komen.
Het schijflabel van elke schijf dient afgedrukt te worden (bijvoorbeeld met bsdlabel da0 | lpr), de bestandssysteemtabel (/etc/fstab) en alle opstartboodschappen, alles in tweevoud.
Ten tweede dient een “livefs” CD-ROM gebrandt te worden. Deze CD-ROM biedt ondersteuning voor het opstarten in een FreeBSD “livefs” reddingsmodus die gebruiker in staat stelt om vele taken uit te voeren zoals het draaien van dump(8), restore(8), fdisk(8), bsdlabel(8), newfs(8) en meer. Een livefs CD-beeld voor FreeBSD/i386 8.3-RELEASE is beschikbaar op ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/ISO-IMAGES/8.3/FreeBSD-8.3-RELEASE-i386-livefs.iso.
Opmerking: Livefs CD-beelden zijn niet beschikbaar voor FreeBSD 9.0-RELEASE en nieuwer. Naast de beelden voor CDROM-installaties kunnen ook beelden voor flash-drive-installaties gebruikt worden om een systeem te redden. Het “memstick”-beelden voor FreeBSD/i386 9.0-RELEASE is beschikbaar op ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/i386/ISO-IMAGES/9.0/FreeBSD-9.0-RELEASE-i386-memstick.img.
Ten derde dienen regelmatig back-upbanden aangemaakt te worden. Alle veranderingen die na de laatste back-up zijn gemaakt kunnen onherroepelijk verloren zijn gegaan. De back-upbanden dienen beveiligd te worden tegen overschrijven.
Ten vierde dienen de “livefs” CD-ROM die in stap twee gemaakt is en de back-upbanden getest te worden. Van de handelingen dienen aantekeningen gemaakt te worden. De aantekeningen, de CD-ROM, de afdrukken en de back-upbanden dienen gezamenlijk bewaard te worden. Tijdens het herstellen kunnen de notities ervoor zorgen dat de back-upbanden vernietigd worden. Hoe? In plaats van tar xvf /dev/sa0 kan per ongeluk tar cvf /dev/sa0 worden ingetypt, waardoor de back-upband overschreven wordt.
Als extra veiligheidsmaatregel dienen telkens een “livefs” CD-ROM en twee back-upbanden gemaakt te worden. Eén van deze banden dient op een plaats op afstand bewaard te worden. Zo'n plaats is NIET de kelder van het zelfde kantoorgebouw. Een aantal bedrijven in het World Trade Center heeft deze les op de harde manier geleerd. Zo'n plaats dient fysiek gescheiden te zijn van de computers en de schijven door een significante afstand.
De hamvraag is: heeft de hardware het overleefd? Er zijn regelmatig back-ups gemaakt, dus zorgen over de software zijn niet nodig.
Indien hardware beschadigd is, dienen kapotte onderdelen vervangen te worden voordat gepoogd wordt om een computer te gebruiken.
Plaats de “livefs” CD-ROM in de CD-ROM drive indien de hardware in orde is en start de computer op. Het originele installatiemenu wordt op het scherm getoond. Kies het land van toepassing en kies daarna Fixit -- Repair mode with CDROM/DVD/floppy en kies het item CDROM/DVD -- Use the live filesystem CDROM/DVD. restore en de andere benodigde programma's staan in /mnt2/rescue.
Herstel elk bestandssysteem apart.
Probeer de rootpartitie van de eerste schijf aan te koppelen (bijvoorbeeld mount /dev/da0a /mnt). Als het schijflabel beschadigd is, gebruik dan bsdlabel om de schijf opnieuw te partitioneren en te labelen zodat deze overeenkomt met het afgedrukte en bewaarde label. Gebruik voor het opnieuw aanmaken van de bestandssystemen newfs. Koppel de rootpartitie van de schijf opnieuw aan voor lezen en schrijven (mount -u -o rw /mnt). Gebruik voor het herstellen van de gegevens van dit bestandssysteem het back-upprogramma en de back-upbanden (bijvoorbeeld restore vrf /dev/sa0). Koppel nu het bestandssysteem af (bijvoorbeeld umount /mnt). Herhaal dit voor elk beschadigd bestandssysteem.
Back-up de gegevens naar nieuwe banden als het systeem weer draait. De omstandigheden die verantwoordelijk waren voor de crash of het gegevensverlies kunnen weer voorkomen. Nu een extra uur investeren, kan later grote zorgen besparen.
Naast de schijven die fysiek in de computer zitten, diskettes, CD's, harde schijven, enzovoort, worden er ook andere vormen van schijven door FreeBSD begrepen: de virtuele schijven.
Dit omvat netwerkbestandssystemen zoals het Network File System en Coda, geheugengebaseerde bestandssystemen en bestandsgebaseerde bestandssystemen.
Nagelang de gebruikte versie van FreeBSD, zijn er andere gereedschappen voor het aanmaken en gebruiken van bestandsgebaseerde en geheugengebaseerde bestandssystemen.
Opmerking: Gebruik devfs(8) om de apparaatnodes transparant voor de gebruiker toe te wijzen.
Met mdconfig(8) kunnen geheugenschijven, md(4), ingesteld worden en aangezet worden. Om mdconfig(8) te gebruiken, moet de module md(4) geladen worden of ondersteuning aan het kernelinstellingenbestand toegevoegd worden:
device md
Het commando mdconfig(8) ondersteunt drie types geheugen-gebaseerde virtuele schijven: geheugenschijven die met malloc(9) toegewezen zijn, geheugenschijven die een bestand als basis gebruiken en geheugenschijven die swapruimte als basis gebruiken. Een mogelijk gebruik is het aankoppelen van een beeld van een diskette of CD dat in een bestand bewaard wordt.
Om een bestaand beeld van een bestandssysteem aan te koppelen:
Voorbeeld 19-3. mdconfig gebruiken om een bestaand beeld van een bestandssysteem aan te koppelen
# mdconfig -a -t vnode -f schijfbeeld -u 0 # mount /dev/md0 /mnt
Om een nieuw beeld van een bestandssysteem aan te maken met mdconfig(8):
Voorbeeld 19-4. Nieuwe bestandsgebaseerde schijf aanmaken met mdconfig
# dd if=/dev/zero of=nieuwbeeld bs=1k count=5k 5120+0 records in 5120+0 records out # mdconfig -a -t vnode -f nieuwbeeld -u 0 # bsdlabel -w md0 auto # newfs md0a /dev/md0a: 5.0MB (10240 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 1.25MB, 80 blks, 192 inodes. super-block backups (for fsck -b #) at: 160, 2720, 5280, 7840 # mount /dev/md0a /mnt # df /mnt Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/md0a 4710 4 4330 0% /mnt
Indien het eenheidsnummer niet met de optie -u
gespecificeerd wordt, gebruikt mdconfig(8) de
automatische toewijzing van md(4) om een
ongebruikt apparaat te selecteren. De naam van het toegewezen apparaat wordt op
stdout weergegeven als md4. Meer details staan in de
hulppagina van mdconfig(8).
Het commando mdconfig(8) is erg nuttig, hoewel het veel opdrachten vergt om een bestandsgebaseerd bestandssysteem aan te maken. FreeBSD wordt met mdmfs(8) geleverd. Dit programma stelt een md(4)-schijf in door gebruik te maken van mdconfig(8), zet er een bestandssysteem op door gebruik te maken van newfs(8) en koppel het aan door gebruik te maken van mount(8). Om hetzelfde bestandssysteembeeld als hierboven aan te maken en aan te koppelen:
Voorbeeld 19-5. Instellen en aankoppelen van een bestandsgebaseerde schijf met mdmfs
# dd if=/dev/zero of=nieuwbeeld bs=1k count=5k 5120+0 records in 5120+0 records out # mdmfs -F nieuwbeeld -s 5m md0 /mnt # df /mnt Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/md0 4718 4 4338 0% /mnt
Als de optie md zonder eenheidsnummer gebruikt wordt,
gebruikt mdmfs(8) de
automatische toewijzing van md(4) om automatisch
een ongebruikt apparaat te selecteren. Meer details staan in de hulppagina van
mdmfs(8).
Voor een geheugen gebaseerd bestands systeem moet normaal gesproken “wisselbestand geheugen” gebruikt worden. Gebruik maken van wisselbestand geheugen wil niet perse zeggen dat de geheugen schijf direct in het wisselbestand gezet wordt, maar dat het bestand naar het wisselbestand geschreven kan worden indien nodig. Het is ook mogelijk om malloc(9) gebaseerde geheugen schijven te maken, maar door hiervan gebruik te maken kan het gebeuren dat het systeem crashed als de kernel uit het geheugen loopt.
Voorbeeld 19-6. Nieuwe geheugengebaseerde schijf aanmaken met mdconfig
# mdconfig -a -t swap -s 5m -u 1 # newfs -U md1 /dev/md1: 5.0MB (10240 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 1.27MB, 81 blks, 192 inodes. with soft updates super-block backups (for fsck -b #) at: 160, 2752, 5344, 7936 # mount /dev/md1 /mnt # df /mnt Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/md1 4718 4 4338 0% /mnt
Als een geheugen- of bestandsgebaseerd bestandssysteem niet gebruikt wordt, dienen alle bronnen aan het systeem vrijgegeven te worden. Koppel als eerste het bestandssysteem af, gebruikt daarna mdconfig(8) om de schijf van een systeem los te koppelen en de bronnen vrij te geven.
Om bijvoorbeeld alle bronnen die door /dev/md4 gebruikt worden los te koppelen en vrij te geven:
# mdconfig -d -u 4
Het is mogelijk om de informatie over ingestelde md(4) apparaten weer te geven door gebruik te maken van mdconfig -l.
FreeBSD biedt een mogelijkheid om samen met Soft Updates: snapshots van bestandssystemen.
Snapshots bieden de mogelijkheid om beelden van een gespecificeerd bestandssysteem te maken en ze als bestand te behandelen. Snapshotbestanden moeten aangemaakt worden in het bestandssysteem waarop de handeling wordt uitgevoerd en er mogen niet meer dan 20 snapshots per bestandssysteem worden aangemaakt. Actieve snapshots worden opgeslagen in het superblok zodat ze persistent zijn met afkoppel- en heraankoppelbewerkingen en met het opnieuw opstarten van het systeem. Als een snapshot niet langer nodig is, kan het met het standaardcommando rm(1) worden verwijderd. Snapshots kunnen in elke volgorde verwijderd worden, alhoewel misschien niet alle gebruikte ruimte teruggewonnen wordt omdat sommige vrijgegeven blokken mogelijk door een ander snapshot geclaimd worden.
De onveranderlijke bestandsvlag snapshot wordt door mksnap_ffs(8)
ingesteld nadat het snapshotbestand initieel is aangemaakt. Het commando unlink(1) maakt een
uitzondering voor snapshotbestanden aangezien het toestaat dat ze verwijderd worden.
Snapshotbestanden worden aangemaakt met mount(8). Om een snapshot van /var in het bestand /var/snapshot/snap te plaatsen:
# mount -o -o snapshot /var/snapshot/snap /var
Als alternatief kan mksnap_ffs(8) gebruikt worden om een snapshot aan te maken:
# mksnap_ffs /var /var/snapshot/snap
Snapshotbestanden kunnen gezocht worden op een bestandssysteem (bijvoorbeeld /var) door gebruik te maken van het commando find(1):
# find /var -flags snapshot
Nadat een snapshot is aangemaakt, kan het voor een aantal dingen gebruikt worden:
Sommige systeembeheerders gebruiken een snapshotbestand voor back-updoeleinden, omdat het snapshot naar CD's of band overgezet kan worden;
De bestandssysteem integriteit controle, fsck(8) kan gebruikt worden op het snapshot. Ervan uitgaande dat het bestandssysteem schoon was toen het werd aangekoppeld, zou dit altijd een schoon (en onveranderlijk) resultaat moeten opleveren. Dit is in principe wat het fsck(8)-achtergrondsproces doet;
Het commando dump(8) draaien op het
snapshot. Er wordt een dump teruggegeven die consistent is met het
bestandssysteem en tijdsstempel van het snapshot. dump(8) kan ook in
één commando een snapshot maken, een dumpbeeld aanmaken en daarna het
snapshot verwijderen door gebruik te maken van de vlag -L;
Het snapshot kan met mount(8) als bevroren beeld van het bestandssysteem worden aangekoppeld. Om het snapshot /var/snapshot/snap aan te koppelen:
# mdconfig -a -t vnode -f /var/snapshot/snap -u 4 # mount -r /dev/md4 /mnt
Het is nu mogelijk om door de structuur van het bevroren bestandssysteem /var te lopen dat aangekoppeld is op /mnt. Alles zal initieel in dezelfde toestand verkeren als op het moment dat het snapshot werd aangemaakt. De enige uitzondering hierop is dat eerdere snapshots als bestanden met lengte nul verschijnen. Als een snapshot niet meer nodig is, kan het als volgt afgekoppeld worden:
# umount /mnt # mdconfig -d -u 4
Meer informatie over softupdates en snapshots van
bestandssystemen, inclusief technische documenten, staat op de website van Marshall Kirk
McKusick op http://www.mckusick.com/.
Quota zijn een optionele mogelijkheid van het besturingssysteem om de hoeveelheid schijfruimte en/of het aantal bestanden dat gebruikers of leden van een groep per bestandssysteem mogen gebruiken te beperken. Dit wordt het meeste gebruikt op timesharing-systemen waar het wenselijk is om het aantal bronnen dat elke gebruiker of groep van gebruikers mag gebruiken te beperken. Dit voorkomt dat één gebruiker of groep van gebruikers alle beschikbare schijfruimte in beslag neemt.
Controleer alvorens te proberen om schijfquota te gebruiken of quota ingesteld zijn in de kernel. Dit gebeurt door het toevoegen van de volgende regel aan het kernelinstellingenbestand:
options QUOTA
De standaardkernel GENERIC heeft deze optie niet aanstaan, dus is het nodig om een eigen kernel in te stellen, te bouwen en te installeren om gebruik te kunnen maken van schijfquota. Meer informatie over het instellen van de kernel staat in Hoofdstuk 9.
Vervolgens dienen schijfquota aangezet te worden in /etc/rc.conf. Op FreeBSD 7.X en eerder wordt deze regel toegevoegd:
enable_quotas="YES"
Voeg op FreeBSD 8.0-RELEASE en nieuwer in plaats daarvan deze regel toe:
quota_enable="YES"
Voor fijnere controle over de opstartquota zijn extra instellingsvariabelen beschikbaar. Normaalgesproken wordt de integriteit van de quota van elk bestandssysteem tijdens het opstarten door quotacheck(8) gecontroleerd. quotacheck(8) verzekert dat de gegevens in de quotadatabase een juiste afspiegeling vormen van de gegevens op het bestandssysteem. Dit proces neemt erg veel tijd in beslag en beïnvloedt de tijd die een systeem nodig heeft om op te starten significant. Om deze stap over te slaan, bestaat een variabele in /etc/rc.conf:
check_quotas="NO"
Als laatste dient /etc/fstab bewerkt te worden om schijfquota per bestandssysteem aan te zetten. Hier kunnen gebruiker- of groepquota of beide worden aangezet voor alle bestandssystemen.
Om quota per gebruiker op een bestandssysteem aan te zetten, dient de optie userquota aan het optieveld toegevoegd te worden aan de regel
in /etc/fstab voor het bestandssysteem waar quota
worden aangezet. Bijvoorbeeld:
/dev/da1s2g /home ufs rw,userquota 1 2
Analoog, om groepquota aan te zetten, dient de optie groupquota in plaats van userquota
gebruikt te worden. Om zowel gebruikers- als groepsquota aan te zetten, dient de
regel als volgt veranderd te worden:
/dev/da1s2g /home ufs rw,userquota,groupquota 1 2
Standaard worden de quotabestanden opgeslagen in de hoofdmap van het bestandssysteem onder de namen quota.user en quota.group voor respectievelijk gebruikers- en groepsquota. Meer informatie staat in fstab(5). Alhoewel de hulppagina fstab(5) vermeld dat een alternatieve plaats voor de quotabestanden gespecificeerd kan worden, wordt dit niet aangeraden omdat de verschillende quotagereedschappen dit niet juist schijnen af te handelen.
Hier aangekomen dient het systeem opnieuw opgestart te worden met de nieuwe kernel. /etc/rc voert automatisch de juiste commando's uit om de initiële quotabestanden aan te maken voor alle quota die in /etc/fstab zijn aangezet. Het is dus niet nodig om handmatig quotabestanden met lengte nul aan te maken.
Tijdens normale bewerkingen moet het niet nodig zijn om de commando's quotacheck(8), quotaon(8) of quotaoff(8) handmatig te draaien. Lees wel de betreffende hulppagina's om bekend te raken met de werking ervan.
Indien het systeem ingesteld voor gebruik van quota, controleer dan of ze echt aanstaan. Een eenvoudige manier om dit te doen is de volgende:
# quota -v
Er hoort een eenregelige samenvatting te verschijnen over het schijfgebruik en de huidige quotalimieten voor elk bestandssysteem waarop quota aanstaan.
Nu kunnen quotalimieten toegewezen worden met edquota(8).
Er zijn verschillende opties om grenzen te stellen aan de hoeveelheid schijfruimte die een gebruiker of groep mag toewijzen en het aantal bestanden dat ze mogen aanmaken. Toewijzingen kunnen begrensd worden met betrekking tot schijfruimte (blokquota) of het aantal bestanden (inode-quota) of een combinatie van beide. Elk van deze limieten is op zijn beurt weer opgesplitst in twee categoriën: harde en zachte limieten.
Een harde limiet mag niet overschreden worden. Indien een gebruiker de harde limiet bereikt, mag deze geen verdere toewijzingen maken op het betreffende bestandssysteem. Indien een gebruiker bijvoorbeeld een harde limiet heeft van 500 kB op een bestandssysteem en er 490 kB van gebruikt, kan deze nog slechts 10 kB toewijzen. Een poging om 11 kB toe te wijzen zal mislukken.
Zachte limieten kunnen voor een beperkte tijd overschreden worden. Deze periode staat bekend als de gratieperiode, die standaard een week bedraagt. Als een gebruiker de zachte limiet langer dan de gratieperiode overschrijdt, verandert de zachte limiet in een harde limiet en zijn er geen verdere toewijzingen toegestaan. Als de gebruiker onder de zachte limiet komt, wordt de gratieperiode opnieuw ingesteld.
Het volgende is een voorbeeld van een mogelijk gebruik van edquota(8). Als het commando edquota(8) gestart wordt, wordt de tekstverwerker opgestart die door de omgevingsvariabele EDITOR gespecificeerd is, of de tekstverwerker vi als de variabele EDITOR niet is ingesteld. Nu kunnen de quotalimieten bewerkt worden.
# edquota -u test
Quotas for user test:
/usr: kbytes in use: 65, limits (soft = 50, hard = 75)
inodes in use: 7, limits (soft = 50, hard = 60)
/usr/var: kbytes in use: 0, limits (soft = 50, hard = 75)
inodes in use: 0, limits (soft = 50, hard = 60)
Normaalgesproken worden er twee regels weergegeven voor elk bestandssysteem waarvoor quota gelden: één regel voor de bloklimieten, en één voor de inode-limieten. Om de quotalimieten te veranderen dient de waarde ervan veranderd te worden. Om bijvoorbeeld de bloklimiet van een gebruiker te veranderen van een zachte limiet van 50 en een harde limiet van 75 in een zachte limiet van 500 en een harde limiet van 600, dient het volgende veranderd te worden:
/usr: kbytes in use: 65, limits (soft = 50, hard = 75)
In:
/usr: kbytes in use: 65, limits (soft = 500, hard = 600)
De nieuwe quotalimieten gelden zodra de tekstverwerker verlaten wordt.
Soms is het gewenst om quotalimieten in te stellen op een aantal UID's. Dit kan
gedaan worden door de optie -p van edquota(8) te
gebruiken. Wijs eerst de gewenste quotalimiet aan een gebruiker toe en draai
daarna edquota -p protogebruiker beginuid-einduid.
Indien bijvoorbeeld gebruiker test de gewenste
quotalimieten heeft, kan het volgende commando gebruikt worden om deze quotalimieten
te dupliceren voor UID's 10.000 tot en met 19.999:
# edquota -p test 10000-19999
Meer informatie staat in de hulppagina voor edquota(8).
Zowel quota(1) als repquota(8) kunnen gebruikt worden om de quotalimieten en het schijfgebruik te controleren. Het commando quota(1) kan gebruikt worden om de quota van zowel individuele gebruikers als groepen en het schijfgebruik te controleren. Een gebruiker mag alleen de eigen quota en de quota van een groep waarvan deze lid is controleren. Alleen de beheerder mag alle gebruikers- en groepsquota bekijken. Het commando repquota(8) kan gebruikt worden om een overzicht te krijgen van alle quota en gebruik van bestandssystemen waarvan quota aanstaan.
Het volgende is een mogelijke uitvoer van het commando quota -v voor een gebruiker die quotalimieten heeft op twee bestandssystemen.
Disk quotas for user test (uid 1002):
Filesystem usage quota limit grace files quota limit grace
/usr 65* 50 75 5days 7 50 60
/usr/var 0 50 75 0 50 60
Voor het bestandssysteem /usr in bovenstaand voorbeeld overschrijdt deze gebruiker de zachte limiet van 50 kB momenteel met 15 kB en heeft deze 5 dagen van de gratieperiode over. De asterisk, * geeft aan dat de gebruiker momenteel de quotalimiet overschrijdt.
Normaalgesproken worden bestandssystemen waarvan de gebruiker geen schijfruimte
gebruikt niet weergegeven in de uitvoer van quota(1), zelfs niet
als er de gebruiker een quotalimiet heeft voor dat bestandssysteem. De optie
-v geeft deze bestandssystemen weer, zoals het
bestandssysteem /usr/var in bovenstaand
voorbeeld.
Quota worden afgedwongen door het quota-subsysteem op de NFS-server. De daemon rpc.rquotad(8) stelt quota-informatie beschikbaar aan het commando quota(1) op de NFS-cliënts, wat de gebruikers op deze machines in staat stelt hun quota-statistieken in te zien.
rpc.rquotad dient als volgt in /etc/inetd.conf aangezet te worden:
rquotad/1 dgram rpc/udp wait root /usr/libexec/rpc.rquotad rpc.rquotad
Vervolgens dient inetd opnieuw gestart te worden:
# /etc/rc.d/inetd restart
FreeBSD biedt uitstekende on-line bescherming tegen onbevoegde gegevenstoegang. Bestandsrechten en Mandatory Access Control (MAC) (zie Hoofdstuk 17) helpen voorkomen dat onbevoegde derde partijen toegang tot de gegevens krijgen als het besturingssysteem actief is en de computer aanstaat. De door het besturingssysteem afgedwongen rechten zijn echter niet relevant als een aanvaller fysieke toegang tot een computer heeft en deze de harde schijf van de computer in een ander systeem kan plaatsen om de gevoelige gegevens te kopiëren en te analyseren.
Afgezien van hoe een aanvaller in het bezit van een harde schijf of een uitgezette computer gekomen is, kan GEOM Based Disk Encryption (gbde) de gegevens op het bestandssysteem van de computer zelfs tegen hooggemotiveerde aanvallers met aanzienlijke middelen beschermen. In tegenstelling tot lastige versleutelmethoden die alleen losse bestanden versleutelen, versleutelt gbde gehele bestandssystemen op een transparante manier. De harde schijf komt nooit in aanraking met klare tekst.
Los van hoe een aanvaller in het bezit van een harde schijf of een uitgezette computer gekomen is, kunnen de cryptografische subsystemen GEOM Based Disk Encryption (gbde) en geli in FreeBSD gegevens op bestandssystemen van een computer beschermen tegen zelfs de meer gemotiveerde belagers die ook nog eens adequate middelen hebben. Anders dan met lastige versleutelingsmethoden die alleen individuele bestanden versleutelen, versleutelen gbde en geli transparant complete bestandssystemen. Er komt nooit platte tekst op een harde schijf.
Word root
Het instellen van gbde vereist beheerdersrechten.
% su - Password:
Voeg ondersteuning voor gbde(4) aan het kernelinstellingenbestand toe
Voeg de volgende regel toe aan het kernelinstellingenbestand:
options GEOM_BDE
Herbouw de kernel opnieuw zoals beschreven in Hoofdstuk 9.
Start op met de nieuwe kernel.
Een alternatief voor het hercompileren van de kernel is door gebruik te maken van kldload(8) om gbde(4) te laden:
# kldload geom_bde
In het volgende voorbeeld wordt aangenomen dat er een nieuwe harde schijf aan het systeem wordt toegevoegd die een enkele versleutelde partitie zal bevatten. Deze partitie wordt aangekoppeld als /private. gbde kan ook gebruikt worden om /home en /var/mail te versleutelen, maar daarvoor zijn complexere instructies nodig die buiten het bereik van deze inleiding vallen.
Voeg een nieuwe harde schijf toe
Voeg de nieuwe harde schijf toe zoals beschreven in Paragraaf 19.3. In dit voorbeeld is een nieuwe harde schijfpartitie toegevoegd als /dev/ad4s1c. De apparaten /dev/ad0s1* stellen bestaande standaard FreeBSD partities van het voorbeeldsysteem voor.
# ls /dev/ad* /dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1 /dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c /dev/ad0s1a /dev/ad0s1d /dev/ad4
Maak een map aan voor gbde lockbestanden
# mkdir /etc/gbde
Het lockbestand voor gbde bevat informatie die gbde nodig heeft om toegang te krijgen tot versleutelde partities. Zonder toegang tot de lockbestand is gbde niet in staat om de gegevens die op de versleutelde partitie staan te ontsleutelen zonder aanzienlijke handmatige tussenkomst die niet door de software ondersteund wordt. Elke versleutelde partitie gebruikt een ander lockbestand.
Initialiseer de gbde-partitie
Een gbde-partitie dient geïnitialiseerd te worden voordat deze kan worden gebruikt. Deze initialisatie dient slechts eenmalig uitgevoerd te worden:
# gbde init /dev/ad4s1c -i -L /etc/gbde/ad4s1c.lock
gbde(8) opent een tekstverwerker om verschillende instellingen in een sjabloon te kunnen instellen. Stel de sector_size in op 2048 als UFS of UFS2 wordt gebruikt:
# $FreeBSD: src/sbin/gbde/template.txt,v 1.1 2002/10/20 11:16:13 phk Exp $ # # Sector size is the smallest unit of data which can be read or written. # Making it too small decreases performance and decreases available space. # Making it too large may prevent filesystems from working. 512 is the # minimum and always safe. For UFS, use the fragment size # sector_size = 2048 [...]
gbde(8) vraagt twee keer om de wachtwoordzin voor het beveiligen van de gegevens. De wachtwoordzin dient beide keren hetzelfde te zijn. De mogelijkheid van gbde om de gegevens te beveiligen is geheel afhankelijk de gekozen wachtwoordzin. [10]
Het commando gbde init maakt een lockbestand aan voor de gbde-partitie die in dit voorbeeld is opgeslagen als /etc/gbde/ad4s1c.lock. gdbde slotbestanden moeten eindigen op “.lock” om correct door het opstartscript /etc/rc.d/gbde gedetecteerd te worden.
Let opgbde lockbestanden moeten samen met de inhoud van versleutelde partities geback-upped worden. Hoewel het verwijderen van een lockbestand op zich een gedreven aanvaller er niet van weerhoudt een gbde partitie te ontsleutelen, is de wettige eigenaar zonder het lockbestand niet in staat om de gegevens op de versleutelde partitie te benaderen zonder een aanzienlijke hoeveelheid werk die in het geheel niet ondersteund wordt door gbde(8) of de ontwerper ervan.
Koppel de versleutelde partitie aan de kernel
# gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock
Er wordt om de wachtwoordzin gevraagd die gekozen is tijdens de initialisatie van de versleutelde partitie. Het nieuwe versleutelde apparaat verschijnt in /dev als /dev/apparaatnaam.bde:
# ls /dev/ad* /dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1 /dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c /dev/ad0s1a /dev/ad0s1d /dev/ad4 /dev/ad4s1c.bde
Maak een bestandssysteem op het versleutelde apparaat
Nu het versleutelde apparaat aan de kernel gekoppeld is, kan een bestandssysteem
op het apparaat aangemaakt worden. Met newfs(8) kan een
bestandssysteem op het versleutelde apparaat aangemaakt wordne. Aangezien het
veel sneller is om een nieuw UFS2 bestandssysteem te initialiseren dan om een oud
UFS1 bestandssysteem te initialiseren, is het aan te raden om newfs(8) met de
optie -O2 te gebruiken.
# newfs -U -O2 /dev/ad4s1c.bde
Opmerking: Voer newfs(8) uit op een aangekoppelde gbde-partitie die geïndificeerd wordt door de uitbreiding *.bde op de apparaatnaam.
Mount de versleutelde partitie
Maak een koppelpunt voor het versleutelde bestandssysteem aan:
# mkdir /private
Mount het versleutelde bestandssysteem:
# mount /dev/ad4s1c.bde /private
Controleer of het versleutelde bestandssysteem beschikbaar is
Het versleutelde bestandssysteem is nu zichtbaar met df(1) en gebruiksklaar:
% df -H Filesystem Size Used Avail Capacity Mounted on /dev/ad0s1a 1037M 72M 883M 8% / /devfs 1.0K 1.0K 0B 100% /dev /dev/ad0s1f 8.1G 55K 7.5G 0% /home /dev/ad0s1e 1037M 1.1M 953M 0% /tmp /dev/ad0s1d 6.1G 1.9G 3.7G 35% /usr /dev/ad4s1c.bde 150G 4.1K 138G 0% /private
Elke keer nadat het systeem is opgestart dient elk versleuteld bestandssysteem opnieuw aan de kernel gekoppeld te worden, op fouten gecontroleerd te worden, en aangekoppeld te worden voordat de bestandssystemen gebruikt kunnen worden. De benodigde commando's dienen als de gebruiker root uitgevoerd te worden.
Koppel de gbde-partitie aan de kernel
# gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock
Er wordt om de wachtwoordzin gevraagd die gekozen is tijdens de initialisatie van de versleutelde gbde-partitie.
Controleer het bestandssysteem op fouten
Aangezien het nog niet mogelijk is om versleutelde bestandssystemen op te nemen in /etc/fstab voor automatische controle, dienen de bestandssystemen voordat ze aangekoppeld worden handmatig op fouten gecontroleerd te worden door fsck(8) uit te voeren:
# fsck -p -t ffs /dev/ad4s1c.bde
Mount het versleutelde bestandssysteem
# mount /dev/ad4s1c.bde /private
Het versleutelde bestandssysteem is nu klaar voor gebruik.
Het is mogelijk om een script aan te maken om automatisch een versleutelde partitie aan te koppelen, op fouten te controleren en aan te koppelen, maar vanwege veiligheidsredenen dient het script niet het wachtwoord voor gbde(8) te bevatten. In plaats hiervan wordt het aangeraden om zulke scripts handmatig uit te voeren en het wachtwoord via de console of ssh(1) te geven.
Als alternatief, wordt er een rc.d script bijgeleverd. De argumenten kunnen via rc.conf(5) doorgegeven worden. Bijvoorbeeld:
gbde_autoattach_all="YES" gbde_devices="ad4s1c" gbde_lockdir="/etc/gbde"
Hierdoor is het noodzakelijk dat de wachtwoordzin voor gbde bij het starten wordt ingegeven. Na het invoeren van de juiste wachtwoordzin wordt de met gbde versleutelde partitie automatisch aangekoppeld. Dit kan erg handig zijn bij het gebruik van gbde op notebooks.
gbde(8) versleutelt de sectorlading door gebruik te maken van 128-bit AES in CBC-modus. Elke sector op de schijf wordt met een andere AES-sleutel versleuteld. Meer informatie over het cryptografische ontwerp van gbde, inclusief de methode die gebruikt wordt om de sectorsleutels van de door de gebruiker gegeven wachtwoordzin af te leiden, staan in gbde(4).
sysinstall(8) is niet compatibel met apparaten die met gbde versleuteld zijn. Alle *.bde apparaten moeten van de kernel ontkoppeld worden voordat sysinstall(8) gebruikt wordt om te voorkomen dat het crasht tijdens het initiële zoeken naar apparaten. Om het versleutelde apparaat dat in dit voorbeeld gebruikt wordt te ontkoppelen:
# gbde detach /dev/ad4s1c
gbde kan niet met vinum volumes gebruikt worden, omdat vinum(4) geen gebruik maakt van het subsysteem geom(4).
Een alternatieve cryptografische GEOM klassie is beschikbaar - geli. Deze wordt op het moment ontwikkeld door Pawel Jakub
Dawidek <pjd@FreeBSD.org>. geli verschilt van gbde in de
mogelijkheden en in het gebruik van een andere methode voor het
versleutelen.
De meest belangrijke mogelijkheden van geli(8) zijn:
Gebruikt het crypto(9) framework; als cryptografische hardware aanwezig is, gebruikt geli die automatisch;
Ondersteunt meedere cryptografische algoritmen. Op dit moment AES, Blowfish en 3DES;
Staat toe dat de root-partitie wordt versleuteld. De wachtwoordzin die wordt gebruikt om de root-partitie te versleutelen wordt opgevraagd tijdens het starten van een systeem;
Staat het gebruik van twee onafhankelijke sleutels toe, bijvoorbeeld een “sleutel” en een “bedrijfssleutel”);
geli is snel; het werkt met sector-naar-sector versleuteling;
Ondersteunt back-up en restore van Master Keys. Als een gebruiker sleutels moet vernietigen, is het mogelijk weer toegang te krijgen tot de gegevens door sleutels uit een back-up te halen;
Ondersteunt het koppelen van een schijf met een willekeurige, eenmalige sleutel. Handig voor swap-partities en tijdelijke bestandssystemen.
Meer mogelijkheden van geli staan beschreven in de handleiding van geli(8).
De volgende stappen beschrijven hoe ondersteuning voor geli in de FreeBSD-kernel ingeschakeld kan worden en hoe een nieuwe geli versleutelingsvoorziening gemaakt kan worden.
Het is noodzakelijk super-user rechten te hebben omdat de kernel wordt aangepast.
Toevoegen van geli-ondersteuning
Voeg de volgende regels toe aan het bestand met kernelinstellingen:
options GEOM_ELI device crypto
Herbouw de kernel zoals beschreven is in Hoofdstuk 9.
De geli-module kan ook bij het opstarten geladen worden. Voeg de volgende regel toe aan /boot/loader.conf:
geom_eli_load="YES"
Nu hoort geli(8) door de kernel ondersteund te worden.
Een Master Key genereren
Het volgende voorbeeld beschrijft hoe een sleutelbestand te maken, dat wordt gebruikt als onderdeel van de Master Key voor de versleutelde dienst die wordt aangekoppeld onder /private. Het sleutelbestand zorgt voor wat willekeurige gegevens die worden gebruikt om de Master Key te versleutelen. De Master Key wordt ook door een wachtwoordzin beschermd. De sectorgrootte van de dienst wordt 4 kB. Ook wordt beschreven hoe de geli-dienst te koppelen, er een bestandsysteem op te maken, dat aan te koppelen, hoe ermee te werken en tenslotte hoe te ontkoppelen.
Het wordt aangeraden een grotere sectorgrootte in te stellen (zoals 4 kB) voor betere prestaties.
De Master Key wordt beschermd door een wachtwoordzin en de gegevensbron voor het sleutelbestand wordt /dev/random. De sectorgrootte van /dev/da2.eli, die als dienst wordt aangeduid, wordt 4 kB.
# dd if=/dev/random of=/root/da2.key bs=64 count=1 # geli init -s 4096 -K /root/da2.key /dev/da2 Enter new passphrase: Reenter new passphrase:
Het is niet verplicht om zowel een wachtwoordzijn als een sleutelbestand te gebruiken. De methodes kunnen onafhankelijk van elkaar gebruikt worden.
Als een sleutelbestand wordt opgegeven als “-”, wordt de standaardinvoer gebruikt. In het onderstaande voorbeeld wordt aangegeven hoe meer dan een sleutelbestand kan worden gebruikt.
# cat sleutelbestand1 sleutelbestand2 sleutelbestand3 | geli init -K - /dev/da2
De dienst koppelen met de gemaakte sleutel
# geli attach -k /root/da2.key /dev/da2 Enter passphrase:
Het nieuwe platte tekst-apparaat wordt /dev/da2.eli genoemd.
# ls /dev/da2* /dev/da2 /dev/da2.eli
Het nieuwe bestandssysteem maken
# dd if=/dev/random of=/dev/da2.eli bs=1m # newfs /dev/da2.eli # mount /dev/da2.eli /private
Het versleutelde bestandssysteem moet nu zichtbaar zijn voor df(1) en beschikbaar zijn voor gebruik:
# df -H Filesystem Size Used Avail Capacity Mounted on /dev/ad0s1a 248M 89M 139M 38% / /devfs 1.0K 1.0K 0B 100% /dev /dev/ad0s1f 7.7G 2.3G 4.9G 32% /usr /dev/ad0s1d 989M 1.5M 909M 0% /tmp /dev/ad0s1e 3.9G 1.3G 2.3G 35% /var /dev/da2.eli 150G 4.1K 138G 0% /private
De dienst afkoppelen
Als het werk met de versleutelde partitie is afgehandeld en de /private-partitie niet langer nodig is, dan is het verstandig te overwegen de met geli versleutelde partitie af te koppelen van het bestandssysteem en de kernel.
# umount /private # geli detach da2.eli
Meer informatie over geli(8) staat in de handleiding.
Bij geli hoort een rc.d script dat gebruikt kan worden om het gebruik van geli te vereenvoudigen. Een voorbeeld van hoe geli met rc.conf(5) ingesteld kan worden volgt:
geli_devices="da2" geli_da2_flags="-p -k /root/da2.key"
Hiermee wordt /dev/da2 ingesteld als geli-dienst met Master Key-bestand /root/da2.key en geli gebruikt geen
wachtwoordzin als de dienst wordt gekoppeld (dit kan alleen gebruikt worden als
-P is meegegeven tijdens de geli
init fase van geli). Een systeem ontkoppelt de
geli-dienst van de kernel voordat het afsluit.
Meer informatie over het instellen van rc.d staat in het onderdeel over rc.d.
Het versleutelen van de wisselbestand ruimte is gemakkelijk met FreeBSD te configureren. Afhankelijk van welke versie er gebruikt wordt zijn er verschillende configuratie opties en instellingen mogelijk. De gbde(8) en geli(8) programma's kunnen gebruikt worden voor het versleutelen van het wisselbestand. Beide systemen maken gebruik van het encswap rc.d script.
De vorige sectie, Schijfpartities versleutelen, biedt een korte discussie over de verschillende versleutel systemen.
Net als met het versleutelen van harde schijven, wordt het versleutelen van het wisselbestand gebruikt om gevoelige data te beschermen. Stelt u eens een applicatie voor dat omgaat het wachtwoorden. Zolang deze wachtwoorden in het fysieke geheugen blijven is er niets aan de hand. Echter zodra deze verplaatst worden naar het wisselbestand om ruimte te maken voor andere applicaties, kan het gebeuren dat de wachtwoorden onbeschermd op de harde schijf geschreven worden, waardoor het makkelijk te achterhalen is voor iemand die kwaad wilt. Het versleutelen van het wisselbestand biedt hierin een mogelijke uitkomst.
Opmerking: Tot het einde van deze sectie zal ad0s1b het wisselbestand bevatten.
Tot op dit moment is het wisselbestand niet versleuteld. Het is mogelijk dat er reeds wachtwoorden of andere gevoelige data onbeschermd op de harde schijf geschreven zijn. Om dit te corrigeren, moet de data op de swap partitie overschreven worden met willekeurige data:
# dd if=/dev/random of=/dev/ad0s1b bs=1m
Er moet gebruik gemaakt worden van het .bde achtervoegsel aan het apparaat in de respectievelijke /etc/fstab-regel betreffende het wisselbestand:
# Device Mountpoint FStype Options Dump Pass# /dev/ad0s1b.bde none swap sw 0 0
Het opzetten van geli(8) voor het versleutelen van het wisselbestand is hetzelfde als dat van gbde(8). Hier moet echter gebruik gemaakt worden van het .eli achtervoegsel aan het apparaat in de respectievelijke /etc/fstab wisselbestand regel:
# Device Mountpoint FStype Options Dump Pass# /dev/ad0s1b.eli none swap sw 0 0
geli(8) maakt standaard gebruik van het AES algoritme met een sleutellengte van 128 bits.
Optioneel kunnen deze standaardwaarden worden aangepast door gebruik te maken van de geli_swap_flags optie in /etc/rc.conf. De volgende regel verteld het encswap rc.d bestand om een geli(8) wisselbestand te maken met het Blowfish algoritme met een sleutel lengte van 128 bit, een sectorgrootte van 4 kilobytes en met de optie “ontkoppelen nadat de laatste afsluiting” gezet:
geli_swap_flags="-e blowfish -l 128 -s 4096 -d"
Zie de uitleg over het onetime commando in de geli(8) handleiding voor een lijst van mogelijke opties.
Zodra het systeem opnieuw opgestart is kan gekeken worden of alles nog goed werkt door gebruik te maken van het swapinfo commando.
Als gebruik gemaakt wordt van gbde(8):
% swapinfo Device 1K-blocks Used Avail Capacity /dev/ad0s1b.bde 542720 0 542720 0%
Als gebruik gemaakt wordt van geli(8):
% swapinfo Device 1K-blocks Used Avail Capacity /dev/ad0s1b.eli 542720 0 542720 0%
Hoge beschikbaarheid is een van de hoofdzaken in serieuze zakelijke toepassingen
en hoog beschikbare opslag is een sleutelonderdeel in zulke omgevingen. Hoog
beschikbare opslag, of HAST, werd ontwikkeld door Pawel Jakub
Dawidek <pjd@FreeBSD.org> als een raamwerk dat
transparante opslag van dezelfde gegevens toestaat over fysiek gescheiden machines
die verbonden zijn door een TCP/IP-netwerk. HAST kan gezien worden als een netwerkgebaseerde RAID1 (spiegel)
en is vergelijkbaar met het DRBD® opslagsysteem bekend van het GNU/Linux platform. In combinatie met andere eigenschappen voor
hoge beschikbaarheid van FreeBSD zoals CARP maakt HAST het
mogelijk om een opslagcluster met hoge beschikbaarheid te bouwen dat resistent is
tegen falende hardware.
Na het lezen van deze sectie weet u:
Wat HAST is, hoe het werkt en welke mogelijkheden het biedt.
Hoe HAST op FreeBSD te op te zetten en te gebruiken.
Hoe CARP en devd(8) te integreren om een robuust opslagsysteem te bouwen.
Voor het lezen van deze sectie dient u:
De beginselen van UNIX en FreeBSD te begrijpen (Hoofdstuk 4).
Te weten hoe de netwerkinterfaces en andere kerndeelsystemen van FreeBSD in te stellen (Hoofdstuk 12).
Netwerken op FreeBSD goed te begrijpen (Deel IV in FreeBSD handboek).
FreeBSD 8.1-RELEASE of nieuwer te gebruiken.
Het HAST-project werd gesponsord door The FreeBSD Foundation met ondersteuning van OMCnet Internet Service GmbH en TransIP BV.
De belangrijkste eigenschappen van HAST zijn:
Het kan gebruikt worden om I/O-fouten op lokale harde schijven te maskeren.
Agnostisch qua bestandssysteem, dus het werkt met elk bestandssysteem dat door FreeBSD wordt ondersteund.
Efficiënte en snelle hersynchronisatie, alleen de blokken die zijn veranderd toen een knooppunt uitstond worden gesynchroniseerd.
Het kan gebruikt worden in reeds uitgerolde omgevingen om aanvullende redundantie toe te voegen.
Samen met CARP, Heartbeat of andere gereedschappen kan het worden gebruikt om een robuust en duurzaam opslagsysteem te bouwen.
Omdat HAST synchrone replicatie op blokniveau van elk opslagmedium naar verscheidene machines biedt, heeft het tenminste twee knooppunten (fysieke machines) nodig -- het primaire (ook bekend als meester) knooppunt en het secundaire (slaaf) knooppunt. Tezamen worden deze twee machines een cluster genoemd.
Opmerking: HAST is momenteel beperkt tot een totaal van twee clusterknooppunten.
Aangezien HAST in een primaire-secundaire configuratie werkt, kan er op elk moment slechts één van de clusterknooppunten actief zijn. Het primaire knooppunt, ookwel actief, is degene die alle I/O-verzoeken aan apparaten die door HAST worden beheerd afhandelt. Het secundaire knooppunt wordt dan automatisch gesynchroniseerd vanuit het primaire knooppunt.
De fysieke componenten van het HAST-systeem zijn:
lokale schijf (op primair knooppunt)
schijf op verre machine (secundair knooppunt)
HAST werkt synchroon op blokniveau, wat het transparant maakt voor bestandssystemen en toepassingen. HAST biedt reguliere GEOM-aanbieders aan in /dev/hast/ voor zowel andere gereedschappen als toepassingen, er is dus geen verschil tussen het gebruik van apparaten die door HAST worden geleverd en rauwe schijven, partities, etc.
Elke bewerking met betrekking tot schrijven, verwijderen of spoelen wordt naar de plaatselijke schijf en over TCP/IP naar de verre schijf gestuurd. Elke leesbewerking wordt gedaan door de plaatselijke schijf, tenzij de plaatselijke schijf niet actueel is of er een I/O-fout optreed. In zulke gevallen wordt de leesbewerking naar het secundaire knooppunt gestuurd.
HAST probeert om een snel herstel van fouten te leveren. Om deze reden is het heel belangrijk om de synchronisatietijd te verkorten nadat een knooppunt is hersteld van een uitval. Om een snelle synchronisatie te leveren, beheert HAST op de schijf een bitmap van gebruikte extents en synchroniseert het die alleen tijdens een reguliere synchronisatie (met uitzondering van de initiëe synchronisatie).
Er zijn vele manieren om synchronisatie af te handelen. HAST implementeert meerdere replicatiemodi om verschillende synchronisatiemethodes af te handelen:
memsync: rapporteer een schrijfbewerking als voltooid wanneer de plaatselijke schrijfbewerking klaar is en wanneer het verre knooppunt de gegevensaankomst bevestigt, maar voordat het de gegevens daadwerkelijk heeft opgeslagen. De gegevens op het verre knooppunt zullen meteen na het versturen van de bevestiging worden opgeslagen. Deze modus is bedoeld om latency te verminderen en nog steeds een zeer goede betrouwbaarheid te bieden. De replicatiemodus memsync is momenteel niet geïmplementeerd.
fullsync: rapporteer een schrijfbewerking als voltooid wanneer zowel de plaatselijke en de verre schrijfbewerking voltooid zijn. Dit is de veiligste en traagste replicatiemodus. Dit is de standaardmodus.
async: rapporteer de schrijfbewerking als voltooid wanneer de plaatselijke schrijfbewerking klaar is. Dit is de snelste en gevaarlijkste replicatiemodus. Het dient gebruikt te worden wanneer er naar een ver knooppunt wordt gerepliceerd en de latency te hoog is voor andere modi. De replicatiemodus async is momenteel niet geïmplementeerd.
WaarschuwingMomenteel wordt alleen de replicatiemodus fullsync ondersteund.
HAST heeft ondersteuning voor GEOM_GATE nodig om te kunnen functioneren. De kernel GENERIC bevat standaard geen GEOM_GATE, de laadbare module geom_gate.ko is echter beschikbaar in de standaardinstallatie van FreeBSD. Zorg ervoor dat deze module beschikbaar is voor afgeslankte systemen. Het is ook mogelijk om ondersteuning voor GEOM_GATE statisch in de kernel te bouwen, door deze regel aan het kernelconfiguratiebestand toe te voegen:
options GEOM_GATE
Het HAST-raamwerk bestaat vanuit het besturingssysteem gezien uit verschillende delen:
het daemon hastd(8) dat verantwoordelijk is voor de gegevenssynchronisatie,
het beheerprogramma hastctl(8) voor de gebruikers,
het configuratiebestand hast.conf(5).
Het volgende voorbeeld beschrijft hoe twee knooppunten in een meester-slaaf / primaire-secundaire opstelling te configureren door HAST te gebruiken om de gegevens tussen de twee te repliceren. De knooppunten worden hasta met IP-adres 172.16.0.1 en hastb met IP-adres 172.16.0.2 genoemd. Beide knooppunten hebben een toegewijde harde schijf /dev/ad6 van dezelfde grootte om met HAST te werken. De HAST-pool (soms ook een hulpbron genoemd, i.e., de GEOM-aanbieder in /dev/hast/) wordt test genoemd.
Het bestand /etc/hast.conf regelt de configuratie van HAST. Dit bestand dient hetzelfde te zijn op beide knooppunten. Het volgende is de eenvoudigste configuratie die mogelijk is:
resource test {
on hasta {
local /dev/ad6
remote 172.16.0.2
}
on hastb {
local /dev/ad6
remote 172.16.0.1
}
}
Raadpleeg voor geavanceerdere configuraties de handleidingpagina hast.conf(5).
Tip: Het is ook mogelijk om hostnamen in de regels met remote te gebruiken. Zorg er in dat geval voor dat deze hosts vindbaar zijn, bijvoorbeeld doordat ze zijn gedefinieerd in het bestand /etc/hosts of anders in het plaatselijke DNS.
Nu de configuratie op beide knooppunten aanwezig is, kan de HAST-pool aangemaakt worden . Voer deze commando's op beide knooppunten uit om de initiële metagegevens op de plaatselijke schijf te plaatsen en het hastd(8)-daemon te starten:
# hastctl create test # /etc/rc.d/hastd onestart
Opmerking: Het is niet mogelijk om GEOM-aanbieders met een bestaand bestandssysteem te gebruiken (i.e., een bestaande opslag omzetten naar een door HAST beheerde pool), omdat deze procedure wat metagegevens op de aanbieder moet opslaan en er daarvoor niet genoeg beschikbare ruimte is.
De rol van een HAST-knooppunt (primair of secundair) wordt uitgekozen door een beheerder of software zoals Heartbeat dat het gereedschap hastctl(8) gebruikt. Voer het volgende commando uit op het primaire knooppunt ( hasta):
# hastctl role primary test
Voer dit soortgelijke commando uit op het secundaire knooppunt ( hastb):
# hastctl role secondary test
Let opDe situatie dat de knooppunten niet met elkaar kunnen communiceren en beide geconfigureerd zijn als primaire knooppunten; wordt split-brain genoemd. Volg de stappen zoals beschreven in Paragraaf 19.18.5.2 om deze situatie op te lossen.
Verifieer met het gereedschap hastctl(8) het resultaat op elk knooppunt:
# hastctl status test
De belangrijke tekst is de regel met status dat voor alle knooppunten complete dient te bevatten. Als het degraded bevat, is er iets verkeerd gegaan. Op dat moment is de synchronisatie tussen de knooppunten al begonnen. De synchronisatie is compleet wanneer hastctl status 0 bytes aan dirty extents rapporteert.
De volgende stap is het aanmaken van een bestandssysteem op de GEOM-aanbieder /dev/hast/test en het aan te koppelen. Dit moet op het primaire knooppunt gebeuren, aangezien /dev/hast/test alleen op het primaire knooppunt verschijnt. Het aanmaken van het bestandssysteem kan afhankelijk van de grootte van de harde schijf enkele minuten duren:
# newfs -U /dev/hast/test # mkdir /hast/test # mount /dev/hast/test /hast/test
Wanneer het HAST-raamwerk correct is geconfigureerd, betreft de laatste stap het ervoor zorgen dat HAST automatisch tijdens het opstarten wordt gestart. Voeg deze regel toe aan het bestand /etc/rc.conf:
hastd_enable="YES"
Het doel van dit voorbeeld is om een robuust opslagsysteem te bouwen dat resistent is tegen het falen van alle knooppunten. Het scenario is dat een primair knooppunt van het cluster faalt. Als dit gebeurt, dan neemt het secundaire knooppunt het feilloos over, controleert het het bestandssysteem en koppelt het het bestandssysteem aan, en gaat het verder zonder dat er een bit aan gegevens ontbreekt.
Om dit voor elkaar te krijgen, is er een andere eigenschap die beschikbaar is op FreeBSD dat voorziet in automatische failover van de IP-laag -- CARP. CARP (Common Address Redundancy Protocol) maakt het mogelijk dat meerdere hosts in hetzelfde netwerksegment een IP-adres delen. Stel CARP in op beide knooppunten van het cluster volgens de documentatie die beschikbaar is in Paragraaf 32.14. Nadat de opzet voltooid is, heeft elk knooppunt een eigen interface carp0 met een gedeeld IP-adres 172.16.0.254. Het primaire HAST-knooppunt van het cluster moet het meester-CARP-knooppunt zijn.
De HAST-pool die in de vorige sectie is gemaakt is nu klaar om geëxporteerd te worden naar de andere hosts op het netwerk. Dit kan gedaan worden door het te exporteren over NFS, Samba, etc., door gebruik te maken van het gedeelde IP-adres 172.16.0.254. Het enige overgebleven probleem is een automatische failover in het geval dat het primaire knooppunt het begeeft.
Als een CARP-interface aan- of uitgaat, genereert FreeBSD een devd(8)-gebeurtenis, wat het mogelijk maakt om toestandsveranderingen op de CARP-interfaces in de gaten te houden. Een toestandsverandering op het CARP-interface geeft aan dat een van de knooppunten het begaf of weer online kwam. Deze toestandsveranderingen maken het mogelijk om een script te draaien dat automatisch de HAST-failover afhandelt.
Voeg, om toestandsverandering op de CARP-interfaces af te vangen, het volgende toe aan het bestand /etc/devd.conf op elk knooppunt:
notify 30 {
match "system" "IFNET";
match "subsystem" "carp0";
match "type" "LINK_UP";
action "/usr/local/sbin/carp-hast-switch master";
};
notify 30 {
match "system" "IFNET";
match "subsystem" "carp0";
match "type" "LINK_DOWN";
action "/usr/local/sbin/carp-hast-switch slave";
};
Herstart devd(8) op beide knooppunten om de nieuwe configuratie te laten gelden:
# /etc/rc.d/devd restart
Als het interface carp0 aan of uit gaat (i.e., de toestand van het interface verandert), genereert het systeem een notificatie wat het subsysteem devd(8) in staat stelt om een willekeurig script te draaien, in dit geval /usr/local/sbin/carp-hast-switch. Dit is het script dat de automatische failover afhandelt. Raadpleeg de handleidingpagina devd.conf(5) voor verdere uitleg over de bovenstaande configuratie van devd(8).
Dit zou een voorbeeld van zo'n script kunnen zijn:
#!/bin/sh
# Origineel script door Freddie Cash <fjwcash@gmail.com>
# Gewijzigd door Michael W. Lucas <mwlucas@BlackHelicopters.org>
# en Viktor Petersson <vpetersson@wireload.net>
# De namen van de HAST-hulpbronnen, zoals vermeld in /etc/hast.conf
resources="test"
# vertraging voor het aankoppelen van de HAST-hulpbron na het worden van meester
# doe een gok
delay=3
# logging
log="local0.debug"
name="carp-hast"
# einde van gebruiker-instelbare dingen
case "$1" in
master)
logger -p $log -t $name "Omschakelen naar primaire aanbieder voor ${resources}."
sleep ${delay}
# Wacht totdat de "hastd secondary" processen zijn gestopt
for disk in ${resources}; do
while $( pgrep -lf "hastd: ${disk} \(secondary\)" > /dev/null 2>&1 ); do
sleep 1
done
# Verwissel de rol voor elke schijf
hastctl role primary ${disk}
if [ $? -ne 0 ]; then
logger -p $log -t $name "Omschakelen van rol naar primair voor hulpbron ${disk} mislukt."
exit 1
fi
done
# Wacht totdat de apparaten /dev/hast/* verschijnen
for disk in ${resources}; do
for I in $( jot 60 ); do
[ -c "/dev/hast/${disk}" ] && break
sleep 0.5
done
if [ ! -c "/dev/hast/${disk}" ]; then
logger -p $log -t $name "GEOM-aanbieder /dev/hast/${disk} is niet verschenen."
exit 1
fi
done
logger -p $log -t $name "Rollen van HAST-hulpbronnen ${resources} omgeschakeld naar primair."
logger -p $log -t $name "Schijven aankoppelen."
for disk in ${resources}; do
mkdir -p /hast/${disk}
fsck -p -y -t ufs /dev/hast/${disk}
mount /dev/hast/${disk} /hast/${disk}
done
;;
slave)
logger -p $log -t $name "Omschakelen naar secundaire aanbieder voor ${resources}."
# Schakel de rollen van de HAST-hulpbronnen om
for disk in ${resources}; do
if ! mount | grep -q "^/dev/hast/${disk} on "
then
else
umount -f /hast/${disk}
fi
sleep $delay
hastctl role secondary ${disk} 2>&1
if [ $? -ne 0 ]; then
logger -p $log -t $name "Omschakelen van rol naar secundair voor hulpbron ${disk} mislukt."
exit 1
fi
logger -p $log -t $name "Rol van hulpbron ${disk} omgeschakeld naar secundair."
done
;;
esac
In een notendop neemt het script deze acties wanneer een knooppunt meester / primair wordt:
De HAST-pools opwaarderen naar primair op een gegeven knooppunt.
Het bestandssysteem onder de HAST-pool controleren.
De pools op een juiste plaats aankoppelen.
Wanneer een knooppunt backup / secundair wordt:
De HAST-pools afkoppelen.
De HAST-pools degraderen naar secundair.
Let opHoud in gedachte dat dit slechts een voorbeeldscript is om aan te tonen dat alles werkt. Het behandeld niet alle mogelijke situaties en kan op elke manier worden uitgebreid of veranderd, het kan bijvoorbeeld benodigde diensten starten en stoppen.
Tip: Voor dit voorbeeld hebben we een standaard UFS-bestandssysteem gebruikt. Om de tijd die nodig is voor herstel te verkorten, kan een bestandssysteem met UFS-journalling of ZFS worden gebruikt.
Meer gedetailleerde informatie met aanvullende voorbeelden kunnen gevonden worden op de HAST Wiki-pagina.
HAST zou over het algemeen zonder problemen moeten werken. Net als met elk ander software-product zijn er momenten waarop het anders werkt dan het zou moeten. De oorzaken van de problemen kunnen verschillen, maar de vuistregel is om ervoor te zorgen dat de klokken zijn gesynchroniseerd op alle knooppunten in het cluster.
Wanneer problemen met HAST worden verholpen, dient het debug-niveau van hastd(8) verhoogd te worden door het daemon hastd(8) met het argument -d op te starten. Merk op dat dit argument meerdere malen kan worden opgegeven om het debug-niveau nog verder op te hogen. Op deze manier kan veel nuttige informatie worden vergaard. Overweeg ook om het argument -F te gebruiken, dat het daemon hastd(8) in de voorgrond zal starten.
Split-brain treedt op waneer de knooppunten van het cluster niet met elkaar kunnen communiceren, en beide als primair zijn geconfigureerd. Dit is een gevaarlijke situatie omdat het beide knooppunten in staat stelt om incompatibele veranderingen aan de gegevens te maken. Dit probleem dient handmatig door de systeembeheerder te worden gecorrigeerd.
De beheerder moet besluiten welk knooppunt de belangrijkere veranderingen bevat (of ze handmatig samenvoegen) en HAST een volledige synchronisatie op het knooppunt dat de kapotte gegevens heeft laten uitvoeren. Voer hiervoor deze commando's uit op het knooppunt dat opnieuw gesynchroniseerd moet worden:
# hastctl role init <resource> # hastctl create <resource> # hastctl role secondary <resource>
Dit hoofdstuk beschrijft het gebruik van schijven in het GEOM raamwerk in FreeBSD. Hieronder vallen de belangrijkste RAID besturingsprogramma's die het raamwerk gebruikt voor instellingen. In dit hoofdstuk wordt niet diepgaand beschreven hoe GEOM omgaat met I/O, het onderliggende subsysteem of code. Die informatie staat in het hulppagina voor geom(4) en de verscheidene “SEE ALSO” referenties. Dit hoofdstuk is ook geen definitief stuk over het instellen van RAID. Alleen de door GEOM ondersteunde RAID-classificaties worden beschreven.
Na het lezen van dit hoofdstuk weet de lezer:
Welk type RAID-ondersteuning via GEOM beschikbaar is;
Hoe de basisgereedschappen te gebruiken om de verschillende RAID-niveaus in te stellen, te onderhouden en te wijzigen;
Hoe schijfapparaten via GEOM te spiegelen, aaneen te schakelen, te versleutelen en vanaf afstand schijven aan te sluiten;
Hoe problemen op te lossen met schijven die via het GEOM raamwerk zijn aangesloten.
Veronderstelde voorkennis:
Begrijpen hoe FreeBSD omgaat met schijfapparaten (Hoofdstuk 19);
Weten hoe een nieuwe FreeBSD kernel in te stellen en te installeren (Hoofdstuk 9).
GEOM staat toegang en controle toe op klassen, Master Boot Records, BSD labels, enzovoort, door gebruik te maken van diensten of de speciale bestanden in /dev. GEOM ondersteunt verschillende software RAID instellingen en biedt transparante toegang tot het besturingssysteem en de hulpprogramma's.
Aaneenschakelen is een methode die gebruikt wordt om meerdere schijven te combineren tot een enkele volume. In veel gevallen wordt dit gedaan met hardware controllers. Het GEOM subsysteem biedt softwareondersteuning voor RAID0, ook wel bekend als aaneenschakelen (“disk striping”).
In een RAID0-systeem worden gegevens opgedeeld in blokken die verdeeld worden over de schijven in een reeks. In plaats van te hoeven wachten tot een systeem 256k naar één schijf heeft geschreven, kan een RAID0-systeem tegelijkertijd 64k naar vier verschillende schijven schrijven, waardoor superieure I/O prestaties worden bereikt. Deze prestaties kunnen nog verbeterd worden door meerdere schijfcontrollers te gebruiken.
Iedere schijf in een RAID0-aaneenschakeling moet van dezelfde grootte zijn, omdat I/O-verzoeken altijd zijn opgebouwd uit precies gelijk over de schijven verdeelde verzoeken tot lezen of schrijven.

Ongeformatteerde ATA-schijven aaneenschakelen
Laad de module geom_stripe.ko:
# kldload geom_stripe
Zorg ervoor dat er een koppelpunt beschikbaar is. Als dit volume een rootpartitie wordt, gebruikt dan tijdelijk een ander koppelpunt zoals /mnt:
# mkdir /mnt
Stel de apparaatnamen voor de schijven vast die aaneen worden geschakeld en maak het nieuwe apparaat aan. Om twee ongebruikte, ongepartitioneerde ATA schijven aaneen te schakelen (/dev/ad2 en /dev/ad3):
# gstripe label -v st0 /dev/ad2 /dev/ad3 Metadata value stored on /dev/ad2. Metadata value stored on /dev/ad3. Done.
Schrijf een standaard label naar de nieuwe partitie, ook wel bekend als een partitietabel en installeer de standaard opstart code:
# bsdlabel -wB /dev/stripe/st0
Dit proces hoort twee nieuwe apparaten gemaakt te hebben in de map /dev/stripe naast het apparaat st0, te weten st0a en st0c. Vanaf nu kan er een bestandssysteem op st0a worden gezet met behulp van de newfs applicatie:
# newfs -U /dev/stripe/st0a
Na het uitvoeren van het bovenstaande commando rollen er veel getallen over het scherm en na een aantal seconden is het proces afgerond. Het volume is gereed en klaar om aangekoppeld te worden.
Om de nieuwe aaneengeschakelde schijf handmatig te koppelen moet het volgende gedaan worden:
# mount /dev/stripe/st0a /mnt
Om dit aaneengeschakelde bestandssysteem automatisch aan te koppelen bij het opstarten wordt de volume-informatie in /etc/fstab gezet. Voor dit doel wordt een permanent koppelpunt, genaamd stripe, aangemaakt:
# mkdir /stripe
# echo "/dev/stripe/st0a /mnt ufs rw 2 2" \
>> /etc/fstab
Laadt de module geom_stripe.ko ook automatisch bij het initialiseren van een systeem door de volgende regel toe te voegen aan /boot/loader.conf:
# echo 'geom_stripe_load="YES"' >> /boot/loader.conf
Spiegelen (“mirroring”) is een technologie die door veel bedrijven en thuisgebruikers wordt ingezet om gegevens te back-uppen zonder onderbrekingen. Als er een spiegel bestaat, betekent dat eenvoudigweg dat schijfB een kopie is van schijfA, of misschien zijn schijvenC+D een kopie van schijvenA+B. Los van de schijfinstellingen is het belangrijkste aspect dat de gegevens van de ene schijf of partitie worden gerepliceerd naar de andere. Later kunnen die gegevens eenvoudiger worden hersteld of geback-upped zonder dat dit leidt tot onderbrekingen in dienstverlening of toegang tot gegevens en schijven kunnen zelfs fysiek worden opgeslagen in een kluis.
Begin met een systeem dat twee schijven heeft van gelijke grootte. Deze oefeningen stellen dat het directe-toegang (da(4)) SCSI-schijven zijn.
Aannemende dat FreeBSD op het eerste da0-schijfapparaat is geïnstalleerd, dient er aan gmirror(8) verteld te worden om daar de primaire gegevens op te slaan.
Voordat de mirror gebouwd wordt, dient aanvullende debuginformatie en
openingstoegang tot het apparaat aangezet te worden door de sysctl(8)-optie
kern.geom.debugflags op de volgende waarde in te
stellen:
# sysctl kern.geom.debugflags=17
Maak nu de mirror aan. Begin het proces door informatie over metagegevens op het primaire schijfapparaat op te slaan, waardoor effectief het apparaat /dev/mirror/gm aangemaakt wordt met het volgende commando:
WaarschuwingHet creëeren van een mirror buiten de opstartschijf kan resulteren in gegevensverlies als er enige gegevens zijn opgeslagen op de laatste sector van de schijf. Dit gevaar wordt verminderd als het creëeren van de mirror direct na een verse installatie van FreeBSD wordt gedaan. De volgende procedure werkt ook niet samen met de instellingen van de standaardinstallatie van FreeBSD 9.X dat het nieuwe partitieschema GPT gebruikt. GEOM zal de metagegevens van GPT overschrijven, wat' gegevensverlies en mogelijk een onstartbaar systeem tot gevolg heeft.
# gmirror label -vb round-robin gm0 /dev/da0
Het systeem hoort te antwoorden met:
Metadata value stored on /dev/da0. Done.
Initialiseer GEOM, dit zal de kernelmodule /boot/kernel/geom_mirror.ko laden:
# gmirror load
Opmerking: Wanneer dit commando succesvol verloopt, maakt het het apparaatknooppunt gm0 aan onder de map /dev/mirror.
Maak het mogelijk om de kernelmodule geom_mirror.ko tijdens systeeminitialisatie te laden:
# echo 'geom_mirror_load="YES"' >> /boot/loader.conf
Bewerk het bestand /etc/fstab, waarbij verwijzingen naar het oude da0 worden vervangen door de nieuwe apparaatknooppunten van het mirrorapparaat gm0.
Opmerking: Indien vi(1) de geprefereerde tekstverwerker is, is het volgende een gemakkelijke manier om deze taak te volbrengen:
# vi /etc/fstabMaak een reservekopie van de huidige gegevens van fstab in vi(1) door :w /etc/fstab.bak in te typen. Vervang daarna alle oude verwijzingen naar da0 door gm0 door :%s/da/mirror\/gm/g in te typen.
Het resulterende fstab zou er ongeveer hetzelfde als het volgende uit moeten zien. Het maakt niet uit of de schijfstations SCSI of RAID zijn, het RAID-apparaat zal ongeacht hiervan gm zijn.
# Device Mountpoint FStype Options Dump Pass# /dev/mirror/gm0s1b none swap sw 0 0 /dev/mirror/gm0s1a / ufs rw 1 1 /dev/mirror/gm0s1d /usr ufs rw 0 0 /dev/mirror/gm0s1f /home ufs rw 2 2 #/dev/mirror/gm0s2d /store ufs rw 2 2 /dev/mirror/gm0s1e /var ufs rw 2 2 /dev/acd0 /cdrom cd9660 ro,noauto 0 0
Start het systeem opnieuw op:
# shutdown -r now
Tijdens de systeeminitialisatie dient het apparaat gm0 in plaats van da0 gebruikt te worden. Als het systeem volledig is geïnitialiseerd, kan dit gecontroleerd worden door de uitvoer van het commando mount te inspecteren:
# mount Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/mirror/gm0s1a 1012974 224604 707334 24% / devfs 1 1 0 100% /dev /dev/mirror/gm0s1f 45970182 28596 42263972 0% /home /dev/mirror/gm0s1d 6090094 1348356 4254532 24% /usr /dev/mirror/gm0s1e 3045006 2241420 559986 80% /var devfs 1 1 0 100% /var/named/dev
De uitvoer ziet er als verwacht uit. Plaats als laatste stap, om synchronisatie te beginnen, de schijf da1 in de mirror met het volgende commando:
# gmirror insert gm0 /dev/da1
De status kan gecontroleerd worden tijdens het bouwen van de mirror met het volgende commando:
# gmirror status
Wanneer de mirror gebouwd is en alle huidige gegevens zijn gesynchroniseerd, dient de uitvoer van het bovenstaande commando er als volgt uit te zien:
Name Status Components
mirror/gm0 COMPLETE da0
da1
Als er problemen zijn, of als de mirror nog bezig is om het bouwproces te voltooien, zal het voorbeeld DEGRADED in plaats van COMPLETE laten zien.
Als een systeem opstart in een prompt dat op het volgende lijkt:
ffs_mountroot: can't find rootvp Root mount failed: 6 mountroot>
Herstart te machine met de aan/uit-schakelaar of met de resetknop. Selecteer in het bootmenu optie zes (6). Hierdoor komt een systeem in een loader(8) prompt. Laad de kernelmodules handmatig:
OK? load geom_mirror OK? boot
Als dit werkt werd de module om welke reden dan ook niet juist geladen. Controleer of de relevante regel in /boot/loader.conf correct is. Als het probleem aanhoudt, zet dan de onderstaande regel in het bestand met kernelinstellingen en herbouw en installeer de kernel.
options GEOM_MIRROR
Hiermee moet het probleem opgelost zijn.
Het mooie aan het spiegelen van schijven is dat als een schijf faalt, deze vervangen kan worden, aangenomen zonder gegevensverlies.
Neem met betrekking tot de vorige RAID1-configuratie aan dat da1 het geeft begeven en vervangen moet worden. Bepaal, om het te vervangen, welke schijf het heeft begeven en schakel het systeem uit. Op dit moment kan de schijf worden verwisseld door een nieuwe en kan het systeem weer worden opgestart. Nadat het systeem is herstart, kunnen de volgende commando's worden gebruikt om de schijf te vervangen:
# gmirror forget gm0
# gmirror insert gm0 /dev/da1
Gebruik het commando gmirror status om de voortgang van het herbouwen te bekijken. Zo eenvoudig is het.
RAID3 is een methode om verschillende schijven te combineren in een enkel volume met een toegewijde schijf voor de pariteit. In een RAID3-systeem worden de gegevens opgesplitst in een aantal bytes die over alle schijven in de rij worden geschreven, behalve naar één schijf die als een toegewijde schijf voor de pariteit dient. Dit betekent dat het lezen van 1024 kB van een RAID3-implementatie alle schijven in de rij zal benaderen. De prestatie kan worden verhoogd door meerdere schijfcontrollers te gebruiken. De RAID3-rij biedt een fouttolerantie van 1 schijf, terwijl het een capaciteit van 1 - 1/n maal de totale capaciteit biedt van alle schijven in de rij, waarbij n het aantal harde schijven in de rij is. Zulke configuraties zijn meestal geschikt voor het opslaan van gegevens van grotere groottes, bijvoorbeeld multimedia-bestanden.
Er zijn minstens 3 fysieke harde schijven nodig om een RAID3-rij te bouwen. Elke schijf moet van dezelfde grootte zijn, aangezien I/O-verzoeken worden verweven om parallel naar meerdere schijven te lezen of schrijven. Bovendien moet vanwege de aard van RAID3 het aantal schijven gelijk zijn aan 3, 5, 9, 17, enzovoorts (dus 2^n + 1).
In FreeBSD is ondersteuning voor RAID3 geïmplementeerd in de GEOM-klasse graid3(8). Voor het aanmaken van een toegewijde RAID3-rij op FreeBSD zijn deze stappen nodig.
Opmerking: Hoewel het theoretisch mogelijk is om op FreeBSD van een RAID3-rij op te starten, is deze configuratie ongebruikelijk en niet aangeraden.
Laad ten eerste de kernelmodule geom_raid3.ko door de volgende opdracht uit te voeren:
# graid3 load
Het is ook mogelijk om handmatig de module geom_raid3.ko te laden:
# kldload geom_raid3.ko
Zorg ervoor dat er een geschikt aankoppelpunt bestaat of maak het aan:
# mkdir /multimedia/
Bepaal de apparaatnamen voor de schijven die aan de rij worden toegevoegd en maak het nieuwe RAID3-apparaat aan. Het laatst vermelde apparaat zal dienst doen als de toegewijde schijf voor de pariteit. Dit voorbeeld gebruikt drie ongepartitioneerde ATA-schijven: ada1 en ada2 voor gegevens en ada3 voor pariteit.
# graid3 label -v gr0 /dev/ada1 /dev/ada2 /dev/ada3 Metadata value stored on /dev/ada1. Metadata value stored on /dev/ada2. Metadata value stored on /dev/ada3. Done.
Partitioneer het nieuw aangemaakte apparaat gr0 en zet er een UFS-bestandssysteem op:
# gpart create -s GPT /dev/raid3/gr0 # gpart add -t freebsd-ufs /dev/raid3/gr0 # newfs -j /dev/raid3/gr0p1
Vele getallen zullen over het scherm lopen, en na wat tijd zal het proces voltooid zijn. Het volume is aangemaakt en is klaar om aangekoppeld te worden.
De laatste stap is het aankoppelen van het bestandssysteem:
# mount /dev/raid3/gr0p1 /multimedia/
De RAID3-rij is nu klaar voor gebruik.
Aanvullende configuratie is nodig om de bovenstaande opstelling te behouden tussen het opnieuw starten van het systeem.
De module geom_raid3.ko moet geladen zijn voordat de rij kan worden aangekoppeld. Voeg de volgende regel toe aan /boot/loader.conf om de kernelmodule automatisch tijdens de initialisatie van het systeem te laden:
geom_raid3_load="YES"
De volgende volume-informatie moet aan het bestand /etc/fstab worden toegevoegd om het bestandssysteem van de rij automatisch aan de koppelen tijdens het opstarten van het systeem:
/dev/raid3/gr0p1 /multimedia ufs rw 2 2
GEOM ondersteund het op afstand gebruiken van apparaten, zoals schijven, CD-ROMs, bestanden, etcetera door het gebruik van de gate-applicaties. Dit is vergelijkbaar met NFS.
Om te beginnen moet er een exports bestand gemaakt worden. Dit bestand specificeert wie de geëxporteerde bron mag benaderen en welke rechten er op dat moment verleend worden. Bijvoorbeeld om de vierde slice te exporteren van de eerste SCSI schijf, moet het volgende in /etc/gg.exports gezet worden:
192.168.1.0/24 RW /dev/da0s4d
Dit staat alle machines in het privé netwerk toe om het bestandssysteem op da0s4d te benaderen.
Om dit apparaat te kunnen exporteren is het van belang dat de schijf nog niet gekoppeld is en moet de ggated(8) dienst gestart worden.
# ggated
Om vervolgens het apparaat aan een client machine te koppelen moet het volgende gedaan worden:
# ggatec create -o rw 192.168.1.1 /dev/da0s4d ggate0 # mount /dev/ggate0 /mnt
Vanaf dit moment kan de schijf benaderd worden via het koppelpunt /mnt.
Opmerking: Let op, dit mislukt als de schijf reeds gekoppeld is op de server machine of als deze reeds gekoppeld is aan een andere machine op het netwerk.
Zodra het apparaat niet langer nodig is, kan het veilig ontkoppeld worden met behulp van umount(8) net zoals met elke andere schijf.
Tijdens het initialiseren van het systeem zal de FreeBSD kernel apparaatknooppunten creëren nadat het een apparaat gevonden heeft. Deze manier om te zoeken naar apparaten levert wat problemen op bijvoorbeeld wanneer er een nieuwe schijf wordt toegevoegd via USB. Het is hoogst waarschijnlijk dat een flash apparaat een apparaatknooppunt krijgt van da0, waarna de originele da0 op schuift naar da1. Dit levert problemen op als bestandssystemen worden gekoppeld als ze gedefinieerd zijn in /etc/fstab, dit kan zelfs ertoe leiden dat het systeem niet opstart.
Een mogelijke oplossing hiervoor is om de SCSI schijven een vaste plek te geven op een bepaalde volgorde, zodat zodra er een nieuwe schijf geplaatst wordt, deze een ongebruikt apparaatknooppunt toegewezen krijgt. Maar wat als er USB apparaten zijn die de primaire SCSI schijf vervangt? Dit gebeurd omdat USB apparaten meestal eerder gevonden worden dan een SCSI kaart. Een oplossing hiervoor is om de apparaten pas toe te voegen als het systeem reeds gestart is, een andere methode kan zijn om alleen een enkele ATA schijf te koppelen en nooit SCSI schijven door middel van /etc/fstab.
Maar er is een betere oplossing beschikbaar. Door het gebruik van glabel kunnen beheerders en gebruikers een label toevoegen aan een schijf, en deze labels gebruiken in /etc/fstab. Omdat glabel het label bewaard in de laatste sector van de schijf, kan het label bewaard blijven ook na een reboot en kan het bestandssysteem altijd gekoppeld worden ongeacht welk apparaatknooppunt toegekend is aan het apparaat.
Opmerking: Uiteraard hoeft een label niet permanent te zijn, het glabel programma kan zowel tijdelijke als permanente labels aanmaken. Alleen een permanent label blijft beschikbaar ook na een reboot. Zie de glabel(8) handleiding voor meer informatie over de verschillen tussen de labeltypes.
Er zijn twee type labels: een generiek label en een bestandssysteemlabel. Labels kunnen permanent of tijdelijk zijn. Permanente labels kunnen met de commando's tunefs(8) of newfs(8) aangemaakt worden. Ze zullen vervolgens worden aangemaakt in een submap van /dev, welke genoemd wordt naar het bestandssysteemtype. Bijvoorbeeld UFS2 labels worden geplaatst in de map /dev/ufs. Permanente labels kunnen ook worden aangemaakt met het commando glabel label. Deze zijn niet specifiek voor het bestandssysteem, en zullen in de map /dev/label aangemaakt worden.
Een tijdelijk label verdwijnt na een herstart van het systeem. Deze labels worden gecreëerd in /dev/label en zijn perfect voor experimenten. Een tijdelijk kan met het commando glabel create worden aangemaakt. Lees voor meer informatie de handleidingpagina van glabel(8).
Om een permanent label te schrijven voor een UFS2-bestandssysteem zonder de huidige data te vernietigen:
# tunefs -L home /dev/da3
WaarschuwingAls het bestandssyteem vol is kan dit leiden tot data corruptie; echter als het bestandssysteem vol is zou het hoofddoel moeten zijn om oude achtergebleven bestanden weg te halen in plaats van het toevoegen van labels.
Er zou nu een label moeten bestaan in /dev/ufs, welke toegevoegd kan worden aan het /etc/fstab bestand:
/dev/ufs/home /home ufs rw 2 2
Opmerking: Het bestandssysteem mag niet aangekoppeld zijn op het moment dat tunefs gebruikt wordt.
Nu kan het bestandssysteem net als normaal worden gekoppeld:
# mount /home
Vanaf dit moment is het mogelijk om, zolang de geom_label.ko geladen wordt tijdens het opstarten van het systeem, of als deze is meegecompileerd door middel van de GEOM_LABEL optie in de kernel, het apparaatknooppunt te wijzigen zonder ernstige gevolgen voor het systeem.
Bestandssystemen kunnen ook een standaard label mee krijgen door gebruik te maken
van de -L optie met het newfs
commando. Zie de newfs(8)
handleiding voor meer informatie.
Het volgende commando kan worden gebruikt om een label te verwijderen:
# glabel destroy home
Het volgende voorbeeld laat zien hoe de partities van een opstartschijf gelabeld worden.
Voorbeeld 20-1. Partities op de opstartschijf labelen
Door de partities op de opstartschijf permanent te labelen zou het systeem in staat moeten zijn om normaal door te gaan met opstarten, zelfs als de schijf verplaatst is naar een andere controller of is overgeplaatst naar een ander systeem. In dit voorbeeld wordt aangenomen dat er een enkele ATA-schijf wordt gebruikt, die momenteel als ad0 door het systeem wordt herkend. Het wordt ook aangenomen dat het standaard partitieschema van FreeBSD wordt gebruikt, met de bestandssystemen /, /var, /usr, en /tmp, alsmede een wisselpartitie.
Start het systeem opnieuw op, en druk bij de loader(8)-prompt op 4 om in enkele gebruikersmodus op te starten. Geef dan de volgende commando's:
# glabel label rootfs /dev/ad0s1a GEOM_LABEL: Label for provider /dev/ad0s1a is label/rootfs # glabel label var /dev/ad0s1d GEOM_LABEL: Label for provider /dev/ad0s1d is label/var # glabel label usr /dev/ad0s1f GEOM_LABEL: Label for provider /dev/ad0s1f is label/usr # glabel label tmp /dev/ad0s1e GEOM_LABEL: Label for provider /dev/ad0s1e is label/tmp # glabel label swap /dev/ad0s1b GEOM_LABEL: Label for provider /dev/ad0s1b is label/swap # exit
Het systeem zal doorgaan met opstarten in meergebruikersmodus. Bewerk, nadat het opstarten is voltooid, /etc/fstab en vervang de conventionele namen door de respectievelijke labels. Het uiteindelijke bestand /etc/fstab zal er als volgt uitzien:
# Device Mountpoint FStype Options Dump Pass# /dev/label/swap none swap sw 0 0 /dev/label/rootfs / ufs rw 1 1 /dev/label/tmp /tmp ufs rw 2 2 /dev/label/usr /usr ufs rw 2 2 /dev/label/var /var ufs rw 2 2
Het systeem kan nu worden herstart. Als alles goed ging, zal het normaal opstarten en zal mount dit laten zien:
# mount /dev/label/rootfs on / (ufs, local) devfs on /dev (devfs, local) /dev/label/tmp on /tmp (ufs, local, soft-updates) /dev/label/usr on /usr (ufs, local, soft-updates) /dev/label/var on /var (ufs, local, soft-updates)
Beginnend met FreeBSD 7.2 ondersteunt de klasse glabel(8) een nieuw labeltype voor UFS-bestandssystemen, gebaseerd op het unieke id van het bestandssysteem, ufsid. Deze labels kunnen in de map /dev/ufsid gevonden worden en worden automatisch tijdens het opstarten aangemaakt. Het is mogelijk om de ufsid-labels te gebruiken om partities aan te koppelen door middel van de faciliteit /etc/fstab. Gebruik glabel status om een lijst van bestandssystemen en hun overeenkomende ufsid-labels te ontvangen:
% glabel status
Name Status Components
ufsid/486b6fc38d330916 N/A ad4s1d
ufsid/486b6fc16926168e N/A ad4s1f
In het bovenstaande voorbeeld representeert ad4s1d het bestandssysteem /var, terwijl ad4s1f het bestandssysteem /usr representeert. Door gebruik te maken van de gegeven ufsid-waarden kunnen deze partities nu aangekoppeld worden met de volgende regels in /etc/fstab:
/dev/ufsid/486b6fc38d330916 /var ufs rw 2 2 /dev/ufsid/486b6fc16926168e /usr ufs rw 2 2
Elke partitie met een ufsid-label kan op deze manier worden aangekoppeld, waardoor het niet meer nodig is om handmatig permanente labels voor ze aan te maken, terwijl er nog steeds van de voordelen van apparaatnaam-onafhankelijk aankoppelen genoten kan worden.
Met de komst van FreeBSD 7.0 komt ook de langverwachte optie van UFS logboeken. De implementatie zelf is gedaan door middel van het GEOM subsysteem, welke makkelijk geconfigureerd kan worden met behulp van de gjournal(8) applicatie.
Wat is logboeken? Logboek mogelijkheden betekend het opslaan van bestandssysteem transacties, zoals wijzigingen die een complete schrijfactie zijn, voor er meta-data wordt toegevoegd en voor de wijzigingen op schijf worden gezet. Deze transactie log kan later opnieuw afgespeeld worden om te voorkomen dat er bestandssysteem inconsistenties voorkomen.
Deze methode is een extra manier om te beschermen tegen gegevensverlies en inconsistenties van het bestandssysteem. In tegenstelling tot Soft Updates, welke bijhoud welke meta-data wijzigingen er worden uitgevoerd en Snapshots, wat een beeld bestand is van het bestandssysteem, wordt er een complete log bewaard in de schijfruimte die speciaal voor deze taak is gereserveerd, en in sommige gevallen op een compleet andere schijf.
In tegenstelling tot andere logboek implementaties is de gjournal methode blok gebaseerd en niet geïmplementeerd als onderdeel van het bestandssysteem maar als uitbreiding op GEOM.
Om ondersteuning in te schakelen voor gjournal, moet de kernel over de volgende optie beschikken, welke standaard is op FreeBSD 7.X-systemen:
options UFS_GJOURNAL
Indien gejournalde volumes tijdens het opstarten aangekoppeld moeten worden, moet de kernelmodule geom_journal.ko ook geladen zijn, door de volgende regel aan /boot/loader.conf toe te voegen:
geom_journal_load="YES"
Ook kan deze functie in een eigen kernel worden ingebouwd, door de volgende regel aan het kernelinstellingenbestand toe te voegen:
options GEOM_JOURNAL
Het creëren van een logboek op een vrij en beschikbaar bestandssysteem kan nu gedaan worden met behulp van de volgende stappen, ervan uitgaande dat da4 de nieuwe beschikbare SCSI schijf is:
# gjournal load # gjournal label /dev/da4
Op dit moment zou er een ad4 apparaatknooppunt en een ad4.journal apparaatknooppunt moeten zijn. Nu kan er een bestandssysteem op gezet worden:
# newfs -O 2 -J /dev/da4.journal
Het hiervoor ingevoerde commando zal een UFS2 bestandssysteem met logboek ondersteuning aanmaken.
Koppel het apparaat op een gewenst koppelpunt met:
# mount /dev/da4.journal /mnt
Opmerking: In het geval dat er meerdere slices zijn, zal er een logboek voor elke slice gecreëerd worden. Bijvoorbeeld, als ad4s1 en ad4s2 allebei slices zijn, dan zal gjournal een ad4s1.journal en een ad4s2.journal creëeren.
Voor performance doeleinden is het gewenst om het logboek op een andere schijf te bewaren. Voor deze gevallen moet de logboekleverancier of het opslagapparaat gespecificeerd worden achter het apparaat waarop de logboek functionaliteit aangebracht moet worden. De logboekfunctionaliteit kan ook worden ingeschakeld op een reeds bestaand systeem met behulp van tunefs. Maak echter altijd een backup voor dat dit soort dingen uitgeprobeerd worden. In de meeste gevallen zal gjournal falen als het geen actueel logboek kan maken, maar het voorkomt geen dataverlies als gevolg van verkeerd gebruik van tunefs.
Het is ook mogelijk om een journal van de opstartschijf van een FreeBSD-systeem bij te houden. Voor gedetailleerde instructies over deze taak wordt naar het artikel Implementing UFS Journaling on a Desktop PC verwezen.
Bestandssystemen zijn een integraal onderdeel van ieder besturingssysteem. Ze stellen gebruikers in de gelegenheid om bestanden te uploaden en op te slaan, geven toegang tot gegevens en maken natuurlijk harde schijven bruikbaar. Verschillende besturingssystemen hebben gewoonlijk één gezamenlijk aspect, namelijk het bestandssysteem. Op FreeBSD staat dit bestandssysteem bekend onder de naam Fast File System ofwel FFS, dat is gebaseerd op het oorspronkelijke Unix™ File System, ook bekend als UFS. Dit is het oorspronkelijke bestandssysteem van FreeBSD dat op harde schijven wordt geplaatst voor gegevenstoegang.
FreeBSD ondersteunt daarnaast ook een groot aantal andere bestandssystemen om lokaal toegang tot gegevens van andere besturingssystemen te bewerkstelligen; dat wil zeggen: gegevens opgeslagen op lokaal aangesloten USB opslagapparaten, flash drives, en harde schijven. Verder is er ook ondersteuning voor vreemde bestandssystemen. Dit zijn bestandssystemen ontwikkeld voor andere besturingssystemen zoals het Linux Extended File System (EXT) en het Sun Z File System (ZFS).
Er zijn verschillende gradaties van ondersteuning voor de verschillende bestandssystemen op FreeBSD. Sommigen vereisen het laden van een kernelmodule, voor anderen moet een toolset worden geïnstalleerd. Dit hoofdstuk is geschreven om gebruikers van FreeBSD te helpen om op hun systeem toegang te verkrijgen tot andere bestandssystemen, te beginnen met het Sun Z File System.
Na het lezen van dit hoofstuk weet de lezer:
Het verschil tussen eigen en ondersteunde bestandssystemen.
Welke bestandssystemen zijn ondersteund in FreeBSD.
Hoe niet-eigen bestandssystemen geactiveerd, geconfigureerd, benaderd en gebruikt kunnen worden.
Voorafgaand aan het lezen van dit hoofdstuk dient de lezer:
Begrip te hebben van de beginselen van UNIX en FreeBSD (Hoofdstuk 4).
Bekend te zijn met de beginselen van kernelconfiguratie en -compilatie (Hoofdstuk 9).
Vertrouwd te zijn met installatie van software van derden in FreeBSD (Hoofdstuk 5).
Enigszins bekend te zijn met schijven, opslag en apparaatnamen in FreeBSD (Hoofdstuk 19).
Het Z File System, ontwikkeld door Sun, is een nieuwe technologie ontwikkeld om gebruik te maken van een pool-gebaseerde opslagmethode. Dit houdt in dat ruimte pas wordt gebruikt wanneer het nodig is voor dataopslag. Verder is het ontworpen voor maximale integriteit van gegevens, ondersteuning van gegevens-snapshots, meerdere kopieën, en gegevenschecksums. Ook is een nieuw gegevensreplicatiemodel, bekend als RAID-Z, toegevoegd; RAID-Z lijkt op RAID5, maar is ontworpen om corruptie tijdens het schrijven van gegevens te voorkomen.
Het ZFS subsysteem maakt gebruik van veel systeembronnen waardoor het nodig kan zijn een en ander af te stellen, zodat voor het dagelijks gebruik maximale efficiëntie wordt behaald. Doordat het een experimentele eigenschap van FreeBSD is, kan dit in de nabije toekomst veranderen; op dit moment echter, worden de volgende stappen aangeraden.
De totale hoeveelheid systeemgeheugen dient minstens één gigabyte te zijn, maar twee gigabytes of meer wordt aanbevolen. In alle voorbeelden hier heeft het systeem één gigabyte geheugen, met verschillende andere afstelmechanismen in werking.
Sommigen hebben succes gehad met minder dan een gigabyte geheugen, maar met een dergelijke, beperkte hoeveelheid geheugen is de kans groot dat onder zware belasting een kernelpanic in FreeBSD op zal treden door uitputting van het geheugen.
Het wordt aangeraden om ongebruikte stuurprogramma's en opties te verwijderen uit het kernelconfiguratiebestand. Omdat de meeste stuurprogramma's beschikbaar zijn als modules kunnen ze alsnog worden geladen door middel van het bestand /boot/loader.conf.
Gebruikers van de i386-architectuur dienen de volgende optie aan hun kernelconfiguratiebestand toe te voegen, de kernel opnieuw te compileren, en opnieuw op te starten:
options KVA_PAGES=512
Deze optie vergroot de kerneladresruimte, waarmee het mogelijk wordt gemaakt om
de vm.kvm_size afstelling hoger dan de huidige limiet
van 1 GB (2 GB voor PAE) in
te stellen. Deel, om de meest geschikte waarde voor deze optie te vinden, de
gewenste hoeveelheid adresruimte door vier (4). In dit geval is dat 512 voor 2 GB.
De kmem adresruimte dient te worden vergroot op alle FreeBSD architecturen. Op het testsysteem met één gigabyte fysiek geheugen werd succes behaald met de volgende opties, die in het bestand /boot/loader.conf geplaatst dienen te worden, waarna het systeem opnieuw moet worden opgestart:
vm.kmem_size="330M" vm.kmem_size_max="330M" vfs.zfs.arc_max="40M" vfs.zfs.vdev.cache.size="5M"
Zie voor een meer gedetailleerde lijst van aanbevelingen aangaande ZFS-afstelling: http://wiki.freebsd.org/ZFSTuningGuide .
Er is een opstartmechanisme dat FreeBSD in staat stelt om ZFS pools te mounten tijdens initialisatie van het systeem. Voer de volgende commando's uit om dit in te stellen:
# echo 'zfs_enable="YES"' >> /etc/rc.conf # /etc/rc.d/zfs start
In het resterende deel van dit document wordt aangenomen dat er drie SCSI-schijven beschikbaar zijn, en dat hun apparaatnamen respectievelijk da0, da1 en da2 zijn. Gebruikers van IDE-hardware kunnen de ad apparaten gebruiken in plaats van SCSI-apparaten.
Voer het commando zpool uit om een simpele, niet-redundante ZFS-pool op een enkele schijf aan te maken:
# zpool create example /dev/da0
Bestudeer de uitvoer van het commando df om de nieuwe pool te zien:
# df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 2026030 235230 1628718 13% / devfs 1 1 0 100% /dev /dev/ad0s1d 54098308 1032846 48737598 2% /usr example 17547136 0 17547136 0% /example
In deze uitvoer wordt duidelijk dat de example-pool niet alleen is aangemaakt, maar ook direct gemount is. Hij is ook toegankelijk, net als een gewoon bestandssysteem; er kunnen bestanden op worden aangemaakt en gebruikers kunnen er op rondkijken zoals in het volgende voorbeeld:
# cd /example # ls # touch testfile # ls -al total 4 drwxr-xr-x 2 root wheel 3 Aug 29 23:15 . drwxr-xr-x 21 root wheel 512 Aug 29 23:12 .. -rw-r--r-- 1 root wheel 0 Aug 29 23:15 testfile
Helaas benut deze pool nog geen ZFS-mogelijkheden. Maak een bestandssysteem aan op deze pool en activeer er compressie op:
# zfs create example/compressed # zfs set compression=gzip example/compressed
example/compressed is nu een gecomprimeerd ZFS-bestandssysteem. Probeer er een paar grote bestanden naartoe te kopiëren door ze naar /example/compressed te kopiëren.
De compressie kan nu worden uitgeschakeld met:
# zfs set compression=off example/compressed
Voer het volgende commando uit om het bestandssysteem te unmounten, en controleer dat daarna met df:
# zfs umount example/compressed # df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 2026030 235232 1628716 13% / devfs 1 1 0 100% /dev /dev/ad0s1d 54098308 1032864 48737580 2% /usr example 17547008 0 17547008 0% /example
Mount het bestandssysteem opnieuw om het weer toegankelijk te maken en controleer met df:
# zfs mount example/compressed # df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 2026030 235234 1628714 13% / devfs 1 1 0 100% /dev /dev/ad0s1d 54098308 1032864 48737580 2% /usr example 17547008 0 17547008 0% /example example/compressed 17547008 0 17547008 0% /example/compressed
De pool en het bestandssysteem zijn ook zichtbaar in de uitvoer van mount:
# mount /dev/ad0s1a on / (ufs, local) devfs on /dev (devfs, local) /dev/ad0s1d on /usr (ufs, local, soft-updates) example on /example (zfs, local) example/data on /example/data (zfs, local) example/compressed on /example/compressed (zfs, local)
Zoals is te zien kunnen ZFS-bestandssystemen, nadat ze zijn gecreëerd, net als gewone bestandssystemen worden gebruikt; er zijn echter ook vele andere mogelijkheden beschikbaar. In het volgende voorbeeld wordt er een nieuw bestandssysteem data gecreëerd. Er zullen belangrijke bestanden op worden bewaard, dus het bestandssysteem wordt zodanig ingesteld dat het twee kopieën van ieder gegevensblok opslaat:
# zfs create example/data # zfs set copies=2 example/data
Het is nu mogelijk om het gegevens- en ruimtegebruik te bekijken door df opnieuw te draaien:
# df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 2026030 235234 1628714 13% / devfs 1 1 0 100% /dev /dev/ad0s1d 54098308 1032864 48737580 2% /usr example 17547008 0 17547008 0% /example example/compressed 17547008 0 17547008 0% /example/compressed example/data 17547008 0 17547008 0% /example/data
Merk op dat ieder bestandssysteem in de pool dezelfde hoeveelheid vrije ruimte heeft. Dit is de reden dat df steeds wordt gebruikt tussen de voorbeelden door, om te laten zien dat de bestandssystemen slechts zoveel ruimte gebruiken als ze nodig hebben en allemaal putten uit dezelfde pool. Het ZFS bestandssysteem elimineert concepten als volumes en partities, en staat verschillende bestandssystemen toe om in dezelfde pool te bestaan. Verwijder nu de bestandssystemen en verwijder daarna de pool, omdat deze niet meer nodig zijn:
# zfs destroy example/compressed # zfs destroy example/data # zpool destroy example
Schijven gaan slechter werken en begeven het, een onvermijdelijke eigenschap. Wanneer de schijf stukgaat zullen de gegevens verloren gaan. Een methode om gegevensverlies ten gevolge van een kapotte harde schijf te vermijden is het implementeren van RAID. ZFS ondersteunt deze mogelijkheid in zijn pool-ontwerp en wordt beschreven in de volgende sectie.
Zoals eerder opgemerkt wordt in deze sectie aangenomen dat er drie SCSI-schijven bestaan als de apparaten da0, da1 en da2 (of ad0 en hoger als IDE-schijven worden gebruikt). Voer het volgende commando uit om een RAID-Z-pool te creëren:
# zpool create storage raidz da0 da1 da2
Opmerking: Sun raadt aan om tussen de drie en negen schijven te gebruiken voor een RAID-Z-configuratie. Overweeg, als u een enkele pool met 10 of meer schijven nodig heeft, om deze te splitsen in kleine RAID-Z-groepen. Overweeg, als u slechts twee schijven heeft en nog steeds redundantie nodig heeft, om in plaats hiervan een ZFS-spiegel te gebruiken. Bekijk de handleidingpagina zpool(8) voor meer details.
De storage zpool zou gecreëerd moeten zijn. Dit kan worden geverifieerd met de mount(8) en df(1) commando's zoals eerder. Er kunnen meer schijfapparaten worden toegewezen door ze aan het einde van de bovenstaande lijst toe te voegen. Maak een nieuw bestandssysteem in de pool, genaamd home waar op den duur de gebruikersbestanden geplaatst zullen worden:
# zfs create storage/home
Het is nu mogelijk om compressie in te schakelen en extra kopieën te bewaren van de gebruikersmappen en -bestanden. Dit kan net als eerder worden bewerkstelligd door de volgende commando's uit te voeren:
# zfs set copies=2 storage/home # zfs set compression=gzip storage/home
Kopieer, om dit als de nieuwe home-map voor gebruikers in te stellen, de gebruikersgegevens naar deze map en creëer de benodigde links:
# cp -rp /home/* /storage/home # rm -rf /home /usr/home # ln -s /storage/home /home # ln -s /storage/home /usr/home
De gebruikersgegevens zouden nu op het nieuw aangemaakte /storage/home bestandssysteem moeten staan. Test dit door een nieuwe gebruiker aan te maken en daarmee in te loggen.
Probeer een snapshot te maken dat later weer hersteld kan worden:
# zfs snapshot storage/home@08-30-08
Merk op dat de snapshot-optie alleen een echt bestandssysteem vastlegt, geen mappen of bestanden. Het @-karakter wordt gebruikt als scheidingsteken tussen de naam van het bestandssysteem of de naam van het volume. Wanneer de home-map van een gebruiker wordt weggegooid, kan deze worden hersteld met:
# zfs rollback storage/home@08-30-08
Voer ls in de .zfs/snapshot directory van het bestandssysteem uit om een lijst van alle beschikbare snapshots te krijgen. Voer, om bijvoorbeeld het zojuist gemaakte snapshot te zien, het volgende commando uit:
# ls /storage/home/.zfs/snapshot
Het is mogelijk om een script te schrijven dat maandelijks een snapshot van de gebruikersgegevens maakt; na verloop van tijd kunnen snapshots echter een grote hoeveelheid schrijfruimte in beslag nemen. Het vorige snapshot kan worden verwijderd met het volgende commando:
# zfs destroy storage/home@08-30-08
Na al dit testen is er geen reden om /storage/home in zijn huidige staat nog te bewaren. Maak er het echte /home bestandssysteem van:
# zfs set mountpoint=/home storage/home
Het uitvoeren van de commando's df en mount laat zien dat het systeem ons bestandssysteem nu als de echte /home behandelt:
# mount /dev/ad0s1a on / (ufs, local) devfs on /dev (devfs, local) /dev/ad0s1d on /usr (ufs, local, soft-updates) storage on /storage (zfs, local) storage/home on /home (zfs, local) # df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 2026030 235240 1628708 13% / devfs 1 1 0 100% /dev /dev/ad0s1d 54098308 1032826 48737618 2% /usr storage 26320512 0 26320512 0% /storage storage/home 26320512 0 26320512 0% /home
Hiermee is de RAID-Z configuratie compleet. Voer het volgende commando uit om status-updates van de gecreëerde bestandssystemen te krijgen tijdens het draaien van de nachtelijke periodic(8):
# echo 'daily_status_zfs_enable="YES"' >> /etc/periodic.conf
Iedere software-RAID heeft een methode om zijn status te inspecteren. ZFS is geen uitzondering. De status van RAID-Z-apparaten kan worden geïnspecteerd met het volgende commando:
# zpool status -x
Als alle pools in orde zijn en alles is normaal, dan wordt het volgende bericht weergegeven:
all pools are healthy
Als er een probleem is, misschien een schijf die offine is gegaan, dan wordt de status van de pool weergegeven en dat zal er als volgt uitzien:
pool: storage state: DEGRADED status: One or more devices has been taken offline by the administrator. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Online the device using 'zpool online' or replace the device with 'zpool replace'. scrub: none requested config: NAME STATE READ WRITE CKSUM storage DEGRADED 0 0 0 raidz1 DEGRADED 0 0 0 da0 ONLINE 0 0 0 da1 OFFLINE 0 0 0 da2 ONLINE 0 0 0 errors: No known data errors
Hier staat dat het apparaat offline is gezet door de beheerder. Dat is waar voor dit specifieke voorbeeld. Om de schijf offline te zetten werd het volgende commando gebruikt:
# zpool offline storage da1
Het is nu mogelijk om de schijf da1 te vervangen nadat het systeem uitgeschakeld is. Zodra het systeem weer opgestart is, kan het volgende commando worden uitgevoerd om de schijf te vervangen:
# zpool replace storage da1
Nu kan de status opnieuw geïnspecteerd worden, dit keer zonder de -x vlag, om de statusinformatie op te vragen:
# zpool status storage pool: storage state: ONLINE scrub: resilver completed with 0 errors on Sat Aug 30 19:44:11 2008 config: NAME STATE READ WRITE CKSUM storage ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 errors: No known data errors
Zoals te zien in dit voorbeeld lijkt alles normaal te zijn.
Zoals eerder opgemerkt gebruikt ZFS checksums om de integriteit van opgeslagen gegevens te verifiëren. Ze worden automatisch ingeschakeld bij het creëeren van bestandssystemen en kunnen worden uitgeschakeld door middel van het volgende commando:
# zfs set checksum=off storage/home
Dit is echter geen verstandig idee, omdat checksums zeer weinig opslagruimte innemen en nuttiger zijn wanneer ze zijn ingeschakeld. Het lijkt daarnaast ook geen merkbare invloed op de prestaties te hebben wanneer ze zijn ingeschakeld. Wanneer ze aanstaan is het mogelijk om ZFS gegevensintegriteit te laten controleren door middel van checksum-verificatie. Dit proces staat bekend als “scrubbing”. Voer het volgende commando uit om de gegevensintegriteit van de storage-pool te controleren:
# zpool scrub storage
Dit proces kan, afhankelijk van de hoeveelheid opgeslagen gegevens, een aanzienlijke hoeveelheid tijd in beslag nemen. Het is daarnaast ook zeer I/O-intensief, zozeer dat slechts één van deze operaties tegelijkertijd uitgevoerd kan worden. Nadat de scrub is voltooid wordt de status bijgewerkt en kan deze worden bekeken door een statusaanvraag te doen:
# zpool status storage pool: storage state: ONLINE scrub: scrub completed with 0 errors on Sat Aug 30 19:57:37 2008 config: NAME STATE READ WRITE CKSUM storage ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 errors: No known data errors
De voltooiingstijd is in dit voorbeeld duidelijk zichtbaar. Deze eigenschap helpt om gegevensintegriteit te garanderen gedurende een langere tijdsperiode.
Er zijn vele andere opties voor het Z-bestandssysteem, zie de handleidingpagina's zfs(8) en zpool(8).
ZFS ondersteunt verschillende soorten quota: de refquota, de algemene quota, de gebruikersquota en de groepsquota. Deze sectie legt de beginselen van ieder van deze uit en bevat wat instructies voor gebruik.
Quota beperken de hoeveelheid ruimte die een gegevensverzameling en zijn afstammelingen kunnen gebruiken en dwingen een limiet af op de hoeveelheid ruimte dat gebruikt wordt door bestandssystemen en snapshots voor deze afstammelingen. Vanuit gebruikers zijn quota handig om de hoeveelheid ruimte die een bepaalde gebruiker kan gebruiken te beperken.
Opmerking: Quota kunnen niet op volumes worden ingesteld, aangezien de eigenschap volsize als een impliciet quotum optreedt.
De refquota, refquota=grootte, beperkt de hoeveelheid ruimte die een gegevensverzameling in beslag kan nemen door een harde grens aan de gebruikte ruimte te stellen. Deze harde grens bevat echter niet de ruimte gebruikt door afstammelingen, zoals bestandssystemen of snapshots.
Gebruik het volgende om een algemeen quotum van 10 GB voor /home/storage/bob af te dwingen:
# zfs set quota=10G storage/home/bob
Gebruikersquota beperken de hoeveelheid ruimte die door de aangegeven gebruiker kan worden gebruikt. Het algemene formaat is userquota@gebruiker=grootte waarbij de gebruikersnaam in één van de volgende formaten dient te zijn:
Naam compatibel met POSIX (bijvoorbeeld jan).
Numeriek POSIX-ID (bijvoorbeeld 789).
SID-naam (bijvoorbeeld jan.bloggs@voorbeeld.com).
Numeriek SID-ID (bijvoorbeeld S-1-123-456-789).
Gebruik het volgende om bijvoorbeeld een een quotum van 50 GB voor een gebruiker jan af te dwingen:
# zfs set userquota@jan=50G
Gebruik in plaats hiervan, om het quotum te verwijderen of er zeker van te zijn dat er geen is ingesteld:
# zfs set userquota@jan=none
Eigenschappen van gebruikersquota worden niet weergegeven door zfs get all. Niet-root gebruikers kunnen alleen hun eigen quota zien tenzij het privilege userquota aan ze is gegeven. Gebruikers met dit privilege kunnen ieders quota bekijken en instellen.
Groepsquota beperken de hoeveelheid ruimte die de gespecificeerde gebruikersgroep in beslag kan nemen. Het algemene formaat is groupquota@groep=grootte.
Gebruik om het quotum voor de groep eerstegroep op 50 GB in te stellen:
# zfs set groupquota@eerstegroep=50G
Gebruik in plaats hiervan, om het quotum voor de groep eerstegroep te verwijderen of om er voor te zorgen dat deze niet is ingesteld:
# zfs set groupquota@eerstegroep=none
Net zoals bij de eigenschappen van gebruikersquota kunnen niet-root-gebruikers alleen de quota zien die geassocieerd zijn met de gebruikersgroepen waar ze bij horen, een root-gebruiker of een gebruiker met het privilege groupquota kan alle quota voor alle groepen bekijken en instellen.
Het deelcommando zfs userspace geeft de hoeveelheid ruimte weer die door elke gebruiker op de snapshot van het gespecificeerde bestandssysteem in beslag wordt genomen, tezamen met alle ingestelde quota. Het deelcommando zfs groupspace doet hetzelfde voor groepen. Bekijk zfs(1) voor meer informatie over ondersteunde opties of het weergegeven van specifieke opties.
Gebruik het volgende om de quota voor storage/home/bob weer te geven, als u de juiste privileges heeft of root bent:
# zfs get quota storage/home/bob
ZFS ondersteunt twee soorten van ruimtereserveringen. Deze sectie legt de beginselen van elk van de twee uit en bevat enkele instructies voor gebruik.
De eigenschap reservation maakt het mogelijk om een gegarandeerde minimale hoeveelheid ruimte voor een gegevensverzameling en zijn afstammelingen te reserveren. Dit betekent dat als er een reservering van 10 GB is ingesteld voor storage/home/bob en de schijfruimte op raakt, er tenminste 10 GB aan ruimte is gereserveerd voor deze gegevensverzameling. De eigenschap reservation stelt de minimale hoeveelheid ruimte in die gegarandeerd is voor een gegevensverzameling exclusief afstammelingen zoals snapshots, of geeft deze aan. Als er bijvoorbeeld een snapshot is genomen van storage/home/bob moet er genoeg schijfruimte zijn buiten de refreservation hoeveelheid om de operatie te laten slagen omdat afstammelingen van de hoofdgegevensverzameling niet worden meegeteld in de refreservation hoeveelheid en dus niet stiekem de vastgestelde ruimte wijzigen.
Reserveringen kunnen in allerlei situaties nuttig zijn, bijvoorbeeld voor het plannen en testen van de geschiktheid van het toewijzen van schijfruimte in een nieuw systeem, of om ervoor te zorgen dat er genoeg schijfruimte beschikbaar is op bestandsssystemen voor systeemherstelprocedures en bestanden.
Het algemene formaat van de eigenschap reservation is reservation=grootte, dus gebruik het onderstaande commando om een reservering van 10 GB op storage/home/bob te plaatsen:
# zfs set reservation=10G storage/home/bob
Gebruik, om te controleren of er geen reservatie is geplaatst of om een reservatie te verwijderen:
# zfs set reservation=none storage/home/bob
Het zelfde principe kan worden toegepast op de eigenschap refreservation om een refreservation in te stellen, met het algemene formaat refreservation=grootte.
Gebruik één van de volgende commando's om te kijken of er een reservatie of refreservation bestaat op storage/home/bob:
# zfs get reservation storage/home/bob # zfs get refreservation storage/home/bob
Deze sectie beschrijft enkele van de Linux bestandssystemen die door FreeBSD worden ondersteund.
De kernelimplementatie van het ext2fs(5) bestandssysteem was geschreven door Godmar Back, het eerste stuurprogramma verscheen in FreeBSD 2.2. In FreeBSD 8 en eerder is de code gelicenseerd onder de GNU Public License, onder FreeBSD 9 is de code echter herschreven en nu beschikbaar onder de BSD-licentie.
Het stuurprogramma ext2fs(5) stelt de FreeBSD-kernel in staat om ext2 bestandssystemen te lezen en er naar te schrijven.
Laad ten eerste de kernelmodule:
kldload ext2fs
Koppel daarna een ext2fs(5)-volume aan dat zich op /dev/ad1s1 bevindt:
mount -t ext2fs /dev/ad1s1 /mnt
Het X-bestandssysteem, XFS, is origineel
geschreven door SGI voor het
besturingssysteem IRIX, ze hebben het
overgebracht naar Linux. De broncode is vrijgegeven
onder de GNU Public License. Kijk op deze pagina voor meer
details. De FreeBSD-port werd gestart door Russel Cattelan, Alexander Kabaev <kan@FreeBSD.org> en
Craig Rodrigues <rodrigc@FreeBSD.org>.
Om XFS als een kernelmodule te laden:
kldload xfs
Het stuurprogramma xfs(5) stelt de FreeBSD-kernel in staat om XFS-bestandssystemen te benaderen. Momenteel is echter alleen ondersteuning voor lezen aanwezig. Schrijven naar een volume is niet mogelijk.
Om een xfs(5)-volume wat op /dev/ad1s1 aan te koppelen:
mount -t xfs /dev/ad1s1 /mnt
Merk op dat de port sysutils/xfsprogs het gereedschap mkfs.xfs bevat wat het mogelijk maakt om XFS-bestandssystemen aan te maken, en verder gereedschappen om ze te analyseren en repareren.
De vlag -p van mkfs.xfs kan worden gebruikt om een xfs(5)-bestandssysteem aan te maken welke bevolkt wordt met bestanden en andere meta-gegevens. Dit kan worden gebruikt om snel een alleen-lezen bestandssysteem aan te maken welke op FreeBSD getest kan worden.
Het Reiser bestandssysteem, ReiserFS, was overgebracht naar FreeBSD door
Jean-Sébastien Pédron <dumbbell@FreeBSD.org> en is vrijgegeven
onder de GNU Public License.
Het stuurprogramma voor ReiserFS stelt de FreeBSD-kernel momenteel in staat om ReiserFS bestandssystemen te benaderen en hun inhoud te lezen, maar het kan ze momenteel niet beschrijven.
Laad ten eerste eerst de kernelmodule:
kldload reiserfs
Om ten tweede een ReiserFS-volume dat zich op /dev/ad1s1 aan te koppelen:
mount -t reiserfs /dev/ad1s1 /mnt
Welke harde schijven er ook gebruikt worden, er zijn altijd mogelijke problemen:
Ze kunnen te klein zijn.
Ze kunnen te traag zijn.
Ze kunnen te onbetrouwbaar zijn.
Er zijn verschillende oplossingen voor deze problemen voorgesteld en geïmplementeerd. Eén manier waarop gebruikers zich wapenen tegen een aantal van deze problemen is door meerdere en soms ook redundante schijven te gebruiken. Naast ondersteuning voor verschillende kaarten en controllers die hardware-RAID ondersteunen, bevat het FreeBSD basissysteem ook de Vinum Volume Manager, een “blokapparaatstuurprogramma” waarmee virtuele schijven gemaakt kunnen worden. Vinum is een zogenaamde Volume Manager, een stuurprogramma voor virtuële schijven dat deze drie problemen in beschouwing neemt. Vinum biedt meer flexibiliteit, prestaties en betrouwbaarheid dan traditionele schijfopslag en er kan RAID-0, RAID-1 en RAID-5 mee gemaakt worden of een combinatie van deze RAID-niveaus.
In dit hoofdstuk wordt een overzicht gegeven van de mogelijke problemen die traditionele schijfopslag met zich meebrengt en de Vinum Volume Manager wordt geïntroduceerd.
Opmerking: Vanaf FreeBSD 5, is Vinum herschreven om in de GEOM-architectuur (Hoofdstuk 20) te passen, met behoud van de originele ideëen, terminologie, en metagegevens die op de schijf staan. Deze herschrijving wordt gvinum (voor GEOM vinum) genoemd. De volgende tekst refereert aan Vinum als een abstracte naam, onafhankelijk van de implementatievariant. Alle commando-aanroepen dienen nu met het commando gvinum gedaan te worden, en de naam van de kernelmodule is veranderd van vinum.ko naar geom_vinum.ko, en alle apparaatknooppunten bevinden zich in /dev/gvinum in plaats van /dev/vinum. Sinds FreeBSD 6 is de oude implementatie van Vinum niet meer beschikbaar in de broncode.
De capaciteit van schijven wordt groter, maar ook de vraag naar capaciteit neemt toe. Vaak is het gewenste bestandssysteem groter dan de op dat moment beschikbare schijven. Hoewel dit probleem niet meer zo actueel als het tien jaar geleden was, bestaat het nog steeds. In sommige systemen is dit opgelost door een virtuele harde schijf te maken die de gegevens op meerdere fysieke harde schijven kan opslaan.
Moderne systemen hebben vaak simultaan toegang tot gegevens nodig. FTP en webservers kunnen bijvoorbeeld duizenden simultane sessies onderhouden en hebben vaak meerdere 100 Mbit/s verbindingen met de rest van de wereld. De benodigde gegevensdoorvoer is dan groter dan de meeste schijven kunnen leveren.
Huidige schijven kunnen gegevens sequentieel overdragen met ongeveer 70 MB/s, maar deze snelheid heeft geen waarde in een omgeving waar onafhankelijke processen toegang tot de schijf hebben. In zo'n situatie is het interessanter om vanuit het standpunt van de schijfstuurprogramma te kijken: de belangrijkste parameter is dan de belasting die een bepaalde gegevensoverdracht op het stuurprogramma plaatst. Met andere woorden: wat is het tijdsbeslag van een gegevensoverdracht op te schijf?
Bij elke gegevensoverdracht moet de schijf eerst zijn kop positioneren, wachten tot de eerste sector onder de kop doorkomt en vervolgens de overdracht starten. Deze acties duren bijzonder kort. Het heeft geen enkele zin om ze te onderbreken.
Neem een overdracht van ongeveer 10 kB: de huidige generatie high-performance schijven kan de kop in 3.5 ms plaatsen. De snelste schijven draaien met 15.000 toeren per minuut, dus de gemiddelde rotatie vertraging (een halve omwenteling) bedraagt 2 ms. Met 70 MB/s de overdracht zelf duurt ongeveer 150 μs, bijna niets vergeleken met de tijd die verloren is gegaan aan het positioneren. In zulke gevallen daalt de gegevensoverdracht naar iets meer dan 1 MB/s en is dus duidelijk afhankelijk van de grootte van de over te dragen gegevens.
De traditionele en logische oplossing voor dit probleem is “meer schijven”: in plaats van één grote schijf, meerdere kleine schijven met een zelfde totale opslagcapaciteit. Iedere schijf is in staat om onafhankelijk de kop te plaatsen en de gegevens over te dragen, dus de effectieve doorvoer neemt toe met een factor bijna gelijk aan het aantal schijven.
De exacte verbetering van de doorvoer is natuurlijk kleiner dan het aantal schijven, want hoewel iedere schijf in staat is om parallel de gegevens over te dragen, er is geen garantie dat de gegevens gelijk over de schijven verdeeld is. De belasting op de ene schijf zal dan ook groter zijn dan op de andere schijf.
Een gelijke belasting van de schijven is in grote mate afhankelijk van de manier waarop gegevens over de schijven zijn verdeeld. In het volgende stuk is de opslag van een virtuele schijf voor te stellen als een verzameling sectoren die met een nummer aangesproken kan worden, net als bladzijden in een boek. De meest voor de hand liggende methode om een virtuele schijf te maken is het achter elkaar plakken van de fysieke schijven. Een virtueel boek zou dan opgebouwd zijn uit verschillende achter elkaar zittende fysieke hoofdstukken. Deze methode heet aaneenschakelen (“concatenation”) en heeft het voordeel dat schijven verschillend van grootte kunnen zijn. Dit werkt prima als toegang tot de gegevens gelijk verdeeld is over de hele gegevensverzameling. Als die toegang beperkt is tot een klein deel van de gegevensverzameling, is de snelheidsverbetering een stuk kleiner. Figuur 22-1 laat de manier zien hoe aaneengeschakelde schijven hun gegevens opslaan.
Een andere methode is het verdelen van de totale opslag van de virtuele schijf in kleinere stukjes van gelijke grootte en ze achter elkaar op verschillende fysieke schijven op te slaan. Bijvoorbeeld: de eerste 256 sectoren worden op schijf 1 opgeslagen, de tweede 256 sectoren op schijf 2 enzovoort, tot de laatste schijf is gebuikt, waarna weer bij schijf 1 verder wordt gegaan, net zolang tot de schijven vol zijn. Deze methode heet verdelen (“striping”) of RAID-0. [11]. Bij RAID-0 kost het iets meer moeite om de gegevens te vinden en het kan extra I/O belasting met zich meebrengen als gegevens zijn verdeeld over verschillende fysieke schijven. Het kan echter ook zorgen voor een constantere belasting van die schijven. Figuur 22-2 geeft weer hoe RAID-0 schijven hun gegevens opslaan.
Het laatste probleem met de huidige schijven is dat ze onbetrouwbaar zijn. Hoewel de betrouwbaarheid de laatste jaren enorm is toegenomen, blijven schijven het vitale onderdeel van een server dat waarschijnlijk als eerste kapot gaat. Als dat gebeurt kan het catastrofale gevolgen hebben: het vervangen van de schijf en het terugplaatsen van de gegevens kan dagen kosten.
De traditionele manier om dit te voorkomen is spiegelen (“mirroring”): het hebben van een kopie van de gegevens op een andere fysieke schijf. Sinds de uitvinding van RAID niveaus staat dit bekend als RAID-1. Een schrijfactie naar de virtuele schijf gebeurt op beide fysieke schijven. Een leesactie hoeft slechts vanaf één te gebeuren. Op deze manier kan de virtuele schijf dus blijven werken als één van de twee fysieke schijven kapot is.
RAID-1 heeft twee problemen:
Prijs. Er is twee keer zoveel schijfruimte nodig als bij een niet-redundante schijf.
Prestatie. Een schrijfactie moet op twee schijven gebeuren en kost dus twee keer zoveel bandbreedte. Een leesactie hoeft maar op één schijf te gebeuren en heeft hier dus geen last van.
Een andere manier is pariteit, uitgevoerd in RAID niveaus 2, 3, 4 en 5. Van deze vier is RAID-5 het meest interessant. In Vinum is het geïmplementeerd als een variant van een verdeelde organisatie waarbij één blok van elk deel is gereserveerd voor de pariteit van één van de andere blokken. Voor Vinum is een RAID-5 samenstelling (“plex”) dan ook gelijk aan een verdeelde samenstelling, met als verschil dat het een pariteitblok bevat in ieder deel. Zoals voorgeschreven door RAID-5 wisselt de locatie van dit pariteitblok van het ene deel naar het andere. De nummers in de gegevensblokken geven de relatieve bloknummers aan.
Vergeleken met spiegelen heeft RAID-5 het voordeel dat er beduidend minder opslagcapaciteit nodig is. Lezen gebeurt op dezelfde manier als bij een verdeelde organisatie, maar schrijven kost beduidend meer tijd, ongeveer 25% van de leesprestaties meer. Als één schijf uitvalt, kan de reeks doorwerken in een verslechterde staat (“degraded mode”): gegevens van een functionerende schijf kunnen zonder problemen gelezen worden, maar gegevens van de defecte schijf moeten eerst worden samengesteld uit de pariteit van de overeenkomende blokken van de resterende schijven.
Om deze problemen op te lossen, hanteert vinum een hiërarchie met vier niveaus van objecten:
Het meest zichtbare object is de virtuele schijf. Dit object wordt volume genoemd. Op een paar kleine details na, hebben volumes dezelfde eigenschappen als een UNIX schijf. Het belangrijkste verschil is dat er geen beperking aan de grootte van de schijf is.
Volumes zijn opgebouwd uit samenstellingen, die elk de totale opslagcapaciteit van het volume hebben. Dit niveau in de hiërarchie biedt daarom redundantie. Een samenstelling is goed voor te stellen als een individuele schijf in een RAID-1 systeem. Iedere schijf bevat dezelfde gegevens.
Omdat Vinum bestaat binnen het UNIX opslagsysteem, moet het mogelijk zijn om UNIX partities te gebruiken als bouwstenen voor samenstellingen die uit meerdere schijven bestaan. Maar het blijkt dat dit te inflexibel is: UNIX schijven hebben een beperkt aantal partities. In plaats daarvan verdeelt Vinum een UNIX partitie (de schijf) in aaneengesloten stukken die subschijven<