Hlavní navigace

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

8. 10. 2010
Doba čtení: 7 minut

Sdílet

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:

root_podpora

$ 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

Byl pro vás článek přínosný?

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.