Guida embedded : linux minimale con initramfs

U

Utente cancellato 277320

Ultima modifica da un moderatore:
Talvolta capita di voler usare una scheda linux-embedded per una semplice applicazione.

Ad esempio per il solo fatto che Linux possiede gia' implementato lo stack di rete, protocolli di ogni genere, un infinita' di driver di ogni genere e molto altro.

Supponiamo in oltre di volere un sistema che sia robusto, riparta sempre indentico, e che il filesystem e il kernel siano piu piccoli possibili, al fine di ottimizzare il boot, anche se l'ottimizzazione del tempo di boot e' un capitolo a parte molto complesso. Ma gia un kernel piccolo favorisce un boot piu veloce.


Parlando di file system su sdcard o emmc, tralasciando per ora memorie nand e spi-nor, che utilizzano altri tipi di file system, come ubi e jffs2, quali sono le possibilita' ?

1 - solo un initramfs minimale, busybox - librerie C e poche altre (da 15MB circa su arm) e la nostra app

In questo caso abbiamo un piccolo filesystem rw, ma ovviamente ogni cosa che viene scritta non e' persistente. Servizi d'avvio non brontolano, per loro il sistema e' scrivibile. Nel caso link simbolici a una partizione scrivibile di qualche media possono essere aggiunti.

2 - romfs + link simbolici

romfs e' un file system read-only che consente dimensioni ridotte del fs, ripartenza sempre in ordine, se serve mantenere dati persistenti si possono utilizzare link simbolici a una partizione scrivibile

3 - altri filesystem

vi sono altri fs nati per quest'uso, ad esempio cramfs (legacy) e suo successore squashfs, che sono read-only per design, ma qualsiasi fs puo essere settato read-only dalla commandline del kernel (ro), molti usano ext2 in ro ad esempio-

overlayfs

In ogni caso, su un file system read-only si puo affiancare overlayfs, suo utilizzo visibile in gnenere su fw router/distro openwrt.
Sostanzialmente si aggiunge un filesystem scrivibile in ram, o anche su altra partizione, a scelta, sovrapposto e invisibile a quello readonly, che non viene modificato.

overlayfs

Come preparere questi file system ?

I tools sono vari, il modo piu semplice e' utilizzare delle distribuzioni per embedded, con i loro menu di configurazione, tipo buildroot, su cui configuri tutto, fino a Yocto, su cui anche configuri tutto, ma tramite file testuali, piu complessa per iniziare, fino al modo manuale, dove su un albero "target" root precostituito si crea l'immagine file system tramite tools come genromfs, genext2fs, cpio (per initramfs) , mkfs.cramfs, gensquashfs.

Per chi vuole dare un occhiata, io mi sono creato una piccola distro personale per queste cose

erg

Ecco un boot initramfs su banana pi m2 zero

Codice:
U-Boot SPL 2021.10-00600-g623d56fbac (Nov 29 2021 - 14:43:32 +0100)
DRAM: 512 MiB
Trying to boot from MMC1


U-Boot 2021.10-00600-g623d56fbac (Nov 29 2021 - 14:43:32 +0100) Allwinner Technology

CPU:   Allwinner H2+ (SUN8I 1680)
Model: Banana Pi BPI-M2-Zero
DRAM:  512 MiB
MMC:   mmc@1c0f000: 0, mmc@1c10000: 2
Loading Environment from nowhere... OK
In:    serial
Out:   serial
Err:   serial
switch to partitions #0, OK
mmc0 is current device
21096320 bytes read in 909 ms (22.1 MiB/s)
24729 bytes read in 2 ms (11.8 MiB/s)
## Booting kernel from Legacy Image at 42000000 ...
   Image Name:   mainline kernel
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    21096256 Bytes = 20.1 MiB
   Load Address: 40008000
   Entry Point:  40008000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 44000000
   Booting using the fdt blob at 0x44000000
   Loading Kernel Image
   Loading Device Tree to 49ff6000, end 49fff098 ... OK

Starting kernel ...


   █▄─▄▄─█▄─▄▄▀█─▄▄▄▄█
   ██─▄█▀██─▄─▄█─██▄─█
   ▀▄▄▄▄▄▀▄▄▀▄▄▀▄▄▄▄▄▀

Sysam erg distribution
Welcome !


BusyBox v1.34.0 (2021-11-11 17:38:18 CET) built-in shell (ash)
Enter 'help' for a list of built-in commands.

/ #

Spero questa piccola guida sia utile. Approfondire ogni punto ora rischia di rendere la guida troppo pesante. Ma casomai posso approfondire piu nel dettaglio. Feedback benvenuti,