Create a Standard Debian package for free-ram program that compatible with systemd

اهداف

  • free-ram یک برنامه است که توسط systemd هر یک دقیقه اجرا می‌شود.
  • در این آموزش قصد داریم این برنامه را بسته بندی کنیم طوری که توسط systemd قابل فهم باشد.

پیش‌نیازها

  • برای این منظور ابتدا یک سیستم ubuntu 16.04 ساخته و آن را آپدیت نمایید.
  • بسته‌های زیر را نصب نمایید :
# apt-get install build-essential devscripts dh-make dh-systemd tree mc

ساخت دایکتوری برنامه

  • یک دایرکتوری با هر نام ایجاد کنید. به عنوان مثال :
# mkdir -p /root/debs/
  • یک دایرکتوری با نام برنامه ایجاد کنید. (به فرمت ساخت توجه نمایید.)
# mkdir -p /root/debs/free-ram-1.0.0/
  • وارد دایرکتوری زیر شوید :
# cd /root/debs/

دریافت سورس برنامه

  • سورس برنامه را از مخزن دریافت نمایید.
root@ubuntu16:~/debs# git clone -b systemd https://github.com/e2ma3n/free-ram

ساخت دایکتوری debian و متعلقات

  • حال وارد دایکتوری بسته‌بندی برنامه شوید.
root@ubuntu16:~/debs/free-ram# cd ../free-ram-1.0.0/
  • دستور زیر را اجرا نمایید :
root@ubuntu16:~/debs/free-ram-1.0.0# dh_make --createorig -l
Email-Address : root@unknown
License : blank
Package Name : free-ram
Maintainer Name : root
Version : 1.0.0
Package Type : library
Date : Mon, 05 Oct 2020 09:03:43 -0400
Are the details correct? [Y/n/q]
Skipping creating ../free-ram_1.0.0.orig.tar.xz because it already exists
Currently there is not top level Makefile. This mayrequire additional tuning
Done. Please edit the files in the debian/ subdirectory now.


Make sure you edit debian/control and change the Package: lines from
free-ramBROKEN to something else, such as free-ram1
  • با اجرای دستور بالا یک دایکتوری به نام debian همراه با نمونه پرونده‌های مورد نیاز ساخته می‌شود.
root@ubuntu16:~/debs/free-ram-1.0.0# tree -ha
.
└── [4.0K] debian
├── [ 177] changelog
├── [ 2] compat
├── [ 725] control
├── [1.6K] copyright
├── [ 8] free-ram1.dirs
├── [ 20] free-ram1.install
├── [ 134] free-ram.cron.d.ex
├── [ 238] free-ram.default.ex
├── [ 20] free-ram-dev.dirs
├── [ 76] free-ram-dev.install
├── [ 526] free-ram.doc-base.EX
├── [ 28] free-ram-docs.docs
├── [ 918] init.d.ex
├── [1.6K] manpage.1.ex
├── [4.5K] manpage.sgml.ex
├── [ 11K] manpage.xml.ex
├── [ 129] menu.ex
├── [ 959] postinst.ex
├── [ 932] postrm.ex
├── [ 692] preinst.ex
├── [ 879] prerm.ex
├── [ 166] README.Debian
├── [ 251] README.source
├── [ 678] rules
├── [ 64] shlibs.local.ex
├── [4.0K] source
│   └── [ 12] format
└── [1.1K] watch.ex

2 directories, 27 files
  • همچنین یک پرونده با نام orig از برنامه نیز ساخته می‌شود.
root@ubuntu16:~/debs/free-ram-1.0.0# ls ../
free-ram free-ram-1.0.0 free-ram_1.0.0.orig.tar.xz

حذف پرونده‌های زائد

  • در ادامه وارد دایرکتوری debian شوید.
root@ubuntu16:~/debs/free-ram-1.0.0# cd debian/
  • پیشنهاد می‌شود پرونده‌های زیر را پاک نمایید :
root@ubuntu16:~/debs/free-ram-1.0.0/debian# rm *.ex ; rm *.EX
root@ubuntu16:~/debs/free-ram-1.0.0/debian# rm free-ram1.dirs
root@ubuntu16:~/debs/free-ram-1.0.0/debian# rm free-ram-dev.dirs
root@ubuntu16:~/debs/free-ram-1.0.0/debian# rm free-ram-docs.docs
root@ubuntu16:~/debs/free-ram-1.0.0/debian# rm free-ram-dev.install
root@ubuntu16:~/debs/free-ram-1.0.0/debian# rm README.Debian README.source

اصلاح پرونده‌ی changelog

  • پرونده‌ی changelog را باز کنید و آن را به صورت زیر ویرایش نمایید.
root@ubuntu16:~/debs/free-ram-1.0.0/debian# vim changelog
  • نسخه‌ی خام پرونده‌ی بالا به صورت زیر است :
free-ram (1.0.0-1) unstable; urgency=medium

* Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP>

-- root <root@unknown> Mon, 05 Oct 2020 09:03:43 -0400
  • آن را به صورت زیر ورایش نمایید :
free-ram (1.0.0-1) xenial; urgency=medium

* Initial release (Closes: #1234)

-- Iman Homayouni <homayouni.iman@gmail.com> Mon, 05 Oct 2020 09:03:43 -0400

اصلاح پرونده‌ی compat

  • مقدار عدد ۴ را برای پرونده‌ی compat در نظر بگیرید. برای این منظور :
root@ubuntu16:~/debs/free-ram-1.0.0/debian# echo 4 > compat

اصلاح پرونده‌ی control

  • در ادامه پرونده‌ی control را باز نمایید.
root@ubuntu16:~/debs/free-ram-1.0.0/debian# vim control
  • محتویات پیشفرض این پرونده به شرح زیر است :
Source: free-ram
Priority: optional
Maintainer: Iman Homayouni <homayouni.iman@gmail.com>
Build-Depends: debhelper (>=9), dh-systemd
Standards-Version: 3.9.6
Section: net
Homepage: http://github.com/e2ma3n/free-ram

Package: free-ram
Architecture: all
Depends: ${misc:Depends}
Description: refresh memory every 1 minute
echo 3 > /proc/sys/vm/drop_caches every 1 minute
  • محتویات زیر را برای این برنامه در نظر بگیرید :
Source: free-ram
Priority: optional
Maintainer: Iman Homayouni <homayouni.iman@gmail.com>
Build-Depends: debhelper (>=9), dh-systemd
Standards-Version: 3.9.6
Section: net
Homepage: http://github.com/e2ma3n/free-ram

Package: free-ram
Section: net
Architecture: any
Depends: free-ramBROKEN (= ${binary:Version}), ${misc:Depends}
Description: <insert up to 60 chars description>
<insert long description, indented with spaces>

Package: free-ram
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: refresh memory every 1 minute
echo 3 > /proc/sys/vm/drop_caches every 1 minute

اصلاح پرونده‌ی copyright

  • پرونده‌ی copyright کاملا شخصی است. می‌توانید آن را به صورت یک تک ویرایش نمایید.
root@ubuntu16:~/debs/free-ram-1.0.0/debian# echo 'Copyright: 2016-2019 (c) ...' > copyright

اصلاح پرونده‌ی install.

  • وارد دایرکتوری /root/debs/ شوید.
root@ubuntu16:~/debs/free-ram-1.0.0/debian# cd /root/debs/
  • دایکتوری زیر را ایجاد کنید.
root@ubuntu16:~/debs# mkdir -p free-ram-1.0.0/usr/bin/
  • پرونده‌ی free-ram.sh را درون دایرکتوری زیر کپی کنید :
root@ubuntu16:~/debs# cp free-ram/free-ram.sh free-ram-1.0.0/usr/bin/free-ram
  • پرونده‌ی free-ram.service را درون دایکتوری debian قرار دهید.
root@ubuntu16:~/debs# cp free-ram/free-ram.service free-ram-1.0.0/debian/
  • به دایکتوری debian برگردید.
root@ubuntu16:~/debs# cd free-ram-1.0.0/debian/
  • پرونده‌ی free-ram1.install را به free-ram.install تغییر دهید.
  • محتویات پیشفرض پرونده‌ی free-ram.install به صورت زیر است :
usr/lib/*/lib*.so.*
  • آن را به شکل زیر ویرایش کنید.
usr/bin/free-ram usr/bin/

اصلاح پرونده‌ی rules

  • پرونده‌ی rules را باز کنید.
root@ubuntu16:~/debs/free-ram-1.0.0/debian# vim rules
  • محتویات پیشفرض این پرونده به شرح زیر است :
#!/usr/bin/make -f
# See debhelper(7) (uncomment to enable)
# output every command that modifies files on the build system.
#export DH_VERBOSE = 1


# see FEATURE AREAS in dpkg-buildflags(1)
#export DEB_BUILD_MAINT_OPTIONS = hardening=+all

# see ENVIRONMENT in dpkg-buildflags(1)
# package maintainers to append CFLAGS
#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
# package maintainers to append LDFLAGS
#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed


%:
        dh $@


# dh_make generated override targets
# This is example for Cmake (See https://bugs.debian.org/641051 )
#override_dh_auto_configure:
# dh_auto_configure -- # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH)
  • آز آنجایی که قصد استفاده از systemd را داریم، لذا پرونده‌ی rules را به شکل زیر ویرایش کنید :
#!/usr/bin/make -f
# See debhelper(7) (uncomment to enable)
# output every command that modifies files on the build system.
#export DH_VERBOSE = 1


# see FEATURE AREAS in dpkg-buildflags(1)
#export DEB_BUILD_MAINT_OPTIONS = hardening=+all

# see ENVIRONMENT in dpkg-buildflags(1)
# package maintainers to append CFLAGS
#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
# package maintainers to append LDFLAGS
#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed


%:
        dh $@ --with=systemd


# dh_make generated override targets
# This is example for Cmake (See https://bugs.debian.org/641051 )
#override_dh_auto_configure:
# dh_auto_configure -- # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH)

اصلاح پرونده‌ی source/format

  • در ادامه پرونده‌ی format را باز نمایید.
root@ubuntu16:~/debs/free-ram-1.0.0/debian# vim source/format
  • محتویات پیش‌فرض این فایل (ممکن است) به صورت زیر باشد :
3.0 (quilt)
  • محتویات زیر را برای پرونده‌ی format در نظر بگیرید :
3.0 (native)
  • دلیل این تغییر را در این می‌توان دانست که این بسته‌بندی تنها حاوی یک اسکریپت ساده بوده که توسط خود شخص بسته بند برنامه نویسی شده است.
  • لازم به ذکر است که در این حالت نیازی به پرونده‌ی tar مربوط به سورس برنامه نیست.
  • به طور کلی زمانی از native استفاده می‌شود که توسعه‌ی سورس توسط خود بسته‌بند صورت گرفته باشد فلذا تغییرات درون سورس (آپدیت و …) نیز درون سورس اصلی صورت گرفته و دیگر نیاز به patch و استفاده از دایکتوری patch نیست.
  • زمانی از quilt استفاده می‌شود که توسعه سورس توسط خود بسته‌بند صورت نگرفته باشد. فلذا در این حالت نیاز به پرونده‌ی tar سورس اصلی در روند بسته‌بندی است. همچنین در این حالت اگر قصد تغییراتی در سورس را دارید، باید آن را در قالب patch درون دایکتوری patch اعمال نمایید.
In the debian/source/format file, there should be a single line indicating the desired format for the source package (check dpkg-source(1) for an exhaustive list). After squeeze, it should say either:

  3.0 (native) for native Debian packages or
  3.0 (quilt) for everything else.

The newer 3.0 (quilt) source format records modifications in a quilt patch series within debian/patches. Those changes are then automatically applied during extraction of the source package. The Debian modifications are simply stored in a debian.tar.gz archive containing all files under the debian directory. This new format supports inclusion of binary files such as PNG icons by the package maintainer without requiring tricks. [60]

When dpkg-source extracts a source package in 3.0 (quilt) source format, it automatically applies all patches listed in debian/patches/series. You can avoid applying patches at the end of the extraction with the --skip-patches option.

شروع بسته‌بندی

  • برای این منظور یک دایکتوری عقب بیایید.
root@ubuntu16:~/debs/free-ram-1.0.0/debian# cd ..
  • دستور زیر را برای بسته‌بندی اجرا نمایید :
root@ubuntu16:~/debs/free-ram-1.0.0# dpkg-buildpackage
  • در صورتی که اجرا به صورت موفقیت آمیز طی شده باشد. با خروجی‌ای مشابه زیر روبه‌رو خواهید شد.
root@ubuntu16:~/debs/free-ram-1.0.0# dpkg-buildpackage 
dpkg-buildpackage: source package free-ram
dpkg-buildpackage: source version 1.0.0-1
dpkg-buildpackage: source distribution xenial
dpkg-buildpackage: source changed by Iman Homayouni <homayouni.iman@gmail.com>
dpkg-buildpackage: host architecture amd64
dpkg-source --before-build free-ram-1.0.0
debian/rules clean
dh clean --with=systemd
dh: Compatibility levels before 5 are deprecated (level 4 in use)
dh_testdir
dh_auto_clean
dh_auto_clean: Compatibility levels before 5 are deprecated (level 4 in use)
dh_clean
dh_clean: Compatibility levels before 5 are deprecated (level 4 in use)
dpkg-source -b free-ram-1.0.0
dpkg-source: warning: native package version may not have a revision
dpkg-source: info: using source format '3.0 (native)'
dpkg-source: info: building free-ram in free-ram_1.0.0-1.tar.xz
dpkg-source: info: building free-ram in free-ram_1.0.0-1.dsc
debian/rules build
dh build --with=systemd
dh: Compatibility levels before 5 are deprecated (level 4 in use)
dh_testdir
dh_update_autotools_config
dh_update_autotools_config: Compatibility levels before 5 are deprecated (level 4 in use)
dh_auto_configure
dh_auto_configure: Compatibility levels before 5 are deprecated (level 4 in use)
dh_auto_build
dh_auto_build: Compatibility levels before 5 are deprecated (level 4 in use)
dh_auto_test
dh_auto_test: Compatibility levels before 5 are deprecated (level 4 in use)
debian/rules binary
dh binary --with=systemd
dh: Compatibility levels before 5 are deprecated (level 4 in use)
dh_testroot
dh_prep
dh_prep: Compatibility levels before 5 are deprecated (level 4 in use)
dh_auto_install
dh_auto_install: Compatibility levels before 5 are deprecated (level 4 in use)
dh_install
dh_install: Compatibility levels before 5 are deprecated (level 4 in use)
dh_installdocs
dh_installdocs: Compatibility levels before 5 are deprecated (level 4 in use)
dh_installchangelogs
dh_installchangelogs: Compatibility levels before 5 are deprecated (level 4 in use)
dh_systemd_enable
dh_systemd_enable: Compatibility levels before 5 are deprecated (level 4 in use)
dh_installinit
dh_installinit: Compatibility levels before 5 are deprecated (level 4 in use)
dh_systemd_start
dh_systemd_start: Compatibility levels before 5 are deprecated (level 4 in use)
dh_perl
dh_perl: Compatibility levels before 5 are deprecated (level 4 in use)
dh_link
dh_link: Compatibility levels before 5 are deprecated (level 4 in use)
dh_strip_nondeterminism
dh_strip_nondeterminism: Compatibility levels before 5 are deprecated (level 4 in use)
dh_compress
dh_compress: Compatibility levels before 5 are deprecated (level 4 in use)
dh_fixperms
dh_fixperms: Compatibility levels before 5 are deprecated (level 4 in use)
dh_installdeb
dh_installdeb: Compatibility levels before 5 are deprecated (level 4 in use)
dh_gencontrol
dh_gencontrol: Compatibility levels before 5 are deprecated (level 4 in use)
dh_md5sums
dh_md5sums: Compatibility levels before 5 are deprecated (level 4 in use)
dh_builddeb
dpkg-deb: building package 'free-ram' in '../free-ram_1.0.0-1_all.deb'.
dh_builddeb: Compatibility levels before 5 are deprecated (level 4 in use)
dh_builddeb: Compatibility levels before 5 are deprecated (level 4 in use)
dpkg-genchanges >../free-ram_1.0.0-1_amd64.changes
dpkg-genchanges: including full source code in upload
dpkg-source --after-build freIn the debian/source/format file, there should be a single line indicating the desired format for the source package (check dpkg-source(1) for an exhaustive list). After squeeze, it should say either: 3.0 (native) for native Debian packages or 3.0 (quilt) for everything else. The newer 3.0 (quilt) source format records modifications in a quilt patch series within debian/patches. Those changes are then automatically applied during extraction of the source package. The Debian modifications are simply stored in a debian.tar.gz archive containing all files under the debian directory. This new format supports inclusion of binary files such as PNG icons by the package maintainer without requiring tricks. [60] When dpkg-source extracts a source package in 3.0 (quilt) source format, it automatically applies all patches listed in debian/patches/series. You can avoid applying patches at the end of the extraction with the --skip-patches option.e-ram-1.0.0
dpkg-buildpackage: full upload; Debian-native package (full source is included)
  • در صورتی که دو دایکتوری عقب‌تر را ls بگیرید، می‌بینید که پرونده‌های زیر ایجاد شده است. (رنگ قرمز)
root@ubuntu16:~/debs/free-ram-1.0.0/debian# ls ../../ -1
free-ram
free-ram-1.0.0
free-ram_1.0.0-1_all.deb
free-ram_1.0.0-1_amd64.changes
free-ram_1.0.0-1.dsc
free-ram_1.0.0-1.tar.xz
free-ram_1.0.0.orig.tar.xz

بررسی پرونده‌ی DEB توسط ابزار mc

  • برای این منظور ابتدا وارد دو دایکتوری عقب‌تر شوید.
root@ubuntu16:~/debs/free-ram-1.0.0/debian# cd ../../
  • حال دستور mc را اجرا نمایید :
root@ubuntu16:~/debs# mc
  • وارد پرونده‌ی deb. شوید.
  • در صورتی که بسته بندی درست انجام شده باشد باید بتوانید دایکتوری CONTENTS را ببینید.
  • این دایکتوری حاوی پرونده‌های برنامه (در اینجا پرونده‌ی free-ram.service و free-ram) میباشد.

تمیز کردن دایکتوری DEBIAN

  • بعد از build یک سری پرونده درون دایکتوری DEBIAN ساخته می‌شود.
  • برای پاک کردن این پرونده‌ها (مثلا برای دوباره build کردن) به صورت زیر عمل نمایید.
root@ubuntu16:~/debs/free-ram-1.0.0# ./debian/rules clean
dh clean --with=systemd
dh: Compatibility levels before 5 are deprecated (level 4 in use)
dh_testdir
dh_auto_clean
dh_auto_clean: Compatibility levels before 5 are deprecated (level 4 in use)
dh_clean
dh_clean: Compatibility levels before 5 are deprecated (level 4 in use)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *