Przejdź do treści
Lekcja 65 z 117

Kurs › Moduł 7 › Lekcja 65

apt i dpkg z bliska

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

Po tej lekcji: kursant bezpiecznie aktualizuje Ubuntu, instaluje, usuwa i czyści pakiety, sprawdza, skąd pochodzi plik, blokuje wersję pakietu i włącza automatyczne łatki bezpieczeństwa.

Wstęp

terminal, po apt list --upgradable przewija się długa lista

Dostajesz w spadku serwer. Nikt go nie aktualizował od półtora roku. Poprzedni admin zostawił karteczkę: „działa, nie ruszać”. Wpisujesz jedną komendę i widzisz trzysta pakietów do aktualizacji, w tym kilkadziesiąt łatek bezpieczeństwa.

Ruszać czy nie ruszać? Ruszać. Ale z głową. Dziś poznasz zaplecze hurtowni na Ubuntu: jak aktualizować, żeby nic nie wyleciało, jak usuwać, żeby nie zostawiać śmieci, jak przytrzymać pakiet w starej wersji i jak sprawić, żeby łatki bezpieczeństwa instalowały się same, zanim ktoś znowu napisze karteczkę.

Trzy słowa, które wszyscy mylą: update, upgrade, full-upgrade

Wracamy do hurtowni.

apt update to pobranie nowego katalogu. Nic się w systemie nie zmienia. Dowiadujesz się tylko, co jest nowego na stanie.

apt upgrade to wymiana mebli na nowsze modele. Ważna zasada: nigdy niczego nie wyrzuca. Jeśli nowy model szafy wymaga nowych kołków, dowiezie kołki. Ale jeśli wymiana wymagałaby wyniesienia czegokolwiek z mieszkania, to tej wymiany nie zrobi i zostawi mebel w starej wersji.

apt full-upgrade robi to samo, ale wolno mu wyrzucić stary mebel, jeśli bez tego całość się nie złoży. Potrzebne rzadziej, ale na przykład przy większych zmianach w bibliotekach.

Bezpieczna kolejność na serwerze:

sudo apt update
apt list --upgradable
sudo apt upgrade

Środkowa komenda to podgląd: lista pakietów, dla których jest nowsza wersja. Patrzysz, zanim podpiszesz zamówienie. A apt upgrade i tak przed startem pokaże, co zrobi, i zapyta „Do you want to continue?”. Czytaj to, zanim wciśniesz Enter. Szczególnie przy full-upgrade, bo tam może stać lista „REMOVED”.

[RHEL] Na Red Hacie nie ma podziału na update i upgrade. dnf upgrade sam odświeża katalog, gdy jest za stary, i od razu aktualizuje. Szczegóły w następnej lekcji.

Instalowanie i szukanie

Szukanie po nazwie i opisie:

apt search --names-only '^cowsay'
cowsay/noble 3.03+dfsg2-8 all
  configurable talking cow

cowsay-off/noble 3.03+dfsg2-8 all
  configurable talking cow (offensive cows)

Bez --names-only apt przeszuka też opisy i dostaniesz pół hurtowni. ^ to znany z wyrażeń regularnych początek tekstu.

Etykietę już znasz: apt show cowsay. Instalacja:

sudo apt install cowsay
/usr/games/cowsay Muuu
 ______
< Muuu >
 ------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Czemu pełna ścieżka? Bo gry, a krowa ma sekcję „games”, lądują w /usr/games. Na zwykłym koncie Ubuntu ten folder jest w PATH, ale nie zawsze dla roota. Jeśli cowsay mówi „command not found”, a pakiet się zainstalował, to krowa nie uciekła, tylko stoi w innej oborze.

Usuwanie: remove, purge, autoremove

Trzy różne poziomy sprzątania.

Do pokazu potrzebuję pakietu, który ma pliki ustawień w /etc. Mały serwer FTP, vsftpd, nada się idealnie. Najpierw zobaczmy, co przywiózł. To pytanie do magazyniera:

sudo apt install vsftpd
dpkg -L vsftpd | head
/.
/etc
/etc/ftpusers
/etc/init.d
/etc/init.d/vsftpd
/etc/logrotate.d
/etc/logrotate.d/vsftpd
/etc/pam.d
/etc/pam.d/vsftpd
/etc/vsftpd.conf

dpkg -L to lista plików z kartonu. Zmieniam coś w /etc/vsftpd.conf, jak każdy admin, i usuwam pakiet:

sudo apt remove vsftpd
dpkg -l vsftpd | tail -1
rc  vsftpd         3.0.5-0ubuntu3.1 amd64        lightweight, efficient FTP server written for security

rc znaczy: usunięty (removed), ale zostały pliki ustawień (config-files). Program zniknął, a /etc/vsftpd.conf z moją zmianą dalej leży. To celowe. Jak zainstalujesz go ponownie, Twoje ustawienia wrócą. Meble wyniesione, tapety zostały.

Żeby zedrzeć też tapety:

sudo apt purge vsftpd
Purging configuration files for vsftpd (3.0.5-0ubuntu3.1) ...

Teraz /etc/vsftpd.conf nie istnieje. Purge możesz zrobić od razu zamiast remove albo później, na pakiecie, który już jest w stanie rc.

A pudła po meblach? Przy usuwaniu apt pokazał coś takiego:

The following package was automatically installed and is no longer required:
  libtext-charwidth-perl

To kołki od krowy, którą kiedyś usunąłem. Pakiety zainstalowane automatycznie jako zależność zostają po usunięciu programu, który ich potrzebował. Sprząta się je osobno:

sudo apt autoremove
The following packages will be REMOVED:
  libtext-charwidth-perl
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.

Zawsze przeczytaj listę przed potwierdzeniem. Jeśli kiedyś ktoś zainstalował coś ważnego tylko jako zależność, a potem usunął program główny, autoremove też to wyniesie.

Która wersja przyjedzie: apt-cache policy

Czasem ten sam pakiet jest w dwóch działach hurtowni w różnych wersjach. Kto wygrywa?

apt-cache policy tree
tree:
  Installed: (none)
  Candidate: 2.1.1-2ubuntu3.24.04.2
  Version table:
     2.1.1-2ubuntu3.24.04.2 500
        500 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages
     2.1.1-2ubuntu3 500
        500 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages

Installed to wersja, którą masz. Candidate to wersja, którą apt zainstaluje. Pod spodem wszystkie dostępne wersje i skąd pochodzą. Liczba 500 to priorytet. Przy równych priorytetach wygrywa nowsza wersja. Ta komenda jest pierwszą rzeczą, którą wpisujesz, kiedy pytasz „czemu apt instaluje mi nie tę wersję”.

Blokowanie wersji: apt-mark hold

Masz aplikację, która działa tylko z jedną wersją jakiegoś pakietu. Albo wiesz, że nowa wersja ma błąd. Chcesz, żeby apt upgrade omijał ten pakiet szerokim łukiem. To jest naklejka „NIE RUSZAĆ” na meblu.

sudo apt-mark hold tree
apt-mark showhold
sudo apt-mark unhold tree
tree set on hold.
tree
Canceled hold on tree.

Pakiet na hold nie zostanie zaktualizowany przy apt upgrade. I to jest zarówno zaleta, jak i pułapka. Naklejka nie odpada sama. Pakiet zablokowany „na tydzień” potrafi wisieć trzy lata bez łatek bezpieczeństwa. Zapisuj sobie, co i dlaczego blokujesz.

[RHEL] Na Red Hacie to samo robi wtyczka versionlock: dnf versionlock add nazwa.

Hurtownie: /etc/apt/sources.list.d

Widziałeś już plik ubuntu.sources. Każda dodatkowa hurtownia dostaje w tym folderze własny plik. Na przykład tak wygląda wpis repozytorium Dockera dodany według jego oficjalnej instrukcji:

cat /etc/apt/sources.list.d/docker.list
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu   noble stable

To starszy, jednolinijkowy format, który wciąż działa obok nowego .sources. Najważniejsze jest signed-by: ta hurtownia jest sprawdzana tylko swoim kluczem, który leży w /etc/apt/keyrings/. Każda hurtownia ma własną plombę.

A sam plik /etc/apt/sources.list na Ubuntu 24.04 jest już tylko drogowskazem:

# Ubuntu sources have moved to the /etc/apt/sources.list.d/ubuntu.sources
# file, which uses the deb822 format. Use deb822-formatted .sources files
# to manage package sources in the /etc/apt/sources.list.d/ directory.

Po każdej zmianie w tym folderze: sudo apt update.

Magazynier od kuchni: dpkg -l, -L, -S, -i

Cztery pytania, które zadajesz bezpośrednio dpkg.

dpkg -l to spis inwentarza. Pierwsze dwie litery to stan: ii zainstalowany, rc usunięty, ale zostały ustawienia, iU rozpakowany, ale nieskonfigurowany. To ostatnie widzisz, kiedy coś poszło nie tak.

dpkg -L pakiet to lista plików z kartonu. Już znasz.

dpkg -S plik to pytanie odwrotne: z którego kartonu jest ten plik?

dpkg -S /usr/bin/ls
coreutils: /usr/bin/ls

ls należy do pakietu coreutils, czyli podstawowych narzędzi GNU. Działa tylko dla plików z zainstalowanych pakietów.

dpkg -i plik.deb to wniesienie kartonu, który przyniosłeś sam, z pominięciem kierownika. Pobiorę sobie paczkę z krową na dysk i spróbuję:

apt download cowsay
sudo dpkg -i cowsay_3.03+dfsg2-8_all.deb
dpkg: dependency problems prevent configuration of cowsay:
 cowsay depends on libtext-charwidth-perl; however:
  Package libtext-charwidth-perl is not installed.

dpkg: error processing package cowsay (--install):
 dependency problems - leaving unconfigured

Magazynier wniósł karton, rozpakował i stanął. Kołków nie ma, a po kołki nie pojedzie, bo to nie jego robota. Pakiet zostaje w stanie iU. Ratunek to zawołanie kierownika:

sudo apt -f install
Correcting dependencies... Done
The following NEW packages will be installed:
  libtext-charwidth-perl

-f to „fix broken”, napraw zepsute. Apt dowozi brakujące zależności i kończy konfigurację. W lekcji o programach spoza repozytorium pokażę wygodniejszy sposób na pobrane pliki .deb.

Automatyczne łatki: unattended-upgrades

Na Ubuntu Server pakiet unattended-upgrades jest instalowany domyślnie i od razu włączone jest automatyczne instalowanie łatek bezpieczeństwa. Sprawdźmy, co dokładnie robi. Dwa pliki w /etc/apt/apt.conf.d/:

cat /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

Ten mówi „czy i jak często”: codziennie odśwież katalog i codziennie zainstaluj łatki. Jedynka to liczba dni. Drugi plik, 50unattended-upgrades, mówi „co”:

Unattended-Upgrade::Allowed-Origins {
	"${distro_id}:${distro_codename}";
	"${distro_id}:${distro_codename}-security";
	"${distro_id}ESMApps:${distro_codename}-apps-security";
	"${distro_id}ESM:${distro_codename}-infra-security";
};

Czyli automatem lecą łatki bezpieczeństwa, a zwykłe poprawki z -updates domyślnie nie. W tym pliku jest też czarna lista pakietów, których automat ma nie dotykać, i opcja Automatic-Reboot, domyślnie wyłączona. Serwer nie zrestartuje się sam o trzeciej w nocy, chyba że mu na to pozwolisz.

Próba generalna:

sudo unattended-upgrade -v --dry-run
Starting unattended upgrades script
Allowed origins are: o=Ubuntu,a=noble, o=Ubuntu,a=noble-security, o=UbuntuESMApps,a=noble-apps-security, o=UbuntuESM,a=noble-infra-security
No packages found that can be upgraded unattended and no pending auto-removals

Co robił automat, sprawdzisz w /var/log/unattended-upgrades/. A uruchamiają go dwa budziki systemd: apt-daily.timer i apt-daily-upgrade.timer. To właśnie one zajmują magazyn chwilę po starcie serwera, o czym był typowy błąd w poprzedniej lekcji.

[RHEL] Na Red Hacie odpowiednikiem jest pakiet dnf-automatic.

Jak to działa pod spodem

Co robi apt upgrade krok po kroku? Porównuje wersje zainstalowane z bazy dpkg (plik /var/lib/dpkg/status) z kandydatami z katalogu w /var/lib/apt/lists/. Dla każdego pakietu, gdzie kandydat jest nowszy, układa plan. Rozwiązuje zależności tak, żeby nic nie usuwać. Pobiera pliki .deb i woła dpkg z całą paczką naraz.

dpkg przy aktualizacji robi coś sprytnego z plikami ustawień. Jeśli nie zmieniłeś pliku z /etc, podmienia go na nowy. Jeśli zmieniłeś, a autor pakietu też go zmienił, zatrzymuje się i pyta, co zrobić: zostawić Twoją wersję, wziąć nową czy pokazać różnice. Dlatego pliki ustawień są w pakiecie oznaczone jako conffiles. Lista leży obok spisu plików:

cat /var/lib/dpkg/info/vsftpd.conffiles
/etc/ftpusers
/etc/init.d/vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd.conf

I właśnie te pliki zostają po remove, a znikają po purge.

Historię wszystkich operacji apt zapisuje w /var/log/apt/history.log, a dpkg w /var/log/dpkg.log. Kto, kiedy, jaką komendą. Przyda się w zadaniu z lekcji 67.

Ściąga flag

KomendaFlagaCo robi
aptupdatepobiera nowy katalog, nic nie instaluje
aptupgradeaktualizuje, nigdy nie usuwa pakietów
aptfull-upgradeaktualizuje, może usuwać pakiety
aptlist --upgradablelista pakietów do aktualizacji
aptinstall / remove Xinstaluje / usuwa (ustawienia zostają)
aptpurge Xusuwa razem z ustawieniami
aptautoremoveusuwa niepotrzebne zależności
apt-f installnaprawia brakujące zależności
aptsearch --names-only Xszuka tylko w nazwach
apt-cachepolicy Xwersje dostępne i kandydat
apt-markhold / unhold / showholdblokuje / odblokowuje / pokazuje blokady
dpkg-lspis pakietów ze stanem (ii, rc, iU)
dpkg-L Xpliki pakietu
dpkg-S plikdo którego pakietu należy plik
dpkg-i plik.debinstaluje plik bez rozwiązywania zależności
dpkg--configure -akończy przerwaną instalację
unattended-upgrade-v --dry-runpróba automatycznych łatek

⚠ Typowy błąd

Chcesz sprawdzić, z którego pakietu jest ls. Pamiętasz z lekcji, że leży w /bin, więc:

dpkg -S /bin/ls
dpkg-query: no path found matching pattern /bin/ls

Jak to, nie ma? Przecież ls działa!

Pamiętasz z lekcji 8, że na nowym Ubuntu /bin to już nie prawdziwy folder, tylko drogowskaz do /usr/bin? Plik fizycznie leży w /usr/bin/ls i pod tą ścieżką zapisał go magazynier. dpkg nie podąża za drogowskazami, porównuje ścieżki dosłownie. Rozwiązanie: pytaj o prawdziwą ścieżkę. Jeśli nie wiesz, jaka jest, zapytaj system:

dpkg -S "$(readlink -f /bin/ls)"
coreutils: /usr/bin/ls

readlink -f przechodzi przez wszystkie drogowskazy i podaje prawdziwy adres. Ten sam trik zadziała, gdy plik jest dowiązaniem symbolicznym do czegoś w innym pakiecie.

✎ Zadanie

Na Ubuntu w maszynie wirtualnej:

  1. Zainstaluj pakiet sl i sprawdź, jakie pliki przywiózł.
  2. Sprawdź, do którego pakietu należy /usr/bin/apt.
  3. Zablokuj aktualizacje pakietu sl, pokaż listę blokad i odblokuj.
  4. Usuń sl razem z ustawieniami i posprzątaj niepotrzebne zależności.
  5. Sprawdź próbą generalną, co zrobiłby automat łatek bezpieczeństwa.

Jeśli masz tylko RHEL, poczekaj: w następnej lekcji zrobisz to samo dnf-em.

Pokaż rozwiązanie

Zadanie było na Ubuntu. Lokomotywa na start:

sudo apt install sl
dpkg -L sl | grep bin
dpkg -S /usr/bin/apt
/usr/games/sl
apt: /usr/bin/apt

sl to „steam locomotive”, czyli parowóz. Powstał jako kara za literówkę: chciałeś wpisać ls, wpisałeś sl, i przez ekran przejeżdża pociąg, którego nie da się zatrzymać. Edukacja przez traumę. A /usr/bin/apt należy do pakietu apt. Kierownik hurtowni też jest kartonem w hurtowni. Incepcja.

Blokada i sprzątanie:

sudo apt-mark hold sl
apt-mark showhold
sudo apt-mark unhold sl
sudo apt purge sl
sudo apt autoremove
sudo unattended-upgrade -v --dry-run
sl set on hold.
sl
Canceled hold on sl.

sl nie ma plików ustawień, więc purge niczego dodatkowego nie zdziera, ale nawyk zostaje. A autoremove po lokomotywie nie ma czego sprzątać, bo sl nie przywiózł żadnych nowych kołków. Wszystko, czego potrzebował, już było w systemie.

Co dalej

W następnej lekcji przesiadamy się do Red Hata. dnf i rpm: historia operacji z cofaniem jednym poleceniem, pliki .repo, lokalne repozytorium z płyty ISO, EPEL, łatki bezpieczeństwa i sprawdzanie, czy po aktualizacji trzeba zrestartować serwer.