Porównanie menedżerów pakietów w Linuxie: apt, dnf, pacman i inne

0
18
Rate this post

Spis Treści:

Po co są menedżery pakietów i jak działają pod spodem

Pakiet, repozytorium i menedżer – uporządkowanie pojęć

Menedżer pakietów w Linuksie to centralny mechanizm, który zastępuje znany z Windowsa model „pobierz .exe z losowej strony i zainstaluj”. Zamiast tego wszystko przechodzi przez zunifikowany system pakietów: znasz nazwę programu, a menedżer pobiera go z zaufanego źródła, sprawdza podpis i instaluje z pełną kontrolą nad zależnościami.

Typowy pakiet to archiwum z:

  • plikami binarnymi (programy, biblioteki, skrypty),
  • plikami konfiguracyjnymi (często oznaczonymi specjalnie, np. jako conffiles),
  • metadanymi (nazwa, wersja, opis, zależności, konflikty, architektura),
  • skryptami instalacyjnymi (preinst, postinst, prerm, postrm) wykonywanymi na różnych etapach instalacji/usuwania.

Repozytorium to z kolei zdalny zbiór pakietów, zazwyczaj hostowany przez dystrybucję lub zaufaną stronę trzecią. Dla ciebie repozytorium to po prostu lista adresów URL w konfiguracji menedżera pakietów. Pod spodem każde repo trzyma:

  • same pakiety (np. .deb, .rpm, .pkg.tar.zst),
  • indeksy pakietów (skondensowane metadane używane do wyszukiwania i rozwiązywania zależności),
  • podpisy kryptograficzne (GPG) do weryfikacji spójności i autentyczności.

Menedżer pakietów to narzędzie, które:

  • czyta konfigurację repozytoriów,
  • pobiera i aktualizuje lokalne indeksy pakietów (cache),
  • znajduje odpowiednie pakiety, liczy zależności i konflikty,
  • pobiera konkretne pliki z repozytoriów,
  • instaluje, aktualizuje i usuwa pakiety, odpalając odpowiednie skrypty.

Przykład: na Ubuntu wpisujesz sudo apt install htop. Apt odświeża informacje z cache, sprawdza, czy istnieje pakiet htop, sprawdza, jakie ma zależności, oblicza plan instalacji, pyta cię o potwierdzenie i przekazuje zadanie do dpkg, który faktycznie wypakowuje pliki i uruchamia skrypty.

Cykl życia pakietu: od maintainerów do twojego systemu

Każdy pakiet ma swojego maintainera (opiekuna) po stronie dystrybucji. To nie zawsze ta sama osoba co autor programu. Maintainer pobiera źródła z upstreamu (np. z GitHuba), dostosowuje do zasad dystrybucji (łatki, katalogi, zależności), buduje pakiet i wrzuca do systemu budowania dystrybucji.

Następnie pakiet przechodzi pipeline: weryfikację jakości, testy automatyczne, czasem review społeczności. W systemach stabilnych (Debian stable, RHEL) pakiet długo „dojrzewa”, przechodzi przez gałęzie testing/unstable, a dopiero później ląduje w stabilnym repo. W dystrybucjach rolling release (Arch, openSUSE Tumbleweed) cykl jest krótszy – szybciej dostajesz nową wersję, ale częściej coś może pójść nie tak.

Gdy pakiet trafi do repozytorium, menedżer pakietów pobiera aktualne indeksy (np. apt update) i od tego momentu możesz go zainstalować jedną komendą. Aktualizacje pakietów to po prostu nowe wersje w repo; menedżer porównuje zainstalowane wersje z tym, co widzi w indeksach, i proponuje uaktualnienie.

Ten model centralizuje zarządzanie oprogramowaniem. Nie musisz sam szukać binarek, pilnować aktualizacji, odinstalowywać „ręcznie”. Dla administracji systemami Linux to krytyczna zaleta – jeden mechanizm ogarnia serwer WWW, bazę danych, narzędzia CLI, a także aktualizacje bezpieczeństwa.

Warstwa niska i warstwa wysoka w systemach pakietów

W praktyce większość systemów ma co najmniej dwie warstwy:

  • warstwa niska – odpowiedzialna za bezpośrednią instalację/odinstalowanie pakietu: dpkg w Debianie, rpm w Red Hacie, pacman w Archu (tu pacman jest zarówno niską, jak i wysoką warstwą),
  • warstwa wysoka – obsługa repozytoriów, cache, rozwiązywania zależności, metadanych: apt, dnf, zypper, GUI pokroju Discover, Pamac itp.

Dla użytkownika warstwa wysoka jest głównym interfejsem. Warstwę niską wykorzystuje się, gdy trzeba coś naprawić „na siłę” (np. dpkg --force-all) lub w specjalistycznych scenariuszach (instalacja pakietu z pliku .deb, gdy repo nie jest dostępne).

Konsekwencja tego modelu jest prosta: jeśli menedżer pakietów jest w spójnym stanie, zarządza całym systemem. Jeśli natomiast zaczniesz mieszać instalacje „z palca” (make install z source, ręczne kopiowanie plików, przypadkowe skrypty z internetu), tworzysz warstwę oprogramowania poza kontrolą menedżera pakietów. Przy pierwszym większym upgrade systemu może to wrócić jak bumerang.

Monitor z kodem i danymi bezpieczeństwa podczas pracy w systemie Linux
Źródło: Pexels | Autor: Tima Miroshnichenko

Krótkie portfolio: apt, dnf, pacman i inni ważni gracze

apt i rodzina Debiana/Ubuntu

apt jest frontendem dla systemu dpkg i całej rodziny narzędzi APT. Używany jest w Debianie, Ubuntu, Mintcie i dziesiątkach pochodnych. Typowy użytkownik tych dystrybucji zna przynajmniej kilka komend:

  • apt update – odświeżenie indeksów pakietów,
  • apt upgrade – aktualizacja zainstalowanych pakietów,
  • apt install <pakiet> – instalacja,
  • apt remove/purge – usuwanie.

Główną zaletą apt jest czytelność outputu i prostota składni. Dobrze też integruje się z dodatkowymi repozytoriami (PPA) i z narzędziami graficznymi (np. Software Center na Ubuntu). Ekosystem Debiana ma ogromną ilość gotowych pakietów, co czyni apt jednym z najwygodniejszych menedżerów pakietów dla początkujących.

Z perspektywy SEO i użytkownika szukającego porównania menedżerów pakietów w Linuxie, apt to często punkt odniesienia w dyskusji „apt vs dnf vs pacman”. Daje dobrą równowagę między wygodą, stabilnością i ilością dostępnego oprogramowania.

dnf/yum w świecie Red Hata i Fedory

W dystrybucjach opartych o Red Hata rolę głównego menedżera pełni dziś dnf (Dandified YUM). Spotkasz go w:

  • Fedora,
  • RHEL (Red Hat Enterprise Linux),
  • CentOS Stream,
  • Rocky Linux, AlmaLinux i innych klonach RHEL.

Poprzednikiem dnf był yum, ale we współczesnych systemach to już głównie alias. Dnf ma modularną architekturę i bogaty system pluginów. Wyróżnia się:

  • dokładnymi informacjami o transakcjach (logi, historię można łatwo przeglądać i cofać),
  • dobrym rozwiązywaniem zależności opartym o libsolv,
  • obsługą modułów (np. różne strumienie wersji PHP czy PostgreSQL równolegle).

Składnia jest podobna do apt:

  • dnf update/upgrade,
  • dnf install <pakiet>,
  • dnf remove, dnf info, dnf search.

Zaletą świata RHEL/Fedora jest mocny nacisk na stabilność w wydaniach serwerowych i dobre narzędzia do zarządzania repozytoriami firm trzecich (EPEL, repozytoria vendorów). Dla kogoś, kto pozna różnice między apt i dnf, przesiadka między tymi rodzinami jest stosunkowo łagodna.

pacman i filozofia Arch Linuksa

pacman w Archu jest jednocześnie niską i wysoką warstwą systemu pakietów. Zastępuje kombinację dpkg+apt czy rpm+dnf. Wykorzystuje bardzo prostą, spójną składnię:

  • pacman -S <pakiet> – instalacja,
  • pacman -R <pakiet> – usuwanie,
  • pacman -Syu – aktualizacja całego systemu (sync + refresh + upgrade),
  • pacman -Ss <fraza> – wyszukiwanie w repozytoriach,
  • pacman -Qs <fraza> – wyszukiwanie w zainstalowanych.

Pacman jest znany z szybkości działania i dość minimalnego outputu. Świetnie pasuje do filozofii Arch Linuksa: prosto, bez zbędnej magii, ale wymaga, żeby użytkownik wiedział, co robi. Kluczem w ekosystemie pacmana jest połączenie z AUR (Arch User Repository) – ogromnym zbiorem recept na pakiety tworzonym przez społeczność.

Bezpośrednio pacman nie obsługuje AUR, do tego służą dodatkowe narzędzia (yay, paru, trizen). Dobre praktyki przy instalacji pakietów w Archu wymagają świadomego odróżniania oficjalnych repo (które pacman obsługuje natywnie) od zawartości AUR, gdzie dochodzi kompilacja ze źródeł i potencjalnie mniejsze bezpieczeństwo.

Inne systemy: zypper, apk, nix, snap/flatpak

Poza „wielką trójką” istnieje kilka ważnych graczy:

  • zypper – menedżer pakietów w openSUSE (backend: libzypp). Daje rozbudowane opcje zarządzania repo, rollbacki oraz precyzyjne rozwiązywanie zależności. W dystrybucji Tumbleweed działa jako narzędzie w środowisku rolling release.
  • apk – menedżer pakietów w Alpine Linux. Niezwykle lekki i prosty, zoptymalizowany pod systemy kontenerowe i niewielkie obrazy Dockerowe.
  • nix – zupełnie inny model, system pakietów oparty na podejściu deklaratywnym i czysto funkcyjnym. Pozwala na równoległe wersje, łatwe rollbacki i izolowane środowiska użytkownika. Nie jest powiązany z konkretną dystrybucją – można go zainstalować obok apt/dnf/pacmana.

Osobną kategorią są formy dystrybucji aplikacji takie jak snap, flatpak czy AppImage. To nie są pełnoprawne zamienniki apt/dnf/pacmana, ale warstwa nad nimi. Służą do dystrybucji aplikacji desktopowych wraz z zależnościami w formie kontenerowej (sandbox, izolacja środowiska).

Na Ubuntu typowe jest połączenie apt + snap, na Fedorze – dnf + flatpak, w Manjaro – pacman + pamac + flatpak/snap. Menedżer pakietów systemu nadal zarządza bibliotekami bazowymi i składnikami OS, a nowe formaty odpowiadają głównie za aplikacje użytkownika.

Zbliżenie starego monitora z konsolą MS-DOS i podświetlaną klawiaturą
Źródło: Pexels | Autor: Rafael Minguet Delgado

Architektura systemów pakietów: dpkg/apt vs rpm/dnf vs pacman

Format pakietu: .deb, .rpm, .pkg.tar.zst

Choć użytkownik rzadko ogląda pliki pakietów, zrozumienie ich formatu pomaga przewidywać zachowanie systemu. Trzy klasyczne przykłady:

  • .deb – paczki Debiana/Ubuntu. Technicznie to archiwum ar z trzema głównymi elementami: debian-binary, control.tar.xz (metadane i skrypty) oraz data.tar.xz (właściwa zawartość).
  • .rpm – paczki Red Hata/Fedory. Zawierają nagłówek z metadanymi, sygnaturę i sekcję danych. Struktura jest inna niż w .deb, ale idea podobna: opis + dane + skrypty.
  • .pkg.tar.zst (lub .xz) – paczki Arch Linuksa. W praktyce to zwykłe archiwum tar kompresowane za pomocą zstd lub xz. Metadane są przechowywane w plikach tekstowych (np. .PKGINFO).

Pacman radzi sobie z pakietami w sposób wyjątkowo prosty: to po prostu wypakowanie zawartości tar w odpowiednie miejsce plus wykonanie ewentualnych skryptów. Dpkg i rpm mają bardziej rozbudowaną logikę wewnętrzną, z większym naciskiem na bazę danych pakietów i stany plików.

Metadane, zależności i rozwiązywanie konfliktów

Sercem zarządzania pakietami w Linuxie są metadane. Każdy pakiet opisuje:

Jakie informacje niosą metadane pakietu

Metadane opisują nie tylko nazwę i wersję. Typowy pakiet zawiera m.in.:

  • Depends – twarde zależności, bez których pakiet nie zadziała,
  • Recommends / Suggests (w .deb) – zależności opcjonalne, ale domyślnie instalowane (Recommends) lub tylko sugerowane,
  • Provides – wirtualne funkcjonalności (np. różne MTA mogą provide: mail-transport-agent),
  • Conflicts / Breaks – definicja pakietów, z którymi nie można współistnieć albo które wymagają aktualizacji/usunięcia,
  • Obsoletes (głównie rpm) – informacja, że pakiet zastępuje stary pakiet pod inną nazwą,
  • Epoch (rpm, w dpkg podobny efekt ma pole epoch:) – „ratunek” na popsute wersjonowanie, wymusza kolejność przy porównywaniu wersji.

Na tej podstawie menedżer pakietów buduje graf zależności i szuka ścieżki, która:

  • spełnia wszystkie warunki Depends,
  • unika konfliktów,
  • przestrzega polityki wersjonowania (np. nie schodzi poniżej wymaganej wersji biblioteki).

Różnica między apt/dnf a pacmanem jest tu wyraźna. Apt i dnf mają bardzo rozbudowane opisy zależności (w tym wirtualne pakiety, Recommends, Obsoletes), co daje sporą automatyzację, ale też czasem generuje skomplikowane scenariusze konfliktów. Pacman jest bardziej prosty: ma Depends, Optional Deps i podstawowe konflikty – mniej magii, więcej ręcznej kontroli.

Rozwiązywanie zależności: różne silniki, różne podejścia

Najwięcej pracy wykonuje tzw. resolver (silnik rozwiązywania zależności). W uproszczeniu:

  • apt korzysta z własnych algorytmów (historycznie bazujących na libapt-pkg) i od dawna jest optymalizowany pod realne repo Debiana/Ubuntu,
  • dnf używa libsolv – tego samego silnika, na którym stoi zypper/openSUSE, bardzo dobrego w radzeniu sobie z dużą liczbą repozytoriów,
  • pacman ma lżejszy, prostszy resolver – w Archu mniej kombinuje się z wirtualnymi pakietami, a konflikty są zwykle jasno zadeklarowane.

Efekt w praktyce: w Debianie/Ubuntu można często „po prostu upgrade’ować” nawet bardzo rozbudowany serwer i apt sam posprząta większość konfliktów. W Archu z kolei konflikty wychodzą na wierzch szybciej – jeśli dwa pakiety chcą nadpisać ten sam plik, pacman powie to wprost i zatrzyma transakcję. Podejście jest inne: mniej „zmiękczania” sytuacji, więcej jawności.

W sieci blogów technologicznych, takich jak 4komputery, często pokazuje się, jak takie kombinacje przekładają się na realne scenariusze, np. lekkie środowisko kontenerowe z apk, a na desktopie równolegle flatpak do aplikacji graficznych.

Dnfa i zyppera docenia się na serwerach, gdzie masz po kilka–kilkanaście repo (oficjalne, EPEL, vendor-specific). Libsolv dobrze skaluje się przy takich zestawach, a historia transakcji umożliwia sensowny rollback, gdy aktualizacja pójdzie nie po myśli.

Skrypty pre/postinst i ich wpływ na system

Pakiety .deb i .rpm zawierają skrypty wywoływane w różnych momentach cyklu życia:

  • preinst, postinst – przed/po instalacji,
  • prerm, postrm – przed/po usunięciu,
  • triggers (w .deb) – akcje uruchamiane, gdy spełni się określony warunek (np. przebudowa cache ldconfig, aktualizacja katalogu man).

Umożliwiają:

  • tworzenie użytkowników systemowych i katalogów z odpowiednimi uprawnieniami,
  • regenerację plików konfiguracyjnych, cache, baz danych,
  • uruchamianie/ restart usług (np. nginx, systemd units).

Pacman też obsługuje skrypty (w pliku .INSTALL), ale całość jest prostsza: najczęściej spotyka się hooki w stylu „zaktualizuj initramfs” czy „odśwież baza fontów”. W Debianie/Fedorze logika w skryptach bywa cięższa i bardziej rozbudowana.

Konsekwencje są oczywiste: uszkodzony lub nieprzemyślany skrypt potrafi złamać usługę po aktualizacji. Z tego powodu dystrybucje enterprise (RHEL, SLES) mają restrykcyjne wytyczne dla pakietujących, a rolling release (Arch, Tumbleweed) opierają się bardziej na szybkim wykrywaniu/regresji i poprawkach wypuszczanych w ciągu godzin lub dni.

Repozytoria, mirrory i podpisy kryptograficzne

Każda rodzina ma trochę inną konwencję trzymania repozytoriów, ale wspólne elementy są podobne:

  • lista źródeł (pliki /etc/apt/sources.list.d/*.list, /etc/yum.repos.d/*.repo, /etc/pacman.d/mirrorlist),
  • indeksy/metadane (Packages.gz, repodata, db.lck w pacmanie),
  • podpisy GPG dla pakietów i repo (klucze w /etc/apt/trusted.gpg.d/, /etc/pki/rpm-gpg/, /etc/pacman.d/gnupg).

Z punktu widzenia bezpieczeństwa liczy się:

  • czy repo jest podpisane,
  • czy klucz GPG został dodany z zaufanego źródła,
  • czy menedżer pakietów wymusza weryfikację podpisów.

Apt i dnf domyślnie blokują instalację z niezaufanych repo (bez klucza), pacman również pilnuje sygnatur, choć w niektórych dystrybucjach pochodnych bywa to rozluźnione. Ręczne dodanie klucza GPG „z netu” do pacmana czy apta to typowy moment, w którym wprowadza się do systemu zaufanie do kogoś zupełnie obcego – administracyjnie wygodne, ale ryzykowne.

W praktyce na serwerach Red Hatowych repozytoria firm trzecich (np. vendor baz danych, monitoringu) dostarczają własne pliki .repo z wbudowanym odniesieniem do klucza GPG. W Debianie/Ubuntu często kończy się na dodaniu wpisu do sources.list i osobnym imporcie klucza. Arch z kolei woli, aby zewnętrzne repozytoria były dobrze udokumentowane i relatywnie nieliczne – większość „egzotyki” ląduje w AUR.

Aktualizacje: stable vs rolling i co to znaczy dla pakietów

Model wydawniczy dystrybucji mocno wpływa na to, jak pracuje menedżer pakietów:

  • Debian stable / Ubuntu LTS – konserwatywne wersje, dużo backportów poprawek bezpieczeństwa, mało „dużych” skoków wersji w jednym wydaniu,
  • RHEL / klony – podobnie konserwatywne jak Debian, czasem nawet bardziej, z długim wsparciem,
  • Fedora – szybkie wydania, ale nadal „wydania stałe” (co ~6 miesięcy),
  • Arch / Tumbleweed – rolling release, ciągły strumień aktualizacji.

W stabilnych wydaniach apt/dnf operują na zamrożonym zestawie wersji, więc konflikty wynikają głównie z dodanych repozytoriów lub ręcznie instalowanych pakietów. W rolling release pacman czy zypper codziennie aktualizują sporą liczbę komponentów, co zwiększa ryzyko regresji, ale daje na bieżąco najnowsze funkcje.

Przykład z życia: na serwerze produkcyjnym z Debianem aktualizacja polega często na:

apt update
apt upgrade

i jest robiona regularnie, ale spokojnie, bo wersje kluczowych serwerów (np. PostgreSQL) nie skaczą gwałtownie. W Archu na desktopie użytkownik może codziennie robić:

pacman -Syu

i przy okazji dostać nowe jądro, nową wersję toolchaina oraz bibliotek graficznych. To jest wygoda dla power-usera, ale wymaga, żeby znać podstawowe mechanizmy ratunkowe (chroot, downgrade z cache pacmana, snapshot z btrfs/ZFS).

Mechanizmy rollbacku i „bezpieczne” aktualizacje

Sam menedżer pakietów nie zawsze wystarczy jako mechanizm cofania zmian. Podejścia są różne:

  • dnf ma wbudowaną historię transakcji: dnf history, dnf history undo <ID>,
  • zypper współpracuje z snapper i snapshotami Btrfs – można cofnąć się do stanu systemu sprzed aktualizacji,
  • apt nie ma pełnego rollbacku, ale umożliwia „pinning” wersji i częściowe cofanie pakietów,
  • pacman przechowuje cache paczek w /var/cache/pacman/pkg/, co pozwala na ręczne pacman -U <pakiet> w celu downgrade’u.

Tip: na systemach, gdzie bezpieczeństwo i dostępność są krytyczne, rollback rozwiązuje się na poziomie systemu plików lub hypervisora (snapshoty VM, Btrfs/ZFS, LVM). Menedżer pakietów jest tylko częścią układanki.

apt w praktyce: mocne i słabe strony ekosystemu Debiana/Ubuntu

Podstawowe komendy apt z perspektywy codziennej pracy

Oprócz najpopularniejszych poleceń update, upgrade i install przydają się:

  • apt search <fraza> – wyszukiwanie po nazwie i opisie,
  • apt show <pakiet> – szczegółowe informacje o pakiecie, zależnościach i repozytorium,
  • apt list --installed – lista zainstalowanych pakietów,
  • apt autoremove – usuwanie osieroconych zależności (pakiety, które nie są już potrzebne).

Warto też znać różnice:

  • apt remove – usuwa pakiet, ale zostawia pliki konfiguracyjne w /etc,
  • apt purge – czyści pakiet wraz z konfiguracją (użyteczne przy „resetowaniu” usługi).

Administratorzy serwerów częściej sięgają po apt-get i apt-cache w skryptach (bardziej stabilne interfejsy), ale do ręcznej pracy konsolowej nowy apt jest wygodniejszy i bardziej czytelny.

System zależności w Debianie: Depends, Recommends, Suggests

Ekosystem Debiana ma rozbudowany model zależności. Dla użytkownika kluczowe są:

  • Depends – bez nich pakiet nie ruszy, są instalowane zawsze,
  • Recommends – domyślnie instalowane, ale można wyłączyć w konfiguracji (np. gdy chcesz „chudszy” system),
  • Suggests – tylko sygnalizowane, nie instalują się automatycznie.

Dzięki Recommends typowa instalacja „po prostu działa”. Przykład: instalując klienta poczty, system dociągnie obsługę archiwów, certyfikatów, ikonki w trayu. Jeśli chcesz minimalizmu, możesz globalnie wyłączyć Recommends:

echo 'APT::Install-Recommends "0";' | sudo tee /etc/apt/apt.conf.d/99norecommends

albo lokalnie, podczas jednej instalacji:

apt install --no-install-recommends <pakiet>

To przydaje się szczególnie w obrazach kontenerowych bazujących na Debianie/Ubuntu, gdzie każdy dodatkowy pakiet to potencjalny wektor ataku i większy rozmiar obrazu.

Stabilność Debiana/Ubuntu a „świeżość” pakietów

Najsłynniejsza cecha Debiana stable: stabilność kosztem wersji. Pakiety są stare, ale solidnie przetestowane, a poprawki bezpieczeństwa backportowane. Ubuntu LTS idzie podobną drogą, choć ma więcej nowości (szczególnie na desktopie).

Dobrym uzupełnieniem będzie też materiał: Jak szyfrować dane w Windows, Linux i macOS? — warto go przejrzeć w kontekście powyższych wskazówek.

Żeby to zrównoważyć, istnieje kilka kanałów:

  • Debian backports – nowsze wersje wybranych pakietów przystosowane do stable,
  • Ubuntu PPAs (Personal Package Archives) – prywatne repozytoria na Launchpadzie,
  • Ubuntu „non-LTS” – regularne wydania z nowszymi pakietami.

PPAs są potężnym narzędziem, ale rozciągają zaufanie – oddajesz w ręce maintainerów z Launchpada pełny dostęp do binariów, które apt zainstaluje z uprawnieniami roota. Na stacjach roboczych jest to często akceptowalne, na serwerach produkcyjnych lepiej unikać PPA lub bardzo ostrożnie dobierać źródła.

Co apt robi „pod spodem”: dpkg, bazy danych, stany pakietów

Jak apt korzysta z dpkg i co dzieje się przy instalacji

Apt jest frontendem, a „czarną robotę” wykonuje dpkg. Przy typowej instalacji pakietu dzieje się kilka kroków:

  1. apt rozwiązuje zależności i wybiera konkretne wersje pakietów,
  2. pobiera .deb do cache (/var/cache/apt/archives/),
  3. przekazuje listę pakietów do dpkg,
  4. dpkg rozpakowuje pakiety do systemu plików i uruchamia skrypty maintainerów.

Stany pakietów trzymane są głównie w:

  • /var/lib/dpkg/status – centralna baza z listą pakietów, wersjami i stanami (installed, config-files, half-installed itd.),
  • /var/lib/dpkg/info/ – metadane per pakiet: pliki .list (co gdzie zostało zainstalowane), .md5sums, skrypty preinst, postinst, prerm, postrm.

Uwaga: ręczna edycja /var/lib/dpkg/status jest możliwa, ale powinna być ostatecznością – jeden błąd w składni i cały system pakietów staje się niekonsystentny.

Przy problemach z przerwanymi instalacjami pierwszą linią obrony jest:

dpkg --configure -a
apt -f install

Pierwsze polecenie próbuje dokończyć konfigurację pakietów w stanie „half-configured”, drugie próbuje naprawić niespójności zależności (dociągnąć brakujące pakiety lub usunąć niedające się naprawić).

Pinning wersji i priorytety źródeł pakietów

Gdy mieszają się różne repozytoria (stable, testing, backports, PPA), sensownym narzędziem staje się mechanizm APT pinning. Pozwala ustalić, z którego źródła preferowana jest dana wersja.

Konfiguracja ląduje w plikach /etc/apt/preferences lub /etc/apt/preferences.d/*.pref. Przykład, w którym Debian stable jest głównym źródłem, a z backports bierzemy tylko wybrane pakiety:

Package: *
Pin: release a=stable
Pin-Priority: 900

Package: *
Pin: release a=stable-backports
Pin-Priority: 100

Taki układ oznacza: instaluj ze stable, a stable-backports traktuj jako „na życzenie” (instalacja przez apt -t stable-backports install <pakiet>). Dla konkretnych pakietów można podnieść priorytet:

Package: nginx
Pin: release a=stable-backports
Pin-Priority: 950

Efekt: nginx będzie aktualizowany z backportów, reszta systemu pozostanie na stabilnych wersjach. Przy bardziej skomplikowanych konfiguracjach (np. domieszka testingu) pinning jest jedynym sensownym sposobem panowania nad tym, co skąd się instaluje.

Konflikty i „trzymanie” pakietów w miejscu

Na systemach, gdzie pojedyncze usługi (baza danych, broker wiadomości) nie mogą samoczynnie zmienić wersji przy zwykłym apt upgrade, przydaje się mechanizm „hold”:

apt-mark hold postgresql
apt-mark showhold

Pakiet z flagą hold nie będzie aktualizowany, dopóki ręcznie nie zdejmiesz blokady:

apt-mark unhold postgresql

Drugą klasą problemów są konflikty zależności („held broken packages”, „depends on X but it is not going to be installed”). Powody to zwykle:

  • Pakiet z obcego repo wymaga nowszej biblioteki niż dostępna w stable.
  • Dwa pakiety deklarują wzajemnie wykluczające się zależności (Conflicts, Breaks).
  • Pinning zbyt agresywnie blokuje nowsze wersje.

Debugowanie dobrze zacząć od:

apt-get -o Debug::pkgProblemResolver=yes dist-upgrade

oraz wglądu w to, co w ogóle jest dostępne:

apt-cache policy <pakiet>

Command apt-cache policy pokazuje wszystkie wersje pakietu z różnych repozytoriów i ich priorytety, co zwykle szybko ujawnia, dlaczego resolver uparcie nie chce zainstalować jakiejś wersji.

Ekosystem narzędzi wokół apt/dpkg

Wokół apt narosło sporo narzędzi zwiększających wygodę i kontrolę. W praktyce najczęściej używane są:

  • aptitude – alternatywny interfejs (tekstowy „TUI”) do APT, z innym algorytmem rozwiązywania zależności; dobry, gdy klasyczny apt nie potrafi zaproponować sensownego rozwiązania konfliktu,
  • debtree, apt-rdepends – narzędzia do wizualizacji drzew zależności (przy projektowaniu własnych metapakietów lub analizie „czemu to ciągnie pół świata”),
  • apt-listchanges – wyświetla changelogi przy aktualizacjach, co jest bardzo przydatne na serwerach,
  • unattended-upgrades – automatyczne instalowanie aktualizacji bezpieczeństwa.

Administratorzy większych środowisk dołączają do tego własne repozytoria (aptly, reprepro) albo systemy zarządzania konfiguracją (Ansible, Puppet), które generują spójne pliki sources.list na wielu hostach.

kaptain obvious: cache, czyszczenie i odzyskiwanie miejsca

Na maszynach o małych dyskach albo w kontenerach temat miejsca na /var wraca regularnie. apt z reguły nie usuwa pobranych paczek z cache, więc po kilku latach spokojnej pracy katalog /var/cache/apt/archives potrafi być całkiem spory.

Podstawowe porządki:

apt clean        # usuwa wszystko z cache
apt autoclean    # usuwa paczki, których nie da się już pobrać (stare wersje)
apt autoremove   # usuwa nieużywane zależności

Na serwerach produkcyjnych lepiej częściej używać autoclean niż clean, żeby mieć lokalnie pod ręką ostatnie paczki (np. do ręcznego downgrade’u). W kontenerach zwykle jest odwrotnie – im „chudziej”, tym lepiej, więc apt-get clean jest standardowym krokiem w Dockerfile.

Specyfika dnf/yum: jak różni się od apt w codziennej pracy

dnf (i starszy yum) pełni podobną rolę w świecie RPM, co apt w Debianie. Różnice widać już na poziomie interfejsu. Zamiast apt update && apt upgrade najczęściej używa się:

dnf check-update
dnf upgrade

albo po prostu jednego:

dnf upgrade --refresh

W odróżnieniu od apt, w ekosystemie Red Hatowym bardzo typowe jest używanie modułów i streamów (szczególnie w RHEL 8/9): ta sama logika „kanałów” wersji jest narzędziem do posiadania kilku gałęzi pakietu (np. Python 3.9 vs 3.11) obok siebie.

Na koniec warto zerknąć również na: Eksperyment: Arch Linux bez poradnika – czy się da? — to dobre domknięcie tematu.

Podstawowe polecenia, które w praktyce zastępują odpowiedniki z apt:

  • dnf search <fraza> – wyszukiwanie pakietów,
  • dnf info <pakiet> – szczegóły o pakiecie i repo,
  • dnf list installed – lista zainstalowanych pakietów,
  • dnf autoremove – sprzątanie zależności,
  • dnf provides <plik> – odnajdywanie pakietu po nazwie pliku (często używane przy brakujących nagłówkach deweloperskich).

Warto zwrócić uwagę na dnf history, który stanowi w praktyce dziennik zmian na poziomie RPM-ów, z możliwością cofania transakcji:

dnf history
dnf history info <ID>
dnf history undo <ID>

Na tle apt jest to przewaga: rollback nie jest pełny (nie odkręci np. zmian w bazie danych), ale często wystarcza do wyjścia z kłopotliwej aktualizacji bibliotek czy narzędzi.

Architektura dnf: relacja z rpm i pluginami

Tak jak apt opiera się na dpkg, tak dnf korzysta z rpm. Różnicą jest to, że dnf w większym stopniu deleguje metadane do biblioteki libsolv (resolver zależności używany też w openSUSE / zypper). W praktyce przekłada się to na:

  • bardziej zaawansowany algorytm rozwiązywania zależności (często lepiej radzi sobie z konfliktami),
  • modułowość – większość funkcji to pluginy ładowane dynamicznie.

Sam rpm odpowiada za:

  • instalację i usuwanie pojedynczych paczek (bez rozwiązywania zależności),
  • weryfikację integralności i podpisów,
  • utrzymanie bazy danych z listą plików (/var/lib/rpm/).

Uwaga: podobnie jak z dpkg, bezpośrednie używanie rpm -Uvh do instalowania pojedynczych pakietów w systemach zarządzanych przez dnf szybko kończy się bałaganem w zależnościach. rpm przydaje się raczej diagnostycznie:

rpm -qf /sciezka/do/pliku      # który pakiet dostarczył plik
rpm -qi <pakiet>               # informacje o pakiecie
rpm -V <pakiet>                # weryfikacja plików (czy były zmieniane)

dnf można rozszerzać pluginami, z których w praktyce często używane są:

  • dnf-plugins-core – zbiór pluginów, m.in. config-manager (do włączania/wyłączania repo) i versionlock (blokowanie wersji podobnie do apt-mark hold),
  • needs-restarting – wykrywanie usług wymagających restartu po aktualizacji bibliotek.

Moduły, streamy i AppStream w RHEL/Fedorze

W RHEL 8+ i Fedo­rze pojawił się koncept Application Streams. Z punktu widzenia użytkownika sprowadza się to do możliwości równoległego istnienia wielu większych stosów (np. MariaDB 10.3 vs 10.5) bez łamania globalnego systemu pakietów.

Zarządzanie modułami wygląda mniej więcej tak:

dnf module list              # lista modułów i streamów
dnf module enable nodejs:18  # włączenie konkretnego streamu
dnf install nodejs           # zainstaluje wersję z wybranego streamu

Jeżeli moduł ma skonfigurowany default stream, dnf wybierze go automatycznie. Jednak przy wieloletnim utrzymywaniu systemu bywa sensowne jawne ustawienie streamu, żeby za parę lat nie okazało się, że coś niespodziewanie „przeskoczyło” na nowszą gałąź.

Drugi element układanki to AppStream (pliki .xml.gz z metadanymi aplikacji). Dotyczy to głównie desktopów, ale wpływa też na sposób, w jaki dnf pobiera i przechowuje metadane. Na serwerach przy słabych łączach sporym zyskiem jest:

dnf makecache fast

oraz okresowe czyszczenie metadanych:

dnf clean all

analogicznie do apt clean w Debianie.

pacman: inna filozofia zarządzania pakietami

pacman jest znacznie prostszy w interfejsie niż apt czy dnf, ale dość „surowy”. Jedno polecenie pacman obsługuje aktualizacje, instalację, usuwanie, zarządzanie bazą. Typowy zestaw używany codziennie:

pacman -Syu         # pełna aktualizacja systemu (sync + refresh + upgrade)
pacman -S <pakiet>  # instalacja
pacman -R <pakiet>  # usunięcie
pacman -Rs <pakiet> # usunięcie wraz z zależnościami nieużywanymi
pacman -Qi <pakiet> # informacje o zainstalowanym pakiecie
pacman -Ss <fraza>  # wyszukiwanie w repozytoriach
pacman -Qs <fraza>  # wyszukiwanie w zainstalowanych

pacman utrzymuje własną bazę w /var/lib/pacman/local/; dla każdego pakietu powstaje tam katalog z metadanymi. Nie ma oddzielnego, niskopoziomowego narzędzia typu dpkg czy rpm – wszystko przechodzi przez ten sam binarny frontend.

Uwaga: pacman -Sy bez natychmiastowego u (upgrade) jest klasyczną pułapką – aktualizujesz listę pakietów, ale nie aktualizujesz systemu, co prowadzi do słynnego „partial upgrade”. W Archu tendencja jest odwrotna niż w Debianie: zawsze -Syu, nigdy samo -Sy (poza bardzo specyficznymi scenariuszami).

Konfiguracja pacmana, mirrorlist i archiwum pakietów

Najczęściej zadawane pytania (FAQ)

Co to jest menedżer pakietów w Linuxie i po co mi on w ogóle?

Menedżer pakietów to centralne narzędzie do instalowania, aktualizowania i usuwania oprogramowania w systemie Linux. Zamiast ściągać losowe instalatory z internetu, podajesz tylko nazwę pakietu (np. htop), a menedżer pobiera go z zaufanego repozytorium, sprawdza podpisy kryptograficzne i dba o wszystkie zależności.

W praktyce oznacza to, że:

  • masz jedno miejsce do zarządzania całym oprogramowaniem w systemie,
  • łatwo wykonujesz aktualizacje (także bezpieczeństwa) jednym poleceniem,
  • minimalizujesz ryzyko „śmietnika” w systemie po ręcznych instalacjach.

Uwaga: mieszanie instalacji z menedżera pakietów z ręcznym make install zwykle kończy się problemami przy większych aktualizacjach systemu.

Czym się różnią apt, dnf i pacman między sobą?

apt, dnf i pacman robią to samo na poziomie idei (zarządzają pakietami), ale różnią się ekosystemem i szczegółami działania:

  • apt – używany w Debianie, Ubuntu, Linux Mint; prosty w obsłudze, przejrzysty output, ogromna liczba pakietów w oficjalnych repozytoriach.
  • dnf – świat Fedora/RHEL; ma rozbudowaną historię transakcji, pluginy, dobrze radzi sobie z rozwiązywaniem zależności i obsługą modułów (różne wersje tego samego stosu, np. PHP).
  • pacman – serce Arch Linuksa; szybki, minimalistyczny, jednocześnie „niska” i „wysoka” warstwa. Wymaga większej świadomości użytkownika, ale daje dużą kontrolę.

Tip: jeśli umiesz korzystać z apt, przesiadka na dnf jest łagodna. Pacman ma inną składnię (flagi zamiast podkomend), ale logika pozostaje ta sama.

Co to jest pakiet, repozytorium i czym się różni warstwa niska od wysokiej?

Pakiet to archiwum zawierające:

  • pliki binarne (programy, biblioteki),
  • konfigurację,
  • metadane (zależności, konflikty, opis),
  • skrypty instalacyjne (preinst/postinst itd.).

Repozytorium to zdalny zbiór takich pakietów wraz z indeksami (bazy metadanych) i podpisami GPG. Z punktu widzenia użytkownika to po prostu lista URL-i w konfiguracji menedżera pakietów.

Warstwa niska to narzędzie, które faktycznie wypakowuje pakiety do systemu (np. dpkg, rpm, w Archu sam pacman). Warstwa wysoka (np. apt, dnf, zypper) zajmuje się repozytoriami, cache, doborem wersji i rozwiązywaniem zależności. Gdy wszystko jest spójne, komunikujesz się tylko z warstwą wysoką; warstwa niska przydaje się do „ratunkowych” operacji.

Który menedżer pakietów jest najlepszy dla początkującego użytkownika Linuxa?

Dla osoby startującej z Linuksem najczęściej najwygodniejszy jest apt na bazie Debiana/Ubuntu lub jego pochodnych (np. Linux Mint). Komendy są czytelne (apt install, apt remove, apt update), dokumentacja jest wszędzie, a liczba gotowych pakietów bardzo duża, więc rzadko musisz kompilować coś ręcznie.

dnf też jest przyjazny, zwłaszcza w Fedora Workstation, ale ekosystem „czuje się” trochę bardziej serwerowo/enterprise. pacman jest świetny, ale wraz z Archem wymaga więcej wiedzy – tam system nie maskuje konsekwencji działań użytkownika. Jeśli zaczynasz, wybierz wygodę i stabilność, a do „hardcoru” (Arch, Gentoo, Nix) możesz dojść później.

Czy mogę mieszać menedżerów pakietów i instalacje ręczne (np. z pliku .deb albo z source)?

Mieszać da się, ale trzeba robić to świadomie. Instalacja pojedynczego pakietu z pliku .deb przez dpkg -i jest w porządku, o ile:

  • pakiet pochodzi z zaufanego źródła,
  • nie duplikuje czegoś, co już masz w oficjalnych repo,
  • po instalacji odpalasz np. apt -f install, żeby domknąć zależności.

Instalacje z source (./configure && make && make install) wchodzą poza radar menedżera pakietów: nie są widoczne w liście pakietów, nie aktualizują się razem z systemem, mogą nadpisać pliki zarządzane przez pakiety. Przy dużych upgrade’ach dystrybucji to proszenie się o konflikty.

Czym się różni instalacja z oficjalnych repozytoriów od AUR, PPA i innych źródeł społecznościowych?

Oficjalne repozytoria dystrybucji są utrzymywane przez jej zespół i opiekunów pakietów (maintainerów). Pakiety przechodzą określony proces budowania, testów i weryfikacji, a aktualizacje bezpieczeństwa są zsynchronizowane z cyklem wydawniczym systemu. To domyślne, najbezpieczniejsze źródło.

AUR (Arch User Repository), PPA (Personal Package Archives dla Ubuntu) i podobne mechanizmy to przestrzeń dla społeczności oraz vendorów. Dają dostęp do nowszych wersji i niszowego softu, ale:

  • kto inny odpowiada za jakość i bezpieczeństwo,
  • w AUR często budujesz pakiet ze źródeł, więc musisz rozumieć, co robi PKGBUILD,
  • aktualizacje mogą nie być skoordynowane z głównym systemem.

Tip: używaj najpierw oficjalnych repo, a dopiero potem sięgaj po PPA/AUR, gdy konkretnego pakietu tam brakuje.

Dlaczego różne dystrybucje Linuxa mają różne menedżery pakietów i formaty (.deb, .rpm, .pkg.tar.zst)?

Format pakietu i menedżer wynika z „rodziny” dystrybucji i jej historii. Debian zbudował ekosystem wokół .deb i dpkg, Red Hat – wokół .rpm i rpm/dnf, Arch – wokół własnego formatu (.pkg.tar.zst) i pacman. Na poziomie idei wszystkie robią to samo, ale inaczej układają katalogi, metadane i proces publikacji.

Co warto zapamiętać

  • Menedżer pakietów centralizuje instalację i aktualizacje oprogramowania w Linuksie, zastępując ręczne pobieranie plików .exe czy skryptów z internetu i zapewniając weryfikację podpisów oraz kontrolę zależności.
  • Pakiet to nie tylko binarka, ale całe archiwum: pliki wykonywalne, konfiguracja, metadane (zależności, konflikty, architektura) oraz skrypty instalacyjne wywoływane na różnych etapach instalacji i usuwania.
  • Repozytorium to zdalny, zaufany zbiór pakietów z indeksami i podpisami GPG; menedżer pobiera z niego metadane (cache), planuje instalacje i dopiero potem ściąga konkretne pliki .deb/.rpm/.pkg.tar.zst.
  • Cykl życia pakietu obejmuje maintainera po stronie dystrybucji, pipeline budowania i testów oraz różne gałęzie stabilności; dystrybucje stabilne (Debian stable, RHEL) oferują wolniejsze, ale bezpieczniejsze aktualizacje niż systemy rolling release (np. Arch).
  • Większość dystrybucji rozdziela „warstwę niską” (dpkg, rpm, pacman – faktyczne rozpakowywanie i usuwanie) od „warstwy wysokiej” (apt, dnf, zypper – repozytoria, cache, rozwiązywanie zależności), co upraszcza codzienną pracę i zostawia narzędzia niskiego poziomu do akcji ratunkowych.
  • Ręczna instalacja oprogramowania „poza systemem pakietów” (make install, kopiowanie plików, skrypty z sieci) tworzy niezarządzaną warstwę, która przy większych aktualizacjach systemu może powodować konflikty, błędy zależności i trudne do debugowania problemy.