giovedì 19 settembre 2013

Installare Archlinux in una chroot su Fedora

Certamente saprete che esiste un gran varietà di soluzioni (VirtualBox, VMware, Boxes, etc) per installare ed eseguire una o più macchine virtuali all'interno del nostro sistema GNU/Linux.
Tutte però hanno gli svantaggi di essere avide di risorse e di offrire delle prestazioni per i i sistemi guest spesso tutt'altro che esaltanti.
In questo articolo vi illustrerò un metodo alternativo alla virtualizzazione "classica" che non fa ricorso a nessuno dei software citati sopra: installeremo il sistema guest non su un disco virtuale ma in una "chroot", ossia in una normalissima directory del nostro filesystem che all'occorrenza diventerà la root del nostro sistema virtuale.
I vantaggi più evidenti:
- sistema guest immediatamente disponibile, senza alcun tempo di caricamento aggiuntivo.
- prestazioni del guest pari a quelle dell'host.
- possibilità di eseguire all'interno del desktop del sistema host un applicativo del sistema guest, senza dover avviare un'ulteriore sessione grafica.

Vediamo ora come realizzare praticamente tutto questo installando, a titolo di esempio, Archlinux (guest) su una macchina Fedora (host).
L'uso dei termini "host" e "guest" vi risulterà forse un po' inappropriato, non trattandosi questa di una vera e propria virtualizzazione,  ma spero comunque che me lo concederete, un po' per comodità e un po' per la mancanza di vocaboli più consoni. :-)

Iniziamo con il prelevare l'ultima iso di Archlinux disponibile sul sito ufficiale (alla data in cui scrivo archlinux-2013.09.01-dual.iso)
Terminato il download, montiamo l'immagine in una directory di nostra scelta, ad esempio:
# mount archlinux-2013.09.01-dual.iso -o loop /mnt/img/
In base alla versione di Archlinux che desideriamo installare ci sposteremo nella directory i686 o x86_64
all'interno della iso montata.
32 bit:
$ cd /mnt/img/arch/i686/
64 bit:
$ cd /mnt/img/arch/x86_64/
Nelle directory troviamo un file root-image.fs.sfs, compresso con squashfs, che contiene l'immagine di una installazione Archlinux.
Scompattiamo il file in una directory a nostro piacere, ad esempio:
# unsquashfs -d /squashfs root-image.fs.sfs
(Nota: la destinazione, indicata con l'opzione -d, non deve essere già presente nel filesystem, altrimenti il comando fallirà)
Montiamo ora l'immagine presente nella directory appena creata:
# mount /squashfs/root-image.fs -o loop /mnt/arch/
Se diamo un:
 $ ls /mnt/arch/
possiamo verificare la presenza della struttura classica delle directory di un sistema GNU/Linux.
bin   dev  home  lost+found  opt   root  sbin  sys  usr
boot  etc  lib   mnt         proc  run   srv   tmp  var
Siamo pronti per completare l'installazione di Archlinux all'interno della nostra Fedora:
# mkdir /arch
# cp -a /mnt/arch/* /arch/
Prima di "avviare" Archlinux smontiamo le immagini e rimuoviamo tutto ciò che non ci serve più:
# rm -rf /squashfs/
# umount /mnt/img
# umonut /mnt/arch
Verifichiamo ora di avere svolto tutto correttamente; avviamo la chroot:
 # chroot /arch/
Proviamo a dare qualche comando esclusivo di Archlinux come:
# pacman -Q
o semplicemente un:
# cat /etc/issue 
 che ci restituirà:
Arch Linux \r (\l)
Non c'è dubbio, stiamo ora utilizzando Archlinux!! :-)
Il nostro lavoro tuttavia non è ancora finito, per rendere pienamente utilizzabile il sistema guest dovremo dedicarci ancora un po' alla sua configurazione.
Innanzitutto dovremo creare un utente con lo stesso id del nostro utente Fedora; questo ci servirà per eseguire correttamente applicazione grafiche e pulseaudio nella chroot.
Con tutta probabilità l'id dell'utente Fedora è 1000 (come da impostazione predefinita); verifichiamolo eseguendo in un nuovo terminale:
$ id -u
Nella chroot esiste già un utente con id 1000 (utente arch), ragion per cui dovremo innanzitutto eliminarlo prima di poter procedere alla creazione di un nuovo utente con questo id.
Rimuoviamo quindi l'utente arch:
# userdel arch
# rm -r /home/arch/
Creiamo ora un nuovo utente con lo stesso nome e lo stesso id dell'utente Fedora; ipotizzando di avere l'utente simone con id 1000 diamo:
# useradd -M -u 1000 -U simone
e assegniamo la password all'utente simone con:
# passwd simone
Anche l'utente root non ha ancora alcuna password, rimediamo con:
# passwd 
Usciamo temporaneamente dalla chroot semplicemente dando:
# exit
Per rientrare in Archlinux non useremo più semplicemente il comando chroot come abbiamo fatto in precedenza, ma lanceremo questo script:
 #/bin/sh
mount -t proc none /arch/proc
mount -t sysfs none /arch/sys
mount -o bind /dev /arch/dev
mount -o bind /dev/pts /arch/dev/pts
mount -o bind /var/run /arch/var/run
mount -o bind /var/lib/dbus /arch/var/lib/dbus
mount -o bind /tmp /arch/tmp
mount -o bind /home /arch/home
mount -o bind /dev/shm /arch/dev/shm
cp -Lf /etc/resolv.conf /arch/etc
chroot /arch
Questo è necessario per passare al sistema guest fondamentali informazioni circa l'hardware della nostra macchina, le partizioni, ecc., senza le quali nessun os Linux potrebbe funzionare correttamente.
In particolare l'opzione bind di mount serve in pratica proprio a condividere determinati mountpoint tra host e guest.
Salviamo lo script dandogli come nome start_chroot.sh dopodiché lanciamolo, sempre da root:
# start_chroot.sh
Rientrati nella chroot, dovremmo essere ora in grado di sfruttare finalmente appieno la nostra Archlinux!
Iniziamo con il mettere a punto pacman, il package manager di Archlinux.
# pacman-key --init
# pacman-key --populate archlinux
Proviamo quindi a lanciare un aggiornamento di sistema con:
# pacman -Syu
L'operazione dovrebbe andare a buon fine, segno che il package manager di Archlinux funziona a dovere.
Possiamo a questo punto installare nuovi pacchetti e personalizzare l'installazione a nostro piacimento.
Proviamo infine ad eseguire un applicazione grafica; switchate all'utente creato in precedenza ("simone" nel nostro esempio)
# su  simone
Come test eseguiamo magari un gioco o riproduciamo semplicemente un stream video da YouTube così da verificare che anche l'audio nella chroot funzioni a dovere.

Concludo l'articolo ricordando che per uscire in ogni momento dalla chroot basta digitare "exit" nel terminale.
Lo script che abbiamo visto in precedenza (start_chroot.sh) va lanciato unicamente al primo accesso alla chroot dopo il boot della macchina; i montaggi eseguiti dallo script restano infatti sempre attivi fino allo spegnimento. Per tutti i successivi utilizzi della chroot basterá dare:
# chroot /arch/
EDIT:
Se desiderate uno script più completo che sia anche in grado di smontare le directory condivise una volta terminato di lavorare nella chroot, potete utilizzare questo (realizzato modificando quello presente in questa pagina del wiki di Archlinux)
 #!/bin/bash
MOUNTPOINT=/arch
PIDFILE=/run/arch_chroot
case $1 in
  start)
    mount -t proc none $MOUNTPOINT/proc
    mount -t sysfs none $MOUNTPOINT/sys
    dirs=(/dev /dev/pts /dev/shm /var/run /var/lib/dbus /tmp /home )
    for d in "${dirs[@]}"; do
      mount -o bind $d $MOUNTPOINT$d
    done
    cp -Lf /etc/resolv.conf /arch/etc
    touch $PIDFILE
    ;;
  stop)
    dirs=(/dev/pts /dev/shm /dev /var/run /var/lib/dbus /tmp /home)
    umount $MOUNTPOINT/{sys,proc}
    for d in "${dirs[@]}"; do
      umount -l "$MOUNTPOINT$d"
    done
    rm -f $PIDFILE
    ;;
  *)
    echo "usage: $0 (start|stop)"
    exit 1
esac
Salviamo lo script con il nome arch_chroot, quindi per inizializzare la chroot daremo:
# arch_chroot start
Poi per entrare in Archlinux eseguiremo il solito
# chroot /arch
Una volta usciti dalla chroot con
# exit
Potremo smontare i mounpoint condivisi tra host e guest con:
# arch_chroot stop

4 commenti:

  1. Ciao, grazie per la guida, come mai quando tento di scompattare il file x86_64 mi dice: "bash: unsquash: comando non trovato..."?
    Sono su Fedora 20.
    Ciao e grazie di nuovo.

    RispondiElimina
    Risposte
    1. Il comando esatto è "unsquashfs", se non è presente sulla tua macchina installa il pacchetto "squashfs-tools". Ciao e grazie

      Elimina
    2. Infatti, mancava proprio quel pacchetto, poi hai invertito l'ordine di smontaggio che dovrebbe essere:
      # rm -rf /squashfs/
      # umonut /mnt/arch
      # umount /mnt/img

      Ma si può installare ed avviare un DE?

      Elimina
    3. Sí, l'esecuzione di un DE all'interno della chroot dovrebbe funzionare ... io al momento ho provato solo con fluxbox e ti posso dire che parte regolarmente. Imposta il de o wm che vuoi utilizzare nel file .xinitrc e poi avvialo con: "startx -- :1"

      Elimina