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.