Sto lavorando con uno script che è uno script autoestraente. È uno script per installare i pacchetti su un QNAP NAS.
Ha alcuni script all'inizio che estraggono il resto del file. Eccolo:
script_len=102
/bin/dd if="${0}" bs=$script_len skip=1 | /bin/tar -xO | /bin/tar -xzv
Questo utilizza dd
per copiare i byte dal byte 102 in poi in tar, dove viene estratto.
Cosa significa -xO
fare? E perché viene estratto "due volte" (due invocazioni di tar con -x
) ? Non sono riuscito a trovare molte discussioni su questo online:la pagina man sembra suggerire che ha qualcosa a che fare con le "unità". (Sembra che io abbia confuso i miei 0 e Os!)
Successivamente, lo script:
offset=$(/usr/bin/expr $script_len + 2042)
/bin/dd if="${0}" bs=$offset skip=1 | /bin/cat | /bin/dd bs=1024 count=7 of=$_EXTRACT_DIR/data.tar.gz
Questo sembra saltare ulteriormente nel file e copia i byte lì in un nuovo TAR compresso. Presumibilmente quei byte sono già strutturati e codificati in questo modo.
Ma non abbiamo già letto quei byte tramite tar nel primo comando? Non vedo alcun modo in cui dd
è stato detto di interrompere la lettura del file.
Risposta accettata:
Diamo un'occhiata a un pacchetto QNAP, ad es. http://www.twonkyforum.com/downloads/8.3/TwonkyServerEU_8.3_arm-x41.qpkg
....
script_len=2467
/bin/dd if="${0}" bs=$script_len skip=1 | /bin/tar -xO | /bin/tar -xzv -C $_EXTRACT_DIR script_len=2467
....
Ora copiamo i dati con dd
e guarda cosa c'è dentro:
%dd if=TwonkyServerEU_8.3_arm-x41.qpkg bs=2467 skip=1 > first
Questo è un archivio TAR grezzo, con un singolo file tar.gz al suo interno:
%file first
first: POSIX tar archive (GNU)
%tar -tvf first
-rw-r--r-- admin/administrators 7175 2017-01-06 17:49 control.tar.gz
Il passaggio successivo della pipeline è /bin/tar -xO
, ed ecco cosa dice il manuale TAR su di esso:
Per scrivere i file estratti nell'output standard, invece di creare i file nel file system, usa --to-stdout' (
-O') insieme a --extract' (
–get', `-x').
Questa opzione è utile se si estraggono file per inviarli tramite una pipe e non è necessario conservarli nel file system. Se estrai più membri, questi appaiono sullo standard output concatenati , nell'ordine in cui si trovano nell'archivio.
Poiché esiste un solo file control.tar.gz
all'interno dell'archivio, verrà estratto in STDOUT, per essere elaborato dal passaggio successivo della pipeline, che invocherà nuovamente TAR per estrarre da esso il contenuto interno.
Quindi, in pratica, c'è un archivio "tar.gz" all'interno dell'archivio "tar", motivo per cui due tar
sequenziali i comandi sono necessari per estrarlo.
Nota che tar
è intrinsecamente progettato per funzionare sui dati in streaming,
in modo da poter rilevare in modo affidabile la fine dell'archivio, anche se è seguito da più dati:
Fisicamente, un archivio è costituito da una serie di voci di file terminate da una voce di fine archivio, che consiste in due 512 blocchi di zero byte.
Quindi, tar -xO
, si fermerà dopo la lettura del primo file di dati ed eliminerà il resto, che suppongo fosse una motivazione per l'utilizzo di questo formato di archiviazione in qpkg
.