netconsole: hogyan debugoljunk hálózaton keresztül

Címkék

Debugolni néha kell. Hogy miért?

Biztos mindenki került már olyan helyzetbe, hogy kernelfordítás után valami nem volt teljesen OK. Vagy nem volt a monitoron kép, mert elfelejtettük valamelyik konzol komponenst belefordítani a kernelbe, vagy a rendszer nem találta a / filerendszert, mert elfelejtettük az IDE, SCSI vagy más lemezvezérlő driverét, vagy egyszerűen csak rossz filerendszert állítottunk be a kernel konfigurációs részében. Sorolhatnám még a felmerülő hibákat, de a lényeg az, ha valamilyen oknál fogva gépünket nem tudjuk legalább a ``single'' módig (init 1) bebootolni (ehhez ugye az kell, hogy az init-et elérjük, vagy legalább egy shell-t (bash, sh, stb.) tudjunk init-ként használni), akkor nagyon nehéz a debugolás. A boot üzenetek egy korszerű gépen gyorsan lefutnak a képernyőn, így tényleg nagyon kell figyelni, hogy az ember a megfelelő pillanatban leolvashassa a hibaüzenetet. Másik bosszantó dolog, ha kernel panic-ot kapunk mindjárt a bootolásnál, és azt szeretnénk szeretnénk debugolni. Nem hiszem, hogy bárki nekiállna egy oops üzenetet papírral és ceruzával leírni... Akkor mégis hogyan rögzítsük az ilyen félig bootolt gép üzeneteit?

Erre több lehetőségünk is van. Az egyik legrégebbi eljárás, a soros porton keresztüli debugolás. Ezzel több problémánk is lehet. Kell hozzá egy speciális soros porti kábel (azt hiszem, hogy nevezik nullmodem kábelnek is). Ez nem minden esetben áll rendelkezésünkre. A másik dolog, ami a soros porti kábeles debug ellen szól az az, hogy fizikailag közel kell lennünk a géphez, a kábel maximális hossza miatt. Viszont van egy olyan lehetőség, amely minden hálózati környezetben használható. Ez nem más, mint a Molnár Ingo által fejlesztett netconsole.

Hogy mi is ez?

Molnár Ingo 2001. szeptemberében kezdte el a fejlesztését a netconsole-nak, az akkori 2.4-es kernelhez. A netconsole egy olyan kernel modul (amelyet nyilván célszerű fixen a kernelbe fordítani), amely lehetővé teszi a kernel ``printk'' üzeneteinek UDP protokollon, hálózaton keresztül történő továbbítását. Ezzel a módszerrel nagyszerűen lehet debugolni a diszkkel kapcsolatos hibákat akkor, ha a soros konzol használata nehézkes, vagy éppen lehetetlen. Ha a kód fixen a kernelbe van drótozva, akkor a netconsole a hálózati kártya inicializálása után azonnal aktiválódik. Mivel a hálózati kártyának működnie kell a használatához, a korai kernel panic-okat nem lehet vele debugolni, de majd az egész boot folyamatot figyelemmel kísérhetjük ezzel a módszerel. A netconsole nem csak a 2.4-es kernelhez használható, hanem mostantól Matt Mackall munkájának köszönhetően a 2.6.0-mm2 kerneltől kezdve a 2.6-os kernel sorozatban is bátran próbálkozhatunk vele.

A használata:

A kernel a bootolás folyamán a hálózati kártya és a TCP stack indítása után aktiválja a netconsole-t, amely UDP csomagokat küld a hálózati kártyán keresztül a hálózatra. Ezeket a csomagokat egy debugger munkaállomásról értelmezhetjük.

A beállítása a forrás gépen:


netconsole=[src-port]@[src-ip]/[< dev >],[tgt-port]@< tgt-ip >/[tgt-macaddr]

ahol:

src-port az UDP csomagok forrás portja (alapértelmezetten 6666)
src-ip a forrás IP cím (a hálózati kártya IP címe)
dev hálózati csatoló (alapértelmezetten eth0)
tgt-port a logoló ügynök (logging agent) portja (alapértelmezetten 514)
tgt-ip a IP logoló ügynök IP címe
tgt-macaddr a logoló ügynök MAC address-sze (fizikai címe)( alapértelmezetten broadcast)

Példa a használatra (boot időben):


Linux netconsole=4444@10.0.0.1/eth1,9353@10.0.0.2/12:34:56:78:9a:bc

vagy futási időben modulból betöltve:

insmod netconsole netconsole=@/,@10.0.0.2/

Ha a netconsole él, akkor egy monitorozó gépről a ``netcat -u -l -p < port >'' használatával értelmezhetjük az üzeneteket. Vagy használhatjuk a syslogd-ot.

FIGYELEM: az alapértelemezett beállításokkal a netconsole ``broadcast'' üzeneteket (amit minden egyes hálózati tag megkap abban a hálózati szegmensben) küld, amely extrém nagy hálózati terhelést okozhat abban a szegmensben.

Használatának vannak határai, amelyek szerintem érthetőek, és elfogadhatóak: csak IP alapú hálózaton működik, csak UDP csomagokkal, és csak ethernet eszközökön keresztül.

Ezzel a debug módszerrel elmenthetjük a kernel panic-okat, nyugodtan elolvashatjuk a kernel által boot időben generált üzeneteket, amelyek elengedhetetlenek, ha elemezni akarjuk a kernelünk működését, vagy csak egyszerűen segítséget szeretnénk kérni / bugreportot akarunk küldeni.

Bővebb infó a netconsole-ról a 2.6.0-mm2 kerneltől kezdve a Documentation/networking/netconsole.txt állományban lehet találni.

Jó munkát!

Hozzászólások

Éppen tegnap forgattam itt 2.6.0-mm2 -öt, hátha megy vele az UML, de valamiért ezzel sem akarja az igazságot...

Nah, akkor találtam ezt az opciót, gyorsan be is tettem modulba... ahogy elnézem, megérte... :)

Ez most hogyan jött fel a tracker -ben?

-----
"Egy jó kapcsolatban a társunkat az ő dolgában kell támogatni, nem a miénkben."