wardrobe: colibri, duck, eagle and owl

Dopo qualche settimana di esperienza dalla creazione di un sistema di scripting per creare - a partire da versione naked - delle customizzazioni complete, sono lieto di annunciare che tutte le mie attuali customizzazioni sono stare ri-create e vengono ad essere gestite con eggs wardrobe.

Perchè wardrobe è importante?

Pensate solo alla semplicità con la quale posso permettermi di gestire la presenza o meno di firmware, condividere degli accessori, ritrovare in dettaglio le varie configurazioni, etc.

Il processo di una customizzazione di una sistema è una operazione relatimente complessa, se precedentemente avevamo a disposizione un sistema di rimasterizzazione, a partire da remastersys, passando per systemback sino ad eggs, non mi è mai capitato di imbattermi in un sistema di masterizzazione, ovvero costruire una customizzazione partendo da una base minima.

wardrobe è basato su yaml e consiste essenzialmente nela definizione di costume che saranno “indossati” dal sistema in progetto attraverso una sequence di operazioni che - del resto - conosciamo benissimo:

  • aggiungere o modificare repository
  • aggiungere o rimuovere pacchetti, inclusi nuovi kernel
  • aggiungere pacchetti python
  • customizzazione

Ogni volta che creaiamo una nuova customizzazione ci scontriamo con due generi di problemi:

  • rimuovere tutto quello che non interessa
  • ricordare e manutenere le operazioni fatte.

Il primo probleam può essere risolto, tutto sommato abbastanza semplicemente, partendo da una installazione minima - senza interfaccia grafica - che io denomino naked.

Il secondo problema, viene affrontato con la definizioni dei costume.

costume

Un costume è essenzialmente costituito da una directory denominata come il costume ed in file index.yml.

La seguente è una definizione di un costume.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# esempio
---
name: esempio
author: artisan
description: questo è un esempio di costume
release: "0.0.1"
distributions:
- bullseye
sequence:
repositories:
sources_list:
- main
- contrib
- non-free

sources_list_d:
- null

update: true
upgrade: true

preinst:
- null

packages:
- cinnamon
- firefox

packages_no_install_recommends:
- null

debs: false

packages_python:
- null

accessories:
- grafica

customize:
dirs: true

hostname: true

scripts:
- desktop_links_set

reboot: true

Si noti che ho volutamente incluso tutti i possibili item, includendo alcuni che non sono valorizzati e che quindi per semplicità sarebbe stato corretto omettere: sources_list_d, packages_no_install_recommends, etc.

costume

Andiamo ad analizzare il nostro esempio, passo per passo:

Instestazione

1
2
# esempio
---

Qui c’è poco da dire, si tratta di informazioni per aiutare noi poveri umani a capire di cosa si tratta, sino a — possiamo scriverci quello che ci pare.

Generalità

1
2
3
4
name: esempio
author: artisan
description: questo è un esempio di costume
release: "0.0.1"

Anche qui poco da dire, queste sono le informazioni generali che verranno riportate dal comando eggs wardrobe list per una semplice visione d’insieme.

distributions

Riporta una lista dei codename delle distribuzioni compatibili con il costume. Esempio: bullseye, bookworm ma anche focal, jammy, chimaera, etc.

Naturalmente il nostro costume può essere indossato dal sistema solo se il suo codename lsb_release -sc è compreso nella lista distributions.

sequence

La sequence, individuata per essere il più possibile atomica e coerente, è naturalmente la parte centrale del costume.

Consiste in una sezione repositories ed item per l’installazione dei pacchetti o dalle repository o dalla apposita cartella debs inclusa - se utilizzata - nel costume.

Andiamo a vedere la sequence in dettaglio.

repositories

Come sappiamo le repositories vengono normalmente definite nel file /etc/apt/sources.list ed all’interno della directory /etc/apt/sources.list.d

Qua la suddivisione è la medesima.

sources.list

In questa sezione vengono specificati semplicemente i componenti da utilizzare:

  • main
  • contrib
  • non-free

Ovviamente i componenti specificati dovranno essere presenti nel nostro file /etc/apt/sources.list. Tuttavia verrà emesso solo un avviso, questa configurazione non è bloccante, poichè - nello specifico linuxmint - non utilizzano il file /etc/apt/sources.list preferendo una diverso configurazione.

sources.list.d

Quante volte vi sarà capitato di fare il taglia ed incolla per aggiungere repository ad un sistema? Beh, qui semplicemente andiamo ad aggiungere i medesimi comandi all’interno del costume.

Ad esempio, per aggiungere le repository per nodejs e visual studio code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sources_list_d:
- rm -f /usr/share/keyrings/packages.microsoft.gpg
- >-
curl -fsSL "https://packages.microsoft.com/keys/microsoft.asc" | gpg
--dearmor -o /usr/share/keyrings/packages.microsoft.gpg
- >-
echo "deb [signed-by=/usr/share/keyrings/packages.microsoft.gpg
arch=amd64] http://packages.microsoft.com/repos/code stable main" | tee
/etc/apt/sources.list.d/vscode.list > /dev/null

- rm -f /usr/share/keyrings/nodesource.gpg
- >-
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg
--dearmor -o /usr/share/keyrings/nodesource.gpg > /dev/null
- >-
echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg]
https://deb.nodesource.com/node_16.x `lsb_release -cs` main" | tee
/etc/apt/sources.list.d/nodesource.list > /dev/null

Notate che alcune linee cominciano con il simbolo - >-, questa è una specifica di yaml che permette semplicemnte di scrivere su più righe.

Si noti pure che la prima operazione è una rimozione del file signed-by, questo è utile per non avere interruzioni del processo se lo stesso file è già stato scaricato.

Anche qua, rivolgendomi ad integratori di sistema vi è ben poco da aggiungere, cercato su google i comandi per la repository interessata dalla quale dovete scaricare i pacchetti ed aggiungeteli all’interno di sources_list_d.

update

Naturalmente prima di poter scaricare i pacchetti dalle repository aggiunte va eseguito un apt updatem per cui normalmente l’item update è configurato normalmente a true.

upgrade

Qua vi è maggiore libertà, se upgrade è true prima dell’installazione dei pacchetti verrà fatto un aggiornamente generale: apt full-upgrade,

preinst

Succede che prima di installare un pacchetto, vi sia bisogno di configurazioni particolaru. Un caso specifico è l’installazione di proxmox-ve che richiede nella configurazione dell’host di valorizzare l’indirizzo ip dello stesso,

preinst viene utilizzato per questo scopo.

packages

Qui viene riportata la lista dei pacchetti da installare, nel nostro caso: cinnamon e firefox-esr. Notate che in packages l’installazione avverrà sia per i pacchetti stessi che per i pacchetti specificati come recommanded all’interno dei pacchetti richiesti, per cui cinnamon si porterà dietro tutto il necessario: xorg-server, lightdm, etc

packages_no_install_recommends

Vi sono casi in cui non conviene scaricare i pacchetti raccomandati, packages_no_install_recommends viene utilizzato per questo scopo.

debs

Specificando debs: true ed aggiungendo all’interno del costume una cartella debs è possibile installare pacchetti custom non presenti in una repository specifica.

packages_python

Possiamo anche installare pacchetty python con pip, basterà aggiungere i pacchetti pyhon a questa lista.

accessories

Come detto in precedenza, la sequence è il pù possibile atomica e cioè indivisibile, non di meno è possibile suddividere il nostro lavoro di vestizione in più parti, ad esempio: interfaccia grafica, ufficio, multimedia, firmware, etc.

Questi costumi, non sono completi di norma, ma sono considerati accessori del costume principale e possono essere interni - contenuti all’interno del costume stesso come sottodirectory oppure nella cartella accessories all’interno del wardrobe,

Naturalmente questo ci facilita notevolmente il lavoro e permette di utilizzare gli stessi accessori su costumi diversi. Di norma - ma sto sperimentando anche io - conviene partire inizialmente con accessori interni poi - quando il lavoro è consolidato - sarà sufficiente transitare l’accessorio nel cassetto del wardrobe per poterlo utilizzarlo su altri costume.

customize

customize si compone al momento di dirs ed hostname - variabili booleane - e scripts di customizzazione.

dirs

E’ possibile inserire all’interno del costume una directory dirs contentente tutte le nostre modifiche al file system del sistema.

La cartella verrò copiata ricorsivamente nella root del sistema e porterà con sè la nostra customizzazione, Normalmente vengono utilizzate dirs/etc/skel e dirs/usr/share/backgrounds per la configurazione iniziale dell’utente e degli sfondi.

hostname

Se hostname è impostato a true il sistema verrà ridenominato con il nome del costume. Ad esempio: colibri

scripts

Gli scripts vengono chiamati come specificato dalla lista e vengono passati i parametri $1 e $2 come nome dell’utente chiamante e path per il desktop, tradotto secondo lo schema xdg.

reboot

In caso di costume questo campo è sempre true e comporterà il reboot alla fine della sequenza e della customizzazione. Nel caso di accessorio questo campo non è specificato o sarà specificato come false.

1
2
3
4
5
dirs: true
hostname: true

scripts:
- desktop_links_set

ISO create con wardrobe

Potete trovare le mie customizzazioni sotto ISOs/Debian/bullseys sulla pagina del progetto penguins-eggs.