dnf, rpm i repozytoria
Po tej lekcji: kursant instaluje, aktualizuje i usuwa pakiety na RHEL dnf-em, cofa zmiany z historii, zarządza repozytoriami (pliki .repo, lokalne repozytorium z ISO, EPEL), instaluje łatki bezpieczeństwa i odpytuje bazę rpm.
Wstęp
piątek, 16:45, terminal na serwerze z RHEL, właśnie skończyło się dnf upgrade, a w drugim oknie aplikacja wyrzuca błędy
Piątek, za kwadrans piąta. Zrobiłeś aktualizację, a aplikacja przestała działać. Na Ubuntu zaczynasz grzebać: co się zmieniło, z jakiej wersji na jaką, jak to cofnąć.
Na Red Hacie wpisujesz dwie komendy. Pierwsza pokazuje historię wszystkich operacji na pakietach z numerami. Druga cofa wybraną operację. Ctrl+Z dla całego serwera.
Dziś hurtownia Red Hata od zaplecza: dnf, rpm, pliki repozytoriów, płyta ISO jako hurtownia bez internetu, EPEL i łatki bezpieczeństwa.
Zanim cokolwiek: rejestracja (tylko RHEL)
Red Hat Enterprise Linux to system z subskrypcją. Dopóki nie zarejestrujesz maszyny, hurtownia Red Hata jest dla Ciebie zamknięta. Rocky Linux i AlmaLinux tego kroku nie mają, tam hurtownie są otwarte od razu.
sudo subscription-manager register
sudo subscription-manager repos --list-enabledPierwsza zapyta o login i hasło do konta Red Hat. W firmie częściej zobaczysz wersję z kluczem aktywacyjnym, bez wpisywania haseł:
sudo subscription-manager register --activationkey=<nazwa_klucza> --org=<ID_organizacji>Druga pokazuje, do których repozytoriów masz dostęp. Na świeżym RHEL 10 zobaczysz tam BaseOS i AppStream.
Hurtownie: repolist i pliki .repo
Do pokazów w tej lekcji zbudowałem sobie malutki pakiet powitanie i własną hurtownię z dwiema jego wersjami. Dzięki temu zobaczysz każdą operację od A do Z, bez czekania na prawdziwe aktualizacje. Wszystkie komendy działają identycznie z hurtowniami Red Hata.
dnf repolistrepo id repo name
lokalne Lokalne repozytorium kursuNa prawdziwym RHEL zobaczysz tu dwie linijki z BaseOS i AppStream. Skąd dnf wie o hurtowniach? Z plików w /etc/yum.repos.d/. Nazwa folderu to pamiątka po yumie. Zajrzyjmy do mojego:
[lokalne]
name=Lokalne repozytorium kursu
baseurl=file:///srv/repo
enabled=1
gpgcheck=0W nawiasie kwadratowym identyfikator. name to opis dla ludzi. baseurl to adres hurtowni: https:// dla serwera w internecie, file:// dla folderu na dysku. enabled=1 znaczy „korzystaj”. A gpgcheck=0 znaczy „nie sprawdzaj plomby”, co w moim domowym laboratorium jest w porządku, bo pakiet sam zbudowałem. W prawdziwej hurtowni zawsze gpgcheck=1 i linijka gpgkey= ze ścieżką do klucza.
dnf repolist --all pokaże też hurtownie wyłączone.
Dodawanie hurtowni z internetu. Wiele firm publikuje gotowy plik .repo, a dnf umie go pobrać i odłożyć na miejsce:
sudo dnf config-manager --add-repo http://127.0.0.1:8765/kurs.repoAdding repo from: http://127.0.0.1:8765/kurs.repoPlik ląduje w /etc/yum.repos.d/. Włączanie i wyłączanie hurtowni bez edytowania plików:
sudo dnf config-manager --disable kurs
sudo dnf config-manager --enable kursSzukanie, informacje, instalacja
dnf search powitanie
dnf info powitanie====================== Name & Summary Matched: powitanie =======================
powitanie.noarch : Wypisuje powitanie z pliku konfiguracyjnegoInstalacja, specjalnie starszej wersji, żeby było co aktualizować:
sudo dnf install powitanie-1.0Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
powitanie noarch 1.0-1 lokalne 6.3 k
Transaction Summary
================================================================================
Install 1 PackageNajpierw plan, potem pytanie „Is this ok [y/N]”. Duże N znaczy, że domyślna odpowiedź to „nie”. Red Hat zakłada, że jak wciśniesz Enter bez czytania, to raczej przez przypadek.
A teraz najczęstsze pytanie admina: „w którym pakiecie jest ta komenda?”. Na Ubuntu odpowiadał dpkg -S, ale tylko dla zainstalowanych pakietów. dnf przeszukuje całą hurtownię:
dnf provides /usr/bin/powitaniepowitanie-1.0-1.noarch : Wypisuje powitanie z pliku konfiguracyjnego
Repo : @System
Matched from:
Filename : /usr/bin/powitanie@System znaczy „już masz”. W prawdziwym życiu wpisujesz dnf provides semanage i dowiadujesz się, który pakiet doinstalować, żeby komenda z poradnika zaczęła działać. Jak podasz samą nazwę, dnf sam sprawdzi ją w /usr/bin i /usr/sbin.
Aktualizacje: check-update, upgrade, łatki bezpieczeństwa
dnf check-update
echo $?powitanie.noarch 1.1-1 lokalne
100Lista pakietów z nowszą wersją. I ciekawostka: kod wyjścia 100 znaczy „są aktualizacje”, a 0 „nie ma”. Kciuk ani w górę, ani w dół, tylko „mam wiadomość”. Idealne do skryptów.
sudo dnf upgradeUpgrading:
powitanie noarch 1.1-1 lokalne 6.3 kZauważ: na Red Hacie nie ma osobnego „update katalogu”. dnf sam odświeża katalog, kiedy jest starszy niż ustawiony czas. A komenda dnf update działa, ale to stara nazwa. Dokumentacja dnf oznacza ją jako przestarzały skrót do upgrade. Ludzie piszą yum update od lat i nikt im tego nie odbierze.
Łatki bezpieczeństwa. Red Hat do każdej poprawki wydaje komunikat, tak zwany advisory: co naprawia, jakie luki i jak bardzo jest pilny. dnf umie je czytać:
dnf updateinfo --security
dnf updateinfo list --security
sudo dnf upgrade --securityPierwsza daje podsumowanie: ile jest łatek bezpieczeństwa, z podziałem na ważność. Druga listę: identyfikator komunikatu, ważność i pakiet. Trzecia instaluje tylko pakiety z poprawkami bezpieczeństwa i nic poza tym. Idealne na serwer produkcyjny, gdzie „nowe funkcje” to ostatnie, czego chcesz w piątek.
Czy po aktualizacji trzeba zrestartować?
sudo dnf needs-restarting -r
echo $?-r to „reboothint”, podpowiedź o restarcie. Kod wyjścia 1 znaczy „restart potrzebny”, na przykład po nowym jądrze albo nowej bibliotece systemowej, 0 znaczy „nie trzeba”. Bez -r komenda wypisze procesy, które dalej używają starych wersji plików.
[Ubuntu] Na Ubuntu podobną rolę pełni plik /var/run/reboot-required. Jeśli istnieje, system prosi o restart.
Usuwanie
sudo dnf remove powitanieTu jest ważna różnica w stosunku do apt. dnf przy usuwaniu od razu sprząta zależności, które nie są już nikomu potrzebne. W pierwszej wersji mojej hurtowni powitanie wymagało jeszcze pomocniczego pakietu-atrapy. Zobacz, co dnf zaplanował:
Removing:
powitanie noarch 1.0-1 @lokalne 47
Removing unused dependencies:
bash-atrapa noarch 1.0-1 @lokalne 0Czyli remove i autoremove w jednym. Dokumentacja dnf mówi, że tak jest domyślnie, a wyłączysz to flagą --noautoremove. Osobne dnf autoremove też istnieje, na wypadek gdyby coś zostało.
Historia i cofanie
To jest supermoc dnf.
dnf historyID | Command line | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
2 | -y upgrade | 2026-11-03 16:41 | Upgrade | 1
1 | -y install powitanie-1.0 | 2026-11-03 16:41 | Install | 1Każda operacja ma numer, datę, komendę i liczbę zmienionych pakietów. Szczegóły jednej:
dnf history info 2Transaction ID : 2
Return-Code : Success
Command Line : -y upgrade
Packages Altered:
Upgrade powitanie-1.1-1.noarch @lokalne
Upgraded powitanie-1.0-1.noarch @@SystemI teraz Ctrl+Z:
sudo dnf history undo 2Downgrading:
powitanie noarch 1.0-1 lokalne 6.3 k
...
Downgraded:
powitanie-1.0-1.noarchdnf zrobił odwrotność operacji numer 2. Była aktualizacja, jest powrót do starej wersji. Cofnięcie samo też trafia do historii jako nowa operacja, więc można cofnąć cofnięcie. Jak w edytorze tekstu.
Jeden haczyk: żeby zejść do starej wersji, ta stara wersja musi być jeszcze dostępna w hurtowni. W mojej jest. W innych bywa różnie, więc sprawdzaj, zanim na tym oprzesz plan awaryjny.
Hurtownia bez internetu: lokalne repozytorium z ISO
Serwer w piwnicy banku, bez dostępu do internetu. Jak tam instalować pakiety? Płyta instalacyjna RHEL, ta pełna, w wersji DVD, zawiera komplet pakietów z BaseOS i AppStream. Robimy z niej hurtownię.
Montujemy obraz. Pamiętasz montowanie z modułu o dyskach?
sudo mkdir -p /mnt/rhel10
sudo mount -o loop,ro -t iso9660 /root/rhel-10-dvd.iso /mnt/rhel10
ls /mnt/rhel10W środku są foldery BaseOS i AppStream, każdy z własnym repodata. Plik /etc/yum.repos.d/dvd.repo:
[dvd-BaseOS]
name=RHEL 10 DVD BaseOS
baseurl=file:///mnt/rhel10/BaseOS
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[dvd-AppStream]
name=RHEL 10 DVD AppStream
baseurl=file:///mnt/rhel10/AppStream
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-releaseDwie sekcje, bo to dwie hurtownie. Pakiety z płyty są podpisane przez Red Hata, więc plomba zostaje włączona. Sprawdzenie:
dnf repolistŻeby montowanie przetrwało restart, dopisujesz obraz do /etc/fstab tak jak dysk, z typem iso9660 i opcjami loop,ro. To typowe zadanie egzaminacyjne na RHCSA, często w wersji „hurtownia jest pod adresem HTTP”, wtedy w baseurl wpisujesz ten adres.
EPEL: hurtownia dodatków
W repozytoriach Red Hata nie ma wszystkiego. Nie ma tam na przykład htop. Wtedy wchodzi EPEL, czyli Extra Packages for Enterprise Linux: dodatkowe pakiety budowane przez społeczność Fedory specjalnie pod RHEL i jego klony.
Na RHEL 10:
sudo subscription-manager repos --enable codeready-builder-for-rhel-10-$(arch)-rpms
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpmPierwsza włącza CodeReady Linux Builder, hurtownię z narzędziami dla programistów, której część pakietów z EPEL potrzebuje. Uwaga: Red Hat nie daje wsparcia dla pakietów z CodeReady. Druga instaluje pakiet, który zawiera plik .repo i klucz EPEL. Tak, instalujesz hurtownię jako pakiet. Karton, w którym jest adres innej hurtowni.
[Rocky / Alma] Tam jest prościej, bo epel-release jest w ich własnej hurtowni:
sudo dnf config-manager --set-enabled crb
sudo dnf install epel-releaseWażne: EPEL to nie Red Hat. Red Hat nie daje do tych pakietów wsparcia. Na serwerach firmowych dodawaj go świadomie, a nie odruchowo.
rpm: pytania do magazyniera
rpm to magazynier Red Hata. Nie instalujesz nim z hurtowni, ale pytasz o to, co już leży na półkach. Pięć pytań, które musisz znać, wszystkie zaczynają się od -q jak „query”, zapytanie:
rpm -qa | wc -l
rpm -qi powitanie-qa to wszystkie zainstalowane pakiety, „query all”. -qi to etykieta jednego pakietu:
Name : powitanie
Version : 1.0
Release : 1
Architecture: noarch
Install Date: Tue Nov 3 16:27:56 2026
Signature : (none)
Summary : Wypisuje powitanie z pliku konfiguracyjnegoSignature: (none), bo mój pakiet nie jest podpisany. Prawdziwe pakiety Red Hata mają tu informację o kluczu, którym je podpisano.
rpm -ql powitanie
rpm -qf /usr/bin/powitanie/etc/powitanie.conf
/usr/bin/powitanie
powitanie-1.0-1.noarch-ql to lista plików, jak dpkg -L. -qf to „do którego pakietu należy plik”, jak dpkg -S. Na RHEL rpm -qf /usr/bin/ls odpowie coreutils z numerem wersji.
I piąte pytanie, moje ulubione: czy ktoś grzebał w plikach pakietu?
rpm -V powitanieS.5....T. c /etc/powitanie.conf
.M....... /usr/bin/powitaniePusto znaczy „wszystko jak z fabryki”. Każda kropka to test, który przeszedł. Litera to test, który nie przeszedł. S zmienił się rozmiar, 5 zmieniła się suma kontrolna, czyli treść, T zmieniła się data modyfikacji, M zmieniły się uprawnienia. A c oznacza plik konfiguracyjny. Ja dopisałem linijkę do ustawień i zmieniłem uprawnienia programu. W ustawieniach to normalne. Ale zmieniona suma kontrolna w /usr/bin na serwerze, na którym nikt nic nie budował? To jest moment, w którym robi się zimno i zaczyna się śledztwo.
Jak to działa pod spodem
Hurtownia dnf to folder z pakietami i podfolderem repodata. Najważniejszy plik to repomd.xml, spis treści. Wskazuje na skompresowane spisy: primary z nazwami, wersjami i zależnościami, filelists z listami plików i other z historią zmian. W RHEL 10 dnf domyślnie nie pobiera już filelists, bo jest duży. Dociąga go dopiero wtedy, kiedy potrzebuje, na przykład przy dnf provides z pełną ścieżką.
dnf pobiera katalogi do /var/cache/dnf/, układa z nich łamigłówkę zależności i rozwiązuje ją. Potem pobiera pakiety, sprawdza podpisy i przekazuje transakcję do rpm. rpm wypakowuje pliki, uruchamia skrypty instalacyjne i zapisuje wszystko w swojej bazie. W RHEL 10 ta baza leży w /usr/lib/sysimage/rpm/, a /var/lib/rpm zostało jako drogowskaz.
I sprytna rzecz z plikami ustawień. Kiedy usuwałem pakiet ze zmienionym plikiem konfiguracyjnym, rpm napisał:
warning: /etc/powitanie.conf saved as /etc/powitanie.conf.rpmsaveZamiast wyrzucić Twoje ustawienia, odkłada je z dopiskiem .rpmsave. A przy aktualizacji, gdy zmieniłeś plik, a pakiet przynosi nową wersję, rpm zostawia Twój plik, a nowy kładzie obok jako .rpmnew. Po każdej większej aktualizacji warto poszukać takich plików:
sudo find /etc -name '*.rpmnew' -o -name '*.rpmsave'Ściąga flag
| Komenda | Flaga | Co robi |
|---|---|---|
| dnf | install / remove X | instaluje / usuwa razem z niepotrzebnymi zależnościami |
| dnf | upgrade | aktualizuje wszystko (stara nazwa: update) |
| dnf | check-update | lista aktualizacji, kod 100 gdy są |
| dnf | search / info X | szuka / pokazuje etykietę |
| dnf | provides plik | który pakiet dostarcza plik lub komendę |
| dnf | repolist --all | wszystkie hurtownie, także wyłączone |
| dnf | history / history info N | historia operacji / szczegóły jednej |
| dnf | history undo N | cofa operację N |
| dnf | updateinfo --security | podsumowanie łatek bezpieczeństwa |
| dnf | upgrade --security | instaluje tylko łatki bezpieczeństwa |
| dnf | needs-restarting -r | kod 1 gdy trzeba restartu |
| dnf | config-manager --add-repo URL | dodaje hurtownię z pliku .repo |
| dnf | config-manager --enable / --disable ID | włącza / wyłącza hurtownię |
| rpm | -qa | wszystkie zainstalowane pakiety |
| rpm | -qi X | etykieta pakietu |
| rpm | -ql X | pliki pakietu |
| rpm | -qf plik | do którego pakietu należy plik |
| rpm | -V X | czy pliki pakietu były zmieniane |
| subscription-manager | register | rejestruje RHEL |
⚠ Typowy błąd
Dodajesz hurtownię od zewnętrznej firmy, instalujesz i dostajesz:
Package powitanie-1.1-1.noarch.rpm is not signed
Error: GPG check FAILEDAlbo w innej wersji tego samego problemu dnf pyta, czy zaimportować klucz, którego nie znasz. W internecie pierwsza rada brzmi: ustaw gpgcheck=0. Nie rób tego. To jest dokładnie ten czujnik dymu, który piszczy.
Właściwe rozwiązanie: znajdź w dokumentacji dostawcy oficjalny adres klucza, sprawdź, że pobierasz go przez HTTPS z jego domeny, i wpisz go do pliku .repo w linijce gpgkey=. Albo zaimportuj ręcznie:
sudo rpm --import https://adres-dostawcy/klucz.ascDrugi błąd, który widzi każdy na świeżym RHEL: dnf kończy pracę komunikatem zaczynającym się od Error: There are no enabled repositories in, a dalej lista folderów, w których szukał plików .repo. Zwykle znaczy to jedno: system nie jest zarejestrowany. Wracasz do subscription-manager register z początku lekcji.
✎ Zadanie
Na RHEL, Rocky albo Alma w maszynie wirtualnej:
- Zainstaluj pakiet
tree, a potem znajdź tę instalację wdnf historyi cofnij ją przezhistory undo. - Sprawdź, do którego pakietu należy plik
/etc/ssh/sshd_configi czy był zmieniany od instalacji. - Sprawdź, ile jest dostępnych łatek bezpieczeństwa i czy Twój serwer potrzebuje restartu.
Pokaż rozwiązanie
Zadanie było na Red Hacie. Najpierw instalacja i cofnięcie:
sudo dnf install tree
dnf history
sudo dnf history undo 5Numer z dnf history będzie u Ciebie inny, u mnie przykładowo 5. Bierzesz ten z linijki, w której w kolumnie „Command line” stoi install tree. Po undo drzewko znika, a w historii pojawia się nowa linijka z akcją „Removed”. Cofnięcie też jest zapisane. Nic nie ginie, nawet kasowanie.
Plik konfiguracyjny SSH:
rpm -qf /etc/ssh/sshd_config
rpm -V openssh-serverPierwsza odpowie openssh-server z numerem wersji. Druga albo nic nie wypisze, czyli plik jest jak z fabryki, albo pokaże linijkę z S.5....T. i literką c przy /etc/ssh/sshd_config. To znaczy: ktoś zmienił ustawienia SSH. Jeśli tym kimś byłeś Ty, wszystko w porządku. Jeśli nikt się nie przyznaje, porozmawiamy o tym w module o bezpieczeństwie.
Łatki i restart:
dnf updateinfo --security
sudo dnf needs-restarting -r
echo $?Zero na końcu znaczy, że restart nie jest potrzebny. Jedynka znaczy, że jest. A jeśli w podsumowaniu łatek zobaczyłeś coś z napisem „Critical”, to już wiesz, co robisz dziś po obiedzie.
Co dalej
Hurtownie znasz już od podszewki. Ale co zrobić z programem, którego w żadnej hurtowni nie ma? W następnej lekcji: Flatpak, Snap, AppImage, pobrane pliki .deb i .rpm, kompilacja ze źródeł i co zrobić, kiedy program krzyczy, że nie może znaleźć biblioteki.