dpkg: tập lệnh cài đặt sẵn mới trả về trạng thái thoát lỗi 1


9

Tôi đã kết thúc việc xử lý một phần mềm có nghĩa là được triển khai bằng dpkg. Gói .deb hoạt động tốt trên env thử nghiệm nhưng thất bại trong việc dàn dựng. Cả hai đều chạy cùng một phiên bản Ubuntu nhưng tôi không chắc chắn 100% về các cấu hình còn lại. Làm thế nào để gỡ lỗi vấn đề dpkg này hơn nữa?

Việc cài đặt thất bại như thế này:

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

Câu hỏi này cũng hữu ích nếu bạn gặp phải lỗi này trong khi sử dụng apt-get vì apt-get đang gọi dpkg bên dưới. Nhìn vào đầu ra cho gói .deb có liên quan có thể nằm dưới / var / cache / apt / archives.
e18r

Câu trả lời:


11

Kịch bản .preinst của gói bị lỗi vì một số lý do.

Để tìm hiểu lý do tại sao, kiểm tra tập lệnh trong /var/lib/dpkg/info/PACKAGENAME.preinst

Nếu bạn muốn xem chính xác dòng kịch bản nào bị lỗi, hãy chỉnh sửa tập lệnh .preinst và thêm set -xngay sau #!dòng. Điều này bật theo dõi thực hiện trong kịch bản.

LƯU Ý: Điều này giả định rằng tập lệnh .preinst là tập lệnh shell (hoặc posix sh hoặc bash). Hầu như tất cả các tập lệnh .preinst (và .postinst, .prerm và .postrm) là các tập lệnh shell nhưng chúng không phải là, chúng có thể được thực thi. vd 9041 là tập lệnh shell POSIX, 63 tập lệnh bash. Nếu .preinst là perl hoặc python hoặc thứ gì khác, bạn sẽ phải tìm ra cách bật gỡ lỗi hoặc thực thi chế độ theo dõi hoặc tương tự trong ngôn ngữ đó.

Sau đó chạy dpkg --configure --pending.

Điều này sẽ khiến dpkg cố gắng định cấu hình gói cài đặt một nửa. KHÔNG cài đặt lại nó với dpkg -i, nó sẽ ghi đè lên tập lệnh .preinst đã chỉnh sửa của bạn với phiên bản trong gói .deb.

Điều này có thể cung cấp cho bạn đủ thông tin để khắc phục vấn đề. Nó có thể là một cái gì đó đơn giản như mã thoát bất ngờ hoặc chưa được mã hóa từ một chương trình (hầu hết các tập lệnh .preinst, v.v. set -e, để làm cho chúng chấm dứt ở lỗi đầu tiên) hoặc giả sử rằng một thư mục đã tồn tại (và điều này có thể là do sự phụ thuộc không được khai báo trong tệp debian / control của gói - nghĩa là nó phải phụ thuộc vào foo nhưng không. Chỉ cần cài đặt foo)

Khi đã sửa xong, hãy chạy dpkg --configure --pendinglại và gói phải được cài đặt đúng cách.

Nếu tập lệnh .preinst bị lỗi, có khả năng hợp lý rằng tập lệnh .postinst (và / hoặc .prerm và .postrm) cũng sẽ như vậy. Bạn có thể cần phải sửa chúng là tốt.

Đừng quên gửi báo cáo lỗi cho bất kỳ ai thực hiện gói để họ có thể sửa nó.


7

Phần mềm đóng gói của bạn bao gồm "tập lệnh cài đặt sẵn" (trước) không thành công. Đây là một tập lệnh shell được nhúng trong tệp .deb. Bạn có thể giải nén nó bằng:

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

Sau đó, bạn có thể nhìn vào out-dir/preinstvà xem nếu bạn có thể tìm ra lý do tại sao nó thất bại.

Nếu bạn muốn sửa đổi tập lệnh đó và xây dựng lại .deb(có lẽ để thêm một số mã gỡ lỗi), hãy thử

 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

2

Bạn sẽ cần giải nén tập tin và xem tại sao preinsttập lệnh thoát với mã 1.

Không chắc chắn nếu có một cuộc thảo luận về UNIX.SE liên quan đến cách thực hiện việc này nhưng bạn có thể xem câu hỏi này từ AskUbfox để có ý tưởng về cách giải nén.

Sau này, bạn sẽ phải tự chạy preinsttập lệnh để xem tại sao cài đặt gói không thành công.


1

Nếu bạn muốn chỉnh sửa gói trực tiếp, hãy thử điều này:

#!/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"

Nguồn: http://ubuntuforums.org/showthread.php?t=636724


Có vẻ như tập lệnh này đã được viết để sửa đổi controltệp (và xây dựng lại gói), chứ không phải preinsttập lệnh theo vấn đề của OP.
thân
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.