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ń:

yum -y install ruby-devel rpmbuild gcc
gem install fpm

Możemy zainstalować również najnowszą wersje fpma, prosto z GitHuba. Wtedy wykonujemy następujące polecenia:

gem install specific_install
gem specific_install https://github.com/jordansissel/fpm.git

Jeżeli wszystko wykonało się poprawnie, możemy wydać polecenie fpm -h, aby zobaczyć pomoc. Składnia wygląda następująco:

fpm -s <source type> -t <target type> [list of sources]...

Ź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ń:

yum -y groupinstall "Development Tools"
yum -y install libevent-devel.x86_64

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:

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

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

/sbin/chkconfig --add memcached
/sbin/chkconfig memcached on
/etc/init.d/memcached start

/root/pre-uninstall.sh

if [ $1 -eq 0 ]; then
	/sbin/service memcached stop &> /dev/null || :
	/sbin/chkconfig --del memcached
fi

Potrzebny będzie również plik init.d, aby usługa mogła wystartować. Poniższy kod zapisujemy do pliku /root/memcached:

#!/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

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:

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

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.

Podobne artykuły