GNU/Linux >> Znalost Linux >  >> Linux

Jak vytvořit balíček RPM pro Linux

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. ] 


Linux
  1. Jak sestavit rpm balíčky

  2. Jak zobrazit seznam souborů nainstalovaných z RPM nebo DEB balíčku v Linuxu

  3. Jak vytvořit skript příkazu Linux

  1. Jak zabalit aplikace Python pro Linux

  2. Jak vytvořit službu Systemd v Linuxu

  3. Jak vytvořit odkládací soubor v Linuxu

  1. Jak používat pkgsrc na Linuxu

  2. Jak vytvořit swap v Linuxu

  3. Jak zkontrolovat integritu balíčku rpm v Linuxu