Come installare programmi su Linux: repository, pacchetti e package manager
Come installare programmi su Linux usando repository e package manager. Guida a pacchetti, dipendenze, APT, DNF, pacman, Flatpak, Snap e AppImage.
Installare un programma su Linux può sembrare strano quando si arriva da
Windows. Siamo abituati a cercare il sito del produttore, scaricare un file
.exe o .msi, avviarlo e seguire una procedura guidata. Su Linux, invece,
incontriamo quasi subito parole come repository, pacchetti, package
manager, APT, DNF, pacman, Flatpak, Snap e AppImage.
A prima vista potrebbe sembrare un sistema più complicato. In realtà Linux utilizza un modello differente: il software viene normalmente gestito come parte integrante del sistema operativo.
Questo approccio permette alla distribuzione di sapere quali programmi sono installati, quali librerie utilizzano, quali versioni sono disponibili e quali aggiornamenti devono essere applicati. È un modello particolarmente importante non soltanto sui computer desktop, ma soprattutto sui server Linux, dove installazione e aggiornamento del software devono poter essere controllati e automatizzati.
Vediamo quindi come funziona realmente l’installazione dei programmi su Linux.
Installare un programma non significa semplicemente copiare un file
Quando apriamo un’applicazione tendiamo a immaginarla come un singolo programma. Dal punto di vista del sistema operativo, però, la situazione è spesso molto più articolata.
Un’applicazione può essere composta da un eseguibile principale, diverse librerie, file di configurazione, icone, documentazione e altre risorse. Può inoltre dipendere da componenti già presenti nel sistema.
Pensiamo, per esempio, a un programma che utilizza una particolare libreria grafica e una libreria per la crittografia. Per poter funzionare correttamente, quelle librerie devono essere disponibili e devono essere presenti in versioni compatibili.
È qui che entra in gioco il concetto di pacchetto Linux.
Cos’è un pacchetto Linux
Un pacchetto è una forma organizzata attraverso cui una distribuzione può distribuire e gestire il software.
Non contiene soltanto i file del programma. Contiene anche informazioni utili al sistema, come il nome del software, la versione, l’architettura supportata e le dipendenze necessarie.
Il sistema può inoltre sapere quali file appartengono a quel pacchetto e utilizzare queste informazioni quando il programma dovrà essere aggiornato oppure rimosso.
Possiamo quindi pensare al pacchetto come a un programma accompagnato da una serie di metadati che permettono alla distribuzione di gestirlo nel tempo.
Questa caratteristica distingue profondamente il modello Linux dall’idea di scaricare semplicemente un eseguibile e copiarlo sul computer.
Pacchetti .deb: Debian, Ubuntu e Linux Mint
Uno dei formati più conosciuti è .deb.
I pacchetti Debian vengono utilizzati da Debian stessa e da numerose distribuzioni derivate, tra cui Ubuntu e Linux Mint.
Un file .deb contiene software preparato secondo le convenzioni di questo
ecosistema.
È però importante distinguere il formato del pacchetto dal package manager.
Un file .deb è un pacchetto. APT è invece uno degli strumenti utilizzati per
gestire software e repository nelle distribuzioni basate su Debian.
Quando utilizziamo un comando come:
bash sudo apt install nomeprogramma
non stiamo semplicemente chiedendo ad APT di scaricare un file. Gli stiamo chiedendo di individuare il pacchetto corretto, verificare quali altri componenti siano necessari, recuperarli e integrarli nel sistema.
Sotto APT esistono anche strumenti di livello più basso, come dpkg, ma per
comprendere il modello generale è sufficiente ricordare che .deb identifica
il formato del pacchetto, mentre APT gestisce l’intero processo ad un livello
più alto.
Pacchetti RPM e DNF
Un altro grande ecosistema è quello dei pacchetti RPM.
RPM viene utilizzato da distribuzioni come Fedora e Red Hat Enterprise Linux, oltre che da altri sistemi Linux.
Anche qui dobbiamo fare la stessa distinzione.
RPM rappresenta il formato e una parte degli strumenti di gestione dei pacchetti. Su Fedora, invece, l’utente utilizza normalmente DNF per installare e aggiornare il software.
Un comando concettualmente equivalente a quello visto con APT potrebbe quindi essere:
bash sudo dnf install nomeprogramma
La sintassi cambia, ma il concetto rimane praticamente lo stesso.
La distribuzione dispone di repository. Il package manager consulta quei repository, individua il software richiesto, controlla le dipendenze e gestisce l’installazione.
Arch Linux utilizza invece pacman, con un proprio formato e un proprio ecosistema di pacchetti.
Capire questa distinzione è molto più utile che memorizzare semplicemente una serie di comandi. APT, DNF e pacman sono strumenti differenti che svolgono una funzione architetturale molto simile.
Cos’è un package manager
Il package manager, o gestore dei pacchetti, è uno dei componenti più importanti di una distribuzione Linux.
Il suo compito non consiste soltanto nell’installare programmi.
Il package manager tiene traccia del software presente nel sistema, conosce le versioni disponibili, gestisce le dipendenze e permette di aggiornare oppure rimuovere i pacchetti.
Quando chiediamo di installare un’applicazione, il package manager deve determinare quale pacchetto utilizzare e verificare che tutti i componenti necessari siano presenti.
Se una libreria richiesta manca, può installarla automaticamente. Se quella libreria è già installata in una versione compatibile, può riutilizzarla.
In questo modo Linux mantiene una visione coerente del software installato sulla macchina.
Da dove arrivano i programmi? I repository Linux
Il package manager ha bisogno di una sorgente da cui recuperare i pacchetti.
Questa sorgente è rappresentata dai repository Linux.
Un repository è un archivio organizzato di pacchetti software, accompagnato dalle informazioni necessarie per descriverli.
Non dobbiamo quindi immaginare un repository come una semplice directory piena di file.
Contiene anche metadati che permettono al package manager di sapere quali pacchetti sono disponibili, quali versioni esistono e quali dipendenze sono necessarie.
Quando installiamo una distribuzione Linux, normalmente vengono configurati alcuni repository ufficiali.
Se chiediamo al package manager di installare un programma, non è necessario cercare manualmente quel software su Internet. Il gestore dei pacchetti consulta le sorgenti già configurate e cerca il pacchetto al loro interno.
Questa è una delle differenze più importanti rispetto al tradizionale modello di installazione Windows.
Repository Linux contro download di un .exe
Nel modello tradizionale basato sul download diretto, il percorso è grosso modo questo:
text Utente → sito web → file installer → installazione
Nel modello Linux basato sui repository il percorso diventa invece:
text Utente → package manager → repository → pacchetto
Nel primo caso è l’utente a dover individuare il sito corretto, scaricare il programma e verificarne la provenienza.
Nel secondo caso il sistema possiede già una serie di sorgenti software configurate.
Questo non significa che su Linux sia impossibile scaricare software direttamente da Internet. È assolutamente possibile. Significa semplicemente che non rappresenta necessariamente il metodo principale con cui viene gestito il software della distribuzione.
Cosa sono le dipendenze
Uno dei motivi principali per cui esistono i package manager sono le dipendenze software.
Un programma raramente contiene tutto ciò che gli serve.
Può utilizzare una libreria grafica, un runtime, una libreria crittografica oppure altri componenti condivisi.
Supponiamo di installare un’applicazione che richiede tre librerie. Una di queste potrebbe a sua volta richiedere un ulteriore pacchetto.
Il package manager conosce queste relazioni.
Può quindi costruire automaticamente la catena necessaria e installare tutto ciò che serve.
Senza un sistema di questo tipo l’utente dovrebbe scoprire manualmente ogni dipendenza, trovare la versione corretta e installarla.
Questo problema viene spesso indicato con l’espressione dependency hell, cioè l’inferno delle dipendenze.
Perché la distribuzione cerca di mantenere pacchetti coerenti
Nel video precedente della serie abbiamo visto che una distribuzione Linux non è soltanto un kernel accompagnato da alcune applicazioni.
È anche una politica di gestione del software.
Debian, Ubuntu, Fedora e Arch Linux decidono quali versioni dei programmi e delle librerie rendere disponibili nei propri repository.
Questa scelta permette di mantenere un ambiente relativamente coerente.
Un’applicazione viene preparata tenendo conto delle librerie disponibili. Le librerie vengono aggiornate secondo le politiche della distribuzione. Gli aggiornamenti vengono testati e pubblicati attraverso i repository.
È anche per questo motivo che lo stesso programma può essere disponibile in versioni differenti su distribuzioni diverse.
Una distribuzione orientata alla stabilità può mantenere una versione per molto tempo, applicando però le correzioni di sicurezza necessarie. Una distribuzione rolling release può invece mettere a disposizione versioni molto più recenti.
Gli aggiornamenti centralizzati sono uno dei punti di forza di Linux
Il modello dei repository non serve soltanto a installare software.
Uno dei suoi vantaggi principali riguarda gli aggiornamenti.
Molto del software installato attraverso i repository può essere aggiornato utilizzando lo stesso meccanismo.
Il package manager può aggiornare contemporaneamente componenti del sistema, librerie, utility, applicazioni e servizi.
Non è quindi necessario che ogni programma implementi obbligatoriamente un proprio sistema di aggiornamento.
Questo rende la manutenzione del computer più ordinata.
Diventa ancora più importante quando dobbiamo gestire molti sistemi contemporaneamente.
Repository e sicurezza
Il modello repository offre anche vantaggi dal punto di vista della sicurezza.
Le distribuzioni utilizzano normalmente meccanismi crittografici per verificare l’autenticità e l’integrità dei metadati e dei pacchetti distribuiti.
L’obiettivo è permettere al sistema di accertarsi che ciò che sta ricevendo provenga dalla sorgente prevista e non sia stato modificato durante la distribuzione.
Questo riduce la necessità di scaricare continuamente software da siti differenti.
Naturalmente repository non significa automaticamente software sicuro.
Un programma può comunque contenere vulnerabilità. Inoltre un utente può configurare repository di terze parti che non sono gestiti direttamente dalla distribuzione.
Aggiungere un repository significa quindi, in un certo senso, aggiungere una nuova sorgente a cui decidiamo di dare fiducia.
Per questo conviene sempre verificare chi mantiene il repository prima di aggiungerlo al sistema.
Installare manualmente un file .deb o .rpm
Su Linux è comunque possibile scaricare direttamente un pacchetto .deb oppure
.rpm.
Molti produttori distribuiscono il proprio software in questo modo quando il programma non è presente nei repository ufficiali.
In questo caso, però, è l’utente a scegliere la sorgente.
Il fatto che un file termini con .deb non significa che sia affidabile.
L’estensione descrive il formato del pacchetto, non chi lo ha prodotto.
Conviene quindi scaricare il software dal sito ufficiale del produttore e verificare che il pacchetto sia effettivamente destinato alla propria distribuzione.
Una volta installato, il pacchetto può comunque entrare nel sistema di gestione software della distribuzione, anche se non proviene dai repository ufficiali.
AppImage: un programma in un singolo file
Accanto ai pacchetti tradizionali esistono altri sistemi di distribuzione del software Linux.
Uno dei più semplici da capire è AppImage.
L’idea è distribuire un’applicazione come un file relativamente autonomo che contiene gran parte di ciò che serve per funzionare.
In molti casi è sufficiente scaricare l’AppImage, renderla eseguibile e avviarla.
Non avviene quindi una vera installazione nel senso tradizionale del termine.
Questo rende AppImage molto interessante per distribuire lo stesso programma su distribuzioni differenti.
Il compromesso è che il software rimane più separato dal normale sistema di gestione dei pacchetti della distribuzione.
Flatpak: applicazioni desktop indipendenti dalla distribuzione
Flatpak prova a risolvere un altro problema tipico dell’ecosistema Linux: distribuire la stessa applicazione desktop su distribuzioni differenti.
Un’applicazione Flatpak non dipende direttamente da tutte le specifiche librerie installate nel sistema.
Può utilizzare dei runtime condivisi che forniscono l’ambiente necessario.
Flatpak introduce inoltre un modello di sandboxing, nel quale l’applicazione può essere eseguita con un accesso più controllato alle risorse della macchina.
Il repository più conosciuto per le applicazioni Flatpak è Flathub, utilizzato oggi da molte distribuzioni desktop.
Il sandboxing non significa però sicurezza assoluta. I permessi concessi all’applicazione continuano a essere importanti.
Snap
Snap segue una filosofia simile sotto diversi aspetti.
I pacchetti Snap possono includere molti dei componenti necessari all’applicazione e utilizzano meccanismi di isolamento chiamati confinement.
Snap è fortemente collegato a Ubuntu e Canonical e dispone di un sistema centralizzato di distribuzione e aggiornamento.
Può essere utilizzato sia per applicazioni desktop sia per altri tipi di software.
Per chi sta iniziando non è necessario conoscere tutte le differenze tecniche tra Flatpak e Snap.
Il concetto fondamentale è che entrambi cercano di ridurre la dipendenza dell’applicazione dalle specifiche versioni delle librerie presenti nella distribuzione.
Pacchetti tradizionali, Flatpak, Snap o AppImage?
Non esiste una risposta valida per ogni situazione.
I pacchetti tradizionali sono fortemente integrati con la distribuzione e permettono di condividere molte librerie tra applicazioni differenti.
Flatpak e Snap cercano invece di rendere il software più indipendente dall’ambiente sottostante.
AppImage punta sulla semplicità di un file portabile.
Ogni approccio rappresenta quindi un compromesso tra integrazione con il sistema, portabilità, isolamento, dimensione dei pacchetti e modalità di aggiornamento.
Sul desktop è normale incontrare più di uno di questi sistemi contemporaneamente.
Perché esistono così tanti formati su Linux
La presenza di .deb, RPM, Flatpak, Snap e AppImage potrebbe sembrare
un’ulteriore complicazione.
La causa principale è la grande varietà dell’ecosistema Linux.
Le distribuzioni possono utilizzare versioni differenti delle librerie e organizzare il sistema in modi differenti.
Per uno sviluppatore, produrre e mantenere un pacchetto specifico per ogni distribuzione richiede tempo.
I formati più universali cercano quindi di ridurre questo problema.
Lo sviluppatore può distribuire un’applicazione relativamente indipendente dalle caratteristiche specifiche della distribuzione utilizzata dall’utente.
Perché i repository sono fondamentali sui server Linux
Il vero valore del modello dei pacchetti diventa particolarmente evidente sui server.
Immaginiamo di amministrare cento server Linux.
Gestire ogni applicazione andando manualmente sul sito del produttore, scaricando un installer e completando una procedura interattiva sarebbe estremamente inefficiente.
Con repository e package manager il processo diventa ripetibile.
Possiamo sapere quali pacchetti sono installati, da quali sorgenti provengono e quali versioni sono presenti.
Possiamo inoltre automatizzare installazioni e aggiornamenti.
È una caratteristica fondamentale negli ambienti server, cloud e DevOps.
Software come infrastruttura
Nel mondo server moderno il software non viene più considerato semplicemente qualcosa che un amministratore installa manualmente.
Un server può essere creato automaticamente nel cloud.
Uno script può installare i pacchetti necessari.
Un sistema di configuration management può applicare le configurazioni richieste.
Una pipeline può costruire ambienti sempre uguali.
Il package manager diventa quindi un componente fondamentale dell’automazione dell’infrastruttura.
La macchina non deve essere configurata sulla base di ciò che un amministratore ricorda di aver installato.
Può essere descritta in modo ripetibile: questi pacchetti, provenienti da queste sorgenti, con queste configurazioni.
Cosa succede quando installiamo un programma su Linux
Possiamo ora ricostruire l’intero percorso.
Chiediamo al package manager di installare un programma.
Il package manager consulta i repository configurati e individua il pacchetto richiesto. Legge i metadati e verifica le dipendenze.
Se alcuni componenti mancano, li aggiunge alla lista dei pacchetti da installare.
Scarica quindi il software, esegue i controlli previsti dalla distribuzione e installa i file nelle directory corrette.
Infine registra ciò che è stato installato.
Da quel momento il programma può essere gestito dallo stesso sistema anche durante gli aggiornamenti successivi.
È questa la vera differenza rispetto alla semplice idea di scaricare un installer.
Gli errori più comuni nell’installazione dei programmi Linux
Il modello è molto ordinato, ma può diventare confuso quando utilizziamo contemporaneamente molte sorgenti diverse.
Un errore frequente è scaricare pacchetti da siti casuali solo perché hanno
l’estensione .deb o .rpm.
Un altro è aggiungere repository di terze parti senza verificare chi li gestisce.
Può inoltre capitare di installare la stessa applicazione più volte: una versione dal repository della distribuzione, una tramite Flatpak e magari un’altra AppImage.
Quando qualcosa non funziona diventa poi difficile capire quale versione stiamo realmente utilizzando.
Per questo conviene mantenere il sistema il più possibile comprensibile e sapere da dove proviene il software installato.
Installare programmi su Linux è un modello, non un insieme di comandi
La cosa più importante da ricordare è che imparare a installare software su
Linux non significa memorizzare apt, dnf o pacman.
Questi sono soltanto strumenti.
Il concetto fondamentale è il modello che sta dietro.
La distribuzione mette a disposizione dei repository. Nei repository troviamo pacchetti. Il package manager gestisce questi pacchetti, controlla le dipendenze e coordina installazioni e aggiornamenti.
Accanto a questo modello tradizionale esistono soluzioni come Flatpak, Snap e AppImage, pensate per rendere le applicazioni più portabili o più indipendenti dalla distribuzione.
Una volta compresa questa struttura, installare programmi su Linux diventa molto meno misterioso.
E soprattutto diventa chiaro perché questo modello sia così importante proprio negli ambienti dove Linux è maggiormente utilizzato: server, cloud, infrastrutture e sistemi amministrati su larga scala.
Nel prossimo episodio di Capire Linux faremo un ulteriore passo avanti.
Dopo aver visto come installare e gestire il software, vedremo come capire
cosa non funziona su Linux, introducendo log, /var/log, journalctl e un
metodo ordinato per affrontare il troubleshooting.