DEB を簡単に解凍し、postinst を編集して、DEB を再パックする

DEB を簡単に解凍し、postinst を編集して、DEB を再パックする

IntelのOpenCL SDKをインストールしようとしていますが、DEBファイルはRPMからのバグのある変換です(ここpostinst(興味のある人向け)。提供されている DEB 内のスクリプトを編集する必要があります。

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

答え1

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

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

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

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

シェルツールの代わりにEmacsを使うこともできます。dpkg-dev-elパッケージ(これはネイティブ Debian パッケージであるため、独自のアップストリームです) には、.debファイルを編集したり、Debian の変更ログを編集したりするためのモードが含まれています。Emacs は対話形式またはスクリプト形式で使用できます。

答え2

使用できますファクシミリ--after-install次のようにスクリプトを置き換えるオプションがありますpostinst

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

答え3

.deb ファイルからファイルを抽出するだけの場合は、7-Zip が便利です。7-Zip は「解凍のみ」の「ar」ファイルをサポートしています。(ファイル名を変更する必要はありません。*.deb は「ar」として開かれ、内部に「data.tar」が表示されます。)

関連情報