Vamos dar uma olhada em um pacote da QNAP, por exemplo link
....
script_len=2467
/bin/dd if="${0}" bs=$script_len skip=1 | /bin/tar -xO | /bin/tar -xzv -C $_EXTRACT_DIR script_len=2467
....
Agora vamos copiar os dados com dd
e ver o que está dentro:
%dd if=TwonkyServerEU_8.3_arm-x41.qpkg bs=2467 skip=1 > first
É um arquivo TAR bruto, com um único arquivo tar.gz dentro dele:
%file first
first: POSIX tar archive (GNU)
%tar -tvf first
-rw-r--r-- admin/administrators 7175 2017-01-06 17:49 control.tar.gz
A próxima etapa do pipeline é /bin/tar -xO
, e aqui está o que o manual do TAR diz sobre isso:
To write the extracted files to the standard output, instead of creating the files on the file system, use
--to-stdout' (
-O') in conjunction with--extract' (
--get', '-x').This option is useful if you are extracting files to send them through a pipe, and do not need to preserve them in the file system. If you extract multiple members, they appear on standard output concatenated, in the order they are found in the archive.
Como há apenas um arquivo control.tar.gz
dentro do arquivo, ele será extraído para STDOUT, para ser processado pela próxima etapa do pipeline, que invocará o TAR novamente para extrair o conteúdo interno dele.
Então, basicamente, existe um arquivo 'tar.gz' dentro do arquivo 'tar', e é por isso que dois comandos seqüenciais de tar
são necessários para extraí-lo.
Observe que tar
é inerentemente projetado para operar em dados de fluxo,
para que possa detectar com segurança o final do arquivo, mesmo que seja seguido por mais dados:
Physically, an archive consists of a series of file entries terminated by an end-of-archive entry, which consists of two 512 blocks of zero bytes.
Então, tar -xO
, irá parar após o primeiro arquivo de dados ser lido e descartar o resto, o que eu acho que foi uma justificativa para usar este formato de armazenamento em qpkg
.