Hoofdstuk III - Bestanden en directories
Het bestandssysteem
De hoofddirectories
Het beheer van bestanden en directories
Directories
Koppelingen
Device drivers
Commando's voor directory-beheer
ls - cd - cp -
mv - more - rm - rmdir - mkdir - mc -
pico - find - updatedb
locate - chmod - chown - mount - df -
du
Belangrijke bestanden
passwd - pap-secrets - inetd.conf - profile - rc.local - messages - maillog - secure
De directory-indeling van een DOS machine is vrijwel geheel willekeurig. Mogelijk wordt er een directory DOS aangemaakt door het installatieprogramma, maar voor het overige mag u het allemaal zelf weten. Onder Win95 is het nog erger. Er is een directory WINDOWS, met een subdirectory SYSTEM en een subdirectory DLL. En er is een directory PROGRAM bestanden. Voor de rest is elk overzicht tamelijk zinloos. Want elk nieuw geinstalleerd programma plempt hier naar hartelust zijn programma-, systeem- en library-bestanden in, zodat u weldra door de bomen het bos niet meer ziet. Over alle Registry en .INI ellende heb ik het dan nog niet eens. Probeert u in Win95 maar eens handmatig een programma te de-installeren! ;-(
Onder Linux is dat anders. Het systeem maakt bij installatie een set standaard
directories aan, waarbij de verschillende soorten bestanden over deze
directories verdeeld worden. Welke dat zijn staat in de Linux bestand System
Standard, een document waarin de namen en locaties van vele standaard
bestanden en directories zijn vastgelegd.
Terug naar begin
De hoofddirectories zijn de
volgende:
/etc zeer belangrijk: gereserveerd voor systeem configuratiefiles en opstart
scripts.
/X11 bevat configuratiebestanden als XF86Config
/skel bevat standaard gebruikersbestanden, die worden gekopieerd als een
nieuwe gebruiker wordt aangemaakt.
/lib bevat die libraries, die nodig zijn om de binaries uit /bin en /sbin uit
te voeren
/dev hier staan de zogenaamde 'device files', die gebruikt worden om de
verschillende soorten hardware van uw computer te benaderen: monitor,
harddisk, floppy, seriele poorten, modems, enzovoorts.
/sbin hier staan die executables van de root, die nodig zijn om op te starten,
/usr te mounten en systeem recovery acties te plegen. Tekst van de FSSTND:
"/sbin bevat bestanden nodig voor booten samen met de binaries uit /bin. Alwat
uitgevoerd wordt nadat /usr zonder problemen gemount is, moet in /usr/sbin
komen. Binaries voor locaal systeem-beheer horen thuis in /usr/local/sbin.
In elk geval horen de volgende programma's in /sbin:
clock, getty, init, update, mkswap, swapon, swapoff, halt, reboot, shutdown,
fdisk, fsck.*, mkfs.*, lilo, arp, ifconfig, route
/usr hier staan de bestanden die op de hele machine door gebruikers gestart
kunnen worden. Gewoonlijk staat /usr op een eigen partitie, en dient hij
readonly gekoppeld te worden. Onder andere horen hier de volgende
subdirectories thuis:
/X11R6 - directory voor het Xwindow systeem
/bin - executables
/doc - willekeurige niet-man documentatie
/etc - configuratie bestanden voor op de hele machine
/games - duidelijk
/include - C header bestanden
/info - GNU info bestanden
/lib - libraries
/var bevat bestanden die de neiging hebben nogal te varieren in omvang. Vooral
logfiles bevinden zich hier. In /var/spool en subdirectories staan data die
regelmatig veranderen. Zo bevindt zich de post in /var/spool/mail ...
enzovoorts ...
U doet het beste met over deze zaak een van de vele handboeken te lezen, als u het allemaal heel precies wilt weten. Maar u kunt zich de zaak het best voorstellen als een omgekeerde boom, waarvan de root-directory ('/') de stam is en bovenstaande subdirectories de (steeds verder uitgesplitste) takken zijn.
Het beheer van bestanden en directories
Er zijn vier types bestanden: gewone bestanden, directories, koppelingen en speciale bestanden. Met het commando 'file' kunt u het type van een bestand vaststellen.
Het meest heeft u natuurlijk te maken met gewone bestanden. Dat kunnen tekst, scripts, binaire, data- of uitvoerbare bestanden zijn.
Directories zijn bestanden die de namen bevatten van gewone bestanden en subdirectories en pointers daar naar toe. Alleen in directory bestanden worden bestandsnamen opgeslagen. Copieren van een bestand is alleen verplaatsen van een bestandsnaam. Tenzij naar andere disk of partitie. Dan per byte letterlijke copie naar andere locatie.
Elke bestand onder Linux heeft een uniek nummer: een 'inode'. Dat nummer staat in de 'inode tabel', die wordt aangemaakt bij het formatteren van de schijf. Elke fysieke schijf of partitie heeft zijn eigen tabel. Een inode bevat alle informatie over de bestand, inclusief het adres van de data en het type bestand.
De root directory krijgt inode nummer 1. De root directory bestand bevat een lijst van de bestand en directory namen met de bijbehorende inode nummers. Ziet er als volgt uit:
1 .
1 ..
45 etc
230 dev
420 home
123 .profile
Ook de bestanden . (= huidige of actieve directory) en .. (= hogere directory) staan in de lijst. Omdat het hier om de root directory gaat hebben ze hetzelfde nummer. De actieve en de hogere directory zijn in het geval van de root directory immers identiek! In de directory /home echter zijn ze uiteraard verschillend:
420 .
1 ..
643 henkie
Zoals u ziet is het nummer van de huidige directory hetzelfde (420) als het nummer voor /home in de root lijst. En het nummer van de hogere directory is hetzelfde als dat van de root directory.
Op deze manier houdt Linux bij waar de verschillende bestanden op de schijf te vinden zijn. Bij verplaatsing van bestanden worden ook alleen maar de inode tabellen veranderd. En niet de bestanden zelf! Tenzij de bestand wordt gewist of gecopieerd naar een andere schijf of partitie. Dan wordt het bijbehorende inode nummer vrijgegeven.
Koppelingen (of in slecht computerbargoens: 'links') zijn eigenlijk helemaal geen bestanden. Het zijn alleen een soort ANWB borden in een directory bestand, die verwijzen naar een inode. De inode tabel houdt ook bij hoeveel koppelingen naar een bestand er bestaan. Alleen als de laatste directory verwijzing gewist is, wordt het inode nummer vrijgegeven.
Een bijzonder soort koppeling is de symbolische koppeling. Een dergelijke koppeling verwijst naar een inode, die op zijn beurt weer een verwijzing is naar een andere bestand elders in het bestandssysteem. Een dergelijke koppeling kan (in tegenstelling tot een gewone koppeling) wel verwijzen naar een bestand op een andere schijf of een andere computer. Het belangrijkste verschil tussen een gewone en een symbolische koppeling is, dat een gewone koppeling wordt behandeld als de bestand zelf. De feitelijke bestand wordt niet gewist tenzij de laatste gewone koppeling gewist is. U kunt de bestand dus ook niet wissen zolang er nog een gewone koppeling naar de bestand bestaat. Bij symbolische koppelingen is dat anders: als de bestand gewist wordt, gaan ook alle symbolische koppelingen eraan!
Overigens worden koppelingen net zo behandeld als de bestanden waarnaar ze verwijzen. U kunt zien of een bestand eigenlijk een koppeling is door het commando 'ls -l'. In de uitvoer wordt eerst de bestandsnaam getoond en daarna een verwijzing naar de gekoppelde bestand:
lrwxrwxrwx 1 root root 5 Jan 17 18:30 Tekst -> tekst/
En dan nog de speciale bestanden. Elk fysiek apparaat dat aan een Linux systeem hangt (disks, terminals en printers) wordt als een directory in het bestandssysteem weergegeven. Meestal staan ze in de directory /dev. Neemt u daar maar eens een kijkje. De inhoud van de verschillende apparaten worden gewoonlijk onder de directory /mnt getoond. Werpt u ook daar maar eens een blik.
Commando's voor bestands- en directorybeheer.
Hieronder volgt een aantal commando's, die u kunnen helpen bij het beheer van bestanden en directories. Onder elk commando staat een korte beschrijving van de werking. Uitgebreidere informatie kunt u onder Linux zelf krijgen, als u op de commandoregel invoert 'man <commando>' of 'man <onderwerp>', waarbij u op de plaats van het met <> omgeven woord natuurlijk een echt commando of een Linux onderwerp moet invoeren. U krijgt dan een of meer schermen met verklarende tekst over de door u genoemde term. Inderdaad ja ... helaas wel in het Engels! ;-)
ls
Dit commando toont bestanden en directories en is vergelijkbaar met het DOS
commando 'dir', dat u in een bash shell trouwens ook kunt gebruiken. U kunt
dit commando voorzien van allerlei extra opties, die betrekking hebben op de
manier waarop de directory getoond wordt. Geeft u bijvoorbeeld maar eens de
optie -all mee en ziet u maar eens hoe de uitvoer van het commando dan op het
scherm verschijnt. Nadere uitleg vindt u (zoals gemeld) met 'man ls'.
cd
Met dit commando verandert u van directory, eveneens weer net als vroeger
onder DOS. Het enkele commando 'cd' brengt u in een keer naar uw home
directory op het systeem en met 'cd ..' gaat u telkens een directory terug.
Met 'cd /' (let op de gewone 'slash', alleen DOS gebruikt de 'backslash' in
directorynamen!) gaat u in een keer naar de basisdirectory van het systeem.
Probeert u maar eens met dit commando door de verschillende directories te
stappen en bekijkt u met 'ls' dan maar eens uit wat u dan te zien krijgt.
cp <bestand> <locatie>
Hiermee copieert u <bestand> naar <locatie>, zoals onder DOS gebeurt met
het commando 'copy'. Een al bestaand bestand van dezelfde naam wordt niet
zonder vragen overschreven. Redelijk safe dus.
mv <bestand> <locatie>
Het 'move' commando. Vergelijkbaar met 'cp'. Alleen wordt nu het bestand van
de oude locatie verwijderd. Controleert u wel even of de <locatie> wel
bestaat? Als u namelijk als doel een niet bestaande directory opgeeft kan 'mv'
denken, dat u een nieuwe bestandsnaam bedoelt en bent u opeens (schijnbaar!)
uw hele bestand kwijtgeraakt!
more <bestandsnaam>
Vergelijkbaar met het DOS commando 'type'. Alleen komt de tekst telkens met
een scherm tegelijk voorbij. U stapt uit door op de toets 'q' (van 'quit') te
drukken. Er zijn trouwens meer commando's onder Linux om tekstfiles te
bekijken. Probeert u maar eens 'less <bestandsnaam>', 'cat
<bestandsnaam>' en 'tail <bestandsnaam>'. U zult merken dat ze allemaal
hun eigenaardigheden hebben. Met 'less' kunt u de tekst met de pijltoetsen
laten terugrollen. En met 'cat' kunt u teksten aan elkaar plakken tot een
nieuwe tekst. En 'tail' ... nou ja, kijkt u zelf maar!
rm <bestandsnaam>
Met dit commando (afkorting van 'remove') verwijdert u <bestandsnaam> van
uw schijf, nadat u gevraagd is met Y of N aan te geven of u het echt zeker
weet. Weet u het bij voorbaat al zeker, dan kunt u ook de optie -f tussen
commando en <bestandsnaam> invoegen. Dan blijft de vraag namelijk
achterwege. Met 'rm -r <directory>' kunt u complete directories en
(eventueel) subdirectories verwijderen. Bij elke verwijdering wordt u weer
gevraagd of u het zeker weet (Y/N). Ook van die vragen kunt u verlost worden
door 'rm -f -r <directory>'. Alleen moet u dan wel heel erg goed weten waar
u precies mee bezig bent! Hopelijk beseft u, dat dit commando dus echt
LEVENSGEVAARLIJK kan zijn. Vooral wanneer u het als root gebruikt. U kunt het
complete Linux systeem hiermee in een keer wissen! En onder Linux geldt: weg
is weg! ;-(
rmdir <directory>
Verwijdert lege directory. Mocht de directory niet leeg zijn, dan krijgt u een
melding dat de verwijdering om die reden niet is doorgegaan.
mkdir <directory>
Dit commando maakt een directory aan. Geen verdere bijzonderheden.
mc
Al het bovenstaande tesamen (en nog veel meer!) kunt u ook regelen met het
commando 'mc', wat staat voor 'Midnight Commander', de Linux versie van
'Norton Commander'. U krijgt een NC-achtig schermpje te zien met menutoetsen
en uitleg aan boord. Zeer krachtig programma!
pico <bestandsnaam>
Een eenvoudige teksteditor voor Linux. Natuurlijk zou u volgens de echte
freaks eigenlijk 'vi' moeten gebruiken. En u zult ook wel merken, dat 'vi' nog
wendbaarder is dan 'pico'. Zo kunt u 'vi' zelfs in een Telnet sessie
gebruiken! Maar pico is eenvoudiger te gebruiken. De bedieningstoetsen staan
namelijk in een klein menu onder op het scherm vermeld als geheugensteuntje.
Probeert u het maar eens uit.
find . -name <bestandsnaam>
Met de uitgebreide directory boom van Linux is het vaak lastig zoeken naar die
ene file, waarvan u net niet meer precies weet waar u hem ook alweer gelaten
hebt. Het bovenstaande commando kan dan erg handig zijn. Het zoekt
<bestandsnaam> vanaf de huidige directory verder naar beneden. Als u in
plaats van de punt ('.') een directorynaam invoert, zal dat het uitgangspunt
voor de zoekactie worden.
updatedb en locate <bestandsnaam>
Aan de andere kant kan 'find' (vooral als u laat zoeken vanaf de
root-directory) een behoorlijk poosje aan het zoeken zijn. Daar wilt u niet
altijd op wachten. Er is een alternatief. Met het commando 'updatedb' wordt
een kleine database aangemaakt van alle bestanden en directories op uw
machine. Met het commando 'locate <bestandsnaam>' wordt vervolgens in een
flits <bestandsnaam> uit die gegevensbron opgehaald en op het scherm gezet.
Het aanmaken van de database duurt natuurlijk even. Maar daarna verloopt een
zoekactie aanzienlijk sneller dan met 'find'.
chmod a/ugo +/-xrw <bestand>
Met dit commando kunt u de rechten van een bestand veranderen. De
verschillende opties werken als volgt. Bestandsrechten kunnen worden
toebedeeld aan u (user = gebruiker, eigenaar van de file), g (group =
werkgroep, die de file eveneens mag gebruiken) of o (other = alle anderen).
Per onderdeel kunt u drie rechten toedelen: x (execute =
uitvoeringsbevoegdheid), r (read = leesbevoegdheid) en w (write =
schrijfbevoegdheid). Een + deelt het recht toe, een - neemt het recht weer
weg. Uiteraard moet u zelf eigenaar van het bestand (of root) zijn om de
rechten te kunnen veranderen. U kunt de zaak ook aan alle drie groepen
tegelijk toedelen door de optie a (all) te gebruiken. Met de toevoeging
<directory> in plaats van <bestand> kunt u dezelfde rechten ook m.b.t.
een directory toedelen.
chown user,group <bestand>
Hiermee verandert u de eigendom van een bestand. Met 'ls -all' kunt u zien hoe
de huidige stand van zaken is. En met chown kunt u het dan naar eigen
inzichten veranderen. Uiteraard moet u ook voor deze actie of eigenaar van het
bestand of root zijn.
mount /dev/cdrom /mnt/cdrom
Met dit commando koppelt u een cdrom aan uw Linux systeem, waarna u de inhoud
van de cdrom kunt lezen in de directory /mnt/cdrom. Met 'cd' gaat u daarheen
en met 'ls' kunt u de inhoud bekijken. Dit is trouwens een nogal belangrijk
verschil in werking vergeleken bij een operating system als bijvoorbeeld DOS.
Onder DOS worden de randapparaten bij het opstarten automatisch aan het
systeem gekoppeld. En u kunt er ook zonder verdere poespas gebruik van
maken.
Onder Linux is dat anders. Pas als een schijf gekoppeld is met het 'mount' commando kan er gebruik van gemaakt worden. Het eerste argument (/dev/cdrom) is daarbij de apparaat-driver. En het tweede argument (/mnt/cdrom) is het zogenaamde koppelingspunt. Dat wil zeggen: de plek waar de inhoud van de schijf binnen het systeem verschijnt in de vorm van een extra directory. Zo kan een floppy gekoppeld worden met het commando 'mount /dev/fd0 /mnt/floppy'. De apparaat-driver is standaard aanwezig in de /dev directory. Maar de directory /mnt/floppy moet door uzelf aangemaakt zijn (of anders eerst aangemaakt worden)! De inhoud van de floppy kan daarna bekeken worden in de directory /mnt/floppy.
N.B.: deze koppeling geldt voor elke floppy en voor elke CDROM-schijf apart!! U koppelt dus niet de floppy-drive of de CDROM-drive!! En u kunt/mag na koppeling een schijf ook niet zonder meer uit de drive verwijderen! U dient dan eerst gebruik te maken van het commando 'umount /mnt/floppy' of 'umount /mnt/cdrom'. Pas dan mag de schijf uitgenomen worden. En een nieuwe schijf moet eerst weer met het 'mount' commando gekoppeld worden.
N.N.B.B.: dit is ook de reden dat de CDROM na koppeling zijn schijf niet meer lijkt te willen teruggeven! ;-) Geen sprake van dat opeens uw CDROM-drive kapot zou zijn. Maar de schijf moet eerst ontkoppeld worden voor de eject-knop weer normaal werkt. De floppy heeft een dergelijk veiligheidsmechanisme niet. De uitstootknop werkt immers puur mechanisch. Fysiek kunt u dus heel makkelijk een gekoppelde floppy uit de drive verwijderen. Maar Linux zal u dat niet in dank afnemen! Ook een floppy moet voor verwijdering uit de drive eerst netjes ontkoppeld worden met 'umount'.
N.N.N.B.B.B.: u kunt via de mogelijkheid om aliassen in te stellen uzelf het typewerk om deze apparaten elke keer aan- en af te koppelen, besparen. Zie daarvoor hoofdstuk IV.
df
Staat voor 'diskfree'. Met dit commando krijgt u een overzicht van de ruimte
die nog beschikbaar is op de gekoppelde harddisks.
du [-a] [-s]
Zal wel staan voor 'disk-used' en toont de grootte van bestanden (met de optie
-a) of van directories (met de optie -s).
Tot slot van dit hoofdstuk noem ik hier nog een paar onder Linux belangrijke bestanden. Mogelijk wordt het een enigszins willekeurige opsomming, maar dat zij dan zo:
passwd - dit bestand staat in de directory /etc en bevat de inlognamen en versleutelde wachtwoorden van gebruikers. Normaliter verandert u dit bestand niet met de hand. Het beste kunt u hem laten aanmaken en beheren door het commando 'passwd' of (onder XWindows) door de User Management Tool. Er is echter een gelegenheid, waarbij het editten van deze file belangrijk kan zijn. En dat is als een gebruiker zijn wachtwoord vergeten is. U kunt dan de versleutelde tekst in de regel van betreffende gebruiker weghalen, zodat er twee dubbele punten vlak naast elkaar komen te staan. De gebruiker kan dan zonder wachtwoord inloggen en daarna zijn wachtwoord met 'passwd' weer instellen.
pap-secrets - dit bestand staat in /etc/ppp en bevat (in vier velden) de gegevens voor gebruikers die per modem inloggen. De wachtwoorden staan hier echter in klare taal (!) vermeld. De pap-authenticatie maakt van dit bestand gebruik.
inetd.conf - dit bestand staat in /etc en regelt de verleende services onder TCP/IP, dus of u via het netwerk kunt ftp-en, telnetten en dergelijke. Als u dat allemaal niet wilt toestaan, dient u de betreffende regels in dit bestand weg te commentarieren (door er een # voor te zetten).
profile - ook dit bestand staat in de directory /etc. Het bevat algemene declaraties voor uw systeem. Als u het pad wilt aanpassen in uw hele systeem, kunt u de zaak hier regelen.
rc.local - in dit bestand (dat zich bevindt in de directory /etc/rc.d) staan de eigen initialisatie zaken. Laadt u het maar eens in 'pico' en kijkt u maar eens wat u hier kunt regelen.
messages - is een logfile van systeemmeldingen, die zich bevindt in /var/log. U kunt hier zien wie er per modem inlogt. Ook kunt u dit bestand gebruiken om evt. systeemfouten op te sporen. Ook foutmeldingen komen hier namelijk terecht.
maillog - ook dit is een logbestand dat staat in /var/log. Hier gaat het over meldingen m.b.t. de postbehandeling door de mailserver.
secure - dit bestand (eveneens als logbestand in /var/log) bevat meldingen m.b.t. telnet en ftp
O ja ... graag herinner ik nog even aan de opmerking uit hoofdstuk I, toen het
ging over het opstarten van programma's onder Linux.
Programma's kunnen in Linux niet zonder meer gestart worden vanuit de
directory waarin het programma zelf staat. Typt u in die directory (naar
analogie van DOS, waar dit wel kan!) de naam van het programma dan gebeurt er
helemaal niets. Onder Linux zult u uitdrukkelijk moeten aangegeven dat u dit
echt wilt door in te tikken './<programma> <ENTER>'. U geeft middels de
punt dus de huidige directory aan om duidelijk te maken dat u zich echt niet
vergist en geeft dan het commando! Ik herhaal deze opmerking hier, omdat
vooral voormalige DOS gebruikers zich hier regeltmatig mee vergissen. Ikzelf
dus incluis! ;-)