Category Archives: Guide

Alpine Linux, perché buttare l’hardware è peccato!

Avevo bisogno di un serverino domestico per alcuni esperimenti e per taccagneria passione per il trashware ho deciso di recuperare il mio “vecchio” (2007) EeePC 701 (Celeron M 900MHz, 2GB RAM, 4GB SSD).

Sono consapevole che un Raspberry Pi 4 sarebbe molto più performante, ma quanto ci avrei messo ad ammortizzare l’investimento?
L’EeePC 701 consuma:

  • 9,5V – 2,5A max → ~24W di picco
  • frequenza media della CPU su un uptime di 62 giorni: 113 MHz:32.73%, 225 MHz:21.17%, 338 MHz:15.11%, 450 MHz:10.52%, 563 MHz:6.91%, 675 MHz:2.72%, 788 MHz:3.57%, 900 MHz:7.28%
  • Una stima verosimile si attesta attorno ad una media di 11W

Tradotto in Euro significa:

  • 11 W × 24 h × 365 giorni = 96.360 Wh ≈ 96 kWh / anno
  • costo medio dell’elettricità in Italia nel 2025 = 0,30 €/kWh
    96 kWh × 0,30 € = ~28,80 € / anno

Un Raspberry Pi 4 Model B invece consuma:

  • 4,5 W × 24 × 365 = 39.420 Wh ≈ 39 kWh / anno
  • 39 kWh × 0,30 € = ~11,70 € / anno

Un Raspberry mi farebbe risparmiare circa 17€ l’anno, ma nuovo costa un centinaio di euro e per rientrare dell’investimento mi occorrerebbero circa 6 anni!

Ma veniamo ai problemi pratici: CPU a 32bit e disco da soli 4GB! Forse non ve ne siete accorti, ma la maggior parte delle distribuzioni ha deprecato il supporto all’architettura Intel 32-bit.

Nell’ordine ho quindi scartato:

  • Debian 12 (supporta i686 ufficialmente “solo” fino a giugno 2028), da amante del retrocomputing non mi ha entusiasmato la scelta di Debian di eliminare il supporto agli Intel a 32bit. L’installazione di base occupa circa 750MB.
  • Slackware 15/current: stabile, ma è complicato contenere la dimensione del sistema di base. L’installazione della maggior parte dei pacchetti delle serie a, ap, l ed n occupa circa 1200-1300MB, in oltre per il software extra ci si deve affidare a repository non ufficiali o ai maledetti Slackbuild.
  • Gentoo: RICOMPILARE UNA DISTRO MODERNA SU UN PC A 900MHZ?!!
  • Slitaz: progetto leggero ed interessante, ma non ha i pacchetti per il software che mi serve.
  • Tiny Core: stesso discorso di Slitaz.
  • Free/Net/OpenBSD: girano tutti senza problemi anche su i586, ma l’installazione minima richiede rispettivamente 1.3GB, 900MB e 1.2GB.
  • Arch Linux 32: uso Arch da 20 anni, c’era ancora installata una vecchia Arch sull’EeePC quando l’ho riesumato, ma mi sono ricordato di questo fork quando ormai era troppo tardi.
  • Void Linux: ha il miglio rapporto leggerezza-facilità d’installazione. Scartata perché ha un gestore di pacchetti con una sintassi troppo particolare per i miei gusti. L’installazione minima richiede circa 700MB.
  • Alpine Linux: non è solo sinonimo di container, può essere installata anche su hardware reale. Usa musl al posto di glibc ed è più leggera e performante di tutte le soluzioni precedenti. Purtroppo il suo installer non permette di gestire manualmente le partizioni, ma dato che l’installazione minima richiede meno di 200 MB ho deciso che valesse la pena effettuare l’installazione tramite chroot (stile Arch).

Installazione Alpine Linux tramite chroot

1. Configurazioni base

setup-hostname -n serverino
setup-keymap it it
setup-timezone -z Europe/Rome
setup-interfaces
passwd

2. Preparare il disco per btrfs

apk add btrfs-progs
cfdisk… [partizioni GPT con sda1 BIOS BOOT e sda2 Linux]
mkfs.btrfs /dev/sda2
modprobe btrfs
mount /dev/sda2 /mnt
cd /mnt
btrfs subvolume create rootvol
umount /mnt
mount /dev/sda2 -o subvol=rootvol,compress=lzo,sdd /mnt
mount –bind /dev /mnt/dev
mount –bind /proc /mnt/proc
mount –bind /sys /mnt/sys
mount -t devpts devpts /mnt/dev/pts -o gid=5,mode=620

3. Installare il sistema di base

setup-disk -m sys /mnt
chroot /mnt /bin/ash
apk update
apk upgrade
apk add grub grub-bios
grub-mkconfig -o /boot/grub/grub.cfg
grub-install /dev/sda

Filesystem cifrati (parte 2)

Su un PC con CPU Intel i7-4790K (dotata di accelerazione hardware per l’algoritmo di cifratura aes), 16GB di RAM ed hard disk Seagate Barracuda 7200 da 500GB il supporto per la cifratura integrato nel filesystem ext4 è stato quello che si è comportato meglio in assoluto, con velocità in scrittura praticamente identiche a quelle di ext4 con la cifratura disabilitata. dm-crypt/LUKS è stato più veloce di ZFS con file sotto ai 5 GB. gocryptfs come prevedibile, in quanto strumento user-space, è stato il filesystem più lento tra i 4.

Dettagli del test

Sono state create 3 partizioni sul disco:

  • una formattata con ext4 (con due cartelle da cifrare rispettivamente con FScrypt e gocryptfs),
  • un volume dm-crypt/LUKS formattato in ext4
    # cryptsetup luksFormat --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 5000 /dev/sdc2
    # cryptsetup open /dev/sdc2 lukspart

    # mkfs.ext4 /dev/mapper/lukspart
  • un pool ZFS col dataset cifrato
    zpool create tank /dev/sdc3
    zfs create -o encryption=aes-256-gcm -o keyformat=passphrase -o keylocation=prompt tank/encrypted_data
    zfs load-key tank/encrypted_data
    zfs mount tank/encrypted_data

Ho generato con dd 3 file rispettivamente da 1GB, 5GB e 10GB contenenti bit casuali

dd if=/dev/urandom of=testfile1G bs=1G count=1 oflag=direct
dd if=/dev/urandom of=testfile5G bs=1M count=5120 oflag=direct
dd if=/dev/urandom of=testfile10G bs=2M count=5120 oflag=direct

Con rsync ho misurato la velocità di trasferimento di questi file nelle varie partizioni o directory cifrate e per confronto anche con la semplice copia in una partizione ext4 non cifrata. Dopo ogni copia, per pulire la cache ho lanciato il comando “echo 3 > /proc/sys/vm/drop_caches”

time rsync --progress testfile1G /mnt/filesystemcifrato
time rsync --progress testfile5G /mnt/filesystemcifrato
time rsync --progress testfile10G /mnt/filesystemcifrato

Velocità in lettura

Per completezza ho misurato anche le velocità di lettura col comando:

time dd if=testfile5G of=/dev/null bs=1G count=1

LVM Cache su SSD

Stanco delle prestazioni da bradipo dell’emulatore di Android e della (ahimé talvolta necessaria) macchina virtuale con Windows, che grattano di continuo sul disco meccanico della mia home directory, ho deciso che era giunto il momento di intervenire, per evitare di trovarsi catapultati negli anni 90 ogni due minuti.

Per risolvere il problema prestazionale esiste una soluzione molto semplice: comprare un nuovo disco a stato solido, abbastanza capiente. Questa soluzione però non è sicuramente delle più economiche.

La soluzione arzigogolata e nerd invece è: usare un piccolo disco SSD d’avanzo come cache per il disco meccanico.

Configurazione iniziale

Qualche mese fa mi è capitata una rocambolesca avventura per cui ho rischiato di perdere tutti i miei dati per colpa di un programmatore di firmware distratto. Certo, avevo un backup, ma non è la stessa cosa.

Quel giorno comprai dei dischi nuovi e mi feci un bel RAID1, come in figura.

Configurazione attuale, lenta

Questa configurazione avrebbe dovuto aiutarmi a prevenire perdite di dati, e anche a migliorare le performance in lettura dei dischi. Tuttavia, come ben presto si è rivelato, le cose non stavano affatto così, almeno quando i dischi venivano (ab)usati dalle sopraccitate applicazioni, particolarmente avide di random IO.

Il sistema operativo risiede comunque su un disco SSD a parte.

Nuova configurazione

Avendo un disco SSD d’avanzo, che avevo usato per rinsavire il computer portatile che mi ha accompagnato per numerosi viaggi in treno avanti e indietro per l’Università, ho quindi deciso di modificare la mia configurazione nel seguente modo.

Nuova configurazione desiderata

In questo modo, ogni volta che viene effettuato un accesso ad un file sul mio filesystem, LVM si preoccupa di controllare se, per caso, tale accesso può essere fatto anche per mezzo di una copia che si trova sul disco SSD.

Sì, LVM probabilmente potrebbe gestire direttamente anche il RAID, ma per il momento ho preferito riutilizzare le conoscenze già acquisite e continuare a sfruttare il RAID con mdadm.

La torre di Hanoi

Mi sono fatto prestare un disco meccanico di capienza identica ai miei dall’Officina Informatica del GOLEM.

Copiare tutto su quel disco e ricopiare di nuovo sul RAID? No, ho già trovato un disco col firmware buggato, e non desidero trovarne altri. Figuriamoci usare un disco usato di recupero!

Fare una specie di torre di Hanoi e rischiare comunque di perdere i dati per qualche errore umano (da me commesso)? Sì, facciamolo.

Mi sono quindi portato nella seguente situazione, installando il disco meccanico di passaggio, nominato sdd.

Vecchia e nuova configurazione (parziale) a confronto.
A sinistra l’array md0, a destra md1.

Poiché è molto facile fare confusione con i nomi, e poiché LVM permette di usare nomi mnemonici, ho assegnato i seguenti nomi autoesplicativi ai vari componenti del mio spazio di archiviazione.

  • picostorage: il gruppo virtuale;
  • slowdino: il volume sul vecchio lento dinosauro meccanico (il RAID1);
  • fastrabbit: il volume sul nuovo veloce disco SSD;
  • metaguy: il volume per i metadati;

Ho impostato la nuova configurazione, ma con un disco mancante (in rosso in figura).

# mdadm --create /dev/md1 --level=mirror --raid-devices=2 /dev/sdd missing
# pvcreate /dev/md1
# vgcreate picostorage /dev/md1
# lvcreate --name slowdino --size 1t picostorage /dev/md1
# mkfs.ext4 /dev/picostorage/slowdino

Dopodiché ho avviato la copia dei dati.

# mount /dev/picostorage/slowdino /mnt/dst
# rsync -av /home/* /mnt/dst

E, mentre copiava, conscio del fatto che avrebbe impiegato diverso tempo, mi sono preparato a inserire la cache.

# pvcreate /dev/sdc
# vgextend picostorage /dev/sdc
# lvcreate --name fastrabbit --size 64g picostorage /dev/sdc
# lvcreate --name metaguy --size 64m picostorage /dev/sdc
# lvconvert --type cache-pool --poolmetadata picostorage/metaguy picostorage/fastrabbit

Ho atteso la fine della copia dei miei dati, per evitare di abusare del povero disco SSD più del dovuto, dopodiché ho attivato la cache.

# lvconvert --type cache --cachepool picostorage/fastrabbit picostorage/slowdino

A questo punto, la cache è attiva. Non rimane che colmare il buco dell’array con uno dei dischi del vecchio array: simulo un guasto a uno dei dischi, lo rimuovo dall’array originale, cancello i metadati, e lo inserisco nel nuovo array.

# mdadm /dev/md0 -f /dev/sdb
# mdadm /dev/md0 -r /dev/sdb
# dd if=/dev/zero of=/dev/sdb bs=1M count=1
# mdadm /dev/md1 --add /dev/sdb

Mi trovo quindi in questa condizione, e attendo pazientemente che l’array su sdb venga ricostruito, controllandolo con mdstat.

Una volta ricostruito l’array correttamente su sdb e su sdd, ripeto l’operazione, simulando stavolta il fallimento di sdd, e inserendo nell’array sda. Al termine dell’operazione, mi trovo con i miei due dischi sda e sdb nella nuova configurazione, e posso restituire sdd al GOLEM.

In nessun momento di tutta questa procedura i miei dati sono stati su un disco soltanto, perciò si può dire che la procedura sia a prova di guasti hardware.

Non sono però sicuro che sia a prova di guasti umani, perciò non fatelo a casa. 🙂

Benchmark

Per verificare se davvero questa cache serve a qualcosa, faccio un veloce test.

$ fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=test --bs=4k --iodepth=64 --size=500M --readwrite=randrw --rwmixread=75

A fronte di circa 400 IOPS ottenute prima di installare la cache, adesso ne vengono fatte oltre 4000! 😮 Un risultato più che soddisfacente.

Anche durante l’uso delle applicazioni più avide, adesso la macchina risulta molto più fluida.

Il monitor di sistema mostra chiaramente i miglioramenti in lettura/scrittura dalla cache (in verde chiaro e fucsia), comparati con la lettura/scrittura dai dischi meccanici (in verde e rosso)

Manutenzione

Ogni tanto è bene controllare lo stato della cache e del RAID, e per questo ci vengono in aiuto i seguenti comandi:

# lvdisplay
# mdstat

Applicazioni Linux universali

app

Sarebbe bello se tutte le distribuzioni usassero lo stesso formato di pacchetti… probabilmente non accadrà a breve, ma in questa direzione si stanno affermando dei nuovi gestori di pacchetti che promettono di rivoluzionare (in positivo si spera) il modo di sviluppare e distribuire software su Linux.

Snappy

Ideato da Canonical ed adottato da Ubuntu (in parallelo ai pacchetti .deb a partire dalla versione 16.04) e da Ubuntu Touch.
Nel giugno di quest’anno è stato effettuato il port per svariate distribuzioni (Arch, Debian, Fedora/Red Hat, Gentoo, SUSE e Red Hat)
In linea teorica un pacchetto snap può quindi essere utilizzato praticamente da qualsiasi distribuzione Linux.

Com’è possibile tutto questo?
Di fatto si tratta di un’immagine di filesystem compressa contenente tutto il necessario per far girare un programma, questo viene automaticamente montato in loop dal demone snapd ed i suoi eseguibili vengono linkati in /usr/snap/bin.

PRO
– Semplice da utilizzare, ha un tool da riga di comando stile apt-get (snap find, snap install, snap remove…)

CONTRO
– Sembra il tentativo di Canonical di creare un Google Play per rifilare a tutti gli utenti Linux software a pagamento.
– Al momento sono pochi i programmi disponibili in questo formato

Flatpak (aka xdg-app)

Progetto nato circa un anno fa con lo scopo di creare un’alternativa libera dello Snappy di Ubuntu.
Non ha un repository principale come Snappy, è necessario configurarlo inserendo manualmente quelli che ci interessano:
es.: per installare GNOME
curl -O https://sdk.gnome.org/keys/gnome-sdk.gpg
flatpak remote-add --gpg-import=gnome-sdk.gpg gnome https://sdk.gnome.org/repo/
flatpak install gnome org.gnome.Platform 3.20
flatpak install gnome org.gnome.Sdk 3.20

PRO
– Permette di installare molto più software rispetto a snapd: es. Libreoffice, Firefox…
– Non ha un repository principale contenente anche programmi a pagamento
– Permette di creare pacchetti flat a partire

CONTRO
– Sintassi leggermente più complicata di snap

AppImage (aka Klik)

I pacchetti .AppImage sono concettualmente simili ai programmi per MacOSX.

Sono anch’essi file immagine compressi contenenti l’applicazione e tutte le librerie necessarie al suo utilizzo.
Basta scaricare il file, eseguirlo o cliccarci sopra ed il programma si installerà. Per cancellarlo è sufficiente cestinare l’icona del file.

PRO
– Installare un programma su Linux non è mai stato così facile. Finalmente un formato click’n’run stile MacOS per Linux.
– Elevata disponibilità di programmi https://bintray.com/probono/AppImages

CONTRO
– Anche se praticissimo per distribuire grossi pacchetti stile VLC, LibreOffice, Firefox o Chromium, questo tipo di formato difficilmente potrà essere utilizzato per pacchettizzare il sistema di base.
– Non esiste un tool stile apt-get per cercare ed installare “AppImmagini”
– Non possiede un tool per creare pacchetti a partire da un tarball.
– I file non vengono linkati in una directory di sistema (es. /usr/bin) per cui in caso di sistemi multiutenti ogni utente dovrà scaricarsi nella sua home il suo pacchetti .AppImage