4

Я работаю над чем-то в Makefile, которое будет выглядеть примерно так:

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 .

Идея заключается в том, что я смогу перейти в каталог ./tmp/tarball и создать тарбол , который при распаковке в системе будет сам распаковываться в /etc/service , /usr/local и в /opt/myproject .

Классический подход, похоже, заключается в использовании tar -czvf -C tmp/tarball . но это приводит к списку записей tar, которые начинаются с ./ .

Я вдохновлен пакетом от языка Go, который указывает, что он должен быть установлен с:

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

Что было бы идеально для моего варианта использования, я хотел бы иметь возможность сделать:

tar -C / -xzf myproject.tar.gx

Что, в свою очередь, извлечет файлы изначально из ~/some-working-directory/tmp/tarball/_____ в /_____ , что означает, что я могу просто подделать структуру установки.

Конечно, это может быть лучше достигнуто с помощью чего-то вроде fpm , что я не исключаю, но я не заинтересован в решениях с большим весом, и я предполагал, что смогу сделать это, не прибегая к Ruby.

Я наткнулся на fakechroot , который кажется многообещающим, но неудивительно, что в chroot нет смолы, и когда я начал спускаться по этой кроличьей норе, я просто предположил, что делал что-то не так, и должен обратиться за помощью.

2 ответа2

3

Из руководства по GNU tar:

Когда tar извлекает элементы архива из архива, он удаляет все начальные косые черты (`/') из имени элемента. Это приводит к тому, что абсолютные имена членов в архиве рассматриваются как относительные имена файлов. Это позволяет вам извлекать таких членов где угодно, вместо того, чтобы ограничиваться извлечением членов в точном каталоге, указанном в архиве. Например, если член архива имеет имя ` /etc/passwd ', tar извлечет его так, как если бы оно было действительно` etc/passwd '.

Таким образом, мое создание tar выглядит так:

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

Когда это установлено с:

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

Тогда все работает как положено, к лучшему или к худшему.

0

Почему ты делаешь это так сложно?

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .