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.
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! ;-)