1. Indice

2. Come si compila Linux

Innanzitutto dobbiamo capire di quale Linux stiamo parlando.

Se infatti accedessimo al sito kernel.org noteremmo che esistono diverse versioni di linux.

La principale versione di Linux è la Linux mainline, che rilascia le versioni ufficiali e le release candidates, ovvero le versioni candidate al rilascio.

Quello che abbiamo invece scaricato tendenzialmente sono le linux stable, che effettua delle backport dei fix all’interno della linea principale.

Linux viene compilato attraverso l’utilizzo dei makefile. È necessario specificare un file di configurazione, questo perché Linux supporta tantissime architetture diverse tra di loro, ed è quindi necessario effettuare dei tweak per ogni versione affinché possa funzionare.

QUando eseguiamo il comando make fileconfig si aprirĂ  una schermata dove possiamo personalizzare il nostro sistema con tutte le configurazioni che vogliamo inserire. Le varie opzioni possono essere caricati, non caricati oppure caricati come moduli, ovvero eseguibili che vengon ocaricati solo quando necessario.

Quando scarichiamo una versione di Linux nella cartella /boot/ si troverĂ  un file di configurazioni globali che verranno utilizzati quando si compilerĂ  il kernel.

Per installare il kernel esistono diverse opzioni.

Una prima opzione è quella di usare il comando make binrpm-pkg, cos’ da generare dei pacchetti rpm per il kernel. Per installare il kernel sulla macchina stessa si utilizza il comando make install e make module_install (per i moduli).

Se invece volessimo scaricarlo su un altro sistema è possibile copiare i file .rpm all’interno della macchina designata e successivamente spacchettarli attraverso dnf. Quando avrà finito con un semplice reboot potremo selezionare il kernel appena compilato.

All’interno del file module.alias troviamo tutta una serie di alias che permettono di capire quali moduli caricare qualora venisse rilevato un dispositivo.

2.1. Compilare un singolo modulo

Il primo metodo per compilare un singolo modulo (file .ko) è quello di compilare l’intero kernel e selezionare solo i moduli desiderati.

Questo metodo è dispendioso, quidni si preferisce una compilazione out-of-tree. In questa versione si prende una versione già compilata del kernel e si pacchettizza solamente uno dei moduli accedibili (eventualmente dopo le desiderate modifiche al modulo).

A questo punto è possibile utilizzare e distribuire solamente il singolo modulo.

3. VirtIO

È uno standard per la creazione di macchine virtuali.

Le macchine virtuali non hanno infatti necessità stretta di emulare le componenti in modo preciso, ma è possibile per loro utilizzare delle tecniche per ottimizzare.

Per capire se ci troviamo su una macchina virtuale uno dei metodi è proprio quello di visualizzare le periferiche (lspci) e vedere se sono periferiche emulate o meno.

Essitono diversi :

In particolare capiamo cos’è Virtio-vsock. Questo driver permette di effettuare comunicazioni tra macchine virtuali e macchine fisiche attraverso una virtualizzazione dei socket. Permette la comunicazione attraverso le socket API utilizzando semplicemente degli ID assegnate alle varie macchine virtuali.

Un esempio di utilizzo di vsock sono le guest-addition di virtualbox che permettono di fare copia-incolla tra macchina guest e host.

Attraverso il software netconnect è possibile connettere attraverso un vsock le due macchine:

# Macchina fisica
nc --vsock -l 12345

# Macchina Virtuale
nc --vsock 2 12345

4. Contibuire a Linux

Linux è un progetto open-source alla quale è possibile contribuire in modo libero.

In pratica i maggiori contributori (e in realtà gli unici) sono le grandi società come Intel, Google, RedHat, Linaro, SUSE, AMD, NVIDIA, Qualcomm, Meta, …

Tuttavia si può accedere alla repo github.com/torvalds/linux e utilizzare le pull request anche se non è il modo ufficiale.

IL modo ufficiale per l’invio delle patch è per email. Al sito lore.kernel.org è possibile visualizzare una raccolta delle email inviate per effettuare delle modifiche e caricare il codice modificato attraverso il comando diff.

Dietro ai motivi della scelta delle email si celano due problemi diversi: il single-point-of-failure che introduce un unico metodo come le pull request di github, e poi il fatto stesso che Github è un azienda privata posseduta dalla microsoft.

Attraverso il comando:

git format-patch -1

Si genera un file .patch che contiene il commit delle modifiche fatte. Questo comando prende le informaizoni trovate in ~/.gitconfig per la mail.

Per inviare una mail si utilizza il comando:

git send-email

Chi effettuera il controllo della patch risponde alla mail, tendenzialmente utilizzando client mail da terminale.

Questi utenti si chiamano maintainer. Il main maintainer è Torvalds in persona che revisiona tutte le patch che arrivano a lui. Sotto si hanno dei cluser di maintainer, divisi per moduli divisi ad albero.

La lista dei maintainers dei vari moduli si trova nel file MAINTAINERS all’interno della repo di Torvalds.