Tags Posts tagged with "fpm"

fpm

Paczki, RPM

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.pl>" –url http://osworld.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 polecenia uname -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.

Polecane

Python

0 284
Zostało ogłoszone, że Python 3 pozostanie jedyną wersją, która będzie rozwijana pod kątem luk w zabezpieczeniach i błędów. Po...