[Ubuntu] APT – Gestire un repository locale

Come già detto qualche articolo fa, APT utilizza i repository per scaricare ed installare i pacchetti che di volta in volta vogliamo sulla nostra macchina.
Questi repository sono localizzati in un file di testo chiamato sources.list. Contenuto nella directory /etc/apt/. Aprendo il file si noteranno righe che reindirizzano a location remote. I pacchetti che installiamo in questi casi, vengono scaricati da altre macchine in rete. E’ però possibile che, chi mette a disposizione un pacchetto *.deb per la nostra distribuzione, non abbia la possibilità di arrangiare un repository da farvi inserire nel sources.list.
In questi casi è molto probabile che vi ritroverete a scaricare direttamente un file *deb. Come trattarlo?

Se siete utenti schietti, potete installare il pacchetto con una sola riga di comando:

dpkg –install /paht/del/pacchetto.deb

Con questo comando il pacchetto *.deb saprà cosa fare di se stesso : - ) . L’installazione andrà a buon fine a patto che le dipendenze siano soddisfatte.
Il funzionamento di un pacchetto può infatti dipendere da altri pacchetti che installano librerie comuni ed indispensabili per il funzionamento di altri programmi.

Se le dipendenze non sono totalmente soddisfatte, potrebbe succedere che l’installazione parta, ma si blocchi a metà: nel momento in cui la dipendenza in questione risulta insoluta. E la cosa è abbastanza antipatica, perchè si va a sporcare il sistema con pacchetti installati a metà…

APT fornisce un buon supporto a tal proposito. Infatti, prescindendo dalla configurazione del processo di install del pacchetto, controlla a priori il soddisfacimento di tutte le condizioni necessarie per l’installazione.
Se qualche dipendenza va a vuoto, controlla automaticamente la possibilità di installare i file mancanti. In alternativa, non fa partire il processo di installazione, impedendo processi di install insoluti.
E’ un gran vantaggio, non pensate?! : - )

A questo punto ci si chiederà: "ma se ho il solo pacchetto *.deb scaricato direttamente sulla macchina, come faccio ad utilizzare il processo di installazione via APT?!"

La risposta è semplice: creiamo un repository locale!

Apriamo il terminale, e come prima cosa trasformiamoci in root : - ) . Per farlo gridate a scuarciagola "per il potere di Grayskoollll!!!!" e digitate:

sudo -s

Dopo aver convinto chi vi sta di fianco a ritirare l’istanza per l’interdizione legale, potete procedere come segue ; - ) .
Per facilitare la cosa, faremo un esempio pratico, creando un repository locale per l’ultima versione di aMule, scaricata dal sito del buon Treviño. Dopo aver scaricato sul desktop il pacchetto messo a disposizione nel post linkato, per semplicità rinominiamolo:

mv /home/davide/Desktop/amule_2.1.3-3v1-2ubuntu1dapper3_i386.deb /home/davide/Desktop/amule_2.1.3.deb

Questo passiaggio lo potete evitare. Io l’ho fatto solo perchè in questo modo il post risulterà più leggibile : - ) . E badate bene che il comando è dato in funzione della mia home, e del fatto che il file è stato scaricato sul Desktop dell’utente che uso abitualmente. Voi regolatevi di conseguenza.

NB.: Tutte le operazioni da ora in poi verranno eseguite nella directory /root

A questo punto creiamo la directory che ospiterà i nostro pacchetto:

mkdir /root/pkgs

Spostiamo il pacchetto dal Desktop alla directory appena creata:

mv /home/davide/Desktop/amule_2.1.3.deb /root/pkgs

E facciamo uno scanning dei pacchetti *.deb della directory, localizzandoci nella directory /root

cd /root
dpkg-scanpackages pkgs/ /dev/null | gzip > pkgs/Packages.gz
** Packages in archive but missing from override file: **
amule

Wrote 1 entries to output Packages file.

Spieghiamo la sintassi:

  • dpkg-scanpackages: è il comando per fare lo scanning dei *.deb
  • pkgs/: è la directory che abbiamo scannerizzato
  • /dev/null: sono le indicazioni di override. In pkgs avremmo potuto creare un file di override, dando indicazioni del nome, della priorità e della sezione. Questo avrebbe fatto si che tali coordinate sarebbero state usate prescindendo da quelle proprie del pacchetto. Usando invece /dev/null abbiamo deciso di non modificare il default del pacchetto.
  • gzip > Packages.gz: serve per creare un file .gz con le indicazioni di installazione e tutte le altre info usate da APT.

Non ci resta che dare le coordinate del nuovo repository ad APT. Apriamo il file sources.list:

gedit /etc/apt/sources.list

Ed aggiungiamo il repository

#Repository locale dei pacchetti contenuti in /root/pkgs/
deb file:/root pkgs/

Laciamo un update di apt, ed avremo il nostro nuovo repository disponibile : - )

apt-get update

Adesso possiamo installare e disinstallare i pacchetti contenuti in /root/pkgs/ usando APT o Synaptic, come faremo per i pacchetti remoti.
A questo proposito, proprio Synaptic ci da la prova del nove: io avevo installato nel sistema l’ultimo aMule disponibile sui repository, ovvero la versione 2.1.0. Subito dopo l’update, aprendo Synaptic, vedo che è disponibile un aggiornamento di aMule, che fa riferimento proprio al pacchetto *.deb presente in locale.

apt-locale

Notate la stellina gialla sul check di installazione, ed il fatto che la versione installate è la 2.1.0, mentre ultima versione disponibile segna la 2.1.3. Versione che ad oggi non è disponibile sui repository di ubuntu, ma che ho disponibile su un mio personale repository : - ) .

L’esempio aiuta a capire anche quanto sia utile la cosa. I repository universe sono quelli gestiti dalla community, e NON supportati da Ubuntu. Contengono tutti i programmi che di solito usiamo quotidianamente sul pc, quindi potete immaginare quanto sia importante come fonte.
Essendo però gestito dalla community, spesso risulta difficile trovare aggiornamenti tempestivi. Ed è più facile che singoli avventori (come Trevino…) mettano a disposizione i loro *.deb, senza poterli caricare su un repository.

Con la procedura vista, possiamo gestire in maniera incrociata e coordinata, i pacchetti universe forniti dal team Ubuntu, ed i pacchetti (spesso più aggiornati) scaricabili dalla rete. Il controllo incrociato di APT, ci permette di non installare pacchetti obsoleti, mal funzionanti, con dipendenze non soddisfatte.

Il discorso, ovviamente, non può prescindere dal fatto che la fonte dei *.deb scaricati DEVE essere attendibile ; - ) .

23 thoughts on “[Ubuntu] APT – Gestire un repository locale”

  1. Kubuntu non riconosce il comando:

    dpkg-scanpackages pkgs/ /dev/null | gzip > Packages.gz

    Se provo a digitare dpkg-scanpackages mi dice:
    “command not found”

    Devo installare qualche altra libreria?

  2. Ora l’ho installato e sembra andare tutto bene però quando ricarico da Synaptic la lista dei pacchetti mi dice errore perché in /root/pkgs non c’è il file Packages.gz.

    Ho controllato e infatti non c’è ma sta in /home/lorenzo (il mio nome utente) ho provato a spostarlo via GUI in /root/pkgs ma mi dice accesso negato.

    Allora ho provato a farlo via terminale mv /home/lorenzo/Packages.gz /root/pkgs però mi dice sempre accesso negato!!!

    Ho provato a riavviare ma è lo stesso!
    Non posso neanche modificare i permessi della cartella /root/pkgs!

    Questa cosa mi era successa anche quando, ieri, provavo a modificare il file sources.list, mi diceva accesso negato.

    Oggi invece lo posso modificare! : - o
    Boh…?!?

  3. M’ero dimenticato un kpgs… Ora l’istruzione di scanpackages è corretta.

    Per il resto, quando NON ti fa fare qualcosa, è perchè non hai i permessi sufficienti.
    Ho editato l’articolo specificando meglio un concetto: tutta la procedura, va fatta come utente root nella directory /root/.

    Quando ti trasformi in root, resti sempre nella home del tuo utente. Normale che il Packages.gz si crei li…
    Se poi, non sei root, non puoi spostarlo…

  4. Ora va… però mi sa che hai sbagliato a scrivere la riga da mettere nel terminale (credo), perché dovrebbe essere:

    dpkg-scanpackages /root/pkgs/ /dev/null | gzip > /root/pkgs/Packages.gz

    …e non:

    dpkg-scanpackages pkgs/ /dev/null | gzip > pkgs/Packages.gz

    A me nel primo modo funziona, nel secondo NO! : - D

  5. @ lorenzone: se stai in /root/ non c’è bisogno di scrivere l’indirizzo assoluto per il *.gz e per la path da scannerizzare…

    Dopo esserti trasformato in root, digita:

    cd /root

    E vedrai che i comandi funzioneranno anche con il percorso relativo (ricorda: il percorso relativo è sempre in fuzione della directory in cui sei in quel momento).

  6. Avevo fatto un casino con il file Packages.gz ora va tutto bene …

    Due domande
    1. Come mai non riuscivo a cancellare via GUI il file Packages.gz? Non ero root? Comunque ci sono riuscito via Terminale …

    2. Ho messo Kubuntu al posto di Ubuntu per prova, ora però voglio usare kdm al posto di konqueror. Ho provato a fare:

    sudo dpkg-reconfigure kdm

    Ma non cambia niente!!!

  7. Però quando vado ad installare un file .deb presente nel mio nuovo repository synaptic dice:

    W: Errore nello scaricamento di file:/root//root/pkgs//file.deb
    File non trovato

    L’indirizzo è sbagliato!!

  8. Se tu seguissi le indicazioni senza prendere troppa iniziativa…
    Segui il post, la procedura è corretta com’è postata.
    Fai tutto dentro /root come scritto sopra…

  9. Non mi ricordo come si chiamava il programma, mi ricordavo kdm ma non so esattamente se è quello il nome … : - D
    Ora comunque riprovo a fare la procedura… : - Z

  10. Ma se un programma è contenuto in due repository ed ha lo stesso nome, sono aggiornati all’ultima versione tutti e due ma uno è ottimizzato per i processori AMD (per esempio)? Quale viene scelto?

  11. Non ne sono sicuro, ma dovrebbe prendere quello locale.
    In caso di repository che fanno riferimento a file locali e cd-rom, apt-get va in http solo in caso di numero versione superiore.

    Ma scusa, un pacchetto ottimizzato non ha un nome di riferimento diverso?

  12. Ghghgh…
    Se avessi scritto “con il .deb usa dpkg –install” ci saremmo risparmiati una decina di commenti e lorenzone avrebbe già installato il suo pacchetto : - D

    PS: usare apt con un repository locale è la prima cosa che ho fatto con ubuntu. Avevo ancora quello schifo di win modem, per cui, avviavo win, scaricavo i pacchetti, tentavo di installarli, ma mancava sempre una dipendenza S - (
    Allora riavviavo win, riscaricavo i pacchetti mancanti, cercavo di installare, ma mancavano dipendenze delle dipendenze…

    Al decimo tentativo ho avviato la procedura d’emergenza: ho spento il pc, mi sono vestito, sono andato a comprare il router, sono tornato a casa e v********o al repository locale!!!

  13. @Zizio: E’ da una settimana che ho Linux e non so davvero nienteeee! : - D : - D

    Comunque ho provato sia Ubuntu che Kubuntu e mi sembra meglio Ubuntu!
    La grafica del desktop è meglio un Kubuntu ma non è importante. Una cosa importante è invece che Kubuntu mi sembra una schifezza in confronto a Gnome-desktop.

    E mi da fastidio che un software possa fare molto cose insieme, fra cui navigare sul web e in locale!

    Ora ho deciso di utlizzare Ubuntu e, come browser, Firefox.

    Ciao! : - D

  14. Nel commento di sopra volevo dire “Una cosa importante è invece che Konqueror mi sembra una schifezza in confronto a Hnome-dekstop” e non che Kubuntu è una schifezza in confronto … : - D
    Scusate … 8 - )

  15. Ah lorenzò… usi il pinguino da una settimana e ti permetti di definire *schifezza* KDE e tutto quello che ruota attorno? 8 - )
    Su dai…. : - )

    Che io aspetto sempre un editor di testo paragonabile a kate per gnome…

    Gnome è più basilare, forse anche più facile, ma kde ha sicuramente margini di personalizzazione maggiori!
    Poi è questione di gusti, come ogni cosa in una cerca misura : - )

Comments are closed.