Przejdź do treści
Lekcja 64 z 117

Kurs › Moduł 7 › Lekcja 64

Menedżery pakietów: sklep z aplikacjami dla serwera

⏱ ok. 11 min czytania· moduł 7: Pakiety i oprogramowanie

Po tej lekcji: kursant rozumie, czym są pakiet, repozytorium, zależności i podpisy, i umie zainstalować, usunąć i wyszukać program w każdej popularnej rodzinie Linuksa.

Wstęp

Jak instalujesz program na Windowsie? Szukasz w Google. Trafiasz na stronę z trzema przyciskami „Pobierz”. Dwa to reklamy, a trzeci instaluje przy okazji pasek narzędzi do przeglądarki. Potem Dalej, Dalej, Akceptuję, Dalej. A aktualizacje? Każdy program sam, osobno, kiedy mu się przypomni. Zwykle w trakcie prezentacji u klienta.

Na serwerze z Linuksem:

sudo apt install htop

Jedna linijka. Program, wszystko, czego potrzebuje do działania, sprawdzony podpis. A aktualizacja wszystkich programów na serwerze to też jedna komenda. Linux miał swój sklep z aplikacjami na długo, zanim to było modne. Dziś zobaczysz, jak ten sklep działa i jak się nazywa w każdej rodzinie Linuksa.

Pakiet: karton od kuriera

W tym kursie menedżer pakietów to hurtownia z kurierem. Zacznijmy od tego, co kurier przywozi.

Pakiet to karton. W środku leżą pliki programu, od razu poukładane tak, jak mają leżeć w systemie: program do /usr/bin, ustawienia do /etc, dokumentacja do /usr/share/doc. Pamiętasz plan biurowca z lekcji 8? Pakiet wie, na które piętro co zanieść.

Na kartonie jest etykieta: nazwa, wersja, dla jakiego procesora, krótki opis i lista rzeczy, bez których program nie zadziała. A w środku, oprócz plików, jest instrukcja montażu: małe skrypty, które system uruchamia przy instalacji i przy usuwaniu. Na przykład „załóż konto dla usługi” albo „uruchom usługę”.

Formaty kartonów są dwa najpopularniejsze: .deb w rodzinie Debiana i Ubuntu oraz .rpm w rodzinie Red Hata, a także w SUSE.

Zobaczmy etykietę. Na tapecie krowa:

apt show cowsay
Package: cowsay
Version: 3.03+dfsg2-8
Priority: optional
Section: universe/games
Origin: Ubuntu
Installed-Size: 93.2 kB
Depends: libtext-charwidth-perl, perl:any
Suggests: filters, cowsay-off

cowsay to program, który wypisuje Twój tekst w dymku nad gadającą krową. Czemu krowa w kursie admina? Bo ma dokładnie jedną małą zależność i jest idealnym okazem do sekcji. Nikt nie płacze, jak ją usuniesz.

[RHEL] Na Red Hacie, Rocky i Almie tę samą etykietę czytasz przez dnf info nazwa_pakietu.

Repozytorium: hurtownia z katalogiem

Kartony leżą w hurtowni. Hurtownia to repozytorium: serwer w internecie z tysiącami pakietów i z katalogiem, czyli spisem, co jest na stanie, w jakiej wersji i czego wymaga.

Twój system ma listę hurtowni, z których zamawia. Na Ubuntu 24.04 jest w nowym formacie, w pliku /etc/apt/sources.list.d/ubuntu.sources:

grep -v '^#' /etc/apt/sources.list.d/ubuntu.sources
Types: deb
URIs: http://archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

URIs to adres hurtowni. Suites to działy: noble to Ubuntu 24.04 w wersji z premiery, noble-updates to poprawki, noble-security to łatki bezpieczeństwa. Components to regały: main i restricted utrzymuje Canonical, firma od Ubuntu, a universe i multiverse to pakiety utrzymywane przez społeczność. Krowa, jak widziałeś na etykiecie, mieszka w universe.

[RHEL] Na Red Hacie lista hurtowni to pliki .repo w folderze /etc/yum.repos.d/. Red Hat dzieli swoje pakiety na dwa główne repozytoria: BaseOS, czyli rdzeń systemu, i AppStream, czyli aplikacje, języki programowania i bazy danych.

I teraz pułapka, w którą wpada każdy:

sudo apt update

To NIE aktualizuje programów. To pobiera świeży katalog z hurtowni. Twój system dowiaduje się, co nowego jest na stanie. Samo zamówienie to osobna komenda. Szczegóły w następnej lekcji.

[RHEL] dnf odświeża katalog sam, kiedy uzna, że jest za stary. Dlatego na Red Hacie nie ma nawyku wpisywania „update” przed każdą instalacją.

Zależności: szafa i kołki

Zamawiasz szafę. Kurier przywozi szafę, ale też kołki, śrubki i ten mały klucz imbusowy, który zgubisz w ciągu tygodnia. Bez nich szafy nie złożysz.

Programy mają tak samo. Prawie żaden nie działa sam. Korzysta ze wspólnych bibliotek, czyli części, których używa wiele programów naraz. To są zależności. I tu jest cała magia menedżera pakietów: on sam sprawdza, czego brakuje, i dowozi.

Podejrzyjmy to bez instalowania niczego. Flaga -s to symulacja, próba generalna:

apt-get install -s cowsay
The following additional packages will be installed:
  libtext-charwidth-perl
Suggested packages:
  filters cowsay-off
The following NEW packages will be installed:
  cowsay libtext-charwidth-perl
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.

Prosisz o jedną krowę, przyjeżdżają dwa pakiety. Ten drugi to kołki. „Suggested” to rzeczy polecane, ale nieobowiązkowe, jak „klienci, którzy kupili szafę, kupili też lampkę”.

Zanim wymyślono takie hurtownie, admin szukał zależności ręcznie. Pobierasz program, a on mówi: brakuje biblioteki A. Pobierasz A, a A mówi: brakuje B. B potrzebuje C w innej wersji niż ta, której potrzebuje coś innego. Na to było nawet określenie: piekło zależności. Dziś menedżer pakietów rozwiązuje tę łamigłówkę za Ciebie w sekundę.

Podpisy: plomba na kartonie

Skąd wiesz, że karton nie został otwarty po drodze i ktoś nie dorzucił do niego niespodzianki? Bo ma plombę.

Hurtownia podpisuje swój katalog kluczem kryptograficznym GPG. Twój system ma u siebie publiczną połowę tego klucza i przy każdym pobraniu sprawdza podpis. Katalog zawiera sumy kontrolne każdego pakietu, więc podmieniony karton nie przejdzie. Widziałeś to już w pliku z hurtowniami: Signed-By wskazuje, którym kluczem sprawdzać tę hurtownię.

[RHEL] Na Red Hacie w każdym pliku .repo jest gpgcheck=1 i ścieżka do klucza, a same klucze leżą w /etc/pki/rpm-gpg/.

Złota zasada: jeśli instalacja nie przechodzi przez błąd podpisu, nie wyłączaj sprawdzania „żeby zadziałało”. To jak wyłączenie czujnika dymu, bo piszczy. Piszczy z jakiegoś powodu.

Dwa piętra: magazynier i kierownik

Menedżer pakietów to tak naprawdę dwa narzędzia, jedno nad drugim.

Na dole jest magazynier. Wniesie karton, który mu dasz, rozpakuje i porozkłada pliki. Ale jak czegoś brakuje, nie pojedzie do hurtowni. Powie „brakuje kołków” i założy ręce. To dpkg na Ubuntu i rpm na Red Hacie.

Na górze jest kierownik. Bierze Twoje zamówienie, sprawdza katalog, kompletuje zależności, przywozi wszystko i dopiero wtedy woła magazyniera. To apt na Ubuntu i dnf na Red Hacie.

Na co dzień rozmawiasz z kierownikiem. Do magazyniera idziesz, kiedy chcesz zapytać o coś, co już leży na półkach: jakie pliki dał pakiet, z którego pakietu jest dany plik.

A yum? To poprzednik dnf. Od RHEL 8 komenda yum jest po prostu drugą nazwą dla dnf, zostawioną dla zgodności ze starymi skryptami i starymi przyzwyczajeniami.

Cała rodzina hurtowni

Każda rodzina Linuksa ma swoją hurtownię i swojego kierownika. Idea jest wszędzie ta sama, różnią się słówka.

RodzinaFormat pakietuMagazynierKierownik
Debian, Ubuntu, Mint.debdpkgapt
Red Hat, Fedora, Rocky, Alma.rpmrpmdnf (yum)
SUSE, openSUSE.rpmrpmzypper
Arch.pkg.tar.zst—pacman
Alpine.apk—apk

Ta sama robota w różnych dialektach:

ZadanieUbuntuRHELSUSEArchAlpine
odśwież katalogapt updatednf makecachezypper refreshpacman -Syapk update
zainstalujapt install Xdnf install Xzypper install Xpacman -S Xapk add X
usuńapt remove Xdnf remove Xzypper remove Xpacman -R Xapk del X
zaktualizuj wszystkoapt upgradednf upgradezypper updatepacman -Syuapk upgrade
szukajapt search Xdnf search Xzypper search Xpacman -Ss Xapk search X
czyj jest plikdpkg -S plikrpm -qf plikrpm -qf plikpacman -Qo plik—

Arch to dystrybucja dla ludzi, którzy lubią mieć najnowsze wszystko, i jedno pacman -Syu robi tam odświeżenie i aktualizację naraz. Alpine to minimalista. Jest tak mały, że często spotkasz go jako bazę kontenerów, o czym będzie moduł o kontenerach. A SUSE spotkasz głównie w dużych firmach, a jego zypper ma krótkie skróty: zypper in, zypper rm, zypper se.

W tym kursie skupiamy się na dwóch pierwszych wierszach. Ubuntu i Red Hat to większość serwerów, które zobaczysz w pracy, i to o nie pytają na egzaminach RHCSA i LFCS.

Jak to działa pod spodem

Co się dzieje, kiedy wpisujesz sudo apt install cowsay?

  1. apt czyta katalog pobrany wcześniej przez apt update. Leży w /var/lib/apt/lists/, po jednym pliku na każdy dział każdej hurtowni.
  2. Rozwiązuje zależności, czyli układa listę wszystkich kartonów do zamówienia.
  3. Pobiera pliki .deb do /var/cache/apt/archives/ i sprawdza ich sumy kontrolne z podpisanym katalogiem.
  4. Woła dpkg, który rozpakowuje pliki i uruchamia skrypty instalacyjne.
  5. dpkg zapisuje w swojej bazie, że pakiet jest zainstalowany i jakie pliki do niego należą.

Ta baza to zwykłe pliki tekstowe. Wszystko jest plikiem, pamiętasz?

ls /var/lib/dpkg/info/ | grep openssh-server
openssh-server.conffiles
openssh-server.config
openssh-server.list
openssh-server.md5sums
openssh-server.postinst
openssh-server.postrm
openssh-server.preinst
openssh-server.prerm
openssh-server.templates

.list to spis plików z kartonu. .md5sums to ich sumy kontrolne. A preinst, postinst, prerm, postrm to właśnie instrukcja montażu: skrypty uruchamiane przed i po instalacji oraz przed i po usunięciu.

I tu jest ważna rzecz dla bezpieczeństwa. Te skrypty działają jako root. Instalując pakiet z jakiejś hurtowni, dajesz jej autorowi klucze do całego budynku. Dlatego dodajesz tylko hurtownie, którym ufasz.

[RHEL] Po stronie Red Hata katalog hurtowni to folder repodata z plikiem repomd.xml, kopie pobranych katalogów trzymane są w /var/cache/dnf/, a baza zainstalowanych pakietów w RHEL 10 leży w /usr/lib/sysimage/rpm/. Stara ścieżka /var/lib/rpm została jako drogowskaz, więc stare instrukcje dalej trafiają pod dobry adres.

Ściąga flag

KomendaFlagaCo robi
aptupdatepobiera świeży katalog z hurtowni
aptinstall Xinstaluje pakiet z zależnościami
aptremove Xusuwa pakiet
aptsearch Xszuka w nazwach i opisach
aptshow Xpokazuje etykietę pakietu
apt-get-ssymulacja, nic nie instaluje
dpkg-S plikz którego pakietu jest plik
dnfinstall / remove Xinstaluje / usuwa
dnfsearch / info Xszuka / pokazuje etykietę
rpm-qf plikz którego pakietu jest plik
zypperin / rm / seinstaluje / usuwa / szuka
pacman-S / -R / -Ssinstaluje / usuwa / szuka
pacman-Syuodświeża katalog i aktualizuje wszystko
apkadd / delinstaluje / usuwa

⚠ Typowy błąd

Stawiasz świeży serwer z Ubuntu, logujesz się minutę po starcie, wpisujesz sudo apt install htop i dostajesz:

Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 3526 (apt-get)...

Albo przy bezpośrednim wołaniu magazyniera:

dpkg: error: dpkg frontend lock was locked by another process with pid 9199
Note: removing the lock file is always wrong, can damage the locked area
and the entire system. See <https://wiki.debian.org/Teams/Dpkg/FAQ#db-lock>.

Co się dzieje? W magazynie może pracować tylko jeden magazynier naraz. Inaczej dwóch wnosiłoby różne wersje tej samej szafy w to samo miejsce. Ktoś inny właśnie instaluje. Na świeżym Ubuntu to zwykle automatyczne aktualizacje bezpieczeństwa, które ruszają chwilę po starcie.

Rozwiązanie: poczekaj. Sprawdź, kto zajmuje magazyn:

ps aux | grep -E 'apt|dpkg'

I nigdy nie usuwaj pliku blokady. Sam komunikat mówi to wprost: usunięcie go jest zawsze błędem. To jak zdjęcie tabliczki „trwa remont” i wejście do pokoju, w którym ktoś akurat wylewa beton.

Jeśli instalacja została przerwana, na przykład zabrakło prądu albo ktoś zamknął terminal, następnym razem zobaczysz:

E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem.

I robisz dokładnie to, co mówi:

sudo dpkg --configure -a

Magazynier kończy rozpakowywać to, co zostawił w połowie.

[RHEL] dnf też ma swoją blokadę i też grzecznie czeka na poprzednika. Zasada ta sama: poczekaj, nie kombinuj.

✎ Zadanie

Na swojej maszynie wirtualnej, na Ubuntu albo na RHEL:

  1. Sprawdź, z jakich repozytoriów korzysta Twój system.
  2. Policz, ile masz zainstalowanych pakietów.
  3. Wypisz, od jakich pakietów zależy openssh-server.
  4. Zasymuluj instalację pakietu, którego nie masz (na Ubuntu na przykład cowsay, na RHEL zsh) i sprawdź, ile pakietów by doszło. Bez instalowania.
Pokaż rozwiązanie

Cztery pytania, po jednej, dwóch komendach. Najpierw Ubuntu:

ls /etc/apt/sources.list.d/
dpkg -l | grep -c '^ii'
apt-cache depends openssh-server
apt-get install -s cowsay | grep newly

Pierwsza pokazuje pliki z hurtowniami. Druga liczy zainstalowane pakiety. dpkg -l wypisuje wszystko, co magazynier ma w spisie, a linijki zainstalowanych pakietów zaczynają się od ii. U mnie:

1605

Tysiąc sześćset pięć pakietów. Na serwerze, który „nic nie robi”. Tak wygląda minimalizm w praktyce.

Trzecia wypisuje zależności, skrócone:

openssh-server
  PreDepends: init-system-helpers
  Depends: adduser
  Depends: libpam-modules
  Depends: openssh-client
  Depends: openssh-sftp-server
  Depends: procps
  Depends: libc6

A czwarta to symulacja z podsumowaniem: 1 newly installed, jeśli kołki do krowy już masz, albo 2 newly installed, jeśli nie.

[RHEL] Na Red Hacie:

dnf repolist
rpm -qa | wc -l
dnf repoquery --requires openssh-server
dnf install --assumeno zsh

--assumeno to odpowiedź „nie” na pytanie „czy instalować?” zadana z góry. Pokazuje całe zamówienie i grzecznie odchodzi od lady.

Co dalej

Wiesz już, jak działa hurtownia. W następnej lekcji wchodzimy do niej na zaplecze na Ubuntu: aktualizacje, które nie psują serwera, usuwanie razem z ustawieniami, sprzątanie po zależnościach, blokowanie wersji i automatyczne łatki bezpieczeństwa.