Flashing, Estrazione e Check
Contents
Flashing
Comandi di flashing usati per l'installazione delle immagini per BMW.
Installazione di immagini con tar (v1.2.6)
Tar è molto valido per il trasporto di immagini da installare. Memorizza tutti i tipi di file e i metadati e può replicare totalmente un filesystem. Come contro tar non può installare ne il tipo di formattazione ne la partition table.
Opzioni usate
- "xspf " Estrazione mantenendo l'ordinamento dei dati e preservando tutti i permessi e metadati;
- "-C " per definire la cartella di destinazione;
- "--delay-directory-restore" permette di ripristinare correttamente tutti i metadati (mtime etc.. ) delle cartelle;
- "--numeric-owner" memorizza ed estrae gli utenti in forma numerica invece che letterale questo perchè il sistema che esegue l'installazione potrebbe non avere definiti tutti gli utenti e i gruppi del sistema installato;
opzionali per controllare l'avanzamento della installazione:
- "--checkpoint" ogni volta che in scrittura o lettura si raggiunge la soglia checkpoint viene eseguita una determinata azione per controllare l'avanzamento;
- "--checkpoint-action" definisce il file o l'azione da eseguire ogni volta che si raggiunge la soglia di checkpoint.
Il comando risultante senza controllo di avanzamento è il seguente:
tar xspf <file_tar> -C <destination_folder> --delay-directory-restore --numeric-owner
utilizzando invece il controllo di avanzamento:
tar xspf <file_tar> -C <destination_folder> --delay-directory-restore --numeric-owner --checkpoint=2000 --checkpoint-action=exec="/usr/bin/cpoint"
dove "cpoint" è un eseguibile che può segnalare l'avanzamento del tar tramite una variabile d'ambiente chiamata TAR_CHECKPOINT che tar passa a cpoint
Installazione di immagini raw
Le immagini raw di partizioni o dischi hanno il pro di mantenere invariati formattazione, metadati, tabelle delle partizioni etc.. Inoltre la velocità di installazione è molto più alta di una installazione con tar. Come contro copiano anche gli spazi vuoti, copiare raw una partizione praticamente vuota da 20GB non è una buona idea. Un altro contro è che non tutte le memorie hanno la stessa dimensione specialmente memorie particolari come eMMC o Flash.
Usare dd
dd è il comando più utilizzato per eseguire queste operazioni. E' utile sfruttare il parametro bs per ottimizzare le prestazioni.
dd if=<file_raw> of=<destination_device> bs=32768 conv=fsync
Usare sendfile
sendfile è una syscall del kernel linux che permette di eseguire la copia tra due file descriptor totalmente in kernel space (anche detta zero-copy). Poiché sendfile non passa dati all'utente non esegue nessuna cpu-copy ma solo dma-copy riducendo inoltre i context switch. Un esempio di codice che usa sendfile:
#define _LARGEFILE_SOURCE #define _LARGEFILE64_SOURCE #define __USE_FILE_OFFSET64 void zero_copy(const char* src, const char* dst) { int src_fd, dst_fd; size_t block_read = 32768; int ret; struct stat st; src_fd = open(src, O_RDONLY | O_NONBLOCK | O_LARGEFILE); if( src_fd < 0 ) { perror("error opening src: "); return; } ret = fstat(src_fd, &st); if( ret < 0 ) { perror("error stat src: "); return; } block_read = st.st_size; dst_fd = open(dst, O_WRONLY | O_NONBLOCK); if( dst_fd < 0 ) { perror("error opening dst: "); return; } ret = 1; while ( ret > 0 ) { ret = sendfile (dst_fd, src_fd, NULL, block_read); if (ret != block_read) printf("sendfile %d\n", ret); } close(src_fd); close(dst_fd); } int main(int argc, char *argv[]){ zero_copy(argv[1], argv[2]); return 0; }
Installazione di immagini ubi
Guardare la guida Ubifs_how_to
Estrazione
L'estrazione è il processo di creazione di immagini adatte ad essere installate. L'estrazione deve ridurre a zero la perturbazione dei dati letti. Per questo motivo tutte le operazioni di open o mount devono essere fatte in RDONLY.
Estrazione di immagini tar (v1.2.6)
L'estrazione di una immagine tar deve essere eseguita dall'interno della root directory. (Non usare ".*" che non considera i files che iniziano per ".")
Opzioni usate
- "find ." esegue un elenco dei file all'interno della cartella
- "sort" esegue un ordinamento "standard" della lista dei file. Questi due comandi sono necessari se la formattazione della partizione di estrazione non è la stessa della partizione di installazione. Formattazioni diverse passano i files a tar in modo diverso.
- "--mtime "1970/1/1 00:00:00 +0000" (non mi ricordo perché uso questa opzione)
- "-cspf" crea un archivio mantenendo invariato il sort passato in ingresso e preservando i metadata
- "--numeric-owner" memorizza in modo numerico owner e gruppi
- "--no-recursion" la ricorsione è già stata fatta da find
- "-T i files devono esser presi dallo stdin
find . | sort | tar --mtime "1970/1/1 00:00:00 +0000" -cspf <file_tar> --numeric-owner --no-recursion -T -
Estrazione di immagini raw
L'estrazione delle immagini raw viene fatta seguendo le indicazioni dell'installazione
Estrazione di immagini ubi
Seguire le indicazioni in Ubifs_how_to
Check
Check di immagini tar (v1.2.6)
Come sempre il metodo migliore è usare md5sum o qualsiasi altro algoritmo di hash su tar. Il controllo può essere fatto runtime completamente in ram:
find . | sort | tar --mtime "1970/1/1 00:00:00 +0000" -csp --numeric-owner --no-recursion -T - | md5sum -
Check di immagini raw
Con le immagini raw è possibile usare md5sum direttamente sul dispositivo:
md5sum /dev/mmcblk0p1
Check di immagini ubi
Il check delle immagini ubi può essere fatto come per tar. Purtroppo non è possibile esegure un md5sum delle immagini ubiformat.