DEBを簡単にアンパックし、postinstを編集し、DEBを再パックします


129

IntelのOpenCL SDKをインストールしようとしていますが、DEBファイルはRPMからのバグのある変換です(好奇心についてはこちらを参照してください)。postinst彼らが提供するDEB のスクリプトを編集する必要があります。

既存のDEBを取得し、コンテンツ(制御情報を含む)を抽出し、後でコンテンツを再パッケージして新しいDEBを作成するにはどうすればよいですか?ファイルの編集のみを行い、ファイルの追加や削除は行いません。

回答:


202

debパッケージを操作する主なコマンドはdpkg-debです。

パッケージを解凍するには、空のディレクトリを作成して切り替えてから、dpkg-debその制御情報とパッケージファイルを抽出します。dpkg-deb -bパッケージの再構築に使用します。

mkdir tmp
dpkg-deb -R original.deb tmp
# edit DEBIAN/postinst
dpkg-deb -b tmp fixed.deb

スクリプトがルートとして実行されていない限り、抽出段階でファイルの権限と所有権が破損することに注意してください。これを回避する1つの方法は、スクリプトをで実行することfakerootです。そのままでは作成できないファイルのアクセス許可のメモリを保持するプロセスであるためfakeroot、シーケンスごとにdpkg-deb個別にではなく、全体を実行する必要があることに注意してくださいfakeroot

fakeroot sh -c '
  mkdir tmp
  dpkg-deb -R original.deb tmp
  # edit DEBIAN/postinst
  dpkg-deb -b tmp fixed.deb
'

アクセス許可を台無しにするのではなく、データアーカイブをそのまま保持し、コントロールアーカイブのみを変更できます。dpkg-debそれを行う方法を提供していません。幸いなことに、debパッケージは標準形式であり、arアーカイブです。そのarため、コントロールアーカイブの抽出、ファイルの変更、およびarコントロールアーカイブの新しいバージョンへの置き換えに再度使用することができます。

mkdir tmp
cd tmp
ar p ../original.deb control.tar.gz | tar -xz
# edit postinst
cp ../original.deb ../fixed.deb
tar czf control.tar.gz *[!z]
ar r ../fixed.deb control.tar.gz

あなたはすべき追加のchangelogエントリをし、変更、バージョン番号を使用すると、パッケージに何かを変更した場合。Debianパッケージを操作するインフラストラクチャは、2つのパッケージが同じ名前とバージョンを持っている場合、それらは同じパッケージであると想定しています。バージョン番号の最後にあるdebian_revisionパーツにサフィックスを追加します。接尾辞で始まる必要がある理由は、ソートのために~、例えば1.2.3-4.1なり1.2.3-4.1~johnjumper1

シェルツールを使用する代わりに、Emacsを使用できます。dpkg-dev-elパッケージ(これはネイティブのDebianパッケージであるとして、自身の上流にある)を編集するモードが含まれている.debファイルをし、Debianの変更履歴を編集します。Emacsは対話的に使用することも、スクリプト化することもできます。


4
fpm-eスイッチを使用して、制御ファイルを変更することもできます。これにより、エディターで制御ファイルが開きます。fpm -e -s deb -t deb ../old.deb
アーティファクト14年

1
ところで、fakeroot bashコマンドを発行しようとすると、所有権に関しては機能しません。また、このar方法は、大きなdebファイルに対して非常に高速です。
アクエリアスパワー

1
ありがとう。これは役に立ちました。dpkg-deb -Rモードの使用は維持され、抽出されたファイルはにdpkg-deb -bリセットさuid:gidれました0:0。fakerootは必要ありませんでした(アーカイブ内にset {u、g} idファイルがある場合は問題があるかもしれませんが、私の状況ではそうではありませんでした
。– PSkocik

2
@PSkocik setxidファイルだけでなく、たとえば、特定のグループに属する、/etcまたは/var特定のグループに属する必要があるファイルやディレクトリなど。
ジル

8

次のように、スクリプトを置き換えるオプションとともにfpmを使用できます。--after-installpostinst

fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb

2
Debian / Ubuntuにfpmをインストールするには:sudo apt-get install ruby​​-dev build-essential; sudo gem install fpm
クレイグS.アンダーソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.