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
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,
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,