Istnieje wiele metod tworzenia paczek typu RPM, DEB, PKG jak chodźby pisanie rpmspeców. Ale może być prościej. Jednym z łatwiejszych sposobów jest skorzystanie z oprogramowania Effing Package Management, w skrócie fpm. Kompilując ręcznie program, możemy zbudować z niego paczkę, którą następnie zainstalujemy na pozostałych naszych serwerach.
W artykule skupimy się na dystrybucjach typu CentOS oraz Red Hat. Samo oprogramowanie fpm działa również na Debinach i Ubuntu. Naszym celem będzie zbudowanie paczki RPM dla ręcznie skompilowanej wersji serwera memcached.
Instalacja Effing Package Management
Wiele dystrybucji Linuksa nie posiada na starcie zainstalowanych plików nagłówkowych C dla języka Ruby oraz samego kompilatora. Instalujemy potrzebne oprogramowanie wraz z fpm’em za pomocą poleceń:
[bash]yum -y install ruby-devel rpmbuild gcc
gem install fpm[/bash]
Możemy zainstalować również najnowszą wersje fpma, prosto z GitHuba. Wtedy wykonujemy następujące polecenia:
[bash]gem install specific_install
gem specific_install https://github.com/jordansissel/fpm.git[/bash]
Jeżeli wszystko wykonało się poprawnie, możemy wydać polecenie fpm -h
, aby zobaczyć pomoc. Składnia wygląda następująco:
[bash]fpm -s <source type> -t <target type> [list of sources]…[/bash]
Źródłem plików do naszej przyszłej paczki może być katalog z plikami, rubygem, dowolny plik rpm lub deb, paczka pythona, moduł php pear itp.
Kompilujemy serwer memcached
Do kompilacji memcached, potrzebna nam będzie bilioteka (jej pliki nagłówkowe) libevent-devel
oraz posiadanie odpowiednich kompilatorów w systemie. Najprościej zainstalujemy wszystko za pomocą poleceń:
[bash]yum -y groupinstall "Development Tools"
yum -y install libevent-devel.x86_64[/bash]
Tworzymy również katalog, w którym zainstalujemy skompilowanego memcached, tak by spakować go do paczki rpm. Polecenie mkdir /tmp/installdir
. Następnie kompilujemy i instalujemy sam serwer:
[bash]cd /usr/src
wget http://www.memcached.org/files/memcached-1.4.24.tar.gz
tar -xzf memcached-1.4.24.tar.gz
cd memcached-1.4.24
./configure –prefix=/usr
make -j2
export DESTDIR=/tmp/installdir && make install[/bash]
Po kompilacji oraz instalacji powinniśmy w katalogu /tmp/installdir
, zobaczyć pliki serwera:
[root@build ~]# tree /tmp/installdir/ /tmp/installdir/ └── usr ├── bin │ └── memcached ├── include │ └── memcached │ └── protocol_binary.h └── share └── man └── man1 └── memcached.1 7 directories, 3 files
Przygotowujemy pliki do paczki RPM
Tak naprawdę już teraz możemy tworzyć plik RPM, który będzie poprawnie instalował się w systemie. Chcemy jednak, aby dodatkowo po instalacji paczki, serwer sam startował jako usługa oraz był zatrzymywany podczas usuwania pliku rpm z repozytorium.
Do tego celu musimy przygotować sobie dwa pliki: /root/post-install.sh
oraz /root/pre-uninstall.sh
o następujących zawartościach:
/root/post-install.sh
[bash]/sbin/chkconfig –add memcached
/sbin/chkconfig memcached on
/etc/init.d/memcached start[/bash]
/root/pre-uninstall.sh
[bash]if [ $1 -eq 0 ]; then
/sbin/service memcached stop &> /dev/null || :
/sbin/chkconfig –del memcached
fi[/bash]
Potrzebny będzie również plik init.d
, aby usługa mogła wystartować. Poniższy kod zapisujemy do pliku /root/memcached
:
[bash collapse=”true”]#!/bin/sh
#chkconfig: 345 95 95
#description: Memcached
BASEDIR=/usr
PIDFILE=/var/run/memcached.pid
MEMORY=1024
CONN=1024
MEMCACHED="$BASEDIR/bin/memcached -m $MEMORY -d -P $PIDFILE -u $USER -c $CONN"
ERROR=0
ARGV="$@"
if [ "x$ARGV" = "x" ] ; then
ARGS="help"
fi
for ARG in $@ $ARGS
do
if [ -f $PIDFILE ] && [ -s $PIDFILE ] ; then
PID=`cat $PIDFILE`
if [ "x$PID" != "x" ] && kill -0 $PID 2>/dev/null ; then
STATUS="memcached (pid $PID) running"
RUNNING=1
else
STATUS="memcached (pid $PID?) not running"
RUNNING=0
fi
else
STATUS="memcached (no pid file) not running"
RUNNING=0
fi
case $ARG in
start)
if [ $RUNNING -eq 1 ]; then
echo "$0 $ARG: memcached (pid $PID) already running"
continue
fi
if $MEMCACHED ; then
echo "$0 $ARG: memcached started"
else
echo "$0 $ARG: memcached could not be started"
ERROR=3
fi
;;
stop)
if [ $RUNNING -eq 0 ]; then
echo "stop called – in running eq 0"
echo "$0 $ARG: $STATUS"
continue
fi
if kill $PID ; then
echo "$0 $ARG: memcached process(es) stopped"
else
echo "$0 $ARG: memcached process(es) could not be stopped"
ERROR=4
fi
;;
restart)
if [ $RUNNING -eq 0 ]; then
echo "$0 $ARG: memcached not running, trying to start"
if $MEMCACHED ; then
echo "$0 $ARG: memcached started"
else
echo "$0 $ARG: memcached could not be started"
ERROR=5
fi
else
if kill $PID ; then
if $MEMCACHED ; then
echo "$0 $ARG: memcached restarted"
else
echo "$0 $ARG: memcached could not be started"
ERROR=3
fi
else
echo "$0 $ARG: memcached could not be restarted"
ERROR=6
fi
fi
;;
*)
echo "usage: $0 (start|stop|restart|help)"
cat <<EOF
start – start memcached
stop – stop memcached
restart – restart memcached if running by sending a SIGHUP or start if not running
help – this screen
EOF
ERROR=2
;;
esac
done
exit $ERROR
[/bash]
Budujemy paczkę RPM z użyciem Effing Package Management
Kiedy mamy wszystkie pliki gotowe, możemy zabrać się za zbudowanie paczki RPM. Wydajemy jedno, dość długie polecenie:
[bash]fpm -f –epoch 1 -s dir -t rpm -p /root/memcached-VERSION-ARCH.rpm -v "1.4.24" -n memcached –vendor "OSWorld.pl" –category OSWorld.pl -m "Kamil Porembinski <kamil@osworld.wpopieka.pl>" –url https://osworld.wpopieka.pl –description "OSWorld.pl Memcached Server" –license "none" -C /tmp/installdir –post-install /root/post-install.sh –pre-uninstall /root/pre-uninstall.sh –rpm-init /root/memcached –verbose[/bash]
Na początku może to wszystko wydawać się skomplikowane, ale postaram się objaśnić wszystkie parametry.
-f
– tryb force, nadpisze plik wynikowy jeżeli już istnieje--epoch 1
– w skrócie, pozwala określić, która wersja pakietu jest nowsza-s dir
– przełącznik, który informuje o tym, że źródłem plików do zbudowania rpm’a, będzie katalog-t rpm
– wybieramy typ paczki RPM-p /root/memcached-VERSION-ARCH.rpm
– nazwa pliku wynikowego. Makro VERSION wstawi nam wersję pakietu podaną za pomocą przełącznika-v "1.4.24"
, natomiast makro ARCH pobierze dane o architekturze z wyniku poleceniauname -m
-n memcached
– nazwa paczki RPM-C /tmp/installdir
– informujemy fpma, aby przeszedł pod zadaną ścieżkę i tam szukał plików do spakowania do paczki--post-install /root/post-install.sh
– skrypt uruchamiany tuż po instalacji paczki--pre-uninstall /root/pre-uninstall.sh
– skrypt uruchamiany przed usunięciem paczki--rpm-init /root/memcached
– ścieżka do skryptu startowego
Voilà! Mamy gotową paczkę, którą możemy zainstalować w systemie.
Dziękuję, przydatne.