Hlavní navigace

Co před námi tají /proc (14)

30. 8. 2001
Doba čtení: 5 minut

Sdílet

Dneska se vrátíme k souboru s informacemi o připojených discích, který jsme minule přeskočili. Rád bych totiž napsal něco víc, než na co zbýval čas u minulého dílu. Pro detailisty: přešel jsem na jádro 2.4.9!

Jak velí tradice, nejprve výpis základního adresáře /proc. Tečka před názvem znamená, že už to máme za sebou:

  .840     .devices     .kcore   .modules     stat     ide/
  .842     .dma         .kmsg     mounts      swaps    irq/
  .847     .execdomains .ksyms   .mtrr        uptime   net/
  .848     .filesystems .loadavg  partitions  version  nv/
  .apm     .interrupts  .locks    pci         bus/     sys/
  .cmdline .iomem       .meminfo  self@       driver/  sysvipc/
  .cpuinfo .ioports     .misc     slabinfo    fs/      tty/
mounts

Základní informací je, že soubor mounts obsahuje informace o připojených adresářích. Stejné, jako vypisuje příkaz mount:

/dev/root / ext2 rw 0 0
/proc /proc proc rw 0 0
none /dev/pts devpts rw 0 0
/dev/hda2 /home ext2 rw 0 0
/dev/hda1 /mnt/user vfat rw,noexec 0 0
/dev/md0 /mnt/raid ext2 rw 0 0
/dev/fd0 /mnt/floppy vfat rw,noexec,nosuid,nodev 0 0

Vlastní informace zde obsažené nejsou asi příliš záhadné. Každý řádek obsahuje informace o jedné diskové oblasti, respektive o jednom souborovém systému připojeném do (hlavního – kořenového) adresářového stromu. Nejprve je uveden název speciálního souboru, který odpovídá zařízení, na němž jsou umístěna data. Výjimkou jsou speciální (virtuální) souborové systémy. V našem případě se jedná o souborové systémy /proc a /dev/pts. Ty nejsou fyzicky (a perzistentně) umístěny na žádném médiu a mají vyhrazeny speciální hodnoty pro tyto položku (obecně „none“). U ostatních médií se jedná o zařízení, na něž jsou aplikovány vlastní datové operace (jako čtení a podobně). Ještě jednou zvláštností je název speciálního souboru pro kořenový adresář. Položku /dev/root v adresáři /dev nenajdete (alespoň u mne), tato hodnota je sem zapsána natvrdo v případě, že nepoužíváte devfs (fs/super.c:1672).

Krátce vysvětlím jména ostatních zařízení. hdXY je pevný disk (E)IDE. „X“ je písmeno (malé – od „a“ dále) a určuje diskovou jednotku. „a“ je master disk prvního kanálu, „b“ slave, „c“ master druhého kanálu a tak dále. „Y“ je číslo. 0 uznačuje zařízení odkazující na disk jako celek, od jedničky jsou potom jednotlivé diskové oddíly (partitions). Tohle číslo odpovídá vedlejšímu (minor) číslu daného souboru.

fd0 je disketová mechanika. Pokud jich máte více, bude další fd1 a dál.

mdX je speciální soubor pro ovladač RAID zařízení. Ovladač pro softwarový RAID zkombinuje definovaným způsobem více diskových oblastí (obecně na různých discích) do jednoho logického celku. Ten je potom přístupný přes tyto speciální soubory. „X“ je číslo od 0 výše.

Další položkou na každém řádku je adresář, pod kterým je zpřístupněn obsah daného zařízení. To je snad dostatečně jednoznačné, aby byly další komentáře zbytečné. Jen malá poznámka. Pokud vybraný adresář před připojením obsahuje nějaké soubory (podadresáře), jsou tyto po připojení skryty a nepřístupné. Po odpojení se znovu objeví – zpřístupní.

Na řadě je typ souborového systému. Ten určuje ovladač, který spravuje požadavky na operace s příslušnou částí adresářového stromu. Může se opět jednat jak o virtuální souborové systémy (devpts, proc), tak o skutečné systémy pro správu souborů na fyzických médiích. V současnosti podporuje Linux (verze 2.4.9) například tyto souborové systémy: BFS, CODA, EXT2, HPFS, NTFS, SMBFS, NFS, UFS nebo VFAT. Význam zkratek lze (spolu s dalším popisem) nalézt třeba v Documentati­on/filesystem­s/00-INDEX.

Předposlední jsou uvedeny parametry zadané při připojování souborového systému. Základním je typ přístupu: pouze pro čtení – „ro“, nebo čtení i zápis „rw“. Z ostatních parametrů jsou přístupny pouze některé parametry společné pro „všechny“ souborové systémy, a to noexec, nosuid, nodev, mand, sync, nosub, noatime, nodiratime. Zvláštní parametry mohou být ještě pro NFS systémy (hard|soft, posix, tcp|udp, …).

Na konci každé řádky jsou dvě čísla. Jejich hodnota může být 0 (případně nevyplněno) pro vypnutí vlastnosti, nebo 1 (případně vyšší – man fstab) pro zapnutí. První pole udává, zda se bude daná oblast zálohovat programem dump. To druhé určuje chování kontroly programem fsck při startu systému.

To by byl obsah souboru, teď ještě alespoň pár slov k tomu, jak v Linuxu fungují souborové systémy. Aby bylo možné používat různé souborové systémy (na jednom počítači i obecně), je pro zjednodušení psaní nových systémů a přidávání vlastností jako komprese nebo právě RAID definováno v Linuxu jednoznačné rozhraní. To je určeno pro přístup ze strany uživatelských procesů a jmenuje se VFS – Virtual File System. Jedná se o sady funkcí a definicí, které jsou společné pro všechny (nyní opravdu VŠECHNY) souborové systémy. Definuje takové věci, jako základní rozhraní pro operace nad soubory a adresáři nebo způsob udržování informací o těchto objektech – virtuální uzly (v-nodes).

VFS také udržuje tzv. dcache – Directory entry cache. Představte si situaci, kdy chcete otevřít třeba soubor /usr/share/man/cs/ma­n1/echo.1.gz. K tomu je třeba udělat následující. Nejprve musí jádro ze svých tabulek zjistit, na kterém zařízení se nachází oddíl připojený pod kořenový adresář. Potom je nutno z disku načíst superblok tohoto oddílu a z něj určit, kde je i-node popisující kořenový adresář. Potom se načte tolik datových bloků tohoto adresáře, dokud jádro nenajde číslo i-uzlu pro první položku v cestě – tedy adresář „usr“. Tak se to opakuje, dokud se nenajde hodnota i-uzlu pro soubor echo.1.gz. V ukázkovém případě to může být okolo 10 – 12 čtení z disku. To není moc rychlé. Proto jsou klíčové části udržovány v paměti přímo (třeba superblok). Pro jednotlivé adresáře je následně udržována zvláštní vyrovnávací paměť, která mnohonásobně urychlí opakované vyhledávání souborů.

Pro jednotlivé akce je v v-uzlu patřičný odkaz na skutečnou operaci dle typu souborového systému. Implementovat souborový systém vlastně znamená (kromě jiného) definovat a implementovat funkce jako třeba do_open(), do_read(). Jejich adresy se potom uloží do odkazů v odpovídajících v-uzlech. Položka v-uzlu open tak ukazuje na skutečnou operaci do_ext2_open(). Pro jiný soubor může být skutečná operace třeba do_nfs_open().

Není to zase tak složité, jak to na první pohled vypadá. Pokud vás zajímají podrobnosti, doporučuji především Documentation/fi­lesystems/vfs­.txt. Zde najdete poměrně vyčerpávající množství detailů. Pokud nestačí, vždycky máte po ruce přímo zdrojáky :).

Byl pro vás článek přínosný?

Autor článku