Crie um tarball com uma 'raiz' falsa

5

Estou trabalhando em algo em um Makefile que será parecido com isto:

tarball:
        mkdir -p tmp/tarball/etc/service
        mkdir -p tmp/tarball/usr/local
        mkdir -p tmp/tarball/opt/myproject
        cd sensordatad; make
        cd sensortunneld; make device_name
        cp -r sensorservices tmp/tarball/etc/service
        # Make a tarball here, something like:
        #   chroot tmp/tarball; tar -czvf myproject.tar.gz .

A idéia é que eu possa ir para o diretório ./tmp/tarball e criar um tarball que, quando descompactado em um sistema, será descompactado para /etc/service , /usr/local e /opt/myproject .

A abordagem clássica parece ser usar tar -czvf -C tmp/tarball . , mas isso leva a uma lista de tar de entradas que começam com ./ .

Eu me inspiro no pacote da linguagem Go, que indica que ele deve ser instalado com:

tar -C /usr/local -xzf go1.0.3.linux-amd64.tar.gz

Qual seria o ideal para o meu caso de uso, gostaria de poder fazer:

tar -C / -xzf myproject.tar.gx

O que, por sua vez, extrairia os arquivos originalmente em ~/some-working-directory/tmp/tarball/_____ para /_____ , significando que eu poderia simplesmente falsificar a estrutura de instalação.

É claro que isso pode ser melhor alcançado com algo como fpm , o que eu não descartei, mas não estou interessado em soluções pesadas, e presumi que seria capaz de fazer isso sem recorrer para Ruby.

Eu tropecei em fakechroot , o que parece promissor, mas não é de surpreender que o tar não exista no chroot, e quando eu comecei a descer aquele buraco de coelho eu apenas assumi que estava fazendo algo errado e deveria pedir assistência.

    
por Lee Hambley 14.05.2013 / 22:35

2 respostas

3

Do manual do GNU alcatrão:

When tar extracts archive members from an archive, it strips any leading slashes ('/') from the member name. This causes absolute member names in the archive to be treated as relative file names. This allows you to have such members extracted wherever you want, instead of being restricted to extracting the member in the exact directory named in the archive. For example, if the archive member has the name '/etc/passwd', tar will extract it as if the name were really 'etc/passwd'.

Assim, minha criação de alcatrão é assim:

tar -czvf myproject.tar.gz -C tmp/tarball ./
./
./etc/
./etc/service/
./etc/service/sensorservices/
./usr/
./usr/local/
./opt/
./opt/myproject/

Quando isso é instalado com:

sudo tar --directory / -xzf ./myproject.tar.gz
sudo tar -C / -xzf ./myproject.tar.gz

Então tudo funciona como esperado, para melhor ou para pior.

    
por 14.05.2013 / 22:48
0

Por que você está fazendo isso tão complicado?

cd tmp/tarball; tar -czvf ../../myproject.tar.gz .

    
por 13.09.2013 / 19:28

Tags