Cách tạo gói Debian

Debian Package Creation Howto



1. Lời nói đầu

Chịu trách nhiệm về máy có nghĩa là chăm sóc phần cứng cũng như các thành phần phần mềm. Như đã thấy trong cuộc sống hàng ngày với tư cách là quản trị viên hệ thống, tốt hơn hết bạn nên cài đặt phần mềm dưới dạng một gói phần mềm hơn là một loạt các tệp nguồn. Điều này làm giảm chi phí để bảo trì hệ thống đúng cách.

Các gói có sẵn từ nhà phân phối ưu tiên của bạn được xác nhận và giám sát bởi người bảo trì gói. Anh ấy đã thử nghiệm phần mềm và đảm bảo rằng nó phù hợp với các gói phần mềm khác có sẵn trong bản phân phối. Hơn nữa, gói được ký bằng khóa GPG từ người duy trì gói. Điều này đảm bảo tính toàn vẹn của gói và cho bạn thấy rằng gói đến từ một nguồn đáng tin cậy.







Định dạng gói phụ thuộc vào bản phân phối Linux của bạn. Các định dạng được chọn là những định dạng sau:



deb

Các gói được sử dụng trong: Debian GNU / Linux , Ubuntu , Tiếng Armbian , Linux Mint , Knoppix



rpm

Các gói được sử dụng trong: Mũ đỏ , Fedora , CentOS , OpenSuse





tgz and txz

Các gói được sử dụng trong: Slackware

tar.xz

Các gói được sử dụng trong: Arch Linux



Tài liệu này giải thích ngắn gọn cách xây dựng một gói cho Debian GNU / Linux. Để biết thông tin chi tiết về định dạng gói Debian và các công cụ duy trì hệ thống Linux dựa trên `deb`, bạn có thể xem trong Sách Quản lý Gói Debian [dpmb] Để xây dựng các gói cho Debian GNU / Linux, các tài liệu này rất cần thiết:

  • Hướng dẫn dành cho người bảo trì Debian mới [dnmg]
  • Tài liệu tham khảo của nhà phát triển Debian [CHDC Đức]
  • Hướng dẫn đóng gói Debian [có thể]
  • Sổ tay Chính sách Debian [dpm]

Gói chúng tôi sẽ làm việc có tên là `helloworld` và có số phiên bản 0,1. Đối với mục đích trình diễn, nó chỉ chứa một tập lệnh Python duy nhất xuất ra thông điệp nổi tiếng Xin chào, thế giới !:

#!/usr/bin/python print ('Hello, world!') 

2. Yêu cầu

2.1. Phím GPG

Như bước 1, hãy chuẩn bị sẵn khóa GPG của bạn. Sau này, chìa khóa sẽ cần thiết để ký gói. Hãy nhớ rằng các gói chưa được ký là không đáng tin cậy và không thể là một phần của vũ trụ Debian.

Trong trường hợp bạn chưa có khóa GPG, hãy tạo một khóa. Bạn có thể làm theo ba bước dưới đây. Lệnh đầu tiên tạo khóa mới, lệnh thứ hai xuất khóa mới của bạn sang một tệp riêng biệt và lệnh thứ ba thêm khóa vào khóa cá nhân của bạn.

$ gpg --gen-key $ gpg -a --output ~/.gnupg/YOUR_NAME.gpg --export 'YOUR NAME' $ gpg --import ~/.gnupg/YOUR_NAME.gpg 

Trong quá trình tạo, hãy đảm bảo rằng tên đã cho _YOUR NAME_ là chính xác. Người ta thường sử dụng kết hợp cả tên và họ. Tên này sẽ phải hoàn toàn giống nhau trong gói, sau đó, khi tạo tệp `điều khiển` của gói Debian. Để biết thêm thông tin về GPG, hãy xem Sổ tay Bảo mật GNU [gph].

2.2. Chuỗi công cụ đóng gói

Để xây dựng một gói Debian với mã nguồn, hệ thống của bạn cần có các gói phần mềm sau:

  • xây dựng-thiết yếu
  • autoconf
  • tự động hóa
  • autotools-dev
  • dh-make
  • người trợ giúp
  • devscripts
  • người giả mạo
  • xutils
  • lintian
  • người tập thể hình

Với tư cách là người dùng `root`, bạn có thể cài đặt chúng bằng lệnh sau:

# apt-get install build-essential autoconf automake autotools-dev dh-make debhelper devscripts fakeroot xutils lintian pbuilder 

2.3. Chuẩn bị phần mềm được đóng gói

Chúng ta phải chuẩn bị một thư mục để xây dựng gói. Tạo một thư mục để chuẩn bị môi trường mà chúng ta sẽ xây dựng gói:

$ mkdir -p ~./build/helloworld/0.1 

Sao chép kho lưu trữ nén `tar.gz` trong thư mục:

$ cp helloworld-0.1.tar.gz ~./build/helloworld/0.1 

Thay đổi vào thư mục và giải nén gói:

$ cd ~./build/helloworld/0.1 ~/build/helloworld/0.1$ tar -xzf helloworld-0.1.tar.gz 

Bây giờ, thư mục chứa cả mã nguồn trong một thư mục riêng biệt và kho lưu trữ nén:

~/build/helloworld/0.1$ ls helloworld-0.1 helloworld-0.1.tar.gz 

3. Debianization

Tại thời điểm này, chúng tôi sẽ thêm các tệp dành riêng cho một gói Debian. Đó là lý do tại sao bước này được đặt tên là _Debianization_ của phần mềm. Điều này được thực hiện trong một số bước đơn.

3.1 Chuẩn bị cấu trúc gói

Thay đổi thành thư mục giữ toàn bộ mã nguồn của gói. Trong ví dụ của chúng tôi, gói chứa tệp `helloworld.py`, chỉ:

~$ cd build/helloworld/0.1/helloworld-0.1 ~/build/helloworld/0.1/helloworld-0.1$ ls helloworld.py 

Hãy thêm các tệp cụ thể cho một gói Debian. Công cụ `dh_make` phát huy tác dụng. Công tắc `-e` sử dụng địa chỉ đã cho làm địa chỉ email trong trường` Bảo trì` của tệp `debian / control`. Thay vào đó, việc xây dựng gói sử dụng địa chỉ email của chính bạn. Hãy nhớ sử dụng cùng một địa chỉ email tương ứng với khóa GPG của bạn.

Chuyển đổi `-f` sử dụng tệp đã cho làm tệp lưu trữ nguồn ban đầu và bỏ qua việc sao chép cây chương trình hiện tại sang` program.orig`.

~/build/helloworld/0.1/helloworld-0.1$ dh_make -e [email protected] -f ../helloworld-0.1.tar.gz 

Tại lời nhắc, bạn sẽ được yêu cầu chọn loại gói sẽ được tạo. Để chọn _single binary_ type `s`.

Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch? [s/i/m/l/k/n] s Maintainer name : Frank Hofmann Email-Address : [email protected] Date : Sat, 04 Nov 2017 21:16:13 +0100 Package Name : helloworld Version : 0.1 License : blank Type of Package : Single Hit to confirm: Currently there is no top level Makefile. This may require additional tuning. Done. Please edit the files in the debian/ subdirectory now. You should also check that the helloworld Makefiles install into $DESTDIR and not in / . 

Điều này dẫn đến một thư mục có tên là `debian`:

~/build/helloworld/0.1/helloworld-0.1$ ls debian helloworld.py 

Thư mục này chứa tất cả các tệp dành riêng cho gói.

3.2. Điều chỉnh tệp điều khiển

Tệp `debian / control` giữ các phụ thuộc cần thiết _để build_ gói. Sử dụng lệnh `dpkg-depcheck -d. / Configure`, bạn sẽ nhận được một danh sách với tất cả các gói cần thiết. Trong trường hợp của chúng tôi, không cần thêm gói nào nữa vì Python là một ngôn ngữ thông dịch.

Tiếp theo, chúng ta phải chỉnh sửa tệp `debian / control` và thêm các giá trị dành riêng cho gói. Đối với ví dụ của chúng tôi, nó trông như sau:

Source: helloworld Section: python Priority: optional Maintainer: Frank Hofmann < [email protected] > Build-Depends: debhelper (>= 9) Standards-Version: 3.9.5 Homepage: http://www.efho.de/ #Vcs-Git: git://anonscm.debian.org/collab-maint/helloworld.git #Vcs-Browser: http://anonscm.debian.org/?p=collab-maint/helloworld.git;a=summary Package: helloworld Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, python Description: Prints Hello World in Python Prints Hello World in Python 

3.3. Điều chỉnh tệp bản quyền

Tệp `debian / copyright` chứa thông tin cấp phép cho gói phần mềm. Nó được chuẩn bị cho việc phát hành thông qua Giấy phép Công cộng GNU 2 (GPLv2). Đối với ví dụ của chúng tôi, nó trông như sau:

Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: helloworld Source: http://www.efho.de/ Files: debian/* Copyright: 2017 Frank Hofmann < [email protected] > License: GPL-2+ This package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. . This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this program. If not, see . On Debian systems, the complete text of the GNU General Public License version 2 can be found in '/usr/share/common-licenses/GPL-2'. 

3.4. Điều chỉnh tệp thay đổi

Sau khi có thông tin bản quyền, tệp `debian / changelog` phải được điều chỉnh. Trong ví dụ của chúng tôi, chúng tôi thêm thông tin Bản phát hành ban đầu.

helloworld (0.1-1) unstable; urgency=low * Initial release -- Frank Hofmann < [email protected] > Sat, 04 Nov 2017 21:16:13 +0100 

Đó là tất cả những gì chúng tôi cần cho đến nay - cuối cùng chúng tôi cũng có thể xây dựng gói.


4. Xây dựng gói

Để xây dựng gói, chúng ta phải di chuyển lên một thư mục và chạy lệnh sau:

~/build/helloworld/0.1/helloworld-0.1$ dpkg-buildpackage -rfakeroot

Tùy chọn `-rfakeroot` cho phép` dpkg-buildpackage` chạy các lệnh với tư cách là người dùng riêng với sự trợ giúp của lệnh `fakeroot`. Điều này là cần thiết để chuẩn bị gói và tạo tệp và thư mục.
Lệnh trên dẫn đến một danh sách dài hơn các thông báo đầu ra (hiển thị ở đây trong môi trường tiếng Đức):

dpkg-buildpackage: Quellpaket helloworld dpkg-buildpackage: Quellpaket helloworld dpkg-buildpackage: Quellversion 0.1-1 dpkg-buildpackage: Quelldistribution unstable dpkg-buildpackage: Quellen geändert durch Frank Hofmann < [email protected] > dpkg-buildpackage: Host-Architektur amd64 dpkg-source --before-build helloworld-0.1 fakeroot debian/rules clean dh clean dh_testdir dh_auto_clean dh_clean dpkg-source -b helloworld-0.1 dpkg-source: Information: Quellformat 3.0 (quilt) wird verwendet dpkg-source: Information: helloworld wird unter Benutzung des existierenden ./helloworld_0.1.orig.tar.gz gebaut dpkg-source: Information: helloworld wird in helloworld_0.1-1.debian.tar.xz gebaut dpkg-source: Information: helloworld wird in helloworld_0.1-1.dsc gebaut debian/rules build dh build dh_testdir dh_auto_configure dh_auto_build dh_auto_test fakeroot debian/rules binary dh binary dh_testroot dh_prep dh_auto_install dh_installdocs dh_installchangelogs dh_perl dh_link dh_compress dh_fixperms dh_strip dh_makeshlibs dh_shlibdeps dh_installdeb dh_gencontrol dpkg-gencontrol: Warnung: Feld Depends von Paket helloworld: unbekannte Substitutionsvariable ${shlibs:Depends} dh_md5sums dh_builddeb dpkg-deb: Paket helloworld wird in ../helloworld_0.1-1_amd64.deb gebaut. dpkg-genchanges <../helloworld_0.1-1_amd64.changes dpkg-genchanges: kompletter Quellcode beim Hochladen hinzufügen dpkg-source --after-build helloworld-0.1 dpkg-buildpackage: Alles hochzuladen (Originalquellen enthalten) signfile helloworld_0.1-1.dsc Sie benötigen eine Passphrase, um den geheimen Schlüssel zu entsperren. Benutzer: 'Frank Hofmann (Hofmann EDV) < [email protected] > ' 4096-Bit RSA Schlüssel, ID D431AC07, erzeugt 2014-09-05 

4.1. Xác thực gói

Xin chúc mừng - bạn đã thành công trong việc tạo gói Debian - vâng! Bây giờ, chúng ta hãy xem xét kỹ hơn gói. Đây, `lintian` phát huy tác dụng. Công cụ này xác thực gói của bạn để tìm ra các vi phạm đối với các quy tắc nghiêm ngặt mà gói Debian phải thực hiện.

Để chạy các bài kiểm tra, hãy nhập lệnh sau:

lintian helloworld_0.1-1_amd64.deb 

Công cụ này không tìm thấy lỗi vi phạm quy tắc mà còn cả lỗi chính tả, và ký tự sai. Công tắc `–pedantic` yêu cầu` lintian` quan trọng hơn nhiều so với bình thường. Như bạn có thể thấy bên dưới, `lintian` hơi khó hiểu và đã phát hiện ra ba cảnh báo và một lỗi.

Ngoại trừ cảnh báo đầu tiên, chúng tôi có thể dễ dàng làm cho `lintian` hài lòng và điều chỉnh nội dung gói theo quy tắc đã đặt. Cảnh báo `new-package-should-close-itp-bug` có nghĩa là không có báo cáo lỗi nào đối với gói ITP (ITP có nghĩa là _ liên kết với gói_). Đối với một gói Debian thông thường, một báo cáo lỗi phải được gửi tới trình kiểm tra lỗi của gói ITP để thông báo cho những người khác rằng bạn dự định bắt đầu đóng gói phần mềm này.

4.2. Cảnh báo: `readme-debian-contains-debmake-template

Tệp `README.Debian` nhằm lưu giữ các ghi chú bổ sung về gói này. `dh_make` đã tạo tệp này cho chúng tôi:

helloworld for Debian --------------------- -- Frank Hofmann < [email protected] > Sat, 04 Nov 2017 21:16:13 +0100 

Trong ví dụ của chúng tôi, chúng tôi không có thông tin bổ sung, vì vậy chúng tôi có thể xóa tệp.

4.3. Cảnh báo: `mô tả-bắt đầu-với-dấu cách hàng đầu`

Cảnh báo này được đưa ra vì mô tả dài hơn về gói của chúng tôi trong tệp `debian / control` bắt đầu với nhiều hơn một khoảng trắng. Ngay sau khi chúng tôi xóa một khoảng trắng, cảnh báo sẽ biến mất.

4.4. Lỗi: `mô tả-tóm tắt-bị trùng lặp`

Mỗi gói yêu cầu cả mô tả ngắn và dài hơn trong `debian / control`. Lỗi này được đưa ra bởi vì cả hai mô tả đều giống hệt nhau. Ngay sau khi chúng tôi mở rộng mô tả dài hơn, lỗi sẽ biến mất.


5. Liên kết và Tài liệu tham khảo

- [ddr] Andreas Barth, Adam Di Carlo, Raphaël Hertzog, Lucas Nussbaum, Christian Schwarz, Ian Jackson: Tài liệu tham khảo của nhà phát triển Debian
- [Dnmg] Josip Rodin, Osamu Aoki: Hướng dẫn dành cho người bảo trì Debian mới
- [dpmb] Axel Beckert, Frank Hofmann: Sách quản lý gói Debian
- [dpm] Sổ tay Chính sách Debian
- [có thể] Hướng dẫn đóng gói Debian
- [gph] Sổ tay Bảo mật GNU
- [LushpaiPackage] Alex Lushpai: Cách tạo gói debian từ nguồn


6. Lời cảm ơn

Tác giả xin chân thành cảm ơn Axel BeckertGerold Rupprecht cho sự ủng hộ của họ và các nhà phê bình trong khi chuẩn bị bài báo này.