DEB'yi kolayca açın, postinst düzenleyin ve DEB'yi yeniden paketleyin


129

Intel'in OpenCL SDK'sını kurmaya çalışıyorum ancak DEB dosyaları RPM'den buggy dönüşümleri ( meraklılar için buraya bakınız ). postinstSenaryoyu sağladıkları DEB'de düzenlemeliyim .

Mevcut bir DEB'yi nasıl alabilirim, içerikleri (kontrol bilgileri dahil) çıkarabilir, daha sonra yeni bir DEB yapmak için içeriği yeniden paketleyebilir miyim? Sadece dosyaları düzenleyeceğim, hiçbir dosya eklenmeyecek veya kaldırılmayacak.

Yanıtlar:


202

Deb paketlerini işlemek için birincil komut şudur dpkg-deb.

Paketi açmak için boş bir dizin oluşturun ve ona geçin, ardından dpkg-debkontrol bilgilerini ve paket dosyalarını çıkartmak için çalıştırın . dpkg-deb -bPaketi yeniden kurmak için kullanın .

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

Komut dosyanız kök olarak çalışmadığı sürece, dosyaların izin ve sahip olma işlemlerinin ayıklama aşamasında bozulmayacağını unutmayın. Bundan kaçınmanın bir yolu, betiğinizi altında çalıştırmaktır fakeroot. Tüm diziyi tek tek fakerootdeğil, altında dpkg-debtek tek çalıştırmanız gerektiğine dikkat edin , çünkü bu fakeroot, onlar gibi oluşturulamayan dosyaların izinlerinin hafızasını tutan işlemdir.

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

İzinlerle uğraşmak yerine, veri arşivini bozulmadan tutabilir ve yalnızca kontrol arşivini değiştirebilirsiniz. dpkg-debbunu yapmanın bir yolunu sağlamıyor. Neyse ki, deb paketleri standart bir formatta: ararşivler. Böylece arkontrol arşivini çıkartmak, dosyalarını ardeğiştirmek ve kontrol arşivini yeni bir sürümle değiştirmek için tekrar kullanabilirsiniz .

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

Sen gerektiğini bir ekleme changelog girişi ve değişim sürüm numarasını paketin bir şey değiştirirseniz. Debian paketlerini manipüle etme altyapısı, iki paket aynı isim ve sürüme sahipse aynı paket olduklarını varsayar. Sürüm numarasının sonundaki debian_revision bölümüne bir sonek ekleyin ; Sebepleri ile başlamalıdır eki sıralamak için ~, örneğin 1.2.3-4.1olur 1.2.3-4.1~johnjumper1.

Shell araçlarını kullanmak yerine Emacs kullanabilirsiniz. dpkg-dev-elPaket (bu bir yerli Debian paketi gibi kendi memba olan) modları düzenlemek için içerdiği .debdosya ve Debian Değişiklikleri gösteren düzenleyin. Emacs etkileşimli olarak kullanılabilir veya kodlanabilir.


4
Ayrıca kullanabilirsiniz -eait anahtarı fpm kontrol dosyasını değiştirmek için: fpm -e -s deb -t deb ../old.deb. Bu, kontrol dosyasını editörünüzde açacaktır.
Artefacto

1
btw fakeroot bashve komutlar vermeye çalışın mülkiyet konusunda işe yaramayacak ve arbüyük deb dosyaları için yöntem inanılmaz hızlı!
Kova Gücü

1
Teşekkürler. Bu faydalı oldu. dpkg-deb -RModları kullanarak tutuldu ve çıkarılan dosyaların dpkg-deb -bsıfırlandı . uid:gid0:0
Sahte dosyaya ihtiyaç duymadım (

2
@PSkocik Yalnızca setxid dosyaları değil, aynı zamanda belirli bir gruba ait /etcya da altındaki dosyaları ve dizinleri /varde ayarlamaz.
Gilles,

8

Fpm'yi--after-install , postinstbetiği değiştirme seçeneğiyle birlikte kullanabilirsiniz :

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

2
Debian / Ubuntu'da fpm kurmak için: sudo apt-get install ruby-dev build-essential; sudo mücevher yükleme fpm
Craig S. Anderson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.