Dễ dàng giải nén DEB, chỉnh sửa postinst và đóng gói lại DEB


129

Tôi đang cố gắng cài đặt SDK OpenCL của Intel nhưng các tệp DEB bị lỗi chuyển đổi từ RPM (xem tại đây để biết sự tò mò). Tôi cần chỉnh sửa postinsttập lệnh trong DEB mà họ cung cấp.

Làm cách nào tôi có thể lấy DEB hiện có, trích xuất nội dung (bao gồm thông tin kiểm soát), sau đó đóng gói lại nội dung để tạo DEB mới? Tôi sẽ chỉ chỉnh sửa các tập tin, không có tập tin sẽ được thêm hoặc xóa.

Câu trả lời:


202

Lệnh chính để thao tác các gói deb là dpkg-deb.

Để giải nén gói, tạo một thư mục trống và chuyển sang gói đó, sau đó chạy dpkg-debđể trích xuất thông tin điều khiển của nó và các tệp gói. Sử dụng dpkg-deb -bđể xây dựng lại gói.

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

Xin lưu ý rằng trừ khi tập lệnh của bạn đang chạy bằng root, quyền và quyền sở hữu của tệp sẽ bị hỏng ở giai đoạn trích xuất. Một cách để tránh điều này là chạy tập lệnh của bạn theo fakeroot. Lưu ý rằng bạn cần chạy toàn bộ chuỗi bên dưới fakeroot, không phải từng chuỗi dpkg-debriêng lẻ, vì đó là fakerootquá trình giữ bộ nhớ cho phép của các tệp không thể được tạo như hiện tại.

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

Thay vì lộn xộn với các quyền, bạn có thể giữ nguyên kho lưu trữ dữ liệu và chỉ sửa đổi kho lưu trữ kiểm soát. dpkg-debkhông cung cấp một cách để làm điều đó. May mắn thay, các gói deb có định dạng chuẩn: chúng là artài liệu lưu trữ. Vì vậy, bạn có thể sử dụng arđể trích xuất kho lưu trữ điều khiển, sửa đổi các tệp của nó và sử dụng arlại để thay thế kho lưu trữ điều khiển bằng một phiên bản mới.

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

Bạn nên thêm một mục thay đổi và thay đổi số phiên bản nếu bạn sửa đổi bất cứ điều gì trong gói. Cơ sở hạ tầng để thao tác các gói Debian giả định rằng nếu hai gói có cùng tên và phiên bản thì chúng là cùng một gói. Thêm một hậu tố vào phần debian numvision ở cuối số phiên bản; để sắp xếp các lý do hậu tố nên bắt đầu bằng ~, ví dụ như 1.2.3-4.1trở thành 1.2.3-4.1~johnjumper1.

Thay vì sử dụng các công cụ shell, bạn có thể sử dụng Emacs. Các dpkg-dev-elgói (đó là thượng nguồn riêng của mình vì đây là một gói phần mềm Debian mẹ đẻ) chứa các chế độ chỉnh sửa .debtập tin và chỉnh sửa ghi thay đổi Debian. Emacs có thể được sử dụng tương tác hoặc kịch bản.


4
Bạn cũng có thể sử dụng công -etắc của fpm để thay đổi tệp điều khiển : fpm -e -s deb -t deb ../old.deb. Điều này sẽ mở tập tin điều khiển trong trình soạn thảo của bạn.
Artefacto

1
btw fakeroot bashvà cố gắng đưa ra các lệnh sẽ không hoạt động liên quan đến quyền sở hữu và arphương pháp này cực kỳ nhanh đối với các tệp deb lớn!
Sức mạnh Bảo Bình

1
Cảm ơn. Điều này rất hữu ích. Sử dụng dpkg-deb -Rcác chế độ được giữ và dpkg-deb -bđặt lại các uid:gidtệp được giải nén thành 0:0. Không cần fakeroot (Tôi tưởng tượng có thể có vấn đề nếu có tập tin id {u, g} trong kho lưu trữ nhưng đó không phải là trường hợp của tôi.
PSkocik

2
@PSkocik Không chỉ các tập tin setxid, ví dụ như các tập tin và thư mục theo /etchoặc /varcần phải thuộc về một nhóm cụ thể.
Gilles

8

Bạn có thể sử dụng fpm với --after-installtùy chọn để thay thế postinsttập lệnh, như thế này:

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

2
Để cài đặt fpm trên Debian / Ubuntu: sudo apt-get install ruby-dev build-Essential; sudo gem cài đặt fpm
Craig S. Anderson
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.