dpkg: skrip pra-instalasi baru mengembalikan status keluar kesalahan 1

9

Saya akhirnya berurusan dengan perangkat lunak yang dimaksudkan untuk digunakan menggunakan dpkg. Paket deb. Bekerja dengan baik pada tes env tetapi gagal pada pementasan. Keduanya menjalankan versi yang sama dari Ubuntu tetapi saya tidak 100% yakin dari sisa konfigurasi. Bagaimana cara men-debug masalah dpkg ini lebih lanjut?

Instalasi gagal seperti ini:

sudo dpkg -i --debug=7337 package.deb 
D000010: ensure_pathname_nonexisting `/var/lib/dpkg/tmp.ci'
(Reading database ... 201812 files and directories currently installed.)
Unpacking myProprietarySoftware (from package.deb) ...
D000001: process_archive oldversionstatus=not installed
D000002: fork/exec /var/lib/dpkg/tmp.ci/preinst ( install )
dpkg: error processing package.deb (--install):
 subprocess new pre-installation script returned error exit status 1
D000002: maintainer_script_new nonexistent postrm `/var/lib/dpkg/tmp.ci/postrm'
D000010: ensure_pathname_nonexisting `/var/lib/dpkg/tmp.ci'
D000010: ensure_pathname_nonexisting running rm -rf
D000010: ensure_pathname_nonexisting `/var/lib/dpkg/reassemble.deb'
Errors were encountered while processing:
 package.deb
Petteri Hietavirta
sumber
Pertanyaan ini juga berguna jika Anda menghadapi kesalahan ini saat menggunakan apt-get karena apt-get memanggil dpkg di bawahnya. Lihat di output untuk paket deb yang terlibat yang mungkin akan berada di bawah / var / cache / apt / arsip.
e18r

Jawaban:

11

Skrip .preinst paket gagal karena beberapa alasan.

Untuk mengetahui alasannya, periksa skrip di /var/lib/dpkg/info/PACKAGENAME.preinst

Jika Anda ingin melihat secara tepat pada baris mana script gagal, edit skrip .preinst dan tambahkan set -xsegera setelah #!baris. Ini mengaktifkan penelusuran penelusuran di skrip.

CATATAN: Ini mengasumsikan bahwa skrip .preinst adalah skrip shell (baik posix sh atau bash). Hampir semua skrip .preinst (dan .postinst, .prerm, dan .postrm) adalah skrip shell tetapi tidak harus, skrip tersebut dapat dieksekusi. mis. pada mesin desktop utama saya dengan 9104 paket yang diinstal, 14 adalah skrip perl, 1 adalah executable yang dikompilasi (bash's preinst - tidak dapat mengasumsikan ada shell yang berfungsi sudah diinstal), dan semua sisanya adalah skrip shell ... 9041 adalah skrip POSIX shell, 63 adalah skrip bash. Jika .preinst adalah perl atau python atau yang lainnya, Anda harus mencari cara untuk mengaktifkan mode penelusuran debug atau eksekusi atau serupa dalam bahasa itu.

Kemudian jalankan dpkg --configure --pending.

Ini akan menyebabkan dpkg mencoba mengkonfigurasi paket yang setengah terinstal. JANGAN instal ulang dengan dpkg -i, yang akan menimpa skrip .preinst Anda yang telah diedit dengan versi dalam paket .deb.

Ini mungkin memberi Anda informasi yang cukup untuk memperbaiki masalah. Ini mungkin sesuatu yang sederhana seperti kode keluar yang tidak terduga atau tidak tertangkap dari suatu program (kebanyakan skrip .preinst dll set -e, untuk membuatnya berakhir pada kesalahan pertama), atau dengan asumsi bahwa direktori sudah ada (dan ini mungkin karena ketergantungan yang tidak dideklarasikan dalam file debian / control paket - artinya harus bergantung pada foo tetapi tidak menginstal saja foo)

Setelah diperbaiki, jalankan dpkg --configure --pendinglagi, dan paket harus diinstal dengan benar.

Jika skrip .preinst bermasalah, ada kemungkinan masuk akal bahwa skrip .postinst (dan / atau .prerm dan .postrm) juga. Anda mungkin perlu memperbaikinya juga.

Jangan lupa untuk mengirimkan laporan bug kepada siapa pun yang membuat paket sehingga mereka dapat memperbaikinya.

cas
sumber
7

Perangkat lunak Anda yang dikemas menyertakan "skrip pra-instalasi" (pra-instal) yang gagal. Ini adalah skrip shell yang tertanam dalam file deb. Anda dapat mengekstraknya dengan:

 dpkg-deb -e some-deb.deb out-dir

Kemudian Anda dapat melihat out-dir/preinstdan melihat apakah Anda dapat mengetahui mengapa itu gagal.

Jika Anda ingin memodifikasi skrip itu dan membangun kembali .deb(mungkin untuk menambahkan beberapa kode debug), coba

 dpkg-deb -x some-deb.deb another-out-dir
 dpkg-deb -e some-deb.deb another-out-dir/DEBIAN
 (modify another-out-dir/DEBIAN/preinst)
 dpkg-deb -b another-out-dir some-deb2.deb
jmtd
sumber
2

Anda perlu mengekstrak file dan melihat mengapa preinstskrip keluar dengan kode 1.

Tidak yakin apakah ada diskusi tentang UNIX.SE terkait dengan cara melakukan ini, tetapi Anda dapat melihat pertanyaan ini dari AskUbuntu untuk mendapatkan ide tentang cara mengekstrak.

Setelah ini, Anda harus menjalankan preinstskrip secara manual untuk melihat mengapa instalasi paket gagal.

Karlson
sumber
1

Jika Anda ingin mengedit paket langsung coba ini:

#!/bin/bash

if [[ -z "$1" ]]; then
  echo "Syntax: $0 debfile"
  exit 1
fi

DEBFILE="$1"
TMPDIR=`mktemp -d /tmp/deb.XXXXXXXXXX` || exit 1
OUTPUT=`basename "$DEBFILE" .deb`.modfied.deb

if [[ -e "$OUTPUT" ]]; then
  echo "$OUTPUT exists."
  rm -r "$TMPDIR"
  exit 1
fi

dpkg-deb -x "$DEBFILE" "$TMPDIR"
dpkg-deb --control "$DEBFILE" "$TMPDIR"/DEBIAN

if [[ ! -e "$TMPDIR"/DEBIAN/control ]]; then
  echo DEBIAN/control not found.

  rm -r "$TMPDIR"
  exit 1
fi

CONTROL="$TMPDIR"/DEBIAN/control

MOD=`stat -c "%y" "$CONTROL"`
vi "$CONTROL"

if [[ "$MOD" == `stat -c "%y" "$CONTROL"` ]]; then
  echo Not modfied.
else
  echo Building new deb...
  dpkg -b "$TMPDIR" "$OUTPUT"
fi

rm -r "$TMPDIR"

Sumber: http://ubuntuforums.org/showthread.php?t=636724

Glenn Plas
sumber
Sepertinya skrip ini ditulis untuk memodifikasi controlfile (dan membangun kembali paket), bukan preinstskrip per masalah OP.
arielf