Pokud používáte Red Hat Enterprise Linux (RHEL) nebo Fedoru, brzy zjistíte, že používáte dnf
(nebo yum
) k instalaci softwarových balíčků. Red Hat Package Manager (RPM) je nejdůležitější nástroj pro správu softwaru v těchto distribucích Linuxu. Tento článek ukazuje, jak můžete využít výhod tohoto rámce k distribuci vlastních aplikací.
Doufejme, že jste měli možnost přečíst si článek Valentina Bajramiho na stejné téma. Zopakuji zde některé ze stejných pojmů a ilustruji několik problémů, se kterými se můžete během cesty setkat. Použiji také dva složitější příklady a identifikuji několik problémů, které můžete objevit při balení nativních aplikací.
Tento článek ukazuje, jak určit, jak zkompilovat a zabalit vlastní nativní aplikaci pro distribuci. V navazujícím článku vysvětlím, jak zabalit aplikace třetích stran, které nemají balíček RPM, nebo pokud ano, chcete si jej přizpůsobit.
Předpoklady zahrnují:
- Máte základní znalosti o tom, jak používat RPM k dotazování na balíčky a instalaci nebo mazání balíčků. Pokud ne, seznamte se nejprve s těmito koncepty a pak se sem vraťte a pobavte se.
- Máte nainstalované Make, Git, GCC a Java, protože je budete potřebovat k dokončení zde uvedených cvičení. Není to povinné, ale bylo by hezké, kdybyste cvičili, když se pohybuji.
Chcete-li nainstalovat Make, GCC, Java 11 a Git pomocí správce balíčků DNF, spusťte:
$ sudo dnf install \
make gcc-10 java-11-openjdk-headless git
Zabalte si svůj vlastní software pomocí RPM
Tento článek pro tento krok používá malý open source projekt nazvaný jdumpertools.
Na linuxovém terminálu naklonujte jdumpertools
a poté jej zkompilujte (nainstalovali jste Make a kompilátor GCC, že?):
$ git clone [email protected]:josevnz/jdumpertools.git
$ cd jdumpertools
$ make all
$ ls -l jdu jutmp *.so
-rwxrwxr-x 1 josevnz josevnz 32728 Oct 3 16:40 jdu
-rwxrwxr-x 1 josevnz josevnz 32752 Oct 3 16:40 jutmp
-rwxrwxr-x 1 josevnz josevnz 29024 Oct 3 16:40 libjdumpertools.so
Poté můžete spustit libovolný z vygenerovaných programů. Zkuste například jdu
(jednodušší verze du
příkaz, který vytiskne výsledky ve formátu JSON):
$ LD_LIBRARY_PATH=$PWD $PWD/jdu /
[{"partition": "/", "free_space": 462140129280.000000, "total_space": 510405902336.000000}]
Zatím je to dobré.
Soubor jdumpertools.spec v tomto adresáři je soubor specifikace RPM, který řídí, jak kompilovat a zabalit jdumpertools
pomocí RPM.
Dále nainstalujte několik podpůrných nástrojů, než přejdete k vytváření souboru RPM.
Instalujte stavební bloky RPM
Získejte potřebné rpmdevtools
nástroje spuštěním:
$ sudo dnf install rpm-build rpmdevtools
Poté připravte karanténu pro vytváření RPM pomocí rpmdevtools
. Pro tento krok nikdy nepoužívejte root, ale svůj osobní nebo vývojářský linuxový účet (předá -d
příznak ladění):
$ rpmdev-setuptree -d
josevnz /home/josevnz /home/josevnz/.rpmmacros
/home/josevnz/rpmbuild/RPMS /home/josevnz/rpmbuild/SOURCES /home/josevnz/rpmbuild/SPECS
/home/josevnz/rpmbuild/SRPMS /home/josevnz/rpmbuild/BUILD
Tady je hezčí pohled:
$ tree ~/rpmbuild
/home/josevnz/rpmbuild
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
5 directories, 0 files
, 0 souborů
Právě teď musíte věnovat pozornost pouze dvěma adresářům:SOURCES
a SPECS
. Ostatní vysvětlím později.
Existuje také nový soubor s názvem ~/.rpmmacros
. Můžete tam vložit nebo přepsat některá speciální makra, abyste se vyhnuli opakujícím se úlohám při sestavování RPM balíčků. Tento soubor je důležitý, protože ukotvuje rpmbuild
prostředí s vaším domovským adresářem.
Zabalte si aplikaci
Nejprve vytvořte tar
soubor zdrojového kódu v ~/rpmbuild/SOURCES
adresář:
VERSION=v0.1
NAME=jdumpertools
TARFILE=$(NAME)-$(VERSION).tar.gz
/usr/bin/tar --exclude-vcs --directory ../ --create --verbose --gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME)
Normálně tar
obsahuje skripty a zdrojový kód, který zkompilujete v rámci procesu balení.
Dále vytvořte spec
RPM soubor. Opět rpmdevtools
poskytuje náskok, jako je tento:
$ rpmdev-newspec ~/rpmbuild/jose-package.spec
/home/josevnz/rpmbuild/jose-package.spec created; type minimal, rpm version >= 4.16.
$ cat ~/rpmbuild/jose-package.spec
Name: jose-package
Version:
Release: 1%{?dist}
Summary:
License:
URL:
Source0:
BuildRequires:
Requires:
%description
%prep
%autosetup
%build
%configure
%make_build
%install
rm -rf $RPM_BUILD_ROOT
%make_install
%files
%license add-license-file-here
%doc add-docs-here
%changelog
* Sun Oct 03 2021 Jose Vicente Nunez <[email protected]>
-
Nedělejte si starosti, pokud nyní tomuto souboru nerozumíte. Zkopírujte soubor jdumpertools.spec
soubor do ~/rpmbuild/SPECS
adresář:
$ cp -pv jdumpertools.spec ~/rpmbuild/SPECS
A vytvořte zdrojový a binární soubor RPM:
$ rpmbuild -ba rpmbuild/SPECS/jdumpertools.spec
setting SOURCE_DATE_EPOCH=1609718400
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.kBlIwO
+ umask 022
+ cd /home/josevnz/rpmbuild/BUILD
+ cd /home/josevnz/rpmbuild/BUILD
+ rm -rf jdumpertools
+ /usr/bin/gzip -dc /home/josevnz/rpmbuild/SOURCES/jdumpertools-v0.1.tar.gz
+ /usr/bin/tar -xof -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd jdumpertools
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ RPM_EC=0
[...]
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64
Wrote: /home/josevnz/rpmbuild/SRPMS/jdumpertools-v0.1-1.fc33.src.rpm
Wrote: /home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.uEyCyL
+ umask 022
+ cd /home/josevnz/rpmbuild/BUILD
+ cd jdumpertools
+ rm -rf /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64
+ RPM_EC=0
++ jobs -p
+ exit 0
Konečným výsledkem jsou dva soubory:zdrojové RPM a binární RPM.
Wrote: /home/josevnz/rpmbuild/SRPMS/jdumpertools-v0.1-1.fc33.src.rpm
Wrote: /home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm
Co se stane během instalace RPM
Co se tedy stane, když nainstalujete každý z vašich vlastních RPM?
- Instalací zdrojového RPM vytvoří
tar
aspec
soubor ve vašemrpmbuild
adresář. To vám umožní znovu zkompilovat aplikaci, provést opravy RPMspec
soubor atd.$ ls rpmbuild/{SPECS,SOURCES} rpmbuild/SOURCES: jdumpertools-v0.1.tar.gz rpmbuild/SPECS: jdumpertools.spec
- Pokud nainstalujete binární RPM, pak ve skutečnosti instalujete aplikaci:
$ sudo rpm -ihv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm Verifying... ################ [100%] Preparing... ################ [100%] Updating / installing... 1:jdumpertools-v0.1-1.fc33 ################ [100%]
- Potvrďte, že nainstalovaný balíček je přítomen:
$ rpm -qi jdumpertools Name : jdumpertools Version : v0.1 Release : 1.fc33 Architecture: x86_64 Install Date: Sun 03 Oct 2021 06:32:50 PM EDT Group : Unspecified Size : 95002 License : Apache License 2.0 Signature : (none) Source RPM : jdumpertools-v0.1-1.fc33.src.rpm Build Date : Sun 03 Oct 2021 06:27:11 PM EDT Build Host : dmaf5.home URL : https://github.com/josevnz/jdumpertools Summary : Programs that can be used to dump Linux usage data in JSON format. Description : Jdumpertools is a collection of programs used to dump Linux usage data in JSON format to be ingested by other tools. * jdu: Similar to UNIX 'du' command. * jutmp: UTMP database dumper
Poznámka :Zvědaví čtenáři pravděpodobně otevřeli Makefile
a viděl cíl nazvaný rpm
:
rpm: all
test -x /usr/bin/rpmdev-setuptree && /usr/bin/rpmdev-setuptree|| /bin/mkdir -p -v ${HOME}/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
/usr/bin/tar --exclude-vcs --directory ../ --create --verbose --gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME)
/usr/bin/rpmbuild -ba jdumpertools.spec
Toto je pohodlná zkratka pro přípravu rpmbuild
sandbox, tar
soubory poté, co jsou zkompilovány pomocí make
a zabalte je pomocí rpmbuild
příkaz. Neváhejte a zavolejte make rpm
a uvidíte, co se stane.
[ Získejte další tipy stažením cheatu pro skriptování prostředí Bash. ]
Ukázal jsem vám příkazy a nástroje používané k generování soubory RPM, ale nyní je čas zapsat spec
RPM soubor.
Vytvořte soubor specifikací pro nástroje jdumper
Práce se soubory specifikací vyžaduje vyplnění několika značek metadat a také popis toho, jak aplikaci zkompilujete nebo zabalíte. Jdumpertools
je jednoduchá aplikace ANSI C, takže rozbalte zdrojové kódy, zkompilujte je a zkopírujte je do mezilehlé oblasti (~/rpmbuild/BUILDROOT
) a poté je zabalte k distribuci.
Nejprve se podívejte na soubor specifikace RPM:
Name: jdumpertools
# TODO: Figure out a better way to update version here and on Makefile
Version: v0.1
Release: 1%{?dist}
Summary: Programs that can be used to dump Linux usage data in JSON format.
License: Apache License 2.0
URL: https://github.com/josevnz/jdumpertools
Source0: %{name}-%{version}.tar.gz
BuildRequires: bash,tar,gzip,rpmdevtools,rpmlint,make,gcc >= 10.2.1
Requires: bash
%global debug_package %{nil}
%description
Jdumpertools is a collection of programs you can use to dump Linux usage data in JSON format to be ingested by other tools.
* jdu: Similar to UNIX 'du' command.
* jutmp: UTMP database dumper
%prep
%setup -q -n jdumpertools
%build
make all
%install
rm -rf %{buildroot}
/usr/bin/mkdir -p %{buildroot}/%{_bindir}
/usr/bin/cp -v -p jdu jutmp %{buildroot}/%{_bindir}
/usr/bin/mkdir -p %{buildroot}/%{_libdir}
/usr/bin/cp -v -p libjdumpertools.so %{buildroot}/%{_libdir}
%clean
rm -rf %{buildroot}
%files
%{_bindir}/jdu
%{_bindir}/jutmp
%{_libdir}/libjdumpertools.so
%license LICENSE
%doc README.md
%changelog
* Mon Jan 4 2021 Jose Vicente Nunez <[email protected]> - 0.1
- First version being packaged
Přečtěte si, co je důležité zde:
- Metadata, včetně verze, názvu a zdroje0; můžete použít proměnné nebo makra
- Rozbalte zdroje v
%prep
pomocí%setup
makro (průvodce RPM má spoustu podrobností o příznakech) - Vyžaduje sestavení :Musíte uvést závislosti, které potřebujete k sestavení balíčku. Tyto nelze dynamicky detekovat.
- %sestavení sekce:Kompilace pomocí
make
- %install sekce:Zkopírujte, co potřebujete, aby program fungoval (program, knihovny atd.)
- %souborů sekce:Kde můžete určit, zda je soubor dokumentem (%doc ), licenční soubor (% licence ), nebo běžný soubor
Také důležité:
- Zakázal jsem vytváření ladicího kódu během balení pomocí
%global debug_package %{nil}
. changelog
dokumentuje, co se s touto novou verzí balíčku změnilo.
Zkontrolujte chyby v souboru spec pomocí rpmlint
Nechcete tvrdě zjišťovat, že vaše RPM nejsou dokonalé. Proto je dobré zkontrolovat zjevné chyby nebo způsoby, jak zlepšit své RPM:
$ sudo dnf install rpmlint
Nyní zkontrolujte spec
RPM soubor:
$ rpmlint /home/josevnz/rpmbuild/SPECS/jdumpertools.spec
/home/josevnz/rpmbuild/SPECS/jdumpertools.spec: W: invalid-url Source0: jdumpertools-v0.1.tar.gz
0 packages and 1 specfiles checked; 0 errors, 1 warnings.
Dokumentace rpmlint říká, že Source0 musí být dobře definovaná adresa URL (hodnota by měla být platná veřejná adresa URL HTTP, HTTPS nebo FTP). S tímto varováním si nedělejte starosti.
A co samotné RPM?
$ make rpm
...
$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
jdumpertools.x86_64: W: summary-ended-with-dot C Programs that can be used to dump Linux usage data in JSON format.
jdumpertools.x86_64: W: spelling-error %description -l en_US du -> dew, doe, Du
jdumpertools.x86_64: E: description-line-too-long C Jdumpertools is a collection of programs that can be used to dump linux usage data in JSON format, so it can be ingested by other tools.
jdumpertools.x86_64: W: incoherent-version-in-changelog 0.1 ['v0.1-1.fc33', 'v0.1-1']
jdumpertools.x86_64: W: invalid-license Apache License 2.0
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/bin/jdu
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/bin/jutmp
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/lib64/libjdumpertools.so
jdumpertools.x86_64: W: no-soname /usr/lib64/libjdumpertools.so
jdumpertools.x86_64: W: no-manual-page-for-binary jdu
jdumpertools.x86_64: W: no-manual-page-for-binary jutmp
1 packages and 0 specfiles checked; 1 errors, 10 warnings.
Deset varování a jedna chyba. Některé lze snadno opravit:
- Licence musí mít konkrétní formát
- Pro programy jsou vyžadovány manuálové stránky, takže jsem napsal velmi jednoduchou s troff
- Zahrňte soname do knihovny
Po opravách zůstane pouze jedno varování:
$ make rpm
...
$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
jdumpertools.x86_64: W: spelling-error %description -l en_US du -> dew, doe, Du
The value of this tag appears to be misspelled. Please double-check.
Toto varování vás upozorňuje, že slovo du
se zdá být špatně napsáno. Je to však pouze odkaz na platný příkaz, takže můžete varování ignorovat.
Nyní upgradujte RPM vylepšenou verzí:
$ sudo rpm -Uhv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
Používám rpm
příkaz, aby bylo jasnější, že jsem upgradoval balíček z verze místního disku místo nové verze z úložiště. Pokud chcete, můžete totéž udělat s dnf
:
$ sudo dnf install --upgrade \
~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
Co jste se naučili a co bude dál
Balicí software s RPM vypadá zpočátku děsivě, ale s trochou trpělivosti se k tomu dostanete během okamžiku. Když narazíte na problémy, najdete také správné způsoby, jak zlepšit svůj kód. Níže jsou uvedeny některé zdroje a závěrečná doporučení:
- Udělejte si velkou laskavost a získejte výtisk RPM Packaging Guide od Adama Millera, Maxima Svistunova a Marie Doleželové. Je velmi kompletní a dobře organizovaná. Vážně, udělej to hned; je to tak dobré.
- Oficiální příručka RPM Packaging Guide a příručka Fedora RPM jsou také plné podrobností; mějte je jako záložku.
- Použijte rpmlint. Budete překvapeni, kolik drobností dokážete zachytit a opravit před odesláním svých RPM balíčků.
- Nestačí? Fedora má seznam triků, které můžete použít při balení softwaru.
- Stále jste zvědaví? Určitě byste se měli podívat na pokyny pro balení RPM.