RPM: un ghid de utilizare
În acest articol, se face o încercare de a lua în considerare subiecte precum formatul comenzilor utilitare rpm, formatul pachetului și fișierul spec, secvența de construire a pachetelor etc.
[Vlad Gorilețki (gorele AT rambler.ru)]
RPM este Red Hat Package Manager, un sistem de management al software-ului care trăiește și crește în intestinele Red Hat. Există, de asemenea, o definiție recursivă a RPM în stilul în care GNU nu este UNIX - RPM Manager de pachete. Dacă alegeți această opțiune, ar trebui să scrieți: "trăind și dezvoltând în intestinul Open Source". În general, la ceea ce este plăcut. Dacă atingeți partea formală, RPM este licențiat sub licența GPL v.2.
Interesul nostru în acest sistem, din cauza existenței unui set de distribuții RPM bazate pe distribuții, adică, este o colecție de pachete rpm legate dependențe în concordanță cu mecanismele de instalare de sprijin necesare. Printre distribuitorii de sisteme de operare bazate pe RPM - granturi osestroeniya, cum ar fi Hat foarte Red, Suse (Novell astăzi subdiviziune), Mandrake și multe alte proiecte, și de lungă durată și efemer.
Și în distribuție și sub forma unor dezvoltări individuale, sunt disponibile un număr mare de utilități grafice-frontend-uri pentru rpm. Datorită ascunderii, cum se întâmplă adesea, a unor caracteristici ale muncii sistemului de ambalare cu aceste utilități, nu le vom lua în considerare. În plus, în marea majoritate a situațiilor, lucrul cu pachetele rpm din consola este mult mai simplu și mai transparent (cu excepția combinațiilor complexe de dependențe ale diferitelor versiuni ale unor programe pe altele).
Acest articol încearcă să examineze subiecte importante, cum ar fi comenzile de utilitate format rpm, dimensiunea pachetului și spec-fișier, secvență de asamblare pachet și aproape nu sunt afectate de arhitectura RPM, ca administratorii acestor detalii nu sunt importante, iar dezvoltatorii sunt utilizate în principal interfețe, cum ar fi bibliotecile librpm. Prin urmare, în cele mai bune tradiții, trimitem "interesat să știe", așa cum este aranjat în interior, la codul sursă.
Pentru a studia rpm (nu RPM) de la instrumentele de care aveți nevoie Midnight Commander. Sincer, este greu de imaginat un dezvoltator de pachete rpm care nu utilizează mc. Motivele pentru care vom vorbi mai departe. Dintre condițiile suplimentare ar trebui să se numească o anumită cantitate de timp liber și răbdare.
Toate exemplele au fost executate pe Suse Linux 10.0.
O privire superficială.
Din moment ce rpm salvează utilizatorul de a nu păstra toate detaliile despre software-ul instalat în sistemul de operare, trebuie să existe un mecanism care să efectueze aceste funcții în cadrul managerului de pachete. Și este: este baza de date rpm. În versiunile anterioare v.4, motorul de bază a fost asamblat static ca parte a pachetului, v.4 utilizează BDB extern (Berkeley Data Base). Utilitatea are o interfață de comandă la nivel înalt care vă permite să interogați baza de date despre pachetele instalate și dependențele acestora.
Deci, să începem exemplele. Utilitarul rpm poate funcționa în moduri diferite, modurile fiind setate de valoarea tastei principale de comandă. În plus, există o serie de opțiuni care funcționează în orice mod.
Pentru a instala pachetul, utilizați următorul format de comandă:
# rpm -i <имя пакета>
Și aici ne confruntăm cu primul inconvenient, dat fiind că numele ambalajului ar trebui să fie dat integral, împreună cu toate versiunile și numerele de asamblare. Problema este că utilitarul caută pur și simplu fișierul de cale specificat cu acest nume, așa că numele trebuie să se potrivească exact. De exemplu, în sistemul meu, pentru a instala MC, va trebui să spun următoarele (presupunând că superuserul are dreptate):
# rpm -i / cale către depozit / mc-4.6.1-5.i586.rpm
Dar pentru a elimina un pachet, puteți specifica pur și simplu numele pachetului ca mc, deoarece în acest caz utilitarul accesează deja baza de date a pachetelor:
Pentru a lucra în modul de actualizare a pachetelor, utilizați comutatorul -U. Dacă doriți să instalați un pachet de o anumită versiune, nu trebuie să aflați dacă există versiuni anterioare ale pachetului în sistem, este suficient să utilizați -U. Versiunile disponibile ale utilitarului se vor reîmprospăta, iar în absența unui pachet - instalați-l. Prin urmare, opțiunea cea mai comună este comanda de instalare, similară cu următoarea:
# rpm -Uhv / cale către depozit / mc-4.6.1-5.i586.rpm
sau din depozitul de rețea:
# rpm -Uhv ftp: // ivanov: [email protected]: 7020 / cale către depozit / mc-4.6.1-5.i586 .rpm
Alte două moduri interesante: modul de verificare și interogare. Pentru a evalua capacitățile de verificare ale pachetelor instalate, efectuăm următorul experiment: vom deteriora fișierul unui pachet și îl vom verifica cu rpm.
De exemplu, aproape întotdeauna arcul fișierului executabil este primul în lista de comenzi din directorul / bin. Acest utilitar afișează informații despre arhitectura procesorului sistemului pe ieșirea standard. Pentru a afla ce pachet conține acest fișier, utilizați modul de interogare în care este pornită rpm cu opțiunea -q. Opțiunea -f va cere care pachet aparține acestui fișier:
Acum creați o copie de siguranță a programului și apoi adăugați un caracter în fișier:
# cp / bin / arc / bin / arch_back
# echo "1" >> / bin / arc
După aceea, mecanismul de verificare a pachetelor ar trebui să ne informeze despre problemele existente:
# rpm-V util-linux-2.12q-26
În linia de ieșire, unele caractere apar înainte de numele fișierului pachet (dacă verificarea este reușită și nu există daune, nu va fi ieșire), care indică natura defecțiunilor. În acest caz s înseamnă schimbarea dimensiunii fișierului, 5 - încălcarea semnăturii fișierului md5, T - modificarea timpului ultimei modificări (adică momentul copierii fișierului în sistem în cazul nostru).
Restaurați fișierul și executați testul din nou:
# mv / bin / arch_back / bin / arh
# rpm-V util-linux-2.12q-26
și vom vedea că totul este bine, cu excepția momentului ultimei modificări a fișierului / bin / arc, care va corespunde momentului copierii inverse. Aceste informații ajută administratorul să identifice unele probleme și pachete - candidați pentru reinstalare.
Funcții avansate.
Pe lângă modurile de funcționare, utilitarul rpm are multe opțiuni, dintre care unele sunt legate de un anumit mod, altele sunt semnificative în mai multe moduri sau în toate. Câteva exemple de opțiuni frecvent utilizate.
În modurile de instalare-ștergere, se întâmplă adesea că trebuie să utilizați opțiunile --nodeps sau --force. Primul vă permite să instalați (dezinstalați) pachetul, indiferent dacă toate dependențele sale sunt satisfăcute, al doilea este de a instala pachetul chiar dacă există fișiere de versiuni mai recente în sistem. De un interes sunt opțiunile - adică, care vor satisface automat dependențele și testele emergente, ceea ce înseamnă testarea operațiunilor, adică se va pune în aplicare întreaga concluzie cu privire la problemele emergente, dar nu se vor efectua operații reale. Este foarte convenabil să modelăm eșecul sistemului ca urmare a oricărei acțiuni.
O gamă largă de funcții este furnizată de opțiunile pentru modul de interogare. Despre pachetul și fișierele sale, puteți obține aproape orice informații de la o scurtă referire la pachetul (o combinație -qi taste) și o listă de fișiere pachet (-ql) și se termină cu o valoare de unele servicii câmpurile de antet de pachete binare. Aceste capabilități sunt implementate fie cu ajutorul tastelor de filtrare corespunzătoare, fie cu opțiunea --queryformat, care vă permite să afișați numai câmpurile de servicii comandate. De exemplu, comanda
# rpm -q --queryformat% <имя пакета>
afișează descrierea pachetului și comanda
# rpm -q --queryformat% <имя пакета>
- numele distribuției, care include pachetul. Înlocuirea lui -q cu -qp va permite obținerea acelorași informații din fișierul rpm al pachetului care nu este instalat în sistem. Puteți obține o listă cu numai fișierele de configurare ale pachetului sau numai fișierele de documentație sau numai fișierele care conțin o expresie regulată în nume, care este, în principiu, orice.
Foarte des (lenea este motorul progresului) se folosesc cereri, ale căror rezultate sunt redirecționate către filtre externe. Deci, o interogare despre toate fișierele instalate, redirecționate către grep, vă va ajuta să găsiți un pachet cu numele specificat sau cu un nume care conține secvența de caractere specificată. echipă
# rpm -qa | grep mc
afișează o listă de pachete în numele cărora apare combinația mc și comanda
# rpm -qa | grep ^ mc
lista de pachete ale căror nume încep cu mc.
Pentru lipsa de spațiu nu discutăm astfel de opțiune exotice, dar importante pentru dezvoltator, cum ar fi, --showrc, care vă permite să afișați conținutul fișierelor, script-uri și macro-uri din fișiere rpmrc și macro-uri pentru ieșire standard sau într-un fișier, și multe altele. Trebuie remarcat faptul că rpm este furnizat cu o documentație managerială detaliată.
Ce este înăuntru.
Câteva cuvinte despre ce se întâmplă în timpul instalării și înlăturarea pachetului. După cum sa menționat deja, rpm automatizează operațiile de rutină. Când instalați (ștergeți) pachetele, puteți plasa orice eventuale acțiuni complicate pentru a configura pachetele instalate sau pentru a elimina urmele activității pachetelor șterse în scripturi. În funcție de poziția acestor scripturi în secvența canonică a acțiunilor, de exemplu, la instalarea pachetului, aceste scripturi se numesc scripturi de preinstalare sau postinstalare. Secvența standard de operații inițializată cu rpm la instalarea pachetului este:
Conflictele posibile sunt verificate (cea mai frecventă variantă a conflictului - pachetul cu același nume al unei versiuni mai recente este instalat în sistem);
fișierele de configurare sunt procesate;
fișierele binare sunt copiate în directoarele solicitate;
script-urile post-instalare sunt executate;
baza de date a pachetelor este actualizată.
Formatul pachetului rpm.
Formatul pachetului constă dintr-un antet binar și un cpio-arhivă, care conține fișiere binare într-un astfel de arbore de directoare, în care acestea vor fi în sistem după instalarea pachetului. Managerul de fișiere mc înțelege mai multe arhive, inclusiv pachetul rpm. În cazul în care MC evidenția rpm-pachet panou și apăsați enter, vom vedea un sistem de fișiere pseudo, format din următoarele componente: un director INFO, arhiva CONTENTS.cpio, cel care conține fișierele binare, fișierul antetului și psevdoskriptov instalat și de ACTUALIZARE. Directorul INFO conține fișiere ale căror nume corespund cu numele câmpurilor din fișierul spec, conținutul cu valorile câmpului. Fișierul HEADER este, în esență, același, numai într-un fișier. Legăturile INSTALL și UPGRADE corespund comenzilor rpm -ih <имя пакета> și rpm -Uh <имя пакета>. Asta este, dacă faceți clic pe ele, aceste acțiuni vor avea loc.
În format real, nu există niciun sistem de fișiere. Pur și simplu mc știe cum să interpreteze antetul binar al pachetului în felul său, pentru care dezvoltatorii săi au un mare respect.
Dacă doriți, puteți selecta cpio-arhiva din întregul pachet. Pentru a face acest lucru, există un utilitar rpm2cpio.
Vom colecta pachetul.
În versiunea rpm v.4 modul de construire a pachetelor este conceput ca un utilitar separat - rpmbuild. Vom folosi metoda cea mai eficientă de a studia tehnologia, adică vom asambla un pachet rpm-model. Nu există nicio întrebare despre ce ar trebui să facă programul, pe care îl vom împacheta în rpm. Ar trebui să spună: "Bună ziua, lumea!"!
În distribuțiile bazate pe rpm există un arbore de directoare special conceput exclusiv pentru a construi pachete. Se află în / usr / src (în Suse Linux - în / usr / src / packages) și conține directoarele BUILD, RPMS, SOURCES, SPECS, SRPMS. Acestea sunt concepute în mod corespunzător pentru stocarea directoarelor de asamblare temporare, a asamblării rpm binare, a codului sursă, a stocării fișierelor cu specificații și a pachetelor colecționate src.rpm. Src.rpm conțin coduri sursă și fișiere spec și sunt destinate reconstruirii pe mașinile țintă pentru a se adapta mai bine la arhitectura și mediul de sistem al acestor mașini. Pentru asamblare, avem nevoie de codul sursă al programului, care este în mod obișnuit ambalat în tar.gz sau tar.bz2 și spec-file. Fișierul spec pentru rpm este cam la fel ca Makefile pentru make. Acesta este un scenariu detaliat al ceea ce ar trebui să se întâmple atunci când se asamblează cu toate definițiile și domeniile de servicii necesare. Deci, pentru cauza.
int principal (int argc, char ** argv)
Nu uitați șirul gol la sfârșitul fișierului. Împachetăm codul sursă în tar.gz (dăm comanda, fiind în directorul / usr / src / packages / SOURCES):
# tar cvfz ./hi0.1.tar.gz ./hi.c
Sumar: utilitate de întâmpinare.