Tento článek ukazuje, jak zabalit skript do souboru RPM pro snadnou instalaci, aktualizaci a odstranění z vašich systémů Linux. Než se pustím do podrobností, vysvětlím vám, co je to balíček RPM a jak si jej můžete sami nainstalovat, dotazovat, odebrat a hlavně vytvořit.
Tento článek se týká:
- Co je balíček RPM.
- Jak vytvořit balíček RPM.
- Jak nainstalovat, dotazovat a odebrat balíček RPM.
Co je balíček RPM?
RPM znamená Red Hat Package Manager . Byl vyvinut společností Red Hat a primárně se používá na operačních systémech Linux založených na Red Hat (Fedora, CentOS, RHEL atd.).
Balíček RPM používá .rpm
a je to svazek (sbírka) různých souborů. Může obsahovat následující:
- Binární soubory, známé také jako spustitelné soubory (
nmap
,stat
,xattr
,ssh
,sshd
, a tak dále). - Konfigurační soubory (
sshd.conf
,updatedb.conf
,logrotate.conf
, atd.). - Soubory dokumentace (
README
,TODO
,AUTHOR
, atd.).
Název balíčku RPM má tento formát:
<name>-<version>-<release>.<arch>.rpm
Příklad:
bdsync-0.11.1-1.x86_64.rpm
Některé balíčky také obsahují zkrácenou verzi distribuce, pro kterou byly vytvořeny, jako například:
bdsync-0.11.1-1.el8.x86_64.rpm
[ Také by vás mohlo těšit: Správa linuxových balíčků pomocí YUM a RPM ]
Jak vytvořit balíček RPM
K vytvoření balíčku RPM budete potřebovat následující komponenty:
- Pracovní stanice nebo virtuální stroj s distribucí založenou na RPM, jako je RHEL nebo Fedora.
- Software pro sestavení balíčku.
- Zdrojový kód pro balíček.
- Soubor SPEC pro vytvoření RPM.
Instalace požadovaného softwaru
K sestavení balíčku RPM je třeba nainstalovat následující balíčky:
$ sudo dnf install -y rpmdevtools rpmlint
Po instalaci rpmdevtools
, vytvořte strom souborů, který potřebujete k sestavení RPM balíčků:
$ rpmdev-setuptree
Balíčky RPM vytváříte jako normální (nikoli root) uživatel, takže vaše prostředí pro sestavení je umístěno do vašeho domovského adresáře. Obsahuje tuto adresářovou strukturu:
rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
- BUILD adresář se používá během procesu sestavování balíčku RPM. Zde jsou dočasné soubory ukládány, přesouvány atd.
- RPMS adresář obsahuje balíčky RPM vytvořené pro různé architektury a noarch, pokud je uvedeno v
.spec
souboru nebo během sestavení. - ZDROJE adresář, jak název napovídá, obsahuje zdroje. Může to být jednoduchý skript, složitý projekt v jazyce C, který je třeba zkompilovat, předkompilovaný program atd. Zdroje jsou obvykle komprimovány jako
.tar.gz
nebo.tgz
soubory. - SPEC adresář obsahuje
.spec
soubory..spec
soubor definuje, jak je balíček sestaven. Více o tom později. - SRPMS adresář obsahuje
.src.rpm
balíčky. Balíček Source RPM nepatří k architektuře nebo distribuci. Skutečná.rpm
sestavení balíčku je založeno na.src.rpm
balíček.
.src.rpm
balíček je velmi flexibilní, protože jej lze sestavit a znovu sestavit na každé jiné distribuci a architektuře založené na RPM.
Nyní jste obeznámeni s obsahem jednotlivých adresářů, takže nyní vytvořte jednoduchý skript k distribuci:
$ cat << EOF >> hello.sh
#!/bin/sh
echo "Hello world"
EOF
Tím se vytvoří skript shellu nazvaný hello.sh
, která na terminál vytiskne „Ahoj světe“. Je to jednoduché, ale na ukázku balení to stačí.
Umístěte skript do určeného adresáře
Chcete-li sestavit balíček pro svůj skript, musíte skript umístit do adresáře, ve kterém ho systém sestavení RPM očekává. Vytvořte pro něj adresář pomocí sémantického verzování jako většina projektů a poté přesuňte hello.sh
do toho:
$ mkdir hello-0.0.1
$ mv hello.sh hello-0.0.1
Většina zdrojového kódu je distribuována jako archiv, takže k vytvoření archivního souboru použijte příkaz tar:
$ tar --create --file hello-0.0.1.tar.gz hello-0.0.1
Poté přesuňte tarball, který jste právě vytvořili, do SOURCES
adresář:
$ mv hello-0.0.1.tar.gz SOURCES
Vytvořte soubor .spec
Balíček RPM je definován pomocí .spec
soubor. Syntaxe .spec
soubor je přísný, ale rpmdev
může pro vás vygenerovat standardní soubor:
$ rpmdev-newspec hello
Tím se vygeneruje soubor s názvem hello.spec
, kterou musíte přesunout do SPECS
adresář. Spusťte tree ~/rpmbuild
abyste viděli, jak vypadá struktura adresářů:
/home/tux/rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
│ └── hello-0.0.1.tar.gz
├── SPECS
│ └── hello.spec
└── SRPMS
Vygenerovaný hello.spec
poskytuje dobrý výchozí bod, ale neobsahuje žádné konkrétní informace o tom, co budujete. Vygenerovaný .spec
předpokládá, že budu kompilovat a sestavovat software.
Balíte skript Bash, takže můžete udělat určité zjednodušení. Například neexistuje žádné Sestavení proces, protože neexistuje žádný kód ke kompilaci. Přidal jsem BuildArch:noarch protože tento balíček je platný pro 32-bit, 64-bit, Arm a jakoukoli jinou CPU architekturu, na které běží Bash.
Také jsem přidal Vyžaduje:bash takže balíček zajistí instalaci Bash. Tento jednoduchý skript "ahoj světe" samozřejmě běží na jakémkoli shellu, ale to neplatí pro všechny skripty, takže je to dobrý způsob, jak demonstrovat závislosti.
Name: hello
Version: 0.0.1
Release: 1%{?dist}
Summary: A simple hello world script
BuildArch: noarch
License: GPL
Source0: %{name}-%{version}.tar.gz
Requires: bash
%description
A demo RPM build
%prep
%setup -q
%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/%{_bindir}
cp %{name}.sh $RPM_BUILD_ROOT/%{_bindir}
%clean
rm -rf $RPM_BUILD_ROOT
%files
%{_bindir}/%{name}.sh
%changelog
* Sun Nov 18 2020 Valentin Bajrami <[email protected]> - 0.0.1
- First version being packaged
Jak můžete říci, v .spec
je mnoho zkratek soubory. Říká se jim makra a v dokumentaci k balení Fedory je skvělý seznam toho, co je k dispozici. Je důležité používat makra v .spec
soubory. Pomáhají zajistit konzistenci napříč všemi systémy RPM, pomáhají vám vyhnout se chybám v názvech souborů a číslování verzí a usnadňují aktualizaci .spec
při vydání nové verze skriptu.
Je například nutné, abyste přesně uvedli, které soubory jsou nainstalovány pod %files sekce. Zde jsem výslovně uvedl následující řádek:
%files
%{_bindir}/%{name}.sh
Funguje to, protože chci, aby skript přešel do %{_bindir} (což je makro, které se překládá jako /usr/bin
ve výchozím nastavení, ale lze jej konfigurovat, když uživatelé chtějí instalovat do jiného umístění, například /usr/local/bin
). Hodnoty makra můžete ověřit spuštěním:
$ rpm --eval '%{_bindir}'
/usr/bin
Další užitečná makra:
%{name}
název balíčku (jak je definován v Název: pole)%{version}
verze balíčku (jak je definováno v Verze: pole)%{_datadir}
sdílená data (/usr/sbin
ve výchozím nastavení)%{_sysconfdir}
konfigurační adresář (/etc
ve výchozím nastavení)
Kontrola chyby v souboru .spec (rpmlint)
rpmlint
příkaz může najít chyby v .spec
soubory:
$ rpmlint ~/rpmbuild/SPECS/hello.spec
SPECS/hello.spec: W: no-%build-section
SPECS/hello.spec: W: invalid-url Source0: hello-0.0.1.tar.gz
0 packages and 1 specfiles checked; 0 errors, 2 warnings.
Jsou hlášeny 2 chyby, ale obě jsou přijatelné. Není potřeba sestavit žádný kód, takže není potřeba %sestavení a zdrojový archiv je lokální soubor a nemá síťovou adresu URL.
Všechno vypadá dobře.
Sestavení balíčku (rpmbuild)
Chcete-li sestavit balíček RPM, použijte rpmbuild
příkaz. Dříve v tomto tutoriálu jsem zmínil rozdíl mezi .src.rpm
(zdrojový balíček RPM) a .rpm
balíček.
Chcete-li vytvořit .src
rpm balíček:
$ rpmbuild -bs ~/rpmbuild/SPECS/hello.spec
Parametry -bs
mají následující význam:
- -b:sestavení
- -s:zdroj
Chcete-li vytvořit binární balíček .rpm:
$ rpmbuild -bb ~/rpmbuild/SPECS/rm-ssh-offendingkey.spec
Parametry -bb
mají následující význam:
- -b:sestavení
- -b:binární
Použijte -ba
postavit obojí.
Po dokončení procesu sestavení máte následující adresářovou strukturu:
$ tree ~/rpmbuild/
/home/tux/rpmbuild/
├── BUILD
│ └── hello-0.0.1
│ ├── hello.sh
├── BUILDROOT
├── RPMS
│ └── noarch
│ └── hello-0.0.1-1.el8.noarch.rpm
├── SOURCES
│ └── hello-0.0.1.tar.gz
├── SPECS
│ └── hello.spec
└── SRPMS
Instalace balíčku RPM
Po úspěšném sestavení balíčku můžete nainstalovat balíček RPM pomocí dnf
příkaz:
$ sudo dnf install ~/rpmbuild/RPMS/noarch/hello-0.0.1-1.el8.noarch.rpm
Alternativně jej lze nainstalovat pomocí rpm
příkaz přímo:
$ sudo rpm -ivh ~/rpmbuild/RPMS/noarch/hello-0.0.1-1.el8.noarch.rpm
Ověřte, že byl balíček nainstalován
Chcete-li ověřit, zda byl balíček správně nainstalován, spusťte následující příkaz:
$ rpm -qi hello
Name : hello
Version : 0.0.1
Release : 1
Architecture: noarch
Install Date: Mon 09 Nov 2020 01:29:51 AM CET
Group : Unspecified
Size : 294
License : GPL
Signature : (none)
Source RPM : hello-0.0.1-1.el8.src.rpm
Build Date : Mon 09 Nov 2020 01:08:14 AM CET
Build Host : slimmerAI
Summary : A simple hello world script
Description : A demo RPM build
%changelog záznam balíku lze také zobrazit:
$ rpm -q hello --changelog
* Sun Nov 08 2020 Valentin Bajrami <[email protected]> - 0.1
- First version being packaged
Podívejte se, co je v balíčku RPM
Je snadné zjistit, které soubory obsahuje balíček RPM:
$ rpm -ql hello
/usr/bin/hello.sh
Odebrání balíčku RPM
Odebrání balíčku ze systému je stejně snadné jako jeho instalace. Můžete použít dnf
příkaz:
$ sudo dnf remove hello
Nebo rpm
příkaz přímo:
$ sudo rpm --verbose --erase hello
Poslední myšlenky
V tomto dokumentu jsem pokryl úplné základy balení, včetně toho, jak sestavit, nainstalovat a odstranit balíček RPM z vašeho systému. .spec
Při vytváření pokročilejšího softwaru může být soubor velmi komplikovaný, ale můžete si přečíst příklady ze skutečného světa na veřejných úložištích softwaru, jako je src.fedoraproject.org, abyste se dozvěděli více.
[ Bezplatný online kurz:Technický přehled Red Hat Enterprise Linux. ]