4. A Unix (Linux) file-szerkezete

4.1. Könyvtár struktúra

Unix alatt az idők során kialakult egy konvencionális könyvtár-struktúra: ez ugyan (kevés kivételtől eltekintve) nem kötelező érvényű, de ha máshogy alakítjuk gépünk könyvtárszerkezetét általában csak saját dolgunkat nehezítjük vele. Kisebb eltérések persze mindig akadnak: mi, amint eddig is tettük, a "Slackware" nevű Linux disztribúció konvencióit követjük.

Minden a / (root, vagyis gyökér) könyvtárból indul. Első könyvtár a /bin, ahol a rendszer futtatáshoz, a rendszer felállásához legszükségesebb futtatható állományok vannak: a "bash", a "cat", a "ps" és így tovább.

Linux sajátosság a /boot könyvtár, ahol a Linux boot-vezérlő program, a LILO (Linux Loader) adatfile-jai kaptak helyet. Következő a /dev, ahol a rendszer erőforrásait reprezentáló speciális ún. eszköz (device) specifikus file-okat találhatjuk.

A /etc alatt helyezkednek el a rendszer-konfigurációs file-ok, illetve Linux alatt az /etc/rc.d könyvtárban vannak a rendszer indulásakor automatikusan lefutó file-ok. Az /etc/skel konyvtár egy "skeleton" (csontváz) könyvtár a létrehozandó felhasználók számára: ha a standard, Slackware-hez mellékelt programokkal hozunk létre új account-okat a gépen, ennek a könyvtárnak a tartalma másolódik be a home könyvtárukba.

/home könyvtár alatt találhatók a felhasználók "home" könyvtárai, az eddigi példákban szerepelt /usr/users régi, BSD rendszerekből származó csökevény.

A következő könyvtár a /lib: Linux alatt itt található a dinamikus programkönyvtárak nagy része.

Minden Unix filesystem-en található egy /lost+found alkönyvtár: ha a filesystem megsérül, és a helyreállító program olyan file-okat talál rajta, amelyeknek könyvtárstruktúrába helyezéséhez nincs elég információja, ide teszi őket.

Rendszerint van még egy /mnt alkönyvtár is: általában ide szokás az ideiglenes (például floppy, CD-ROM) filesystem-eket illeszteni (mount). Szintén Linux sajátosság (illetve más, újabb Unix-okaban is előfordul már) a /proc alkönyvtár: itt nem "igazi" file-ok vannak, hanem a rendszer, a folyamatok állapotát reprezentáló "álfile-ok". Például a /proc/meminfo kiolvasásával ("cat /proc/meminfo ") a "free" parancséhoz hasonló kimenetet kaphatunk.

A /root könyvtár Slackware-ben a rendszergazda home-könyvtára. Következő fontos könyvtár a /sbin ebben a rendszergazda számára fontos, rendszeradminisztráláshoz szükséges futtatható file-okat találjuk.

A /tmp könyvtár az, ahova mindenkinek van írásjoga, ideiglenes file-ok tárolására való. Mivel Unix alatt nagyon sok program használja a /tmp könyvtárat ideiglenes file-jainak tárolására, mindig ügyeljünk arra, hogy itt legyen szabad hely, különben egész alapvető programok nem lesznek képesek futni, és nagyon furcsa dolgok történhetnek.

/usr könyvtár alatt Unix-okban tradicionálisan a rendszer futtatásához nem feltétlenül szükséges, "minden egyéb" file helyezkedik el: a /usr is alatt is van /usr/bin, /usr/lib, /usr/etc, /usr/sbin könyvtár, ahol a különböző installált szoftverek futtatható és adatfile-jai helyezkednek el. (Adatfile-ok rendszerint a /usr/lib alatt.) A /usr/man alatt találhatók a "man" parancs adatfile-jai, a /usr/include alatt pedig a rendszer C header file-jai kaptak helyet. A /usr/X* könyvtárakban az XFree grafikus rendszer file-jai találhatók. A /usr/local alatt általában megismétlődik egy, a /usr-éhez hasonló könyvtárstruktúra: mivel a /usr/bin-ben lévő programok rendszerint az operációs rendszerrel együtt érkeznek, tágabb értelemben véve annak részeinek tekinthetők, ezért a rendszergazdák nem szívesen keverik közéjük a "lokálisan" (rendszerint forrásból) felinstallált programokat - és a /usr/local alá helyezik őket. Így van ez Linux alatt is. Említést érdemel még a /usr/src könyvtár is: értelemszerűen programforrásokat szokás ide tenni, Linux alatt pedig mindig megtalálható itt a kernel (tehát maga a Linux) forrása is.

A főkönyvtárból nyílik még a /var alkönyvtár, amely mindenféle, a rendszer működésével kapcsolatos "aktuális" file-t tárol: például a /var/adm könyvtárban vannak a különféle "napló" (log) file-ok, amelyek a rendszer eseményeit rögzítik. A /var/spool alatt pedig a többek között a nyomtatókezelő és a levelező alrendszer ideiglenes file-jai találhatók meg. A /var alatt lévő file-ok a rendszergazdának (vagy még neki sem, rendszerprogramoknak) szólnak, átlag felhasználó nem sok érdekeset találhat itt.

Végezetül, a gyökérkönyvtárban található még a /vmlinuz, vagy /zImage, vagy /vmunix nevű file, ami a kernelt tartalmazza: innét töltődik be boot-oláskor.

4.2. A /dev alkönyvtár

A /dev (devices - eszközök) alkönyvtárban találhatók a rendszer- erőforrásokat reprezentáló speciális file-ok. Ezek teremtik meg a kapcsolatot a kernel "device driver"-nek (eszközmeghajtó) nevezett, az egyes fizikai eszközök kezeléséért felelős komponensei és a rendszer egyéb részei között. Kétféle eszközmeghajtót különböztetünk meg: a karakteres ("c") és a blokkos ("b") típusút, annak megfelelően, hogy az általa reprezentált eszköz milyen szervezésű. Egy winchester, vagy floppy eszközmeghajtója blokkos, míg például egy soros vonalat, vagy terminált reprezentáló file-hoz tartozó eszközmeghajtó karakteres típusú. Lássuk röviden a föbb file-csoportokat a /dev alatt, illetve egy-két példán keresztül azt, hogyan használhatjuk őket:
/dev/audio
Ha valamilyen hangkártya vagy más zajkeltő szerkezet van a kernelbe konfigurálva, akkor a .au formátumú file-okat ide kiírva meghallgathatjuk őket. Példa: "cat x.au >/dev/audio " Ha a hangkártya digitalizálásra is képes, ez a file olvaható is.
/dev/cdrom
Ez általában egy link a bonyolultabb nevű, valódi CD-ROM speciális file-ra. Hasonlóan használható mint egy winchester speciális file.
/dev/cua*
A soros vonala(ka)t jelentő speciális file-ok. Írásuk vagy olvasásuk küldést/vételt jelent a megfelelő vonalon.
/dev/fd*
A floppy diszkeket reprezentálják. A fd0 kezdetű file-ok az A floppyra vonatkoznak, a fd1 kezdetűek a B-re. Mount-olásnál kell ezeket a neveket használnunk, vagy pedig akkor, ha a floppy-n lévő image-t (összes szektort) egy file-ba akarjuk olvasni. Erre használhatjuk például a "cat floppyimage" parancsot. Blokkos eszközök írása/olvasásakor érdemesebb a "cat" helyett a "dd" parancsot használni: működése hasonló, csak bővebben paraméterezhető, és blokk-műveletekre optimalizálható. Például: az előző file visszaírása az 1.44MB-s B lemezre: "dd bs=512 /dev/fd1H1440". (bs=block size)
/dev/hd*
A rendszerben lévő AT buszos winchesterek: a /dev/hda az első winchestert jelenti, /dev/hdb a másodikat. Ha a gépben két IDE vezérlő vagy egy EIDE vezérlő van, akkor a többi diszkhez a /dev/hd1[ab] néven férhetünk hozzá. Ha ezeket a file-neveket számokkal folytatjuk, az egyes diszkeken lévő partíciókhoz jutunk, például /dev/hda1,/dev/hda2
/dev/midi, mixer
Hangkártyához tartozó file-ok, a /dev/midi értelemszerűen midi file-ok kezelésére.
/dev/mouse,modem
Általában ezek linkek valamely soros portra.
/dev/pty*
Pszeudo-terminál vonalakat reprezentáló speciális file-ok.
/dev/sd*
SCSI diszkek.
/dev/tty*
A (virtuális) konzol terminálvonalai.
/dev/ttyS*
Soros vonali terminálok.
/dev/null
Ez egy igen érdekes file: minden beleírt adatot elnyel, és olvasáskor mindig filevége-jelet ad. Akkor hasznos, ha egy parancs kimenetét el akarjuk nyomni. Például, ha nem akarjuk a hibaüzeneteket látni: "parancs 2>/dev/null".
/dev/zero
Az előzőhöz hasonló file, azzal a különbséggel, hogy olvasáskor végtelen sok 0 értékű byte-ot ad vissza. A "dd 10kfile bs=1k count=10" utasítással például létrehozhatunk egy 10Kbyte hosszú, 10kfile nevű csupa 0-ból álló file-t.

4.3. A filesystem-ekről

Mint már korábban szó volt róla, a Linux többféle filerendszer-formátumot is támogat. Többféle Unix-os filesystem-et:
minix
amelyet egy régebbi Unix implementációtól örökölt,
ext
(extended) filesystem formátumot, amely az előző továbbfejlesztése
ext2
second extended, amely szintén az előző továbbfejlesztése, jelenleg ez a legnagyobb teljesítményű Linuxos filesystem formátum, szinte minden Linux rendszeren ezt használják
xiafs
amely egy, Frank Xia által kifejlesztett filesystem: mára az "ext2" már teljesen kiszorította
/proc
amely filerendszerként van implementálva, az egységesebb kezelés érdekében
Ezek a filesystem formátumok főleg teljesítményben (sebesség, maximális méret, létrehozható maximális file-méret, maximális file-név hossz stb.) térnek el egymástól: jelenleg a legjobb az "ext2", amelyet Remy Card fejlesztett ki (és fejleszt tovább folyamatosan). További, Linux által támogatott filesystem formátumok:
msdos
MS-DOS-os, FAT formátumú partíciók, floppy-k kezelésére
umsdos
speciális filesystem, segítségével DOS-os, FAT filesystem-en hozhatunk létre "igazi" Unix-os filerendszert. (Vagyis biztosítja a file-okhoz tartozó Unix-os plusz információ kezelését.)
NFS
Network File System: TCP/IP hálózati környezetben elosztott hálózati filerendszert hozhatunk létre segítségével.
ISO9660
a CD-ROM-ok file formátuma
HPFS
(egyenlőre csak olvasható) OS/2 HPFS filerendszer
SYSV/Coherent
egy újabb Unix-os filerendszer.
Az itt felsorolt formátumok a standard Linux kernel részei: kiegészítések (ún. patch-ek) formájában létezik még sok más, ritkábban használt filesystem formátum támogatása is (további Unix-os file-rendszereké, például BSD "ufs", illetve léteznek Linuxra is röptömörítő szoftverek).

Nem Unix-os file-rendszereket csak látszólag tudunk Unix-osként kezelni: "msdos" filesystem-en nem tudunk például linket létrehozni, file-tulajdonost váltani stb. File-okat írni, olvasni végrehajtani azonban ugyanúgy lehet. "Hosszú" file-neveket szintén nem tudunk annak kezelésére alkalmatlan filesystem-eken létrehozni.

Filesystem-et létrehozni (formázni) a "mkfs" utasítás családdal lehet: "ext2" filerendszert a "b" winchester második partíciójára például a "mke2fs /dev/hdb2" paranccsal tudunk. A mkfs parancsok nem képesek alacsony szintű (fizikai) formázást végezni: winchesterek esetén ezt a BIOS Setup-ból kell megtennünk, floppy-kat pedig az "fdformat" paranccsal formázhatunk alacsony szinten.

Filesystem-ek beillesztése: ha az előbb létrehozott filesystem-et szeretnénk beilleszteni a /mnt könyvtár alá: "mount -t /dev/hdb2 /mnt". Az illesztést megszüntetni az "umount /mnt" paranccsal lehet, ez azonban csak akkor lehetséges, ha az összes file le van zárva az adott filesystem-en, és nincs a rendszerben olyan folyamat, amelynek aktuális könyvtára valahova a filesystem területére mutat.

Ha egy filesystem valamilyen okból kifolyólag (általában áramszünet, véletlen kikapcsolás) logikailag meghibásodik, az "fsck" utasítás-család valamely tagjával próbálhatjuk megjavítani ("ext2" filesystem esetén használjuk az "e2fsck"-t). Ezt a parancsot mindig használaton kívüli (nem beillesztett, vagy végső esetben "read-only" - csak olvasható - módon beillesztett) filesystem-en futtassuk: az "fsck" direkt diszk-blokkokkal dolgozik és azokat javítja meg, a buffer cache-ben azonban a hibás blokkok marad(hat)nak benn, amelyeket az "update" visszaírhat a diszkre.

4.4. File-elnevezési konvenciók

Bár nem kötelező Unix alatt file-név kiterjesztést (extension) használni, mégis - a könnyebb eligazodás végett - szokás. Futtatható file-oknak általában nem adnak kiterjesztést. A gyakoribb kiterjesztések:
.c,.h
C forrásfile-ok
.cpp
C++ forrás
.s,.S
Assembly forrás
.o
tárgykód (object) file-ok
.a
statikus programkönyvtárak
.conf,.cf
konfigurációs file-ok
.so.*
dinamikus programkönyvtárak
.[1-9]
(szám kiterjesztés): az egyes manual page file-ok
.sh,.csh
(nem mindig) a script file mely shell alá készült
.tar
a "tar" archiválóval készült file
.gz
a "gzip" (GNU zip) tömörítővel tömörített file
.tgz
.tar.gz rövidítése (a "tar" nem tömörít)
.Z
a "compress" (régebbi) tömörítővel pakolt file
.tex
TeX vagy LaTeX forrásfile
.dvi
DVI (Device Independent) szöveges-grafikus file formátum
.ps
PostScript (oldalleíró, nyomtatókezelő nyelv) file
.au,.wav
Hangmintákat tartalzó file-ok
Ha egy file nevéről nem tudjuk kitalálni, mi is lehet benne, megpróbálkozhatunk a "file file_nev" paranccsal: a "file" utasítás beleolvas és megpróbálja kitalálni, milyen file is az. Az általában ismert file-formátumokra meglepően jól működik.

4.5. az "mtools": DOS-os floppyk kezelése

Mivel leggyakrabban DOS alá formázott mágneslemezekkel találkozhatunk, létrehoztak Unix alá egy programgyűjteményt, amely ezen floppyk kezelését könnyíti meg: a megszokott DOS szintakszist használhatjuk floppy-műveleteknél. Például egy file bemásolása az A: floppyról az aktuális könyvtárba:
claudius:~$ mcopy "a:\file.xxx" .          
Az összes "m" parancs felsorolásáért nézzük meg a "mtools" man page-t! Figyelmeztetés: használhatunk DOS-os metakaraktereket is a file-nevekben, ezeket azonban mindig érdemes a shelltől idézőjellel megvédeni, az eltérő értelmezés miatt. (Az "mtools" helyesen értelmezi a DOS-os metakaraktereket, csak gondoskodnunk kell arról, hogy ezek a metakarakterek el is jussanak hozzá.)

Vége. Egyenlőre...