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 syntaxirpmbuild
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
exitVš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/motdKomentář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.specSpusť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 vql
.)[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.