IntelのOpenCL SDKをインストールしようとしていますが、DEBファイルはRPMからのバグのある変換です(奇妙なことに here を参照)。彼らが提供するDEBのpostinst
スクリプトを編集する必要があります。
既存のDEBを取得してコンテンツ(制御情報を含む)を抽出し、後でコンテンツを再パッケージして新しいDEBを作成するにはどうすればよいですか?ファイルの編集のみを行い、ファイルの追加や削除は行いません。
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.1
は1.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