Avete trovato la vostra distro perfetta ma non c'è purtroppo un pacchetto compatibile proprio di quel programma che vi piace tanto e che non si trova nemmeno in formato Flatpak o Appimage? Avete installato Fedora e vi trovate bene ma vi mancano gli aggiornamenti di versione rapidi dei programmi di ArchLinux? Avete bisogno di un ambiente flessibile sulla vostra rigida distro immutabile? Nessun problema: con Distrobox potete avere tutte (o quasi) le distro che volete all'interno della vostra

[LINUX] Guida completa Distrobox: tutte distro vuoi, tutte insieme!

» Leggi: Fedora la distro per tutti sponsorizzata da RedHat

» Leggi: [Linux] Che cosa sono i sistemi "immutabili"?

Questo progetto, creato dall'italiano Luca Di Maio e disponibile su moltissime distribuzioni Linux, fa uso dei cosiddetti container (contenitori) ovvero una sorta di macchine virtuali ma più limitate, nelle funzioni ma anche nella richiesta di risorse, per poter "virtualizzare" molte delle distro che potete desiderare (qui trovate una tabella delle distro "virtualizzabili"). Si presenta come uno strumento da linea di comando che si offre come supporto per facilitare la creazione di container appoggiandosi ad altri programmi dedicati come Lillipod (dello stesso sviluppatore), Docker e Podman ma attenzione: mentre con questi ultimi due programmi si possono creare container anche per isolare i programmi che girano all'interno, dal sistema che li ospita, questa non è la priorità di Distrobox! Infatti l'obbiettivo che si pone non è tanto l'esecuzione sicura e isolata dei programmi quanto la perfetta integrazione di questi con il sistema principale; i container creati hanno accesso a molte parti del sistema, quasi come un programma istallato nella maniera tradizionale. Niente sandbox quindi, almeno per il momento...

Bene dopo questa breve presentazione, vediamolo in azione! Per questa guida utilizzerò la mia distro preferita, OpenSUSE, molti dei passaggi propedeutici al corretto funzionamento di Distrobox saranno simili e richiederanno solo qualche aggiustamento dei comandi mentre la parte riguardante il funzionamento sarà pressoché identica.

» Leggi: OpenSUSE Tumbleweed: buon divertimento con la migliore distro!

Installazione e configurazione preventiva

È probabile che Distrobox sia già nei repo della nostra distro, quindi installarlo sarà piuttosto semplice. Se invece non fosse presente, possiamo seguire le istruzioni per l'installazione "manuale", sfruttando curl o wget.

Se installato da repo, Distrobox dovrebbe avere come dipendenza anche uno dei programmi che utilizza per la creazione dei container, nel mio caso è docker ma, se vi si presentasse una scelta, è preferibile utilizzare Podman perché, in modalità senza permessi di root (rootless), è considerato più sicuro dato che, diversamente da Docker, non ha demoni in esecuzione.

[LINUX] Guida completa Distrobox: tutte distro vuoi, tutte insieme!

Una volta installato tutto (dipendenze comprese) dovremo assicurarci che il nostro utente possa utilizzare i container senza dover ricorrere a root (eseguire programmi senza ricorrere ai massimi privilegi ha indubbi vantaggi...).

Per raggiungere questo obbiettivo con Docker sarà sufficiente aggiungere il nostro utente al gruppo docker (magari dopo aver verificato che questo gruppo già esiste), avviare e programmare l'avvio automatico del demone docker e, per semplificarci un bel po' la vita in seguito, eseguire un riavvio del sistema. Per farlo dovremo impartire giusto 3-4 comandi:

cat /etc/group | grep docker

sudo usermod -aG docker $USER

sudo systemctl enable --now docker

sudo reboot

[LINUX] Guida completa Distrobox: tutte distro vuoi, tutte insieme!

Qualora volessimo utilizzare Podman al posto Docker anche su OpenSUSE, sarà sufficiente installare podman prima di distrobox: in questo modo la dipendenza sarà già risolta e non verrà installato docker.

Per configurare Podman per essere utilizzato senza root, sarà sufficiente accertarsi che i file /etc/subuid e /etc/subgid contengano la stringa con il nostro nome utente seguito da :100000:65536 (ad esempio, cub3:100000:65536).

Bene a questo punto siamo pronti per creare il nostro primo container!

Creazione di un container

Creare un container è talmente semplice che c'è ben poco da aggiungere al solo comando; se ad esempio voglio creare un container con ArchLinux (che nominerò arch), il comando sarà:

distrobox create --image archlinux --name arch

[LINUX] Guida completa Distrobox: tutte distro vuoi, tutte insieme!

Fatto! Il contenitore così creato sarà permanente (almeno fino a che non lo rimuoveremo manualmente con il comando distrobox rm arch); se invece volessimo creare un contenitore usa e getta il comando sarà simile al precedente ma al posto di create dovremo utilizzare ephemeral: in questo modo il contenitore verrà eliminato non appena faremo logout. È anche possibile indicare una particolare versione della distro da installare, aggiungendo dopo il nome dell'immagine : e la versione interessata (ad esempio distrobox create --image ubuntu:22.04 --name ubuntuLTS); se la versione non viene indicata, verrà utilizzata l'ultima disponibile. Per vedere tutte le distro che possiamo utilizzare per la creazione dei container, possiamo impartire il comando distrobox create --compatibility.

Con il comando create, distrobox scaricherà un immagine della distro scelta da diversi repository online: alcune immagini saranno fornite da uno strumento simile distrobox che però non è altrettanto versatile e facilmente configurabile, toolbox, altre immagini si trovano sull'hub di docker mentre altre sono fornite direttamente dalle distro stesse (è il caso di OpenSUSE, RedHat, OracleLinux e poche altre).

Durante la creazione del container possiamo anche utilizzare alcune opzioni per limitare l'accesso del container alle risorse del sistema, vediamone alcune:

  • --unshare-devsys: non condivide i dispositivi presenti nell'host ne lo speciale filesystem che fa da interfaccia tra questi e il kernel con il container;
  • --unshare-groups: non aggiunge i gruppi a cui appartiene il nostro utente principale all'utente che viene creato dentro il container;
  • --unshare-ipc: non condivide le comunicazioni tra i processi;
  • --unshare-netns: non condivide dispositivi e interfacce di rete;
  • --unshare-process: non condivide i percorsi relativi alle informazioni sui processi;
  • --unshare-all: attiva tutti le voce precedenti in una volta.

Un'altra cosa che possiamo fare durante la creazione è specificare alcuni pacchetti da installare automaticamente e da elencare dopo l'opzione --additional-packages oppure passare alcuni flag (come, ad esempio, impostare alcune variabili di ambiente) per l'avvio del container con l'opzione --additional-flag. Inoltre possiamo specificare una cartella $HOME diversa con l'opzione --home seguita dal path della nuova home e montare altri percorsi del nostro sistema principale all'interno del container con l'opzione --volume anche in questo caso seguita dal path interessato.

Adesso potremo avviare ed entrare nel nuovo contenitore con un altro semplice comando:

distrobox enter arch

[LINUX] Guida completa Distrobox: tutte distro vuoi, tutte insieme!

Dopo una veloce configurazione automatica, durante la quale potrebbero essere scaricati alcuni pacchetti software, se abbiamo come backend docker, dovremo impostare una password per il nostro utente (che consiglio di scegliere diversa da quella del nostro utente sul sistema principale, per evitare di confondersi) che servirà per poter utilizzare i massimi privilegi (tramite sudo, ad esempio) all'interno del container, opzione ovviamente necessaria per poter configurare il container con l'installazione di altri programmi oltre a quelli base. Attenzione: ricordate sempre che Distrobox non è una sandbox, qualunque operazione eseguita come root all'interno del container può avere effetti anche fuori da questo, prestate sempre la massima attenzione!

Se l'host ha una particolare configurazione dei sudoers (come ad esempio, OpenSUSE), nelle ultime versioni di Distrobox, si potrebbe presentare un problema: quando andiamo ad utilizzare sudo all'interno del contenitore, potrebbe apparire un messaggio che ci informa che il nostro utente non è nel gruppo dei sudoers e quindi non può utilizzare i massimi privilegi per eseguire operazioni come l'aggiornamento del sistema o l'installazione di altri pacchetti.

[LINUX] Guida completa Distrobox: tutte distro vuoi, tutte insieme!

Possiamo porvi rimedio in diversi modi ma il più pratico e meno invasivo per il nostro sistema principale è quello di accedere al container appena creato come root. Questo non può essere fatto direttamente tramite Distrobox ma possiamo scendere di un livello e utilizzare direttamente docker.

Prima però dobbiamo uscire dalla sessione corrente del container, semplicemente digitando exit; in questo modo il container rimarrà attivo e potremo accedervi come root, invocando il comando che esegue bash con i massimi privilegi all'interno del container arch:

docker exec -it arch bash

A questo punto dovremo semplicemente aggiungere il nostro utente al gruppo wheel e decommentare la linea interessata nel file /etc/sudoers. Per fare questa operazione, dato che si tratta di un container che non ha nient'altro che i pacchetti base, potremo utilizzare un normale editor di testo ma, quando abbiamo a che fare con il file /etc/sudoers, c'è un comando particolare da utilizzare per la modifica, che controlla, prima di salvare, che non abbiamo commesso errori di sintassi; prendiamo subito le buone abitudini! Questo comando è visudo che però utilizza come editor, vi, molto potente e versatile (se lo si sa utilizzare) ma decisamente poco amichevole con i neofiti, per questo cambieremo l'editor con nano (che potrebbe essere da installare), decisamente più semplice da utilizzare. In definitiva i comandi saranno quindi:

gpasswd -a nomeutente wheel

pacman -S nano

export EDITOR=nano;

visudo

Cancellare # davanti alla riga che contiene %wheel e salvare premendo Ctrl+X, conferma con Y e infine uscire da docker con il comando exit.

[LINUX] Guida completa Distrobox: tutte distro vuoi, tutte insieme!

A questo punto, possiamo riavviare il container con il comando distrobox stop arch e rientrando con il comando già visto distrobox enter arch; adesso riprovando ad acquisire i massimi privilegi tramite sudo, tutto dovrebbe andare come previsto.

[LINUX] Guida completa Distrobox: tutte distro vuoi, tutte insieme!

In caso di utilizzo di Podman invece, in quanto più limitato, non verrà proposta la creazione di una password e l'utente creato all'interno del container potrà avvalersi di sudo senza utilizzare nessuna password.

Funzionamento

Una volta dentro il container, possiamo utilizzare la nostra distro quasi normalmente. Siamo in un terminale, è vero, manca l'interfaccia grafica, ma non è necessaria per utilizzare i programmi con GUI. Dato che Distrobox espone al container un socket per la comunicazione con Wayland o Xorg del nostro principale sistema, possiamo comunque utilizzare questi programmi semplicemente invocandoli nel terminale!

[LINUX] Guida completa Distrobox: tutte distro vuoi, tutte insieme!

Nell'immagine sopra si può vedere che avviando qmapshack da dentro il container, si apre la finestra di questo programma nel sistema principale (nella barra del titolo della finestra, possiamo leggere @arch.localhost.localdomain).

Ma possiamo fare di meglio. Possiamo infatti creare un link al programma interessato che gira dentro il nostro container, direttamente nel menu delle applicazioni del nostro sistema principale! Per farlo, da dentro il container, possiamo utilizzare il comando:

distrobox export --app nomeapp

[LINUX] Guida completa Distrobox: tutte distro vuoi, tutte insieme!

In questo modo, potremo utilizzare il programma dentro il container come se fosse un normale programma del nostro sistema principale, semplicemente cliccando sul link appena creato, senza doverci preoccupare di avviare o entrare dentro il container.

Anche per aggiornare i container non è necessario avviarli o accedervi, possiamo farlo direttamente con Distrobox, tramite il comando:

distrobox upgrade --all

[LINUX] Guida completa Distrobox: tutte distro vuoi, tutte insieme!

Abbiamo visto già molti dei comandi disponibili di distrobox, vediamo adesso quelli mancanti. Per elencare tutti container creati possiamo utilizzare il comando:

distrobox list

[LINUX] Guida completa Distrobox: tutte distro vuoi, tutte insieme!

Dall'output del comando possiamo vedere anche quali sono quelli attivi e da quanto tempo sono avviati.

Per ognuno dei container creati possiamo creare un link nel menu delle applicazioni del nostro sistema host, per avviare facilmente una shell già dentro al container, con il comando:

distrobox generate-entry nomecontainer

[LINUX] Guida completa Distrobox: tutte distro vuoi, tutte insieme!

C'è anche il comando assemble che generalmente non interessa l'utente medio in quanto è utilizzato per creare molti container in una volta che vengono specificati in un particolare file.

Mancano solo due comandi che, come export, sono riservati all'interno del container: il primo init, non è pensato per essere utilizzato dall'utente ma viene eseguito automaticamente e serve per fare la prima configurazione del container al momento della creazione, mentre il secondo è host-exec che serve per eseguire programmi sul sistema principale mentre ci troviamo all'interno del container, ad ulteriore riprova che non c'è sandbox!

Boxbuddy

Non vi piace la riga di comando, nemmeno per utilizzare uno strumento il cui funzionamento è estremamente semplice come Distrobox? Allora potete utilizzare un'interfaccia grafica per Distrobox, non ufficiale: BoxBuddy. È disponibile come pacchetto Flatpak e, una volta installato, rileva subito i container precedentemente creati.

» Leggi: [LINUX] Guida completa a Flatpak

Da questo è possibile avviare, fermare o aggiornare un container, aprire un terminale per ognuno e, naturalmente, creare nuovi container ma con opzioni, al momento, molto limitate.

Se la nostra distro supporta i pacchetti .deb o .rpm, possiamo installarli direttamente tramite BoxBuddy. Dovrebbe essere possibile anche vedere le applicazioni installate all'interno di ogni container ma questa funzione sembra non funzionare bene al momento della mia prova, dato che non rileva nessun programma. Se funzionasse, dovrebbe essere possibile, oltre ad avviare i programmi, creare i collegamenti nel menu delle applicazioni del sistema principale.

[LINUX] Guida completa Distrobox: tutte distro vuoi, tutte insieme!

Vi ho proposto BoxBuddy perché, sulla carta, sembrava interessante ma, dopo averlo provato, posso tranquillamente dire che, personalmente, è un programma di cui faccio volentieri a meno.