| Podpora a zdroje > Návody, tipy a triky |
| Vyhledávání v Logách a základní použití RE .. |
| (1/3) > >> |
| nettezzaumana:
Fujtajbl vespolek.. dnes si povíme o logování v Linuxu a způsobech, jak díky němu odhalit příčiny mnoha běžných problémů.. Na příspěvku jsem si dal docela dost práce, ale pokud ho dočtete do konce, nebudete zklamáni, protože v samotném závěru se na vlastní oči přesvědčíte, že i vy se můžete dostat až přímo k srdci problému, protože abych demonstroval co jsem zde napsal, demaskoval jsem v rámci tohoto návodu a hledání v logách kernelový bug na svém ntb.. ;) --------------------------------------------Intro -- Úvod do Logů-------------------------------------------- Co to je to Log? Log bohužel není dle rozšířené představy ono samotné hlášení, ale je to až výstup z programu (nebo fce), který tato hlášení zachytává a obvykle následně zapíše do souboru a uloží na místo k tomu určené. Nejrozšířenější logovací démon je syslogd/syslogd-ng // new generation //, který se specializuje na zachytávání hlášení kernelu a jeho modulů. Stejně tak i většina ostatních programů má určité logovací funkce, která zachytávají hlášení ze stdout (standartní výstup) a zapisují je do souboru na disk.. Log je tedy seznam interních hlášení programu o tom, co provádí a jeho případné upozornění na chyby a problémy za běhu.. Logy v Linuxu jde v zásadě rozdělit na 2 skupiny :: 1) Hlášení jádra: "ukecanost" kernelu jde změnit předáním parametru 'loglevel=n' při bootu systému. Místo 'n' se dává číslo v rozsahu 0-7, přičemž 0 je žádná hlášení a 7 je nejvyšší míra "ukecanosti". Defaultní hodnota je AFAIK 'loglevel=3' .. Hlášení jádra při bootování obstarává log jménem 'dmesg' (/var/log/dmesg) .. Ostatní logování zajišťuje typicky syslog (/var/log/syslog, /var/log/messages, ..) .. Pokud by nám nestačila základní logovací schopnost kernelu, můžeme při jeho ruční kompilaci zaškrtnout položky "extra debugging symbols" v sekci "kernel hacking" a nebo většina distribucí nabízí předkompilované jádro s touto volbou, které obvykle bývá označeno linux-2.6.x-debug .. 2) Všechna ostatní hlášení zbývajících programů: obvykle se jedná o často konfigurovatelné funkce konkrétních programů, které z konvence zapisují hlášení o běhu do /var/log (aka Xorg.log, vsftpd.log aj), ale i různě jinam. Některé externí programy se přímo kompilují s podporou knihoven syslogu -- překvapivě to je <syslog.h> Pokud tedy na našem běžícím systému identifikujeme nějaký problém, bývá užitečné zaslídit v logách, které by nám mohly napovědět a nebo rovnou pomoci diagnostikovat danou závadu. Tento článek budiž malý úvod i s příklady, jak vyhledávat v logách a jak diagnostikovat problémy. Protože budeme pracovat s příkazovým interpretem, zopakujeme si v první části základní příkazy, které pro vyhledávání použijeme.. V rámci těchto příkladů si zopakujeme některé základní a jednoduché regulární výrazy, shellové struktury a přesměrování, která se pokusím srozumitelně popsat. Ve druhé části se podíváme a popíšeme si možnosti při diagnostikování a řešení samotných problémů. A nakonec ve třetí části demaskujeme kernelový bug nejen v syslogu, ale navíc přímo ve zdrojácích kernelu.. --------------------------------------------První část -- Syntax Reference-------------------------------------------- $ man cat // příkaz cat je jeden z nejzákladnejších unixových příkazů a vypíše obsah souboru, ale umí i mnoho dalších věcí.. $ cat -n /etc/X11/xorg.conf // vypíše xorg.conf a očísluje řádky $ cat /dev/cdrom &>image.iso // vytvoří z Vašeho cdčka image.iso $ cat <<'EOF'>file.txt // editor pro drsňáky pomocí cat. Otevře soubor pro zápis a ukončí ho napsáním a odklepnutím 'EOF' (End-Of-File) .. hodí se například v případě, že potřebujeme 'ohackovat' modem od o2, na který se sice přes telnet přihlásíme, ale který z bezpečnostních důvodů neobsahuje žádné nástroje pro práci s textem.. $ man grep // filtr pro vyhledávání. Příkaz grep je jeden z nejmocnějších unixových příkazů. Pokud hledáme něco konkrétního v dlouhém textovém souboru, je nenahraditelný. Dáte-li mu parametr "-E", bude fungovat jako 'egrep' (enhanced grep) a vstupní filtr bude automaticky považovat za regulární výraz (dále jen 'RE' aka 'regular expression' -- viz níže) a ne jako prostý 'řetězec'.. Nuže do toho.. grep se typicky používá v souvislosti s 'přesměrováním' : $ dmesg | grep 'error' // vypíše všechny řádky, na kterých je výraz "error" (pozor - case sensitive) z příkazu dmesg. $ cat /var/log/syslog | grep -E 'error|Error|ERROR' // jako výše uvedený příklad, akorát zde jsem použil egrep a konstrukci OR (samotný grep OR neumí, a onen 'výraz' by považoval za prostý řetězec k vyhledání, takže parametr "-E" je zde nezbytný) pomoci znaku "|", která nám zajistí výpis řádků s rozdílným zápisem výrazu "error" (aka "Error", "ERROR", etc..). !! Pro pochopení a používání RE je nezbytné, abychom si zapamatovali význam znaků "|" a "\" (escapování -- viz. níže). Je to důležité proto, že složitější RE vypadá často dost nečitelně, ale navyknete-li Vaše oko automaticky participovat části výrazu oddělené |, čitelnost a srozumitelnost se náležitě zvýší. Stejně platí u escapování: \ vypadá často dost "matoucně", ale v 95% případů escapuje znak za ním, který je pak většinou důležitý.. $ grep -Erv 'error' /var/log // parametr '-r' způsobí, že prohledá složku /var/log rekurzivně, '-E' už známe a v tomhle případě není třeba, protože nepředáváme RE, ale jednoduchý řetězec "error" a nakonec parametr '-v' způsobí, že naopak vyřadí všechny řádky obsahující tento výraz, takže vlastně toto byl příklad naprosto neužitečného vyhledávání, protože všechny řádky s výrazem "error" jsou nám zapovězeny.. $ grep -Ev '^#|^;|^$' /etc/samba/smb.conf // podobný příklad jako výše. V tomto případě už používáme opravdové RE a volba '-E' je tedy nutná. Tento příkaz vypíše obsah souboru smb.conf a vyřadí z něj všechny komentáře a prázdné řádky (řádky začínající znaky "#" a ";") .. V této souvislosti si zapamatujeme dva metaznaky v regulárním výraze, a sice "^" -- začátek řádku, a "$" -- konec řádku. Takže například: $ ls . | grep -E '\.sh$' // způsobí, že výstup z příkazu 'ls .' filtrujeme grepem a zajímají nás v tuto chvíli všechny položky končící ".sh" .. Všimněte si také, že máme použitu konstrukci '\.', což znamená, že díky znaku "\" jsme vyescapovali další metaznak v regulárních výrazech a sice "." (escapovaním jsme ji nepoužili jako metaznak, ale jako klasický znak v řetězci), která znamená libovolný jeden znak. Takže teď je nám jasné, že pokud bychom chtěli najít v nějakém souboru řetězec "..^$^..", budeme muset zadat následující výraz '\.\.\^\$\^\.\.' aby se nám naše znaky interpretovaly jako znak v textu a ne jako metaznak RE. Takže.. $ prikaz | grep -Ev '^.$|^\.' // ..v tomto případě vyřadí grep z výstupu prikazu všechny řádky na kterých je pouze jeden libovolny znak vč. mezery a dále všechny řádky začínající tečkou .. Dále si ukážeme, jak vyhledávat komplikovanější řetězec pomocí opakování žolíkového znaku tečky: $ prikaz | grep -E 'ACPI.*(error|Error|ERROR)' // vyhledá všechny řádky na nichž je výraz 'ACPI' následovaný libovolným řetězcem a dále slovem "error", "Error" a nebo "ERROR" (např. řetězec "ACPI is ERROR"). Všimněte si zde použití kulatých () pro "vložený výraz" a dalšího metaznaku "*", který znamená libovolné množství opakování předchozího znaku, takže například '^.*$' je elementární příklad pro řádek s libovolným obsahem, takže $ '^a*x.*\.mp3$' je výraz pro vše co začíná "a" a jako další znak je neomezený počet dalších "a", následovaný jedním "x" a dalšími libovolnými znaky a končící ".mp3" (např. "aaxyz.mp3", ale už ne "aabxyz.mp3").. Je jasné, že chceme-li vyhledat výraz "*.mp3", musíme použít '\*\.mp3'.. !! Při použití * musíme výraz omezit jako '^vyraz*$' (začátek a konec řádku) Nyní v rychlosti předvedu ještě jednu konstrukci pomocí "[]" na výše uvedených příkladech.. $ prikaz | grep -E '^[0-9]{2,3}\.' // vyhledá ve výstupu příkazu všechny řádky začínající na 2-3 znaky dlouhý řetězec čísel následovaný tečkou -- takže např. začátek ip adresy .. tyto závorky [] se používají k přesnému vymezení znaku, a buď se do nich dá rozsah ala: '[0-9]'" jako všecha čísla, '[a-n]' jako písmena v lowercasu v rozsahu a-n, '[a-zA-Z]' jako rozsah pro celou abecedu bez národních znaků jak kapitálkama, tak malým písmem, '[#;@]' jako skupina znaku "#", ";" a "@" (takže výše uvedený příklad na vyřazení komentářů ze smb.conf jde udělat i takto grep -Ev '^[#;]').. $ prikaz | grep -A2 -B2 'prdlajz' // oddychový příklad na závěr, kdy grep navíc vypíše po dvou řádcích před (-B // aka before) a po (-A // aka after) kontextu "prdlajz" .. $ man tail // zobrazí jenom konec souboru, defaultně 10 řádků $ man head // zobrazí začátek souboru, o5 defaultně 10 řádků.. Když pro oba tyto příkazy použijeme přepínač "-n x", kde x je číslo, zobrazí se nám požadovaný počet řádků, takže: $ dmesg | tail -n 25 // zobrazí posledních 25 řádků z dmesg !! Cykly, které si předvedeme, rozhodně doporučuji vyzkoušet a pokusit se je pochopit. Cykly jako takové nebudu popisovat. Prostě je zkuste a pohrajte si s nima -- případně použijte google. Nyní se podíváme na elementární použití a zápis cyklů na jeden řádek: $ for x in klaus topolanek paroubek bursik; do echo "$x"; done // základní zápis cyklu for $ for x in $(ls ~); do echo "$x"; done // stejný zápis jako o řádek výše, akorát že jednotlivé elementy zde nemáme ručně, ale dostaneme je z příkazu 'ls ~' .. Cykly jdou samozřejmě kombinovat: $ for x in $(ls /etc); do if [ ! -d "/etc/$x" ]; then echo "$x"; fi; done // zde to po rozboru na řádky vypadá takto: // for x in $(ls /etc); do // "pro proměnou x obsahující výstup jednoho řádku při provádění 'ls /etc' // if [ ! -d "/etc/$x" ]; then // "ověř, není-li řádek adresář. Pokud je, podmínka se nesplní a následuje další kolo.. // echo "$x" // "..a není-li, tak nám vytiskni jeho jméno v aktuálním kole jako proměnnou "$x".. // fi // done $ for ((x=1;x<10;x++)) { echo "$x"; } // C-like syntaxe pri dalším typickém nasazení for.. $ echo $PATH | awk -F: '{ for(x=1;x<NF+1;x++) { print $x; }}' // použití for s příkazem awk. Zde je použit přepínač "-F" (file separator) s hodnotou ":", který nám rozdělí $PATH na pole oddělená ":" a v každém průběhu cyklu vytiskne jedno pole. Za zmínku stojí proměnná "NF", což je interní proměnná příkazu awk (viz. 'man awk' a sekce built-in variables) a znamená "Number of Fields". Jedničku přičítáme abychom vytiskl i poslední člen, jinak bychom místo "<" (menší než) potřebovali "=<" (menší nebo rovno) .. $ while :; do clear && cat /var/log/syslog | tail -n 20 && sleep 2; done // takže zde si vytvoříme cyklus while, který probíhá dokud ho ručně nestopneme a zobrazuje nám v realtimu nové zápisy v syslogu na posledních 20 řádcích s obnovením jednou za 2 sekundy .. Zde si všimněte mého zápisu prikaz1 && prikaz2 && prikaz3 a vyzkousejte sami rozdil mezi: $ sleep 100; echo "cucis, co.." // spusťte tento příkaz a hned ho stopněte pomocí Ctrl+c $ sleep 100 && echo "no, a ted uz nemas ani nac.." // dtto --------------------------------------------Druhá část -- Slídění v logách-------------------------------------------- Slabé chvilky systému se dělí na dvě kategorie : a) na transparentní == kdy máme záznam ze situace jak systém a nebo jeho část selhala .. b) a všechny ostatní == kdy kritická situace z nějakého důvodu zalogovaná není a nebo jsme ji ještě nenašli, a nemusí být tedy na první pohled patrné, o co přesně běží .. Setkáme-li se s první kategorií, není co řešit. Obvykle proženeme googlem "ukořistěnou hlášku" (někteří se však neobtěžují a rovnou běží na zdejší fórum) a pak je jen otázka času, kdy se nám podaří daný problém opravit.. Na druhé kategorii je optimistické to, že je možnost, že se změní v první tím, že po nějaké době přijdeme na kámen úrazu a můžeme ji začít řešit výše zmíněným způsobem. Takže setkáme-li se s problémem, provedeme kroky, jejichž výsledek by měl být následující: 1) Zjistit co se stalo, zajistit inkriminovanou hlášku a determinovat problémovou část.. 2) Obstarat si reference k problému z netu, manuálu a nebo od třetí osoby -- a nebo jsme-li dobří, zajistit si reference sami. 3) Na základě získaných referencí problém odstranit -- je-li samozřejmě známo jak na to (HOWTO).. 1) Zamyslíme se ;) .. Je třeba určit základní kategorii problému -- ?kernel, ?konkrétní aplikace ?možná miskonfigurace. Máme-li štěstí a chybová hláška se nám ukáže sama a problémem je miskonfigurace (ať už po našem zásahu a nebo vinou distribučního nastavení balíku), lze to vyřešit. Nemáme-li štěstí a potkáme hlášku "core dumped" a nebo "buffer overflow", je chyba přímo v kódu programu a jedná se o Bug. Také se může stát, že nemáme z čeho soudit a v tom případě se vrhneme na prohledávání logů. Samozřejmě platí, že použijeme všech dostupných prostředků (nepomůžou-li logy, zeptáme se internetu) 1.1) padá-li nám konkrétní aplikace, spustíme jí z terminálu, kam aplikace rovnou vypisujou zprávy o svém chodu. Jako první věc můžeme zkontrolovat manuálovou stránku, jestli program podporuje volbu "verbose" (zvýšení výřečnosti). Obvykle to bývá parametr "-v" nebo "-V". V případě potřeby (nesmyslně dlouhého a nebo nepřehledného outputu) můžeme použít program 'tee', který zdvojuje stdout a dovoluje nám ho duplikovat i do souboru: $ man tee && firefox | tee firefox.log // vytvoří v aktuálním adresáři soubor firefox.log $ man strace // mocnej diagnostickej příkaz. Nebudu ho tady nijak rozebírat, je to v manpage. Příklad: $ strace -e trace=open firefox // vypíše všechny soubory, které firefox otevřel.. Samozřejmě zkontrolujeme, zda-li program má svůj Log a ten prohlédneme.. -- výsledek by měl být zajištěná hláška o chybě.. 1.2) Padá-li nám kernel je situace horší. Můžeme v úvodu popsaným způsobem zvýšit při bootu jeho ukecanost. Můžeme v případě potřeby použít -debug jádro. Každopádně v tomto případě slídíme klasickými metodami v logách. Extrémně užitečné se zde jeví otevřít si realtimové sledování vybraného logu, např: $ while :; do clear && cat /var/log/syslog | tail -n 20 && sleep 1; done -- výsledek by měl být zajištění chybové hlášky a determinování problémové části.. -- nepodaří-li se nám v rámci bodu 1 zjistit co se děje, máme smůlu .. 2) Máme-li log a nebo víme co se děje (např. já když zapojím sluchátka, tak mi stále hrajou i repráčky, takže u mě je problém očividný a log nepotřebuju), můžeme googlit, ptát se, otravovat na fórech.. je to na nás. V této fázi bychom měli umět problém reprodukovat.. Zde se také často stává, že se zaseknete, protože jako já se sluchátky zjistíte, že řešení problému je zatím neznámé a nebo nedostupné. -- výsledkem by mělo být nalezení teoretického řešení problému a nebo jeho případného stavu, je-li to známý problém. 3) Zde se pouštíme do samotné opravy -- pánbůh nám pomáhej. -- výsledek :D v ideálním případě je, že to nakonec opravíme.. --------------------------------------------Třetí část -- Konkrétní Příklad-------------------------------------------- Doporučuji Vám se na tento příklad podívat, protože zde máte ukázku toho, jak najít problém přímo ve zdrojáku a v rámci Našeho příkladu zde demonstruju, jak se dostat k "neřešitelnému" problému přímo na kobylku .. --- Kód: ---// ok, koukneme se, jestli systém neobsahuje nějaké bugy.. # grep -Er 'error|Error|ERROR|fail|Fail|FAIL' /var/log // výstup je příliš veliký, trocha ho omezíme, ale předtím zkusíme: # find /var/log | less // koukneme se, co všechno je v adresáři s logy a potom: # for x in $(find /var/log); do if [ ! "$(echo "$x" | grep -E '\.tgz$|\.bz2|\.tar$|YaST2')" ] && [ ! -d "$x" ]; then grep -E 'error|Error|ERROR|fail|Fail|FAIL' $x; fi; done // trocha si ten příkaz rozeberem.. // for x in $(find /var/log); do // v každém průběhu cyklu budeme zacházet s jednou položkou z /var/log // if [ ! "$(echo "$x" | grep -E '\.tgz$|\.bz2|\.tar$|YaST2')" && [ ! -d "$x" ]; then // pokud položka neobsahuje (!) koncovku jako archiv (tgz, bz2, tar), nepatří YaSTU (jehož errory me nezajímají) // a není to zároveň (&&) adresář, tak.. // grep -E 'error|Error|ERROR|fail|Fail|FAIL' $x; // ..jí bezstarostně progrepujeme -- v každém průběhu cyklu jednu z 'find /var/log' - krom zahozených // fi // done // bohužel output je u mě stále příliš obrovský, takže já se jdu soustředit na užší vymezení 'error|Error|ERROR|fail|Fail|FAIL', // budu slídit po 'ACPI' errors: # for x in $(find /var/log); do if [ ! "$(echo "$x" | grep -E '\.tgz$|\.bz2|\.tar$|YaST2')" ] && [ ! -d "$x" ]; then grep -E 'error|Error|ERROR|fail|Fail|FAIL' $x; fi; done | grep 'ACPI' // pripsal jsem to na konec.. // teď je to docela dobré.. mám asi 100 řádek díky výrazu 'ACPI|(error|Error|ERROR|fail|Fail|FAIL)' .. // ok, vybírám si tuto hlášku: // 'ACPI Error (psargs-0355): [BSTR] Namespace lookup failure, AE_NOT_FOUND' // v google vyhledávám 'psargs-0355 Namespace lookup failure, AE_NOT_FOUND' // nacházím spousta věcí, ale budu si hrát na moulu, páč do toho nevidím a zjistím si, co to přesně způsobuje: # cd /usr/src/linux // vlezu ke zdrojákům jádra # find . | grep -E 'ACPI|acpi' // kouknu se, kde je acpi schované, nacházím ho v ./drivers/acpi a nebo ./include/acpi // ok, a teď se podíváme po naší hlášce: # grep -rE -A3 'Namespace\ lookup\ failure' drivers/acpi // dostávám: drivers/acpi/namespace/nsutils.c: acpi_os_printf(" Namespace lookup failure, %s\n", drivers/acpi/namespace/nsutils.c- acpi_format_exception(lookup_status)); // a tady máme naši hlášku: // stačí jen zjistit jak "acpi_format_exception(lookup_status)" vrací "AE_NOT_FOUND" # grep -rE 'return\ .*AE_NOT_FOUND' drivers/acpi drivers/acpi/ec.c: return AE_NOT_FOUND; drivers/acpi/osl.c: return AE_NOT_FOUND; drivers/acpi/osl.c: return AE_NOT_FOUND; drivers/acpi/namespace/nsobject.c: return (AE_NOT_FOUND); drivers/acpi/namespace/nsobject.c: return (AE_NOT_FOUND); // a jedna z výše uvedených fcí je ta naše.. Bohužel se mi do tohohle příspěvku už nic nevejde (je tu limit 20.000 znaků) --- Konec kódu --- tak.. a kdybych rozuměl psaní driverů pro acpi, tak si to ohackuju sám! takto se prosím reší problémy a vyhledává v logách pod Linuxem :D enjoy by ntz |
| nettezzaumana:
ad.1) opakovani v RE je zaludna vec a "*" se bo vic interpretuje v ruznych programech (perlRE Vs bashRE) ruzne.. vyraz '^20*' nefunguje, protoze jedna ze zaludnosti RE je, ze pri pouziti '*' musime specifikovat zacatek^ a konec$ radku, takze: # muzete zkusit nasledujici prikazy: #################################################### --- Kód: ---$ [b]for((x=0;x<10000;x++)) { echo $x >>numlist.txt; }[/b] // vytvorime si file, kde je zapsano 1-9999 $ [b]egrep '^2$' numlist.txt[/b] // vyhleda radky na kterych je "zacatek_radku-'2'-konec_radku" 2 $ [b]egrep '^2{2,}0.*[78]$' numlist.txt[/b] // vyhleda radky zacinajici min 2x"2", nasledovane 0 a koncici 7 nebo 8 2207 2208 $ [b]egrep '^([123])\1{1,}8$' numlist.txt[/b] // vyhleda radky, zacinaji (1|2|3), nasleduje libovolne opakovani tohoto zacinajiciho pismena a koci 8kou 118 228 338 1118 2228 3338 $ [b]egrep '^2(0)\1*$' numlist.txt[/b] // vyhleda pouze radky zacinajici 2kou a nasledovane uz pouze libovolnym mnozstvim 0 .. 20 200 2000 $ [b]egrep '^20*$' numlist.txt[/b] // podobny jako vyse uvedeny priklad, nyni jsme vsak pouzili relativne "chatrny zapis" 2 20 200 2000 $ [b]egrep '^1*2$' numlist.txt[/b] // zde o5 pouzivame opakovani "chatrnym zapisem". zde demonstrujeme, ze 'x*' znamena i zadne 'x' 2 12 112 1112 $ [b]egrep '^([56])\1{1}([78])\2{1}$' numlist.txt[/b] // vyhleda radky zacinajici dvojici 5|6 a koncici dvojici 7|8 5577 5588 6677 6688 $ [b]egrep '^([56])([78])\2\1' numlist.txt[/b] // vyhleda radky zacinajici a koncici 5 nebo 6 a mezi tim obsahujici zdvojeny vyskyt 7 nebo 8 5775 5885 6776 6886 $ [b]egrep '^([1-2])\1\1\1*$' numlist.txt[/b] // vyhleda radky, na nichz jsou pouze stejne znaky v rozsahu 1-2 a minimalne 3x. 111 222 1111 2222 $ [b]egrep '^([12])\1{2,}$' numlist.txt[/b] // to same, jiny zapis 111 222 1111 2222 --- Konec kódu --- zdravi ntz |
| Marcel 'Maky' Šuška:
Super návod, moc se mi líbí. --- Citace: luisah 23 Listopad 2007, 16:48:21 ---Dobrá práce, jen by to chtělo ty konkrétní příklady - ale je to celkem pochopitelný. :) chytrolín :) --- Konce citace --- Jak píše luisah, chce to více příkladů. No a taky začínat na zrovna v logách, málo kdo půjde tak do hloubky. Já bych spíše upřednostnil začít trochu od začátku, tak něco pro začátečníky. Taky oeňuji, že píšeš s diakritikou, lépe se to čte. Např: aplay -l - vypíše všechna zvuková zařízení Takhle vypadá výpis po zadání příkazu: --- Kód: ---maky@maky-desktop:~$ aplay -l **** Seznam PLAYBACK Hardwarových zařízení **** karta 0: CMI8738 [C-Media PCI CMI8738], zařízení 0: CMI8738 [C-Media PCI DAC/ADC] Podzařízení: 1/1 Podzařízení #0: subdevice #0 karta 0: CMI8738 [C-Media PCI CMI8738], zařízení 1: CMI8738 [C-Media PCI 2nd DAC] Podzařízení: 1/1 Podzařízení #0: subdevice #0 karta 0: CMI8738 [C-Media PCI CMI8738], zařízení 2: CMI8738 [C-Media PCI IEC958] Podzařízení: 1/1 Podzařízení #0: subdevice #0 karta 1: NVidia [HDA NVidia], zařízení 0: AD198x Analog [AD198x Analog] Podzařízení: 1/1 Podzařízení #0: subdevice #0 karta 1: NVidia [HDA NVidia], zařízení 1: AD198x Digital [AD198x Digital] Podzařízení: 1/1 Podzařízení #0: subdevice #0 maky@maky-desktop:~$ --- Konec kódu --- Z výpisu vidíme, že mám na PC dvě zvukovky, C-Media PCI CMI8738 a NVidia .......... a rozepsat se, třeba, proč je ta či ona ve výpisu první....... |
| nettezzaumana:
me se tam nevejde uz ani radek -- nevedel jsem, ale je tu limit 200.000 znaku pro prispevek ps. ja jsem puvodni text osekal minimalne o tretinu |
| nettezzaumana:
--- Citace: MacHala 05 Prosinec 2007, 18:12:11 ---Ntz for president! --- Konce citace --- hmm, a ja se pritom snazim skodit kde muzu .. |
| Navigace |
| Seznam témat |
| Další strana |