Servicii

Init

În procesul de boot, după ce kernel-ul s-a inițializat, trebuie pornit ansamblul de procese ce vor rula în user-space pe parcursul sesiunii curente. Pentru a realiza acest lucru, kernel-ul va porni daemon-ul init. În cazul în care kernel-ul nu reușeste sa pornească acest proces, se va produce ceea ce se cheamă “kernel panic”.

Init este primul proces pornit, rulează în user-space, are în mod normal PID-ul 1, va fi părintele tuturor celorlalte procese și va adopta orice proces orfan. Pentru a evita posibile accidente, init este implementat astfel încât sa ignore majoritatea semnalelor, chiar și pe cele trimise de procese rulate cu privilegii. Singurele semnale pe care acest proces le tratează sunt cele pentru care există handlere instalate explicit. Există totuși distribuții ce conțin astfel de handlere pentru a implementa comportamente asemănătoare cu halt sau shutdown atunci când init primește SIGTERM.

Odată ce a fost pornit procesul init, acesta are rolul ca mai departe să pornească restul proceselor din sesiune. De-a lungul timpului au existat diverse implementări ale acestei operații. Cea mai simplă abordare este cea folosită pe sistemele BSD. Acestea apelează un script ce se află în /etc/rc și conține lista programelor ce trebuiesc pornite. Init nu face altceva decât să ruleze acest script. Alte implementări se bazează pe evenimente asincrone (precum Upstart) sau daemoni specializați meniți să înglobeze și să înlocuiască init-ul clasic și script-urile necesare acestuia (systemd).

CGI

Serviciul pe care îl vom pune la dispoziţie pe RaspberryPi in acest laborator este un server web. Serverul web poate genera dinamic pagini. Aceasta se realizează prin execuţia de scripturi aflate în directorul cgi-bin din rădăcina serverului, folosindu-se o metodă standard numită Common Gateway Interface. CGI presupune execuţia unui script specificat în cererea HTTP (identificat ca orice alt fişier de pe server), care poate primi parametri dintr-un formular web pe stdin şi prin variabilele de mediu, respectiv poate genera pagini dinamice scriind pe stdout.

Exemplu:

În directorul cgi­-bin din root-ul serverului web creăm un fişier executabil numit 1.sh. Conținutul acestui fișier este de forma:

1.sh
#!/bin/sh
echo "Content-­type: text/html"
echo ""
echo "<HTML><HEAD><TITLE>Sample CGI Output</TITLE></HEAD>"
echo "<BODY><p>"
echo ­-n "Generated "
date
echo "</p><pre>"
env
echo "</pre>"
echo "</BODY></HTML>"

Pentu executare, în browser se scrie http://<ip>/cgi­-bin/1.sh .

Metoda CGI permite execuţia oricărui script pe server, putându-se astfel efectua orice operaţie. În mod normal s-ar restricţiona accesul la sistem spre exemplu rulând serverul web sub un utilizator fără privilegii.

Exemplu de cod HTML:

<form method="post" action="/cgi-bin/on.sh">
<input type="submit" name="on" value="LED On" />
</form>

Chiar dacă scripturile nu generează ieşire, browserul le va interpreta ca downloaduri goale, pentru că a emis o cerere şi aşteaptă un fişier ca răspuns, mecanismul CGI se desfăşoară doar pe server, fără ştirea sau interesul browserului. Trebuie ca ele să trimită un răspuns de tip redirect la pagina iniţială pentru a obţine o interfaţă rezonabilă. Aceasta se face adăugând în scripturi următorul cod:

echo "HTTP/1.0 302 OK"
echo "Location: /"
echo

Header-ul de tip Location specifică unde anume să fie redirectat browser-ul. Spre exemplu, dacă aveţi o pagină numită my_index.html unde vreţi ca utilizatorul să fie redirectat, atunci header-ul va fi: “Location: /my_index.html”

LED

Pentru a aprinde respectiv stinge un LED se poate folosi infrastructura sysfs, care presupune crearea de către kernel a unui arbore virtual de fișiere care oferă informații și control asupra unor dispozitive.

Astfel, pentru a controla singurul LED controlabil de pe placă (led-ul ACT - activity), se va folosi interfața din /sys/class/leds/led0/. Fiecare scriere sau citire într-un/dintr-un fișier din acest folder are o anumită semnificație. brightness controlează nivelul de luminozitate al LED-ului (în cazul acestui LED 0 înseamnă închis și orice număr între 1 și 255 înseamnă aprins), trigger desemnează o sursă de informație pe care LED-ul să o urmărească.

Spre exemplu:

cat /sys/class/leds/led0/trigger

afișează toate modurile de auto-trigger ale LED-ului, cu paranteze pătrate ('[' și ']') în jurul modului curent. Modul curent se selectează scriind în fișier textul unuia dintre moduri. În mod default este selectată sursa mmc0 pe LED, ceea ce înseamnă că LED-ul va pulsa la activități de scriere/citire pe cardul SD.

Pentru a aprinde LEDul ACT, se poate scrie în brightness, atâta vreme cât este selectat modul none de trigger, altfel valoarea scrisă va fi cu siguranță suprascrisă imediat.

Exerciții

0. (1p) Prepare RPI - Aveți nevoie să vă puneți pe calculator/desktop o adresă IP pentru a vă putea conecta la Raspberry Pi-uri. De asemenea, vrem să avem conectivitate la internet de pe RPI-uri.

  • Adaugați o adresă IP de forma 10.0.0.X/24 pe interfața de rețea a desktop-ului cu ieșire la internet, unde X = 100 + numărul asociat PI-ului de la banca voastră.
  • Testați conexiunea la PI prin ssh la Raspberry PI-ul vostru, care se află la adresa 10.0.0.Y, unde Y este numărul PI-ului. Utilizatorul este pi și parola raspberry.
  • Adaugați o rută default către 10.0.0.110 pe RPI-uri.
  • Testați conectivitatea la Internet a RPI-urilor prin ping la google.com.

1. (2p) LED - Creaţi un fişier on.sh, faceţi-l executabil şi aprindeţi din el un LED de pe placă. Creaţi un fişier similar off.sh pentru stingerea respectivului LED.

Nu uitați să dați disable la trigger. Dacă nu dați disable, script-urile care modifică starea ledului nu vor avea niciun efect. Pentru a da disable, trebuie sa scrieți comanda într-un fișier pe care îl executați cu drept de sudo

2. (2p) HTTP - Instalati pachetele lighttpd si php-cgi. Este posibil sa fie deja instalate, moment in care utilitarul va raporta succes imediat.

  • Navigați pe pagina default. Ulterior o puteti gasi si la http://10.0.0.X/index.lighttpd.html .
  • Urmăriți instrucțiunile pentru a crea o pagină nouă cu conținutul vostru și pentru a activa scripturile cgi.
  • Folosiți netstat ca să aflați cum se cheamă procesul cu server-ul web.
  • Folosiți ps ca să aflați cum se cheamă user-ul sub care rulează server-ul web.

3. (3p) CGI - Creaţi în index.html (în rădăcina ierarhiei web) două formulare web cu metoda POST, conţinând un singur buton submit fiecare. Un buton va aprinde LED-ul, iar celălalt buton îl va stinge.

4. (2p) PHP - Verificaţi că aveţi modulul de PHP cu

phpinfo.php
<?php
phpinfo();
?>

Daca aveti eroare 403, trebuie sa rulati lighty-enable-mod fastcgi si sa verificati ca pachetul php-cgi instalat. Verificati si ca lighttpd a fost auto configurat corect, si daca nu, modificati configuratia conform: https://www.cyberciti.biz/tips/lighttpd-php-fastcgi-configuration.html

Daca aveti eroare 500, verificati ca nu rulati din folderul cgi-bin.

  • Pentru un Hello World cu scripting în PHP, rulați scriptul:
index.php
<html><body>
<?php
$cpuinfo = `cat /proc/cpuinfo`;
echo $cpuinfo;
?>
</body></html>
  • Adăugați informații despre parametrii pe care îi primește kernel-ul la pornire
  • Adăugați informații pe pagină despre device-ul pe care este montat '/'

Resurse

si/lab/2015/services.txt · Last modified: 2020/05/19 22:10 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0