Programy spoza repozytorium
Po tej lekcji: kursant wie, kiedy i jak instalować programy spoza repozytorium dystrybucji (Flatpak, Snap, AppImage, pobrane .deb i .rpm, kompilacja ze źródeł), gdzie je kłaść (/usr/local, /opt) i jak naprawić program, który nie znajduje biblioteki.
Wstęp
Wchodzisz na stronę programu, który chcesz zainstalować. W hurtowni dystrybucji go nie ma. Producent daje Ci sześć przycisków. Sześć różnych sposobów na to samo. Który kliknąć?
Dziś przejdziemy przez wszystkie. Pokażę, czym się różnią, kiedy który ma sens, gdzie lądują pliki i co zrobić, kiedy program po instalacji mówi, że nie może znaleźć jakiejś biblioteki.
Najpierw: kolejność zaufania
Zanim cokolwiek klikniesz, zasada dla admina. Im dalej od hurtowni dystrybucji, tym więcej roboty i ryzyka spada na Ciebie.
- Repozytorium dystrybucji. Ktoś za Ciebie sprawdza, podpisuje i łata.
- Oficjalne repozytorium producenta, dodane do apt albo dnf, jak repozytorium Dockera z lekcji 65. Dalej masz aktualizacje razem z resztą systemu.
- Flatpak albo Snap. Aktualizacje są, ale osobnym kanałem.
- Pobrany plik .deb albo .rpm. Instalujesz raz i sam pamiętasz o aktualizacjach.
- AppImage. Jeden plik, zero integracji z systemem.
- Kompilacja ze źródeł. Pełna kontrola i pełna odpowiedzialność.
To jak z jedzeniem w pracy. Stołówka zakładowa ma sanepid. Catering ma certyfikat. A kanapka od kolegi „z domu” może być najlepsza na świecie, ale jak się zatrujesz, reklamacji nie złożysz.
Pobrany .deb i .rpm
Najprostszy przypadek. Producent daje karton, ale nie ma hurtowni. Zanim go wniesiesz, obejrzyj etykietę. Na przykładzie mojego testowego pakietu:
dpkg-deb -I powitanie_1.0_all.deb Package: powitanie
Version: 1.0
Architecture: all
Maintainer: Kurs <kurs@example.com>
Depends: sl
Description: Testowy pakiet do kursudpkg-deb -c pokaże listę plików w środku. Instalacja: w lekcji 65 wnosiliśmy karton dpkg -i i magazynier stawał bez kołków. Wygodniej poprosić kierownika, żeby wniósł karton z dysku i sam dowiózł zależności:
sudo apt install ./powitanie_1.0_all.debKropka i ukośnik są kluczowe. Bez nich apt myśli, że to nazwa pakietu z hurtowni:
sudo apt install powitanie_1.0_all.debE: Unable to locate package powitanie_1.0_all.deb./ mówi: „to jest plik, tutaj, w tym folderze”. Ten sam trik co przy uruchamianiu skryptów.
[RHEL] Na Red Hacie dnf od razu rozumie ścieżkę do pliku, a nawet adres URL:
rpm -qpi plik.rpm
rpm -qpl plik.rpm
rpm -qp --scripts plik.rpm
sudo dnf install ./plik.rpm-p znaczy „pytam o plik pakietu, nie o zainstalowany pakiet”. A --scripts pokazuje skrypty instalacyjne. Pamiętasz z lekcji 64? Działają jako root. Jeśli w skrypcie instalacyjnym „przeglądarki PDF” widzisz curl z jakiegoś adresu i | bash, to nie jest przeglądarka PDF.
Haczyk całej metody: taki pakiet nie aktualizuje się sam. Hurtownia nic o nim nie wie. Zanim pobierzesz plik, sprawdź na stronie producenta, czy nie ma repozytorium. Jeśli ma, wybierz repozytorium.
Flatpak: aplikacja w kontenerze z własną kuchnią
Program z Flatpaka przychodzi z własną kuchnią. Nie korzysta z bibliotek systemu, tylko z tak zwanego runtime'u, czyli wspólnego zestawu bibliotek, który Flatpak dociąga raz i dzieli między aplikacje. Do tego aplikacja działa w piaskownicy, czyli widzi tylko to, na co jej pozwolono. Jak kucharz w wynajętym food trucku: ma swój sprzęt, a do Twojej kuchni nie ma wstępu.
Flatpak żyje głównie na desktopach. Największa hurtownia nazywa się Flathub.
sudo apt install flatpak
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
flatpak install flathub org.gimp.GIMP
flatpak run org.gimp.GIMP
flatpak list --app
flatpak update
flatpak uninstall org.gimp.GIMP
flatpak uninstall --unused[RHEL] Instalacja samego Flatpaka: sudo dnf install flatpak. Reszta identyczna.
remote-add dodaje hurtownię. --if-not-exists sprawia, że druga próba nie wywali błędu. Aplikacje nazywają się odwróconą domeną, jak org.gimp.GIMP. uninstall --unused sprząta runtime'y, których już żadna aplikacja nie używa. To flatpakowe autoremove.
Domyślnie Flatpak instaluje dla całego systemu. Z flagą --user instalujesz tylko dla siebie, bez sudo.
Snap: paczka od Canonicala
Snap to podobny pomysł od Canonicala, firmy od Ubuntu. Też paczka z zależnościami w środku, też piaskownica, też osobna hurtownia: Snap Store. Na Ubuntu demon snapd zwykle jest już zainstalowany.
snap find nazwa
sudo snap install nazwa
snap list
sudo snap refresh
sudo snap remove nazwaWielka różnica: snapy aktualizują się same. Domyślnie snapd sprawdza aktualizacje cztery razy dziennie. Dla laptopa to wygoda. Dla serwera produkcyjnego to program, który może zmienić wersję we wtorek o 14:00 bez pytania. Da się to wstrzymać:
sudo snap refresh --hold=24h nazwaBez podanego czasu blokada jest bezterminowa.
Niektóre programy wymagają flagi --classic. To snap bez piaskownicy, z pełnym dostępem do systemu, jak zwykły program. Bez tej flagi snap takiego programu nie zainstaluje i podpowie, żeby jej użyć.
[RHEL] Na Red Hacie snap jest możliwy przez EPEL (snapd plus włączenie snapd.socket), ale oficjalna instrukcja Snapcrafta wymienia RHEL 7, 8 i 9. W świecie Red Hata to raczej egzotyka.
AppImage: program w jednym pliku
AppImage to najprostszy pomysł z całej trójki: cały program z bibliotekami w jednym pliku. Bez instalacji. Pobierasz, nadajesz prawo wykonywania i uruchamiasz. Jak gotowe danie w słoiku: otwierasz i jesz.
Na przykładzie narzędzia appimagetool, które samo jest AppImage'em:
./appimagetool-x86_64.AppImage --versionbash: line 1: ./appimagetool-x86_64.AppImage: Permission deniedPamiętasz klucze do pokojów? Pobrany plik nie ma prawa wykonywania. Nadajemy:
chmod +x appimagetool-x86_64.AppImage
./appimagetool-x86_64.AppImage --versionappimagetool, continuous build (git version 4919cc4), build 368 built on 2026-11-01 20:39:21 UTCDziała. Usunięcie programu to usunięcie pliku.
Starsze AppImage'e do działania potrzebują biblioteki FUSE w wersji 2, której nowe systemy nie mają domyślnie. Na Ubuntu 24.04 ten pakiet zmienił nazwę i instalujesz go tak:
sudo apt install libfuse2t64[RHEL] Na Fedorze i systemach z rodziny Red Hata szukasz pakietów fuse i fuse-libs.
Nowsze AppImage'e mają tę bibliotekę wbudowaną i nic nie trzeba doinstalowywać. Jeśli FUSE w ogóle nie działa, na przykład w kontenerze, jest wyjście awaryjne: --appimage-extract-and-run rozpakowuje program do folderu tymczasowego i uruchamia go stamtąd.
Minusy? Nikt Ci go nie zaktualizuje i nikt nie sprawdzi podpisu. Pobierasz tylko z oficjalnej strony producenta.
Kompilacja ze źródeł
Ostatni przycisk: „Source code”. Kod źródłowy, czyli przepis zamiast gotowego dania. Gotujesz sam.
Po co? Bo w hurtowni jest stara wersja. Na moim Ubuntu 24.04 jest htop 3.3.0, a autorzy wydali już 3.4.1. Zbudujmy go.
Najpierw narzędzia kuchenne: kompilator i biblioteki w wersji dla programistów, czyli z plikami nagłówkowymi. Pakiety z dopiskiem -dev na Ubuntu albo -devel na Red Hacie.
sudo apt install build-essential libncurses-dev[RHEL] sudo dnf group install "Development Tools" i sudo dnf install ncurses-devel.
Pobieramy źródła i sprawdzamy, czy nikt ich nie podmienił. Autorzy publikują obok plik z sumą kontrolną:
curl -LO https://github.com/htop-dev/htop/releases/download/3.4.1/htop-3.4.1.tar.xz
curl -LO https://github.com/htop-dev/htop/releases/download/3.4.1/htop-3.4.1.tar.xz.sha256
sha256sum -c htop-3.4.1.tar.xz.sha256htop-3.4.1.tar.xz: OKI trzy słowa, które w świecie Linuksa brzmią jak zaklęcie:
tar xf htop-3.4.1.tar.xz
cd htop-3.4.1
./configure --prefix=/usr/local
make -j"$(nproc)"
sudo make install./configure to inwentaryzacja kuchni. Sprawdza, czy masz kompilator i wszystkie biblioteki, i przygotowuje przepis pod Twój system. --prefix=/usr/local mówi, gdzie ma potem wylądować program. make to samo gotowanie, czyli kompilacja. -j"$(nproc)" znaczy „gotuj na tylu palnikach, ile masz rdzeni”. A make install rozkłada gotowe danie po półkach:
/usr/bin/install -c htop '/usr/local/bin'
/usr/bin/install -c -m 644 htop.desktop '/usr/local/share/applications'
/usr/bin/install -c -m 644 htop.1 '/usr/local/share/man/man1'Teraz w systemie są dwa htopy:
which -a htop
htop --version
/usr/bin/htop --version/usr/local/bin/htop
/usr/bin/htop
/bin/htop
htop 3.4.1-3.4.1
htop 3.3.0Wygrywa ten z /usr/local/bin, bo ten folder jest w PATH wcześniej niż /usr/bin. Trzeci wynik, /bin/htop, to ten sam plik co /usr/bin/htop, widziany przez drogowskaz /bin.
Uwaga, pułapka: menedżer pakietów nic nie wie o tym, co wrzuciłeś przez make install. Nie zaktualizuje tego, nie usunie i nie ostrzeże przed konfliktem. Wiele projektów, w tym htop, ma do sudo make install komendę w drugą stronę: sudo make uninstall. Ale nie licz, że każdy. Dlatego nie wyrzucaj folderu ze źródłami, dopóki program jest zainstalowany.
/usr/local i /opt: gdzie kłaść rzeczy spoza hurtowni
Pamiętasz plan biurowca z lekcji 8? Dwa piętra są zarezerwowane dla rzeczy, które nie przyszły z hurtowni dystrybucji. Menedżer pakietów ich nie rusza.
/usr/local to rzeczy zbudowane i zainstalowane lokalnie, ułożone tak jak w /usr: programy w /usr/local/bin, biblioteki w /usr/local/lib, dokumentacja w /usr/local/share. Tu domyślnie trafia prawie wszystko, co budujesz przez ./configure && make install.
/opt to duże programy, które przychodzą w całości, z własnym folderem: /opt/firma/program/. W środku mają często własne bin i lib. Typowo programy komercyjne i rzeczy od zewnętrznych firm.
Złota zasada: nigdy nie wrzucaj ręcznie plików do /usr/bin ani /usr/lib. To półki menedżera pakietów. Przy najbliższej aktualizacji nadpisze Twój plik i nawet nie zauważy.
Biblioteki: ldd, ldconfig, /etc/ld.so.conf.d
Biblioteka współdzielona to wspólna część, z której korzysta wiele programów. Jak wspólna kuchnia na piętrze w akademiku: nie każdy pokój ma własną lodówkę. Pliki bibliotek kończą się na .so, od „shared object”.
Z czego korzysta program? Pytasz ldd:
ldd /usr/local/bin/htop linux-vdso.so.1 (0x00007f55d44ef000)
libncursesw.so.6 => /lib/x86_64-linux-gnu/libncursesw.so.6 (0x00007f55d4444000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f55d4410000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f55d4327000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f55d4000000)
/lib64/ld-linux-x86-64.so.2 (0x00007f55d44f1000)Po lewej nazwa biblioteki, której program potrzebuje, po prawej, gdzie system ją znalazł. libncursesw to biblioteka do rysowania okienek w terminalu, libc to podstawowa biblioteka języka C, z której korzysta prawie wszystko.
[RHEL] Na Red Hacie biblioteki 64-bitowe leżą w /usr/lib64.
Ważne ostrzeżenie z dokumentacji: nigdy nie uruchamiaj ldd na programie, któremu nie ufasz. W niektórych przypadkach ldd może przy tym wykonać kod tego programu. Dla obcych plików jest bezpieczniejsza wersja, która tylko czyta nagłówek:
objdump -p /usr/bin/htop | grep NEEDED NEEDED libncursesw.so.6
NEEDED libtinfo.so.6
NEEDED libm.so.6
NEEDED libnl-3.so.200
NEEDED libnl-genl-3.so.200
NEEDED libc.so.6Pokazuje tylko bezpośrednie zależności, ale niczego nie uruchamia.
Gdzie system szuka bibliotek? W standardowych folderach i w tych wymienionych w /etc/ld.so.conf:
cat /etc/ld.so.conf
ls /etc/ld.so.conf.d/include /etc/ld.so.conf.d/*.conf
libc.conf
x86_64-linux-gnu.confGłówny plik mówi tylko „wczytaj wszystko z folderu .d”. Ten sam wzorzec co przy hurtowniach apt: jeden plik na jedną sprawę. Ale system nie czyta tych plików przy każdym uruchomieniu programu, bo byłoby to za wolne. Komenda ldconfig przegląda wszystkie te foldery i buduje z nich spis w /etc/ld.so.cache. Programy korzystają ze spisu. O tym, co się dzieje, kiedy o tym zapomnisz, w typowym błędzie.
Jak to działa pod spodem
Kiedy uruchamiasz program, jądro widzi w nagłówku pliku, że potrzebuje on pomocnika: programu ładującego biblioteki. To ten ostatni wpis z ldd: /lib64/ld-linux-x86-64.so.2. Ładowacz czyta listę NEEDED, a potem dla każdej biblioteki szuka po kolei: w folderach ze zmiennej LD_LIBRARY_PATH, w spisie /etc/ld.so.cache i w folderach domyślnych. Znajduje, podpina do pamięci programu i dopiero wtedy program rusza.
A Flatpak, Snap i AppImage omijają cały ten problem, bo niosą biblioteki ze sobą. Snap to skompresowany obraz systemu plików, który snapd montuje w /snap/nazwa/wersja. AppImage to mały program startowy z doklejonym takim obrazem, montowanym przez FUSE przy każdym uruchomieniu. Flatpak trzyma aplikacje i runtime'y w /var/lib/flatpak i uruchamia je w piaskownicy zbudowanej z mechanizmów jądra, tych samych, z których korzystają kontenery. Cena? Więcej miejsca na dysku, bo ta sama biblioteka leży w kilku kopiach, i łatki bezpieczeństwa bibliotek przychodzą dopiero z nową wersją paczki.
Ściąga flag
| Komenda | Flaga | Co robi |
|---|---|---|
| apt | install ./plik.deb | instaluje pobrany .deb z zależnościami |
| dpkg-deb | -I / -c plik.deb | etykieta / lista plików pobranego .deb |
| dnf | install ./plik.rpm | instaluje pobrany .rpm z zależnościami |
| rpm | -qpi / -qpl / -qp --scripts | etykieta / pliki / skrypty pobranego .rpm |
| flatpak | remote-add --if-not-exists | dodaje hurtownię Flatpaka |
| flatpak | install / uninstall / update | instaluje / usuwa / aktualizuje |
| flatpak | uninstall --unused | sprząta nieużywane runtime'y |
| flatpak | --user | działa tylko dla bieżącego użytkownika |
| snap | install / remove / list | instaluje / usuwa / pokazuje |
| snap | refresh --hold=CZAS | wstrzymuje automatyczne aktualizacje |
| snap | install --classic | snap bez piaskownicy |
| AppImage | --appimage-extract-and-run | uruchamia bez FUSE |
| ./configure | --prefix=/usr/local | gdzie zainstalować program |
| make | -j N | kompiluje na N rdzeniach |
| make | install / uninstall | instaluje / usuwa skompilowany program |
| sha256sum | -c plik.sha256 | sprawdza sumę kontrolną |
| ldd | program | biblioteki programu (tylko zaufanego) |
| objdump | -p program | nagłówek ELF, bezpieczne dla obcych plików |
| ldconfig | -p | spis znanych bibliotek |
| ldconfig | (bez flag) | przebudowuje spis po zmianach w ld.so.conf.d |
⚠ Typowy błąd
Firma dała Ci program, który instalujesz przez rozpakowanie do /opt/powitaj. Uruchamiasz:
/opt/powitaj/bin/powitaj/opt/powitaj/bin/powitaj: error while loading shared libraries: libpowitaj.so: cannot open shared object file: No such file or directoryPlik biblioteki przecież jest, leży w /opt/powitaj/lib. Pytamy, co widzi ładowacz:
ldd /opt/powitaj/bin/powitaj linux-vdso.so.1 (0x00007fac1a587000)
libpowitaj.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac1a200000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac1a589000)not found. Biblioteka leży w folderze, którego nie ma w żadnym spisie. Ładowacz to bibliotekarz, który szuka tylko na swoich regałach. Jak książka stoi u sąsiada, to dla niego jej nie ma.
Naprawa na stałe: dopisać folder do spisu i przebudować spis.
echo /opt/powitaj/lib | sudo tee /etc/ld.so.conf.d/powitaj.conf
sudo ldconfig
ldconfig -p | grep powitaj
/opt/powitaj/bin/powitaj/opt/powitaj/lib
libpowitaj.so (libc6,x86-64) => /opt/powitaj/lib/libpowitaj.so
Witaj z biblioteki!Pierwsza linijka to tee, który pokazuje, co zapisał.
Czemu tee, a nie sudo echo ... >? Bo przekierowanie robi Twoja powłoka, jeszcze zanim sudo w ogóle ruszy, a Ty nie masz prawa pisać w /etc. tee uruchomione przez sudo pisze jako root. Klasyk.
Najczęstszy błąd w tej historii: dopisanie pliku do /etc/ld.so.conf.d/ i zapomnienie o sudo ldconfig. Bez tego nic się nie zmienia, bo programy czytają spis, a nie folder.
Szybka naprawa na próbę, bez zmian w systemie: LD_LIBRARY_PATH=/opt/powitaj/lib /opt/powitaj/bin/powitaj. Dobre do testu, złe jako rozwiązanie na stałe.
✎ Zadanie
Zainstaluj z repozytorium htop, ncdu i tree. Sprawdź, z którego pakietu pochodzi plik /usr/bin/ls. Wypisz, co i kiedy instalowałeś ostatnio (historia menedżera pakietów).
[RHEL] Podpowiedź: htop i ncdu na RHEL są w EPEL, więc najpierw włącz EPEL z lekcji 66.
Pokaż rozwiązanie
Instalacja trzech programów, jedno śledztwo i jedno grzebanie w historii.
# [Ubuntu]
sudo apt install htop ncdu tree
dpkg -S /usr/bin/ls
grep -E 'Start-Date|Commandline' /var/log/apt/history.log | tail -4coreutils: /usr/bin/lsls pochodzi z pakietu coreutils. Tak samo cp, mv, cat i pół podstawowego Linuksa. A teraz uwaga, mała pułapka:
dpkg -S /bin/lsdpkg-query: no path found matching pattern /bin/lsPamiętasz z lekcji 8, że /bin to dziś tylko drogowskaz do /usr/bin? dpkg pamięta pliki po prawdziwym adresie, nie po drogowskazie. Pytasz listonosza o „dom za zakrętem”, a on zna tylko numery ulic.
Historia apt leży w /var/log/apt/history.log. Starsze miesiące są spakowane w plikach history.log.1.gz i dalej, czytasz je zgrep.
# [RHEL] htop i ncdu są w EPEL, więc najpierw EPEL jak w odcinku 66
sudo dnf install htop ncdu tree
rpm -qf /usr/bin/ls # coreutils-... z numerem wersji Twojego systemu
dnf history # lista transakcji z numerami
sudo dnf history info 7 # szczegóły transakcji numer 7Na RHEL odpowiedź też brzmi coreutils, tylko z długim numerem wersji. Historia dnf jest wygodniejsza niż na Ubuntu, bo ma numery i da się ją cofnąć przez dnf history undo. Apt takiego „cofnij” nie ma. Apt wierzy, że niczego nie żałujesz.
Co dalej
Tą lekcją zamykamy moduł o pakietach. Następny moduł to sieć. Zaczynamy od piętnastu minut podstaw bez komend: adres IP, maska, brama, DNS, DHCP, porty, TCP kontra UDP i czemu Twój laptop w domu ma adres zaczynający się od 192.168.