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
.specsouboru 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.gznebo.tgzsoubory. - SPEC adresář obsahuje
.specsoubory..specsoubor definuje, jak je balíček sestaven. Více o tom později. - SRPMS adresář obsahuje
.src.rpmbalíčky. Balíček Source RPM nepatří k architektuře nebo distribuci. Skutečná.rpmsestavení balíčku je založeno na.src.rpmbalíč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/sbinve výchozím nastavení)%{_sysconfdir}konfigurační adresář (/etcve 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. ]