Ten kto tworzył kiedyś paczki .deb, wie, że cały proces może w końcu człowieka nieco przytłoczyć. Paczka, jak to paczka, budowana jest ze źródeł i konfigurowana przez jej opiekuna. Z reguły ludzie instalują kompilowane pakiety via make install . Niektórzy idą o krok dalej i używają do tego celu narzędzi typu checkinstall . I wszystko jest w miarę w porządku, przynajmniej jeśli chodzi o utrzymywanie jednej paczki -- przeprowadzamy kompilację tylko raz, po czym instalujemy dany pakiet i zapominamy o nim. Niemniej jednak, tego typu postępowanie może doprowadzić nasz system na skraj niestabilności. My tutaj nie będziemy zajmować się zbytnio sposobem w jaki powinno się tworzyć paczki .deb, a jedynie tym jak je przechowywać.

Mając wiele pakietów, które przerabiamy sobie lokalnie na własne potrzeby, trzeba pomyśleć o jakimś sposobie, który by nam ułatwił zarządzanie tymi pakietami. Oczywiście nie muszą to być tylko rekompilowane pakiety z nałożonymi przez nas zmianami -- jeśli opiekun debiana przeznaczony do czuwania nad określoną paczką się opieprza, możemy zwyczajnie zaktualizować sobie pakiet w oparciu o już wcześniej przygotowany przez tego kogoś katalog debian/. Podobnie sprawa ma się z oprogramowaniem, którego nie ma, lub, które nigdy nie trafi do oficjalnego repozytorium -- możemy dodać je sobie bez większego problemu. Dla tych wszystkich osieroconych pakietów możemy stworzyć lokalne repozytorium.

Przygotowywanie katalogu pod repozytorium

Jest kilka różnych sposobów na tworzenie repozytoriów [1] i tutaj zostanie przedstawiony ten z wykorzystaniem oprogramowania reprepro . Po wgraniu wspomnianego pakietu, przeznaczamy pod repo jakiś folder na dysku, np. /repozytorium/debian/ , przy czym, sam katalog może być również w posiadaniu zwykłego użytkownika -- nie trzeba do obsługi repozytorium zaciągać wtedy użytkownika root. Po tym jak już ustalimy katalog, przechodzimy do niego:

# cd /repozytorium/debian/

Będąc już w katalogu, tworzymy podkatalog conf/ a w nim plik distributions o poniższej treści:

Origin: apt.morfikownia.lh
Label: debian
Suite: testing
Codename: jessie
Version: testing
Architectures: i386 amd64 source
Components: main non-free contrib
UDebComponents: main contrib non-free
Description: morfik's repository for debian testing
SignWith: 771B6520

Origin: apt.morfikownia.lh
Label: debian
Suite: unstable
Codename: sid
Version: unstable
Architectures: i386 amd64 source
Components: main non-free contrib
UDebComponents: main contrib non-free
Description: morfik's repository for debian unstable
SignWith: 771B6520

Origin: apt.morfikownia.lh
Label: debian
Suite: experimental
Codename: experimental
Version: experimental
Architectures: i386 amd64 source
Components: main non-free contrib
UDebComponents: main contrib non-free
Description: morfik's repository for debian experimental
SignWith: 771B6520
NotAutomatic: yes
ButAutomaticUpgrades: yes

Mamy tutaj trzy gałęzie: testing , sid oraz experimental . Można sobie to oczywiście dostosować i jeśli potrzebujemy jedynie sida, to kasujemy dwa pozostałe bloki.

Wszystkie użyte parametry powinny raczej opisywać same siebie i nie potrzeba dodatkowych wyjaśnień. Natomiast jeśli ktoś chce coś więcej poczytać o nich, w manie reprepro są one dokładnie opisane. W oparciu o te opcje, apt/aptitude będzie identyfikował nasze repozytorium. W powyższym configu jest też określony klucz, SignWith , którym to będą podpisywane paczki przy wrzucaniu ich przez nas do repozytorium. Jeśli nie mamy klucza GPG, to przydałoby się go stworzyć [2] i odpowiednio uzupełnić numer klucza. Ta opcja nie jest jednak wymagana.

Dodatkowo, w katalogu conf/ możemy stworzyć plik options , który to będzie zawierał opcje programu reprepro, te które zwykle się dopisuje przy jego wywoływaniu -- wtedy zamiast pisać rządek parametrów, możemy sprecyzować plik konfiguracyjny przy pomocy opcji --confdir . W moim pliku nie ma póki co zbyt wielu opcji, jedynie te poniższe:

basedir /repozytorium/debian
verbose

Dostęp do repozytorium z poziomu www

Repozytorium jest już po częsci przygotowane i można do niego zacząć wrzucać paczuszki. Niemniej jednak, będzie ono działać jedynie na lokalnej maszynie. Jeśli mamy jakieś hosty w sieci, możemy dla nich stworzyć prawdziwe lokalne repozytorium przy pomocy apache. Jeśli chcemy takiej funkcjonalności, może nawet stawiamy repozytorium gdzieś na publicznym adresie, to po zainstalowaniu apache, musimy przeprowadzić szereg kroków.

Tworzymy virtualnego hosta w pliku /etc/apache2/sites-enabled/000-default.conf -- dodajemy tam poniższą zwrotkę:

<VirtualHost *:80>
    ServerName deb.morfikownia.lh
    ServerAdmin morfik@localhost
    DocumentRoot /repozytorium/
    ErrorLog ${APACHE_LOG_DIR}/error_repo.log
    CustomLog ${APACHE_LOG_DIR}/access_repo.log combined
</VirtualHost>

Definiujemy blok dla katalogu /repozytorium/ w pliku /etc/apache2/apache2.conf :

# Sets the default security model of the Apache2 HTTPD server. It does
# not allow access to the root filesystem outside of /usr/share and /var/www.
# The former is used by web applications packaged in Debian,
# the latter may be used for local directories served by the web server. If
# your system is serving content from a sub-directory in /srv you must allow
# access here, or in any related virtual host.

...

<Directory /repozytorium/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>
...

Następnie tworzymy konfigurację dla pewnych folderów w repo by nie można było uzyskać do nich dostępu z poziomu www. W pliku /etc/apache2/conf-enabled/repozytorium.conf dopisujemy poniższe linijki:

<Directory /repozytorium/ >
        # We want the user to be able to browse the directory manually
        Options Indexes FollowSymLinks Multiviews
        Order allow,deny
        Allow from all
</Directory>

# This syntax supports several repositories, e.g. one for Debian, one for Ubuntu.
# Replace * with debian, if you intend to support one distribution only.
<Directory "/repozytorium/debian/db/">
        Order allow,deny
        Deny from all
</Directory>

<Directory "/repozytorium/debian/conf/">
        Order allow,deny
        Deny from all
</Directory>

<Directory "/repozytorium/debian/incoming*/">
        Order allow,deny
        Deny from all
</Directory>

Włączamy konfigurację przy pomocy a2enconf lub też linkujemy powyższy plik do katalogu /etc/apache2/conf-enabled/ i sprawdzamy poprawność konfiguracji:

# apache2ctl configtest
Syntax OK

Po zresetowaniu/przeładowaniu apache, repozytorium powinno być już dostępne pod adresem deb.morfikownia.lh .

Importowanie pierwszego pakietu

By przetestować czy repo działa, dodajmy do niego przykładową paczkę. Przy czym można importować gołe paczki -- te bez źródeł -- wskazując plik .deb , lub też można zaimportować pełny komplet posługując się plikiem .changes :

# reprepro --confdir /repozytorium/debian/conf/ includedeb sid ./amarok_2.8.0-2.1_amd64.deb

W katalogu repozytorium, możemy zaobserwować, że zostało utworzonych szereg innych podkatalogów oraz, że wygenerowanych zostało również kilka dodatkowych plików. Jeśli precyzowaliśmy klucz do repozytorium, powinniśmy także zostać poproszeni o hasło do niego. Sama paczka zaś znajduje się w /repozytorium/debian/pool/main/a/amarok/ .

Wpisy dla apt/aptitude

By apt/aptitude mógł zacząć korzystać z naszego repozytorium, dodajemy poniższe wpisy do pliku /etc/apt/sources.list :


# local #
#   deb     file:/media/Server/repozytorium/debian/ sid main contrib non-free
#   deb-src file:/media/Server/repozytorium/debian/ sid main contrib non-free

    deb     http://deb.morfikownia.lh/debian/ sid main contrib non-free
    deb-src http://deb.morfikownia.lh/debian/ sid main contrib non-free

W zależności od tego czy chcemy korzystać lokalnie czy zdalnie, wybieramy odpowiednie linijki i aktualizujemy listę pakietów przy pomocy aptitude update . Być może będzie również potrzeba dodania klucza od repozytorium do keyringa apt, jeśli tego wcześniej nie zrobiliśmy.

Klucz można, albo importować z pliku, albo z sewera kluczy, np. za pomocą poniższych dwóch linijek:

# gpg --keyserver keyserver.ubuntu.com --recv-keys ID_KLUCZA
# gpg --armor --export ID_KLUCZA | apt-key add -

Jeśli chcielibyśmy by budowane przez nas paczki miały wyższy priorytet niż wszelkie pozostałe paczki w repo debiana, musimy ustawić pinningi w pliku /etc/apt/preferences:

Package: *
Pin: release o=Debian,a=testing
Pin-Priority: 990

Package: *
Pin: origin ""
Pin-Priority: 995

Package: *
Pin: origin deb.morfikownia.lh
Pin-Priority: 995

By sprawdzić czy apt widzi dodaną przez nas paczkę i czy ona ma odpowiedni priorytet, wydajemy poniższe polecenie:

$ apt-cache policy amarok
amarok:
  Installed: 2.8.0-2.1
  Candidate: 2.8.0-2.1
  Version table:
     2.8.0-2.1+b1 0
        990 http://ftp.pl.debian.org/debian/ testing/main amd64 Packages
        500 http://ftp.pl.debian.org/debian/ sid/main amd64 Packages
 *** 2.8.0-2.1 0
        995 file:/repozytorium/debian/ sid/main amd64 Packages
        100 /var/lib/dpkg/status

Z powyższego listingu wychodzi na to, że mamy do wyboru dwie wersje amaroka, jedna z nich jest dostępna w tesingu i sidzie, druga zaś w naszym lokalnym repo. Również priorytety się zgadzają -- domyślne 500 dla sida, 990 dla testinga, i 995 dla lokalnego repo i w przypadku instalacji tego pakietu, zostanie on zainstalowany właśnie z naszego repo.

Operowanie na lokalnym repozytorium

Poniżej jest kilka linijek, których dobrze jest się nauczyć, bo to przy ich pomocy będziemy operować na lokalnym repozytorium.

Dodawanie pakietów do repo:

# reprepro --confdir /repozytorium/debian/conf/ includedeb sid ./amarok_2.8.0-2.1_amd64.deb
# reprepro --confdir /repozytorium/debian/conf/ include sid ./amarok_2.8.0-2.1_amd64.changes

Można również korzystać z opcji: "-C component", "-A architecture", "-S section" oraz "-P priority" w celu dokładniejszego sprecyzowania gdzie dana paczka powinna trafić.

Usuwanie wszystkich pakietów powiązanych ze źródłami:

# reprepro --basedir /repozytorium/debian/ removesrc sid amarok

Listowanie paczek w repozytorium dla sida:

# reprepro --basedir /repozytorium/debian/ list sid
# reprepro --basedir /repozytorium/debian/ list sid amarok

Jeśli chcemy przy pomocy aptitude sprawdzić co znajduje się w naszym repozytorium, wpisujemy:

# aptitude search '~O apt.morfikownia.lh'

I taka mała uwaga jeszcze -- przy dodawaniu paczek trzeba zwracać uwagę na plik .changes, bo jest tam zawarta informacja na temat gałęzi, do której pakiet powinien trafić, przykładowo:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
...
Distribution: unstable
...

W przypadku gdybyśmy chcieli taką paczkę dodać do innej gałęzi, dostaniemy błęda:

.changes put in a distribution not listed within it!
To ignore use --ignore=wrongdistribution.
There have been errors!

I to w zasadzie tyle, przy czym, przy aktualizacji paczki, nie trzeba usuwać uprzednio jej starszej wersji -- reprepro zrobi to automatycznie przy dodawaniu nowszej.

W ten sposób możemy trzymać własne pakiety w jednym miejscu, zarządzać nimi i mieć do nich dostęp przy pomocy natywnych narzędzi debianowych.

Makulatura

Pisane w oparciu o:

http://anonscm.debian.org/gitweb/?p=mirrorer/reprepro.git;a=blob_plain;f=docs/short-howto;hb=HEAD [3]
https://wiki.debian.org/SettingUpSignedAptRepositoryWithReprepro [4]
http://blog.jonliv.es/2011/04/26/creating-your-own-signed-apt-repository-and-debian-packages/ [5]
https://www.debian-administration.org/article/286/Setting_up_your_own_APT_repository_with_upload_support [6]


Przypisy:

  1. https://wiki.debian.org/HowToSetupADebianRepository
  2. http://manpages.debian.org/cgi-bin/man.cgi?query=reprepro&apropos=0&sektion=0&manpath=Debian+unstable+sid&format=html&locale=en
  3. http://anonscm.debian.org/gitweb/?p=mirrorer/reprepro.git;a=blob_plain;f=docs/short-howto;hb=HEAD
  4. https://wiki.debian.org/SettingUpSignedAptRepositoryWithReprepro
  5. http://blog.jonliv.es/2011/04/26/creating-your-own-signed-apt-repository-and-debian-packages/
  6. https://www.debian-administration.org/article/286/Setting_up_your_own_APT_repository_with_upload_support