Wprowadzenie
W większości dystrybucji systemów Linux (w tym w SUSE) za zarządzanie oprogramowaniem odpowiada system RPM, czyli RPM package manager. RPM to także format samych instalek z oprogramowaniem, czyli pakietów. System ten składa się z następujących elementów:
Nazwa pliku pakietu jest zwykle określona przez następującą konwencję nazwa-wersja-wydanie.architektura.rpm, np. iptraf-2.7.0-188.i586.rpm. Czasem jednak zdarza się, że nazwa jest nieco bardziej skomplikowana, np. opera-8.50-20050916.5-shared-qt.i386-en.rpm, ale raczej są to wyjątki. Warto w tym miejscu zwrócić uwagę na jeden niuans: nazwa pakietu a nazwa pliku z pakietem. Otóż są to nazwy zwykle bardzo ze sobą skorelowane, jednak formalnie mogą być zupełnie różne. Przykład. Plik apache2-2.2.0-21.2.i586.rpm zawiera pakiet apache2-2.2.0-21.2 i tak pakiet będzie widziany w bazie pakietów po zainstalowaniu. Jednak ten mógłby się nazywać po prostu apache.rpm i po instalacji pakietu z tego pliku w bazie pakietów również pojawiłby się pakiet apache2-2.2.0-21.2. Ma to spore znaczenie przy pracy z pakietami, bo o ile w momencie instalacji pakietu podajemy ścieżkę do pliku, to w momencie gdy operujemy na zainstalonych pakietach, podajemy ich nazwy (zwykle wystarczą same nazwy, czyli w naszym przykładzie byłoby to apache2, jednak gdy zainstawane jest oprogramowanie w dwóch wersjach, niezbędne jest także podanie wersji pakietu).
Pliki konfiguracyjne systemu RPM
Główny plik konfiguracyjny RPM to /usr/lib/rpm/rpmrc, jednak w przypadku aktualizacji oprogramowania wszystkie zmiany dokonane w tym pliku przepadną, zmiany systemowe należy wprowadzać do pliku /etc/rpmrc, a zmiany użytkownika do pliku ~/.rpmrc. W praktyce jednak plik ten jest dosyć techniczny i raczej nie będziemy do niego zaglądać.
Baza RPM
Baza pakietów RPM znajduje się katalogu /var/lib/rpm. Składa się ona z plików binarnych, których łączny rozmiar wynosi ok. 40MB (przy rozmiarze /usr wynoszącym 2GB). Jeśli rozmiar bazy danych jest istotnie większy, warto ją przebudować poleceniem
# rpm --rebuilddb
W przypadku, gdy baza RPM się zmieni, skrypt /etc/cron.daily/suse.de-backup-rpmdb robi jej kopię zapasową. W pliku /etc/sysconfig/backup są określone miejsce (domyślnie /var/adm/backup/rpmdb/) i maksymalna liczba przechowywanych kopii (domyślnie 5).
Zarządzanie oprogramowaniem przez rpm
Co w skrócie umożliwia menedżer pakietów:
Sprawdzenie podpisu pakietu
# rpm --checksig nazwapakietu.rpm
Jako parametr podajemy ścieżkę do pliku z pakietem, który chcemy zweryfikować.
Instalacja pakietu
# rpm -i nazwapakietu.rpm
Jako parametr podajemy ścieżkę do pliku z pakietem i zwykle ma on nazwę utrzymaną w konwencji nazwa_pakietu.rpm. Przed instalacją sprawdzane są zależności pomiędzy pakietami i jeśli jakieś są niespełnione, pojawią się odpowiednie komunikaty błędów. Wykonując polecenie możemy dodatkowo użyć opcji:
Aktualizacja pakietu
Tutaj mamy dwie opcje do dyspozycji -F i -U. Jeśli pakiet jest zainstalowany, obie go zaktualizują. Jednak w przypadku, gdy pakietu nie ma, -U dodatkowo go zainstaluje.
# rpm -F nazwapakietu.rpm
Deinstalacja pakietu
# rpm -e nazwapakietu
Powyższe polecenie usuwa pakiet (o ile nie zaburzy to zależności pomiędzy pakietami). Warto tutaj zauwazyć, że jako parametr podajemy nazwę pakietu, a nie ścieżkę do pliku z pakietem.
Zapytania o pakiety
Aby określić, że chcemy się czegoś dowiedzieć o pakietach, do polecenia rpm przekazujemy opcję -q. Zanim przejdziemy do konkretów zauważmy, że odpytywać możemy zainstalowane pakiety (i wtedy jest sama opcja -q), ale możemy odpytywać pliki z pakietami (i wtedy obok opcji -q dodajemy opcję -p). To o co możemy pytać?
Przykładowe użycia:
# rpm -qa | grep c++ # rpm -qi wget # rpm -qf /usr/bin/wget # rpm -qpR opera-11.01-1190.i386.rpm
System rpm pozwala także ustalić, co się zmieniło w plikach pakietu od momentu instalacji czy aktualizacji. Aby dostać podsumowanie, wydajemy polecenie
# rpm -V nazwapakietuczyli przykładowo:
# rpm -V sudo S.5....T c /etc/sudoers
Co oznaczają te magiczne znaczki przed ścieżką do pliku? Przede wszystkim pojawia się lista plików, w których coś od momentu instalacji się zmieniło. A znaczki określają, co się zmieniło.
W systemie Linux mamy 2 rodzaje bibliotek:
Dołączenie biblioteki do programu uniezależnia go od stanu systemu, jednak sprawia, że po pierwsze paczka programu jest zwykle istotnie większa, po drugie programista musi tą bibliotekę dołączyć, no i po trzecie jest trochę problemów przy aktualizacjach takich bibliotek. To tylko 3 problemy — jest ich jeszcze więcej. Zatem zwykle programy korzystają z bibliotek dynamicznych, czyli dostarczanych przez "system". W normalnych warunkach nie ma potrzeby zajmowania się bibliotekami — rpm sam pilnuje zależności. Jednak czasami zdarza się, że po instalacji coś nie działa i wtedy ręcznie musimy ustalić, czy problem nie leży w bibliotekach i ewneutalnie musimy spróbować go rozwiązać.
Nazewnictwo bibliotek dynamicznych jest zwykle wg następującej konwencji:
libnazwa.so.wersja
(w przypadku bibliotek statycznych zamiast so jest a, np. libc.a).
Do sprawdzania zależności mamy polecenie:
# ldd opcje plikczyli np. możemy napisać:
# ldd -v /usr/bin/wget
W pliku /etc/ld.so.conf znajduje się lista ścieżek, w których system szuka bibliotek. Katalogi /lib u /usr/lib są zawsze brane pod uwagę, więc w pliku ich nie ma. Dodatkowo możemy określić katalog ustawiając zmienną LD_LIBRARY_PATH:
# export LD_LIBRARY_PATH=ścieżka
Po zmianie listy ścieżek z dostępnymi bibliotekami musimy przebudować bazę dostępnych bibliotek wydając polecenie:
# ldconfig
Natomiast za pomocą polecenia:
# ldconfig -p
możemy zobaczyć aktualnie dostępne biblioteki.