Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Linux

linux



+ Font mai mare | - Font mai mic



Linux

Compilarea kernel-ului Linux

Principalul motiv pentru care se doreste compilarea kernel-ului este adaptarea acestuia la un anumit sistem cu scopul cresterii performantelor, adaptare care de obicei consta in:

  • utilizarea unor optiuni de compilare prin care arhitectura procesorului este folosita la maxim (ex: alegerea tipului de procesor - implicit se foloseste un procesor generic gen i386)
  • activarea/dezactivarea suportului pentru anumite componente hardware sau software (ex: selectarea anumitor driver-e, selectarea unor anumite protocoale de comunicatie)

In cazul kernel-ului Linux, suportul pentru hardware/software poate sa fie:



  • built-in - suportul este inclus direct in imaginea (fisierul) kernel-ului
  • sub forma de module de kernel - suportul se gaseste in fisiere separate care se incarca on-demand

Desi adaugarea functionalitatilor in kernel poate duce la cresterea eficientei in anumite subsisteme, acest lucru poate avea ca si consecinta ingreunarea sistemului in ansamblu (bloated), lucru nerecomandat.

Majoritatea distributiilor includ in kernel numai suportul pentru componentele critice, fara de care sistemul de operare nu poate functiona. Restul componentelor sunt compilate sub forma de module, module care sunt incarcate in functie de hardware-ul/necesitatile fiecarui sistem/utilizator.

Exista si situatii in care kernel-ul care vine cu o anumita distributie este mai vechi sau nu are compilat suportul pentru o anumita componenta. De asemenea, compilarea unui kernel optimizat este foarte intalnita pe sistemele care ruleaza server-e unde se doreste exploatarea la maxim a resurselor sistemului.

Pentru a putea efectua modificari de tipul celor mentionate mai sus, trebuie initial efectuata configurarea kernel-ului. Dupa aceasta etapa se poate porni compilarea kernel-ului si a modulelor de kernel.

Pregatire

Cerinte hardware si software

Inaintea compilarii kernel-ului trebuie verificat sistemul daca satisface cerintele hardware si software.

Din punct de vedere hardware

  • desi un sistem Linux minimal poate rula in sisteme cu putina memorie RAM, cerintele minime pentru o distributie Linux, in momentul de fata, variaza in jurul valorilor de 128-256 MB RAM.
  • in functie de optiunile alese pentru compilare, spatiul ocupat pe disc poate depasi valoarea de 500 MB - in aceste conditii, se recomanda un minim de 1 GB liber pe hard-disk-ul pe care se realizeaza compilarea.

Timpul de compilare variaza in functie de numarul de componente activate pentru compilare in momentul configurarii.

Compilarea se poate realiza pe un sistem mai puternic urmand ca apoi sa se mute pachetul ce contine kernel-ul pe sistemul destinatie.

Cerintele software pentru kernel-ul de compilat se gasesc precizate in fisierul Documentation/Changes din cadrul surselor:

o Gnu C 3.2 # gcc --version
o Gnu make 3.79.1 # make --version
o binutils 2.12 # ld -v
o util-linux 2.10o # fdformat --version
o module-init-tools 0.9.10 # depmod -V
o e2fsprogs 1.29 # tune2fs
o jfsutils 1.1.3 # fsck.jfs -V
o reiserfsprogs 3.6.3 # reiserfsck -V 2>&1|grep reiserfsprogs
o xfsprogs 2.6.0 # xfs_db -V
o pcmciautils 004 # pccardctl -V
o quota-tools 3.09 # quota -V
o PPP 2.4.0 # pppd --version
o isdn4k-utils 3.1pre1 # isdnctrl 2>&1|grep version
o nfs-utils 1.0.5 # showmount --version
o procps 3.2.0 # ps --version
o oprofile 0.9 # oprofiled --version
o udev 081 # udevinfo -V
o grub 0.93 # grub --version

Observatii:

  • cerintele de mai sus sunt valabile pentru versiunea de kernel 2.6.24.2.
  • utilitarele e2fsprogs, jfsutils, reiserfsprogs, xfsprogs sunt folosite pentru sistemul de fisiere asociat
  • PPP si isdn4k-utils sunt necesare numai daca legaturile sistemului la Internet sunt de tip PPP sau ISDN.

Ce hardware exista in sistem?

Un kernel compilat poate oferi suport doar pentru hardware-ul utilizatorului, micsorand astfel dimensiunea imaginii obtinute. De asemenea, cunoasterea hardware-ului in sistem este necesara pentru un kernel mai rapid si alegerea optiunilor de compilare si a driver-elor de dispozitiv corecte. Informatii despre controller-ele Ethernet, VGA, placa de sunet se afla cu ajutorul comenzii lspci (din pachetul pciutils):

# lspci
00:00.0 Host bridge: VIA Technologies, Inc. K8M800 Host Bridge
00:00.1 Host bridge: VIA Technologies, Inc. K8M800 Host Bridge
00:00.2 Host bridge: VIA Technologies, Inc. K8M800 Host Bridge
00:00.3 Host bridge: VIA Technologies, Inc. K8M800 Host Bridge
00:00.4 Host bridge: VIA Technologies, Inc. K8M800 Host Bridge
00:00.7 Host bridge: VIA Technologies, Inc. K8M800 Host Bridge
00:01.0 PCI bridge: VIA Technologies, Inc. VT8237 PCI bridge [K8T800/K8T890 South]
00:0a.0 Ethernet controller: Linksys, A Division of Cisco Systems [AirConn]

Tipul procesorului se afla cu ajutorul procfs (montat in /proc).

# cat /proc/cpuinfo
processor  : 0
vendor_id  : AuthenticAMD
cpu family  : 15
model  : 28
model name  : Mobile AMD Sempron(tm) Processor 2800+
stepping  : 0
cpu MHz  : 1601.122
cache size  : 256 KB
fdiv_bug  : no
hlt_bug  : no
f00f_bug  : no
coma_bug  : no
fpu  : yes
fpu_exception  : yes
cpuid level  : 1
wp  : yes
flags  : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr
bogomips  : 3205.53

Obtinerea surselor

Sursele de kernel de Linux pot fi obtinute din pachete specifice distributiei sau pot fi descarcate sursele oficiale ale lui Linus Torvalds

In cazul in care se alege varianta folosirii surselor oficiale, se recomanda folosirea unui mirror din Romania

Sursele kernel-ului se gasesc in subdirectorul /pub/linux/kernel/v2.6 (pentru versiunea 2.6). Se poate folosi http sau ftp pentru obtinerea surselor:

# cd /usr/src
# wget ftp://ftp.idilis.lkams.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.2.tar.gz

Se dezarhiveaza sursele. Se recomanda crearea unei legaturi simbolice cu numele linux catre directorul ce contine sursele.

# cd /usr/src
# tar xzf linux-2.6.24.2.tar.gz
# ln -s linux-2.6.24.2 linux
# ls -l
total 40924
lrwxrwxrwx 1 root src 14 2008-02-19 13:52 linux -> linux-2.6.24.2
drwxrwxrwx 19 root root 4096 2008-02-16 19:21 linux-2.6.24.2
-rw-r--r-- 1 root src 41853865 2008-02-16 19:28 linux-2.6.24.2.tar.gz

Kernel-ul compilat de pe masina virtuala de Linux disponibila pe site este un kernel 2.6.24.2.

Configurare

Partea de configurare este partea cea mai importanta a procesului de compilare. In cadrul acesteia se decide ce caracteristici vor fi incluse in noul kernel; sunt necesare cunostinte ale hardware-ului sistemului si ale facilitatilor dorite.

Procesul de configurare era unul destul de dificil de realizat la primele versiuni, insa acest lucru s-a schimbat o data cu introducerea unor interfete care folosesc X Window sau ncurses. Pentru verificarea optiunilor posibile de compilare se poate rula comanda:

# make help
Cleaning targets:
clean - remove most generated files but keep the config
mrproper - remove all generated files + config + various backup files

Configuration targets:
config - Update current config utilising a line-oriented program
menuconfig - Update current config utilising a menu based program
xconfig - Update current config utilising a QT based front-end
gconfig - Update current config utilising a GTK based front-end
oldconfig - Update current config utilising a provided .config as base
randconfig - New config with random answer to all options
defconfig - New config with default answer to all options
allmodconfig - New config selecting modules when possible
allyesconfig - New config where all options are accepted with yes
allnoconfig - New config where all options are answered with no

Pentru utilizarea unei interfete text-based (ncurses), va trebui instalat pachetul libncurses-dev. Pentru utilizarea unei interfete folosind front-end GTK (de obicei intr-un desktop environment GNOME) vor trebui instalate pachetele libgtk2.0-dev si libglade2.0-dev. Pentru QT va trebui instalat pachetul libqt4-dev.

Avantajul folosirii interfetei ncurses este faptul ca este relativ usor de utilizat si nu necesita prezenta unui mediu grafic.

In cazul in care sursele contineau o configuratie anterioara care nu mai este dorita, va trebui rulata una din comenzile:

# make clean
# make mrproper

Rularea uneia dintre comenzile:

# make menuconfig
# make gconfig
# make xconfig

rezulta in afisarea unui meniu. Acesta contine mai multe intrari de configurare (General setup, Networking, Device drivers, File systems, etc.) care pot fi utilizate pentru configurari ale unui subdomeniu. Acestea pot contine, la randul lor, alte subdomenii de configurare.

O optiune finita de configurare (spre exemplu Device Drivers -> Block Devices -> Normal floppy disk support) poate prezenta utilizatorului trei optiuni de configurare:

  • absenta completa din kernel-ul finit (se apasa <N>)
  • compilarea acesteia in cadrul imaginii de kernel (built-in) (se apasa <Y>)
  • compilarea acesteia sub forma de modul de kernel (se apasa <M>)

Compilarea built-in inseamna introducerea codului obiect asociat optiunii in imaginea de kernel care va rezulta. Compilarea in forma de modul de kernel inseamna ca pentru activarea acelei facilitati, kernel-ul va incarca modulul (codul obiect asociat) si il va descarca atunci cand nu are nevoie de el. Kernel-ul este astfel extensibil si pentru adaugarea anumitor facilitati nu este nevoie de recompilare. Pentru lucrul cu module de kernel vor trebui adaugate optiunile din Loadable module support (Enable loadable module support).

Multe optiuni nu vor fi incorporate in cadrul kernel-ului intrucat nu sunt necesare. Altele pot fi compilate numai built-in. Optiunile care suporta varianta modul de kernel sau built-in se recomanda a fi compilate ca module de kernel pentru a fi incarcate la nevoie. Pe procesoarele moderne, timpul in care se incarca/descarca module este suficient de mic incat compilarea ca modul de kernel sau built-in sa nu afecteze performanta.

O optiune utila este precizarea unei versiuni locale pentru kernel, astfel incat acesta sa fie identificat; exista posibilitatea compilarii aceleiasi versiuni de kernel pentru scopuri distincte; oferirea unei versiuni locale genereaza o versiune de kernel unica.

Precizarea tipului de procesor si a arhitecturii este un pas necesar pentru a crea un kernel eficient. Majoritatea optiunilor tin de preferintele utilizatorilor (desi probabil multi vor alege suport de networking, sunet etc.) sau de hardware-ul existent.

Daca se doreste crearea unui kernel pentru dezvoltare (development) atunci vor trebui activate optiunile din Kernel hacking; acestea ofera informatii de debug suplimentare, cu dezavantajul unui kernel mai mare si mai lent.

Configuratia este salvata in cadrul fisierului .config din directorul radacina al surselor. Este indicat sa se realizeze un backup al acestui fisier inainte de configurare pentru a avea o configuratie sigura la care sa se revina in cazul aparitiei de probleme.

initrd - ramdisk-ul initial

initrd (initial ramdisk) este un sistem de fisiere temporar avand ca suport memoria RAM (ramdisk) care este folosit la pornirea sistemului (booting). Initrd este folosit pentru a incarca driver-ele necesare incarcarii sistemului de fisiere radacina.

Motivatia folosirii initrd este flexibilitatea. Distributiile Linux au un kernel generic Linux care trebuie sa boot-eze de pe sisteme cu hardware diferit. Kernel-ul inclus trebuie sa fie modular, nefiind posibila compilarea statica a tuturor optiunilor fara a mari semnificativ imaginea kernel-ului. Este, in consecinta, necesar sa se cunoasca la booting locatia sistemului de fisiere radacina si ce driver-e vor trebui incarcate in kernel. Aceasta problema este rezolvata prin introducerea initrd ca pas intermediar in pasul de boot-ing. Acesta actioneaza ca un sistem de fisiere radacina temporar. Continutul acestui sistem radacina este dat de imaginea de initrd.

De obicei, compilarea unui kernel pentru un sistem dat nu necesita utilizarea initrd, deoarece se cunoaste hardware-ul existent si sistemul de fisiere utilizat. Pentru a se evita utilizarea initrd, vor trebui compilate in imaginea de kernel (built-in) driver-ele de hard-disk, SCSI (daca exista) si de sisteme de fisiere. Daca aceste driver-e ar fi compilate ca module atunci ar trebui incarcate de pe hard-disk, fara insa a putea accesa hard-disk-ul (din lipsa driver-elor). In aceasta situatie se foloseste initrd. Driver-ele in cauza se gasesc in

  • Device Drivers -> ATA/ATAPI/MFM/RLL support - de obicei trebuie compilate built-in driverele IDE specifice hardware-ului folosit pentru a putea beneficia de modurile Ultra DMA. Daca nu, se pot pune driverele generice (generic/default IDE chipset support si Generic PCI IDE Chipset Support)
  • Device Drivers -> SCSI device support
  • File systems (va trebui configurat ca built-in suportul pentru sistemul de fisiere radacina)

Pentru utilizarea initrd este necesar pachetul initrd-tools.

(re)denumirea versiunii de kernel

Inainte de compilare, este indicat sa se creeze un indicator unic pentru imaginea de kernel creata. Aceasta se poate realiza completand campul EXTRAVERSION din Makefile-ul kernelului. Se poate seta acest camp la orice sir de caractere.

Compilare

Faza de compilare presupunea obtinerea imaginii de kernel si compilarea modulelor de kernel. Acest lucru se realizeaza prin intermediul a doua comenzi:

# make bzImage
# make modules

Prima comanda creeaza o imagine de kernel comprimata. Acest pas poate dura de la cateva minute pana la cateva zeci depinzand de configuratia hardware. Dupa incheiere, imaginea comprimata se regaseste in arch/i386/boot/bzImage (pentru o arhitectura x86).

A doua comanda compileaza modulele incarcabile de kernel. Acestea sunt, de obicei, in numar destul de mare si acest pas poate dura de cateva ori mai mult decat pasul precedent. Fisierele obiect ce reprezinta modulele (cu extensia .ko) rezida in directoarele asociate, urmand a fi instalate.

Instalare

Instalarea presupune copierea imaginii de kernel si a modulelor in locatiile prevazute si configurarea bootloader-ului pentru a boot-a de pe noul kernel. Acest pas se leaga de directorul /boot unde rezida toate fisierele importante.

Instalare imagine kernel

Imaginea de kernel va trebui copiata in /boot:

# cd /usr/src/linux
# cp arch/x86/boot/bzImage /boot/vmlinuz-2.6.24.2mykernel

(sirul mykernel este folosit pentru identificarea imaginii de kernel; poate coincide cu versiunea locala precizata la configurare)

In plus fata de imaginea de kernel, se recomanda copierea fisierului de configurare si a tabelelor de simboluri.

# cd /usr/src/linux
# cp .config /boot/config-2.6.24.2mykernel
# cp System.map /boot/System.map-2.6.24.2mykernel

Instalare module de kernel

Instalarea modulelor de kernel se realizeaza prin intermediul comenzii:

# make modules_install

Modulele sunt instalate in /lib/modules/2.6.24.2mykernel.

Daca s-a configurat sistemul pentru a folosi initrd, va trebui creata imaginea de ramdisk. Pentru aceasta se ruleaza comanda:

# cd /boot
# mkinitrd -o /boot/initrd.img-2.6.24.2mykernel 2.6.24.2mykernel

Comanda va inspecta directorul /lib/modules/2.6.24.2mykernel si va crea imaginea de ramdisk corespunzatoare.

Configurare GRUB

Dupa instalarea imaginii de kernel si a modulelor de kernel va trebui configurat bootloader-ul pentru a sti de unde sa incarce imaginea la pornirea sistemului.

Vom presupune configurarea GRUB (GRand Unified Bootloader), in detrimentul LILO (LInux LOader), pentru ca este mai raspandit. Configurari pentru LILO se pot gasi si in link-urile de mai jos

Fisierul de configurare pentru GRUB este /boot/grub/menu.lst (fisier text). Pentru configurarea noului kernel se recomanda copierea unei configuratii pentru un kernel mai vechi si modificarea acesteia. Un exemplu de configurare este prezentat in continuare:

title Debian GNU/Linux, kernel 2.6.24.2mykernel
root (hd0,1)
kernel /boot/vmlinuz-2.6.24.2mykernel root=/dev/hda2 ro
initrd /boot/initrd.img-2.6.24.2mykernel
savedefault
boot

title Debian GNU/Linux, kernel 2.6.24.2mykernel (recovery mode)
root (hd0,1)
kernel /boot/vmlinuz-2.6.24.2 root=/dev/hda2 ro single
initrd /boot/initrd.img-2.6.24.2mykernel
savedefault
boot

Optiunea initrd poate fi omisa in cazul in care nu s-a configurat un ramdisk initial.

Repornire sistem

Pentru rularea noului kernel, va trebui repornit sistemul si optat pentru noul kernel din meniul bootloader-ului.

ATENTIE: Se recomanda pastrarea fostului kernel, in cazul in care apar probleme la noul kernel compilat. Probleme pot aparea din neincluderea driver-elor necesare in cazul in care nu se foloseste initrd, omiterea driver-ului de sistem de fisiere necesar etc.

E posibil sa avem la dispozitie un kernel care ruleaza dar caruia ii lipsesc functionalitati (de exemplu networking), pentru ca s-a omis compilarea driver-elor pentru placa de retea. In acest caz se poate recompila kernel-ul pentru introducerea noilor functionalitati. Noua compilare va dura mai putin in cazul in care modificarile sunt minime.

O metoda de troubleshooting este compararea unei configuratii functionale cu cea curenta prin inspectia fisierelor config asociate.

Link-uri

Compilarea kernel-ului Windows

In cadrul Windows Academic Program exista posibilitatea accesului la codul sursa a kernel-ului de Windows NT, prin intermediul initiativei Windows Research Kernel (WRK).

Codul sursa prezinta componentele cele mai importante din cadrul nuclelui (managementul memoriei, procese, thread-uri, scheduling, I/O manager) si poate fi folosit si modificat in scopuri non-comerciale. Se pot astfel urmari diversele mecanisme de implementare si design care stau la baza kernel-ului si se pot testa diverse alte solutii prin modificarea surselor. Accesul la sursele kernel-ului este limitat, anumite subdomenii (cum ar fi networking-ul) fiind absente.

Accesul la codul sursa pentru nucleul de Windows NT inseamna posibilitatea de modificare a acestora si, evident, de compilare a kernel-ului si de boot-are sistem pe acesta. Sursele sunt accesibile prin intermediul imaginii de CD pusa la dispozitie de Microsoft in cadrul initiativei WRK. Trebuie sa fiti autentificati

Din pacate, kernel-ul de Windows nu vine cu optiuni de configurare, astfel incat procesul se rezuma la rularea comenzii de compilare si la instalarea noului kernel. Daca se doreste un tip special de functionalitate vor trebui alterate sursele.

De asemenea, kernel-ul poate fi compilat numai pe un sistem Windows 2003 SP1 sau Windows XP x64. Versiunea curenta (WRK-1.2) nu poate fi compilata pe un sistem Windows XP x86. Imaginea de masina virtuala de Windows de pe site ruleaza Windows 2003 SP1 cu un kernel nativ si un kernel compilat. Sursele sunt disponibile in cadrul imaginii in directorul C:psoWindowsResearchKernel-WRK.

Etapele de compilare sunt prezentate si in fisierul README.txt din radacina surselor.

Compilare

Pentru compilarea surselor se parcurg urmatorii pasi (vom utiliza de acum inainte %wrk% ca radacina surselor de kernel de Windows):

C:>set wrk=C:psoWindowsResearchKernel-WRKWRK-v1.2
C:>set arch=x86
C:>set path=%wrk%tools%arch%;%path%
C:>cd %wrk%base
C:psoWindowsResearchKernel-WRKWRK-v1.2base>cd ntos
C:psoWindowsResearchKernel-WRKWRK-v1.2basentos>nmake -nologo %arch%=

Imaginea de kernel obtinuta se va regasi in %wrk%basentosBUILDEXE si va purta numele wrkx86.exe pentru un sistem cu arhitectura x86. Imaginea obtinuta este doar nucleul; modulele de kernel folosite vor fi cele existente in sistem in acel moment.

Instalare

Procesul de instalare presupune copierea imaginii kernel-ului in %SystemRoot%system32:

C:>copy %wrk%basentosBUILDEXEwrkx86.exe %SystemRoot%system32

Totusi, in afara imaginii de kernel, va trebui precizata imaginea de HAL (Hardware Abstraction Layer) care va fi utilizata. Va trebui gasita imaginea corecta de hal; exista trei imagini de HAL disponibile in %wrk%WS03SP1HALSx86. Pentru a afla care imagine este cea corecta va trebui utilizat linker-ul (folosind comanda link si analizata imaginea de HAL existenta in acest moment in sistem).

C:>'C:Program FilesMicrosoft Visual Studio 8VCvcvarsall.bat'
Setting environment for using Microsoft Visual Studio 2005 x86 tools.
C:>link -dump -all %SystemRoot%system32hal.dll | findstr pdb
80011530: 68 61 6C 2E 70 64 62 00 00 00 00 00 00 00 00 00 hal.pdb
42435B3A cv 20 00001518 918 Format: RSDS, , 1, hal.pdb

Motivul pentru care in iesirea comenzii nu apare sirul halaacpi.dll este ca a fost dezactivat ACPI pe masina virtuala de Windows 2003.

Asocierea intre iesirea comenzii de mai sus si imaginile disponibile in %wrk%WS03SP1HALSx86 este (dupa cum este precizat si in README.txt):

halacpi.dll -> halacpim.dll
halaacpi.dll -> halmacpi.dll
halapic.dll -> halmps.dll

De obicei, imaginea cautata va fi halmacpi.dll.

Imaginea corecta de HAL va fi copiata tot in %SystemRoot%system32:

C:>copy %wrk%WS03SP1HALSx86halmacpihalmacpi.dll %SystemRoot%System32

Configurare boot.ini

Pentru a boota proaspatul kernel va trebui adaugata o intrare in boot.ini, fisierul de configurare pentru loader-ul de Windows NT. Se recomanda copierea unei linii de bootare existente si modificarea ei pentru a boota noul kernel si noua imagine de HAL, ca mai jos:

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)WINDOWS='Windows Server 2003, Standard'
/fastdetect /NoExecute=OptOut
multi(0)disk(0)rdisk(0)partition(1)WINDOWS='Windows Server 2003, Standard - WRK-1.2
compiled kernel' /kernel=wrkx86.exe /hal=halmacpi.dll /fastdetect /NoExecute=OptOut

Pentru vizualizarea boot.ini in Windows Explorer, va trebui sa accesati Tools -> Folder Options -> View -> Hide protected operating system files (Recommended). Fisierul este implicit read-only; pentru editare va trebui sa anulati aceasta optiune. Alternativ puteti face acest lucru din linia de comanda:

C:>attrib -h -s -r boot.ini

Dupa configurarea boot.ini, sistemul poate boota in noul kernel compilat.

  • How to manually edit the Boot.ini file in a Windows Server 2003 environment
  • Available switch options for the Windows XP and the Windows Server 2003 Boot.ini files

LXR Cross-Reference

LXR (LXR Cross-Reference) este un program care permite indexarea si referentierea simbolurilor din codul sursa a unui program prin intermediul unei interfete web. Interfata web prezinta link-uri catre locatiile din fisiere unde un simbol este definit sau utilizat. Site-ul de dezvoltare pentru LXR este acesta. Utilitare asemanatoare sunt OpenGrok si Gonzui

Desi LXR a fost initial destinat surselor kernel-ului de Linux, este folosit si la sursele utilitarelor de la Mozilla Apache HTTP Server si FreeBSD

Exista o serie de site-uri care folosesc LXR pentru cross-referencing la sursele kernel-ului Linux, site-ul principal fiind site-ul initial de dezvoltare

LXR permite cautarea dupa un identificator (simbol), dupa un text liber sau dupa un nume de fisier. Principala caractateristica si, in acelas timp, principalul avantaj furnizat este posibilitatea de gasire facila a declaratiei oricarui identificator global. Se realizeaza astfel foarte rapid accesul la declaratii de functii, variabile, macrodefinitii si codul poate fi parcurs facil. De asemenea, faptul ca se poate detecta ce zone de cod sunt afectate in momentul modificarii unei variabile sau functii prezinta un real ajutor in faza de dezvoltare si debug.

Intrucat facilitatile oferite de LXR sunt evidente s-au indexat sursele kernel-ului de Linux 2.6.24.2 si a celui de Windows WRK-1.2 pentru a putea fi usor parcurse aici. Trebuie sa fiti autentificati

Windows Research Kernel (WRK)

Windows Research Kernel (WRK) este parte a Windows Academic Program si ofera accesul la codul sursa pentru kernel-ul de Windows in medii academice. Din aceeasi initiativa Microsoft mai fac parte si Windows OS Internals Curriculum Resource Kit si Project Oz

WRK contine partile importante din nucleul pentru Windows XP x64 si Windows 2003 SP1 impreuna cu utilitare necesare pentru compilarea si testarea unor versiuni proprii de nucleu. Sursele incluse se refera la subsisteme precum procese, thread-uri, planificator, I/O manager, memorie virtuala.

Sursele si utilitare pot fi folosite numai in scopuri non-comerciale conform licentei

In acest moment, sursele nucleului pus la dispozitie pot fi compilate si testare numai pe sisteme cu Windows 2003 x86/x64 sau Windows XP x64.

Puteti descarca imaginea CD-ului cu Windows Academic Program de aici Trebuie sa fiti autentificati. Inainte de folosirea imaginii de CD va rugam sa cititi licenta

gdb (Linux)

Depanarea unui kernel este un proces mult mai dificil decat depanarea unui program, pentru ca nu exista tocmai suportul sistemului de operare. De aceea, acest lucru se realizeaza de obicei prin intermediul a doua calculatoare conectate pe interfetele seriale.

Alternativ, o metoda de debug mai simpla, dar cu multe lipsuri este depanarea locala folosind gdb, imaginea de kernel nearhivata (vmlinux) si /proc/kcore (imaginea in timp real a kernel-ului). Aceasta metoda este folosita de obicei pentru inspectia kernel-ului si detectarea anumitor inconsistente in timp ce acesta ruleaza. Metoda este utila mai ales daca s-a compilat kernel-ul cu optiunea -g de pastrare a informatiilor de debug. Nu pot fi folosite facilitatile de debug cunoscute cum sunt stabilirea de breakpoint-uri sau modificarea datelor.

Imaginea de kernel nearhivata ofera informatii pretioase despre structurile de date si simbolurile existente:

# cd /usr/src/linux
# file vmlinux
vmlinux: ELF 32-bit LSB executable, Intel 80386,
# nm vmlinux | grep sys_call_table
c02e535c R sys_call_table
# cat System.map | grep sys_call_table
c02e535c R sys_call_table

Utilitarul nm este folosit pentru afisarea simbolurilor dintr-un cod obiect sau executabil. In cazul nostru vmlinux este un fisier ELF. Alternativ se poate folosi System.map pentru afisarea informatiilor despre simbolurile din kernel.

Apoi folosim gdb pentru a inspecta simbolurile folosind imaginea nearhivata de kernel. O sesiune simpla de gdb este urmatoarea:

# cd /usr/src/linux
# gdb --quiet vmlinux
Using host libthread_db library '/lib/tls/libthread_db.so.1'.
(gdb) x/x 0xc02e535c
0xc02e535c <sys_call_table>: 0xc011bc58
(gdb) x/16 0xc02e535c
0xc02e535c <sys_call_table>: 0xc011bc58 0xc011482a 0xc01013d3 0xc014363d
0xc02e536c <sys_call_table+16>: 0xc014369f 0xc0142d4e 0xc0142de5 0xc011548b
0xc02e537c <sys_call_table+32>: 0xc0142d7d 0xc01507a1 0xc015042c 0xc0101431
0xc02e538c <sys_call_table+48>: 0xc014249e 0xc0115c6c 0xc014fee7 0xc0142725
(gdb) x/x sys_call_table
0xc011bc58 <sys_restart_syscall>: 0xffe000ba
(gdb) x/x &sys_call_table
0xc02e535c <sys_call_table>: 0xc011bc58
(gdb) x/16 &sys_call_table
0xc02e535c <sys_call_table>: 0xc011bc58 0xc011482a 0xc01013d3 0xc014363d
0xc02e536c <sys_call_table+16>: 0xc014369f 0xc0142d4e 0xc0142de5 0xc011548b
0xc02e537c <sys_call_table+32>: 0xc0142d7d 0xc01507a1 0xc015042c 0xc0101431
0xc02e538c <sys_call_table+48>: 0xc014249e 0xc0115c6c 0xc014fee7 0xc0142725
(gdb) x/x sys_fork
0xc01013d3 <sys_fork>: 0x3824548b
(gdb) disass sys_fork
Dump of assembler code for function sys_fork:
0xc01013d3 <sys_fork+0>: mov 0x38(%esp),%edx
0xc01013d7 <sys_fork+4>: mov $0x11,%eax
0xc01013dc <sys_fork+9>: push $0x0
0xc01013de <sys_fork+11>: push $0x0
0xc01013e0 <sys_fork+13>: push $0x0
0xc01013e2 <sys_fork+15>: lea 0x10(%esp),%ecx
0xc01013e6 <sys_fork+19>: call 0xc0111aab <do_fork>
0xc01013eb <sys_fork+24>: add $0xc,%esp
0xc01013ee <sys_fork+27>: ret
End of assembler dump.

Se observa ca s-a folosit ca parametru pentru gdb imaginea de kernel nearhivata care rezida in radacina surselor dupa compilare.

Cateva comenzi utilizate pentru debugging cu gdb sunt:

  • x - este folosita pentru afisarea continutului zonei de memorie a carei adresa este primita ca parametru (aceasta adresa poate fi valoarea unei adrese fizice, un simbol sau adresa unui simbol); poate primi ca parametri (precedati de /): formatul in care afiseaza datele (x pentru hexazecimal, d pentru zecimal, etc.), cate unitati de memorie se afiseaza si dimensiunea unei unitati de memorie.
  • disassemble - este folosita pentru dezasamblarea unei functii.
  • p - este folosita pentru evaluarea si afisarea valorii unei expresii; se poate specifica formatul in care se afiseaza datele (/x pentru hexazecimal, /d pentru zecimal, etc.).

Analiza imaginii de kernel este o analiza statica. Daca dorim o analiza dinamica (o analiza a kernel-ului asa cum ruleaza el) vom folosi /proc/kcore; acesta este o imagine dinamica (in memorie) a kernel-ului.

# gdb /usr/src/linux/vmlinux /proc/kcore
Core was generated by `root=/dev/hda3 ro'.
#0 0x00000000 in ?? ()
(gdb) p sys_call_table

(gdb) p /x sys_call_table
$2 = 0xc011bc58
(gdb) p /x &sys_call_table
$3 = 0xc02e535c
(gdb) x/16 &sys_call_table
0xc02e535c <sys_call_table>: 0xc011bc58 0xc011482a 0xc01013d3 0xc014363d
0xc02e536c <sys_call_table+16>: 0xc014369f 0xc0142d4e 0xc0142de5 0xc011548b
0xc02e537c <sys_call_table+32>: 0xc0142d7d 0xc01507a1 0xc015042c 0xc0101431
0xc02e538c <sys_call_table+48>: 0xc014249e 0xc0115c6c 0xc014fee7 0xc0142725

Folosirea imaginii dinamice a kernel-ului este utila pentru detectarea de rootkit-uri

LiveKd (Windows)

Asemanator cu gdb, pe Windows exista posibilitatea analizei dinamice a kernel-ului folosind Live Kernel Debugger - LiveKd. Pachetul este oferit de SysInternals. Pentru lucrul cu acesta aveti nevoie de pachetul Debugging Tools de la Microsoft. Acesta contine debugger-e peste care lucreaza livekd, cum ar fi kd sau WinDbg. Aceste debugger-e sunt, de obicei, folosite in cadrul unui sistem de doua calculatoare legate printr-un cablu serial: un calculator pe care se face debug iar altul care realizeaza debug-ul. LiveKd permite inspectia kernel-ului in timp ce acesta ruleaza.

LiveKd foloseste ca backend kd, WinDbg sau Dumpchk (kd este implicit). Inainte de pornire, Live Kd va inspecta configuratia curenta pentru a detecta prezenta simbolurilor de debug ale sistemului de operare; daca acestea nu sunt prezente se va cere sa fie descarcate. Deosebirea intre kd si WinDbg este aceea ca WinDbg permite configurare prin interfata grafica; setul de comenzi de depanare este, insa, apropiat. Un exemplu de sesiune LiveKd este prezentata mai jos:

C:Documents and SettingsAdministrator>livekd
LiveKd v3.0 - Execute i386kd/windbg/dumpchk on a live system
Sysinternals - www.sysinternals.com
Copyright (C) 2000-2005 Mark Russinovich

Launching C:program filesDebugging Tools for Windowskd.exe:

kd> dd nt!ExAllocatePool
80809627 8b55ff8b 6f4e68ec 75ff656e 0875ff0c
80809637 08be3ee8 08c25d00 50535300 01f08fe8
80809647 5a09e900 c0330000 0059b8e9 90909000
80809657 ffffff90 94d861ff 94d87480 90909080
80809667 ffffff90 96410cff 96411f80 90909080
80809677 ffffff90 96427cff 96429280 90909080
80809687 ffffff90 9642d9ff 9642ec80 90909080
80809697 ff8b9090 80ec8b55 89f7cc3d 840f0080
kd> u nt!ExAllocatePool
nt!ExAllocatePool:
80809627 8bff mov edi,edi
80809629 55 push ebp
8080962a 8bec mov ebp,esp
8080962c 684e6f6e65 push 656E6F4Eh
80809631 ff750c push dword ptr [ebp+0Ch]
80809634 ff7508 push dword ptr [ebp+8]
80809637 e83ebe0800 call nt!ExAllocatePoolWithTag (8089547a)
8080963c 5d pop ebp
kd> dd nt!KiTimerExpireDpc
808a81c0 00200113 00000000 00000000 8081fc62
808a81d0 00000000 00000000 00000000 00000000
808a81e0 808a81e0 808a81e0 00000000 00000000
808a81f0 808a81f0 808a81f0 00000000 00000000
808a8200 00000000 00000000 808a8208 808a8208
808a8210 817a62c0 00000000 00000000 00000000
808a8220 00040001 00000000 817a6368 817a6368
808a8230 00000000 00000000 00000000 00000000
kd> dt nt!_KDPC
+0x000 Type  : UChar
+0x001 Importance  : UChar
+0x002 Number  : UChar
+0x003 Expedite  : UChar
+0x004 DpcListEntry  : _LIST_ENTRY
+0x00c DeferredRoutine  : Ptr32
+0x010 DeferredContext  : Ptr32 Void
+0x014 SystemArgument1  : Ptr32 Void
+0x018 SystemArgument2  : Ptr32 Void
+0x01c DpcData  : Ptr32 Void
kd> dt nt!_KDPC 808a81c0
+0x000 Type  : 0x13 ''
+0x001 Importance  : 0x1 ''
+0x002 Number  : 0x20 ' '
+0x003 Expedite  : 0 ''
+0x004 DpcListEntry  : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x00c DeferredRoutine  : 0x8081fc62 nt!KiTimerExpiration+0
+0x010 DeferredContext  : (null)
+0x014 SystemArgument1  : (null)
+0x018 SystemArgument2  : (null)
+0x01c DpcData  : (null)
kd> dd nt!KiTimerExpiration
8081fc62 8b55ff8b 94ec81ec fa000000 18a100eb
8081fc72 8bffdf00 df00140d 1c053bff 89ffdf00
8081fc82 4d89e445 07850fe0 a10000c7 ffdf000c
8081fc92 00080d8b 053bffdf ffdf0010 89ec4589
8081fca2 850fe84d 0000c6f1 e7fc0d8b 8bfb8089
8081fcb2 d18b1045 fa81d02b 00000200 5a3d830f
8081fcc2 65830003 565300f4 01ffe181 8d570000
8081fcd2 4d89ff70 f845c7cc 00000018 04fc45c7
kd> u nt!KiTimerExpiration
nt!KiTimerExpiration:
8081fc62 8bff mov edi,edi
8081fc64 55 push ebp
8081fc65 8bec mov ebp,esp
8081fc67 81ec94000000 sub esp,94h
8081fc6d fa cli
8081fc6e eb00 jmp nt!KiTimerExpiration+0x10 (8081fc70)
8081fc70 a11800dfff mov eax,dword ptr ds:[FFDF0018h]
8081fc75 8b0d1400dfff mov ecx,dword ptr ds:[0FFDF0014h]
kd> q
quit:
Execute Kd again? (y/n) n
Exiting LiveKd.
C:Documents and SettingsAdministrator>

Comenzile utilizate in cadrul acestei sesiuni de debug sunt:

  • dt (dump using type information) - permite analiza tipurilor de date din sistem (cum este spre exemplu KDPC)
  • dd (dump memory) - permite analiza diverselor variabile, precizand continutul unei anumite locatii de memorie; poate primi ca parametru o adresa sau un simbol (asemanator cu comanda x de la gdb)
  • u (unassemble) - permite dezasamblarea codului unei functii

Un simbol poate fi parte a unui domeniu. Simbolurile de kernel sunt precedate de nt! pentru a se specifica faptul ca sunt simboluri de kernel.

Informatii complete despre functionarea depanatorului si comenzile utilizate gasiti in documentatia asociata (Debugging Help.chm).

Documentatie

Dezvoltarea kernel-ului are un grad sporit de dificultate raportat la programarea din user space. API-ul diferit, necesitatea cunoasterii amanuntite a sistemului pe care se lucreaza si a structurii kernel-ului necesita o etapa de pregatire suplimentara. Documentatia asociata este destul de eterogena, fiind nevoie de inspectia mai multor surse pentru a avea o intelegere completa a unui aspect.

Documentatie Linux

Principalele avantaje ale kernel-ului Linux sunt accesul la surse si sistemul deschis de dezvoltare. Drept urmare, Internet-ul ofera un numar mult mai mare de resurse de documentare a kernel-ului.

Cateva link-uri utile sunt prezentate mai jos:

  • KernelNewbies
  • KernelNewbies - Kernel Hacking
  • Kernel Analysis - HOWTO
  • Linux Kernel Programming
  • Linux kernel - Wikibooks

Link-urile nu sunt nicidecum exhaustive. Folosirea Internet-ului si a surselor este esentiala.

Documentatie Windows

Documentatia principala de Windows este cea care vine cu Windows DDK (Driver Development Kit). Alternativ ea poate fi accesata de pe site-ul Microsoft. Informatii si utilitare se pot regasi si la SysInternals, site creat de Mark Russinovich (unul din autorii Inside Windows, 4th Edition) sau la Code Project Desi cu mult mai putine resurse de documentatie decat kernel-ul Linux, Internet-ul ofera multe informatii.

In mod evident, nu trebuie ignorat accesul la codul sursa, care poate oferi informatii acolo unde documentatia nu este suficienta.

Quiz

Pentru auto-evaluare (de preferat inainte de laborator) raspundeti la intrebarile de aici

Exercitii

Precizari

  • Exercitiul 6 de Linux si 1 de Windows (cele referitoare la utilizarea LXR) nu necesita folosirea masinilor virtuale (doar accesul la un browser).
  • In rest, exercitiile de Linux vor fi realizate in cadrul masinii virtuale de Linux, iar cele de Windows in cadrul masinii virtuale de Windows.

Linux

  1. (2 puncte) Bootati sistemul de pe imaginea de kernel din aceasta arhiva.
    1. Descarcati arhiva de mai sus si extrageti imaginea de kernel continuta.

Hints

      • Se recomanda folosirea wget direct din masina virtuala de Linux. Alternativa este descarcarea imaginii in sistemul gazda si copierea prin SSH pe masina virtuala. Alternativa dureaza mai mult :-)
      • Arhivele zip se dezarhiveaza cu comanda unzip
    1. Copiati imaginea de kernel in /usr/kimages/vmlinuz_extern.

Hints

      • Va trebui creat directorul kimages.
    1. Adaugati o noua intrare in fisierul de configurare al GRUB care sa permita bootarea de pe noul kernel. Denumirea care trebuie sa apara in ecranul de boot GRUB sa fie Copie de imagine.

Hints

      • Creati o copie a liniilor asociate nucleului curent si modificati linia ce precizeaza imaginea nucleului si cea pentru denumirea de pe ecranul de boot. Pastrati restul optiunilor existente pe acea linie!
    1. Reporniti sistemul.
      • In ecranul GRUB pozitionati-va peste optiunea Copie de imagine.
      • Folositi tasta e pentru a edita/vizualiza optiunile de boot. Optiunile trebuie sa fie cele modificate in fisierul de configurare GRUB.
      • Folositi tasta b pentru a boot-a de pe copia imaginii nucleului.
    2. Dupa boot verificati vesiunea curenta a nucleului.

Hints

      • Folositi comanda uname -a.

Hints

    • Cititi sectiunea Configurare GRUB din laborator.
  1. (1 punct) Pregatiti nucleul Linux pentru compilare.
    1. Descarcati arhiva cu sursele nucleului Linux versiunea 2.6.24.2 in /usr/src/kernel-sources/.

Hints

      • Trebuie creat directorul /usr/src/kernel-sources/.
      • Recomandam wget (fie FTP, fie HTTP). Alternativa este descarcarea imaginii in sistemul gazda si copierea prin SSH pe masina virtuala. Alternativa dureaza mai mult :-)
      • Alegeti intre versiunea .tar.gz sau .tar.bz2
    1. Dezarhivati sursele nucleului.

Hints

      • NU folositi optiunea v (verbose) la dezarhivare. Va afisa la consola informatii despre dezarhivare care nu sunt neaparat necesare.
    1. Creati legatura simbolica /usr/src/linux catre sursele dezarhivate ale nucleului.

Hints

    • Cititi sectiunea Obtinerea surselor din laborator.
  1. (1 punct) Personalizati nucleul Linux inainte de compilare.
    1. Adaugati un mesaj de forma:
printk (KERN_NOTICE 'my new kernel is bootingn');

in cadrul functiei start_kernel din init/main.c.

Hints

      • NU este virgula intre KERN_NOTICE si 'my new kernel is bootingn'. Pentru mai multe informatii consultati Laboratorul 2 si Laboratorul 3.
  1. (2 puncte) Compilati sursele kernel-ului de Linux.
    1. Folositi fisierul .config din sursele deja compilate /usr/src/linux-2.6.24.2.

Hints

      • Trebuie copiat fisierul .config.
    1. Configurati nucleul fara optiuni de debug.

Hints

      • Identificati intrarile din meniu unde sunt localizate optiunile de debug (Kernel hacking)
    1. Compilati nucleul pentru obtinerea unei imagini tip bzImage.
    2. Compilati modulele nucleului.

Hints

      • Compilarea va dura ceva. Nu asteptati terminarea ei. Treceti la celelalte exercitii si reveniti ulterior.

Hints

    • Cititi sectiunile Configurare si Compilare din laborator.
  1. (2 puncte) Boot-ati de pe nucleul proaspat compilat.
    1. Copiati imaginea de nucleu in /boot cu denumirea vmlinuz-pso-2.6.24.2.
    2. Copiati fisierul System.map si .config in /boot urmand aceeasi conventie de nume ca mai sus.
    3. Configurati GRUB pentru a permite boot-area de pe noul nucleu. Titlul asociat noului nucleu in ecranul de boot al GRUB trebuie sa fie PSO-rules Linux kernel 2.6.24.2 compilat de #your name here#

Hints

      • Creati o copie a liniilor asociate nucleului curent si modificati linia ce precizeaza imaginea nucleului si cea pentru denumirea de pe ecranul de boot.
    1. Reporniti sistemul.
    2. In ecranul GRUB optati pentru bootare de pe nucleul proaspat compilat.
    3. Dupa boot-are verificati versiunea nucleului si aparitia mesajului personalizat de la exercitiul 3.

Hints

      • Folositi comanda uname -a pentru a verfica versiunea nucleului.
      • Folositi comanda dmesg pentru a vizualiza mesajele afisate de kernel la boot.

Hints

    • Cititi sectiunea Instalare din laborator.
  1. (1 punct) Folositi LXR pe Linux pentru a determina locatia anumitor informatii.
    1. Determinati fisierul in care sunt declarate urmatoarele tipuri de date:
      • struct task_struct
      • struct semaphore
      • struct list_head
      • spinlock_t
    2. Determinati fisierul in care sunt declarate urmatoarele simboluri globale:
      • sys_call_table
      • jiffies
      • current
    3. Determinati fisierul in care sunt declarate urmatoarele functii:
      • copy_from_user
      • vmalloc
      • schedule_timeout
      • add_timer

Hints

    • Folositi optiunea linux-2.6.24.2 din pagina afisata la accesarea LXR.
    • Cititi sectiunea LXR Cross-Reference din laborator.
  1. (2 puncte) Folositi gdb si /proc/kcore pentru a obtine urmatoarele informatii:
    • adresa variabilei jiffies in memorie si continutul acesteia;
    • dezasamblarea functiei care creeaza thread-uri de kernel.

Hints

      • un thread de kernel se numeste kthread.

Hints

    • Cititi sectiunea gdb (Linux) din laborator.

Windows

  1. (1 punct) Folositi LXR pe Windows pentru a determina locatia anumitor informatii.
    1. Determinati fisierul in care sunt declarate urmatoarele tipuri de date:
      • LIST_ENTRY
      • KSPIN_LOCK
      • FAST_MUTEX
      • IRP
    2. Determinati fisierul in care sunt declarate structurile:
      • KeServiceDescriptorTable
      • KeServiceDescriptorTableShadow
    3. Determinati fisierul in care sunt declarate functiile:
      • InterlockedExchange
      • ExAllocatePoolWithTag
      • IoRequestDpc
      • PsSetCreateProcessNotifyRoutine

Hints

    • Folositi optiunea wrk-1.2 din pagina afisata la accesarea LXR.
    • Cititi sectiunea Windows Research Kernel (WRK) din laborator.
  1. (3 puncte) Folositi Windows Live Debugger (livekd) pentru:
    • a afla modulele existente in kernel;
    • a afla informatii despre un proces care ruleaza in kernel;
    • a afla adresa functiei PsCreateSystemThread si a dezasambla aceasta functie;
    • a afla adresa structurilor KeServiceDescriptorTable si KeServiceDescriptorTableShadow.

Hints

    • Cititi sectiunea LiveKd (Windows) din laborator.

Pentru acasa

  1. Compilati sursele nucleului de Windows din cadrul proiectului WRK si boot-ati de pe noul kernel.
    1. Compilati nucleul pentru obtinerea unei imagini pentru arhitectura x86

Hints

      • Sursele sunt disponibile in cadrul imaginii VMWare in directorul C:psoWindowsResearchKernel-WRKWRK-v1.2
      • Cititi sectiunea Compilare din laborator.
    1. Instalati imaginea de kernel

Hints

      • Copiati imaginea de nucleu in C:WINDOWSsystem32 cu denumirea wrk-pso.exe.
      • Gasiti imaginea corecta de HAL si copiati-o in C:WINDOWSsystem32.
      • ATENTIE: numele pentru imaginea de nucleu si imaginea de HAL sunt nume de fisier scurte.
      • Cititi sectiunea Instalare din laborator.
    1. Boot-ati de pe nucleul proaspat compilat.

Hints

      • Configurati boot.ini pentru a permite boot-area de pe noul nucleu. Titlul asociat noului nucleu in ecranul de boot trebuie sa fie PSO-rules Windows Server 2003 WRK 1.2 compilat de #your name here#.
      • Reporniti sistemul.
      • In ecranul de boot optati pentru bootare de pe nucleul proaspat compilat.
      • Dupa boot-are verificati versiunea nucleului cu ajutorul comenzii ver.
      • Cititi sectiunea Configurare boot.ini din laborator.


Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1619
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved