Tạo tập tin deb cho ứng dụng chúng ta xây dựng

Trong bài viết này mình xin chia sẻ những kiến thức mình thu nhặt được trên internet về cách tạo 1 tập tin deb của riêng ta. Tập tin deb sẽ cài đặt dữ liệu hay ứng dụng vào máy tính.

Trước khi xây dựng một tập tin deb thì chúng ta sẽ cần có cái gì đó để khi người dùng chạy tập tin deb này thì những thứ đó sẽ được sao chép vào máy tính. Vậy mình sẽ viết 1 chương trình nhỏ trước.

Các bạn chắc cũng từng đặt câu hỏi này khi mới làm quen với Linux: Những ứng dụng được cài đặt vào máy sẽ được lưu ở đâu? Câu trả lời chung chung nhất là sẽ: rất nhiều nơi và tùy thuộc vào từng ứng dụng. Để biết một ứng dụng nào đó bạn đã cài có dữ liệu được lưu ở đâu trong máy tính thì bạn có thể xem tập tin list của ứng dụng này tại thư mục /var/lib/dpkg/info/. Ví dụ bạn muốn biết những tập tin của ứng dụng hỗ trợ download axel được lưu ở những thư mục nào thì bạn có thể dùng lệnh:

less /var/lib/dpkg/info/axel.list

Nếu bạn chưa có axel trong máy bạn có thể cài đặt nó:

sudo apt-get install axel

Trong tập tin axel.list này là danh sách các tập tin của axel sử dụng. Chúng ta có thể chốt lại các vị trí sau:

  • Thư mục /usr/bin/ sẽ là nơi lưu các tập tin khởi động ứng dụng. Khi bạn gõ “axel” và nhấn enter trong Terminal thì máy tính sẽ tìm ứng dụng tập tin “axel” trong /usr/bin để thực thi. Còn một nơi nữa để lưu các tập tin kiểu này là /usr/sbin/, tuy nhiên đây là nơi dành cho các ứng dụng quan trong của hệ thống. (“s” là “system”, “bin” là “binary”).
  • Thư mục /usr/share/ sẽ lưu các tập tin còn lại của ứng dụng.
  • /usr/share/man/: lưu nội dụng tập tin hướng dẫn, nội dung tập tin hướng dẫn chính là những gì được thể hiện khi chúng ta dùng lệnh man (ví dụ “man axel”) trong terminal. Tập tin hướng dẫn chính sẽ được lưu tại thư mục /usr/share/man/man1. Phần hướng dẫn này có thể có nhiều phiên bản ngôn ngữ, chúng sẽ được lưu với dạng /usr/share/man/ngôn-ngữ/man1/.
  • /usr/share/locale/: các ứng dụng có thể có thể được dịch sang nhiều ngôn ngữ khác nhau, những tập tin ngôn ngữ này được tại thư mục này.
  • /usr/share/doc/: nơi lưu các tài liệu liên quan như tập tin bản quyền, tập tin log, …

Bạn có thể tham khảo thêm các ứng dụng khác mà bạn đã cài đặt trên máy.

Ứng dụng nhỏ mình sắp viết đây vô cùng đơn giản, nếu bạn nào học về lập trình sẽ quá quen với ứng dụng này: xuất ra màn hình dòng chữ “Hello World!”.

Trước hết mình tạo thư mục cho ứng dụng này, hãy tạm gọi nó là ứng dụng “helloworld”:

mkdir helloworld

cd helloworld

Mình sẽ viết một tập tin đoạn shell script đơn giản để thực hiện việc này thay vì dùng C hay C++:

nano hellworld

Nội dung của hellworld:

#!/bin/bash

echo “Hello World!”;

Mình gán quyền thực thị cho tập tin helloworld này và chạy thử nó

chmod +x helloworld

./helloworld

Dòng chữ “Hello World!” được xuất ra trên terminal. Vậy là ứng dụng nhỏ của mình đã chạy tốt.

Làm sao để máy tính biết nên lưu tập tin helloworld này của mình vào thư mục /usr/bin/? Chúng ta sẽ phải tạo các thư mục này trong mã nguồn của chúng ta, khi cài đặt ứng dụng thì máy sẽ dựa vào đường dẫn này để sao chép tập tin đến đúng vị trí.

Trong thư mục helloworld chúng ta tạo thư mục usr và bin:

mkdir usr

mkdir usr/bin

hoặc chỉ đơn giản với 1 dòng lệnh

mkdir usr usr/bin

Bây giờ chúng ta di chuyển tập tin helloworld vào trong:

mv helloworld usr/bin/

Ứng dụng nhỏ này của mình sẽ chỉ có duy nhất một tập tin thực thi thôi. Nếu bạn muốn có thêm tập tin hướng dẫn hay bản dịch, các tập tin README, COPYRIGHT… các bạn có thể tham khảo mã nguồn của các ứng dụng đã có sẵn trên máy (chúng ta đang dùng phần mềm tự do mã nguồn mở mà).

Bây giờ việc tiếp theo chúng ta sẽ làm là đóng gói thư mục /usr/bin/ này lại thành một tập tin deb để khi người dùng cài đặt tập tin deb này thì trong thư mục /usr/bin/ của người dùng sẽ có tập tin helloworld mà chúng ta vừa viết, để từ đó có thể chạy ứng dụng này bằng lệnh helloworld trong terminal.

Nhưng làm sao để tạo một tập tin deb? Chúng ta hãy thử tìm hiểu xem trong tập tin deb có những gì với ví dụ là ứng dụng axel.

Chúng ta tạo thư mục “axel” và sao chép tập tin deb vào thư mục này. Bạn có thể thử tìm tập tin deb của axel trong /var/cache/apt/archives/.

mkdir axel

cd axel

cp /var/cache/apt/archives/axel_2.4-1_i386.deb .

Để xem nhanh trong tập tin deb có gì bạn có thể dùng lệnh ar:

ar -t axel_2.4-1_i386.deb

Để phân rã (extract) tập tin deb, bạn vẫn dùng lệnh ar với tùy chọn x:

ar -x axel_2.4-1_i386.deb

Vậy là trong thư mục axel của chúng ta đã có các tập tin sau:

  • debian-binary
  • control.tar.gz
  • data.tar.gz

Bạn có thể xóa tập tin deb để thư mục axel có đúng cấu trúc bên trong của tập tin deb,

rm *.deb

Chúng ta thử xem nội dung của tập tin debian-binary trước:

less debian-binary

Terminal trả về “2.0”. Con số này là gì? Đó chính là phiên bản hện tại của định dạng tập tin deb.

Tiếp theo chúng ta xem thử trong 2 tập tin control.tar.gz và data.tar.gz có gì:

tar -tzf control.tar.gz

3 tập tin này dùng để làm gì nhỉ? Hãy thử extract tập tin control.tar.gz này để xem nội dung của chúng.

tar -xzf control.tar.gz

Chúng ta xem thử nội dung của conffiles:

less conffiles

Nó chưa một đường dẫn: /etc/axelrc. Vậy chúng xem tập tin axelrc này có nội dung gì:

less /etc/axelrc

À, ra đây là tập tin cấu hình mẫu của axel, chúng ta có thể dựa vào tập tin này để chỉnh sửa lại cấu hình mặc định của axel. Trong trường hợp ứng dụng helloworld của chúng ta thì có thể không quan tâm đến tập tin này.

Bây giờ chúng ta tham khảo thử tập tin control

less control

Chắc các bạn cũng đoán ra đây là tập tin lưu trữ các thông tin của gói như tên, phiên bản, ai là người bảo trì, thích hợp với kiến trúc máy tính nào, phụ thuộc vào các gói nào khác, vân vân. Đây là một tập tin quan trọng, nếu thiếu nó bạn sẽ không đóng gói được ứng dụng của mình.

Chúng ta xem tập tin còn lại:

less md5sums

Chẳng có gì phải nghi ngờ, đây là tập tin lưu trữ checksum của các tập tin trong gói, trong trường hợp của chúng ta thì tập tin này không cần thiết.

Giờ chúng ta thử xem tập tin data.tar.gz:

tar -tzf data.tar.gz

Đây chính là tập tin chứa mã nguồn của ứng dụng chúng ta.

Nếu bạn muốn bạn có thể phân rã để xem chi tiết

tar -xzvf data.tar.gz

Vậy là chúng ta đã biết được cấu trúc của 1 tập tin deb như thế nào. Tuy nhiên chúng ta không bắt chước bằng cách tạo các tập tin control.tar.gz và data.tar.gz.

Bây giờ chúng ta trở về thư mục helloworld và xóa thư mục axel:

cd ..

rm -rf axel

Trong thư mục helloworld bây giờ chỉ còn thư mục usr, chúng ta sẽ để nó ở đó. Bây giờ chúng ta tạo thư mục DEBIAN và tạo tập tin quan trọng nhất là control trong thư mục này

mkdir DEBIAN

nano DEBIAN/control

Phía trên chúng ta đã xem qua 1 tập tin control, nhưng làm sao soạn một tập tin control theo đúng quy tắc? Bạn có thể thực thi lệnh “man 5 deb-control” để được giải thích về các thông tin trong tập tin control.

Có 4 giá trị bắt buộc là Package, Version, Maintainer, Description. Tuy nhiên các bạn hãy thử mở 1 tập tin deb và xem thẻ Details, bạn sẽ thấy có thêm 3 dòng Section, Installed-Size và Priority, chúng ta sẽ điền thêm 3 dòng này nữa. Hiện tại Debian phân loại các sections sau: admin, cli-mono, comm, database, devel, debug, doc, editors, electronics, embedded, fonts, games, gnome, graphics, gnu-r, gnustep, hamradio, haskell, httpd, interpreters, java, kde, kernel, libs, libdevel, lisp, localization, mail, math, misc, net, news, ocaml, oldlibs, otherosfs, perl, php, python, ruby, science, shells, sound, tex, text, utils, vcs, video, web, x11, xfce, zope. Mình sẽ chọn shell cho ứng dụng helloworld này, bạn chọn sai section cũng không sao vì ứng dụng helloworld của chúng ta quá đơn giản và vô hại với hệ thống.

Về version của ứng dụng, mình sẽ cho ứng dụng này là phiên bản 1.0. Việc quy định số phiên bản của các gói sẽ khác phức tạp và dài dòng để giải thích. Nếu bạn muốn upload gói của mình lên kho phần mềm của Debian để mọi người sử dụng thì bạn phải thêm vào sau version của mình phiên bản hiệu chỉnh của Debian và 2 giá trị này cách nhau bằng dấu “-”, ví dụ helloworld-1.0-0. Với gói Debian này bạn muốn đưa qua kho của Ubuntu để người dùng Ubuntu sử dụng thì bạn phải thêm vào phiên bản hiệu chỉnh của Ubuntu ngay sau số hiệu chỉnh của Debian, ví dụ helloworld-1.0-0ubuntu1. Giá trị 0 có nghĩa là gói này chưa có trong kho, 1 là đã có trong kho, khi có một số cập nhật thì 1 sẽ được tăng lên dần. Trong ví dụ này của mình sẽ chọn version là 1.0-0ubuntu1, có nghĩa là helloworld chưa có trong kho debian nhưng đã có trong ubuntu (chỉ là ví dụ thôi nhé chứ không có trong kho thật :D).

Và đây là nội dung tập tin control của mình:

Package: helloworld
Version: 1.0-0ubuntu1
Section: shell
Priority: extra
Architecture: all
Depends:
Installed-Size: 24
Maintainer: Duy Hung Tran <nguyentieuhau@gmail.com>
Description: A simple “Hello World!” application
A simple application echoing “Hello World!” in terminal.

Architecture mình chọn là “all”, có nghĩa là ứng dụng này hoạt động được trên tất cả các kiến trúc phần cứng nào (i386, amd64, …). Depends thì mình không điền gì là vì Bash Shell luôn luôn có mặt trong các bản phân phối Linux. Những phần còn lại bạn có thể tham khảo trong manual của deb-control.

Và bây giờ là phần quan trọng và thú vị nhất: tạo tập tin deb.

Bạn trở về thư mục home (thư mục cha của thư mục helloworld):

cd ..

Bạn chỉ đơn giản dùng dpkg-deb để tạp tập tin deb:

dpkg-deb –build helloworld (phía trước build là 2 dấu “-“)

Nếu thành công, terminal sẽ hiện:

dpkg-deb: building package `helloworld’ in `helloworld.deb’.

Vậy là dpkg-deb đã tạo tập tin helloworld.deb trong thư mục home của bạn. Hãy đổi tên nó lại cho trông chuyên nghiệp tí:

mv helloworld.deb helloworld-1.0-0ubuntu1.deb

Hãy thử mở tập tin này ở giao diện đồ họa thay vì trong terminal, bạn có thể thấy các thông tin chúng ta đã khai báo trong tập tin control, tập tin nào sẽ được sao chép vào máy, …



Chúng ta cài đặt tập tin deb này, sau đó vào terminal, gõ “helloworld” và enter:

Nó chạy rồi! Thật tuyệt phải không nào!

Đây là cách đơn giản nhất để tạo 1 tập tin deb để cài đặt ứng dụng bạn xây dựng hay sao chép bất cứ dữ liệu gì vào máy tính.

Có nhiều cách để phát triển ứng dụng, đóng gói ứng dụng, những gì mình giới thiệu ở trên còn rất nhiều điểm chưa hoàn thiện và thiếu chuyên nghiệp. Nếu bạn muốn ứng dụng của mình có thể có mặt trên kho phần mềm của Debian hay Ubuntu bạn cần phải tuân thủ nhiều quy tắc khác. Bạn có thể tham khảo qua các liên kết sau:

Hy vọng bài viết này sẽ giúp các bạn hiểu thêm về việc phát triển và đóng gói ứng dụng trong Debian hay Ubuntu. Nếu bạn thấy hứng thứ thú bạn hãy thử trở thành một Maintainer xem:

This entry was posted in Linux and tagged , . Bookmark the permalink.

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s