====== Tvorba RPM/DEB balíčků ======
===== RPM =====
* je potřeba vytvořit .spec soubor
* je potřeba spustit rpmbuild a mít připravené prostředí
* úplně základní informace [[http://www.linux.cz/noviny/1998-05/clanek10.html|zde]]
* rpmbuild potřebuje buildovací prostředí (většinou v cestě /usr/src/redhat, nebo nekdy ~/rpmbuild)
* SPECS - obsahuje spec-soubory, které řídí vlastní sestavování RPM balíku.
* SOURCES - zde jsou zdrojové soubory, ze kterých se balík vytváří (zpravidla tar.gz)
* BUILD - do tohoto adresáře se rozbalí zdrojové soubory a probíhá zde kompilace.
* RPMS/architektura - sem se uloží výsledné RPM soubory.
* SRPMS - zde budou výsledné zdrojové RPM soubory.
* prostředí lze předefinovat pomocí proměných například v konfiguračním souboru
$ cat ~/.rpmmacros
%_topdir /home/jamatos/
%_tmppath /tmp/rpmbuild
%_builddir %{_tmppath}
%_rpmtopdir %{_topdir}/build/%{name}
%_sourcedir %{_rpmtopdir}
%_specdir %{_rpmtopdir}
%_rpmdir %{_rpmtopdir}
%_srcrpmdir %{_rpmtopdir}
* nebo parametrem programu rpmbuild
rpmbuild --buildroot="${BUILDDIR}/rpm-root" \
--define="_builddir ${BUILDDIR}/BUILD" \
--define="_rpmdir ${BUILDDIR}/RPMS" \
--define="_tmppath ${BUILDDIR}/rpm-tmp" \
--define="_sourcedir ${BUILDDIR}/SOURCES" \
-bb "${BUILDDIR}/$1.spec"
* seznam proměnných/maker [[https://fedoraproject.org/wiki/Packaging:RPMMacros|zde]]
==== spec file ====
* SourceX
* soubor balíčku zadaný jako URL nebo název souboru v SOURCES adresáři, typicky tgz archív se zdrojáky
* X zastupuje číslo, například Source0, Source1.., může jich být tedy více
* Source bez čísla je synonymum k Source0
* lze využít proměnné %{name}, %{version}
* PatchX
* rozdílový soubor zadaný jako URL nebo název souboru v SOURCES adresáři, typicky obsahující modifikace souborů z archívu SourceX
* X zastupuje číslo, například Patch0, Patch1.., může jich být tedy více
* Requires
* na čem balíček závisí
* například názvy jiných balíčků oddělených čárkou
* lze zadat i konkrétní verze přes komparátory (<,>,=)
* %prep
* příkazy k přípravě balíčku
* typicky volají příkaz setup, který zařídí extrakci souborů SourceX
* setup má parametry, popis například [[https://docs-old.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html-single/RPM_Guide/index.html#id366540|zde]]
* setup lze nahradit například zápisem
cd %{_builddir}
rm -rf %{name}-%{version}
cp -rf %{_sourcedir} %{name}-%{version}
cd %{name}-%{version}
/usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
* %build
* příkazy pro build programu, který balíček reprezentuje
* pokud nic buildovat nepotřebujeme, tak lze sekci vynechat
* %install
* příkazy pro instalaci, typicky kopírování z %{_builddir} do %{buildroot}, který reprezentuje cílový kořenový adresář.
* %pre - příkazy před instalací/upgrade
* %post - příkazy po instalaci/upgrade, nesmí končit nenulově
* %preun - příkazy před odinstalací
* %postun - příkazy po odinstalování, nesmí končit nenulově
^ ^ install ^ upgrade ^ uninstall ^
| %pretrans | $1 == 0 | $1 == 0 | (N/A) |
| %pre | $1 == 1 | $1 == 2 | (N/A) |
| %post | $1 == 1 | $1 == 2 | (N/A) |
| %preun | (N/A) | $1 == 1 | $1 == 0 |
| %postun | (N/A) | $1 == 1 | $1 == 0 |
| %posttrans | $1 == 0 | $1 == 0 | (N/A) |
%post
case $1 in
1)
# instalation
;;
2)
# upgrade
;;
esac
* %files
* soubory, které budou balíčkem instalovány (verzovány)
* všechny soubory vytvořené v ''%{buildroot}'' musí být vypsány ve sekci ''%files'', jinak balíček nelze vytvořit
* místo souborů lze použít hvězdičku
* pozor na verzování obecných adresářů, může vytvořit konflikt s jinými balíčky
* souborům lze nastavit oprávnění a vlastníka předřazením ''%attr(644,user,group)'' před název souboru
* konfigurační soubory by měly mít předřazeno označení ''%config'' (případně i před ''%attr'')
* pokud je v balíčku novější cfg soubor, tak přepíše lokální a případné modifikace lokálního uloží do .rpmsave
==== Příklad "rychle na prasáka" ====
* mám složku se zdrojáky s fungujícím ./configure + make
* chci udělat jednou jeden binární balíček
* jako uživatel mám omezené oprávnění, nemůžu zapisovat do /usr/src/redhat
* vytvořím .spec soubor
Summary: Balicek na rychlo
Name: balicek-prvni
Version: 1.0
Release: 0
Source: none
License: GPL
Group: Utilities/System
%description
Tohle je muj balicek
%prep
%build
%configure
make OPTIM="$RPM_OPT_FLAGS"
%install
%makeinstall PREFIX=$RPM_BUILD_ROOT install
%files
%{_bindir}
%{_datadir}
* do sekce files je potřeba vypsat všechny soubory, které se přidaly voláním make install. Lze použít uvedená makra
* spuštění tvorby baličku
BASEDIR=`pwd`
mkdir -p build/{root,BUILD}
cp -ra projekt/* build/BUILD/
chmod +x build/BUILD/configure
rpmbuild --buildroot=${BASEDIR}/build/root --define="_builddir ${BASEDIR}/build/BUILD" --define="_rpmdir ${BASEDIR}/build/" -bb balicek-prvni.spec
* výsledné rpm najdu ve složce build
==== Příklad "na slušňačku" ====
* příklad jednoduchého spec
Summary: Bblablablabla
Name: balicek-prvni
Version: 1.0
Release: 0
Source: projekt-src.tar.gz
Copyright: GPL
Group: Utilities/System
%description
Tohle je muj balicek
%prep
%setup
%build
make OPTIM="$RPM_OPT_FLAGS"
%install
make PREFIX=$RPM_BUILD_ROOT install
%files
%{_bindir}
%{_datadir}
* zapojení do Makefile
# pripravi adresarovy strom a nastaveni pro RPM
rpmbuildenv:
mkdir -p ~/rpmbuild/{BUILD,RPMS/x86_64,SOURCES,SPECS,SRPMS}
(echo "%_topdir ~/rpmbuild";echo "%_prefix /usr/local/") >> ~/.rpmmacros
rpm:
cp -ra zdrojaky zdrojaky-tmp
chmod +x zdrojaky-tmp/configure
# odstraneni info o svn, pokud tam je
find zdrojaky-tmp -name '.svn'|xargs rm -rf
tar czf zdrojaky-tmp.tgz zdrojaky-tmp
# pokud je lokalni RPM build prostredi tak do nej supnu balicky a spec file (dodelat)
[ -d ~/rpmbuild/SOURCES ] && cp -f zdrojaky-tmp.tgz ~/rpmbuild/SOURCES
all: rpmbuildenv rpm
==== jak probiha upgrade ====
Hence, the order of operations during an upgrade is:
* Run the %pre section of the RPM being installed.
* Install the files that the RPM provides.
* Run the %post section of the RPM.
* Run the %preun of the old package.
* Delete any old files not overwritten by the newer version. (This step deletes files that the new package does not require.)
* Run the %postun hook of the old package.
A taky pozor na instalaci vice balicku najednou, chova se to trochu jinak. Hromadny upgrade (rpm -Uvh *) nejspis funguje takto:
* a) u vsech balicku spusti pre-install
* b) u vsech balicku provede install
* c) u vsech balicku spusti post-install
* *) pak se teprve dela pre/post uinstall
Pořadí, ve kterém se bude spouštět pre-install není asi dopředu známo. Pokud jsou balíčky závislé na sobě, je dobré využít trigger skripty ([[https://www.ibm.com/developerworks/library/l-rpm2/|%triggerin, %triggerun, %triggerpostun]])
https://fedoraproject.org/wiki/Packaging:Scriptlets
- %pretrans of new package
- %pre of new package
- (package install)
- %post of new package
- %triggerin of other packages (set off by installing new package)
- %triggerin of new package (if any are true)
- %triggerun of old package (if it's set off by uninstalling the old package)
- %triggerun of other packages (set off by uninstalling old package)
- %preun of old package
- (removal of old package)
- %postun of old package
- %triggerpostun of old package (if it's set off by uninstalling the old package)
- %triggerpostun of other packages (if they're setu off by uninstalling the old package)
- %posttrans of new package
==== malé velké rady ====
* post skripty nesmí failovat!! balíček je už totiž nainstalovaný. Pokud balíček přeci jen skončí s fail, zůstavají v systému dvě verze balíčku. Musí se to opravit ručně.
* navratová hodnota posledního příkazu v post/pre skriptech se bere jako návratová hodnota celého skriptu. Nejlepší je tam psát exit 0 jako pojistku
==== distribuce dočasných install souborů ====
* Narazil jsem na problém. Mám rpm balíček pro aplikaci, která potřebuje v databázi určitá schémata. Mám skript a soubor s sql importem. Jak to správně zabalíčkovat? Skript i sql soubory potřebuji jen pro instalaci, pak už ne.
* RPM na tento problém nemá ideální řešení. Možnosti jsou:
- vložit skript a sql přímo do .spec souboru (třeba do %pre). Velikost spec souboru je limitovaná!! Navíc se ukládá do rpm databáze, takže to u větších skriptů/sql není ideální
- při buildu balíčku naimportovat sql do databáze a distribuovat pak binární soubor databáze. Tohle řešení lze ale použít jen pro čistý install. Upgrade se pak řeší komplikovaně.
- dedikovat na cílovém stroji adresář pro skripty/sql. Soubory tam normálně nahrát přes %files. Soubory se nesmí smazat, aby nevzniknul problém. Tohle je asi nejlepší varianta.
- označit dočasné soubory ve %files jako %config(missingok). Po použití je lze smazat. Není to ale úplně správné řešení, protože se config se správně používá jen pro konfigurační soubory
==== zdroje: ====
* http://www.linux.cz/noviny/1998-05/clanek10.html
* http://www.cyron.cz/clanky/2009/ostatni/vytvoreni-vlastniho-balicku-6-vytvoreni-rpm-ze-zdrojoveho-kodu.php
* http://www.linux-archive.org/fedora-development/541096-how-keep-rpmbuild-directory-clean.html
* https://fedoraproject.org/wiki/Packaging:Scriptlets
===== DEB =====
==== Finty ====
* nalezení balíčku, který obsahuje soubor
$ dkpg -S /bin/cat
coreutils: /bin/cat
* Jak zobrazit dostupnou a nainstalovanou verzi?
# apt-cache policy gnome-control-center
gnome-control-center:
Instalovaná verze: 1:2.20.0-1
Kandidát: 1:2.20.0-1
Tabulka verzí:
*** 1:2.20.0-1 0
500 ftp://ftp.cz.debian.org unstable/main Packages
100 /var/lib/dpkg/status
==== Tvorba ====
* http://tldp.org/HOWTO/html_single/Debian-Binary-Package-Building-HOWTO/
$ mkdir -p ./debian/usr/bin
$ cp linuxstatus ./debian/usr/bin
Package: linuxstatus
Version: 1.1-1
Section: base
Priority: optional
Architecture: all
Depends: bash (>= 2.05a-11), textutils (>= 2.0-12), awk, procps (>= \
1:2.0.7-8), sed (>= 3.02-8), grep (>= 2.4.2-3), coreutils (>= 5.0-5)
Maintainer: Chr. Clemens Lee
Description: Linux system information
This script provides a broad overview of different
system aspects.
$ mkdir -p debian/DEBIAN
$ find ./debian -type d | xargs chmod 755 # this is necessary on Debian Woody, don't ask me why
$ cp control debian/DEBIAN
$ dpkg-deb --build debian
dpkg-deb: building package `linuxstatus' in `debian.deb'.
$ mv debian.deb linuxstatus_1.1-1_all.deb