Hlavní navigace

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

8. 11. 2001
Doba čtení: 12 minut

Sdílet

Tak a je to tady. Poslední díl našeho putování po tajemných zákoutích adresářového systému /proc. (Bohužel) budeme dnes pokračovat v nasazeném tempu a poslední adresář projdeme také poměrně rychle. Na druhou stranu - základní principy už jsme prošli dříve, tak už to teď půjde samo o sobě rychleji.

Nutno přiznat, že mi poslední dobou nějak dochází dech, respektive čas. Za začátku jsem se snažil pro vás snést modré z nebe, projít zdrojáky do posledního středníku a s každým článkem si hrál i několik dní. Pak začala škola a ostatní povinnosti a s mým volným časem to šlo z kopce. Poslední články už píši během několika hodin (obvykle tak 6–10ti) a na spoustu drobností, kterým bych se rád věnoval, již prostě nemám čas. No, ale teď už si dám pauzu, doženu ostatní resty a časem určitě zase něco napíšu. (Co bych pro vás neudělal, že :)

Tentokrát už by bylo otečkováno opět téměř všechno. Proto raději na tomto místě uvedu výpis obsahu posledního adresáře, který nám zbývá, a to je /proc/sys. Znovu zopakuji, že (od minulého dílu) jsem aktualizoval na jádro 2.4.13!

abi/  debug/  dev/  fs/  kernel/  net/  proc/  vm/
abi

Další z věcí, které se v jádře objevily relativně nedávno. Jako obvykle první pokusy byly v Alanových jádrech (větvi jádra od Alana Coxe – patche s postfixem -ac oproti oficiálnímu Linusovu jádru). Jedná se o způsob, jak spouštět binárky (pro stejný typ procesoru) přeložené pro jiný systém. Příkladem může být požadavek spouštět program přeložený pro Free BSD (x86) pod Linuxem (také na x86). Celý problém je o tom, poskytnout vrstvu, která odstíní části, které se na obou systémech liší. Těmito částmi může být třeba obsluha signálů, různá definice nebo i chování systémových volání a další.

A teď jak to funguje. Pro každý systém musí v Linuxu existovat vrstva, která odstíní rozdíl právě tohoto systému a Linuxu. Této vrstvě se říká ABI (Abstract? Binary Interface). Jedná se o popis rozhraní systému na binární úrovni, tedy tak, jak jej vidí přeložený program. (V komerčních systémech se ABI využívá například k tvorbě ovladačů distribuovaných bez zdrojového kódu – kompatibilita je zajištěna na úrovni přeložené binárky). Pokud jste pravidelnými čtenáři, možná si vzpomenete na díl, kde jsme probírali soubor /proc/execdoma­ins. Ten obsahuje právě podporovaná ABI. Jelikož jednotlivé ABI mohou být velmi podobné, jsou v Linuxu sdruženy do něčeho, co se nazývá execution domain (raději bez překladu). V již zmiňovaném díle jsme se dozvěděli, že Linux (na úrovni definice konstant pro hodnotu personality) podporuje například SVR3, SVR4, BSD, SunOS, Xenix, Irix64 nebo Solaris.

Pokud se podíváme trochu pod pokličku, zjistíme, jak se celý tento systém používá. Každý proces má vlastnost jménem personality, a ta určuje execution domain, ve které je prováděn (byl spuštěn). Až donedávna bylo pro binárky přeložené přímo pod Linu jedinou možností personality = Linux, nyní se začíná postupně pracovat na modulech pro ostatní hodnoty personality. Vlastní moduly jsou zatím pouze v Alanově řadě, případně v úpravách jader jednotlivých distribucí, ale postupně se vše probojovává i do oficiálního jádra. První vlaštovkou je právě probíraný adresář.

Soubory defhandler_xxx udávají personality pro daný formát. Ten je nastaven napevno v kernel/exec­domain.c na Linux pro _elf, SCO SVR3 pro _coff a SVR4 pro zbytek. Zbývají soubory trace a fake_utsname, zobrazující obsah „stejnojmenných“ proměnných, které jsou zatím ovšem nevyužity.

debug

Adresář /proc/debug zvládneme rychle. Obsahuje hromadu debugovacího smetí pro architekturu s390 (ehmm to má přece doma každý, že :) a jednu položku k správě paměti pro ARM. Ani jedno z toho momentálně nemám k dispozici, takže smůla :(.

Jenom mimochodem, při hledání informací k tomuto adresáři jsem narazil na něco, o co byste neměli přijít. Při konfiguraci jádra je možné na konci konfiguračních voleb (menu kernel hacking) zapnout různé dodatečné kontroly a výpisy jádra. Jednou z možností je i Debug memory allocations. Její povolení způsobí přidání dalších informací do souboru /proc/slabinfo a některé další kontroly při správě paměti. Na druhou stranu zvětší jádro a zpomalí jeho běh. Dříve bylo nutno ručně ve zdrojích jádra přepsat hodnotu konstanty SLAB.

A když už jsme u toho, Debug High memory support přidá dvě další kontroly při používání tzv. HIGH paměti (pozor, neplést s DOSem!), Spinlock debugging pak kontroly pro krátkodobé zámky jádra (i když takové podivné – viz include/asm-i386/spinlock.h), Verbose BUG reporting způsobí ukecanější výpisy chyb pro správu paměti (vypíše název souboru a číslo řádky, kde k chybě došlo), Memory mapped I/O debugging nahradí funkce pro přístup k periferiím verzemi s dalším testem na požadovanou adresu, Magic SysRq, aktivuje funkce klávesy SysRq – ta toho umí opravdu hodně, doporučuji dokumentaci v Documentati­on/sysrq.txt.

dev

Dle souboru include/linux/sys­ctl.h využívají tento adresář moduly pro CD-ROM, paralelní port, RAID, monitory HW a MAC HID. Co znamená to poslední, nevím, předpokládám, že něco pro Macintoshe. Já vám neposkytnu popis ani MACu ani RAIDu – nic z toho nemám. První modul využívající tento adresář, který se mi podařilo najít (ono „dev“ se hledá špatně) je balík i2c, respektive sensors. Adresář /dev tak u mne obsahuje podadresáře sensors, cdrom a parport. Pokud máte i jiný obsah, budeme všichni opět rádi, když se s ním pochlubíte v diskusi. Při použití separátního balíku i2c se kromě vlastních senzorů dal po vložení modulu eeprom zobrazit obsah informačních registrů v paměťových čipech DIMM. Nyní s využitím jaderného i2c to nějak nefunguje (zatím :). V adresáři /proc/sys/dev­/sensors najdeme jednak soubor chips, který informuje o zavedených ovladačích pro i2c, a potom vlastní adresář pro každý z ovladačů. Soubor chips u mne vypadá takto:

256     via686a-isa-6000

Jednoduché, že? Název ovladače je zároveň i názvem odpovídajícího adresáře a to číslo v předu je jméno položky. Bohužel v tomto případě to znamená binární ID, takže to příliš užitečné není. Název a hlavně obsah adresáře se už pro jednotlivé komponenty liší, pro příklad uvedu obsah modulu pro HW monitory na desce Abit VP6. Jedná se o komponentu via686a připojenou přes sběrnici ISA. Nevím, zda přímo fyzicky (jinak na desce žádná ISA není), nebo jen logicky s využitím algoritmu pro ISA sběrnici. Obsah adresáře via686a-isa-6000 udává stav HW monitorů na desce:

alarms  fan1  fan2  fan_div  in0  in1  in2  in3  in4
temp1  temp2  temp3

Jednotlivé soubory obsahují většinou tři hodnoty – aktuální, minimální povolenou a maximální povolenou. Jak je patrné z názvů, jedná se o stavy otáček větráčků (fanX), napájecích napětí (inX) a teploměrů (tempX).

Dalším adresářem je cdrom. Ten obsahuje soubory s informacemi a nastavením chování vaší CD-ROMky. Soubory autoclose, autoeject, check_media, lock a debug povolují (obsah 1) nebo zakazují (obsah 0) po řadě automatické zavření resp. otevření dvířek při při- resp odpojení média, testování typu média, zamykání šuplíku s médiem a výpis ladících hlášek. V souboru info najdete několik informací o jednotce a jejích schopnostech (myslím, že tento soubor nepotřebuje zvláštní komentář):

CD-ROM information, Id: cdrom.c 3.12 2000/10/18
drive name:             hdc
drive speed:            48
drive # of slots:       1
Can close tray:         1
Can open tray:          1
Can lock tray:          1
Can change speed:       1
Can select disk:        0
Can read multisession:  1
Can read MCN:           1
Reports media changed:  1
Can play audio:         1
Can write CD-R:         0
Can write CD-RW:        0
Can read DVD:           1
Can write DVD-R:        0
Can write DVD-RAM:      0

Posledním adresářem, který vám můžu nabídnout, je parport. Zde najdete jednak adresář default s implicitním nastavením, a potom jeden adresář pro každý paralelní port (většinou jen parport0). V celé struktuře se porůznu objevují dva základní soubory. To, kde se nacházejí, určuje rozsah jejich platnosti. Vždy jsou v adresáři default, pro celý paralelní port mohou být v parportX a pro jednotlivá zařízení potom v parportX/de­vices/XXX. Těmito soubory jsou spintime a timeslice. První z nich určuje počet mikrosekund aktivního čekání na odpověď periferního zařízení po vyslání příkazu. Vztahuje se vždy na celý paralelní port (najdete ji v default a parportX). Jejím zmenšením je možno zvýšit rychlost komunikace, pokud zůstane stabilní. Druhým souborem je timeslice, udává počet milisekund, které jsou doporučením pro ovladač zařízení, jak dlouho může používat port pro sebe, než vrátí řízení (to má smysl při více zařízeních na jednom portu, což se příliš nenosí a ovladač tuto hodnotu může ignorovat, pokud to považuje za vhodné/nutné).

V adresáři parport/parportX najdete soubory s nastavením daného portu. Předpokládám, že stačí pouze výpisem:base-addr, dma, irq, modes. Poslední zmiňovaný udává použitelné způsoby komunikace:

PCSPP,TRISTATE,COMPAT,ECP,DMA

Také se zde opakuje soubor spintime. Ten je při registraci portu zkopírován z adresáře default a ovladač jej potom může změnit. Vyskytují se zde ještě soubory autoprobeX pro automatické zjištění nastavení portu, ale pokud použijete nastavení přes parametry modulu parport_lowlevel (parport_pc), není zde nic. Pro každý port je také přítomen adresář parport/parpor­tX/devices. Ten obsahuje informace o konkrétním zařízení připojeném na port. Zařízení může být více a každé zde má svůj vlastní podadresář. V souboru active je řečeno, které zařízení je právě aktivní. U mne je to nyní plip0 a stejnojmenný adresář obsahuje soubor timeslice. Ten je opět při registraci zařízení zkopírován z default a ovladač zařízení jej má možnost změnit (a nebo ignorovat).

fs

Tímto se dostáváme k informacím o souborových systémech. Obsah je následující:

binfmt_misc/       file-max     lease-break-time
dentry-state       file-nr      leases-enable
dir-notify-enable  inode-nr     overflowgid
dquot-nr           inode-state  overflowuid

Prvním souborem je dentry-state. V něm jsou ukryté informace o stavu adresářové cache. První je počet alokovaných, následuje počet volných položek, dále pak počet vteřin, po kterých může být položka uvolněna v případě nedostatku paměti. Zbytek jsou napevno nuly. Příkladem:

5636    5020    45      0       0       0

Další dvojicí souborů jsou informace o kvótách. Vždy je přítomen dquot-nr, v něm jsou po řadě počet alokovaných a počet volných záznamů kvót. V mém případě obě nulové. Pokud jsou kvóty k dispozici, je zde ještě dquot-max s maximálním počtem položek této cache. Opět lze nastavit zápisem do souboru. Obdobně funguje i dvojice file-nr a file-max. V souboru file-nr je opět počet alokovaných, počet volných a maximální počet popisovačů souborů. Maximum lze opět číst a nastavit přes file-max. Opět obdobnou funkci má soubor inode-nr (alokované prvky cache i-uzlů a volné). V souboru inode-state mají první dvě položky stejný význam jako v inode-nr, třetí je rozdíl aktuálního počtu položek v cache a maximálního počtu. Toto číslo je větší než nula v případě, že je cache přeplněná. Protože Linux alokuje objekty do cache po stránkách (díl o /proc/slabinfo), může být alokováno více než povolené maximum. Zbytek jsou opět nuly.

Dvojice souborů overflow[gid|uid] udává maximální přípustné GID respektive UID pro vlastnictví souborů.

dir-notify-enable umožňuje povolit (1) nebo zakázat (0) oznamování změn v adresářích (jako vytvoření, smazání souboru, zápis nebo přístup k souboru). Programově se to provádí pomocí (v man zatím nedokumentovaného – RH7.0CZ) volání fcntl(F_NOTIFY). Stejně tak leases-enable ovládá povolení nebo zakázání souborových zámků typu lease.

Adresář binfmt_misc obsahuje rozhraní pro podporu cizích binárních formátů. Toho se využívá například při emulaci pomocí wine. Pokud chceme, aby se windowsovská binárka spouštěla stejně jako Unixová (zadáním jména z příkazové řádky atd.), zaregistrujeme binární formát Windows a jako interpretr mu přiřadíme Wine. Stejně to může fungovat s dosovými aplikacemi a Dosemu nebo třeba i se skripty libovolného skriptovacího jazyka (zde je ovšem asi lepší konstrukce #!/bin/interpre­ter). Soubory se dají rozpoznávat pomocí hodnoty prvních několika bajtů nebo třeba přípony. Po zaregistrování pro Wine vypadá obsah následovně:

register  status  windows  windowsPE

soubor register slouží k registraci nových formátů, zapsáním řádku (s požadovaným formátováním) se přidá další formát. status obsahuje „enabled“. Zbytek jsou informační soubory pro jednotlivé formáty. Příkladem třeba windowsPE:

enabled
interpreter /usr/bin/wine
offset 0
magic 5045

Zde je vidět interpreter (v tomto případě spíše řekněme zavaděč) a způsob identifikace. V našem případě se kontroluje hodnota 5045 na začátku souboru (offset 0).

Ještě mi nedá, abych neupozornil na malou „zradu“ v posledních jádrech. Nyní je třeba souborový systém binfmt_misc ručně připojit! Například touto řádkou do fstabu:

none   /proc/sys/fs/binfmt_misc   binfmt_misc   gid=5,mode=620  0 0
kernel

Na tomto místě je možné najít základní konfiguraci jádra Linuxu. Je toho tu proto docela dost:

cad_pid         msgmax         printk       tainted
cap-bound       msgmnb         random/      threads-max
core_uses_pid   msgmni         rtsig-max    version
ctrl-alt-del    osrelease      rtsig-nr
domainname      ostype         sem
hostname        overflowgid    shmall
hotplug         overflowuid    shmmax
modprobe        panic          shmmni

Začneme pěkně podle abecedy. První dva soubory jsou přístupné pouze pro superuživatele. cad_pid udává číslo procesu, kterému je v případě zakázání restartu pomocí kombinace CTRL-ALT-DEL poslán signál SIGINT. Standardně je to proces s PID rovno 1, tedy init. Zda je povolen restart, nebo ne, udává hodnota (1=povolen, 0=zakázán) v souboru ctrl-alt-del. Ovšem pozor, standardně je tento restart zakázán, a tak je informován init, který potom podle /etc/inittab spustí klasickou ukončovací sekvenci s vypínáním procesů atd. Pokud je naopak tento restart povolen, provedou se pouze speciálně zaregistrované operace v jádře (funkce register_rebo­ot_notifier()). Tuto registraci provádějí především různé ovladače, které potřebují před restartem nastavit své zařízení do takového režimu, aby se příště opět úspěšně zavedlo a inicializovalo. Příkladem mohou být zvukové karty maestro, některé ovladače k SCSI zařízením nebo některá RAID zařízení.

Další soubor se jmenuje cap_bound. Ten udává masku dostupných oprávnění (capabilities). Takovým oprávněním může být například CAP_SYS_RAWIO pro přímý přístup k diskovým zařízením, CAP_SYS_MODULE pro manipulaci s moduly jádra nebo CAP_SYS_CHROOT pro provedení systémového volání chroot().

Soubor core_uses_pid je další přepínač. Pokud je zapnut (1), jádro při vytváření core souboru připojí i číslo PID rušeného procesu. To, že víte, jaké měl proces PID, třeba až tak nepomůže, ale hlavně pokud spadne více procesů zároveň, core se nepřepíše a budou k dispozici všechny.

domainname a hostname udávají jednoduše příslušná jména počítače.

hotplug obsahuje název procesu (standardně /sbin/hotplug), který je spuštěn poté, co byla detekována změna konfigurace na takových rozhraních jako USB. Ten má potom za úkol provést de/inicializaci daného (USB) zařízení. Stejně tak modprobe obsahuje umístění příkazu modprobe. Ten je potřeba při automatickém nahrávání modulů on-demand přes kmod.

Skupina souborů msgmax, msgmnb a msgmni nastavuje chování vrstvy jádra pro zasílání zpráv. První udává maximální velikost jedné zprávy, druhý maximální počet zpráv ve frontě. Poslední udává maximální počet identifikátorů front zpráv = tedy počet front. Podobné je to pro segmenty sdílené paměti. shmmax obsahuje maximální velikost sdíleného segmentu, shmmni maximální počet segmentů v systému a shmall počet stránek, které je systém celkově schopen poskytnout jako sdílenou paměť. U semaforů je vše jednodušší a vše je v jednom souboru – sem, který obsahuje čtyři čísla. První udává maximální počet semaforů na proces, druhé maximální počet semaforů v systému, třetí maximální počet operací pro jedno volání semop() a poslední maximální počet identifikátorů semaforů.

No už to není podle abecedy, ale nevadí. Další skupinou jsou informace o verzích systému. Sem patří osrelease, kde je verze jádra (v mém případě 2.4.13), ostype, kde je Linux, a version, kde je datum kompilace (#2 Po říj 22 19:57:20 CEST 2001)

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

Autor článku