Prečo existujú súborové systémy?

Pravdepodobne viete, že údaje sa v počítači ukladajú na disk. Na to aby ste mohli, ale nejaké údaje ukladať musí byť jasné kde presne na disku tieto údaje budú uložené a ako ich nájdete, až ich budete potrebovať. Presne túto úlohu riešia súborové systémy. Súborový systém je teda štruktúra obsahujúca súbory (ich obsah) a ich atribúty a ďalšie informácie potrebné pre prácu so súbormi - metadáta.

Čo majú spoločné adresár a súbor?

Adresár (angl. directory) je v našom jazyku známy pod mnohými menami: zložka, priečinok, atď. Treba si uvedomiť, že adresár je len zvláštny typ súboru. Jeho zvláštnosť spočíva v tom, že pre daný typ súborového systému má vopred definovanú štruktúru. Pre novšie, inteligentné súborové systémy táto štruktúra obsahuje meno súboru a číslo tzv. inode-u. Inode je časťou metadát a obsahuje informácie o súbore ako sú jeho prístupové práva, dátum a čas vzniku, veľkosť a podobne. To prináša zo sebou zaujímavú možnosť mať v dvoch rôznych adresároch záznam ukazujúci na ten istý inode. Vtedy vlastne existuje jeden súbor na disku, má jediné miesto uchovávajúce prístupové práva, veľkosť a podobne, ale môže mať rôzne mená. Vo svete Unixu sa to označuje ako linka - hard linka.

Pripájanie a odpájanie súborových systémov

Na rozdiel od operačného systému MSDOS alebo Windows, súborové systémy v Unix-och spravidla nevidno automaticky (výnimku tvorí systém supermount, ktorý je ale mimo rozsah tohoto dokumentu). Každý súborový systém, ktorý má byť dostupný operačnému systému či jeho užívateľom je nutné najprv pripojiť. Súbor /etc/fstab obsahuje záznam o tom, ktoré súborové systémy sa pripoja automaticky pri štarte systému.

Je dôležité si uvedomiť, že potreba pripájať a odpájať súborové systémy sa týka aj diskiet, CD-čiek a podobne. Zariadenia, ktoré podporujú zamykanie, zamknú médium po dobu, kedy je súborový systém na médiu pripojený. To znamená napríklad, že CD-mechanika alebo ZIP mechanika nereagujú na tlačidlo pre vybratie média, ak súborový systém na tomto médiu je pripojený. Na druhej strane, súborový systém nie je možné odpojiť ak sa používa. To znamená ak nejaký program má otvorený súbor na tomto súborovom systéme, alebo nejaký proces má adresár na tomto súborovom systéme nastavený ako aktuálny adresár.

Žurnálovacie súborové systémy

Ako sme už povedali, jednou zo základných vlastností súborového systému je uchovávanie údajov. A to najhoršie čo sa môže stať je havária, ktorá môže mať za následok stratu týchto údajov. Žurnálovacie súborové systémy boli vyvinuté s cieľom obmedziť riziko straty dát na minimum. Preto sa každá operácia zapisuje do takzvaného žurnálu a v prípade, že sa skutočne úspešne dokončí tak sa v žurnále označí za vykonanú. V prípade, že dôjde k havárii tak v žurnále môže systém zistiť, ktoré operácie boli dokončené a čo bolo skutočne zapísané na disk. Operácie, ktoré neboli dokončené akoby sa ani nestali. To znamená, že síce môžete prísť o nejaké údaje (z poslednej operácie), ale stav súborového systému ako takého je konzistentný. Za zmienku stojí informácia, že z dôvodou rýchlosti sa často žurnálujú len metadáta.

FAT

FAT (File Allocation Table) ste mohli stretnúť medzi prvými v operačnom systéme MS-DOS. Charakterizovať ho možno tým, že súbory usporadúva do stromovej štruktúry adresárov, pričom hlavný adresár má stanovený maximálny počet položiek, ktoré môže obsahovať. Ďalšou charakteristickou črtou je FAT tabuľka. FAT filesystém obsahuje tieto tabuľky dve a pokiaľ je všetko v poriadku tak sú rovnaké. FAT je blok dát na začiatku súborového systému, kde sú poradové čísla blokov na ktorých sa nachádza ten ktorý súbor. V časoch MS-DOS 3.1 boli tieto čísla 12-bitové. Preto môžete občas nájsť tiež označenie FAT12. Samozrejme z toho vyplýva aj obmedzenie na počet dátových blokov, ktoré môže taký súborový systém obsahovať - 212. S príchodom väčších diskov prišli aj FAT systémy so 16-bitovými indexami blokov (FAT16) a neskôr až 32-bitovými indexami (FAT32). Poslednou črtou, ktorú spomenieme je obmedzenie mien súborov. Pôvodne bolo toto obmedzenie stanovené na 8 znakov vlastného mena a 3 znaky prípony. Oboje mohli obsahovať len ASCII znaky. Keď narástla potreba na dlhšie mená súborov, firma Microsoft pre udržanie spätne kompatibility zaviedla konvenciu, podľa ktorej je ôsmy znak nahradený znakom ~ (tilda), na znak toho, že meno súboru pokračuje v ďalšej položke adresára. Tieto rozšírenia dali príčinu pre nové meno: VFAT (Versatile(?) FAT). Nedostatkom FAT je, že informácie inode-u má uložené priamo v štruktúre adresárov.

Jedným z miest kde FAT prežíva do dnešných čias sú diskety.

# mount /dev/fd0 /mnt/floppy/

Všimnite si ale, že prístupové práva v takomto prípade povoľujú prístup pre zápis len pre roota:

# ls -ld /mnt/floppy /mnt/floppy/subor.txt
drwxr--r--    3 root     root         7168 Jan  1  1970 /mnt/floppy
-rwxr--r--    1 root     root        92599 Jul 19  1996 /mnt/floppy/subor.txt

Pokiaľ chcete povoliť prístup iným užívateľom môžete použiť niektorý z iných spôsobov. Všimnite si prístupové práva adresára

# mount -oumask=022 /dev/fd0 /mnt/floppy/
# ls -ld /mnt/floppy/ /mnt/floppy/subor.txt
drwxr-xr-x    3 root     root         7168 Jan  1  1970 /mnt/floppy/
-rwxr-xr-x    1 root     root        92599 Jul 19  1996 /mnt/floppy/subor.txt
# umount /mnt/floppy
# mount -oumask=007,uid=rastos,gid=floppy /dev/fd0 /mnt/floppy/
# ls -ld /mnt/floppy/ /mnt/floppy/subor.txt
drwxrwx---    3 rastos   floppy       7168 Jan  1  1970 /mnt/floppy/
-rwxrwx---    1 rastos   floppy      92599 Jul 19  1996 /mnt/floppy/subor.txt

Aby ste nemuseli vždy zadávať všetky parametre programu mount, môžete vložiť príslušný riadok do /etc/fstab:

/dev/fd0	/mnt/floppy	auto	defaults,noauto,users,uid=rastos,gid=floppy,umask=007	0       0

NTFS a WinFS

NTFS je ďalším vývojovým krokom z dielne Microsoftu. Je rýchlejší bezpečnejší a skutočne používa koncepciu inode-ov. Jeho hlavný nedostatok vidím v tom, že podrobnosti o jeho štruktúre nie sú verejne dostupné. Dôsledkom toho je to, že Linux-ový ovládač pre tento súborový systém podporuje len čítanie. Kód pre zápis je označovaný za experimentálny a v súčasnej dobe by mal umožňovať prepisovanie obsahu súborov za predpokladu, že nemeníte ich dĺžku.

WinFS vlastne nie je súborový systém, ale nadstavba nad NTFS, ktorá má umožniť rýchlejšie vyhľadávanie údajov pridaním istej funkcionality z oblasti databáz.

Pozor na to, že súbory, ktorých mená obsahujú znaky mimo ISO-8859-1, nemusí byť pod Linux-om vidno ak nepoužijete príslušnú voľbu pri pripájaní (pre slovenčinu a jadrá 2.4 iso8859-2, pre jadrá 2.6 nls=iso8859-2)

# mount -oro,umask=0222,nls=iso8859-2 /dev/hda2 /mnt/nt
# ls -ld /mnt/nt "/mnt/hd/Documents and Settings/rastos/My Documents/"
dr-xr-xr-x    1 root     root         8192 2003-01-25 17:39 /mnt/nt
-r-xr-xr-x    2 root     root       630784 2003-01-25 18:46 /mnt/hd/Documents and Settings/rastos/My Documents/návod.doc

Príslušný riadok v /etc/fstab potom vyzerá takto:

/dev/hda2	/mnt/nt	ntfs	defaults,ro,users,umask=0222,nsl=iso8859-2	1	0

Unix-ové súborové systémy

Svet Unix-u a jeho klonov je ďaleko bohatší. Nájdeme tu

Jednou z typických vlastností Unix-ových súborových systémov je to, že blok inode-ov (tzv. superblok) má viacero kópií rozmiestnených po disku, ktoré operačný systém udržiava zosynchronizované. V prípade, že dôjde k pádu systému môžete stanoviť, ktorá kópia sa má použiť pri oprave súborového systému.

Keďže najpravdepodobnejšie sa stretnete s operačným systémom Linux, spomenieme situáciu na ňom. Ešte donedávna takmer každý Linux-ový systém používal ext2. Potom ale narástla ponuka žurnálovacích súborových systémov. Preto dnes môžeme bežne stretnúť ext3 (nástupcu ext2) či reiserfs.

Súborový systém Ext2

Ext2 je jeden z najrozšírenejších súborových systémov používaných pod Linux-om. Je to klasický unix-ový súborový systém, podporujúci uchovávanie prístupových práv vlastníka, skupiny a ostatných, podporuje symbolické linky i hard linky, špeciálne súbory atď.

Vlastnosti súborového systému ext2 možno upravovať pomocou programu tunefs. Medzi vlastnosti patrí napríklad percento kapacity, ktoré je rezervované pre užívateľa root. Default hodnota je 5%. Ďalšou vlastnosťou je príznak, ktorý označuje či je daný súborový systém čistý - teda či je konzistentný. Tento príznak sa nastaví na nie pri pripojení systému na zápis a na áno pri odpojení. Ak dôjde k pádu operačného systému, tento príznak zostane nastavený na nie a podľa neho fsck vie či má vykonať úplnú kontrolu alebo nie. (Prepínač -f programu fsck vynúti vykonanie kontroli aj keď súborový systém vyzerá čistý.) Poslednou vlastnosťou, ktorú spomeniem, je počet pripojení, po dosiahnutí ktorého, bude súborový systém označený ako not clean aj keď, k žiadnemu problému neprišlo. Ak sa chcete dozvedieť o ďalších zaujímavostiach ext2, pozrite sa na program dumpe2fs.

Súborový systém UMSDOS

Tento súborový systém je zaujímavý tým, že je založený na FAT Odlišuje sa tým, že dopĺňa do neho vlastnosti typických Unix-ových súborových systémov ako je udržiavanie informácií o vlastníkovi, skupine, prístupových právach a podobne. Tieto informácie sú uložené v súbore --linux-.---, ktorý existuje v každom adresári takéhoto súborového systému. Keď súborový systém UMSDOS pripojíte ako FAT tak tam tento súbor vidíte. Keď ho pripojíte ako UMSDOS tak systém tento súbor skryje, ale zapisuje do neho zmeny vo vlastníctve, prístupových právach a iné atribúty. V prípade, že sa niečo zmení v čase keď tento súborový systém nie je pripojený ako UMSDOS možno údaje v súbore --linux-.--- obnoviť programom umssync Tento súborový systém teda umožňuje použiť existujúci súborový systém FAT ako vlastný Unix-ový súborový systém. To sa často používa pre vyskúšanie Unix-ového systému bez potreby zriaďovať pre neho samostatný súborový systém. Jeho nevýhodou však je nižšia rýchlosť.

Súborový systém ISO9660

Súborový systém ISO9660 je systém, ktorý sa typicky používa na dátových CD-čkach. Hudobné CD-čka majú inú štruktúru a nie je nutné (ani možné) ich pripájať ako súborový systém. Existujú tiež tzv. hybridné CD-čka obsahujúce oblasť v formáte ISO9660 ako aj oblasť hudobnú.

So súborovým systémom sa teda stretneme najskôr keď potrebujeme pristupovať na CD. Základný ISO9660 má obmedzenia na mená súborov hĺbku adresárovej štruktúry a podobne. Tieto obmedzenia obchádza rozšírenie Jolliet. Ďalším rozšírením je El Torito, ktoré umožňuje bootovanie s CD-čka a ďalším je Rock Ridge, ktoré umožňuje ukladanie špeciálnych vlastností ako sú symbolické linky a podobne. V Linux-e je potrebné mať toto rozšírenie zapnuté vo vlastnostiach ovládača pre ISO9660.

Pri napaľovaní CD-čiek sa zvyčajne postupuje tak, že sa vytvorí obraz budúceho CD-čka ako súbor pomocou programu mkisofs a ten sa potom napáli pomocou programu cdrecord. Samozrejme existuje niekoľko programov, ktoré ponúkajú peknú a šikovnú grafickú nadstavbu nad cdrecord-om.

Loopback súborový systém

Ak máte v jadre podporu pre tzv. loopback súborový systém, môžete ako súborový systém pripojiť obraz iného súborového systému zapísaného do súboru. To možno použiť napríklad pre kontrolu obrazu ISO9660 predtým než ho napálite na CD-čko.

# mkisofs -quiet -o test.iso dir/
# losetup /dev/loop0 /tmp/test.iso
# mount /dev/loop0 /mnt/tmp

Program losetup povie systému, že požiadavky systému na zariadenie /dev/loop1 sa presmerúvajú na /tmp/test.iso. Toto presmerovanie by ste mali po skončení používania zrušiť.

# losetup /dev/loop0
/dev/loop0: [0303]:1006721 (/tmp/test.iso)
# umount /dev/loop0
# losetup -d /dev/loop0

Existuje tiež varianta loopback súborového systému, ktorá šifruje dáta, ktoré sa do neho zapisujú a prečítať ich možno len po zadaní správneho hesla pri pripájaní - Cryptoloop. Vytvoriť takýto šifrovaný súborový systém môžete takto:

# dd if=/dev/random of=/file bs=1k count=100
# losetup -e losetup -e aes-256 /dev/loop0 /tmp/file
Password:
# mkfs /dev/loop0
# losetup -d /dev/loop0

Potom ho už možno používať:

# losetup -e aes-256 /dev/loop0 /tmp/file
Password:
# mount -oencryptionn=aes-256/dev/loop0 /mnt/tmp
Password:
...
# umount /dev/loop0
# losetup -d /dev/loop0

Sieťový súborový systém - NFS

Doteraz sme spomínali súborové systémy, ktoré sú fyzicky umiestnené priamo v našom počítači - disk, CD, súbor. Okrem toho, ale existuje aj možnosť pripájania súborových systémov po sieti. Hovorí sa tomu NFS - Network File System. Pri jeho použití treba vedieť, že existuje viacero verzií NFS, že reakcie na prácu so súbormi na NFS závisia na priepustnosti siete a tiež, že prenos dát nie je nijak zvlášť zabezpečený pred útočníkmi.

Pre úspešné používanie musíte mať na klientovi naštartovaný rpc.portmap a rpc.mountd a na serveri rpc.nfsd. Server musí tiež špecifikovať v súbore /etc/exports, ktoré adresáre ponúka.

# cat /etc/exports
/home clnt.domain.org

Tento server ponúka teda adresár /home stroju clnt.

# showmount -e srvr
Export list for srv:
/home clnt.domain.org

Teraz môžete pripojiť systém z druhého stroja:

# mount srvr:/home /home

Zdieľanie v sieti MS Windows - Samba

Ak v sieti máte počítače s MS Windows, pravdepodobne poznáte možnosť pripájania a zdieľania adresárov. Unix-ové systémy tiež podporujú túto funkcionalitu. Implementovaná je v balíku Samba. Pripájanie zdieľaných adresárov je možné v prípade, že máte v jadre podporu pre smbfs (a máte nainštalovanú sambu) pomocou programov smbmount (alebo špecifikovaním typu smbfs za -t po mount).

# smbmount -ousername=rastos \\\\srvr\\share /mnt/tmp
Password:

Swap

Moderné počítačové systémy majú pomerne veľké nároky na pamäť. Pretože diskový priestor je lacnejší než RAM pamäť a využitie všetkej RAM sa nestáva často, operačný systém môže odložiť časť obsahu pamäte, ktorá sa momentálne nepoužíva, na disk. MS Windows odkladá do súboru. Linux ponúka na výber súbor alebo vyhradenú partíciu. Tradične sa používa partícia, pretože je rýchlejšia.

Swap vlastne nie je súborový systém v pravom slova zmysle, pretože neumožňuje ukladanie súborov. Vytvoríme ho programom mkswap:

# mkswap /dev/hda5
Setting up swapspace version 1, size = 201240 kB

Používanie je riadené dvojicou programov swapon a swapoff:

# swapon /dev/hda5
...
# swapoff /dev/hda5

Aby sa swap použil automaticky pri naštartovaní systému môžete mu vytvoriť položku v /etc/fstab

/dev/hda5        none             swap        defaults         0   0

Poslednú otázku, ktorú treba pri používaní swap-u vyriešiť je rozhodnutie o jeho veľkosti. V starších dokumentoch sa dočítate odporúčanie, že by mal byť dva-krát taký veľký ako RAM pamäť. V skutočnosti je to trocha inak. Jediným správnym spôsobom je odhadnúť, koľko virtuálnej pamäte bude systém potrebovať pri svojej činnosti. Ak máte pracovnú stanicu, kde beží tabuľkový procesor či kompilácia menšieho projektu a má 512MB pamäte, je zbytočné nastavovať 1GB swap. Naopak ak pobežíte veľkú databázu nároky na pamäť môžu byť dosť veľké. Takže odporúčam vysledovať koľko pamäte používajú aplikácie, ktoré bežne používate a k tomu niečo pridať. Zvážte, že browser bežiaci mesiac v kuse môže potrebovať postupne viac ako si zoberie krátko po naštartovaní. Zvážte, že za rok prejdete na novšiu verziu aplikácií či správcu okien a podobne a tomu prispôsobte svoj výpočet veľkosti swap-u.

Tipy a triky pre súborové systémy pod Linux-om

Ako skontrolovať či náš systém obsahuje podporu (driver) pre daný súborový systém v jadre?

# cat /proc/filesystems
nodev   sysfs
nodev   rootfs
nodev   bdev
nodev   proc
nodev   sockfs
nodev   usbfs
nodev   usbdevfs
nodev   futexfs
nodev   tmpfs
nodev   pipefs
nodev   eventpollfs
nodev   devpts
        ext3
nodev   ramfs
        msdos
        vfat
        iso9660
nodev   nfs
nodev   nfsd
nodev   cifs
        ntfs
        reiserfs
        udf
nodev   rpc_pipefs

Ak nie, budete musieť túto podporu pridať - buď nahraním príslušného modulu, alebo zakompilovaním príslušného driveru do jadra.

Pripájanie ako neprivilegovaný užívateľ

mount(8) - za normálnych okolností môže súborové systémy pripájať len užívateľ root. Ak súbor /etc/fstab obsahuje pre daný súborový systém voľbu user, môže ho pripojiť ktokoľvek, ale len ten, kto ho pripojil, ho môže odpojiť. Ak chcete aby ktokoľvek mohol odpojiť nejaký súborový systém, dajte mu voľbu users.

Pripájanie len na čítanie

Voľba ro. Používaná napr. pre CD-čka.

Ako zistiť čo sa dá pripojiť z iného servera cez NFS

showmount -e server

Zistenie typu súborového systému?

Linux (a mnohé iné Unix-ové systémy) ponúkajú program, ktorý sa volá file. Tento program používa informácie uložené v /etc/magic aby uhádol čo sa nachádza v nejakom súbore.

file - < /dev/hda6 
standard input: Linux rev 1.0 ext3 filesystem data

Všimnite si použitie parametra - a presmerovanie. Bez nich by program povedal:

file /dev/hda6 
/dev/hda6: block special (3/6)

Otvorenie a zatvorenie CD mechaniky programom

Program eject dá príkaz zariadeniu pre vyhodenie média. Ak na príkazovom riadku nezadáte inak, použije sa zariadenie /dev/cdrom. Ak je súborový systém na médiu pripojený, eject sa ho pokúsi najprv odpojiť. Ak mám pripojenú Iomega ZIP disketu (/dev/sda) môžem ju vysunúť príkazom

# eject /dev/sda

(ZIP disketa sa tvári ako disk. Má partície a zvyčajne obsahuje jeden súborový systém na /dev/sda4, ale príkazu eject musíte dať parameter zodpovedajúci celému zariadeniu, nie partície) Ak to dané zariadenie podporuje, tak prepínačom -t môžete zariadeniu povedať aby si zobralo médium.

# eject -t /dev/cdrom

Ako zistiť, kam bežiaci systém swap-uje

(robené na jadre 2.6.4)

cat /proc/swaps
Filename                                Type            Size    Used    Priority
/dev/hda5                                partition      196520  0       -2