_____ _   _ _    _    ___      _
 / ____| \ | | |  | |  / / |    (_)
| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
 \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\

Prywatny serwer lustrzany dystrybucji GNU/Linux Debian

Czasami muszę znaleźć się w lokalizacji gdzie łącze internetowe pod kątem przepustowości pozostawia wiele do życzenia. Z racji tego, iż aktywnie pracuje na projektem immudex potrzebuje stałego dostępu do pakietów GNU/Linux Debiana. Jakiś czasemu temu szykował się dłuższy wypad w to miejsce, a ja po za immudex miałem jeszcze swojego rodzaju zadanie domowe do odrobienia. Do tego jednak potrzebowałem serwera a wraz z nim pakietów. Stworzyłem coś na miarę mikro internetu - jeden komputer w obudowie typu tiny od HP, a w nim poza rozrywką, możliwość swobodnej pracy - w postaci prywatnego serwera lustrzanego Debiana. Posiadając takie rozwiązanie sam dostęp do internetu nie był, aż tak potrzebny. Na załadowanie się innych stron mogłem poczekać.

W tym materiale zajmiemy się utworzeniem takiego serwera. Potocznie serwer lustrzany pakietów dystrybucji, określny jest mianem mirroru - i takiego nazewnictwa będę się trzymać. Najważniejszym założeniem tego rozwiązania jest określenie oraz przygotowanie odpowiedniej ilości wolnego miejsca dysku. Moj mirror obejmuje zakresem obecnie używane wersje Debiana (wraz z kanałem aktualizacji) w architekturze intelowskiej 64 i 32-bitowej, w sekcji głównej (main) oraz sekcji ze sterownikami urządzeń (non-free-firmware). Na chwilę obecną zajmuje to jakieś 560GB, więc należy się uzbroić w dysk co najmniej 1TB. Nie będe w tym materiale poruszał tematu przygotowania dysku, to chyba jest znane, prawda?

Po przygotowaniu miejsca na dane mirroru musimy pobrać pakiety, twórcy Debiana sugerują, że najlepszym źródłem do tego są aliasy geograficzne serwerów lustrzanych, tj. dla Polski np. ftp.pl.debian.org. Do kopiowania danych ze źródła zalecene jest z wykorzystanie protokołu HTTP. A do kopiowania wykorzystywany jest pakiet debmirror. W dokumentacji, możemy znaleźć informacje o tym, że polecenie sychronizacji naszego serwera ze źródłem powinno uruchamiać się 4 razy na dobę. Początkowo używałem takich ustawień, ale nie było zbyt wiele danych przesłanych, więc skmulowałem to do jednego razu dobę. W wiekszości przypadków to wystarczy, jesli nie będziemy kopiować na serwer wersji testowej lub niestabilnej to i ten raz dziennie może okazać działaniem nadwyraz. Pamiętam swojego czasu, kiedy tworzyłem jeszcze obrazy płyt dla projektu immudex. Zazwyczaj zajmowałem się tym w sobotę rano i mając już świeże obrazy, w niedziele sprawdzam listy pakietów, a tam kilka pakietów już do aktualizacji. Dlatego jeśli ktoś ma plany na sychronizację w trybie weekendowym to proponuje termin na niedzielę rano.

Z tego względu, że musimy uruchomić polecenie o czasie, potrzebujemy samego polecenia jak i również samej konfiguracji harmonogramu zadań w systemie. Poniżej znajduje się polecenie, którego ja używam. Przy pierwszym uruchomieniu pobieranie pakietów, może nie dojść do skutku i narzędzie należy uruchomić ponownie. Oczywiście, jest ono z tych inteligentnych, następne uruchomienie rozpoczyna się od pakietów, których pobranie nie powiodło się za pierwszym razem. Natomiast konfigurację crona pozostawiam do samodzielnego wykonania.

#!/bin/bash

debmirror --verbose --method=http --host=ftp.pl.debian.org \
  --root=debian \
  --dist=trixie,bookworm,bullseye,trixie-updates,bookworm-updates,bullseye-updates \
  --arch=i386,amd64 \
  --section=main,non-free-firmware --i18n --no-check-gpg /var/www/html/debian

W tym poleceniu kolejno, załączamy tryb gadatliwy (--verbose) następnie wybieramy metodę (--method), w tym przypadku jest to HTTP - najpopularniejsza metoda kopiowania danych w przypadku serwera lustrzanego. Kolejna opcja wskazuje host źródłowy (--host), opcja --root wskazuje gdzie u źródła rozpoczynają się dane repozytorium. W tym przypadku jest to poprostu debian, co oznaczna że URL hosta źródłowego wygląda w ten sposób: http://ftp.pl.debian.org/debian. W opcji --dist, określamy wersje Debiana oraz w tym przypadku dla każdej z wersji kanał aktualizacji. Debian w głownym kanale repozytorium przechowuje wersje pakietów przygotowane dla tej konkretnej wersji Debiana, aktualizacje pakietów trafiają natomiast do kanału aktualizacji. Następnie określana jest architektura samej dystrybucji (--arch) dla mnie wystarczająca jest archtektura intelowska, a przy użyciu paramteru (--section) wybieramy kolejne sekcje repozytorium. Następna opcja (--i18n) nakazuje poleceniu pobrać tłumaczenia, jest to ważna opcja. Bez niej apt update będzie zwracać ostrzeżenie o starym tłumaczeniu bądź jego braku. Ostatnią opcją jest ignorowanie podpisów GPG. Natoniast ostatnim parametrem jest miejsce docelowe dla pobranych plików repozytorium.

Generalnie pakiety Debiana są pobierane na systemy docelowe za pomocą protokołów sieciowych technologii WWW, więc aby móc udostępnić nasz serwer hostom docelowym potrzebujemy serwera WWW - może być Apache lub inny. Stąd w moim poleceniu ścieżka na /var/www/html. Serwer WWW w przypadku apache nie wymaga żadnej konfiguracji, no może poza usunięciem pliku /var/www/html/index.html oraz utworzeniem katalogu docelowego.

Aby użyć w systemie docelowym serwera, który utworzyliśmy możemy podać adres naszego mirroru (już osiągalnego przez protokół HTTP) podczas instalacji przy wyborze serwera lustrzanego lub na zainstalowanym już systemie wyedytować plik źródeł programu APT, jeśli nasz plik wygląda podobnie:

deb http://ftp.icm.edu.pl/pub/Linux/debian/ trixie main non-free-firmware
deb-src http://ftp.icm.edu.pl/pub/Linux/debian/ trixie main non-free-firmware

deb http://security.debian.org/debian-security trixie-security main non-free-firmware
deb-src http://security.debian.org/debian-security trixie-security main non-free-firmware

deb http://ftp.icm.edu.pl/pub/Linux/debian/ trixie-updates main non-free-firmware
deb-src http://ftp.icm.edu.pl/pub/Linux/debian/ trixie-updates main non-free-firmware

To wystarczy, że zmienimy ftp.icm.edu.pl/pub/Linux, na adres naszego serwera i zaktualizujemy listy pakietów w systemie.

Na moim serwerze dodatkowo poza serwerem lustrzanym pakietów, znajduje się również wybiórczy serwer lustrzany obrazów płyt. Wybiórczy dlatego, że przechowuje na nim wyłącznie obrazy instalacji sieciowej oraz standardowe LiveCD dla obecnie wszystkich wspieranych wersji. Do kopiowania danych w tym przypadku wykorzystuje się protokół jak RSYNC, a poniżej znajduje się mój skrypt kopiujący obrazy płyt.

#!/bin/bash

rsync --times --links --hard-links --partial --block-size=8192  --recursive \
  --include='*netinst*.iso' \
  --include='*standard.iso' \
  --exclude='bt-bd' \
  --exclude='bt-cd' \
  --exclude='bt-dvd' \
  --exclude='iso-bd' \
  --exclude='iso-dvd' \
  --exclude='jigdo-16G' \
  --exclude='jigdo-bd' \
  --exclude='jigdo-cd' \
  --exclude='jigdo-dlbd' \
  --exclude='jigdo-dvd' \
  --exclude='list-16G' \
  --exclude='list-bd' \
  --exclude='list-cd' \
  --exclude='list-dlbd' \
  --exclude='list-dvd' \
  --exclude='log' \
  --exclude='arm64' \
  --exclude='armel' \
  --exclude='armhf' \
  --exclude='mips' \
  --exclude='mips64el' \
  --exclude='mipsel' \
  --exclude='ppc64el' \
  --exclude='s390x' \
  --exclude='trace' \
  --exclude='source' \
  --exclude='bt-hybrid' \
  --exclude='HEADER.html' \
  --exclude='MD5*' \
  --exclude='SHA1*' \
  --exclude='SHA256*' \
  --exclude='SHA512*' \
  --exclude='*.packages' \
  --exclude='*.contents' \
  --exclude='*.log' \
  --exclude='*.iso' \
  --progress rsync://ftp.icm.edu.pl/pub/Linux/debian-cd/* /var/www/debian-cd;

Za pomocą opcji --include zaznaczyłem te pliki, które chce mieć na swoim serwerze, a opcją --exclude wszystkie pozostałe, które nie mają być kopiowane. Komunikaty z działania wyżej wymienionych narzędzii są zapisywane do odpowiednich plików dziennik, a każde ich uruchmienie zostaje odnotowane w dzienniku - datą i godziną. Poniżej znajduje się mój skrypt, który uruchamia te dwa polecenia. Skrypt ten jest uruchamiany przez harmonogram zadań.

#!/bin/bash
echo "[$(date)]" >> /home/xf0r3m/debian-mirror.log;
/usr/local/bin/debian-mirror-sync-cmd >> /home/xf0r3m/debian-mirror.log;
echo "[$(date)]" >> /home/xf0r3m/debian-cd-mirror.log;
/usr/local/bin/debian-cd-rsync-cmd >> /home/xf0r3m/debian-cd-mirror.log;

Za pomocą kilku poleceń stworzyliśmy serwer, który tak jak w moim przypadku słabego łącza internetowego sprawił, że możemy wykonywać operacje na pakietach w systemach docelowych wyłącznie za pośrednictwem sieci LAN. Alternatywą metodą jest wykorzystanie wielkich obrazów płyt BluRay, jednak operowanie plikami wielkości dwudziestu paru gigabajtów może być nieporęczne. Ten materiał kończy nieplanowaną trylogię artykułów o pakietach Debiana.

Źródła:

  1. Mirror Size
  2. Setting up a Debian archive mirror
  3. Becoming a mirror for Debian USB/CD/DVD images

~xf0r3m