回答:
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は対話的に使用することも、スクリプト化することもできます。
fakeroot bash
コマンドを発行しようとすると、所有権に関しては機能しません。また、このar
方法は、大きなdebファイルに対して非常に高速です。
dpkg-deb -R
モードの使用は維持され、抽出されたファイルはにdpkg-deb -b
リセットさuid:gid
れました0:0
。fakerootは必要ありませんでした(アーカイブ内にset {u、g} idファイルがある場合は問題があるかもしれませんが、私の状況ではそうではありませんでした
/etc
または/var
特定のグループに属する必要があるファイルやディレクトリなど。
次のように、スクリプトを置き換えるオプションとともにfpmを使用できます。--after-install
postinst
fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb
-e
スイッチを使用して、制御ファイルを変更することもできます。これにより、エディターで制御ファイルが開きます。fpm -e -s deb -t deb ../old.deb