Pracuji se skriptem, který je samorozbalovacím skriptem. Je to skript pro instalaci balíčků na QNAP NAS.
Na začátku má nějaké skriptování, které extrahuje zbytek souboru. Tady to je:
script_len=102
/bin/dd if="${0}" bs=$script_len skip=1 | /bin/tar -xO | /bin/tar -xzv
Toto používá dd
zkopírujte bajty od bajtu 102 dále do tar, kde se extrahují.
Co znamená -xO
dělat? A proč je extrahován „dvakrát“ (dvě vyvolání tar s -x
) ? Na internetu jsem o tom nenašel mnoho diskuzí – zdá se, že manuálová stránka naznačuje, že to má něco společného s „disky“. (Vypadá to, že jsem si spletl 0 a Os!)
Následně skript provede:
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
Zdá se, že to přeskočí dále do souboru a zkopíruje tam bajty do nového zazipovaného TAR. Tyto bajty jsou pravděpodobně již takto strukturovány a zakódovány.
Nepřečetli jsme však již tyto bajty prostřednictvím tar v prvním příkazu? Nevidím žádný způsob, jak dd
bylo řečeno, aby přestal číst soubor.
Přijatá odpověď:
Podívejme se na balíček QNAP, např. 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
....
Nyní zkopírujeme data pomocí dd
a podívejte se, co je uvnitř:
%dd if=TwonkyServerEU_8.3_arm-x41.qpkg bs=2467 skip=1 > first
Toto je nezpracovaný archiv TAR s jediným souborem tar.gz:
%file first
first: POSIX tar archive (GNU)
%tar -tvf first
-rw-r--r-- admin/administrators 7175 2017-01-06 17:49 control.tar.gz
Dalším krokem v kanálu je /bin/tar -xO
, a zde je to, co o něm říká příručka TAR:
Chcete-li zapsat extrahované soubory na standardní výstup, místo vytváření souborů v systému souborů použijte
--to-stdout' (
-O’) ve spojení s--extract' (
–get’, „-x“).Tato možnost je užitečná, pokud extrahujete soubory a posíláte je kanálem a nepotřebujete je uchovávat v systému souborů. Pokud extrahujete více členů, objeví se na standardním výstupu zřetězené , v pořadí, v jakém se nacházejí v archivu.
Protože existuje pouze jeden soubor control.tar.gz
uvnitř archivu bude extrahován do STDOUT, kde bude zpracován dalším krokem potrubí, který znovu vyvolá TAR, aby z něj extrahoval vnitřní obsah.
V zásadě tedy existuje archiv „tar.gz“ uvnitř archivu „tar“, což je důvod, proč dva po sobě jdoucí tar
k jeho extrakci jsou nezbytné příkazy.
Všimněte si, že tar
je ze své podstaty navržen tak, aby fungoval s datovými proudy,
takže dokáže spolehlivě detekovat konec archivu, i když po něm následuje další data:
Fyzicky se archiv skládá ze série záznamů souborů ukončených záznamem na konci archivu, který se skládá ze dvou 512 bloků po nule bajtů.
Takže tar -xO
, zastaví se po prvním přečtení datového souboru a zbytek zahodí, což byl myslím důvod pro použití tohoto formátu úložiště v qpkg
.