Labor a felhőben


A húsvéti nyúl egy önállóan megoldható fakultatív feladatot hozott: Az első feladatcsoport keretében a korábban elkészített String osztályunkban keresünk hibát, de ehhez nem a szokásos környezetet, hanem az Informatikai Központ és az Irányítástechnika Tanszék közös oktatási felhő rendszerét használjuk. A szándék kettős: szeretnénk a Linux/Unix környezet iránt jobban felkelteni az érdeklődést, másrészt a tanszéken fejlesztett felhő rendszerrel kapcsolatban is kíváncsiak vagyunk a hallgatóság véleményére (kérdőív a lap alján)

Feladatok


Forrás: maxtapety.pl

A feladatok megoldásához egy olyan Linux/Unix (UN*X) környezetre van szükségünk, melyben telepítve vannak a megfelelő eszközök: svn kliens, g++, clang++, gmake, gdb, doxygen, valgrind, vncserver, ddd. Ezt úgy érjük el, hogy mindenki egy saját virtuális gépet indít az IK-IIT felhőben. A gép egy olyan sablonból példányosodik, amelybe installáltuk a megfelelő programokat. (Oktatói szempontból ez a felhő egyik legnagyobb előnye, hiszen elegendő egyetlen sablont megfelelően előkészíteni, és minden hallgató ezzel pontosan megegyező szoftverkörnyezetet kap.)
Természetesen a feladatok megoldhatók más UN*X környzetben is. Ha nem akar virtuális gépet indítani, és a fenti programok rendelkezésére állnak, folytassa a feladatok megoldását a 2. feladatcsoporttal!

1. feladatcsoport: Virtuális gép indítása az IK-IIT felhőben

  1. Nyissa meg a cloud.bme.hu oldalt! Itt válassza a KIFU-NIIF, vagy a VIK nevű adatközpontot, majd lépjen be a rendszerbe EduID-azonosítójával (az eduID ikonra kattintson)!
  2. Sikeres belépés után a bal oldali oszlopban megjelennek a már elindított virtuális gépei, a jobb oldali oszlopban pedig a perzisztens adattárban levő legújabb fájlok láthatók. Ez a tároló az Ön által indított összes virtuális gépből elérhető, és tartalma akkor is megőrzésre kerül, ha a virtuális gépeket törli (lásd később). Erre a bejelentkező oldalra bármikor visszajuthat, ha a CIRCLE feliratra kattint.
  3. Indítson el egy virtuális gépet az +Új feliratra kattintva. Az elérhető sablonok közül válassza az C++ labor nevűt, és nyomja meg az indítás gombot!
  4. A kérésre rövid időn belül (1-2 perc) megjelenik az újonnan indított géphez tartozó részletező panel, amelyen nyomon követhető a gép mindenkori állapota és ez a panel biztosítja a gép feletti további felügyeletet (lásd kezelőgombok).
    Ha 1-2 percen belül nem kerülne aktív állapotba az elindított gép, akkor frissítse a böngésző ablakát.


    Az elindított gépeket teljes egészében a tulajdonosa felügyeli: Leállíthatja, törölheti, beléphet rá, módosíthatja, konfigurálhatja.
    A távoli hozzáféréshez szükséges információ a Kapcsolat részletei felirat alatt látható: A gép SSH protokollon érhető el. Normál esetben az SSH szolgáltatás a 22-es TCP-porton fut, de esetünkben sok virtuális gép fut egyazon globális IP-címen, ezért azokat a portszámok segítségével tudjuk megkülönböztetni. Nem lenne erre a „trükkre” szükség, ha minden virtuális gép önálló IP-címmel rendelkezne. Ezt az IPv4 címtartományok szűkössége miatt csak IPv6 címekkel tudjuk megvalósítani. Amennyiben IPv6-kapcsolata is van (a HSZK-ban van), akkor nem kell speciális portot használni, mivel a gép a saját IPv6-os nevével/címével is elérhető. (A gép IPv6 neve csak akkor látszik a panelen, ha a böngészőt futtató gépnek van IPv6 kapcsolata)

  5. Ügyeljen arra, hogy a jelszó másolásakor ne a ••• sorozatot másolja! Legegyszerűbb, ha CTRL-A, CTRL-C billentyűkombinációval másolja ki a jelszómező tartalmát, amikor a jelszó látható. A jelszó beillesztése a vágólapról a PuTTY ablakába jobb egérgombbal kattintással lehetséges (de a jelszó nem fog látszani!)
  6. Lépjen be a gépére! A gépre SSH protokollon keresztül cloud felhasználói névvel tud csatlakozni a panelen látható porton és jelszóval. A jelszó a jelszó mezőbe való kattintással lesz látható, illetve ugyanezzel takarható el. PuTTY használatával a következő lépéseket kell végrehajtania:
    • Indítsa el a PuTTY programot!
    • Írja be a Host Name (or IP address) mezőbe a gépnevet (az ábrán: vm.ik.bme.hu, a VIK felhőben: vm.smallville.bme.hu, NIIF felhőben: vm.niif.bme.hu)!
    • Írja be a Port mezőbe a portszámot (az ábrán 10658), majd OK!

    A megjelenő login ablakba felhasználónévhez cloud nevet írjon, a jelszót pedig másolja ki a Belépési adatok panelről!

  7. Saját környezetében lehetőség van egy speciális klienssel is csatlakozni, ami nem kér jelszót, hanem automatikusan belépteti a gépre cloud felhasználói névvel. Ehhez azonban telepíteni kell a letölthető kliens programot. (Jelenleg ez a HSZK-ban is telepítve van)
  8. Sikeres csatlakozás után a cloud felhasználóként belépett a gépre. Itt az év elején megismert UNIX parancsokat használva ellenőrizze, hogy milyen fájljai vannak, mennyi hely van az állományrendszerben! Pl:
    ls -la
    df -h 
    ...
    
  9. A HSZK-ban installált PuTTY programok alapértelmezett kódrendszere latin2. Ezt érdemes átállítani utf-8-ra (fejlécen jobb gomb -> Change Settings... -> Window/Translation -> Remote character set: UTF-8). Érdemes továbbá a fekete háttér helyett pl. fehéret választani a későbbi munka miatt (Change Settings... -> Window/Colours -> Use system colours).
  10. A létrehozott virtuális gép futási ideje 5 óra. Ennek elteltével a gépet megállítjuk. Ebből az állapotból a gép 10 napig bármikor újraindítható. Így a feladatok otthonról is befejezhetők. Annak ellenére, hogy a már nem használt gépek automatikusan megállnak és törlődnek, kérjük, hogy a nem használt gépeket kapcsolja le, ill. törölje.
  11. Az adott virtuális gép adatait és állapotát részletező panelen 6 db fül (Kezdőoldal, Erőforrások, Konzol, Hozzáférés, Hálózat, Tevékenységek) található. A gép indítása után automatikusan ez utóbbi az aktív. Válassza ki a Kezdőoldal-t! A lap alján a tárhely csatolása gombra kattintva csatolja az adott virtuális géphez az Ön perzisztens adattárát! (A KIFÜ-NIIF nevű adatközpont rendszerében jelenleg nincs ehetőség perzistens tárat használni!)
  12. Ezt az adattárat a virtuális gépből a /store katalógusban érheti el. Ez az az adattár, amit a cloud.ik.bme.hu címen belépve a webes felület jobb oldalán is lát (Fájlok). Ezen keresztül egyszerűen mozgathat adatokat a lokális és a virtuális gép között. A tárterület tartalma a virtuális gép törlése után is megmarad. (Ha a virtuális gépet nem törli, csak leállítja, akkor újraindítás után a virtuális gépen minden fájlt változatlanul elér. Így a normál munkát nem kell a /store alatt végeznie, ide csak a végleges, a gép törlése után is megtartandó fájlokat másolja, ha van ilyen!)

2. feladatcsoport: Hibakeresés C++ programban

  1. Töltse le a laborhoz előkészített anyagot az svn szerverről:
    • Lépjen be a login katalógusába (cd )!
    • Töltse le az anyagot az git clone https://git.ik.bme.hu/Prog2/labor_peldak/lab_extra.git paranccsal
  2. A továbbiakban a lab_extra/string2 katalógusban kell dolgoznia, ezért lépjen be ebbe a katalógusba (cd lab_extra/string2)! Ebben a katalógusban a korábbi laborokon megvalósított String osztály egy hibás változata található.
  3. Futtassa a make parancsot, majd próbálja ki a keletkezett string2_test programot (./string2_test)! A programban több memóriakezelési hiba van, ezért a program hibával áll meg:
    cloud@cloud-860:~/lab_extra/string2$ ./string2_test
    Segmentation fault (core dumped)
    
  4. Próbálja meg behatárolni a hibát a forrás részletes elemzése nélkül:
    • Futtassa a programot gdb-vel (Csak a parancsokat adjuk meg, azok eredményeként keletkező kiírásokat nem. A parancssorok végére megjegyzés-szerűen (#) rövid magyarázatokat írtunk.
      $ gdb string2_test
      (gdb) r            # (run) elindítja a tesztelendő programot
      (gdb) bt           # (backtrace) kiírja, hogy az adott pillanatban mely függvények voltak aktívak 
      

      A függvények hívási sorrendjén (visszafelé kell olvasni) látható, hogy a main (#1) meghívott egy függvényt (amit nem is mi készítettünk, #0) a string2_test.cpp fájl 28. sorából (string2_test.cpp:28), és ebben keletkezett a hiba. Próbáljuk kideríteni a gdb segítségével, mit és milyen paraméterekkel hívott a main:

      (gdb) up           # (up) lépjünk eggyel feljebb a hívási fában
      (gdb) list 28      # (list) kiírja forrásfájl 28. sorának környékét 
      (gdb) p txt        # (print) kiírja a txt változó tartalmát
      (gdb) p argv1      # (print) kiírja az argv1 változó tartalmát
      (gdb) q            # (quit) kilépés
      

      Az argv1 változó (amit az strcmp() második paramétereként adtunk meg) null értékű, tehát érvénytelen pointer. A kérdéses sorokat csak ezen hibakereső feladat kedvéért tettünk a programba. Vegye észre, hogy ha ad valamilyen indítási paramétert, akkor erre a hibára nem fut rá a program. Az indítási paramétereket a gdb r parancsának lehet átadni pl:

      $ gdb string2_test
      (gdb) r valami     # (run) elindítja a tesztelendő programot
      (gdb) q            # (quit) kilépés
      
    • Most újabb hiba jelentkezett! A fentiekhez hasonló módon derítse ki a hiba okát és szüntesse meg! Ez már nem olyan egyszerű, de nem vészes, mivel ezzel a hibával már korábban találkozott.

  5. Futtassa újra a programot a ./string2_test valami parancsal! Mindem rendben van? Memória leaking sincs?
    ŐŐőőő... Nem tudjuk. A program nem használja a memtrace-t.
  6. Keressünk más, hatékonyabb eszközt a hiba behatárolására! A valgrind program különösen alkalmas a memóriakezelési hibák felkutatására. Most próbáljunk a problémához közelebb jutni ezzel:
    valgrind ./string2_test valami 2>&1 | more
    
    A 2>&1 | more arra szolgál, hogy ne fusson ki a képernyőből a kiírás, ugyanis a hibakeresést a hibalista elején érdemes kezdeni. A valgrind a hibalistát a szabványos hibakimenetre írja, a 2>&1 jelöléssel ez a szabványos kimenethez fűződik, amit pedig átadunk a more parancsnak.
    A more parancs futása közben ENTER soronként lép tovább, SPACE oldalanként. A kimenet vége előtt q-val kiléphetünk.

    A valami paramétert azok kedvéért adtuk meg, akik nem törölték az előző hibát okozó sorokat. A valgrind memória felszabadítási problémára panaszkodik. Elemezze a kód ezen részét (operator+), és javítsa ki a programot!
    Az iit.bme.hu/~kapolnai/c_quickstart oldalon rövid leírást talál a valgrind program további lehetőségeiről.

  7. Jobb gomb a PuTTY ablak fejlécén -> Change Settings... -> Window/Translation -> Remote character set: UTF-8
  8. Mivel a forráskód ékezetes karaktereket is tartalmaz, fontos, hogy a környezeti beállítások és a terminálemuláció (PuTTY) ezzel összhangban legyen. A forrásokat UTF-8 kódolással készítettük elő és a virtuális gép is így van beállítva, ezért a PuTTY-ban is ezt kell állítani.
  9. Fordítsa, futtassa és javítsa a programot amíg minden hibát meg nem talál és ki nem javít! Segítségül: összesen 3 hibát rejtettünk el, tehát ez volt az utolsó.
  10. Ha sikerült az összes hibát kijavítania, ellenőrizze, hogy az ékezetes karaktereket jól kezeli-e a program!
    • Ehhez fordítsa újra a programot a make clean; make FLG=-DRENDEZ parancsokkal
    • Ellenőrizze, hogy milyen nyelvi beállítások vannak érvényben az echo $LANG illetve a locale parancsokkal!
    • Futtassa a programot és írjon be ékezetes szavakat! Ha a terminál és az OS nyelvi beállításai összhangban vannak, a rendezésnek is megfelelően meg kell történnie.
    • Vegye észre, hogy UTF-8 kódolásnál a betűszám nem egyezik meg a memóriában tárolt bájtok számával! Ez adott esetben lehet kellemetlen is!
  11. A doxygen programmal generálja le a html dokumentációt! A megfelelő konfigurációs állományt (doxyfile) előre elkészítettük. A make doc parancs nem csak a doxygen programot futtatja le, hanem az elkészített dokumentációt belinkeli a public_html katalógusba. Így az elérhető a gép webszerverén keresztül (lásd a következő feladatot).

3. feladatcsoport (IMSC): Webszerver telepítése és a virtuális gép külső elérése

  1. A doxygen segítségével generált dokumentációt a ~/public_htm katalógusba linkeli, de nem fut a gépen web szerver. Telepítsen egyet, és konfigurálja be úgy, hogy a ~/public_html tartalmát meg tudja jeleníteni. Mivel a virtuális gép az Öné, a sudo parancsnak nincs jelszava, hogy teljes joggal tudjon telepíteni csomagokat. A következőkben megadjuk a telepítéséhez és a konfiguráláshoz szükséges shell parancsokat, rövid megjegyzésekkel:
    sudo apt-get update                  # frissiti a csomagkezelő adatbázisát
    sudo apt-get install apache2         # apache szerver telepítése
    sudo ufw allow 80/tcp                # virtuális gép tüzfalán a 80 port kinyitása
    sudo a2enmod userdir                 # engedélyezzük ~user/public_html katalógusok elérését 
    sudo apache2ctl graceful             # szólunk a szervernek, hogy olvassa be az új konfigurációt
              # ugyanezt érjük el a szerver újraindításával, amit az a2enmod parancs javasolt 
    w3m http://localhost/~cloud          # kipróbáljuk hogy megy-e 
    
  2. Most már fut a webszerver, lokálisan elérhető. Ha külső hálózatból is el akarjuk érni, akkor a felhő infrastruktúra tűzfalán ki kell nyitni a megfelelő portokat. IPv6 esetén ezt 80-es portot jelenti, IPv4 esetén pedig az ssh 22-es portjához hasonlóan másik portra kell átirányítani (mappelni) a 80-as portot. Ez a műveletet a virtuális gép Hálózat fülén végezhetjük el:

  3. Sikeres portnyitás után a helyi böngészőből a gépnevével IPv6-on és IPv4-en is elérhető a szerverünk (a példában http://cloud-5817.vm.ik.bme.hu/~cloud és http://vm.ik.bme.hu:2814/~cloud).
  4. A virtuális gép hálózatát nem csak így, hanem ún. ssh tunnel segítségével is elérhetjük. Ennek lényege, hogy az ssh szerver és kliens az SSH protokollba csomagolva viszi át az információt. Kattintson jobb gombbal a PuTTY ablak fejlécén -> Change Settings... -> Connection/SSH/Tunnels.
  5. Ezután a böngészőnkből localhost-ként érhető el a virtuális gép webszervere: http://localhost/~cloud/

Kérjük, ossza meg velünk tapasztalatait, véleményét az IK-IIT oktatási felhőjéről! (2 perc)

Jó munkát!

Szeberényi Imre

Utolsó frissítés: 2020-04-04 00.14