web-dev-qa-db-ja.com

偽の `root`でtarballを作成する

私は次のようなMakefileの何かに取り組んでいます:

 tarball:
 mkdir -p tmp/tarball/etc/service 
 mkdir -p tmp/tarball/usr/local 
 mkdir -p tmp/tarball/opt /myproject
cdsensordatad; make 
 cd sensortunneld; make device_name 
 cp -r sensorservices tmp/tarball/etc/service 
#ここで次のようなtarballを作成します。
#chroot tmp/tarball; tar -czvfmyproject.tar.gz。

アイデアは、./tmp/tarballディレクトリに移動して、システムで解凍すると/etc/service/usr/local、および/opt/myprojectに解凍されるtarballを作成できるようにすることです。

古典的なアプローチは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に出くわしました。これは有望なようですが、当然のことながら、charはchrootに存在しません。そのウサギの穴を降り始めたとき、私は何か間違ったことをしていると思ったので、尋ねる必要があります。援助。

5
Lee Hambley

GNU tarマニュアルから:

tarがアーカイブからアーカイブメンバーを抽出するとき、メンバー名から先頭のスラッシュ( `/ ')をすべて削除します。これにより、アーカイブ内の絶対メンバー名が相対ファイル名として扱われます。これにより、アーカイブで指定された正確なディレクトリ内のメンバーの抽出に制限されるのではなく、そのようなメンバーを必要な場所で抽出できます。たとえば、アーカイブメンバーの名前が `/etc/passwd 'の場合、tarはその名前が実際には` etc/passwd'であるかのように抽出します。

したがって、私のタールの作成は次のようになります。

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

その後、良くも悪くも、すべてが期待どおりに機能します。

3
Lee Hambley

なぜそんなに複雑なのですか?

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

0
user253975