GNU/Linux >> Linux Esercitazione >  >> Linux

7 passaggi per creare un pacchetto RPM da Source su CentOS / RedHat

A volte potresti avere accesso a un codice sorgente di un'applicazione open source ma potresti non avere il file RPM per installarlo sul tuo sistema.

In tale situazione, puoi compilare il codice sorgente e installare l'applicazione dal codice sorgente, oppure creare tu stesso un file RPM dal codice sorgente e utilizzare il file RPM per installare l'applicazione.

Potrebbe anche verificarsi una situazione in cui desideri creare un pacchetto RPM personalizzato per l'applicazione che hai sviluppato.

Questo tutorial spiega come creare un pacchetto RPM dal codice sorgente.

Per creare RPM, avrai bisogno del codice sorgente, che di solito significa un file tar compresso che include anche il file SPEC.

Il file SPEC in genere contiene istruzioni su come creare RPM, quali file fanno parte del pacchetto e dove dovrebbe essere installato.

L'RPM esegue le seguenti attività durante il processo di compilazione.

  1. Esegue i comandi e le macro menzionati nella sezione di preparazione del file delle specifiche.
  2. Controlla il contenuto dell'elenco dei file
  3. Esegue i comandi e le macro nella sezione build del file delle specifiche. In questo passaggio vengono eseguite anche le macro dall'elenco dei file.
  4. Crea il file del pacchetto binario
  5. Crea il file del pacchetto sorgente

Una volta che l'RPM ha eseguito i passaggi precedenti, crea il file del pacchetto binario e il file del pacchetto sorgente.

Il file del pacchetto binario è costituito da tutti i file di origine insieme a tutte le informazioni aggiuntive per installare o disinstallare il pacchetto.

Di solito è abilitato con tutte le opzioni per l'installazione del pacchetto specifiche della piattaforma. Il file di pacchetto binario contiene applicazioni complete o librerie di funzioni compilate per una particolare architettura. Il pacchetto sorgente di solito è costituito dal file tar compresso originale, dal file spec e dalle patch necessarie per creare il file del pacchetto binario.

Vediamo come creare un semplice sorgente e pacchetti RPM BIN utilizzando un file tar.

Se non conosci il pacchetto rpm, potresti prima voler capire come utilizzare il comando rpm per installare, aggiornare e rimuovere pacchetti su CentOS o RedHat.

1. Installa il pacchetto rpm-build

Per creare un file rpm basato sul file spec che abbiamo appena creato, dobbiamo usare il comando rpmbuild.

Il comando rpmbuild fa parte del pacchetto rpm-build. Installalo come mostrato di seguito.

# yum install rpm-build

rpm-build dipende dal pacchetto seguente. Se non li hai già installati, yum installerà automaticamente queste dipendenze per te.

elfutils-libelf
rpm
rpm-libs
rpm-python

2. Directory di compilazione RPM

rpm-build creerà automaticamente le seguenti strutture di directory che verranno utilizzate durante la compilazione di RPM.

# ls -lF /root/rpmbuild/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 BUILD/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 BUILDROOT/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 RPMS/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 SOURCES/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 SPECS/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 SRPMS/

Nota:la struttura di directory sopra è sia per CentOS che per RedHat quando si utilizza il pacchetto rpmbuild. Puoi anche usare la directory /usr/src/redhat, ma devi modificare il parametro topdir di conseguenza durante la compilazione di rpm. Se lo stai facendo su SuSE Enterprise Linux, usa la directory /usr/src/packages.

Se vuoi usare la tua struttura di directory invece di /root/rpmbuild, puoi usare una delle seguenti opzioni:

  • Usa l'opzione –buildroot e specifica la directory personalizzata durante rpmbuild
  • Specificare il parametro topdir nel file rpmrc o nel file rpmmacros.

3. Scarica il file Tar di origine

Quindi, scarica il file tar di origine per il pacchetto che desideri creare e salvalo nella directory SOURCES.

Per questo esempio, ho utilizzato il codice sorgente dell'applicazione open source icecase, che è un software server per lo streaming di contenuti multimediali. Ma i passaggi sono esattamente gli stessi per la creazione di RPM per qualsiasi altra applicazione. Devi solo scaricare il codice sorgente corrispondente per l'RPM che stai cercando di creare.

# cd /root/rpmbuild/SOURCES/

# wget http://downloads.xiph.org/releases/icecast/icecast-2.3.3.tar.gz

# ls -l
-rw-r--r--. 1 root root 1161774 Jun 11  2012 icecast-2.3.3.tar.gz

4. Crea il file SPEC

In questo passaggio, dirigiamo RPM nel processo di compilazione creando un file di specifiche. Il file delle specifiche di solito è costituito dalle seguenti otto diverse sezioni:

  1. Preambolo – La sezione del preambolo contiene informazioni sul pacchetto in fase di compilazione e definisce eventuali dipendenze dal pacchetto. In generale, il preambolo è costituito da voci, una per riga, che iniziano con un tag seguito da due punti, e poi alcune informazioni.
  2. %prep – In questa sezione, prepariamo il software per il processo di creazione. Eventuali build precedenti vengono rimosse durante questo processo e il file del file sorgente (.tar) viene espanso, ecc.
  3. Un'altra cosa fondamentale è capire che sono disponibili macro predefinite per eseguire varie opzioni di scelta rapida per creare rpm. È possibile che tu stia utilizzando queste macro quando tenti di creare pacchetti complessi. Nell'esempio seguente, ho usato una macro chiamata %setup che rimuove tutte le build precedenti, decomprime i file di origine e cambia la proprietà dei file. Puoi anche utilizzare gli script sh nella sezione %prep per eseguire questa azione, ma %setup macro semplifica il processo utilizzando script sh predefiniti.
  4. %description:la sezione della descrizione di solito contiene la descrizione del pacchetto.
  5. %build – Questa è la sezione responsabile dell'esecuzione della build. Di solito la sezione %build è uno script sh.
  6. %install – anche la sezione % install viene eseguita come script sh proprio come %prep e %build. Questo è il passaggio utilizzato per l'installazione.
  7. %files – Questa sezione contiene l'elenco dei file che fanno parte del pacchetto. Se i file non fanno parte della sezione %files, non sarà disponibile nel pacchetto. Sono richiesti percorsi completi e puoi impostare gli attributi e la proprietà dei file in questa sezione.
  8. %clean – Questa sezione indica all'RPM di ripulire tutti i file che non fanno parte della normale area di build dell'applicazione. Diciamo per esempio, se l'applicazione crea una struttura di directory temporanea in /tmp/ come parte della sua build, non verrà rimossa. Aggiungendo uno script sh nella sezione %clean, la directory può essere rimossa al termine del processo di compilazione.

Ecco il file SPEC che ho creato per l'applicazione icecast per creare un file RPM.

# cat /root/rpmbuild/SPECS/icecast.spec
Name:           icecast
Version:        2.3.3
Release:        0
Summary:        Xiph Streaming media server that supports multiple formats.
Group:          Applications/Multimedia
License:        GPL
URL:            http://www.icecast.org/
Vendor:         Xiph.org Foundation [email protected]
Source:         http://downloads.us.xiph.org/releases/icecast/%{name}-%{version}.tar.gz
Prefix:         %{_prefix}
Packager: 	Karthik
BuildRoot:      %{_tmppath}/%{name}-root

%description
Icecast is a streaming media server which currently supports Ogg Vorbis
and MP3 audio streams. It can be used to create an Internet radio
station or a privately running jukebox and many things in between.
It is very versatile in that new formats can be added relatively
easily and supports open standards for commuincation and interaction.

%prep
%setup -q -n %{name}-%{version}

%build
CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix} --mandir=%{_mandir} --sysconfdir=/etc

make

%install
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT

make DESTDIR=$RPM_BUILD_ROOT install
rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/%{name}

%clean
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
%doc README AUTHORS COPYING NEWS TODO ChangeLog
%doc doc/*.html
%doc doc/*.jpg
%doc doc/*.css
%config(noreplace) /etc/%{name}.xml
%{_bindir}/icecast
%{_prefix}/share/icecast/*

%changelog

In this file, under % prep section you may noticed the macro “%setup -q -n %{name}-%{version}”. This macro executes the following command in the background.

cd /usr/src/redhat/BUILD
rm -rf icecast
gzip -dc /usr/src/redhat/SOURCES/icecast-2.3.3.tar.gz | tar -xvvf -
if [ $? -ne 0 ]; then
  exit $?
fi
cd icecast
cd /usr/src/redhat/BUILD/icecast
chown -R root.root .
chmod -R a+rX,g-w,o-w .

Nella sezione %build, vedrai il CFLAGS con le opzioni di configurazione che definisce le opzioni che possono essere utilizzate durante l'installazione dell'RPM e l'opzione del prefisso, la directory obbligatoria per essere presente per l'installazione e la directory sysconfig in cui è necessario copiare i file di sistema .

Sotto quella riga, vedrai l'utilità make che determina l'elenco dei file da compilare e li compila in modo appropriato.

Nella sezione % install, la riga sotto %install che dice "make install" viene utilizzata per prendere i binari compilati dal passaggio precedente e installarli o copiarli nelle posizioni appropriate in modo che sia possibile accedervi.

5. Crea il file RPM usando rpmbuild

Una volta che il file SPEC è pronto, puoi iniziare a creare il tuo rpm con il comando rpm –b. L'opzione –b viene utilizzata per eseguire tutte le fasi del processo di compilazione. Se vedi degli errori durante questa fase, devi risolverli prima di riprovare. Gli errori saranno solitamente delle dipendenze della libreria e puoi scaricarlo e installarlo se necessario.

# cd /root/rpmbuild/SPECS

# rpmbuild -ba icecast.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.Kohe4t
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
+ rm -rf icecast-2.3.3
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/icecast-2.3.3.tar.gz
+ /bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd icecast-2.3.3
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.ynm7H7
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd icecast-2.3.3
+ CFLAGS='-O2 -g'
+ ./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking for gcc... gcc
..
..
..
Wrote: /root/rpmbuild/SRPMS/icecast-2.3.3-0.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.dzahrv
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd icecast-2.3.3
+ '[' /root/rpmbuild/BUILDROOT/icecast-2.3.3-0.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/icecast-2.3.3-0.x86_64
+ exit 0

Nota:se stai usando SuSE Linux, se rpmbuild non è disponibile, prova a usare “rpm -ba” per compilare il pacchetto rpm.

Durante l'installazione di rpmbuild sopra, potresti notare i seguenti messaggi di errore:

Errore 1:impossibile trovare la configurazione XSLT

checking for xslt-config... no
configure: error: XSLT configuration could not be found
error: Bad exit status from /var/tmp/rpm-tmp.8J0ynG (%build)
RPM build errors:
    Bad exit status from /var/tmp/rpm-tmp.8J0ynG (%build)

Soluzione 1:installa libxstl-devel

Per xslt-config, devi installare il pacchetto libxstl-devel come mostrato di seguito.

yum install libxstl-devel

Questo installerà anche le seguenti dipendenze:

  • libgcrypt
  • libgcrypt-devel
  • libgpg-error-devel

Errore 2:errore libvorbis

checking for libvorbis... configure: error: must have Ogg Vorbis v1.0 or above installed
error: Bad exit status from /var/tmp/rpm-tmp.m4Gk3f (%build)

Soluzione 2:installa libvorbis-devel

Per Ogg Vorbis v1.0, installa il pacchetto libvorbis-devel come mostrato di seguito:

yum install libvorbis-devel

Questo installerà anche le seguenti dipendenze:

  • libegg
  • libogg-devel
  • libvorbis

6. Verifica i file RPM di origine e binari

Una volta completata rpmbuild, puoi verificare che rpm sorgente e rpm binario sia stato creato nelle directory seguenti.

# ls -l /root/rpmbuild/SRPMS/
-rw-r--r-- 1 root root 1162483 Aug 25 15:46 icecast-2.3.3-0.src.rpm

# ls -l /root/rpmbuild/RPMS/x86_64/
-rw-r--r--. 1 root root 349181 Feb  4 12:54 icecast-2.3.3-0.x86_64.rpm

7. Installa il file RPM da verificare

Come passaggio finale, puoi installare il file rpm binario per verificare che venga installato correttamente e che tutte le dipendenze siano state risolte.

# rpm -ivvh /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm
D: ============== /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm
D: loading keyring from pubkeys in /var/lib/rpm/pubkeys/*.key
D: couldn't find any keys in /var/lib/rpm/pubkeys/*.key
D: loading keyring from rpmdb
D: opening  db environment /var/lib/rpm cdb:mpool:joinenv
D: opening  db index       /var/lib/rpm/Packages rdonly mode=0x0
D:  read h#     210 Header sanity check: OK
D: added key gpg-pubkey-c105b9de-4e0fd3a3 to keyring
D: Using legacy gpg-pubkey(s) from rpmdb
D: Expected size:       349181 = lead(96)+sigs(180)+pad(4)+data(348901)
D:   Actual size:       349181
D: ========== relocations
D:      added binary package [0]
D: found 0 source and 1 binary packages
D: ========== +++ icecast-2.3.3-0 x86_64/linux 0x2
..
..

Dopo l'installazione di cui sopra, puoi verificare che il tuo file rpm personalizzato sia stato installato correttamente come mostrato di seguito.

# rpm -qa icecast
icecast-2.3.3-0.x86_64

Linux
  1. Come elencare i file installati da un pacchetto RPM o DEB in Linux

  2. Come creare pacchetti dal sorgente utilizzando CheckInstall

  3. 4 passaggi per creare utenti Linux da un file CSV con Ansible

  4. Comandi RPM

  5. Come trovare a quale pacchetto appartiene un eseguibile o un file in RedHat/CentOS/Fedora?

Come costruire Nginx dal sorgente su CentOS 7

Come installare RPM su CentOS

Come creare pacchetti Debian dal sorgente

Come installare i pacchetti RPM su CentOS 8

Come creare un pacchetto RPM da un Tarball

Come compilare il kernel Linux dal sorgente per creare un kernel personalizzato