web-dev-qa-db-ja.com

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

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

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

141
John Jumper

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つの方法は、スクリプトを 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エントリ を追加し、パッケージの何かを変更する場合は version numberを変更する必要があります。 Debianパッケージを操作するためのインフラストラクチャでは、2つのパッケージが同じ名前とバージョンである場合、それらは同じパッケージであると想定しています。バージョン番号の最後のdebian_revision部分にサフィックスを追加します。並べ替えの理由から、サフィックスは~で始める必要があります。 1.2.3-4.11.2.3-4.1~johnjumper1になります。

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

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

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