GNU/Linux >> Znalost Linux >  >> Linux

Jak sestavit rpm balíčky

K instalaci softwaru na Red Hat a Fedora Linux používám správce balíčků založené na rpm od doby, kdy jsem před více než 20 lety začal používat Linux. Použil jsem otáčky za minutu samotný program, mňam a DNF , což je blízký potomek yum, k instalaci a aktualizaci balíčků na mých hostitelích Linuxu. Nástroje yum a DNF jsou obaly kolem nástroje rpm, které poskytují další funkce, jako je schopnost najít a nainstalovat závislosti balíčků.

Další zdroje pro Linux

  • Cheat pro příkazy Linuxu
  • Cheat sheet pro pokročilé příkazy systému Linux
  • Bezplatný online kurz:Technický přehled RHEL
  • Síťový cheat pro Linux
  • Cheat sheet SELinux
  • Cheat pro běžné příkazy pro Linux
  • Co jsou kontejnery systému Linux?
  • Naše nejnovější články o Linuxu

V průběhu let jsem vytvořil řadu Bash skriptů, z nichž některé mají samostatné konfigurační soubory, které rád instaluji na většinu svých nových počítačů a virtuálních strojů. Dospělo to k bodu, že instalace všech těchto balíčků zabrala spoustu času, a tak jsem se rozhodl tento proces zautomatizovat vytvořením balíčku rpm, který bych mohl zkopírovat na cílové hostitele a nainstalovat všechny tyto soubory na jejich správná umístění. Přestože ot./min. nástroj byl dříve používán k vytváření balíčků rpm, tato funkce byla odstraněna a byl vytvořen nový nástroj, rpmbuild, byl vytvořen za účelem vytváření nových otáček.

Když jsem s tímto projektem začínal, našel jsem velmi málo informací o vytváření balíčků rpm, ale podařilo se mi najít knihu Maximální otáčky , to mi pomohlo přijít na to. Ta kniha je nyní poněkud zastaralá, stejně jako drtivá většina informací, které jsem našel. Je také vyprodaný a použité kopie jdou za stovky dolarů. Online verze Maximum RPM je k dispozici zdarma a je průběžně aktualizována. Web RPM má také odkazy na jiné weby, které mají spoustu dokumentace o rpm. Jaké další informace jsou k dispozici, bývají stručné a očividně předpokládají, že již o procesu máte dobré znalosti.

Navíc každý z dokumentů, které jsem našel, předpokládá, že kód je potřeba sestavit ze zdrojů jako ve vývojovém prostředí. Nejsem vývojář. Jsem správce systému a my správci systému máme různé potřeby, protože nekompilujeme – nebo bychom neměli – kód, který bychom mohli používat pro administrativní úkoly; měli bychom používat shell skripty. Nemáme tedy žádný zdrojový kód v tom smyslu, že je to něco, co je třeba zkompilovat do binárních spustitelných souborů. To, co máme, je zdroj, který je zároveň spustitelným souborem.

Z větší části by tento projekt měl být prováděn jako uživatel bez oprávnění root. Rpm by nikdy neměl vytvářet root, ale pouze neprivilegovaní uživatelé. Uvedu, které části by měly být provedeny jako root a které uživatelem bez oprávnění root a bez oprávnění.

Příprava

Nejprve otevřete jednu terminálovou relaci a su ke kořeni. Ujistěte se, že používáte - možnost zajistit, že je povoleno úplné kořenové prostředí. Nevěřím, že by správci systému měli používat sudo pro jakékoli administrativní úkony. Zjistěte proč v mém osobním příspěvku na blogu:Skuteční SysAdmins nesudo .

[student@testvm1 ~]$ su -
Heslo:
[root@testvm1 ~]#

Vytvořte studenta, kterého lze použít pro tento projekt, a nastavte pro tohoto uživatele heslo.

[root@testvm1 ~]# useradd -c "Student User" student 
[root@testvm1 ~]# passwd student
Změna hesla pro uživatele student.
Nové heslo:
Znovu zadejte nové heslo:
passwd:všechny ověřovací tokeny byly úspěšně aktualizovány.
[root@testvm1 ~]#

Sestavení balíčků rpm vyžaduje rpm-build balíček, který pravděpodobně ještě není nainstalován. Nainstalujte jej nyní jako root. Všimněte si, že tento příkaz také nainstaluje několik závislostí. Počet se může lišit v závislosti na balíčcích již nainstalovaných na vašem hostiteli; nainstaloval na můj testovací virtuální počítač celkem 17 balíčků, což je docela minimum.

dnf install -y rpm-build 

Zbytek tohoto projektu by měl provádět jako uživatel student, pokud není výslovně uvedeno jinak. Otevřete další terminálovou relaci a použijte su přepnout na tohoto uživatele a provést zbytek těchto kroků. Stáhněte si mnou připravený tarball vývojové adresářové struktury, utils.tar, z GitHubu pomocí následujícího příkazu:

wget https://github.com/opensourceway/how-to-rpm/raw/master/utils.tar 

Tento tarball obsahuje všechny soubory a Bash skripty, které se nainstalují do konečného rpm. K dispozici je také kompletní spec soubor, který můžete použít k sestavení rpm. Půjdeme do podrobností o každé části souboru spec.

Jako uživatel student pomocí svého domovského adresáře jako svého současného pracovního adresáře (pwd) rozbalte tarball.

[student@testvm1 ~]$ cd ; tar -xvf utils.tar  

Použijte tree příkaz k ověření, že adresářová struktura ~/development a obsažené soubory vypadají jako následující výstup:

[student@testvm1 ~]$ vývoj stromu/
vývoj/
├── licence
│   ├── Copyright.and.GPL.Notice.txt
│   └ ── GPL_LICENSE.txt
├── skripty
│   ├── create_motd
│   ├── die
│   ├└── mymotd sys
─ mymotd br />└── spec
    └── utils.spec

3 adresáře, 7 souborů
[student@testvm1 ~]$

mymotd skript vytvoří datový tok „Message Of The Day“, který je odeslán do stdout. create_motd skript spustí mymotd skripty a přesměruje výstup do souboru /etc/motd. Tento soubor se používá k zobrazení denní zprávy uživatelům, kteří se vzdáleně přihlásí pomocí SSH.

die script je můj vlastní skript, který obaluje kill příkaz v kousku kódu, který dokáže najít spuštěné programy, které odpovídají zadanému řetězci, a zabít je. Používá kill -9 aby bylo zajištěno, že nemohou ignorovat zprávu o ukončení.

sysdata skript může chrlit desítky tisíc řádků dat o hardwaru vašeho počítače, nainstalované verzi Linuxu, všech nainstalovaných balíčcích a metadatech vašich pevných disků. Používám ho k dokumentaci stavu hostitele v určitém okamžiku. Později jej mohu použít pro referenci. Dělal jsem to, abych vedl záznamy o hostitelích, které jsem zákazníkům nainstaloval.

Možná budete muset změnit vlastnictví těchto souborů a adresářů na student.student. V případě potřeby to proveďte pomocí následujícího příkazu:

chown -R student.student development 

Většina souborů a adresářů v tomto stromu bude nainstalována na systémy Fedory podle otáček, které vytvoříte během tohoto projektu.

Vytvoření adresářové struktury sestavení

rpmbuild příkaz vyžaduje velmi specifickou strukturu adresářů. Tuto adresářovou strukturu si musíte vytvořit sami, protože neexistuje žádný automatický způsob. Ve svém domovském adresáři vytvořte následující adresářovou strukturu:

~ ─ rpmbuild
    ├── RPMS
    │   └── noarch
    ├── ZDROJE
    └── ZDROJE
    └──— před>

Nevytvoříme adresář rpmbuild/RPMS/X86_64, protože by to bylo specifické pro 64bitové kompilované binární soubory. Máme skripty shellu, které nejsou specifické pro architekturu. Ve skutečnosti nebudeme používat ani adresář SRPMS, který by obsahoval zdrojové soubory pro kompilátor.

Zkoumání souboru spec

Každý soubor spec má řadu sekcí, z nichž některé mohou být ignorovány nebo vynechány, v závislosti na konkrétních okolnostech sestavení rpm. Tento konkrétní soubor spec není příkladem minimálního souboru potřebného k práci, ale je dobrým příkladem středně složitého souboru spec, který balí soubory, které není třeba kompilovat. Pokud by byla vyžadována kompilace, byla by provedena v %build oddíl, který je v tomto souboru specifikace vynechán, protože není vyžadován.

Preambule

Toto je jediná část souboru spec, která nemá štítek. Skládá se z velké části informací, které vidíte, když příkaz rpm -qi [Package Name] je spuštěn. Každý údaj je jeden řádek, který se skládá z tagu, který jej identifikuje, a textových dat pro hodnotu tagu.

############################################## ################################
# Soubor specifikací pro nástroje
##### ################################################## #########################
# Nakonfigurováno pro vytvoření uživatelem, studentem nebo jiným uživatelem bez root
### ################################################## ###########################
#
Shrnutí:Obslužné skripty pro testování vytváření RPM
Název:utils
Verze:1.0.0
Vydání:1
Licence:GPL
URL:http://www.both.org
Skupina:Systém
Packager:David Both
Vyžaduje:bash
Vyžaduje:screen
Vyžaduje:mc
Vyžaduje:dmidecode
BuildRoot:~/rpmbuild/

# Sestavte s následující syntaxí:
# rpmbuild --target noarch -bb utils.spec

Řádky komentářů jsou ignorovány rpmbuild program. Vždy rád přidám komentář k této sekci, který obsahuje přesnou syntaxi rpmbuild příkaz potřebný k vytvoření balíčku. Tag Summary je krátký popis balíčku. Tagy Name, Version a Release se používají k vytvoření názvu souboru rpm, jako v utils-1.00-1.rpm. Zvyšování čísel vydání a verzí vám umožňuje vytvářet otáčky za minutu, které lze použít k aktualizaci starších verzí.

Značka Licence definuje licenci, pod kterou je balíček uvolněn. Vždy používám variantu GPL. Specifikace licence je důležitá pro objasnění skutečnosti, že software obsažený v balíčku je open source. To je také důvod, proč jsem zahrnul licenci a prohlášení GPL do souborů, které budou nainstalovány.

URL je obvykle webová stránka projektu nebo vlastníka projektu. V tomto případě je to moje osobní webová stránka.

Zajímavý je tag Group, který se obvykle používá pro GUI aplikace. Hodnota tagu Group určuje, která skupina ikon v nabídce aplikací bude obsahovat ikonu pro spustitelný soubor v tomto balíčku. Ve spojení s tagem Icon (který zde nepoužíváme) tag Group umožňuje přidat ikonu a požadované informace pro spuštění programu do struktury menu aplikací.

Tag Packager se používá k určení osoby nebo organizace odpovědné za údržbu a vytvoření balíčku.

Příkazy Requires definují závislosti pro tuto otáčku za minutu. Každý je název balíčku. Pokud jeden ze zadaných balíčků není přítomen, instalační obslužný program DNF se jej pokusí najít v jednom z definovaných úložišť definovaných v /etc/yum.repos.d a nainstalovat jej, pokud existuje. Pokud DNF nemůže najít jeden nebo více požadovaných balíčků, vyvolá chybu označující, které balíčky chybí, a ukončí se.

Řádek BuildRoot určuje adresář nejvyšší úrovně, ve kterém je rpmbuild nástroj najde soubor spec a ve kterém vytvoří dočasné adresáře při sestavování balíčku. Hotový balíček bude uložen v podadresáři noarch, který jsme určili dříve. Komentář ukazující syntaxi příkazu použitou k sestavení tohoto balíčku obsahuje volbu –target noarch , který definuje cílovou architekturu. Protože se jedná o Bash skripty, nejsou spojeny s konkrétní architekturou CPU. Pokud by byla tato možnost vynechána, sestavení by bylo zaměřeno na architekturu CPU, na kterém se sestavení provádí.

rpmbuild program může cílit na mnoho různých architektur a pomocí --target Tato volba nám umožňuje vytvářet balíčky specifické pro architekturu na hostiteli s odlišnou architekturou, než na které se sestavování provádí. Mohl jsem tedy sestavit balíček určený pro použití na architektuře i686 na hostiteli x86_64 a naopak.

Změňte jméno baliče na své a URL na svůj vlastní web, pokud jej máte.

%popis

%description část souboru spec obsahuje popis balíčku rpm. Může být velmi krátký nebo může obsahovat mnoho řádků informací. Náš %description sekce je poměrně stručná.

%description
Sbírka pomocných skriptů pro testování vytváření RPM.

%příprava

%prep sekce je první skript, který se spustí během procesu sestavení. Tento skript se během instalace balíčku nespustí.

Tento skript je pouze skript Bash shell. Připraví adresář sestavení, podle potřeby vytvoří adresáře použité pro sestavení a zkopíruje příslušné soubory do příslušných adresářů. To by zahrnovalo zdroje potřebné pro kompletní kompilaci jako součást sestavení.

Adresář $RPM_BUILD_ROOT představuje kořenový adresář nainstalovaného systému. Adresáře vytvořené v adresáři $RPM_BUILD_ROOT jsou plně kvalifikované cesty, jako je /user/local/share/utils, /usr/local/bin a tak dále v živém souborovém systému.

V případě našeho balíčku nemáme žádné předkompilační zdroje, protože všechny naše programy jsou Bash skripty. Jednoduše tedy zkopírujeme tyto skripty a další soubory do adresářů, kam v nainstalovaném systému patří.

%příprava
######################################## ####################################### Vytvořte strom sestavení a zkopírujte jej soubory z vývojových adresářů    #
# do stromu sestavení. #
############################################ ###################################
echo "BUILDROOT =$RPM_BUILD_ROOT"
mkdir -p $RPM_BUILD_ROOT/usr/local/bin/
mkdir -p $RPM_BUILD_ROOT/usr/local/share/utils

cp /home/student/development/utils/scripts/* $RPM_BUILD_ROOT/usr/local/bin
cp /home/student/development/utils/license/* $RPM_BUILD_ROOT/usr/local/share/utils
cp /home/student/development/utils/spec /* $RPM_BUILD_ROOT/usr/local/share/utils

exit

Všimněte si, že je vyžadován příkaz exit na konci této části.

%souborů

Tato část souboru spec definuje soubory, které se mají nainstalovat, a jejich umístění ve stromu adresářů. Také určuje atributy souboru a vlastníka a vlastníka skupiny pro každý soubor, který se má nainstalovat. Oprávnění a vlastnictví souborů jsou volitelné, ale doporučuji je explicitně nastavit, aby se vyloučila možnost, že tyto atributy budou při instalaci nesprávné nebo nejednoznačné. Adresáře jsou vytvářeny podle potřeby během instalace, pokud ještě neexistují.

%files
%attr(0744, root, root) /usr/local/bin/*
%attr(0644, root, root) /usr/local/share/utils/*

%pre

Tato sekce je v souboru specifikací našeho laboratorního projektu prázdná. Zde by měly být umístěny všechny skripty, které se musí spouštět během instalace rpm, ale před instalací souborů.

%příspěvek

Tato část souboru spec je dalším skriptem Bash. Tento běží po instalaci souborů. Tato sekce může být v podstatě cokoli, co potřebujete nebo chcete, aby to bylo, včetně vytváření souborů, spouštění systémových příkazů a restartování služeb, aby se po provedení změn konfigurace znovu inicializovaly. %post skript pro náš balíček rpm provádí některé z těchto úkolů.

%příspěvek
######################################## ######################################
# Nastavení skriptů MOTD                                                   #           #        br />############################################## #################################
cd /etc
# Uložte staré MOTD, pokud existuje
if [ -e motd ]
pak
   cp motd motd.orig
fi
# Pokud tam ještě není, přidejte odkaz na create_motd do cron.daily
cd /etc/cron.daily
pokud [ ! -e create_motd ]
pak
   ln -s /usr/local/bin/create_motd
fi
# poprvé vytvořte MOTD
/usr/local/ bin/mymotd> /etc/motd

Komentáře obsažené v tomto skriptu by měly objasňovat jeho účel.

%postun

Tato část obsahuje skript, který se spustí po odinstalaci balíčku rpm. Použití rpm nebo DNF k odstranění balíčku odstraní všechny soubory uvedené v %files sekce, ale neodstraní soubory ani odkazy vytvořené %post sekce, takže to musíme vyřešit v této sekci.

Tento skript se obvykle skládá z úkolů čištění, které nelze provést pouhým vymazáním souborů dříve nainstalovaných rpm. V případě našeho balíčku zahrnuje odstranění odkazu vytvořeného %post skript a obnovení uloženého originálu souboru motd.

%postun
# odeberte nainstalované soubory a odkazy
rm /etc/cron.daily/create_motd

# Obnovte původní MOTD, pokud byl zálohován
if [ -e /etc/motd.orig ]
pak
   mv -f /etc/motd.orig /etc/motd
fi

% čisté

Tento skript Bash provádí čištění po procesu sestavení rpm. Dva řádky v %clean sekce níže odstraňte adresáře sestavení vytvořené pomocí rpm-build příkaz. V mnoha případech může být také vyžadováno další vyčištění.

%clean
rm -rf $RPM_BUILD_ROOT/usr/local/bin
rm -rf $RPM_BUILD_ROOT/usr/local/share/utils

%changelog

Tato volitelná textová část obsahuje seznam změn otáček a souborů, které obsahuje. Nejnovější změny jsou zaznamenány v horní části této sekce.

%changelog
* St Aug 29 2018 Your Name
  – Původní balíček obsahuje několik užitečných skriptů. je
    primárně určen k použití k ilustraci procesu
    vytváření RPM.

Nahraďte data v řádku záhlaví svým vlastním jménem a e-mailovou adresou.

Vytváření otáček za minutu

Soubor spec musí být v adresáři SPECS stromu rpmbuild. Považuji za nejjednodušší vytvořit odkaz na skutečný soubor spec v tomto adresáři, aby jej bylo možné upravovat ve vývojovém adresáři a nebylo nutné jej kopírovat do adresáře SPECS. Udělejte z adresáře SPECS své pwd a poté vytvořte odkaz.

cd ~/rpmbuild/SPECS/
ln -s ~/development/spec/utils.spec

Spusťte následující příkaz pro vytvoření rpm. Vytvoření otáček za minutu by mělo trvat jen chvíli, pokud nedojde k žádným chybám.

rpmbuild --target noarch -bb utils.spec 

Zkontrolujte adresář ~/rpmbuild/RPMS/noarch a ověřte, že tam nový rpm existuje.

[student@testvm1 ~]$ cd rpmbuild/RPMS/noarch/
[student@testvm1 noarch]$ ll
celkem 24
-rw-rw-r--. 1 student student 24364 30. srpna 10:00 utils-1.0.0-1.noarch.rpm
[student@testvm1 noarch]$

Testování otáček

Jako root nainstalujte rpm, abyste ověřili, že se nainstaluje správně a že soubory jsou nainstalovány ve správných adresářích. Přesný název rpm bude záviset na hodnotách, které jste použili pro značky v sekci Preambule, ale pokud jste použili ty z ukázky, název rpm bude takový, jaký je znázorněn v ukázkovém příkazu níže:

[root@testvm1 ~]# cd /home/student/rpmbuild/RPMS/noarch/
[root@testvm1 noarch]# ll
celkem 24
-rw-rw-r --. 1 student student 24364 30. srpna 10:00 utils-1.0.0-1.noarch.rpm
[root@testvm1 noarch]# rpm -ivh utils-1.0.0-1.noarch.rpm
Příprava ...                          ################################ [100 %]
Aktualizace / instalace...
   1:utils-1.0.0-1                    ################################ [100 %]

Zkontrolujte /usr/local/bin a ujistěte se, že tam jsou nové soubory. Měli byste také ověřit, že byl vytvořen odkaz create_motd v /etc/cron.daily.

Použijte rpm -q --changelog utils příkaz pro zobrazení seznamu změn. Prohlédněte si soubory nainstalované balíčkem pomocí rpm -ql utils příkaz (to je malé písmeno L v ql .)

[root@testvm1 noarch]# rpm -q --changelog utils
* St 29. srpna 2018 Vaše jméno
- Původní balíček obsahuje několik užitečných skriptů. je
    primárně určen k použití k ilustraci procesu
    vytváření RPM.

[root@testvm1 noarch]# rpm -ql utils
/usr/ local/bin/create_motd
/usr/local/bin/die
/usr/local/bin/mymotd
/usr/local/bin/sysdata
/usr/local/ share/utils/Copyright.and.GPL.Notice.txt
/usr/local/share/utils/GPL_LICENSE.txt
/usr/local/share/utils/utils.spec
[ root@testvm1 noarch]#

Odstraňte balíček.

rpm -e utils 

Experimentování

Nyní změníte soubor spec tak, aby vyžadoval balíček, který neexistuje. To bude simulovat závislost, kterou nelze splnit. Přidejte následující řádek ihned pod existující řádek Vyžaduje:

Requires: badrequire 

Sestavte balíček a pokuste se jej nainstalovat. Jaká zpráva se zobrazí?

Použili jsme rpm příkaz k instalaci a odstranění utils balík. Zkuste nainstalovat balíček pomocí yum nebo DNF. Aby to fungovalo, musíte být ve stejném adresáři jako balíček nebo zadat úplnou cestu k balíčku.

Závěr

Existuje mnoho značek a několik sekcí, které jsme v tomto pohledu na základy vytváření rpm balíčku nepokryli. Další informace mohou poskytnout níže uvedené zdroje. Sestavení rpm balíčků není obtížné; potřebujete jen správné informace. Doufám, že vám to pomůže – trvalo mi měsíce, než jsem na věci přišel sám.

Nepokryli jsme vytváření ze zdrojového kódu, ale pokud jste vývojář, měl by to být od tohoto bodu jednoduchý krok.

Vytváření rpm balíčků je další dobrý způsob, jak být líným správcem systému a ušetřit čas a námahu. Poskytuje snadný způsob distribuce a instalace skriptů a dalších souborů, které jako správci systému musíme nainstalovat na mnoho hostitelů.

Zdroje

  • Edward C. Baily, Maximální otáčky , Sams Publishing, 2000, ISBN 0-672-31105-4

  • Edward C. Baily, Maximální otáčky , aktualizovaná online verze

  • Dokumentace RPM :Tato webová stránka uvádí většinu dostupné online dokumentace pro rpm. Obsahuje mnoho odkazů na jiné webové stránky a informace o rpm.


Linux
  1. Jak používat příkaz apt ke správě balíčků v systému Linux

  2. Jak nainstalovat balíčky z konkrétního úložiště v Linuxu

  3. Je možné sestavit linuxové distro podporující RPM i .deb balíčky?

  1. Jak vytvořit balíček RPM pro Linux

  2. Jak vypsat všechny nainstalované balíčky v Linuxu

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

  1. Jak postavit Flatpak

  2. Jak nainstalovat balíčky RPM na Ubuntu

  3. Jak zkontrolovat dodavatele nainstalovaných RPM balíčků v Linuxu