Membongkar DEB dengan mudah, mengedit postinst, dan mengemas DEB

129

Saya mencoba untuk menginstal Intel OpenCL SDK tetapi file DEB adalah konversi buggy dari RPM (lihat di sini untuk penasaran). Saya perlu mengedit postinstskrip di DEB yang mereka sediakan.

Bagaimana saya bisa mengambil DEB yang ada, mengekstrak konten (termasuk informasi kontrol), kemudian mengemas ulang konten untuk membuat DEB baru? Saya hanya akan mengedit file, tidak ada file yang akan ditambahkan atau dihapus.

John Jumper
sumber

Jawaban:

202

Perintah utama untuk memanipulasi paket deb adalah dpkg-deb.

Untuk membongkar paket, buat direktori kosong dan pindah ke sana, kemudian jalankan dpkg-debuntuk mengekstrak informasi kontrol dan file paket. Gunakan dpkg-deb -buntuk membangun kembali paket.

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

Berhati-hatilah karena kecuali skrip Anda dijalankan sebagai root, izin dan kepemilikan file akan rusak pada tahap ekstraksi. Salah satu cara untuk menghindari ini adalah dengan menjalankan skrip Anda di bawah fakeroot. Perhatikan bahwa Anda perlu menjalankan seluruh urutan di bawah fakeroot, tidak masing dpkg-deb- masing secara individual, karena fakerootproses itulah yang membuat memori izin file yang tidak dapat dibuat seperti mereka.

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

Daripada mengacaukan izin, Anda dapat menjaga arsip data tetap utuh dan hanya memodifikasi arsip kontrol. dpkg-debtidak menyediakan cara untuk melakukan itu. Untungnya, paket deb dalam format standar: mereka ararsip. Jadi, Anda dapat menggunakan aruntuk mengekstrak arsip kontrol, memodifikasi file-nya, dan menggunakan arlagi untuk mengganti arsip kontrol dengan versi baru.

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

Anda harus menambahkan entri changelog dan mengubah nomor versi jika Anda memodifikasi sesuatu di dalam paket. Infrastruktur untuk memanipulasi paket Debian mengasumsikan bahwa jika dua paket memiliki nama dan versi yang sama, mereka paket yang sama. Tambahkan akhiran ke bagian debian_revision di akhir nomor versi; untuk alasan penyortiran, akhiran harus dimulai dengan ~, misalnya 1.2.3-4.1menjadi 1.2.3-4.1~johnjumper1.

Alih-alih menggunakan alat shell, Anda dapat menggunakan Emacs. The dpkg-dev-elpaket (yang merupakan hulu sendiri karena ini adalah paket Debian asli) berisi mode untuk mengedit .debfile dan mengedit changelogs Debian. Emacs dapat digunakan secara interaktif atau ditulis.

Gilles
sumber
4
Anda juga dapat menggunakan -esaklar fpm untuk mengubah file control: fpm -e -s deb -t deb ../old.deb. Ini akan membuka file kontrol di editor Anda.
Artefacto
1
btw, fakeroot bashdan mencoba mengeluarkan perintah tidak akan berhasil mengenai kepemilikan, dan armetode ini sangat cepat untuk file deb besar!
Aquarius Power
1
Terima kasih. Ini bermanfaat. Menggunakan dpkg-deb -Rmode disimpan dan dpkg-deb -breset uid:gidfile yang diekstraksi 0:0. Tidak perlu fakeroot (saya kira mungkin ada masalah jika ada set {u, g} id file di dalam arsip tapi itu tidak terjadi dalam situasi saya.
PSkocik
2
@PSkocik Bukan hanya file setxid, juga mis. File dan direktori di bawah /etcatau /varyang perlu milik grup tertentu.
Gilles
8

Anda dapat menggunakan fpm dengan --after-installopsi untuk mengganti postinstskrip, seperti ini:

fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb
Juancho
sumber
2
Untuk menginstal fpm di Debian / Ubuntu: sudo apt-get install ruby-dev build-essential; sudo gem install fpm
Craig S. Anderson