Hlavní navigace

Vytvořte si balíček pro Ubuntu/Debian snadno a rychle

Adam Štrauch

Ubuntu i Debian pod sebou mají velkou skupinu uživatelů a základy tvorby balíčku jsou pro vývojáře nebo správce nepostradatelnou záležitostí. Začátečníci se ale tohoto kroku velmi obávají. Přitom vytvořit deb balíček není nějak složité a stačí k tomu znát pár nástrojů a zorientovat se v několika souborech.

Že potřebujete vytvořit balíček, zjistíte hned, jak nenajdete v repositářích novou verzi nějakého méně známého programu nebo potřebujete rozšířit mezi uživatele program svůj. V mém případě šlo o NoSQL databázi Redis, která je v Ubuntu i v Debianu v dost staré verzi a aniž bych se snažil pídit po nějakých neoficiálních balíčcích, rozhodl jsem se vytvořit balíček vlastní. U Redisu je ještě jeden problém, se kterým se setkáte i u jiných balíčků, a to, že autor ho udělal špatně. Pak si uživatel v dobré víře nainstaluje Redis z repositáře a zjistí, že mu chybí prakticky všechno a nemůže databázi otestovat, ani se k ní z řádky připojit.

Návod, který najdete níže, je volně převzatý z ubuntuforum­s.com a navlečený na Redis verze 2.0.2. Někde jsem něco přidal, někde něco ubral, ale nakonec jsem dostal balíček, který jsem potřeboval. Neváhejte se v diskusi podělit o vlastní postřehy a zkušenosti.

Jdeme na to

Postup je jednoduchý, najdeme zdrojové kódy a rozbalíme je. Pomocí připravených skriptů upravíme adresář, kde se nachází, tak, aby v něm bylo vše, co je potřeba pro vytvoření balíčku, upravíme skripty pro zkonfigurování, zkompilování, instalaci a spustíme skript pro vytvoření balíčku.

Nejdříve si tedy seženeme zdrojové kódy projektu, u kterého potřebujeme balíček. V tomto případě to bude již zmíněný Redis.

$ cd
$ mkdir -p src/redis_pkg
$ cd src/redis_pkg
$ wget http://redis.googlecode.com/files/redis-2.0.2.tar.gz
$ tar xf redis-2.0.2.tar.gz
$ cd redis-2.0.2 

Teď potřebujeme nějaké nástroje/skripty, které nám při vytváření balíčku pomohou.

$ sudo apt-get install dh-make debhelper devscripts 

A nic nezkazíte ještě instalací build-essential.

$ sudo apt-get install build-essential 

Jestli se všechno povedlo, přejdeme k druhému kroku vytváření balíčku, a to vygenerování adresáře debian/.

$ dh_make -e cx@initd.cz -f ../redis-2.0.2.tar.gz
Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch or cdbs?
 [s/i/m/l/k/n/b] s
 Maintainer name : Adam Strauch
 Email-Address   : cx@initd.cz
 Date            : Thu, 07 Oct 2010 18:35:01 +0200
 Package Name    : redis
 Version         : 2.0.2
 License         : blank
 Using dpatch    : no
 Using quilt     : no
 Type of Package : Single
 Hit <enter> to confirm:
 Done. Please edit the files in the debian/ subdirectory now. You should also
 check that the redis Makefiles install into $DESTDIR and not in / . 

Skript dh_make si zjistí, co může, z názvu balíku se zdrojovým kódem a z údajů v systému. Na vás pak je vybrat, jestli bude balíček knihovnou, jaderným modulem, jednou binárkou, více binárkami atd. My zatím zůstaneme u jedné binárky a vybereme tedy s. Některé informace, které vám jsou vypsány, pak můžete změnit různě v souborech v adresáři debian/. Začneme hned z kraje souborem debian/control.

Source: redis
Section: misc
Priority: optional
Maintainer: Adam Strauch <cx@initd.cz>
Build-Depends: debhelper (>= 7)
Standards-Version: 3.8.3
Homepage: http://code.google.com/p/redis/
Package: redis
Architecture: i386 amd64
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: A persistent key-value database
 Redis is an advanced key-value store. It is similar to memcached but the
 dataset is not volatile, and values can be strings, exactly like in memcached,
 but also lists, sets, and ordered sets. All this data types can be
 manipulated with atomic operations to push/pop elements, add/remove elements,
 perform server side union, intersection, difference between sets, and so
 forth. Redis supports different kind of sorting abilities. 

Zde je potřeba vyplnit sekci (seznam sekcí), prioritu (seznam priorit), domovskou stránku projektu, architektury, závislosti (v tomto případě je necháme na pomocných skriptech), krátký popis a dlouhý popis, kde každý řádek začíná mezerou.

Nyní přejdeme do souboru debian/changelog, kde upravíme to co nám vygenerovaly pomocné skripty. Pokud je to balíček jen pro vás, tak nemá smysl se moc rozepisovat.

redis (2.0.2-1) unstable; urgency=low
  * Initial release
 -- Adam Strauch <cx@initd.cz>  Thu, 07 Oct 2010 18:35:01 +0200 

Dále je potřeba vyplnit informace o licenci, resp. licencích. To se dělá v souboru debian/copyright.

This work was packaged for Debian by:
    Adam Strauch <cx@initd.cz> on Thu, 07 Oct 2010 18:35:01 +0200
It was downloaded from <http://code.google.com/p/redis/downloads/list>
Upstream Author(s):
    antirez <antirez at gmail dot com>
Copyright:
    <Copyright (C) 2010 antirez>
License:
    BSD
The Debian packaging is:
    Copyright (C) 2010 Adam Strauch <cx@initd.cz> 

Hned na začátku vyplníme název autora balíčku. Následuje adresa, odkud je zdrojový kód získán, jména všech autorů a jejich e-mailové adresy, copyright zdrojového kódu, licence zdrojového kódu a nakonec copyright pro balíček.

Tohle je asi nejnepříjemnější práce na celém balíčkování, protože správně by měly být zapsány všechny licence, pod kterými je zdrojový kód. Například jeden soubor může být pod BSD a druhý pod nějakou osobní licencí daného vývojáře a správně by tohle zde mělo být zohledněno.

Teď už přejdeme k samotné konfiguraci, kompilaci a instalaci balíčku. Měli byste vědět, jak se daný program kompiluje a podle toho pak upravíte soubor debian/rules. Jde o Makefile, který nakonec používá skript, jenž dá dohromady náš balíček. Zde najdeme několik pevně daných pravidel, ale na většinu z nich nemusíme u normálního balíčku koukat a vystačíme si s těmito:

  • configure
  • build-stamp
  • install

Jak je patrné z názvu, tak do prvního pravidla umístíme vše, co se týká konfigurace, to je staré dobré ./configure, jak ho známe z návodů. Redis žádnou konfiguraci nevyžaduje. Druhé pravidlo build-stamp je voláno z pravidla build a umístíme do něj vše co se týká sestavení binárních souborů. Skript dh_make, jenž vytvářel adresář debian/, už make doplnil, takže v případě Redisu sem nemusíte nic dávat. Co je ale potřeba u Redisu udělat, je upravit pravidlo pro instalaci. V tomto případě není Makefile u Redisu nějak nápomocný, a tak je lepší soubory nakopírovat hezky jeden po druhém, moc jich není.

install: build
    dh_testdir
    dh_testroot
    dh_prep
    dh_installdirs
    mkdir -p $(CURDIR)/debian/redis/usr/bin/
    mkdir -p $(CURDIR)/debian/redis/etc/redis/
    mkdir -p $(CURDIR)/debian/redis/etc/init.d/
    mkdir -p $(CURDIR)/debian/redis/var/lib/redis/
    cp $(CURDIR)/redis.conf $(CURDIR)/debian/redis/etc/redis/
    cp $(CURDIR)/init.d/redis-server $(CURDIR)/debian/redis/etc/init.d/
    cp $(CURDIR)/redis-benchmark $(CURDIR)/debian/redis/usr/bin/
    cp $(CURDIR)/redis-cli $(CURDIR)/debian/redis/usr/bin/
    cp $(CURDIR)/redis-check-aof $(CURDIR)/debian/redis/usr/bin/
    cp $(CURDIR)/redis-check-dump $(CURDIR)/debian/redis/usr/bin/
    cp $(CURDIR)/redis-server $(CURDIR)/debian/redis/usr/bin/ 

Nejdříve se spustí pomocné skripty. Ty se postarají o přípravu adresáře, do kterého budeme instalovat a o další věci. Pro více informací o jednotlivých skriptech použijte man. Pak už následuje samotná instalace. Po sestavení Redisu najdeme v jeho adresáři pět binárních souborů, které překopírujeme do /usr/bin v našem balíčku. Ten se tvoří v adresáři debian/nazev_ba­licku/. Pak do balíčku nakopírujeme ještě init skript a konfigurační soubor. Init skript jsem si vypůjčil z balíčku, který je v repositářích a konfigurační soubor je součástí zdrojových kódů. Pro kopírování použijeme proměnou CURDIR, ve které je uložená cesta ke zdrojovým kódům, s nimiž pracujeme.

Jediné, co nyní zbývá, je napsat poinstalační skript a vytvořit samotný balíček. Skript najdeme v souboru debian/postinst. Určitě jste si všimli stejného souboru, ale s koncovkou .ex, což je zkratka pro „example“. Stačí tedy tento soubor přejmenovat.

$ mv debian/postinst.ex debian/postinst 

A doplnit mu obsah.

    [...]
    configure)
        mkdir -p /var/lib/redis
        useradd -r -d /var/lib/redis redis
        chown redis:redis /var/lib/redis
        chown redis:redis /etc/redis
        chmod 750 /var/lib/redis
        chmod 750 /etc/redis
    ;;
    [...] 

To je přesně ta část, která se spustí, když zavoláte dpkg-reconfigure a která se zároveň spouští po instalaci balíčku.

Tím je vše připravené a můžeme začít kompilovat.

$ dpkg-buildpackage -rfakeroot 

Když vše proběhne jak má, uvidíme o adresář výš tyto soubory:

$ ls .. -l
celkem 878
drwxr-xr-x 8 cx cx   2272 2010-10-07 20:41 redis-2.0.2
-rw-r--r-- 1 cx cx 347802 2010-09-22 11:44 redis_2.0.2.orig.tar.gz
-rw-r--r-- 1 cx cx 347802 2010-09-22 11:44 redis-2.0.2.tar.gz
-rw-r--r-- 1 cx cx 172990 2010-10-07 20:41 redis_2.0.2-1_amd64.deb
-rw-r--r-- 1 cx cx   1373 2010-10-07 20:41 redis_2.0.2-1_amd64.changes
-rw-r--r-- 1 cx cx  12672 2010-10-07 20:41 redis_2.0.2-1.diff.gz
-rw-r--r-- 1 cx cx    725 2010-10-07 20:41 redis_2.0.2-1.dsc 

Mezi kterými je i náš balíček redis2.0.2–1amd64.deb. Ten můžeme nainstalovat a vše je hotovo.

$ sudo dpkg -i ../redis_2.0.2-1_amd64.deb 

Závěr

Tento článek si nekladl za cíl dopodrobna rozebrat každé zákoutí vytváření balíčků pro Ubuntu a Debian, ale s jeho pomocí pochopíte, jak se takový balíček vytváří, co to obnáší a budete připravení toho využít, když bude třeba.

Odkazy

Našli jste v článku chybu?

8. 10. 2010 8:58

PM (neregistrovaný)

Snadno a rychle, ale ta kvalita? Tohle je opravdu jen pro osobni pouziti, dat takovy balicek k dispozici bych se stydel.

Az k debian/rules je to docela v poradku, ale pak to zacina...
Co myslite, ze dela dh_installdirs? Asi netusite, kdyz hned na dalsich radcich vytvarite adresare rucne.

Pokracujeme ke kopirovani souboru. Proc nepouzijete dh_install prosim!

Co dh_installinit, dh_link apod.? Vite co vsechno rustane v systemu, kdyz takovyhle balicek odinstalujete?

Uz leta bojuju v kazde firme,…


8. 10. 2010 10:42

CHe (neregistrovaný)

To ti velmi nepomoze ak mas na masine stable distribuciu. Riesenie je tak nanajvys backports, tam ale momentalne backport Redisu nie je.

Skor mi ale nie je celkom jasny vyznam generovania vlastneho balicka, pokial dana vec ide bez problemov buildnut. Snad len ak to potrebujem hromadne dostat na viac nez niekolko malo serverov.

DigiZone.cz: V Plzni odstartovalo Radio 1

V Plzni odstartovalo Radio 1

DigiZone.cz: R2B2 a Hybrid uzavřely partnerství

R2B2 a Hybrid uzavřely partnerství

Root.cz: Nová třída SD karet A1 s vysokým výkonem

Nová třída SD karet A1 s vysokým výkonem

DigiZone.cz: SES zajistí HD pro M7 Group

SES zajistí HD pro M7 Group

Vitalia.cz: To nejhorší při horečce u dětí: Febrilní křeče

To nejhorší při horečce u dětí: Febrilní křeče

Lupa.cz: Kdo pochopí vtip, může jít do ČT vyvíjet weby

Kdo pochopí vtip, může jít do ČT vyvíjet weby

DigiZone.cz: Sat novinky: slovenská TV8 HD i ruský NTV Mir

Sat novinky: slovenská TV8 HD i ruský NTV Mir

Lupa.cz: Levný tarif pro Brno nebude, je to kartel

Levný tarif pro Brno nebude, je to kartel

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Podnikatel.cz: Udávání a účtenková loterie, hloupá komedie

Udávání a účtenková loterie, hloupá komedie

Podnikatel.cz: E-Ježíšek si zařádí: nákupy od 2 do 5 tisíc

E-Ježíšek si zařádí: nákupy od 2 do 5 tisíc

Vitalia.cz: Pamlsková vyhláška bude platit jen na základkách

Pamlsková vyhláška bude platit jen na základkách

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Podnikatel.cz: Vládu obejde, kvůli EET rovnou do sněmovny

Vládu obejde, kvůli EET rovnou do sněmovny

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Podnikatel.cz: Chaos u EET pokračuje. Jsou tu další návrhy

Chaos u EET pokračuje. Jsou tu další návrhy

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?