Wiki Ubuntu-it

Indice
Partecipa
FAQ
Wiki Blog
------------------
Ubuntu-it.org
Forum
Chiedi
Chat
Cerca
Planet
  • Pagina non alterabile
  • Informazioni
  • Allegati

Versione 68 del 09/06/2024 12.31.58

Nascondi questo messaggio


Attenzione! Questa è una Pagina di prova. Le informazioni riportate potrebbero essere incomplete, errate e potenzialmente pericolose. Per contribuire alla realizzazione di questa pagina consultare la discussione di riferimento.

HowTo: Noble su btrfs con layout snapper

In questo "HowTo", verrà descritto come installare Ubuntu 24.04 con un layout del filesystem btrfs "OpenSuse-like". Al termine della procedura il risultato sarà una installazione Ubuntu Noble su filesystem btrfs. Le funzionalità del filesystem verranno gestite con snapper + Btrfs Assistant. La procedura prevede che il device di installazione, sia preparato in anticipo rispetto l'installazione, e sarà un'attività manuale. L'obiettivo è fornire una procedura di tipo "copia e incolla" alla portata di tutti.

Tabella spazio temporale

L'installazione è stata divisa in diversi passaggi. La tabella di seguito pubblicata, cataloga i vari passaggi in relazione all'ambiente di esecuzione e allo stato dell'installazione.

Passaggio

Ambiente

Installazione in corso

Preparazione del disco

Live

No

Preparazione del volume btrfs

Live

No

Installazione di Ubuntu

Live

Si, in corso

Attività successive l'installazione

Live

No, terminata

Primo avvio

Ubuntu

N/A

Installazione di btrfsassistant

Ubuntu

N/A

Attività pre installazione

Preparazione del disco

L'installazione proposta prevede che il dispositivo di installazione sia già pronto, e non necessiti di formattazione. I requisiti minimi per l'installazione, in termini di storage sono:

  • partizione EFI/ESP (almeno 100Mb, in caso di dual boot si condivide quella di windows)
  • partizione btrfs (consigliati un minimo di 50Gb)

Il dispositivo di installazione si può preparare anche con gparted in ambiente Live. Se si sta installando in dual boot con Windows, e sia necessario ridurre una (o più) partizione(i) in uso, si consiglia di utilizzare gli strumenti di Windows per il ridimensionamento (video di esempio).

caso di esempio

device su gparted

dual boot

single boot

(video di esempio)

Preparazione del volume btrfs

Questa guida è pensata per essere eseguita in modalità copia e incolla. Prima di effettuare il copia e incolla verificare che la variabile BTRFSDEV della guida, risolva correttamente il device da utilizzare (in alternativa, modificare la stringa $BTRFSDEV, con la stringa del proprio device btrfs, ad esempio, la funzione proposta, non funziona come atteso con due dispositivi btrfs).

BTRFSDEV=$(sudo blkid | grep btrfs | cut -d ":" -f1)
echo $BTRFSDEV

Prima di avviare l'installazione, sarà necessario preparare il volume btrfs.
E' possibile utilizzare un terminale dalla Live.

(video di esempio)

Creazione del subvolume @

Si monta il filesystem btrfs creato nel passaggio "Preparazione del disco", e si crea il subvolume @ .

Se il termine subvolume non suona familiare, si consiglia di approfondire, Gestione subvolume

BTRFSDEV=$(sudo blkid | grep btrfs | cut -d ":" -f1)
sudo mount $BTRFSDEV /mnt  
sudo btrfs subvolume create /mnt/@

Il "first root filesystem"

Si crea la directory:

sudo mkdir /mnt/@/etc/snapper/configs -p

Si modifica il default subvolume, e si rimonta il volume:

BTRFSDEV=$(sudo blkid | grep btrfs | cut -d ":" -f1)
sudo btrfs subvolume set-default /mnt/@
sudo umount /mnt && sudo mount $BTRFSDEV /mnt

Si installa snapper (sulla Live)

sudo apt install snapper -y

Si configura e utilizza snapper per creare il "first root filesystem".

sudo systemctl stop snapper-timeline.timer  # prima dell'installazione non vogliamo le snapshot di tipo timeline
sudo snapper create-config /mnt
sudo cp /etc/snapper/configs/root  /mnt/etc/snapper/configs/
sudo sed -i s@\"/mnt\"@\"/\"@ /mnt/etc/snapper/configs/root
sudo snapper create -t single -d "first root filesystem" --read-write --from 0

Si creano i subvolumi di interesse, infine si modifica il default subvolume con il "first root filesystem".

sudo btrfs subvolume create /mnt/home
sudo btrfs subvolume create /mnt/var/cache -p
sudo btrfs subvolume create /mnt/var/log
sudo btrfs subvolume create /mnt/var/tmp
sudo chmod 1777 /mnt/var/tmp
sudo btrfs subvolume create /mnt/var/lib/flatpack -p
sudo btrfs subvolume set-default /mnt/.snapshots/1/snapshot
sudo umount /mnt

Inizia l'installazione.

Installazione di Ubuntu

Eseguire l'installazione seguendo le istruzioni a video, fino al punto "Tipo di installazione".
Personalizzare la configurazione del device di installazione, come da tabella sotto, continuare quindi con le istruzioni ripartendo da Informazioni personali.

Schermata di installazione

Operazione da effettuare

Selezionare "Altro"

Configurare le partizioni:
  1. ESP/EFI da montare in /boot/efi 
  2. btrfs da montare in / 

(video di esempio)

Attenzione, le partizioni non vanno formattate, il dispositivo è stato configurato per l'installazione, durante i passaggi Preparazione del disco, e Preparazione del volume btrfs.

Non riavviare dopo l'installazione. Si renderà necessario effettuare delle attività, successive l'installazione e precedenti il primo avvio.

Attività successive l'installazione

Questi comandi vanno eseguiti, dal un terminale, nell'ambiente Live di installazione.

(video di esempio)

Montare i subvolumi

Si verifica che tutti i subvolumi si montino correttamente dove atteso e come atteso

BTRFSDEV=$(sudo blkid | grep btrfs | cut -d ":" -f1)
sudo mount $BTRFSDEV /mnt
sudo mount -o subvol=@/home $BTRFSDEV /mnt/home
sudo mount -o subvol=@/var/cache $BTRFSDEV /mnt/var/cache
sudo mkdir /mnt/var/lib/flatpack -p
sudo mount -o subvol=@/var/log $BTRFSDEV /mnt/var/log
sudo mount -o subvol=@/var/tmp $BTRFSDEV /mnt/var/tmp
sudo mount -o subvol=@/var/lib/flatpack $BTRFSDEV /mnt/var/lib/flatpack
sudo mount -o subvol=@/.snapshots $BTRFSDEV /mnt/.snapshots

Aggiornare fstab

Si aggiorna il file /mnt/etc/fstab perchè monti i subvolumi attesi dove atteso.

Qualora si volessero personalizzare le opzioni di mount, l'operazione è possibile in questo contesto. Maggiori dettagli riguardo le opzioni di mount: Opzioni di mount.
In calce alla sezione, c'è un esempio con le opzioni 'noatime,compression=lzo'.

BTRFSDEV=$(sudo blkid | grep btrfs | cut -d ":" -f1)
DISP=$(grep btrfs /mnt/etc/fstab | awk '{print $1}')
line=$(grep -n btrfs /mnt/etc/fstab | cut -d":" -f1)
echo "sudo sed -i '"$line"s/.$/0/' /mnt/etc/fstab" | sh
echo -n -e "\n# btrfs\n" | sudo tee -a /mnt/etc/fstab
grep btrfs /etc/mtab | \
grep -v target | \
grep -v "1/snapshot" | \
sed s@rw.*,subvolid=.*,@defaults,@ | \
sed s@/mnt@@ | \
sed s@$BTRFSDEV@$DISP@ | \
sudo tee -a /mnt/etc/fstab

Esempio di personalizzazione delle opzioni di mount:

BTRFSDEV=$(sudo blkid | grep btrfs | cut -d ":" -f1)
DISP=$(grep btrfs /mnt/etc/fstab | awk '{print $1}')
line=$(grep -n btrfs /mnt/etc/fstab | cut -d":" -f1)
echo "sudo sed -i '"$line"s/.$/0/' /mnt/etc/fstab" | sh
echo "sudo sed -i '"$line"s/defaults/noatime,compress=lzo/' /mnt/etc/fstab" | sh
echo -n -e "\n# btrfs\n" | sudo tee -a /mnt/etc/fstab
grep btrfs /etc/mtab | \
grep -v target | \
grep -v "1/snapshot" | \
sed s@rw.*,subvolid=.*,@noatime,compress=lzo,@ | \
sed s@/mnt@@ | \
sed s@$BTRFSDEV@$DISP@ | \
sudo tee -a /mnt/etc/fstab

In questo esempio è stata utilizzata l'opzione 'compress=lzo'.
In questo caso è consigliato eseguire una operazione di defrag: btrfs filesystem defrag -c<algoritmo di compressione> -r <path>
Dato l'esempio sopra, il comando da eseguire è:

sudo btrfs filesystem defrag -clzo -r /mnt

L'operazione potrebbe durare diversi minuti.

Riavvio

Si smontano tutti i subvolumi montati in /mnt, e si riavvia.

sudo umount /mnt/.snapshots 
sudo umount /mnt/var/tmp 
sudo umount /mnt/var/cache
sudo umount /mnt/var/log
sudo umount /mnt/var/lib/flatpack
sudo umount /mnt/home 
sudo umount /mnt
sudo shutdown -r now

Primo avvio

(video di esempio)

Configurare snapper sul sistema appena avviato

Questi comandi, vanno eseguiti in un un terminale, nell'ambiente appena avviato.
Si installa e configura snapper.

sudo apt install snapper -y

Il file di configurazione /etc/snapper/configs/root, è stato ereditato dal subvolume @, nella fase first root filesystem.
Abilitiamo la configurazione root nel file /etc/default/snapper.

sudo sed -i s/SNAPPER_CONFIGS=\"\"/SNAPPER_CONFIGS=\"root\"/g /etc/default/snapper

Si riavvia snapper per attivare la configurazione.

sudo systemctl restart snapperd

Si abilita la quota, in questo modo l'algoritmo di pulizia e raccolta delle snapshots, potrà onorare le direttive SPACE_LIMIT e FREE_LIMIT. Inoltre, l'output del comando snapper list fornirà informazioni riguardo lo spazio utilizzato.

sudo btrfs quota enable /
sudo snapper setup-quota
sudo snapper list

Creare la configurazione per la /home

Si crea la configurazione home, in modo da usufruire delle snapshots anche per il subvolume /home.

sudo snapper -c home create-config /home
sudo snapper -c home setup-quota

Swap

Qualora si avesse necessità di configurare dello spazio per lo swap,
è possibile seguire la procedura Swap file su btrfs.
La pagina non è però aggiornata con le ultime funzionalità di kernel e btrfs-progs.
In attesa che venga aggiornata, si riportano i comandi necessari di seguito:

  1. Montare il filesystem radice

    BTRFSDEV=$(sudo blkid | grep btrfs | cut -d ":" -f1)
    sudo mount -o subvolid=5 $BTRFSDEV /mnt
  2. Creare un subvolume per lo swap

    sudo btrfs subvolume create /mnt/@/swap
  3. Creare il file di swap

    L'opzione '--size 2G' indica la dimensione che avrà il file di swap.
    Valorizzare l'opzione, con una dimensione consona al proprio carico di lavoro.

    sudo btrfs filesystem mkswapfile --size 2G /mnt/@/swap/swapfile
  4. Aggiornare fstab

    printf "\n# swap su btrfs \n" | sudo tee -a /etc/fstab
    grep "/home" /etc/fstab | sed s@/home@/swap@g | sudo tee -a /etc/fstab
    printf "/swap/swapfile swap swap defaults,noatime 0 0 \n"  | sudo tee -a /etc/fstab
  5. Attivare lo swap

    if [ -d /swap ]; then echo "Directory exists"; else sudo mkdir /swap; fi
    sudo mount /swap
    sudo swapon /swap/swapfile

Installare Btrfs Assistant

Un tool grafico, potente e intuitivo, che si può utilizzare per gestire snapper, è certamente Btrfs Assistant.

Sfortunatamente, questo software, non è disponibile nei repository ufficiali. Non esiste neanche un repository PPA.

Attualmente, l'unico riferimento ad un pacchetto Ubuntu è: btrfs assistant su launchpad (la versione 1.8, è vecchia di un anno. La versione corrente è 2.1)

Le istruzioni per l'installazione sono disponibili nella documentazione ufficiale.

Repository - README

(video di esempio)

  • Prerequisiti per l'installazione

sudo apt install git cmake fonts-noto qt6-base-dev qt6-base-dev-tools \
g++ libbtrfs-dev libbtrfsutil-dev pkexec qt6-svg-dev qt6-tools-dev
  • Scaricare i sorgenti

Per questo punto, si hanno a disposizione due opzioni: la versione main, o ultima versione. Se si vuole installare la versione main:

git clone https://gitlab.com/btrfs-assistant/btrfs-assistant.git
cd btrfs-assistant

Per l'ultima versione:

wget https://gitlab.com/btrfs-assistant/btrfs-assistant/-/archive/2.1/btrfs-assistant-2.1.tar.gz
tar xvf btrfs-assistant-2.1.tar.gz
cd btrfs-assistant-2.1
  • Compilarere il software

cmake -B build -S . -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE='Release'
make -C build
  • Installare il software

sudo make -C build install
  • Disinstallazione (eventuale)

Perchè il software possa essere disinstallato, è necessario conservare la directory in cui è stato costruito. La lista dei files installati, è presente nella sottodirectory build. Il comando di disinstallazione è:

cd build
sudo xargs rm < install_manifest.txt

Contenuto del file install_manifest.txt dopo l'installazione:

/etc/btrfs-assistant.conf
/usr/share/applications/btrfs-assistant.desktop
/usr/share/metainfo/btrfs-assistant.metainfo.xml
/usr/share/polkit-1/actions/org.btrfs-assistant.pkexec.policy
/usr/bin/btrfs-assistant
/usr/bin/btrfs-assistant-launcher
/usr/bin/btrfs-assistant-bin

Nel caso si installasse il pacchetto btrfsmaintenance, il software Btrfs Assistant, potrà essere utilizzato anche per gestire le operazioni di manutenzione del filesystem.

Installare grub-btrfs (opzionale)

grub-btrfs è una collezione di scripts che permette di eseguire il boot da una snapshot. La collezione di script è ben testata su distribuzioni come Arch e OpenSuse, per cui su Ubuntu, potrebbero esserci errori e/o limitazioni. L'avvio del sistema, utilizzando una snapshot read-only come filesystem radice, potrebbe non terminare con successo. Esistono diverse strategie per avviare una snapshot read-only con successo, la migliore è avviare con il supporto a overlayfs. Questa feature è documentata per Arch e per le distruzioni che utilizzano dracut: Booting on a snapshot in read-only mode can be tricky

Per le istruzioni di installazione e per la verifica dei prerequisiti:
manuale di installazione
(video di esempio)

In breve:

git clone https://github.com/Antynea/grub-btrfs.git
cd grub-btrfs
sudo make install

Al termine dell'installazione, se venisse riportato il warning:

WARNING: 'grub-mkconfig' needs to run at least once to generate the snapshots (sub)menu entry in grub the main menu. After that this script can run alone to generate the snapshot entries.

sarà necessario eseguire un l'aggiornamento del file /boot/grub/grub.cfg.

sudo update-grub

Per automatizzare la rigenerazione del menù di grub è necessario abilitare il servizio grub-btrfsd.

sudo apt install inotify-tools
sudo systemctl start grub-btrfsd
sudo systemctl enable grub-btrfsd

Si volesse utilizzare il solo snapper per la restore, grub-btrfs è mandatorio. Se si volesse utilizzare Btrfs Assistant, grub-btrfs è opzionale.

Operazione di restore

Si immagini di corrompere un sistema durante un upgrade. Il primo passaggio da eseguire è identificare il # della snapshot che si vuole utilizzare come "root" filesystem. Si seleziona la snapshot 25, perchè creata durante l'avvio precedente l'upgrade.

Restore con snapper

La restore con snapper, riassunta per punti, prevede:
- Eseguire il rollback di 25
- Riavviare il sistema, utilizzando una snapshot "copia r/w di 25"
- Rigenerare i file di configurazione di grub
- Riavviare il sistema

(video di esempio)

  • Eseguire il roolback

sudo snapper rollback 25

Questo comando modifica il subvolume default, dall'attuale, a "copia r/w di 25".

  • Riavviare il sistema, utilizzando una snapshot "copia r/w di 25"

Nel menù di grub, selezionare "Ubuntu snapshots".

Nel sottomenù, selezionare la voce "copia r/w di 25"

Una volta terminato il reboot si verifica che il filesystem radice sia quello atteso.

findmnt /

  • Rigenerare i files di configurazione di grub

Si riconfigura grub per avviare il subvolume selezionato di default.

sudo update-grub
sudo grub-install

E' possibile trovare maggiori informazioni riguardo i comandi eseguiti nel Portale Grub

  • Riavviare il sistema

Selezionare la sessione di "Ubuntu" nel menù di grub. AL termine del riavvio verificare che il filesystem radice, sia quello atteso.

findmnt /

è atteso lo stesso output ottenuto nella verifica precedente

Restore con Btrfs Assistant

L'intera procedura, si gestisce con l'interfaccia grafica.

(video di esempio)

1. Aprire Btrfs Assistant.
2. Selezionare il tab "Snapper".
3. Selezionare il tab "Browse / Restore".
4. Selezionare la snapshot che si vuole restorare dalla lista.
5. Premere il push button "Restore".
6. Confermare la scelta.
7. Riavviare.

Verificare che nel box "Select target" sia selezionato il subvolume da sostituire!
Ad esempio con:

findmnt /

Dopo il riavvio

Il subvolume che è stato sostituito, non è più gestito da snapper. Il subvolume si dovrà cancellare manualmente.

  1. Identificare il subvolume

    BACKUP=$(sudo btrfs subvolume list / | grep backup | cut -d "@" -f 2)
    echo $BACKUP
  2. Verificare che il subolume non sia il default

    sudo btrfs subvolume get-default /
  3. Nel caso il check 2. sia positivo

    sudo btrfs subvolume set-default 5 /
  4. Cancellare il subvolume

    echo "sudo btrfs subvolume delete $BACKUP" | sh

Caso di esempio, in cui il subvolume da eliminare era anche il default.

Restore da Live

Dopo l'upgrade l'avvio del sistema fallisce.
Uno dei modi più semplici per ripristinare una snapshot su un sistema che non si avvia, è utilizzando la Live da un supporto usb.

(video di esempio)

  • Aprire un terminale e montare il filesystem.

Montare il subvolume 'ID 5 (FS_TREE)' e il subvolume '/@/.snapshots'.

BTRFSDEV=$(sudo blkid | grep btrfs | cut -d ":" -f1)
sudo mount -o subvolid=5,subvol=/ $BTRFSDEV /mnt
sudo mount -o subvol=/@/.snapshots $BTRFSDEV /mnt/@/.snapshots
  • Identificare i subvolumi

Prima di procedere alla restore è necessario identificare con certezza due subvolumi:

  • - subvolume che monta il 'root filesystem'

Su Ubuntu, si può identificare tale subvolume, utilizzando il file grub.cfg della partitione ESP.
Sapendo che il filesystem utilizzato è fat32, e il tipo di partizione è "EFI System", identifichiamo il device con blkid

blkid | grep vfat | cut -d ":" -f1

oppure con fdisk

sudo fdisk -l | grep EFI | awk '{ print $1 }'


Una volta identificato il dispositivo, montare lo stesso, per valutare la stringa di interesse:

device=$(blkid | grep vfat | cut -d ":" -f1)
sudo mkdir /mnt2
sudo mount $device /mnt2
grep "\$root" /mnt2/EFI/ubuntu/grub.cfg
sudo umount /mnt2

Qualora si fosse in difficoltà con la selezione del subvolume da sostituire, è possibile limitare la scelta a pochi (o uno) candidati, sfruttando il fatto che snapper prende le snapshots in modalità read-only.

for sub in $(sudo btrfs subvolume list /mnt | cut -d "@" -f2); \
do RO=$(sudo btrfs property get /mnt/@$sub ro| cut -d "=" -f2); \
if [ "$RO" = "false" ]; \
then sudo test -f /mnt/@$sub/boot/grub/grub.cfg && echo "/mnt/@$sub candidato per la sostituzione" || continue; \
fi; \
done
  • - subvolume da restorare

Avendo identificato il subvolume per il root filesystem al punto precedente, si potrebbe aprire il sistema con il chroot e utilizzare

sudo snapper list

oppure si potrebbero sfruttare le informazioni salvate da snapper nei vari info.xml.

n=$(sudo btrfs subvolume list /mnt | awk '{ print $9 }' | grep "@/.snapshots/" | cut -d "/" -f3| tail -1)
for i in $(seq 1 $n); do printf "\n /mnt/@/.snapshots/$i/snapshot \n"; sudo egrep  'date|cleanup|apt' /mnt/@/.snapshots/$i/info.xml; printf " - - - - - - - - - - - - - - \n"; done

  • Restore

Rinominare il subvolume da sostituire.

sudo mv /mnt/@/.snapshots/1/snapshot /mnt/@/.snapshots/1/snapshot_backup

Restore del subvolume selezionato.

sudo btrfs subvolume snapshot /mnt/@/.snapshots/25/snapshot /mnt/@/.snapshots/1/snapshot

E' possibile modificare la descrizione first root filesystem.
Aprire con i privilegi di amministrazione e con un editor di testo il file /mnt/@/.snapshots/1/info.xml Modificare il campo <description> come da esempio:

  • Riavviare

sudo umount /mnt/@/.snapshots
sudo umount /mnt
sudo shutdown -r now

Dopo il riavvio, eliminare il subvolume sostituito

Note sui metodi di Restore

  1. snapper + grub-btrfs
    La procedura proposta è una variante della procedura documentata per OpenSuse.
    Non è la procedura raccomandata perchè Ubuntu non supporta grub-btrfs, e non è scontato che il sistema si avvii selezionando una snapshot ro.
    La procedura documentata nel presente "evita" di avviare il sistema con una snapshot ro.
    Perchè la procedura proposta funzioni come atteso, la scelta del default subvolume deve essere gestita da snapper.

  2. snapper + Btrfs Assistant
    Questa è la procedura raccomandata; non solo è la più semplice, è anche la più veloce. La rimozione del vecchio subvolume è l'unica attività manuale richiesta.
    Il default subvolume può essere qualunque, si consiglia quindi di settarlo sul subvolid=5.

  3. Live
    La procedura proposta è per i casi di emergenza, si consiglia di utilizzarla solo per i casi in cui il sistema non si riavvia in seguito a un upgrade (o altro evento).


CategoryHomepage CategoryNuoviDocumenti