În acest articol, care e structurat în mai multe părți, se va analiza problema menținerii sistemului de pe serverele Linux actualizat. Deseori, când se începe administrarea serverelor unei afaceri incipiente, echipa de administratori de sisteme găsește o instalare de servere în centrul de calcul axată în jurul unor servere instalate cu programele necesare și configurate haotic de prima echipă de programatori doar cu scopul "să meargă". Acești programatori fac atât muncă de dezvoltare cât și administrare de sisteme, care este cunoscută în termenii IT internaționali ca DevOps (Development and Operations).
Această situație reprezintă un obstacol, creator de ore suplimentare, atunci când dorim să păstrăm serverele de producție, sau chiar și pe cele de dezvoltare, actualizate. Deseori, administratorii de sisteme găsesc sisteme care sunt pornite de timp îndelungat și care nu au fost actualizate cu anii. Din punctul de vedere al afacerii, atât timp cât acele sisteme funcționează și își fac datoria, nu contează dacă sunt actualizate sau nu. Doar atunci când ceva rău se întâmplă, spre exemplu când baza de date cu utilizatorii și parolele sau alte date valoroase se scurg în mâinile persoanelor neautorizate sau chiar către tot Internetul din cauza unei breșe de securitate, sau când programatorii observă că programele lor au nevoie de o versiune actualizată de programe care e incompatibilă cu versiunea sistemelor de operare folosite pe producție, echipa de conducere grăbește echipa de administrare de sisteme să facă actualizări urgente. Această grabă cauzează în continuare instalarea pe sistemele de producție a unor sisteme testate insuficient.
Pentru a simplifica și formaliza procesul de actualizare fără a fi nevoie de achiziția de noi echipamente, noi am atacat problema în doi pași: întâi, am virtualizat stratul aplicației folosind Containere Linux (LxC). Această formă de virtualizare ne-a permis să creăm "mașini virtuale", fără a pierde din performanța sistemelor sau fără a le supraîncărca cu un strat de simulare a părții fizice, cum se face în cazul VMWare sau KVM de la RedHat sau în cazul Oracle VirtualBox sau XEN; al doilea pas a fost să "virtualizăm" nodurile fizice (calculatoarele fizice) folosind ca sistem de fișiere rădăcină un fișier imagine al unei partiții.
Câștigul în a avea "sistemul de fișiere rădăcină într-un fișier imagine" e că acum putem înlocui sistemul de fișiere rădăcină cu unul nou doar prin repornirea sistemului; revenirea la sistemul anterior se face de asemenea ușor, doar cu ajutorul unei noi reporniri a sistemului. Un alt câștig al instalării unui sistem de fișiere rădăcină într-un fișier imagine este că sistemul de operare instalat în interiorul fișierului poate fi actualizat și testat eficient pe un sistem de dezvoltare decuplat de producție, pentru ca apoi să poată fi publicat pe toate serverele deodată, automat. Când oricare dintre acele servere trebuie actualizat, este suficientă o repornire a sistemului. Această soluție poate fi întâlnită aproape pe toate sistemele înglobate (embedded systems), unde producătorii publică "fișiere imagine" ce pot fi încărcate în router-e, plăci de administrare decuplată (DRAC, iLO, AMT), etc. .
În cazul nostru, am utilizat o distribuție de Linux bazată pe surse - Gentoo Linux. Vă puteți întreba "De ce ar vrea cineva să compileze totul din surse când este extrem de ușor să instalezi pachete binare?". Când instalează un server, administratorul de sisteme se trezește compilând programe din mai multe surse din varii motive: pachete disponibile prea vechi, nevoia de anumite opțiuni ce pot fi activate sau dezactivate doar la compilare, petice ce trebuie aplicate pentru a rezolva greșeli în program, etc. . Dacă adăugăm la această muncă și munca de actualizare periodică, administratorul se găsește în situația de "a-și câștiga banii cu sudoarea frunții". Se mai poate întâmpla ca nu doar un anumit program să necesite compilarea din surse, ci și programele de care depinde. Pe o distribuție binară, întâmpinăm multe probleme la compilarea din surse, una din ele fiind cunoscuta problemă a "iadului dependențelor", alta fiind înlocuirea componentelor de care depinde sistemul (python, perl) cu versiuni nesuportate. Concluzia e că cel mai bine e să construim tot sistemul din surse folosind metode de automatizare cum este "portage", managerul de pachete de la Gentoo (care seamănă cu sistemul "ports" din FreeBSD).
În această primă parte a articolului, vom analiza sistemul gazdă, neavând în vizor container-ele virtualizate sau calculatoarele simulate.
Când am proiectat imaginea sistemului de fișiere rădăcină a sistemului gazdă, cunoscută și sub numele de fișierul imagine rădăcină al "nodului fizic", am observat că ea trebuie să satisfacă câteva cerințe:
Mai jos este diagrama partițiilor sistemului gazdă și a fișierului imagine rădăcină:
Genkernel este un script dezvoltat în cadrul proiectului Gentoo, care ajută utilizatorii să-și compileze nucleele (kernels); Acesta ar putea să funcționeze și în alte distribuții, nu doar în Gentoo. Dacă doriți o distribuție binară care asigură compatibilitatea cu Gentoo și permite genkernel să ruleze nativ, puteți încerca Sabayon Linux sau Calculate Linux, două distribuții bazate de asemenea pe Gentoo. Pentru a putea inițializa sistemul direct din imaginea de partiție rădăcină, am modificat fișierul din genkernel default/linuxrc și am adăugat logica descrisă în diagrama de mai sus. Puteți clona genkernel-ul modificat de pe github, la adresa https://github.com/psihozefir/genkernel.git.
De asemenea, scriptul de inițializare care trebuie să curețe fișierul imagine hn-root.img de fișierele și configurările nedorite, va fi disponibil pe github în curând. Între timp, puteți curăța fișierul manual. Scopul acestui script e de a facilita înlocuirea sistemelor imagine cu un fișier imagine dintr-o singură sursă pe toate serverele fără a cauza confuzie în rețeaua și aplicațiile de administrare (precum Nagios sau Icinga, sau panourile de administrare ale sistemelor) din centrul de calcul.
Pentru a instala un sistem într-o imagine de partiție rădăcină, putem urma următorii pași .Această procedură va șterge complet dispozitivul de stocare al sistemului, deci faceți copii de rezervă înainte de a vă apuca de treabă:
menuentry "GNU/Linux in a file" {
insmod part_gpt
insmod fat
insmod reiserfs
insmod ext2
insmod gzio
set root="hd0,gpt2"
loopback loop ($root)/hn-root.img
echo "Loading Linux…"
linux (loop)/boot/kernel root=/dev/ram0
real_root=/hn-root.img raw_loop_root_host_
partition=LABEL=hostpart ro
echo "Loading initial ramdisk…"
initrd (loop)/initramfs
}
LABEL=EFI-BOOT /boot/loader vfat noauto,noatime 1 2
LABEL=hostpart /hostpart auto noatime 0 1
Un alt câștig al utilizării fișierelor imagine e că face posibilă schimbarea distribuțiilor Linux extrem de facilă. Doar copiați un fișier hn-root.img ce conține altă distribuție de Linux și ați terminat!
În partea a doua din articol se va prezenta sistemul de stocare distribuită XtreemFS, iar în partea a treia, se va analiza virtualizarea sistemelor (folosind LxC și KVM) și aplicațiilor (utilizând Docker). Când openStack va fi disponibil în una dintre imaginile noastre,se va realiza a patra parte, în care vom expune detalii despre modul în care noi vom folosi OpenStack.
Configurația descrisă este momentan în construcție, iar unele componente nu sunt create încă. Deci, rămâneți pe fir!