Pocket Linux Guide David Horton <[1]dhorton@megsinet.net.NOSPAM> Vertaald door: Ellen Bokhorst <[2]bokkie@nl.linux.org> De Pocket Linux Guide is voor iedereen die is geïnteresseerd in het leren van de technieken om een GNU/Linux systeem vanaf de broncode op te bouwen. De handleiding is gestructureerd als een project waarin een klein op diskette gebaseerd GNU/Linux wordt gebouwd genaamd Pocket Linux. In elk hoofdstuk wordt een klein deel van het totaalsysteem onderzocht en uitgelegd hoe het werkt, waarom het nodig is en hoe het te bouwen. Na voltooiing van het Pocket Linux project, zouden lezers over een grotere kennis moeten bezitten van wat maakt dat GNU/Linux systemen werken als ook het zelfvertrouwen om grotere, complexere projecten bestaande uit alleen de broncode te onderzoeken. _________________________________________________________________ Inhoudsopgave [3]Rechtsgeldige informatie [4]Copyright en Licentie [5]Disclaimer [6]Introductie [7]Over Pocket Linux [8]Benodigde vaardigheden [9]Projectopmaak [10]Help & Support [11]Feedback 1. [12]Begin van het project [13]Een beknopte historie van GNU/Linux [14]Het doel van Pocket Linux [15]Werken binnen de beperkingen 2. [16]Een simpel prototype [17]Analyse [18]Ontwerp [19]Vereenvoudiging [20]Bootdisk [21]Rootdisk [22]CPU compatibiliteit [23]Constructie [24]Prepareer de bootdisk diskette [25]Bouw de kernel [26]Kopieer de kernel naar diskette [27]Kopieer de LILO bootloader [28]Maak de devicebestanden aan die LILO nodig heeft [29]Schrijf een simpel lilo.conf [30]Installeer de LILO bootloader [31]Unmount de bootdisk [32]Prepareer de rootdisk diskette [33]Bouw BASH [34]Kopieer BASH naar de rootdisk [35]Maak de device bestanden aan die BASH nodig heeft [36]Unmount de rootdisk [37]Implementatie [38]Systeemstart [39]Test wat werkt [40]Opmerken wat er niet werkt [41]Systeem afsluiten 3. [42]Ruimte besparen [43]Analyse [44]Ontwerp [45]Gedeelde library's [46]Gestripte binary's [47]Gecomprimeerd bestandssysteem [48]Constructie [49]Maak een ramdisk aan [50]Compileer de BASH-shell opnieuw [51]Stel vast welke library's nodig zijn [52]Kopieer BASH en de library's naar de ramdisk [53]Maak een consoledevice aan [54]Comprimeer het ramdiskimage [55]Kopieer het gecomprimeerde image naar diskette [56]Implementatie [57]Systeemstart [58]Verifieer de resultaten [59]Systeem afsluiten 4. [60]Een aantal basisutility's [61]Analyse [62]Ontwerp [63]Bepalen van de benodigde opdrachten [64]Lokaliseren van broncode [65]De invloed van de FHS [66]Constructie [67]Maak een fasegebied aan [68]Kopieer de inhoud van de rootdisk uit fase 2 [69]Installeer "cat" uit GNU Textutils [70]Installeer de binary's uit GNU fileutils [71]Installeer binary's uit sh-utils [72]Kopieer aanvullende library's [73]Strip binary's en libary's [74]Maak een gecomprimeerd rootdiskimage aan [75]Schrijf het rootdiskimage naar diskette [76]Implementatie [77]Systeemstart [78]Nieuwe opdrachten testen [79]Systeem afsluiten 5. [80]Controleren en mounten van disks [81]Analyse [82]Ontwerp [83]Vaststellen van de benodigde utility's. [84]Opsporen van de broncode [85]Automatiseren van fsck en mount [86]Bestandsafhankelijkheden [87]Constructie [88]Installeer utility's uit e2fsprogs [89]Installeer utility's uit util-linux [90]Controleer op library benodigdheden [91]Strip binary's om ruimte te besparen [92]Maak extra devicebestanden aan [93]Maak de bestanden mtab en fstab aan [94]Schrijf een script om het proc bestandssysteem te mounten [95]Schrijf een script dat lokale bestandssystemen controleert en mount [96]Maak een gecomprimeerd rootdiskimage aan [97]Schrijf het rootdiskimage naar diskette [98]Implementatie [99]Systeemstart [100]Test proc_fs en local_fs scripts [101]Maak extra bestandssystemen aan en mount deze [102]Systeem afsluiten 6. [103]Automatiseren van de systeemstart & afsluiten van het systeem [104]Analyse [105]Ontwerp [106]De nodige utility's vaststellen [107]Verkrijgen van de broncode [108]Afhankelijkheden controleren [109]Uiteenzetting van opstartscripts [110]Constructie [111]Installeer sysvinit utility's [112]Maak een /etc/inittab bestand aan [113]Maak een /etc/init.d/rc script aan [114]Pas het script /etc/init.d/local_fs aan [115]Maak een hostname script aan [116]Maak halt & reboot scripts aan [117]Maak rcN.d directory's en links naar scripts in /etc/init.d [118]Maak het rootdiskimage aan [119]Kopieer de image naar diskette [120]Implementatie [121]Systeemstart [122]Verifieer het succes van de opstartscripts [123]Systeem afsluiten 7. [124]Meerdere gebruikers activeren [125]Analyse [126]Ontwerp [127]Het loginproces [128]Verkrijgen van de broncode [129]Aanmaken van ondersteuningsbestanden [130]Afhankelijkheden [131]Eigenaar en permissies toekennen [132]Constructie [133]Verifieer de aanwezigheid van getty en login [134]Pas inittab voor de multi-user modus aan [135]Maak tty devices aan [136]Maak ondersteuningsbestanden aan in /etc [137]Kopieer de benodigde library's [138]Stel de directory- en bestandspermissies in [139]Maak het rootdiskimage aan [140]Kopieer de image naar diskette [141]Implementatie [142]Systeemstart [143]Een nieuwe gebruiker aan het systeem toevoegen [144]Test de nieuwe gebruikersmogelijkheid om het systeem te gebruiken [145]Systeem afsluiten 8. [146]Opvullen van de hiaten [147]Analyse [148]Ontwerp [149]more [150]Meer device bestanden [151]ps, sed & ed [152]Constructie [153]Schrijf een "more" script [154]Maak extra devicebestanden aan [155]Installeer procps [156]Installeer sed [157]Installeer ed [158]Strip binary's om ruimte te besparen [159]Verzeker je van de juiste permissies [160]Maak het rootdisk image aan [161]Kopieer de image naar diskette [162]Implementatie [163]Systeemstart [164]Test het "more" script [165]Gebruik ps om de actieve processen te tonen [166]Voer een simpel sed script uit [167]Test de "ed" editor [168]Systeem afsluiten 9. [169]Projectsamenvatting [170]Vaardigheden vieren [171]Plannen van de volgende stappen A. [172]Toepassingen hosten [173]Analyse [174]Ontwerp [175]Ondersteuning voor audio-hardware [176]Ruimte voor het programma vrijmaken [177]Benaderen van audio-bestanden [178]Andere benodigde bestanden [179]Samenvatting van taken [180]Constructie [181]Maak een bootdisk aan [182]Maak een rootdisk aan [183]Maak voor mp3blaster een gecomprimeerde /usr disk [184]Maak voor het testen een gegevensdiskette aan [185]Implementatie [186]Systeemstart [187]Verifieer of de /usr diskette juist werd geladen [188]Controleer de initialisatie van het audio-device [189]Test de audio-uitvoer [190]Speel een voorbeeldbestand af [191]Systeem afsluiten _________________________________________________________________ Rechtsgeldige informatie Copyright en Licentie This document, Pocket Linux Guide, is copyrighted (c) 2003 by David Horton. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is available at [192]http://www.gnu.org/copyleft/fdl.html. Linux is een geregistreerd handelsmerk van Linus Torvalds. _________________________________________________________________ Disclaimer Er kan geen aansprakelijkheid voor de inhoud van dit document worden geaccepteerd. Gebruik de concepten, voorbeelden en informatie op eigen risico. Er kunnen fouten en onzorgvuldigheden in staan, die je systeem zouden kunnen beschadigen. Neem voorzichtigheid in acht en alhoewel het zeer onwaarschijnlijk is, nemen de auteurs geen verantwoording op zich. Alle copyrights vallen in handen van hun respectieve eigenaren, tenzij specifiek anders vermeld. Gebruik van een term in dit document zou niet moeten worden aangemerkt als van invloed zijnde op de geldigheid van enig handels- of servicemerk. Het benoemen van bepaalde producten of merken zou niet moeten worden aangemerkt als een bevesting. _________________________________________________________________ Introductie Over Pocket Linux In de Pocket Linux Guide wordt gedemonstreerd hoe een klein GNU/Linux systeem gebaseerd op de console te bouwen met slechts wat broncode en een paar diskettes. Het is bedoeld voor Linux gebruikers die graag een breder begrip willen verwerven over hoe hun systeem werkt onder de waas van distributie specifieke features en tools. _________________________________________________________________ Benodigde vaardigheden Deze handleiding is bedoeld voor de gemiddelde tot gevorderde Linux gebruikers. Het is niet met opzet obscuur, maar er wordt uitgegaan van bepaalde vaardigheden die de lezer heeft. Succes met deze handleiding is deels afhankelijk in hoeverre je de volgende taken uit kunt voeren: * Het gebruik van basis shellopdrachten * Man en infopages raadplegen * Een aangepaste Linux kernel bouwen * Broncode compileren en het gebruik van make en daaraan gerelateerde tools _________________________________________________________________ Projectopmaak De Pocket Linux Guide kiest voor het opdoen van ervaring een praktijkgerichte benadering. De handleiding is zodanig geschreven dat in elk hoofdstuk een stukje van het totaalproject wordt opgebouwd. De hoofdstukken zijn verder onderverdeeld in de secties Analyse, Ontwerp, Constructie en Implementatie. Deze opmaak is afgeleid van de Rapid Application Development (RAD) methode. Zonder in te gaan op de ontwerpmethodes, kunnen de secties als volgt worden samengevat: * In de sectie Analyse wordt op hoog niveau een overzicht gegeven wat in elk hoofdstuk zal worden bewerkstelligd. Het zal de taken introduceren die moeten worden voltooid en waarom ze voor het totaalsysteem van belang zijn. * In de sectie Ontwerp worden de broncodepackages, bestanden en configuraties gedefinieerd, die nodig zijn om aan de vereisten uiteengezet in de sectie Analyse te kunnen voldoen. Veel van de theorie die gaat over waarom bepaalde systeembestanden bestaan en wat hun doel is, kan hier worden aangetroffen. * De sectie Constructie is waar alle praktijkacties plaatsvinden. In deze sectie wordt in detail ingegaan op het bouwen van de broncode en het configureren van de systeembestanden. * In de sectie Implementatie zal aan het einde van elk hoofdstuk de juiste werking van het project worden getest. Vaak staan hier een paar uit te voeren shell-opdrachten en worden er voorbeelden van te verwachten schermuitvoer gegeven. Lezers geïnteresseerd in het meer leren over RAD kunnen een tekstboek raadplegen waarin systeemanalyse en ontwerp wordt behandeld of kijk op de Universiteit van Californië, Davis website over het onderwerp: [193]http://sysdev.ucdavis.edu/WEBADM/document/rad-stages.htm. _________________________________________________________________ Help & Support Lezers worden aangemoedigd een kijkje te nemen op de Pocket Linux Resource Site op [194]http://my.core.com/~dhorton/linux/pocket/. De bronsite is de plek voor: * informatie over de Pocket Linux discussielijst. * een verzameling diskette-images voor diverse hoofdstukken. * een lijst met aanvullingen en correcties voor komende versies. _________________________________________________________________ Feedback Ga voor vragen en opmerkingen alsjeblieft naar de [195]bronsite en schrijf je in op de discussielijst. _________________________________________________________________ Hoofdstuk 1. Begin van het project Een beknopte historie van GNU/Linux In de beginjaren '90 bestonden GNU/Linux systemen uit weinig meer dan een Linux kernel van beta kwaliteit en een kleine verzameling software geport van het GNU project. Het was een echt hacker's besturingssysteem. Er bestonden geen CD-ROM's of GUI installatietools; alles moest worden gecompileerd en geconfigureerd door de eindgebruiker. Een Linux Expert zijn betekende het systeem van binnen en buiten kennen. Zo ongeveer halverwege het decennium begonnen GNU/Linux distributies te verschijnen. Eén van de eerste was ([196]Slackware) in 1993 en sindsdien doken er vele anderen op. Zelfs al zijn er tegenwoordig veel Linux varianten, het hoofddoel van de distributie blijft hetzelfde. De distributie automatiseert veel van de taken die komen kijken bij een GNU/Linux installatie en configuratie die de last op de schouders van de systeembeheerder overnemen. Een Linux Expert zijn betekent nu op welke knop je moet klikken in een GUI beheertool. Recent bleek dat er werd gesmacht naar de terugkeer van die "goeie ouwe tijd " van Linux toen mannen nog mannen waren, systeembeheerders hardcore geeks en alles werd gecompileerd vanuit de broncode. Een opmerkelijke indicatie van deze beweging was de publicatie van de Linux From Scratch HOWTO versie 1.0 van Gerard Beekmans in 1999. Een Linux Expert zijn betekent wederom weten hoe het zelf te doen. Zie voor meer historische informatie Ragib Hasan's "History of Linux" op [197]http://ragib.hypermart.net/linux/ _________________________________________________________________ Het doel van Pocket Linux Het doel van Pocket Linux is mensen te ondersteunen en aan te moedigen die zelf een GNU/Linux systeem op willen bouwen vanuit niets anders dan de broncode. Het is niet bedoeld als een systeem met alle features, maar in plaats daarvan de lezer de smaak te pakken te laten krijgen wat er komt kijken bij het bouwen van een besturingssysteem vanuit de broncode. Na voltooiing van het Pocket Linux systeem zou de lezer over voldoende kennis moeten beschikken om met zelfvertrouwen aan vrijwel elk project te bouwen waarin alleen gebruik wordt gemaakt van de broncode. Deze richting aangegeven kunnen we een paar beperkingen opleggen aan het project. * Het belangrijkste is ons te concentreren op het opdoen van kennis. Het project moet niet alleen beschrijven hoe iets te doen, maar het moet ook beschrijven waarom het moet worden gedaan. * De benodigde te besteden tijd moet minimaal en beheersbaar zijn. * Het project moet niet verlangen dat er in extra hardware wordt geïnvesteerd of bestaande hardware opnieuw moet worden geconfigureerd om een labomgeving op te zetten. * Lezers hoeven geen kennis te hebben van programmeertalen om het project te kunnen voltooien. * In de geest van GNU/Linux blijvend zou alle software die in het project wordt gebruikt, moeten vallen onder de GNU/GPL of een andere vergelijkbare liberale, open-source licentie. _________________________________________________________________ Werken binnen de beperkingen Het Pocket Linux project heeft zijn naam te danken aan het feit dat de bulk van het project op twee diskettes past, wat het mogelijk maakt het gehele werkende systeem mee te vervoeren in iemands broekzak. Dit heeft als voordeel dat er geen extra hardware nodig is, aangezien elke PC van de diskette kan worden geboot zonder enig OS te ontwrichten dat op de harddisk staat. Het gebruik van diskettes addresseert ook deels het aspect van de te besteden tijd, omdat de projectomvang en complexiteit noodzakelijkerwijs worden beperkt tot de 1.44 Megabyte omvang van de installatiemedia. Om de te besteden tijd verder terug te dringen, is het Pocket Linux project in verscheidene fasen onderverdeeld, elk in een enkel hoofdstuk. Elke fase bouwt slechts aan een klein deel van het totaalproject, maar tegelijkertijd resulteert de slotepisode van elk hoofdstuk in een zelfomvattend werkend systeem. Deze stap-voor-stap benadering zou lezers in staat moeten stellen zelf het tempo te bepalen en niet de behoefte te voelen zich te haasten door snel resultaten te willen zien. Hoofdstukken zijn verder onderverdeeld in vier secties. De eerste twee secties, Analyse en Ontwerp, richten zich op de theorie wat in elke fase wordt bewerkstelligd en waarom. De laatste twee secties, Constructie en Implementatie, geven details over de stappen die nodig zijn voor het feitelijke bouwen. Gevorderde lezers, die wellicht al bekend zijn met de theorieën die in een bepaald hoofdstuk worden uitgelegd, worden aangemoedigd de secties Analyse en Ontwerp in het belang van tijd over te slaan. De scheiding tussen theorie en praktijkoefeningen zouden het de lezers van alle vaardigheidsniveaus mogelijk moeten maken het project te voltooien zonder zich of volledig verloren te voelen of verveeld door teveel detail. Ten slotte zal er bij het Pocket Linux project naar worden gestreeft daar waar mogelijk GNU/GPL software te gebruiken en andere open-source gelicentieerde software wanneer er geen GNU/GPL alternatief is. Ook verlangt Pocket Linux geen complexere kennis van programmeertalen dan een BASH-shellscript. _________________________________________________________________ Hoofdstuk 2. Een simpel prototype Analyse Aangezien dit de eerste fase is van het project, zal het zeer simpel worden gebouden. Het doel is hier niet bij de eerste poging het definitieve GNU/Linux systeem aan te maken. In plaats daarvan zullen we een zeer klein, werkend systeem bouwen dat zal worden gebruikt als een bouwsteen in de opeenvolgende fasen van het project. Dit in gedachten houdend, kunnen we een paar doelen voor fase één benoemen. * Houd het simpel om te voorkomen dat de belasting te groot wordt. * Bouw iets dat werkt voor een ogenblikkelijke voldoening. * Maak iets dat bruikbaar is in de latere fasen van het project. _________________________________________________________________ Ontwerp Vereenvoudiging Neem een moment om de Bootdisk-HOWTO of de From-PowerUp-to-BASH-Prompt-HOWTO vluchtig door te nemen. Deze HOWTO-documenten zijn online te vinden op [198]http://www.tldp.org/docs.html#howto. Beide documenten bieden een uitstekend zicht op wat er nodig is om een GNU/Linux systeem beschikbaar en werkend te krijgen. Er is ook veel op te nemen informatie. Denk eraan dat één van onze doelen is, "houd het simpel om te voorkomen dat de belasting te groot wordt," dus we willen alles negeren, behalve de absolute kritieke delen van een boot/root disketteset. In feite komt het neer op de volgende vereiste items: * Een bootloader * De Linux kernel * Een shell * Een aantal /dev bestanden We hebben zelfs geen init daemon nodig. Aan de kernel kan worden verteld dat het de shell direct uitvoert door het een optie door te geven via de bootloader. Voor een makkelijke constructie zullen we een boot/root set bestaande uit twee disks bouwen, in plaats van alles op een enkele diskette proberen te krijgen. De bootloader en kernel zullen we op de bootdisk plaatsen en de shell komt terecht op de rootdisk. Voor een juiste werking zullen op beide disks device bestanden nodig zijn. _________________________________________________________________ Bootdisk Voor de bootdisk willen we een kernel gebruiken waarbij geen modules voor de hardware die we moeten kunnen benaderen nodig zijn. Hoofdzakelijk zou het meegecompileerde ondersteuning voor het diskettestation, een ramdisk en een tekstgeörienteerde console moeten bevatten. Als een dergelijke kernel niet beschikbaar is, dan moet het vanuit de broncode worden opgebouwd met als leidraad de Kernel-HOWTO. Zodra een kernel klaar is, kunnen we het naar een diskette kopiëren die is voorbereid met een bestandssysteem (ala geformatteerd). Op de diskette zullen we een paar /dev bestanden nodig hebben en een lilo.conf bestand om LILO geïnstalleerd te krijgen. De Bootdisk-HOWTO en de lilo.conf(5) manpage zullen behulpzaam zijn bij het ontwerpen van het lilo.conf bestand. _________________________________________________________________ Rootdisk Voor de bootdisk zullen we een diskette nodig hebben welke is voorbereid met een bestandssysteem. We zullen ook een BASH-shell nodig hebben welke statisch is gelinkt zodat we de extra complexiteit van gedeelde library's kunnen voorkomen. Het configure programma in de broncode van BASH herkent voor deze feature de optie --enable-static-link. We zullen ook gebruik maken van de optie --enable-minimal-config om de BASH binary tot een beheerbare omvang te houden. Aanvullende vereisten voor de rootdisk zijn een /dev directory en een devicebestand voor de console. BASH heeft het device console nodig om met het toetsenbord en het videoscherm te kunnen communiceren. _________________________________________________________________ CPU compatibiliteit Er is een ander, minder vanzelfsprekende vereiste die we in gedachten moeten houden en dat is CPU compatibiliteit. Elke generatie CPU's kenmerkt een complexere architectuur dan zijn voorganger. Chips van latere generaties vergeleken met een oudere 486 of 386 hebben extra registers en instructies. Dus een kernel geoptimaliseerd voor een nieuwe, snelle 6x86 machine zal niet draaien op oudere boxen. (Zie het bestand README in de Linux kernel source code voor details.) Ook een BASH shell gebouwd voor een 6x86 zal waarschijnlijk niet draaien op een oudere processor. Ter voorkoming van dit probleem, kunnen we de 386 als een kleinste gemene veelvoud CPU kiezen en alle code voor die architectuur bouwen. _________________________________________________________________ Constructie In deze sectie zullen we de feitelijke bootdisk en rootdisk diskettes bouwen. Regels beginnend met bash# geven een shellopdracht aan. _________________________________________________________________ Prepareer de bootdisk diskette Doe een lege diskette met als label "bootdisk" in het diskettestation. bash# mke2fs -m0 /dev/fd0 bash# mount /dev/fd0 /mnt _________________________________________________________________ Bouw de kernel bash# cd /usr/src/linux bash# make menuconfig Zorg dat je de volgende ondersteuning configureert: * 386 processor * Floppy disk * RAM disk * Console op virtuele terminal bash# make dep bash# make clean bash# make bzImage _________________________________________________________________ Kopieer de kernel naar diskette bash# mkdir /mnt/boot bash# cp /usr/src/linux/arch/i386/boot/bzImage /mnt/boot/vmlinuz _________________________________________________________________ Kopieer de LILO bootloader bash# cp /boot/boot.b /mnt/boot/boot.b _________________________________________________________________ Maak de devicebestanden aan die LILO nodig heeft bash# mkdir /mnt/dev bash# cd /mnt/dev bash# mknod fd0 b 2 0 bash# mknod console c 5 1 _________________________________________________________________ Schrijf een simpel lilo.conf bash# mkdir /mnt/etc bash# cd /mnt/etc Gebruik een editor als vi, emacs of pico om het volgende lilo.conf bestand aan te maken: # /etc/lilo.conf - bootloader configuratiebestand # boot=/dev/fd0 compact prompt read-only vga=normal image=/boot/vmlinuz label=bootdisk append="load_ramdisk=1 prompt_ramdisk=1" root=/dev/fd0 # # einde van /etc/lilo.conf _________________________________________________________________ Installeer de LILO bootloader bash# lilo -r /mnt _________________________________________________________________ Unmount de bootdisk bash# cd / bash# umount /mnt bash# sync _________________________________________________________________ Prepareer de rootdisk diskette Doe een lege diskette gelabeld "rootdisk" in het diskettestation. bash# mke2fs -m0 /dev/fd0 bash# mount /dev/fd0 /mnt _________________________________________________________________ Bouw BASH Haal vanaf [199]ftp://ftp.gnu.org/gnu/bash/ het package op met de broncode van bash-2.05 en pak het uit in de directory /usr/src. Opmerking BASH versie 2.05b, de laatste versie op moment van schrijven, zal bij gebruik van de de optie --enable-minimal-config niet met succes worden gecompileerd. Er zijn nu twee keuzes. Of we corrigeren 2.05b door de patch toe te passen die werd gepost op gnu.bash.bug onder het onderwerp "Compile error in execute_cmd.c with --enable-minimal-config" of we kunnen eenvoudigweg gebruik maken van versie 2.05a. bash# cd /usr/src/bash-2.05a bash# ./configure --enable-static-link \ --enable-minimal-config --host=i386-pc-linux-gnu bash# make bash# strip bash _________________________________________________________________ Kopieer BASH naar de rootdisk bash# mkdir /mnt/bin bash# cp bash /mnt/bin/bash bash# ln -s bash /mnt/bin/sh _________________________________________________________________ Maak de device bestanden aan die BASH nodig heeft bash# mkdir /mnt/dev bash# mknod /mnt/dev/console c 5 1 _________________________________________________________________ Unmount de rootdisk bash# cd / bash# umount /mnt bash# sync _________________________________________________________________ Implementatie Systeemstart Volg deze stappen voor het booten van het systeem: * Herstart de PC met de bootdisk in het diskettestation. * Typ bootdisk init=/bin/sh en druk op Enter zodra de LILO-prompt verschijnt. * Doe de rootdisk in het diskettestation wanneer dit wordt aangegeven. Als alles goet gaat, dan is op het scherm iets vergelijkbaars met het voorbeeld hieronder te zien: boot: bootdisk init=/bin/sh Loading bootdisk Uncompressing Linux... Ok, booting kernel. .. .. [diverse kernelmeldingen] .. VFS: Insert root floppy disk to be loaded into RAM disk and press ENTER RAMDISK: ext2 filesystem found at block 0 RAMDISK: Loading 1440 blocks [1 disk] into ram disk... done. VFS: Mounted root (ext2 filesystem) readonly. Freeing unused kernel memory: 178k freed # _ _________________________________________________________________ Test wat werkt Probeer een paar van de interne opdrachten van BASH's om te testen of het goed werkt. bash# echo "Hello World" bash# cd / bash# pwd bash# echo * _________________________________________________________________ Opmerken wat er niet werkt Probeer een paar andere bekende opdrachten. bash# ls /var bash# mkdir /var/tmp Merk op dat alleen de interne opdrachten van BASH werkelijk werken en dat externe opdrachten zoals ls en mkdir in het geheel niet functioneren. Deze tekortkoming is iets dat kan worden aangepast in een toekomstige fase van het project. Op het ogenblik zouden we ons gewoon kunnen amuseren met het feit dat ons prototype boot/root disketteset werkt en dat het niet eens zo moeilijk was om het te bouwen. _________________________________________________________________ Systeem afsluiten Verwijder de diskette uit fd0 en herstart het systeem met CTRL-ALT-DELETE. _________________________________________________________________ Hoofdstuk 3. Ruimte besparen Analyse Eén van de keerzijden in de prototype fase van het project was dat de disketteset niet zo heel erg bruikbaar was. De enige opdrachten die hier werkten waren de interne opdrachten van de BASH-shell. We zouden onze rootdisk kunnen verbeteren door opdrachten als cat, ls, mv, rm, enzovoort te installeren. Helaas hebben we maar weinig ruimte. Op de huidige rootdisk staan geen gedeelde library's, dus elk utility zou net als de BASH-shell statisch moeten worden gelinkt. Veel grote binary's in combinatie met een statische shell zouden al snel de weinige 1.44M beschikbare diskruimte overschrijden. Dus ons hoofddoel in deze fase is maximaal te besparen op de ruimte op de rootdisk en de weg te banen voor uitgebreidere functionaliteit in de volgende fase. _________________________________________________________________ Ontwerp Kijk nog eens in de Bootdisk-HOWTO en merk op hoeveel utility's op een 1.44M diskette kunnen worden geperst. Er zijn drie dingen die dit mogelijk maken. Eén is het gebruik van gedeelde library's. De tweede zijn de gestripte library's en de derde is het gebruik van een gecomprimeerd bestandssysteem. We kunnen deze technieken allemaal gebruiken om ruimte op onze rootdisk te besparen. _________________________________________________________________ Gedeelde library's Als eerste zullen we de BASH-shell opnieuw moeten bouwen om gebruik te kunnen maken van gedeelde library's. Dit keer zullen we het zonder de optie --enable-static-link configureren. Zodra BASH eenmaal opnieuw is gecompileerd, zullen we uit moeten zoeken met welke library's het is gelinkt en deze library's op moeten nemen op de rootdisk. De opdracht ldd maakt deze taak makkelijk. Door het op de opdrachtregel typen van ldd bash krijgen we een lijst te zien met alle gedeelde library's waar BASH gebruik van maakt. Zolang deze library's allen naar de rootdisk worden gekopieerd, zou de nieuw gecompileerde BASH prima moeten werken. _________________________________________________________________ Gestripte binary's Vervolgens zouden we binary's kunnen strippen die naar de rootdisk worden gekopieerd. De manpage van strip beschrijft niet veel meer over wat het doet dan het "strip verwerpt alle symbolen uit de objectbestanden." Het lijkt of het verwijderen van delen uit een binary het als onbruikbaar achterlaat, maar dit is niet het geval. De reden dat het werkt, komt doordat een groot aantal van deze verworpen symbolen wordt gebruikt voor het opsporen van programmeerfouten. Ondanks dat deze debugging symbolen zeer behulpzaam zijn voor programmeurs die er ter verbetering van de code mee werken, doen ze voor de gemiddelde gebruiker niet veel meer dan het innemen van meer diskruimte. En aangezien ruimte op een diskette een toegift is, kunnen we beslist maar beter zoveel mogelijk symbolen uit BASH en andere binaire bestanden verwijderen voordat we ze naar de ramdisk kopiëren. Het proces bestaande uit het strippen van bestanden om ruimte te besparen, werkt ok voor gedeelde library-bestanden. Maar bij het strippen van library's is het van belang gebruik te maken van de optie --strip-unneeded ter voorkoming dat ze beschadigd raken. Met --strip-unneeded neemt de bestandsomvang af, maar blijven de symbolen nodig voor het veranderen van het geheugenadres intact wat bij gedeelde library's voor de juiste werking nodig is. _________________________________________________________________ Gecomprimeerd bestandssysteem Als laatste kunnen we het probleem aanpakken hoe we een gecomprimeerd root bestandssysteem bouwen. In de Bootdisk-HOWTO worden drie manieren aanbevolen voor het construeren van een gecomprimeerd root bestandssysteem met behulp van een ramdisk, een vrije harddiskpartitie of een loopbackdevice. Bij dit project zullen we ons concentreren op het gebruik van de ramdisk benadering. Het lijkt logisch dat als het root bestandssysteem vanaf een ramdisk gaat worden uitgevoerd, het net zo goed ook op een ramdisk kan worden gebouwd. We hoeven slechts een second extended bestandssysteem op een ramdisk device aan te maken, het te mounten en er bestanden naar te kopiëren. Zodra het bestandssysteem is voorzien van alle bestanden die op de rootdisk nodig zijn, umounten we het eenvoudigweg, comprimeren het en schrijven het weg naar diskette. Opmerking Hiervoor moeten we zorgen dat de kernel is geconfigureerd met ondersteuning voor de ramdisk met een standaardomvang van 4.096K. Als de omvang van de ramdisk iets anders is dan 4.096K, dan kan dit worden gecorrigeerd door de regel "ramdisk=4096" toe te voegen aan het lilo.conf bestand van het ontwikkelsysteem. De manpage lilo.conf(5) geeft hierover meer informatie. _________________________________________________________________ Constructie In deze sectie wordt gebruik gemaakt van ramdisk zeven (/dev/ram7) om het rootimage te bouwen. Er is niets bijzonder speciaal aan ramdisk zeven en het is mogelijk een van de andere beschikbare ramdisks te gebruiken op voorwaarde dat ze niet reeds in gebruik zijn. _________________________________________________________________ Maak een ramdisk aan bash# dd if=/dev/zero of=/dev/ram7 bs=1k count=4096 bash# mke2fs -m0 /dev/ram7 bash# mount /dev/ram7 /mnt _________________________________________________________________ Compileer de BASH-shell opnieuw bash# cd /usr/src/bash-2.05a bash# make distclean bash# ./configure --enable-minimal-config --host=i386-pc-linux-gnu bash# make bash# strip bash _________________________________________________________________ Stel vast welke library's nodig zijn bash# ldd bash Let op de uitvoer van de opdracht ldd. Het zou er ongeveer uit moeten zien als in onderstaand voorbeeld. bash# ldd bash libdl.so.2=> /lib/libdl.so.2 (0x4001d000) libc.so.6=> /lib/libc.so.6 (0x40020000) /lib/ld-linux.so.2=> /lib/ld-linux.so.2 (0x40000000) _________________________________________________________________ Kopieer BASH en de library's naar de ramdisk bash# mkdir /mnt/bin bash# cp bash /mnt/bin bash# ln -s bash /mnt/bin/sh bash# mkdir /mnt/lib bash# strip -o /lib/libdl.so.2 /mnt/lib/libdl.so.2 bash# strip -o /lib/libc.so.6 /mnt/lib/libc.so.6 bash# strip -o /lib/ld-linux-so.2 /mnt/lib/ld-linux-so.2 bash# chmod +x /mnt/lib/* Opmerking strip -o lijkt misschien wel een vreemde manier om library bestanden vanaf het ontwikkelsysteem naar ramdisk te kopiëren. Tijdens het bestandstransport van de bronlokatie naar de doellokatie stript het de symbolen. Het effect hiervan is dat de symbolen uit de library op de ramdisk worden verwijderd, zonder dat de library's op het ontwikkelsysteem worden gewijzigd. Helaas gaan bij het op deze wijze kopiëren van de library's de bestandspermissies verloren, wat de reden is van de opdracht chmod +x om de uitvoerbare vlag op alle library's op de rootdisk in te stellen. _________________________________________________________________ Maak een consoledevice aan bash# mkdir /mnt/dev bash# mknod /mnt/dev/console c 5 1 _________________________________________________________________ Comprimeer het ramdiskimage bash# cd / bash# umount /dev/ram7 bash# sync bash# dd if=/dev/ram7 of=~/phase2-image bs=1k bash# gzip -9 ~/phase2-image _________________________________________________________________ Kopieer het gecomprimeerde image naar diskette Doe de diskette met het label "rootdisk" in het diskettestation fd0. bash# dd if=~/phase2-image.gz of=/dev/fd0 bs=1k _________________________________________________________________ Implementatie Systeemstart Volg voor het booten de volgende stappen: * Herstart de PC met behulp van de lilo bootdisk uit het vorige hoofdstuk. * Typ achter de LILO-prompt bootdisk init=/bin/sh en druk op Enter. * Doe de nieuwe gecomprimeerde rootdisk in het diskettestation wanneer dit wordt aangegeven. De schermuitvoer zou vergelijkbaar moeten zijn met onderstaand voorbeeld: boot: bootdisk init=/bin/sh Loading bootdisk Uncompressing Linux... Ok, booting kernel. .. .. [diverse kernelmeldingen] .. VFS: Insert root floppy to be loaded into RAM disk and press ENTER RAMDISK: Compressed image found at block 0 VFS: Mounted root (ext2 filesystem) read-write. Freeing unused kernel memory: 178k freed # _ _________________________________________________________________ Verifieer de resultaten Deze nieuwe rootdisk zou exact hetzelfde moeten functioneren als de rootdisk uit hetzelfde hoofdstuk als de implementatie succesvol was. Het belangrijkste verschil is dat deze gecomprimeerde rootdisk veel meer ruimte heeft om te groeien en we zullen deze extra ruimte nuttig gebruiken in de volgende fase van het project. _________________________________________________________________ Systeem afsluiten Verwijder de diskette uit fd0 en herstart het systeem met CTRL-ALT-DELETE. _________________________________________________________________ Hoofdstuk 4. Een aantal basisutility's Analyse In het vorige hoofdstuk leek het wellicht of we niet zo veel bewerkstelligden. Er werd veel energie gestoken in het opnieuw ontwerpen van de rootdisk, maar de functionaliteit bleef in feite hetzelfde als in de initiële prototypefase. De rootdisk doet nog steeds niet zo veel. Maar we brachten veelbetekenende verbeteringen aan wanneer het aankomt op ruimtebesparingen. In deze fase zullen we die extra ruimte nuttig gebruiken en beginnen de rootdisk met zoveel utility's vol te proppen als erop passen. De eerste twee rootdisks die we samenstelden hadden alleen interne shell-opdrachten zoals echo en pwd. Voor deze fase zou het prettig zijn om een aantal van de algemeen gebruikte externe opdrachten zoals cat, ls, mkdir, rm en dergelijke op de rootdisk te hebben. Dit in gedachten houdend kunnen we de doelen voor deze fase als volgt definiëren: * Behoud alle functionaliteit van de vorige rootdisk. * Voeg een aantal algemeen in gebruik zijnde externe opdrachten toe. _________________________________________________________________ Ontwerp Bepalen van de benodigde opdrachten De eerste vraag die wellicht opkomt is, "Hoe weten we welke opdrachten nodig zijn?" Het is mogelijk gewoon met cat en ls te beginnen en dan andere opdrachten te installeren wanneer we erachter komen dat we ze nodig hebben. Maar dit is verschrikkelijk inefficiënt. We hebben een plan of een blauwdruk nodig om vanuit te werken. Hiervoor kunnen we ons wenden tot de Filesystem Hierarchy Standard (FHS) beschikbaar vanaf [200]http://www.pathname.com/fhs/. De FHS dicteert welke opdrachten aanwezig zouden moeten zijn op een GNU/Linux systeem en waar ze in de directorystructuur zouden moeten worden geplaatst. _________________________________________________________________ Lokaliseren van broncode De volgende logische vraag is, "Nu we weten wat we nodig hebben, waar halen we de broncode vandaan?" Het antwoord op deze vraag kan worden gevonden door het Internet te doorzoeken. Er zijn verscheidene goede Internetbronnen in omloop die ons kunnen helpen in onze speurtocht naar broncode. Een goede plek om te beginnen te zoeken is de Linux Software Map (LSM) op Ibiblio. Ibiblio's LSM zoekpagina is te vinden door te navigeren naar [201]http://www.ibiblio.org/pub/linux. Door als trefwoorden de namen van opdrachten te gebruiken, zouden we in staat moeten zijn met de naam en lokatie van het corresponderende broncodepackage aan te komen. _________________________________________________________________ De invloed van de FHS Laten we eens kijken naar de vereisten van de FHS voor de /bin directory. De eerste paar opdrachten in de lijst zijn cat, chgrp, chmod & chown. Na deze trefwoorden te hebben gebruikt in een LSM zoekactie komen we tot de ontdekking dat we het GNU textutils package nodig hebben voor cat en het GNU fileutils package voor chmod, chrp & chown. In feite komen aardig wat opdrachten in /bin uit GNU fileutils. Dus een goede manier om het probleem aan te pakken betreffende het op zoek gaan naar de broncode zou kunnen zijn de opdrachten per package te groeperen, zoals hieronder wordt getoond. * De BASH shell -- echo, false, pwd, sh, true * GNU textutils -- cat * GNU fileutils -- chgrp, chmod, chown, cp, dd, df, ln, ls, mkdir, mknod, mv, rm, rmdir, sync * GNU sh-utils -- date, hostname, stty, su, uname Deze vier packages bevatten niet alle opdrachten in de /bin directory, maar ze vertegenwoordigen er meer dan 70% van. Dat zou voldoende moeten zijn voor het bewerkstelligen van ons doel in het toevoegen van een aantal van de algemeen in gebruik zijnde externe opdrachten. We kunnen ons in latere fasen van het project altijd nog bezig houden met de resterende opdrachten. _________________________________________________________________ Constructie In plaats van het direct kopiëren van de bestanden naar de ramdisk, kunnen we het makkelijker maken door een fasegebied op te zetten. Het fasegebied zal ons ruimte geven om te werken zonder ons druk te hoeven maken over de ruimtebeperkingen van de ramdisk. Het zal ook voorzien in een manier om ons werk op te slaan en het makkelijker maken om de rootdisk in latere fasen van het project uit te breiden. De faseprocedure werkt als volgt: 1. Maak een directorystructuur aan gedefinieerd in de FHS. 2. Kopieer de bestanden vanaf de rootdisk uit fase 2. 3. Bouw de vier nieuwe packages vanuit de broncode. 4. Installeer de bestanden naar de correcte FHS directory's. 5. Strip de binary's om ruimte te besparen. 6. Controleer op library afhankelijkheden. 7. Kopieer de gehele directorystructuur naar de ramdisk. 8. Comprimeer de ramdisk en schrijf het weg naar diskette. _________________________________________________________________ Maak een fasegebied aan bash# mkdir ~/fase bash# cd ~/fase bash# mkdir bin boot dev etc home lib mnt opt proc root sbin tmp usr var bash# mkdir var/log var/run _________________________________________________________________ Kopieer de inhoud van de rootdisk uit fase 2 bash# dd if=~/phase2-image.gz | gunzip -c > /dev/ram7 bash# mount /dev/ram7 /mnt bash# cp -dpR /mnt/* ~/fase bash# umount /dev/ram7 bash# rmdir ~/fase/lost+found _________________________________________________________________ Installeer "cat" uit GNU Textutils bash# cd /usr/src/textutils-2.1 bash# ./configure --host=i386-pc-linux-gnu bash# make bash# cd src bash# cp cat ~/fase/bin _________________________________________________________________ Installeer de binary's uit GNU fileutils bash# cd /usr/src/fileutils-4.1 bash# ./configure --host=i386-pc-linux-gnu bash# make bash# cd src bash# cp chgrp chmod chown cp dd df ln ls ~/fase/bin bash# cp mkdir mkfifo mknod mv rm rmdir sync ~/fase/bin _________________________________________________________________ Installeer binary's uit sh-utils bash# cd /usr/src/sh-utils-2.0 bash# ./configure --host=i386-pc-linux-gnu bash# make bash# cd src bash# cp date hostname stty su uname ~/fase/bin _________________________________________________________________ Kopieer aanvullende library's bash# ldd ~/fase/bin/cat bash# ldd ~/fase/bin/ls bash# ldd ~/fase/bin/su bash# ls ~/fase/lib bash# cp /lib/librt.so.1 ~/fase/lib bash# cp /lib/libpthread.so.0 ~/fase/lib bash# cp /lib/libcrypt.so.1 ~/fase/lib _________________________________________________________________ Strip binary's en libary's bash# strip ~/fase/bin/* bash# strip --strip-unneeded ~/fase/lib/* _________________________________________________________________ Maak een gecomprimeerd rootdiskimage aan bash# cd / bash# dd if=/dev/zero of=/dev/ram7 bs=1k count=4096 bash# mke2fs -m0 /dev/ram7 bash# mount /dev/ram7 /mnt bash# cp -dpR ~/fase/* /mnt bash# umount /dev/ram7 bash# dd if=/dev/ram7 of=~/phase3-image bs=1k bash# gzip -9 ~/phase3-image _________________________________________________________________ Schrijf het rootdiskimage naar diskette Doe de diskette met het label "root disk" in het station fd0. bash# dd if=~/phase3-image.gz of=/dev/fd0 bs=1k _________________________________________________________________ Implementatie We zullen voor de werking van een aantal opdrachten een read-write bestandssysteem nodig hebben. Het normale functioneren van de kernel is root read-only te mounten, maar we kunnen dit wijzigen met behulp van een kerneloptie. Door aan LILO rw door te geven voor init=/bin/sh zullen we een read-write root bestandssysteem krijgen. _________________________________________________________________ Systeemstart Volg de volgende stappen voor het activeren van het systeem. * Boot de PC met behulp van de LILO bootdisk. * Typ achter de LILO prompt bootdisk rw init=/bin/sh en druk op Enter. * Doe de recent aangemaakte rootdisk in het diskettestation wanneer dit wordt aangegeven. De terminalweergave zal er ongeveer uitzien zoals in het volgende voorbeeld. boot: bootdisk rw init=/bin/sh Loading bootdisk Uncompressing Linux... Ok, booting kernel. .. .. [diverse kernelmeldingen] .. VFS: Insert root floppy to be loaded into RAM disk and press ENTER RAMDISK: Compressed image found at block 0 VFS: Mounted root (ext2 filesystem). Freeing unused kernel memory: 178k freed # _ _________________________________________________________________ Nieuwe opdrachten testen Probeer een aantal nieuwe opdrachten te gebruiken nu het systeem beschikbaar en werkend is. bash# uname -a bash# ls /etc bash# echo "PocketLinux" > /etc/hostname bash# hostname $(cat /etc/hostname) bash# uname -n bash# mkdir /home/stuff bash# cd /home/stuff Als alles goed gaat dan zouden de opdrachten cat, ls en hostname nu moeten werken. Zelfs mkdir zou nu moeten werken aangezien het root bestandssysteem read-write is gemount. Aangezien we gebruik maken van een ramdisk zullen alle wijzigingen die we aanbrengen verloren gaan zodra de PC wordt gereset. _________________________________________________________________ Systeem afsluiten Verwijder de diskette uit fd0 en herstart het systeem met CTRL-ALT-DELETE. _________________________________________________________________ Hoofdstuk 5. Controleren en mounten van disks Analyse In de vorige fase van het project voegden we een boel nieuwe opdrachten toe en als resultaat biedt de rootdisk veel meer functionaliteit. Maar er ontbreekt nog steeds het een en ander. Wat er echt uitspringt is dat er geen manier is om disks te mounten. Om een read-write root bestandssysteem te krijgen, moesten we onze toevlucht nemen tot het via LILO doorgeven van de kernelparameter rw. Dit is prima voor een noodsituatie, maar in een normaal systeembootproces zou het anders gaan. De meeste GNU/Linux distributies nemen verscheidene stappen om bestandssystemen te mounten. Het bekijken van het bootproces of het spitten in de opstartscripts van één van de populaire Linux distributies onthult de volgende reeks gebeurtenissen: 1. De kernel mount het rootbestandssysteem automatisch read-only. 2. Alle lokale bestandssystemen worden gecontroleerd op fouten. 3. root wordt opnieuw gemount als read-write, als er geen fouten in de bestandssystemen worden gedetecteerd. 4. De rest van de lokale bestandssystemen wordt gemount. 5. Netwerkbestandssystemen worden gemount. Tot dusverre kan ons Pocket Linux systeem stap één en dat is het. Als we een professioneel uitziende boot/root disketteset willen, dan moeten we het beter doen dan één uit vijf. In deze fase van het project zullen we aan de stappen twee en drie gaan werken. De stappen vier en vijf kunnen wachten. Aangezien dit een systeem gebaseerd op diskettes is, zijn er naast root helemaal geen andere bestandssystemen te mounten. Rekening houdend met alle bovenstaande informatie, zijn de doelen voor deze fase als volgt gedefinieerd: * Een manier om de volledigheid van het bestandssysteem te controleren. * De mogelijkheid om bestandssystemen te mounten. * Een script om de controle en het mounten van lokale bestandssystemen te automatiseren. _________________________________________________________________ Ontwerp Vaststellen van de benodigde utility's. We kunnen het Filesystem Hierarchy Standard (FHS) document gebruiken als hulp in het vinden van de namen van utility's die we nodig hebben en waar ze in de directorystructuur thuishoren. De FHS /bin directory toont fsck en iets met de naam fsck.* voor het controleren van bestandssystemen. Aangezien we voor ons doel gebruik maken van een Second Extended (ext2) bestandssysteem wordt fsck.* fsck.ext2. Het mounten van bestandssystemen wordt bewerkstelligd met de opdrachten mount en umount in de /bin directory. Echter de naam van een script om automatisch lokale bestandssystemen te mounten is niet te vinden. Op de meeste systemen staat dit type script in de /etc directory, maar ondanks dat de FHS vereisten voor /etc opsomt, geeft het thans geen aanbevelingen voor opstartscripts. Verscheidene GNU/Linux distributies maken gebruik van /etc/init.d als lokatie van opstartscripts, dus we zullen ons script om bestandssystemen te mounten daar plaatsen. _________________________________________________________________ Opsporen van de broncode Als we Ibiblio's Linux Software Map (LSM) op [202]http://www.ibiblio.org/pub/Linux/ doorzoeken op het trefwoord "fsck" dan krijgen we een groot aantal overeenkomsten. Aangezien we gebruik maken van het Second Extended filesystem, afgekort tot ext2, kunnen we de zoekopdracht verfijnen met het trefwoord "ext2". Beide trefwoorden aanleveren bij de LSM zoekmachine levert een package op met de naam e2fsprogs. Het LSM record bekijkend van e2fsprogs komen we erachter dat dit package de utility's e2fsck, mke2fs, dumpe2fs, fsck en meer bevat. We komen er ook achter dat het LSM record van e2fsprogs sinds 1999 niet meer is bijgewerkt. Het is vrijwel zeker dat er ergens een nieuwere versie in omloop is. Een andere goede Internetbron voor broncode is SourceForge op [203]http://sourceforge.net. Het gebruik van het trefwoord "e2fsprogs" in de zoekmachine van SourceForge resulteert in een veel nieuwere versie van e2fsprogs. Het was een heel avontuur om fsck te vinden, maar we kunnen nu verdergaan met het zoeken naar mount en umount. Een zoekopdracht op LSM levert een aantal overeenkomsten op, maar de meeste daarvan verwijzen naar diverse versies van een package genaamd util-linux. We hoeven er alleen doorheen te scrollen en de meest recente release uit te kiezen. Afgezien van slechts mount en umount wordt in het LSM record een opsomming van nog heel veel andere utility's gegeven. We zouden beslist de lijst door moeten nemen om te zien of er nog een van de andere util-linux opdrachten tevoorschijn komen in de FHS vereisten voor /bin en /sbin. Hieronder staat een lijst met packages die we tot dusverre hebben verzameld en de utility's die overeenkomen met de FHS. * e2fsprogs -- fsck, fsck.ext2 (e2fsck), mkfs.ext2 (mke2fs) * util-linux -- dmesg, getty (agetty), kill, login, mount, swapon, umount _________________________________________________________________ Automatiseren van fsck en mount Nu we fsck en mount opdrachten hebben, moeten we met een shellscript komen voor het automatisch controleren en mounten van de lokale bestandssystemen. Een makkelijke manier om dit te doen zou zijn om een kort, tweeregelig script te schrijven dat fsck en dan mount aanroept. Maar wat als de bestandssystemen niet zuiver zijn? Het systeem zou beslist geen beschadigd bestandssysteem moeten proberen te mounten. Daarom moeten we een middel zien te verzinnen hoe de status van de bestandssystemen vast te stellen voordat ze worden gemount. De manpage van fsck geeft inzicht in hoe dit kan worden bewerkstelligd met behulp van returncodes. Een returncode van nul of één betekent dat het bestandssysteem in orde is en twee of groter betekent dat een of andere handmatige tussenkomst nodig is. Een simpel if-then statement zou de returncode van fsck kunnen evalueren om vast te stellen of het bestandssysteem wel of niet kan worden gemount. Voor hulp bij het schrijven van shellscripts kunnen we ons wenden tot de BASH(1) manpage en de Advanced BASH Scripting Guide ([204]http://www.tldp.org/guides.html). Beide referenties zijn vrij verkrijgbaar vanaf het Linux Documentatie Project. _________________________________________________________________ Bestandsafhankelijkheden Wat we als laatste nog moeten doen is uitzoeken of er afgezien van de binary's nog andere bestanden nodig zijn. We leerden het gebruik van ldd om te controleren op library afhankelijkheden in de laatste fase van het project en we zullen het ook gebruiken om in deze fase de utility's te controleren. Er zijn ook nog een aantal andere bestanden die fsck en mount nodig zullen hebben en de manpages fsck(8) en mount(8) geven wat inzicht in welke bestanden dit zijn. Het gaat om /etc/fstab waarin devices worden opgesomd met bijbehorende mountpoints, /etc/mtab waarin wordt bijgehouden wat is gemount en de devicebestanden die de diverse disks voorstellen. We zullen die voor de juiste werking op moeten nemen. Het /etc/fstab bestand is slechts een simpel tekstbestand dat met iedere willekeurige editor kan worden aangemaakt. We zullen een regel nodig hebben voor het root bestandssysteem en voor het proc bestandssysteem. De reden voor de regel met het proc bestandssysteem is dat we /etc/mtab als een symlink die verwijst naar /proc/mounts aan kunnen maken. Het bestand /proc/mounts bevat bijna exact dezelfde informatie als het traditionele /etc/mtab bestand. We moeten er gewoon voor zorgen dat het proc bestandssysteem voor ieder ander wordt gemount. Het enige dat er overblijft is de aanmaak van devicebestanden. We zullen /dev/ram0 nodig hebben, omdat daar het root bestandssysteem is te vinden. We hebben ook /dev/fd0 nodig om andere diskettes te mounten en /dev/null. _________________________________________________________________ Constructie Installeer utility's uit e2fsprogs bash# cd /usr/src/e2fsprogs-1.29 bash# ./configure --host=i386-pc-linux-gnu bash# make bash# cd e2fsck bash# cp e2fsck.shared ~/fase/sbin/e2fsck bash# ln -s e2fsck ~/fase/sbin/fsck.ext2 bash# cd ../misc bash# cp fsck mke2fs ~/fase/sbin bash# ln -s mke2fs ~/fase/sbin/mkfs.ext2 _________________________________________________________________ Installeer utility's uit util-linux bash# cd /usr/src/util-linux-2.11u Gebruik een teksteditor om de volgende wijzigingen aan te brengen in MCONFIG: * Wijzig "CPU=$(shell uname -m)" in "CPU=i386" * Wijzig "HAVE_SHADOW=yes" in "HAVE_SHADOW=no" bash# ./configure bash# make bash# cp disk-utils/mkfs ~/fase/sbin bash# cp fdisk/fdisk ~/fase/sbin bash# cp login-utils/agetty ~/fase/sbin bash# ln -s agetty ~/fase/sbin/getty bash# cp login-utils/login ~/fase/bin bash# cp misc-utils/kill ~/fase/bin bash# cp mount/mount ~/fase/bin bash# cp mount/umount ~/fase/bin bash# cp mount/swapon ~/fase/sbin bash# cp sys-utils/dmesg ~/fase/bin _________________________________________________________________ Controleer op library benodigdheden bash# ldd ~/fase/bin/* | more bash# ldd ~/fase/sbin/* | more bash# ls ~/fase/lib Alle afhankelijkheden onthuld door de opdracht ldd, zijn voor library's die reeds aanwezig zijn in het fasegebied, dus er hoeft niets nieuws te worden gekopieerd. _________________________________________________________________ Strip binary's om ruimte te besparen bash# strip ~/fase/bin/* bash# strip ~/fase/sbin/* _________________________________________________________________ Maak extra devicebestanden aan bash# mknod ~/fase/dev/ram0 b 1 0 bash# mknod ~/fase/dev/fd0 b 2 0 bash# mknod ~/fase/dev/null c 1 3 _________________________________________________________________ Maak de bestanden mtab en fstab aan bash# cd ~/fase/etc bash# ln -s /proc/mounts mtab Gebruik een editor als vi, emacs of pico om het volgende bestand aan te maken het sla het op als ~/fase/etc/fstab. proc /proc proc noauto 0 0 /dev/ram0 / ext2 defaults 1 1 _________________________________________________________________ Schrijf een script om het proc bestandssysteem te mounten bash# mkdir ~/fase/etc/init.d bash# cd ~/fase/etc/init.d Gebruik een editor om het volgende shellscript aan te maken en sla het op als ~/fase/etc/init.d/proc_fs: #!/bin/sh # # proc_fs - mount het proc bestandssysteem # PATH=/sbin:/bin ; export PATH mount -t proc proc /proc # # einde van proc_fs _________________________________________________________________ Schrijf een script dat lokale bestandssystemen controleert en mount Gebruik een editor om het volgende shellscript aan te maken en sla het op als ~/fase/etc/init.d/local_fs: #!/bin/sh # # local_fs - controleer en mount lokale bestandssystemen # PATH=/sbin:/bin ; export PATH fsck -ATCp if [ $(($?)) -gt $((1)) ]; then echo "Filesystem errors still exist! Manual intervention required." /bin/sh else echo "Remounting / as read-write." mount -o remount,rw / echo "Mounting local filesystems." mount -a fi # # einde van local_fs Stel uitvoerpermissies in op de scripts. bash# chmod +x proc_fs bash# chmod +x local_fs _________________________________________________________________ Maak een gecomprimeerd rootdiskimage aan bash# cd / bash# dd if=/dev/zero of=/dev/ram7 bs=1k count=4096 bash# mke2fs -m0 /dev/ram7 bash# mount /dev/ram7 /mnt bash# cp -dpR ~/fase/* /mnt bash# umount /dev/ram7 bash# dd if=/dev/ram7 of=~/phase4-image bs=1k bash# gzip -9 ~/phase4-image _________________________________________________________________ Schrijf het rootdiskimage naar diskette Doe de diskette met het label "rootdisk" in het diskettestation fd0. bash# dd if=~/phase4-image.gz of=/dev/fd0 bs=1k _________________________________________________________________ Implementatie Systeemstart Start het systeem volgens de volgende procedure: * Boot de PC met behulp van de diskette met het label "bootdisk". * Typ bootdisk init=/bin/sh achter de LILO-prompt. * Doe de recent aangemaakte rootdisk in het diskettestation wanneer dit wordt aangegeven. De uitvoer zou het onderstaand voorbeeld moeten weerspiegelen: boot: bootdisk init=/bin/sh Loading bootdisk Uncompressing Linux... Ok, booting kernel. .. .. [diverse kernelmeldingen] .. VFS: Insert root floppy to be loaded into RAM disk and press ENTER RAMDISK: Compressed image found at block 0 VFS: Mounted root (ext2 filesystem) readonly. Freeing unused kernel memory: 178k freed # _ _________________________________________________________________ Test proc_fs en local_fs scripts Voer de scripts uit door de volgende opdrachten achter de shellprompt in te tikken: bash# PATH=/sbin:/bin:/etc/init.d ; export PATH bash# proc_fs bash# cat /etc/mtab bash# local_fs Remounting / as read-write. Mounting local filesystems bash# df De schermuitvoer zou er ongeveer uit moeten zien als in onderstaand voorbeeld als alles naar behoren werkt. bash# PATH=/sbin:/bin:/etc/init.d ; export PATH bash# proc_fs bash# cat /etc/mtab /dev/root / ext2 ro 0 0 proc /proc proc rw 0 0 bash# local_fs /dev/ram0: clean 74/1024 files 3178/4096 blocks bash# df Filesystem 1k-blocks Used Available Use% Mounted on /dev/root 3963 3045 918 77% / _________________________________________________________________ Maak extra bestandssystemen aan en mount deze Verwijder de rootdisk diskette en doe een lege diskette met het label "home" in het diskettestation. Typ dan de volgende opdrachten: bash# mkfs /dev/fd0 bash# fsck /dev/fd0 bash# mount /dev/fd0 /home bash# mkdir /home/floyd bash# cd /home/floyd bash# echo "Goodbye cruel world." > goodbye.txt bash# cat goodbye.txt _________________________________________________________________ Systeem afsluiten bash# cd / bash# umount /dev/fd0 bash# sync Verwijder de diskette uit fd0 en herstart het systeem met CTRL-ALT-DELETE. _________________________________________________________________ Hoofdstuk 6. Automatiseren van de systeemstart & afsluiten van het systeem Analyse De rootdisk uit het laatste hoofdstuk ziet er tamelijk goed uit. Het heeft ongeveer zeventig procent van de opdrachten die het Filesystem Hierarchy Standard (FHS) document vereist voor het root bestandssysteem. Plus dat het opdrachten heeft voor het controleren en mounten van bestandssystemen. Maar zelfs met dit alles is de rootdisk verre van perfect. In de lijst hieronder worden drie dingen uiteengezet die wat verbeteringen kunnen gebruiken als het Pocket Linux systeem het hoofd moet bieden aan de professioneler uitziende distributies. 1. Het systeem vereist thans dat de kernelparameter init=/bin/sh na de LILO-prompt wordt getypt om juist te starten. Op elk ander GNU/Linux systeem wordt dit alleen in een noodsituatie gedaan wanneer het systeem is beschadigd. 2. Het controleren en mounten van het root bestandssysteem moet handmatig worden uitgevoerd door na de shellprompt een script uit te voeren. Onder de meeste moderne besturingssystemen wordt deze functie automatisch afgehandeld als onderdeel van het systeemopstartproces. 3. Het is niet erg elegant met CTRL-ALT-DELETE het systeem af te sluiten. Bestandssystemen zouden moeten worden afgekoppeld met umount en informatie in de cache zou voor het afsluiten naar disk moeten worden geschreven. Ook dit is iets dat de meeste besturingssystemen automatisch afhandelen. De bovenstaande lijst in aanmerking genomen, zijn de doelen voor deze fase als volgt gedefinieerd: * Geautomatiseerde opstartreeks. * Mogelijkheid tot het elegant afsluiten van het systeem. _________________________________________________________________ Ontwerp De nodige utility's vaststellen We hebben een init daemon nodig om de opstart te automatiseren. We weten dit doordat de Bootdisk-HOWTO en From-Powerup-To-BASH-Prompt HOWTO het beiden vermelden als het eerste te starten programma nadat de kernel is geladen. De laatste HOWTO gaat ook in detail in op het /etc/inittab bestand en de organisatie van de opstartscripts. Dit zou van hulp kunnen zijn, aangezien de FHS, de blauwdruk die we tot dusverre hebben gebruikt, geen aanbevelingen doet voor init-scripts. We zullen ook de opdracht shutdown moeten vinden om aan het tweede doel, het elegant afsluiten van het systeem, te voldoen. _________________________________________________________________ Verkrijgen van de broncode Het doorzoeken van de Linux Software Map op Ibiblio op het trefwoord "init" geeft een groot aantal resultaten te zien. Uit de From-Powerup-To-BASH-Prompt-HOWTO weten we echter dat de meeste systemen een initdaemon in de stijl van System V gebruiken. De zoekopdracht beperkend tot het aanvullende trefwoord "System V" geeft veel betere resultaten. Het sysvinit package bevat init, shutdown, halt en reboot wat alles is wat we nodig hebben. De versie in het LSM record ziet er tamelijk oud uit, maar er staat een URL in die verwijst naar de primaire site, die waarschijnlijk zal leiden naar de laatste versie. _________________________________________________________________ Afhankelijkheden controleren De manpage voor init vermeldt een FIFO genaamd /dev/initctl welke nodig is voor init om met andere programma's in het sysvinit package te communiceren. We zullen dit bestand voor de goede werking van init aan moeten maken. _________________________________________________________________ Uiteenzetting van opstartscripts Veel van de populaire GNU/Linux distributies maken gebruik van initscripts in de stijl van System V. Aangezien we gebruik maken van een "sysvinit" daemon, is het zinvol om ook gebruik te maken van scripts in de stijl van System V. De volgende documenten roeren het onderwerp betreffende initscripts in de stijl van System V op één of andere manier aan en ze zullen dienen als referenties bij het bouwen van de scripts voor dit project: * Het Debian Policy Manual -- online beschikbaar op [205]http://www.debian.org/doc/debian-policy. * De Linux Standard Base specificatie -- in veel formaten te downloaden vanaf [206]http://www.linuxbase.org/spec/index.shtml. * Essential System Administration, 3rd Edition door Aeleen Frisch -- beschikbaar bij boekwinkels of direct bij O'Reilly Publishing op [207]http://www.oreilly.com/. Na een blik te hebben geworpen op één of twee van de bovenstaande referenties zouden we een tamelijk goed beeld moeten hebben hoe het systeeminitialisatieproces in de stijl van System V werkt. We zouden ook kunnen weten wat er nodig is om initscripts in de stijl van System V voor het Pocket Linux project aan te maken. Hieronder staat een beknopte opsomming van wat er moet worden gedaan: * Maak een inittab bestand voor de aanroep van een rc met een numeriek argument dat het runlevel aanduidt. * Schrijf een rc script dat het runlevelargument gebruikt om de van toepassing zijnde "K" en "S" scripts uit te voeren. * Pas het eerder gebouwde local_fs script aan dat het start en stop argumenten accepteert. * Maak nieuwe scripts aan voor het afsluiten en opnieuw opstarten van het systeem. * Zet /etc/rcN.d directory's op en links naar scripts in /etc/init.d. Zoals altijd zijn de BASH(1) manpage en de Advanced BASH Scripting Guide erg behulpzaam bij het schrijven en begrijpen van shellscripts. _________________________________________________________________ Constructie Installeer sysvinit utility's bash# cd /usr/src/sysvinit-2.84/src bash# make clobber bash# make CC="gcc -mcpu=i386" bash# cp halt init shutdown ~/fase/sbin bash# ln -s halt ~/fase/sbin/reboot bash# ln -s init ~/fase/sbin/telinit bash# mknod ~/fase/dev/initctl p Opmerking Omwille van de snelheid slaan we de stappen voor het controleren van libaray's en strippen van binary's over. De library vereisten voor sysvinit zijn erg fundamenteel en de Makefile is geconfigureerd om de binary's automatisch te strippen. _________________________________________________________________ Maak een /etc/inittab bestand aan Gebruik een teksteditor om het volgende bestand aan te maken en sla het op als ~/fase/etc/inittab # /etc/inittab - init daemon configuratiebestand # # Standaardrunlevel id:1:initdefault: # # Systeeminitialisatie si:S:sysinit:/etc/init.d/rc S # # Runlevelscripts r0:0:wait:/etc/init.d/rc 0 r1:1:respawn:/bin/sh r2:2:wait:/etc/init.d/rc 2 r3:3:wait:/etc/init.d/rc 3 r4:4:wait:/etc/init.d/rc 4 r5:5:wait:/etc/init.d/rc 5 r6:6:wait:/etc/init.d/rc 6 # # einde van /etc/inittab _________________________________________________________________ Maak een /etc/init.d/rc script aan Gebruik een teksteditor om het volgende bestand aan te maken en sla het op als ~/fase/etc/init.d/rc #!/bin/sh # # /etc/init.d/rc - runlevel change script # PATH=/sbin:/bin SCRIPT_DIR="/etc/rc$1.d" # # Controleer dat de directory rcN.d echt bestaat if [ -d $SCRIPT_DIR ]; then # # Voer als eerste de kill scripts uit. for SCRIPT in $SCRIPT_DIR/K*; do if [ -x "$SCRIPT" ]; then $SCRIPT stop; fi; done; # # Doe als laatste de startscripts. for SCRIPT in $SCRIPT_DIR/S*; do if [ -x $SCRIPT ]; then $SCRIPT start; fi; done; fi Maak het bestand uitvoerbaar. bash# chmod +x ~/fase/etc/init.d/rc _________________________________________________________________ Pas het script /etc/init.d/local_fs aan Er wordt een case statement toegevoegd om het script afhankelijk van het opgegeven opdrachtregelargument de lokale bestandssystemen te mounten of unmounten. Het oorspronkelijke script staat in het "start" gedeelte van het case statement. Het "stop" gedeelte is nieuw. #!/bin/sh # # local_fs - controleer en mount lokale bestandssystemen # PATH=/sbin:/bin ; export PATH case $1 in start) echo "Checking local filesystem integrity." fsck -ATCp if [ $(($?)) -gt $((1)) ]; then echo "Filesystem errors still exist! Manual intervention required." /bin/sh else echo "Remounting / as read-write." mount -o remount,rw / echo "Mounting local filesystems." mount -a fi ;; stop) echo "Dismounting local filesystems." umount -a echo "Remounting / as read-only." mount -o remount,rw / echo "Flushing disk cache." sync ;; default) echo "usage: $0 start|stop"; ;; esac # # einde van local_fs _________________________________________________________________ Maak een hostname script aan Gebruik een teksteditor om het volgende script aan te maken en sla het op als ~/fase/etc/init.d/hostname #!/bin/sh # # hostname - stel de systeemnaam in op de naam die is # opgeslagen in /etc/hostname # PATH=/sbin:/bin ; export PATH echo "Setting hostname." if [ -f /etc/hostname ]; then hostname $(cat /etc/hostname) else hostname gnu-linux fi # # einde van hostname _________________________________________________________________ Maak halt & reboot scripts aan Gebruik een teksteditor om ~/fase/etc/init.d/halt zoals hieronder getoond aan te maken. #!/bin/sh # # halt - stop het systeem # PATH=/sbin:/bin ; export PATH echo "Initiating system halt." halt # # einde van /etc/init.d/halt Maak het volgende script aan het sla het op als ~/fase/etc/init.d/reboot #!/bin/sh # # reboot - reboot het systeem # PATH=/sbin:/bin ; export PATH echo "Initiating system reboot." reboot # # einde van /etc/init.d/reboot Maak scriptbestanden uitvoerbaar. bash# chmod +x ~/fase/etc/init.d/* _________________________________________________________________ Maak rcN.d directory's en links naar scripts in /etc/init.d bash# cd ~/fase/etc bash# mkdir rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rcS.d bash# cd ~/fase/etc/rcS.d bash# ln -s ../init.d/proc_fs S10proc_fs bash# ln -s ../init.d/local_fs S20local_fs bash# ln -s ../init.d/hostname S30hostname bash# cd ~/fase/etc/rc0.d bash# ln -s ../init.d/local_fs K10local_fs bash# ln -s ../init.d/halt K90halt bash# cd ~/fase/etc/rc6.d bash# ln -s ../init.d/local_fs K10local_fs bash# ln -s ../init.d/reboot K90reboot _________________________________________________________________ Maak het rootdiskimage aan bash# cd / bash# dd if=/dev/zero of=/dev/ram7 bs=1k count=4096 bash# mke2fs -m0 /dev/ram7 bash# mount /dev/ram7 /mnt bash# cp -dpR ~/fase/* /mnt bash# umount /dev/ram7 bash# dd if=/dev/ram7 of=~/phase5-image bs=1k bash# gzip -9 ~/phase5-image _________________________________________________________________ Kopieer de image naar diskette Doe de diskette met het label "rootdisk" in het diskettestation fd0. bash# dd if=~/phase5-image.gz of=/dev/fd0 bs=1k _________________________________________________________________ Implementatie Systeemstart Boot de PC met behulp van de diskette met het label "bootdisk" en druk na de LILO-prompt op Enter. Plaats de recent gemaakte rootdisk in fd0 wanneer dit wordt aangegeven. De uitvoer zou het voorbeeld hieronder moeten weerspiegelen: boot: bootdisk Loading bootdisk Uncompressing Linux... Ok, booting kernel. .. .. [diverse kernelmeldingen] .. VFS: Insert root floppy to be loaded into RAM disk and press ENTER RAMDISK: Compressed image found at block 0 VFS: Mounted root (ext2 filesystem) readonly. Freeing unused kernel memory: 178k freed Checking local filesystem integrity. /dev/ram0: clean 105/1024 files 2842/4096 blocks Remounting / as read-write. Mounting local filesystems. Setting the hostname. INIT: Entering runlevel: 1 # _ _________________________________________________________________ Verifieer het succes van de opstartscripts Gebruik de opdracht mount om te controleren of alle lokale bestandssystemen als read-write zijn gemount. De uitvoer zou er ongeveer uit moeten zien als in het voorbeeld hieronder. bash# mount /dev/root on / type ext2 (rw) proc on /proc type proc (rw) Controleer de hostnaam. bash# uname -n gnu-linux _________________________________________________________________ Systeem afsluiten Sluit het systeem elegant af met de opdracht shutdown. bash# shutdown -h now We zouden in de volgende uitvoer van init en de scripts te zien moeten krijgen waarmee het systeem wordt afgesloten: INIT: Switching to runlevel: 0 INIT: Sending processes the TERM signal Terminated INIT: Sending processes the KILL signal Dismounting local filesystems. Remounting / as read-only. Flushing disk cache. Initiating system halt. System halted. _________________________________________________________________ Hoofdstuk 7. Meerdere gebruikers activeren Analyse Tot nu toe functioneerde het besturingssysteem in single-user modus. Er is geen loginproces en iedereen die het systeem boot komt rechtsstreeks terecht in een shell met rootprivileges. Uiteraard is dit bij de GNU/Linux distributies niet de normale besturingsmodus. De meeste systemen hebben een multi-user mogelijkheid waarbij veel gebruikers het systeem tegelijkertijd met verschillende privilege niveaus kunnen benaderen. Deze multi-user systemen ondersteunen ook virtuele consoles zodat het toetsenbord en de videoweergave tussen verscheidene terminalsessies kunnen worden gedeeld. Dus in deze fase zouden we graag de volgende verbeteringen aan het systeem toe willen voegen: * Mogelijkheid van multi-user activeren. * Meerdere, virtuele consoles aanmaken. _________________________________________________________________ Ontwerp Het loginproces De From-Powerup-To-BASH-Prompt-HOWTO verricht een goede taak in het uiteenzetten van de stappen in het loginproces. Eigenlijk werkt het als volgt: 1. De init daemon start een getty proces op de terminal. 2. Het getty programma toont de inhoud van /etc/issue en toont een prompt voor de gebruikersnaam. 3. Wanneer de gebruikersnaam is ingevoerd, wordt de besturing overhandigd aan het programma login. 4. Het programma login vraagt om een wachtwoord en verifieert de geloofwaardigheid aan de hand van /etc/passwd, /etc/group en mogelijk /etc/shadow. 5. Als alles in orde is, dan wordt de shell gestart. _________________________________________________________________ Verkrijgen van de broncode De programma's getty en login werden reeds als onderdeel van util-linux geïnstalleerd. _________________________________________________________________ Aanmaken van ondersteuningsbestanden Device nodes Details over virtuele console devicebestanden zijn te vinden in een bestand genaamd devices.txt in de directory Documentation van de Linux kernelbroncode. We zullen tty1 tot en met tty6 voor de virtuele consoles aan moeten maken als ook tty0 en tty die de huidige virtuele console voorstellen. _________________________________________________________________ /etc/issue Het /etc/issue bestand is tamelijk eenvoudig te construeren. Iedere willekeurige tekst kan erin worden opgenomen waarvan we willen dat het op het scherm wordt weergegeven voor de verschijning van de loginprompt. Het kan iets vriendelijks zijn zoals "Welkom bij Pocket Linux", iets bedreigends zoals "Alleen geauthoriseerde gebruikers!" of iets informatiefs zoals "Verbonden met tty1 op 9600bps". In de agetty(8) manpage wordt uitgelegd hoe informatie zoals de ttylijn en baud rate met behulp van escape codes weer te geven. _________________________________________________________________ /etc/passwd Het formaat van /etc/passwd kan worden verkregen door het lezen van de passwd(5) manpage. We kunnen makkelijk een gebruikersaccount aanmaken door een regel als "root::0:0:superuser:/root:/bin/sh" aan het bestand toe te voegen. Het onderhouden van wachtwoorden is een uitdaging omdat het systeem in ramdisk wordt geladen. Alle wijzigingen aan /etc/passwd zullen verloren gaan wanneer het systeem wordt afgesloten. Dus om het makkelijk te maken, zullen we voor alle gebruikers nul wachtwoorden aanmaken. _________________________________________________________________ /etc/group De structuur van /etc/group is beschikbaar uit de group(5) manpage. Een regel als "root::0:root" definieert een groep genaamd "root" zonder wachtwoord, een groepsid nul en de gebruiker root als enige deelnemer eraan toegekend. _________________________________________________________________ Conventies Namen en id's van gebruikers en groepen worden gewoonlijk niet willekeurig gekozen. De meeste Linux systemen hebben zeer vergelijkbaar uitziende /etc/passwd en /etc/group bestanden. Definities die worden gebruikt voor het toekennen van gebruikers- en groepsid's zijn op één van de volgende lokaties te vinden: * De bestanden /etc/passwd en /etc/group in elke populaire GNU/Linux distributie. * De Debian Policy Manual -- online beschikbaar op [208]http://www.debian.org/doc/debian-policy. * De Linux Standard Base specificatie -- in meerdere formaten te downloaden vanaf [209]http://www.linuxbase.org/spec/index.shtml. * Essential System Administration, 3rd Edition door Aeleen Frisch -- beschikbaar bij boekwinkels of direct bij O'Reilly Publishing op [210]http://www.oreilly.com/. _________________________________________________________________ Afhankelijkheden De uitvoering van ldd op het login programma uit util-linux zal bekendmaken dat het is gelinkt met de library libcrypt.so.1. In aanvulling op libcrypt, is er nog een ander minder vanzelfsprekende library afhankelijkheid op libnss_files.so.2. De name service switch library libnss_files.so.2 is nodig voor het login programma om het /etc/passwd bestand te kunnen benaderen. Zonder libnss zullen alle logins, op mysterieuze wijze mislukken. _________________________________________________________________ Eigenaar en permissies toekennen Voorheen was het met het single user systeem niet nodig ons druk te maken om permissies bij de installatie van directory's, bestanden en devicenodes. De shell was effectief werkzaam als root, dus alles was toegankelijk. Het werd wat complexer na het toevoegen van de mogelijkheid voor meerdere gebruikers. Nu moeten we ervoor zorgen dat elke gebruiker toegang heeft tot wat hij/zij nodig heeft en tegelijkertijd worden geblokkeerd in wat hij/zij niet nodig heeft. Een goede richtlijn voor het toekennen van eigenaars en permissies is het minimaal vereiste toegangsniveau toe te kennen. Neem als voorbeeld de directory /bin. Het Filesystem Hierarchy (FHS) document zegt, "/bin bevat opdrachten die door zowel de systeembeheerder als de gebruikers kunnen worden gebruikt. Uit die bewering kunnen we concluderen dat /bin voor iedereen lees- en uitvoerpermissie zou moeten hebben. Aan de andere kant bevat de directory /boot bestanden voor de bootloader. De kans is groot dat reguliere gebruikers niets zullen benaderen in de directory /boot. Dus het minimale toegangsniveau zou leespermissies zijn voor de rootgebruiker en andere beheerders die deelnemer zijn van de groep root. Voor normale gebruikers zouden aan de directory /boot geen permissies worden toegekend. Meestal kunnen we vergelijkbare permissies aan alle opdrachten in een directory toekennen, maar er zijn een aantal programma's die bewijzen een uitzondering op de regel te zijn. De opdracht su is hiervan een goed voorbeeld. Andere opdrachten in de directory /bin hebben de minimumvereisten om te lezen en uit te voeren, maar de opdracht su moet voor de juiste werking worden ingesteld op setuid root. Aangezien het een setuid binary is, zou het een goed idee kunnen zijn niet iedereen toe te staan het uit te voeren. De eigenaar 0:0 (root gebruiker, groep root) en permissies rwsr-x--- (octaal 1750) zou goed passend zijn voor su. Dezelfde logica kan worden toegepast op andere directory's en bestanden in het root bestandssysteem door het doorlopen van de volgende stappen: 1. Ken als eigenaar de root gebruiker en de root groep toe. 2. Stel de meest beperkende permissies in die mogelijk zijn. 3. Pas de eigenaar en permissies aan "wanneer nodig". _________________________________________________________________ Constructie Verifieer de aanwezigheid van getty en login bash# ls ~/fase/sbin/getty bash# ls ~/fase/bin/login _________________________________________________________________ Pas inittab voor de multi-user modus aan Pas ~/fase/etc/inittab aan door het standaardrunlevel te wijzigen en getty regels zoals hieronder getoond toe te voegen. # /etc/inittab - init daemon configuratiebestand # # Standaardrunlevel id:2:initdefault: # # Systeeminitialisatie si:S:sysinit:/etc/init.d/rc S # # Runlevel scripts r0:0:wait:/etc/init.d/rc 0 r1:1:respawn:/bin/sh r2:2:wait:/etc/init.d/rc 2 r3:3:wait:/etc/init.d/rc 3 r4:4:wait:/etc/init.d/rc 4 r5:5:wait:/etc/init.d/rc 5 r6:6:wait:/etc/init.d/rc 6 # # Breng virtuele terminals voort 1:235:respawn:/sbin/getty 9600 tty1 linux 2:235:respawn:/sbin/getty 9600 tty2 linux 3:235:respawn:/sbin/getty 9600 tty3 linux 4:235:respawn:/sbin/getty 9600 tty4 linux 5:235:respawn:/sbin/getty 9600 tty5 linux 6:2345:respawn:/sbin/getty 9600 tty6 linux # # einde van /etc/inittab _________________________________________________________________ Maak tty devices aan bash# cd ~/fase/dev bash# mknod tty0 c 4 0 bash# mknod tty1 c 4 1 bash# mknod tty2 c 4 2 bash# mknod tty3 c 4 3 bash# mknod tty4 c 4 4 bash# mknod tty5 c 4 5 bash# mknod tty6 c 4 6 bash# mknod tty c 5 0 _________________________________________________________________ Maak ondersteuningsbestanden aan in /etc /etc/issue Maak het bestand ~/fase/etc/issue aan door gebruik te maken van onderstaand voorbeeld of ontwerp een aangepaste melding. Verbonden met \l op \b bps. Noot: "\l" is een kleine letter L, niet het getal één. _________________________________________________________________ /etc/passwd Gebruik een teksteditor om een minimaal passwd bestand conformerend aan het Linux Standards Base (LSB) document aan te maken. Sla het bestand op als ~/fase/etc/passwd root::0:0:Super User:/root:/bin/sh bin:x:1:1:Legacy UID:/bin:/bin/false daemon:x:2:2:Legacy UID:/sbin:/bin/false _________________________________________________________________ /etc/group Gebruik een teksteditor om een LSB conformerend group bestand aan te maken en sla het op als ~/fase/etc/group root::0:root bin:x:1:root,bin,daemon daemon:x:2:root,bin,daemon _________________________________________________________________ Kopieer de benodigde library's bash# cp /lib/libnss_files.so.2 ~/fase/lib _________________________________________________________________ Stel de directory- en bestandspermissies in Stel minimale privileges in op alle bestanden en directory's onder ~/fase. De root gebruiker en groep root zijn overal eigenaar van. Permissies zijn read-write voor de eigenaar en read-only voor de groep. Uitzonderingen op de allesomvattende permissies worden van geval tot geval afgehandeld. bash#cd ~/fase bash#chown -R 0:0 * bash#chmod -R 640 * Stel de uitvoerpermissie in op alle directory's. (Noot: hoofdletter "X") bash#chmod -R +X * Bestanden in /bin kunnen door iedereen worden gelezen en uitgevoerd, maar su is daarop een uitzondering. bash#chmod 755 bin/* bash#chmod 4750 bin/su Bestanden in /dev hebben diverse permissies. Diskdevices zouden alleen toegankelijk moeten zijn voor beheerders. Op andere bestanden zoals /dev/null zouden volledige privileges moeten worden toegestaan voor alle gebruikers. bash#chmod 660 /dev/fd0 /dev/ram0 bash#chmod 666 dev/null bash#chmod 622 dev/console bash#chmod 600 dev/initctl bash#chmod 622 dev/tty bash#chmod 622 dev/tty? De passwd en group bestanden moeten door iedereen kunnen worden gelezen. bash#chmod 644 etc/passwd bash#chmod 644 etc/group De scripts in /etc/init.d moeten worden ingesteld op lezen en uitvoeren voor beheerders. bash#chmod 750 etc/init.d/* Library's moeten door iedereen kunnen worden gelezen en uitgevoerd. bash#chmod 755 lib/* Alleen root mag toegang krijgen tot de directory /root. bash#chmod 700 root Zorg dat bestanden in /sbin door de beheerders kunnen worden gelezen en uitgevoerd. bash#chmod 750 sbin/* Temp moet door iedereen kunnen worden gelezen en beschreven met het sticky bit ingesteld. bash#chmod 1777 tmp _________________________________________________________________ Maak het rootdiskimage aan bash# cd / bash# dd if=/dev/zero of=/dev/ram7 bs=1k count=4096 bash# mke2fs -m0 /dev/ram7 bash# mount /dev/ram7 /mnt bash# cp -dpR ~/fase/* /mnt bash# umount /dev/ram7 bash# dd if=/dev/ram7 of=~/phase6-image bs=1k bash# gzip -9 ~/phase6-image _________________________________________________________________ Kopieer de image naar diskette Doe de diskette met het label "rootdisk" in diskettestation fd0. bash# dd if=~/phase6-image.gz of=/dev/fd0 bs=1k _________________________________________________________________ Implementatie Systeemstart Als alles goed gaat, dan zou de weergave van de virtuele console er uit moeten zien als in het volgende voorbeeld: Verbonden met tty1 op 9600 bps. gnu-linux login: _________________________________________________________________ Een nieuwe gebruiker aan het systeem toevoegen Log in als root. Maak een nieuwe niet bevoorrechte gebruiker en groep aan door een regel aan respectievelijk de bestanden /etc/passwd en /etc/group toe te voegen. Zorg dat je een dubbel groter-dan teken (>>) gebruikt om te voorkomen dat je de bestanden per ongeluk overschrijft. bash# echo "floyd::501:500:User:/home/floyd:/bin/sh" >> /etc/passwd bash# echo "users::500:" >> /etc/group bash# mkdir /home/floyd bash# chown floyd.users /home/floyd bash# chmod 700 /home/floyd _________________________________________________________________ Test de nieuwe gebruikersmogelijkheid om het systeem te gebruiken Schakel over naar de virtuele terminal tty2 door het indrukken van ALT+F2. Log in als floyd. Probeer de volgende opdrachten en verifieer dat ze werken. bash$ pwd bash$ ls -l / bash$ cat /etc/passwd Probeer de volgende opdrachten en verifieer dat ze niet werken. bash$ ls /root bash$ /sbin/shutdown -h now bash$ su - _________________________________________________________________ Systeem afsluiten Keer terug naar tty1 waar root is ingelogd. bash# shutdown -h now _________________________________________________________________ Hoofdstuk 8. Opvullen van de hiaten Analyse De rootdisk heeft een lange weg afgelegd vanaf het nederige begin als een statisch gelinkte shell. Het deelt nu veel features met de populaire klaar-voor-gebruik zijnde distributies. Het heeft bijvoorbeeld: * Verscheidene algemene utility's, zoals cat, ls, enzovoort. * Opstartscripts die automatisch bestandssystemen controleren en mounten. * Een elegante manier om het systeem af te sluiten. * Ondersteuning voor meerdere gebruikers en virtuele terminals. Als laatste test kunnen we de rootdisk vergelijken met de vereisten van de Filesystem Hierarchy Standard (FHS) voor het root bestandssysteem. (We zullen alles in de /usr hiërarchie negeren vanwege de ruimtebeperkingen.) Vergeleken met de FHS vereisten, ontbreken er slechts een paar bestanden in de /bin directory. In het bijzonder ontbreken op de rootdisk de volgende opdrachten: * more * ps * sed In aanvulling op de vereiste opdrachten, zou het fraai zijn om de editor "ed" op te nemen die als een optie door de FHS wordt opgesomd. Het is niet zo robuust als vi of emacs, maar het werkt en het zou nog passen op het kleine root bestandssysteem. Dus om deze fase van het project te voltooien, moeten we de volgende doelen bewerkstelligen: * De opdrachten more, ps en sed toevoegen. * De optionele editor ed installeren. _________________________________________________________________ Ontwerp more Er bestaat een more opdracht die met util-linux wordt geleverd, maar het zal voor dit project niet werken. De reden hiervan zijn de library afhankelijkheden en ruimtebeperkingen. De util-linux dat more meelevert heeft of de libncursus of libtermcap nodig om te kunnen werken en er is gewoon niet voldoende ruimte op de rootdisk om alles erop te krijgen. Dus voor een opdracht more zullen we creatief moeten zijn. De opdracht more wordt gebruikt om een bestand pagina-voor-pagina weer te geven. Het lijkt wat op een cat opdracht die elke vijfentwintig regels pauzeert. De basislogica wordt hieronder uiteengezet. * Lees een regel van het bestand. * Toon de regel op het scherm. * Pauzeer zodra 25 regels zijn getoond. * Loop en doe het nogmaals. Natuurlijk zijn er een aantal details achterwege gelaten zoals wat te doen als de schermdimensies niet zijn waarop we anticipeerde, maar in z'n totaal is het een duidelijke representatie van wat more doet. Gegeven de logica van dit voorbeeldprogramma, zou het niet al te moeilijk moeten zijn om een beknopt shellscript samen te stellen dat de basisfunctionaliteit van more emuleert. De BASH(1) manpage en Adv-BASH-Scripting-Guide zullen als referenties dienen. _________________________________________________________________ Meer device bestanden Het more script zal toegang tot devicebestanden nodig hebben die nog niet op de rootdisk aanwezig zijn. In het bijzonder heeft more stdin,stdout en stderr nodig, maar nu we er toch mee bezig zijn, kunnen we net zo goed op andere ontbrekende /dev bestanden controleren. De Linux Standard Base vereist dat null, zero en tty aanwezig zijn in de /dev directory. Bestanden voor null en tty bestaan reeds vanuit eerdere fasen in het project, maar we hebben nog wel /dev/zero nodig. We kunnen refereren naar devices.txt in de Documentation directory van de Linux broncode voor major en minor nummers. _________________________________________________________________ ps, sed & ed Deze drie packages kunnen worden gevonden door gebruik te maken van dezelfde Internetbronnen als we eerder deden. Het procps package komt tevoorschijn in een Ibiblio LSM zoekactie ([211]http://www.ibiblio.org/pub/linux/) op het trefwoord "ps". De "sed" en "ed" packages zijn te vinden op de GNU ftp server op [212]ftp://ftp.gnu.org. Zowel "sed" als "ed" packages kenmerken GNU's bekende configure script en zijn daarom makkelijk te bouwen. Er is geen configure script voor "procps" maar dit maakt het niet al te moeilijk. We kunnen gewoon het bestand INSTALL lezen om erachter te komen hoe de diverse configuratie-opties in te stellen. We kunnen één van deze opties gebruiken om de complexiteit in het gebruik en het installeren van libproc te voorkomen. De instelling SHARED=0 maakt libproc een geïntegreerd deel van ps in plaats van een aparte, gedeelde library. _________________________________________________________________ Constructie Schrijf een "more" script Maak het volgende script aan met een teksteditor en sla het op als ~/fase/bin/more.sh #!/bin/sh # # more.sh - emuleert de basisfuncties van de "more" binary zonder # dat hier ncurses of termcap library's voor nodig zijn. # # Veronderstel dat invoer van STDIN komt, tenzij als opdrachtregelargument # een geldig bestand is opgegeven. if [ -f "$1" ]; then INPUT="$1" else INPUT="/dev/stdin" fi # # Stel IFS in op een newline. Zie BASH(1) manpage voor details over IFS. IFS=$'\n' # # Als de terminaldimensies niet reeds zijn ingesteld als shellvariabelen, # gok dan op 80 x 25. if [ "$COLS" = "" ]; then COLS=80; fi if [ "$ROWS" = "" ]; then ROWS=25; fi # # Initialiseer de row counter variabele ROW_COUNTER=$ROWS # # Lees één regel tegelijkertijd in van het invoerbestand # en toon het op STDOUT totdat het scherm is gevuld. # Toon een "Press " melding op STDERR en wacht op een # toetsaanslag van STDERR. Ga verder tot aan het einde van het invoerbestand. # Van elke invoerregel groter dan $COLS tekens in lengte wordt de tekst # naar de volgende regel geplaatst en deze tellen als meerdere regels. # while read -n $COLS LINE_BUFFER; do echo "$LINE_BUFFER" ROW_COUNTER=$(($ROW_COUNTER - 1)) if [ $ROW_COUNTER -le 1 ]; then echo "Press for next page or +C to quit.">/dev/stderr read /dev/ram1. Nu gaat de gecomprimeerde diskette rechtstreeks naar de ramdisk, het onderwijl decomprimerend. _________________________________________________________________ Rootdisk-ondersteuning voor extra ramdisks We hebben reeds ondersteuning voor ramdisks in de kernel, omdat we gebruik maken van een gecomprimeerde rootdisk, maar we zullen meer ramdisks in /dev nodig hebben. De kernel ondersteunt acht ramdisks van /dev/ram0 tot en met /dev/ram7 waarbij ram0 wordt gebruikt voor de rootdisk. Het bestand devices.txt opgenomen in de documentatie van de Linux broncode zal behulpzaam zijn voor het evenaren van devices met hun major en minor nummers. _________________________________________________________________ Benaderen van audio-bestanden Het voorbeeld mp3 bestand dat we in ons voorbeeld zullen gebruiken is klein genoeg dat het op een ongecomprimeerde diskette past zodat het niet nodig is een CD te branden. Serieuze muziekliefhebbers willen echter wellicht de mogelijkheid hebben om een aangepaste CD-ROM vol met melodieën te mounten en die optie vereist ondersteuning voor extra hardware. _________________________________________________________________ CD-ROM hardware-ondersteuning De meeste moderne CD-ROM stations zullen gebruik maken van IDE-devices, zoals /dev/hdc of /dev/hdd. Ter ondersteuning van deze CD-ROM stations zullen we ondersteuning voor IDE in de kernel moeten configureren en de van toepassing zijnde devicebestanden op de rootdisk aanmaken. _________________________________________________________________ Ondersteuning voor het CD-ROM bestandssysteem Op CD-ROM's worden andere bestandssystemen geplaatst dan op harddisks en diskettes. De meeste CD brandertoepassingen gebruiken een bestandssysteem met de naam ISO-9660 en hebben de mogelijkheid tot ondersteuning van joliet en rockridge extensies. We zullen ondersteuning voor deze bestandssystemen in de kernel op moeten nemen om CD-ROM's te kunnen mounten. _________________________________________________________________ Andere benodigde bestanden We zullen alle benodigde library's en andere ondersteunende bestanden beschikbaar hebben als onderdeel van het gecomprimeerde /usr image zodat mp3blaster correct kan worden uitgevoerd. De bekende ldd opdracht kan worden gebruikt om vast te stellen welke library's mp3blaster nodig heeft. Extra library's kunnen worden geplaatst in /usr/lib. Ook al verschijnen op het ontwikkelaarssysteem een aantal library's in /lib, dan nog kunnen ze op het Pocket Linux systeem in /usr/lib worden geplaatst. De linker is slim genoeg dat het bij het laden van library's op beide plaatsen kijkt. Omdat mp3blaster de curses (of ncurses) schermbesturingslibrary gebruikt, hebben we nog één extra bestand nodig. De curses library moet weten wat de karakteristieken van de terminal zijn die het bestuurt en het haalt die informatie uit de terminfo database. De terminfo database bestaat uit alle bestanden onder de directory /usr/share/terminfo en is nogal groot in vergelijking met onze beschikbare diskruimte. Maar gezien Pocket Linux alleen de PC console ondersteunt, hoeven we ons alleen bezig te houden met één type terminal en hebben daarom slechts één bestand nodig. Het stukje van de terminfo database dat we nodig hebben is het bestand /usr/share/terminfo/l/linux, omdat we gebruik maken van een "Linux" terminal. Zie voor meer informatie over curses, John Strang's boek getiteld "Programming with Curses" beschikbaar bij O'Reilly publishing op [214]http://www.oreilly.com. _________________________________________________________________ Samenvatting van taken Tussen geluidskaarten, ramdisks, CD-ROM's en terminfo is aardig wat bij te houden. Dus laten we een moment nemen om de taken die nodig zijn te organiseren en samenvatten om de pocket jukebox te realiseren. * Maak een nieuwe kerneldisk aan waarin ondersteuning is opgenomen voor audio-hardware, IDE-devices en CD-ROM bestandssystemen. * Maak de van toepassing zijnde /dev bestanden aan op de rootdisk voor de ondersteuning van audio-hardware, extra ramdisks en IDE CD-ROM's. * Maak een opstartscript om een gecomprimeerd image van diskette in ramdisk te laden en mount de ramdisk op /usr. * Maak een gecomprimeerde diskette waarop het mp3blaster programma wordt geplaatst met de bijbehorende library's en terminfo bestanden. _________________________________________________________________ Constructie Maak een bootdisk aan Compileer een nieuwe kernel bash# cd /usr/src/linux bash# make menuconfig Configureer ondersteuning voor het volgende: * 386 processor * Floppy disk * RAM disk * Virtual console * Audio hardware * CD-ROM hardware * ISO-9660 en Joliet bestandssystemen bash# make dep bash# make clean bash# make bzImage _________________________________________________________________ Kopieer de kernel naar diskette Plaats de bootdisk in station fd0 bash# cp /usr/src/linux/arch/i386/boot/bzImage /mnt/boot/vmlinuz bash# mount /dev/fd0 /mnt _________________________________________________________________ Installeer de LILO bootloader bash# lilo -r /mnt _________________________________________________________________ Ontkoppel de bootdisk bash# cd / bash# umount /mnt bash# sync _________________________________________________________________ Maak een rootdisk aan Maak extra devicebestanden aan IDE CD-ROM bash# mknod -m640 ~/fase/dev/hdc b 22 0 bash# mknod -m640 ~/fase/dev/hdd b 22 64 Maak optioneel IDE-devices aan. _________________________________________________________________ Ramdisk bash# mknod -m 640 ~/fase/dev/ram1 b 1 1 bash# mknod -m 640 ~/fase/dev/ram2 b 1 2 bash# mknod -m 640 ~/fase/dev/ram3 b 1 3 bash# mknod -m 640 ~/fase/dev/ram4 b 1 4 bash# mknod -m 640 ~/fase/dev/ram5 b 1 5 bash# mknod -m 640 ~/fase/dev/ram6 b 1 6 bash# mknod -m 640 ~/fase/dev/ram7 b 1 7 _________________________________________________________________ Audio bash# mknod -m664 ~/fase/dev/dsp c 14 3 bash# mknod -m664 ~/fase/dev/mixer c 14 0 _________________________________________________________________ Schrijf een opstartscript om een gecomprimeerde diskette te mounten Gebruik een teksteditor voor het aanmaken van het volgende script en sla het op als ~/fase/etc/init.d/usr_image #!/bin/sh # # usr_image - laad gecomprimeerde images van diskette in ramdisk en # mount op /usr. # echo -n "Is there a compressed diskette to load for /usr [y/N]? " read REPLY if [ "$REPLY" = "y" ] || [ "$REPLY" = "Y" ]; then echo -n "Please insert the /usr floppy into fd0 and press ." read REPLY echo "Clearing /dev/ram1." dd if=/dev/zero of=/dev/ram1 bs=1k count=4096 echo "Loading compressed image from /dev/fd0 into /dev/ram1..." (dd if=/dev/fd0 bs=1k | gunzip -cq) >/dev/ram1 2>/dev/null fsck -fp /dev/ram1 if [ $(($?)) -gt $((1)) ]; then echo "Filesystem errors on /dev/ram1! Manual intervention required." else echo "Mounting /usr." mount /dev/ram1 /usr fi fi # # end of usr_image Configureer het script zo dat het direct nadat root is gemount wordt uitgevoerd. bash# ln -s ../init.d/usr_image ~/fase/etc/rcS.d/S21usr_image _________________________________________________________________ Maak een gecomprimeerde rootdisk aan bash# cd / bash# dd if=/dev/zero of=/dev/ram7 bs=1k count=4096 bash# mke2fs -m0 /dev/ram7 bash# mount /dev/ram7 /mnt bash# cp -dpR ~/fase/* /mnt bash# umount /dev/ram7 bash# dd if=/dev/ram7 of=~/phase8-image bs=1k bash# gzip -9 ~/phase8-image Doe de diskette met het label "rootdisk" in station fd0. bash# dd if=~/phase8-image.gz of=/dev/fd0 bs=1k _________________________________________________________________ Ontkoppel de rootdisk bash# cd / bash# umount /mnt bash# sync _________________________________________________________________ Maak voor mp3blaster een gecomprimeerde /usr disk De gecomprimeerde /usr diskette zal worden aangemaakt aan de hand van hetzelfde proces dat werd gebruikt om de gecomprimeerde rootdisk aan te maken. We zullen bestanden naar een fasegebied kopiëren, het fasegebied naar ramdisk kopiëren, de ramdisk comprimeren en het naar diskette wegschrijven. _________________________________________________________________ Aanmaken van het fasegebied bash# mkdir ~/usr-fase bash# cd ~/usr-fase bash# mkdir bin lib bash# mkdir -p share/termcap/l _________________________________________________________________ Installeer het mp3blaster programma Download de laatste versie van de broncode van mp3blaster vanaf de homepage op [215]http://www.stack.nl/~brama/mp3blaster. bash# cd ~/usr/src/mp3blaster-3.13 bash# ./configure bash# make bash# cp src/mp3blaster ~/usr-fase/bin _________________________________________________________________ Kopieer aanvullende library's en terminfo Noot: Dit is een voorbeeld van het ontwikkelsysteem van de auteur. Andere systemen kunnen iets andere resultaten laten zien. bash# cd ~/usr-fase/lib bash# ldd ~/usr-fase/bin/mp3blaster bash# cp /usr/lib/ncurses.so.5.0 . bash# cp /usr/lib/stdc++.so.3 . bash# cp /lib/libm.so.6 . bash# cp /usr/lib/libgcc_s.so.1 . bash# cd ~/usr/fase/share/terminfo/l bash# cp /usr/share/terminfo/l/linux . _________________________________________________________________ Maak een gecomprimeerd image aan en kopieer het naar diskette bash# cd / bash# dd if=/dev/zero of=/dev/ram7 bs=1k count=4096 bash# mke2fs -m0 /dev/ram7 bash# mount /dev/ram7 /mnt bash# cp -dpR ~/usr-fase/* /mnt bash# umount /dev/ram7 bash# dd if=/dev/ram7 of=~/mp3blaster-image bs=1k bash# gzip -9 ~/mp3blaster-image Doe de diskette met het label "mp3blaster" in station fd0. bash# dd if=~/mp3blaster-image.gz of=/dev/fd0 bs=1k _________________________________________________________________ Maak voor het testen een gegevensdiskette aan Ga naar de internetsite [216]http://www.paul.sladen.org en download het mp3-bestand waarin Linux Torvalds "Linux." uitspreekt. De directe link is: [217]http://www.paul.sladen.org/pronunciation/torvalds-says-linux.mp3. Maak een Second Extended (ext2) filesystem aan op een diskette en kopieer het mp3-bestand naar de diskette. _________________________________________________________________ Implementatie Systeemstart 1. Boot van de kernel-diskette. 2. Doe de root-diskette in het diskettestation wanneer dit wordt aangegeven. 3. Antwoord 'Y', wanneer wordt gevraagd om een /usr diskette. 4. Doe de mp3blaster diskette in het diskettestation en druk op Enter. _________________________________________________________________ Verifieer of de /usr diskette juist werd geladen bash# mount bash# ls -lR /usr _________________________________________________________________ Controleer de initialisatie van het audio-device bash# dmesg | more Als alles werkte dan zou er een regel of twee zijn waarin zou worden aangegeven dat de kernel de audio-hardware vond. In het voorbeeld hieronder wordt getoond hoe de kernel een geïntegreerd Yamaha geluidssysteem zou kunnen rapporteren. ymfpci: YMF740C at 0xf4000000 IRQ 10 ac97_codec: AC97 Audio codec, id: 0x4144:0x5303 (Analog Devices AD1819) _________________________________________________________________ Test de audio-uitvoer bash# echo "10101010" > /dev/dsp Een statische uitbarsting komend uit de luidsprekers van de PC duidt erop dat het geluid werkt. _________________________________________________________________ Speel een voorbeeldbestand af mount /dev/fd0 /home bash# /usr/bin/mp3blaster Gebruik mp3blaster om het bestand /home/torvalds-says-linux.mp3 te selecteren en af te spelen. Gebruik mp3blaster's mixer controls om zonodig het volume aan te passen. _________________________________________________________________ Systeem afsluiten Sluit het systeem elegant af met de opdracht shutdown. References 1. mailto:dhorton@megsinet.net.NOSPAM 2. mailto:bokkie@nl.linux.org 3. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#legal 4. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#copyright 5. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#disclaimer 6. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN42 7. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN44 8. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN47 9. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN59 10. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN73 11. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN84 12. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#initiation 13. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN90 14. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN98 15. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN112 16. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#phase1 17. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN120 18. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN130 19. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN132 20. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN149 21. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN155 22. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN163 23. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN167 24. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN171 25. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN178 26. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN199 27. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN205 28. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN210 29. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN218 30. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN228 31. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN233 32. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN240 33. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN247 34. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN261 35. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN268 36. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN274 37. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN281 38. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN283 39. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN298 40. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN307 41. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN317 42. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#phase2 43. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN325 44. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN332 45. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN335 46. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN341 47. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN348 48. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN354 49. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN358 50. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN365 51. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN374 52. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN383 53. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN399 54. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN405 55. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN414 56. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN420 57. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN422 58. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN437 59. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN440 60. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#phase3 61. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN448 62. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN463 63. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN465 64. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN471 65. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN475 66. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN523 67. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN544 68. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN552 69. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN561 70. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN570 71. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN580 72. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN589 73. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN600 74. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN606 75. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN618 76. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN624 77. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN629 78. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN644 79. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN661 80. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#phase4 81. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN669 82. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN694 83. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN696 84. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN710 85. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN744 86. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN754 87. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN771 88. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN773 89. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN786 90. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN812 91. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN821 92. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN827 93. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN834 94. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN844 95. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN854 96. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN865 97. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN877 98. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN883 99. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN885 100. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN899 101. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN917 102. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN929 103. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#phase5 104. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN942 105. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN962 106. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN964 107. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN969 108. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN976 109. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN982 110. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1014 111. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1016 112. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1029 113. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1034 114. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1045 115. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1050 116. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1056 117. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1070 118. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1088 119. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1100 120. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1106 121. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1108 122. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1114 123. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1125 124. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#phase6 125. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1138 126. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1146 127. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1148 128. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux-Guide-NL.html#AEN1171 129. file://localhost/tmp/Pocket-Linux-Guide-NL/Pocket-Linux