Flashing, Estrazione e Check

From Ability
Revision as of 16:28, 10 July 2015 by Wikiadmin (Talk | contribs) (Created page with "==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 im...")

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

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.