Linux E X P R E S

Facebook

Proč máme /proc?

Někteří již dobře vědí, kam článek míří, jiní si pouze nesměle vzpomínají na své první pokusy s Linuxem a objev adresáře /proc. A právě zejména pro druhou skupinu čtenářů je tento článek. Věřím ale, že i ta první si najde zajímavou informaci. David Kovář .


Psal se rok 1984 a v horkých červnových dnech se konala konference v Salt Lake City. A právě na ní předvedl Tom Killian svou novou vizi: zobrazování procesů jako souborů, která byla poprvé uvedena v osmé edici systému UNIX.

Základní informace o souborovém systému /proc a některých jeho souborech je uložen v manuálových stránkách. Stačí zadat příkaz man 5 proc.

Lehký rozjezd

Nejdříve je dobré se podívat, jestli je souborový systém /proc přítomen. Do konzole napište příkaz mount | grep proc a vyskočí na vás minimálně jeden řádek, na kterém bude:

none on /proc type proc (rw)

Všimněte si první položky none. Zde by mělo být uvedeno hardwarové zařízení, na kterém souborový systém sídlí. Tady je však jasně vidět, proč se mu říká virtuální. Nepotřebuje žádné zařízení, žádný hardware. Jedná se pouze o "okénko", kterým se dá nahlížet do jádra systému. Poslední položka říká, že souborový systém je přístupný jak ke čtení, tak pro zápis (rewritable). Pomocí něj tedy může uživatel root měnit parametry běžícího jádra, a tak ovlivňovat jeho chování.

Počátkem 90. let se Roger Faulker a Ron Gomez zasloužili o to, že byl tento systém portován na UNIX System V. Prvním systémem, který použil podadresáře v procfs, se stal BSD 4.4. Konečně i Linuxu patří jedno prvenství. Až v Linuxu se totiž začal adresář /proc používat i na exportování obecných dat, která se procesů netýkají.

Protože se jedná o virtuální souborový systém, všechny adresáře a soubory jsou v něm virtuální. Když skočíte do adresáře /proc, tak kdykoli dáte příkaz ls, musí jádro znovu vygenerovat seznam, který se vám objeví. Stejně tak když si necháte vypsat obsah nějakého ze souborů, jádro vám vrátí aktuální sadu dat. Zkuste si například opakovaně spustit příkaz cat /proc/interrupts a zjistíte, že pokaždé bude vypsán jiný obsah. Například u položky timer se počet přerušení mění velmi významně.

Dalším zajímavým poznatkem je, že když zadáte například ls -l /proc/uptime, objeví se takovýto podivný řádek:

-r--r--r--  1 root root 0 zář 19 08:20 uptime

Velikost je 0, přesto když si zobrazíte obsah, něco "uvnitř" je. Kdykoli spustíte tento příkaz, čas modifikace se změní na aktuální čas. Z pohledu faktu, který jsem uvedl v předchozím odstavci, to už ale není taková záhada. Tento soubor je virtuální a ani na jeho obsah, ani na něj samotný nelze pohlížet jako na standardní soubor. Jeho obsah se vytvoří při vypsání, tedy nelze určit jeho délku a i pojem čas poslední modifikace je zavádějící.

Možná se to bude zdát divné, ale práci tohoto souborového systému je možné vypnout. Při kompilaci jádra se totiž rozhodujete, jestli chcete povolit položku CONFIG_PROC_FS (vytváří souborový systém /proc v jádře) a CONFIG_SYSCTL (modifikace se projeví bez restartu). Na většině distribucí jsou tyto položky implicitně zapnuty a vám, pokud si kompilujete své jádro, také doporučuji tyto volby zapnout, pokud nevíte přesně, jaké budou důsledky, protože je spousta programů, které jsou na těchto souborech závislé.

V džungli souborů

Objekty, které se zde nacházejí, lze rozdělit na dvě základní skupiny: informace o procesech a obecné informace. Informace o procesech lze poznat jednoduše. Jsou uloženy v adresářích, které mají číselné označení. Každý proces má své informace uložené v jednom z adresářů, kde jméno adresáře odpovídá právě PID procesu. Najdete zde vše, co si jádro o procesu udržuje. Obecné informace jsou uloženy v adresářích s běžnými textovými názvy. Například v adresáři bus jsou informace o jednotlivých sběrnicích, v net o síti, ve sysvipc o aktuální komunikaci mezi procesy na úrovni System V atd.

PID je zkratka od Process IDentifier a jedná se o jednoznačný identifikátor procesu. Zjistit PID procesu je velice jednoduché. Jestliže si tedy spustíte příkaz ps -aux, vypíše se vám na standardní výstup seznam všech běžících procesů. Právě ve druhém sloupci máte ono magické PID. Tento identifikátor lze získat také ve většině grafických prostředí ve Správci procesů, jak vidíte na obrázku 1. Entropie je matematický výraz udávající míru neuspořádanosti systému. Čím větší je entropie, tím více je systém náhodný.

Image

Pár rad navíc

První z několika adresářů, o kterých se zmíním, je asound. V něm se nacházejí všechny informace a nastavení týkající se zvukového subsystému ALSA. Ze souboru /proc/asound/version je možné zjistit, zda je systém nainstalován a v jaké verzi. Za zmínku stojí ještě tyto soubory:

  • cards - seznam všech zvukových karet v počítači (pro správnou funkci musí být alespoň jedna);
  • devices - seznam všech zařízení na jednotlivých kartách (časovače, sekvencery, capture/playback zřízení apod.);
  • pcm - seznam zařízení provádějících AD převod (zjednodušeně analogové vstupy).

Pro každou kartu, jak integrovanou, tak zásuvnou, zde existuje jeden adresář card následovaný pořadovým číslem v počítači. V tomto adresáři najdete všechny informace vztažené k dané kartě. Například:

  • codec97/ac97 - podrobné parametry karty (3D zvuk, maximální vzorkovací frekvence, modem...);
  • pcm0p - stav přehrávání PCM streamu na této kartě.

Pokud používáte určitý druh aplikací (např. quake, wine apod.), zvláště jestliže používají kartu v MMAP módu, nemusí se vám s OSS emulací ozvat zvuk. Tradičním řešením je oznámit zvukovému subsystému ALSA, že nemá při přehrávání používat pluginy, ale přehrávat přímo. Provede to příkazem:

echo "quake 0 0 direct" > /proc/asound/card0/pcm0p/oss

Je dobré také zcela vypnout capture stream (nahrávání z mikrofonu) pomocí tohoto:

echo "quake 0 0 disable" > /proc/asound/card0/pcm0c/oss

Opustíme ale zvukový subsystém, který je jistě zajímavý, nicméně by nám jinak nezbylo místo na tajuplné informace o samotném jádře:

  • /proc/sys/fs/file-nr - trojice čísel popořadě udává počet otevřených souborů, počet aktuálně používaných souborů (probíhá nějaká operace), maximální počet otevřených souborů;
  • /proc/sys/kernel/panic - počet sekund, po které systém čeká, než se restartuje po přijetí signálu panic (je-li zde 0, automatický restart neproběhne);
  • /proc/sys/kernel/random - zde lze upravoval chod generátoru náhodných čísel (popis jednotlivých souborů najdete v man 4 random);
  • /proc/sys/kernel/overflowuid a overflowgid - udává nejvyšší ID uživatele a skupiny, tedy maximální počet uživatelů, kteří mohou být na počítači vytvořeni.

V dnešní době, kdy je zabezpečená komunikace po internetu nutností, je také nutností mít kvalitní generátor náhodných čísel, aby šifrování nebylo napadnutelné. Linux používá dva generátory. Pseudonáhodný, kdy jsou "náhodné hodnoty" vypočítávány pomocí exaktních matematických formulí, a kvalitnější, vygenerovaný ze zachycených nepředvídatelných jevů. Kdykoli totiž něco čtete z disku, píšete na klávesnici, ovládáte myš, generátor si z těchto nepředvídatelných jevů vytváří zásobu náhodných čísel.

Velice obsáhlý popis jednotlivých souborů a adresářů, které se zobrazují v adresáři /proc, můžete najít na Rootu.

Jejich množství lze zjistit ze souboru /proc/sys/kernel/random/entropy_avail. Je zde jedno číslo udávající počet bitů dostupné entropie (tedy kolik náhodných bitů dokáže generátor vrátit). Kdykoli přečtete náhodná čísla z /dev/random, například pomocí příkazu

dd if=/dev/random count=1 | xxd

jádro poskytne požadovaný počet bajtů a hned je z entropie vyhodí. Podíváte-li se teď do souboru entropy_avail, bude hodnota menší. Chcete-li vygenerovat několik dlouhých klíčů, bude potřeba dostupnou entropii vytvořit. Zadejte příkaz

cat soubor.zip > /dev/random

v ideálním případě nahraďte soubor.zip souborem vygenerovaným opravdu náhodným generátorem čísel. Velikost entropie v souboru entropy_avail vzrostla. Teď již je možné generovat opravdu náhodné klíče.

Informace úzce spjaté se sítí jsou exportovány v adresářích /proc/net a /proc/sys/net. Nejprve pohled do prvně uvedeného adresáře, kde se skrývají spíše statistické informace:

  • dev - v přehledné tabulce ukazuje pro každé zařízení informace o přijímací i odesílací frontě;
  • ip_contrack - zajímavý soubor obsahuje seznam právě navázaných spojení (včetně zdrojové a cílové adresy, portů, protokolu, doby).

Mnohem zajímavější je adresář v pořadí druhý. Je rozdělen do podadresářů ipv4, ipv6, tokenring atd. podle podporovaných protokolů. Většina souborů zde slouží pro úpravu chování komunikace po tom kterém protokolu a představují vždy jednu vlastnost. Pak zápisem 1 do tohoto souboru se vlastnost povolí, zápisem 0 se zakáže.

  • ipv4/ip_autoconfig - udává, jestli se síť konfiguruje automaticky pomocí RARP, BOOTP, nebo DHCP;
  • ipv4/ip_default_ttl - maximální počet přesměrování, které paket přežije (omezení průměru sítě);
  • ipv4/ip_local_port_range - rozsah portů (jsou uvedena dvě čísla, dolní a horní hranice), které jsou náhodně přidělovány jako lokální odchozím spojením (hodí se při provozu FTP za NAT);
  • ipv4/conf/accept_redirects - říká jádru, jestli má přijímat zprávy ICMP Redirect (tedy, oznámení o kratší cestě v síti - při použití proxy ARP nevhodné);
  • ipv4/conf/proxy_arp - zapne proxy ARP.

Může se stát, že máte doma dva počítače a chcete, aby oba byly připojeny do internetu přes jednu přípojku. Kompletní postup zde nečekejte, ale i zde přijdou ke slovu soubory ze souborového systému /proc. Chcete-li, aby pakety přicházející z internetu do skrytého počítače (tedy ten, co není přímo připojen) prošly až k cíli, je nutné krom nastavení forwardingu v iptables také IP forwarding povolit. To provedete pomocí příkazu

cat "1" > /proc/sys/net/ipv4/ip_forwarding

Naopak, jste-li připojeni přes komutovanou linku a poskyvovatel vám dynamicky mění IP adresu, budete o tom muset informovat jádro pomocí příkazu

cat "1" > /proc/sys/net/ipv4/ip_dynaddr

Ještě jedna rada na závěr. Pokud nevlastníte zrovna server, nemusíte se bát tyto soubory měnit (pokud je to možné a samozřejmě pod uživatelem root), neboť po restartu se vše vrátí do původního stavu.

Diskuze (0) Nahoru