Multe pachete Metin2 au fost construite pentru versiuni de FreeBSD care nu mai primesc actualizări de securitate. Pachetul pe care l-am verificat are binarele făcute pentru FreeBSD 13.0, pe 32 de biți. Mai devreme sau mai târziu vei vrea să muți serverul pe un sistem actual. Asta se numește **portare**. Nu e o comandă, e un mic proiect. Făcut în grabă, cu librării vechi copiate de prin forumuri, produce un server care „pornește” dar cade sau strică date. Făcut în pași mici, e perfect realizabil.
Nivel: Avansat. Ce trebuie să știi înainte: tot drumul de compilare din acest capitol, de la mediul de compilare până la erorile de compilare, plus depanarea cu gdb și versionarea.
Cuvinte pe care le vei întâlni
| Cuvânt | Ce înseamnă |
|---|---|
| Portare | Adaptarea unui program ca să meargă pe alt sistem sau cu alte unelte. |
| EOL (end of life) | O versiune care nu mai primește reparații de securitate. |
| Dependență | Orice program sau librărie de care are nevoie sursa ca să se compileze sau să ruleze. |
| Referință | Versiunea actuală, care merge, cu care compari rezultatul nou. |
Pasul 1: Păstrează referința
Înainte de orice, pune deoparte versiunea care merge: binarele game și db, sursa exactă, fișierele serverului și un backup al bazei de date de test. Notează amprentele sha256. Tot ce faci de aici încolo compari cu ea.
Pasul 2: Fă inventarul
Notează tot ce folosește sursa. Pentru pachetul verificat, inventarul arată așa:
| Ce | Ce am găsit | De ce contează |
|---|---|---|
| Sistem și arhitectură | FreeBSD 13.0, i386 (32 de biți) | Versiunea nu mai primește actualizări |
| Compilator | clang++-devel, standardul -std=c++2a | Pe sistemul nou poate avea alt nume sau altă versiune |
| Client MySQL | inclus în sursă, versiunea 5.1.35, pe 32 de biți | Foarte vechi; poate avea probleme cu servere MySQL/MariaDB noi |
| boost, cryptopp | incluse în etc/ (1.72 și 8.4) | Pot cere ajustări cu compilatoare noi |
| Lua | 5.0.3, inclus | Folosit de questuri și de qc |
| Librării de imagini | devil, png, tiff, jpeg etc., din sistem | Numele pachetelor se schimbă între versiuni |
| Python | make.py și update_limit_time.py sunt scrise în Python 2 | Python 2 poate lipsi pe sistemele noi |
Comenzile din lecția despre mediul de compilare te ajută să completezi tabelul pentru sursa ta.
Pasul 3: Alege ținta și fă un singur salt
Verifică pe freebsd.org ce versiuni sunt încă suportate și pe ce arhitecturi. Versiunile noi renunță treptat la unele platforme pe 32 de biți, deci verifică asta înainte să alegi.
Cel mai sigur drum are două etape separate:
- Aceeași arhitectură, sistem mai nou. Dacă binarele tale sunt pe 32 de biți și ținta suportă încă așa ceva, mută întâi doar versiunea de FreeBSD. Schimbi un singur lucru major.
- Trecerea pe 64 de biți, ca proiect separat, după ce prima etapă e stabilă.
Să faci amândouă deodată înseamnă că, la prima problemă, nu știi care dintre ele e vinovată.
Pasul 4: Repară erorile pe rând, într-o copie
Lucrează într-o copie a sursei (ideal în Git, pe o ramură separată) și urmează regula din erori de compilare: prima eroare, o reparație, recompilare. Tipuri de probleme pe care le vei întâlni la un compilator mai nou:
- funcții vechi scoase din limbaj (de exemplu
bind1st,mem_fun), pe care codul vechi încă le folosește; - verificări mai stricte, care transformă în eroare ce înainte era tolerat;
- librării ale căror funcții s-au schimbat (de exemplu OpenSSL, dacă sursa ta îl folosește).
Notează fiecare reparație în jurnal. Dacă la un moment dat ai nevoie de un artificiu „temporar”, scrie-l separat, ca să nu rămână uitat.
Pasul 5: Testele de după compilare
Un program care se compilează nu e încă un program portat. Pe serverul de test verifici:
- pornesc toate core-urile, în ordine:
db,auth, canalele; - login, creare personaj, salvare și relogare;
- inventar, depozit, trade, iteme cu bonusuri, questuri, dungeon-uri;
- core-urile rămân pornite ore întregi, fără
.corenoi; - compari valorile din baza de date cu cele de pe referință.
Capcane reale
Librării din pachetele sistemului care nu merg pe 32 de biți. Într-un caz real, pe un FreeBSD i386, librăria de criptare instalată din pachetele sistemului avea o problemă pe 32 de biți: auth cădea la fiecare conectare a unui client. Codul jocului era corect. Soluția a fost compilarea acelei librării din sursa ei. Lecția: când un crash apare chiar în codul unei librării externe, verifică și librăria, nu doar codul tău. gdb (vezi depanarea unui crash) îți arată unde s-a oprit.
Trecerea pe 64 de biți schimbă mărimile. Pe 64 de biți, unele tipuri de date devin mai mari (de exemplu long și pointerii). Dacă un astfel de tip apare într-un pachet trimis clientului (care rămâne pe 32 de biți) sau într-o structură salvată ca atare în baza de date, mărimile nu se mai potrivesc. Rezultatul: clientul deconectat sau date citite greșit. De aceea fiecare pachet și fiecare structură salvată trebuie verificate. Vezi protocolul game–client.
Un MySQL nou cu un client MySQL vechi. Clientul MySQL inclus în sursa verificată e foarte vechi. Cu un server MySQL sau MariaDB recent, pot apărea probleme de autentificare sau de setări. Testează conexiunea înainte de orice altceva.
Ce nu faci
- Nu recomanzi și nu instalezi pentru un server nou o versiune de FreeBSD care a ieșit din suport.
- Nu folosești binare gata făcute din surse necunoscute ca „să meargă repede”.
- Nu dezactivezi verificări de securitate ca serverul să pornească.
- Nu muți jucătorii pe sistemul nou înainte ca testele să treacă de mai multe ori.
Greșeli des întâlnite
- Schimbi sistemul, compilatorul și arhitectura deodată.
- Copiezi librării vechi în
/usr/libca să scapi de erori. - Testezi doar pornirea. Problemele de portare apar la salvare, la comerț, după ore de rulare.
- Nu păstrezi referința. Nu mai ai cu ce compara.
Întrebări frecvente
Cât durează o portare?
Depinde mult de sursă. O mutare pe aceeași arhitectură poate dura câteva zile de lucru și testare; trecerea pe 64 de biți poate dura mult mai mult. Planifică fără grabă.
Pot rula binarele vechi pe 32 de biți pe un FreeBSD pe 64 de biți?
FreeBSD pe 64 de biți poate rula programe pe 32 de biți dacă are instalate librăriile de compatibilitate (lib32), dar toate librăriile cerute de ldd trebuie să existe în varianta pe 32 de biți. Poate fi o soluție de tranziție, dar trebuie testată la fel de atent.
Merită să plătesc pe cineva pentru portare?
Dacă nu ai timp sau experiență, da, dar cere-i același lucru ca aici: referință, jurnal de modificări, teste și plan de rollback.
Ce urmează
Ultima lecție adună tot: checklist-ul final pentru administrator. Toate lecțiile sunt în lista tutorialelor Metin2.
Server Metin2 gata de joc
Găzduire Metin2 în România, cu instalare de serverfiles, bază de date MySQL și protecție Anti-DDoS inclusă.