Instalacja DNF na RHEL/CentOS 7: Kompletny Przewodnik Techniczny
DNF (Dandified YUM) to menedżer pakietów nowej generacji dla dystrybucji Linux opartych na RPM, zaprojektowany jako pełne zastąpienie YUM. Zapewnia szybsze rozwiązywanie zależności dzięki bibliotece `libsolv`, mniejsze zużycie pamięci oraz stabilne API Python. Podczas gdy RHEL/CentOS 7 domyślnie korzysta z YUM, DNF można w pełni zainstalować za pośrednictwem repozytorium EPEL i uruchamiać równolegle z YUM — lub jako jego przezroczyste zastąpienie — na tym samym systemie.
Ten przewodnik przeprowadza przez cały proces instalacji, wyjaśnia różnice architektoniczne między YUM a DNF, omawia rzeczywiste przypadki brzegowe i dostarcza gotowe do użycia w środowisku produkcyjnym zestawienie poleceń.
Dlaczego DNF przewyższa YUM na RHEL/CentOS 7
Przed przystąpieniem do pracy z terminalem, zrozumienie *dlaczego* aktualizacja ma znaczenie, pomaga podjąć świadomą decyzję — szczególnie w długo działającym środowisku VPS Hosting, gdzie niezawodność zarządzania pakietami jest kluczowa.
Podstawowe różnice architektoniczne
YUM opiera się na resolverze zależności opartym na Pythonie, który ma dobrze udokumentowane problemy z wydajnością przy dużych drzewach zależności. DNF zastępuje ten resolver przez `libsolv` — silnik rozwiązywania zależności oparty na solverze SAT, pierwotnie opracowany przez SUSE. Praktyczne konsekwencje są znaczące:
- Szybkość rozwiązywania zależności: DNF rozwiązuje złożone łańcuchy zależności w ułamku czasu wymaganego przez YUM, co jest szczególnie zauważalne przy rozwiązywaniu konfliktów w dużych zestawach pakietów.
- Zużycie pamięci: YUM ładuje całe metadane repozytorium do pamięci. DNF używa leniwego ładowania i bardziej agresywnego buforowania, zmniejszając szczytowe zużycie RAM.
- Stabilność API: API Pythona YUM zmieniało się nieprzewidywalnie między wersjami pomocniczymi. DNF udostępnia udokumentowane, wersjonowane API Python, na którym autorzy wtyczek mogą polegać.
- Architektura wtyczek: DNF używa przejrzystego systemu wtyczek opartego na hookach. Wtyczki YUM często interferują ze sobą z powodu luźnego powiązania.
- Historia transakcji: DNF utrzymuje bogatszą bazę danych historii transakcji, dzięki czemu wycofywanie zmian i audyty są bardziej precyzyjne.
YUM vs. DNF: Porównanie funkcji
| Funkcja | YUM | DNF |
|---|
| — | — | — |
|---|
| Resolver zależności | Oparty na Pythonie (wewnętrzny) | Solver SAT `libsolv` |
|---|
| Zużycie pamięci | Wyższe (pełne ładowanie metadanych) | Niższe (leniwe ładowanie + agresywne buforowanie) |
|---|
| API Python | Niestabilne między wersjami | Stabilne, wersjonowane API |
|---|
| System wtyczek | Luźno powiązany, podatny na konflikty | Oparty na hookach, izolowany |
|---|
| Wycofywanie transakcji | Ograniczone | Pełna historia z obsługą wycofywania |
|---|
| Równoległe pobieranie | Nie | Tak (przez `librepo`) |
|---|
| Słabe zależności | Nieobsługiwane | Obsługiwane (`Recommends`, `Suggests`) |
|---|
| Strumienie modułów | Nieobsługiwane | Obsługiwane (DNF 4+) |
|---|
| Status utrzymania | Koniec życia | Aktywnie utrzymywany |
|---|
| Domyślny na RHEL/CentOS | 7 i wcześniejsze | 8 i nowsze |
|---|
Wymagania wstępne
Przed kontynuowaniem potwierdź następujące kwestie:
- Działająca instancja RHEL 7 lub CentOS 7 (bare metal, VM lub chmurowy VPS).
- Dostęp root lub sudo — wszystkie polecenia instalacyjne wymagają podwyższonych uprawnień.
- Aktywne połączenie z internetem — repozytorium EPEL musi być osiągalne.
- Co najmniej 500 MB wolnego miejsca na dysku dla DNF, jego zależności i pamięci podręcznej metadanych repozytorium.
Jeśli uruchamiasz minimalną instalację CentOS 7 na Serwerze Dedykowanym, sprawdź, czy `curl` i `wget` są dostępne, ponieważ czasami są nieobecne w okrojonych obrazach.
Krok 1: Aktualizacja istniejących pakietów systemowych
Synchronizacja bazy danych pakietów przed instalacją nowego oprogramowania zapobiega konfliktom wersji i zapewnia, że pakiet wydania EPEL instaluje się poprawnie względem bieżącego stanu bazy danych RPM.
“`bash
sudo yum update -y
“`
Co to robi: Pobiera i stosuje wszystkie dostępne aktualizacje dla aktualnie zainstalowanych pakietów, odświeża metadane repozytorium i odbudowuje blokadę transakcji RPM. W systemie produkcyjnym zaplanuj to podczas okna konserwacyjnego — aktualizacje jądra wymagają ponownego uruchomienia, aby weszły w życie.
Przypadek brzegowy: Jeśli `yum update` kończy się błędem `Multilib version problems`, uruchom `sudo yum update –setopt=protected_multilib=false -y` jako jednorazowe obejście, a następnie zbadaj konfliktujące pakiety przed kontynuowaniem.
Krok 2: Włączenie repozytorium EPEL
DNF nie jest dostępny w domyślnych repozytoriach bazowych CentOS/RHEL 7. Repozytorium Extra Packages for Enterprise Linux (EPEL), utrzymywane przez projekt Fedora, udostępnia go.
“`bash
sudo yum install epel-release -y
“`
Sprawdź, czy repozytorium jest aktywne:
“`bash
yum repolist | grep epel
“`
Oczekiwane wyjście powinno pokazywać `epel/x86_64` z niezerową liczbą pakietów (zazwyczaj 13 000+). Jeśli repozytorium wydaje się wyłączone, wymuś jego włączenie:
“`bash
sudo yum-config-manager –enable epel
“`
Uwaga dotycząca bezpieczeństwa: Pakiety EPEL są budowane i podpisywane przez zespół infrastruktury Fedora. Pakiet `epel-release` instaluje klucz GPG automatycznie. Możesz zweryfikować odcisk klucza na oficjalnym serwerze kluczy Fedora przed zaufaniem pakietom z tego repozytorium — krok wart wykonania w zabezpieczonych systemach produkcyjnych.
Za proxy lub zaporą sieciową? Jeśli Twój serwer nie może bezpośrednio dotrzeć do mirrorów Fedory, skonfiguruj `/etc/yum.conf` z ustawieniami proxy:
“`ini
proxy=http://your-proxy-server:port
proxy_username=user
proxy_password=pass
“`
Krok 3: Instalacja DNF
Po aktywacji EPEL zainstaluj DNF i jego podstawowe zależności jednym poleceniem:
“`bash
sudo yum install dnf -y
“`
Pobiera to `dnf`, `dnf-data`, `python-dnf`, `libcomps`, `librepo` i `libsolv` jako automatyczne zależności. Całkowity rozmiar pobierania wynosi zazwyczaj od 3 do 8 MB w zależności od tego, co jest już zainstalowane.
Co zostaje zainstalowane:
- `dnf` — główny plik binarny i interfejs wiersza poleceń
- `libsolv` — resolver zależności oparty na SAT
- `librepo` — biblioteka do równoległego pobierania
- `libcomps` — parser XML comps dla grup pakietów
- `python-dnf` — powiązania Python i biblioteka rdzenia DNF
Krok 4: Weryfikacja instalacji
Potwierdź, że DNF działa i sprawdź jego wersję:
“`bash
dnf –version
“`
Pomyślna instalacja daje wynik podobny do:
“`
4.0.9.2
Installed: dnf-0:4.0.9.2-1.el7.noarch at …
Built : CentOS BuildSystem <http://bugs.centos.org> at …
“`
Przeprowadź głębszą kontrolę poprawności, wyświetlając dostępne repozytoria widziane przez DNF:
“`bash
dnf repolist
“`
Wynik powinien odzwierciedlać to, co pokazuje `yum repolist`, potwierdzając, że DNF poprawnie odziedziczył istniejącą konfigurację repozytorium z `/etc/yum.repos.d/`.
Ważne: DNF na CentOS 7 odczytuje te same pliki `.repo` repozytorium co YUM. Migracja repozytorium nie jest wymagana. Oba narzędzia współdzielą `/etc/yum.repos.d/` i `/var/cache/` (w oddzielnych podkatalogach).
Krok 5: Podstawowe zestawienie poleceń DNF
DNF jest celowo kompatybilny z poleceniami YUM. Poniższa tabela obejmuje operacje, z których będziesz korzystać najczęściej:
| Zadanie | Polecenie DNF |
|---|
| — | — |
|---|
| Aktualizacja wszystkich pakietów | `sudo dnf update -y` |
|---|
| Instalacja pakietu | `sudo dnf install <package> -y` |
|---|
| Usunięcie pakietu | `sudo dnf remove <package> -y` |
|---|
| Wyszukiwanie pakietu | `dnf search <keyword>` |
|---|
| Informacje o pakiecie | `dnf info <package>` |
|---|
| Lista zainstalowanych pakietów | `dnf list installed` |
|---|
| Lista dostępnych aktualizacji | `dnf check-update` |
|---|
| Czyszczenie buforowanych metadanych | `sudo dnf clean all` |
|---|
| Przeglądanie historii transakcji | `dnf history` |
|---|
| Wycofanie transakcji | `sudo dnf history undo <id>` |
|---|
| Instalacja grupy pakietów | `sudo dnf groupinstall "<group>"` |
|---|
| Włączenie repozytorium | `sudo dnf config-manager –enable <repo>` |
|---|
Historia transakcji DNF i wycofywanie zmian
Jest to jedna z najbardziej wartościowych operacyjnie funkcji DNF, z którą YUM radzi sobie słabo. Każda instalacja, aktualizacja lub usunięcie jest rejestrowane w `/var/lib/dnf/history/`. Aby sprawdzić ostatnie transakcje:
“`bash
dnf history list
“`
Aby zobaczyć dokładnie, co zmieniło się w konkretnej transakcji:
“`bash
dnf history info <transaction-id>
“`
Aby cofnąć transakcję (na przykład wycofanie błędnej aktualizacji):
“`bash
sudo dnf history undo <transaction-id>
“`
Ta możliwość jest szczególnie przydatna na VPS z cPanel, gdzie aktualizacja pakietu może kolidować z zależnościami panelu sterowania.
Plik konfiguracyjny DNF
Globalna konfiguracja DNF znajduje się w `/etc/dnf/dnf.conf`. Kluczowe parametry dostrajania dla użytku produkcyjnego:
“`ini
[main]
gpgcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=True
skip_if_unavailable=False
“`
- `installonly_limit=3` — zachowuje tylko ostatnie 3 wersje jądra, zapobiegając zapełnieniu `/boot`.
- `clean_requirements_on_remove=True` — automatycznie usuwa osierocone zależności przy usuwaniu pakietu.
- `best=True` — zawsze instaluje najnowszą dostępną wersję, zgłaszając błąd zamiast cichego obniżania wersji.
Krok 6: Konfiguracja DNF jako domyślnego menedżera pakietów
Na RHEL/CentOS 7 YUM pozostaje domyślnym systemem. Masz dwie opcje, aby uczynić DNF swoim głównym interfejsem.
Opcja A: Alias powłoki (poziom użytkownika, nieniszczący)
Dodaj następujące do `~/.bashrc` (dla bieżącego użytkownika) lub `/etc/bashrc` (dla całego systemu):
“`bash
alias yum='dnf'
“`
Zastosuj natychmiast:
“`bash
source ~/.bashrc
“`
Ograniczenie: Ten alias ma zastosowanie tylko do interaktywnych sesji powłoki. Skrypty, które wywołują `yum` bezpośrednio przez bezwzględną ścieżkę (`/usr/bin/yum`) lub uruchamiane przez innych użytkowników (np. zadania cron, jednostki systemd), nie są nim objęte.
Opcja B: Dowiązanie symboliczne (poziom systemowy)
Dla bardziej gruntownego zastąpienia utwórz dowiązanie symboliczne, które przekierowuje plik binarny `yum` do `dnf`:
“`bash
sudo mv /usr/bin/yum /usr/bin/yum.bak
sudo ln -s /usr/bin/dnf /usr/bin/yum
“`
Krytyczne ostrzeżenie: To podejście dotyczy wszystkich użytkowników i wszystkich skryptów w całym systemie. Najpierw dokładnie przetestuj w środowisku nieprodukcyjnym. Niektóre skrypty systemowe i narzędzia innych firm (w tym niektóre komponenty cPanel/WHM) jawnie wywołują `/usr/bin/yum` i mogą zachowywać się nieoczekiwanie, jeśli plik binarny zostanie zastąpiony. Zawsze twórz kopię zapasową oryginalnego pliku binarnego, jak pokazano powyżej.
Opcja C: DNF jako wtyczka YUM (zalecane dla serwerów)
Najczystszym podejściem dla serwerów produkcyjnych jest pozostawienie YUM nietkniętego i używanie `dnf` jawnie we własnych przepływach pracy i skryptach automatyzacji. Pozwala to uniknąć ryzyka uszkodzenia narzędzi systemowych, jednocześnie dając pełny dostęp do możliwości DNF.
Praktyczne pułapki i przypadki brzegowe
Są to problemy, które pojawiają się w rzeczywistych wdrożeniach i rzadko są omawiane w podstawowych samouczkach.
Konflikty kluczy GPG: Jeśli instalujesz pakiety z wielu repozytoriów innych firm, ściślejsze egzekwowanie GPG przez DNF (gdy `gpgcheck=1`) może odrzucać pakiety, które YUM wcześniej akceptował po cichu. Zawsze importuj klucze GPG repozytorium jawnie za pomocą `sudo rpm –import <key-url>`.
Niezgodność wtyczek: Niektóre wtyczki YUM (np. `yum-plugin-fastestmirror`) nie mają bezpośredniego odpowiednika w DNF lub zachowują się inaczej. DNF ma własną wtyczkę `fastestmirror` (`dnf-plugin-fastestmirror`), ale nie jest ona domyślnie włączona. Zainstaluj ją za pomocą `sudo dnf install python3-dnf-plugin-fastestmirror`.
Rozbieżność lokalizacji pamięci podręcznej: YUM buforuje metadane w `/var/cache/yum/`. DNF używa `/var/cache/dnf/`. Jeśli miejsce na dysku jest ograniczone, obie pamięci podręczne mogą współistnieć i zajmować znaczną przestrzeń. Uruchom `sudo dnf clean all` i `sudo yum clean all` niezależnie, aby odzyskać miejsce.
Zarządzanie subskrypcjami RHEL: W zarejestrowanych systemach RHEL 7 (w przeciwieństwie do CentOS) wtyczka `subscription-manager` integruje się z YUM. DNF na RHEL 7 może nie w pełni honorować repozytoria chronione subskrypcją bez dodatkowej konfiguracji. Sprawdź za pomocą `subscription-manager repos –list-enabled` po przełączeniu.
Wrażliwość na wersję Pythona: DNF na CentOS 7 używa powiązań Python 2 (`python-dnf`). Jeśli uaktualniłeś system do Pythona 3, upewnij się, że nie przerywasz nieumyślnie łańcucha zależności `python-dnf`. DNF 4+ na RHEL 8+ używa natywnie Pythona 3.
Planowanie ścieżki migracji poza CentOS 7
CentOS 7 osiągnął koniec życia 30 czerwca 2024 roku. Instalacja DNF jest użytecznym usprawnieniem operacyjnym, ale nie zmienia podstawowej postawy bezpieczeństwa dystrybucji EOL. Jeśli nadal uruchamiasz obciążenia CentOS 7, plan migracji do AlmaLinux 8/9, Rocky Linux 8/9 lub RHEL 8/9 powinien znaleźć się na Twojej mapie drogowej. Wszystkie te dystrybucje używają DNF natywnie, dzięki czemu znajomość, którą teraz budujesz, jest bezpośrednio przenoszalna.
Dla zespołów zarządzających wieloma usługami na starzejącej się infrastrukturze, Panele sterowania VPS mogą znacznie uprościć zarządzanie równoległymi środowiskami podczas okna migracji.
Jeśli Twoje obciążenia obejmują stosy hostingu stron internetowych, migracja do nowoczesnej dystrybucji umożliwia również pełne wykorzystanie automatyzacji Certyfikatów SSL przez Certbot i ACME, które mają znacznie lepsze wsparcie na RHEL 8+ i jego pochodnych.
Szybka macierz decyzyjna
Użyj tej listy kontrolnej przed i po instalacji, aby potwierdzić czyste, bezpieczne dla środowiska produkcyjnego skonfigurowanie:
- [ ] `yum update -y` zakończone bez błędów przed instalacją EPEL
- [ ] Repozytorium EPEL zweryfikowane jako aktywne przez `yum repolist | grep epel`
- [ ] `dnf –version` zwraca prawidłowy ciąg wersji
- [ ] Wynik `dnf repolist` odpowiada wynikowi `yum repolist`
- [ ] `/etc/dnf/dnf.conf` przejrzany i dostrojony do Twojego środowiska
- [ ] `installonly_limit` ustawiony, aby zapobiec przepełnieniu partycji `/boot`
- [ ] Podjęta decyzja dotycząca strategii aliasu vs. dowiązania symbolicznego vs. współistnienia
- [ ] Plik binarny YUM zarchiwizowany, jeśli zastosowano podejście z dowiązaniem symbolicznym
- [ ] Zadania cron i skrypty automatyzacji sprawdzone pod kątem zakodowanych na stałe ścieżek `yum`
- [ ] Udokumentowana oś czasu migracji po EOL CentOS 7
FAQ
Czy DNF i YUM mogą współistnieć na tym samym systemie CentOS 7 bez konfliktów?
Tak. Oba narzędzia odczytują z `/etc/yum.repos.d/` i utrzymują oddzielne katalogi pamięci podręcznej. Współdzielą bazę danych RPM (`/var/lib/rpm`), więc transakcja zakończona przez jedno jest natychmiast widoczna dla drugiego. Jednoczesne uruchamianie obu (np. dwie równoczesne instalacje) spowoduje konflikt blokady RPM, ale sekwencyjne użycie jest w pełni bezpieczne.
Czy instalacja DNF na CentOS 7 uszkodzi istniejące wtyczki YUM?
Nie. DNF instaluje się jako niezależny plik binarny i nie modyfikuje instalacji YUM. Twoje istniejące wtyczki YUM pozostają nienaruszone. Jednak DNF nie ładuje wtyczek YUM — jeśli polegasz na konkretnych wtyczkach YUM, musisz osobno znaleźć i zainstalować ich odpowiedniki dla DNF.
Czy DNF na CentOS 7 obsługuje moduły DNF (strumienie modułów)?
Nie. Strumienie modułów DNF to funkcja wprowadzona w DNF 4 i RHEL/CentOS 8. Wersja DNF dostępna przez EPEL dla CentOS 7 to DNF 4.x, ale obsługa strumieni modułów wymaga infrastruktury repozytorium AppStream, która nie istnieje na CentOS 7.
Dlaczego `dnf update` czasami daje inne wyniki niż `yum update` na tym samym systemie?
Resolver `libsolv` DNF stosuje ściślejszą logikę zależności i może rozwiązywać wybory wersji inaczej niż wewnętrzny resolver YUM. W większości przypadków wynik jest identyczny, ale w środowiskach ze złożonymi lub konfliktującymi zależnościami DNF może wybierać różne wersje pakietów lub odmawiać transakcji, które YUM by po cichu zaakceptował. Jest to funkcja, a nie błąd — zachowanie DNF jest bardziej przewidywalne i audytowalne.
Czy bezpieczne jest używanie DNF na serwerze CentOS 7 hostującym produkcyjne aplikacje internetowe?
Tak, z zastrzeżeniem, że używasz podejścia współistnienia (pozostawiasz YUM nietkniętym, używasz DNF jawnie) zamiast zastępowania pliku binarnego YUM. Przed przełączeniem głównego przepływu pracy na DNF sprawdź, czy żadne oprogramowanie panelu sterowania ani automatyzacja wdrożeń na Twoim serwerze nie ma zakodowanych na stałe założeń dotyczących zachowania YUM.
