Zarządzanie oprogramowaniem

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:

  • RPM package manager, czyli zbiór narzędzi do instalacji, deinstalacji, itd. oprogramowania.
  • RPM database, czyli baza zainstalowanych pakietów; jednym z zadań jest śledzenie zależności pomiedzy pakietami oraz śledzenie zmian w plikach zainstalowanego oprogramowania.
  • RPM package, czyli pakiet z oprogramowaniem, a mówiąc bardziej potocznie po prostu instalka.
  • Package label, czyli opis zawartości pakietu: nazwa, wersja, itp.

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:

  • sprawdzić podpis pakietu
  • zainstalować, zaktualizaować i usunąć pakiet
  • odpytywać bazę RPM, czyli m.in.:
    • sprawdzić, które pakiety są zainstalowane
    • sprawdzić, jaka jest wersja pakietu (oraz szereg innych informacji o pakiecie)
    • ustalić pliki związane z pakietem
    • sprawdzić zależności między pakietami

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:

  • -v — wyświetlane są dodatkowe informacje,
  • -h — pojawi się tekstowy pasek postępu.

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ć?

  • -a — lista wszystkich pakietów
  • -i — informacje o pakiecie
  • -f plik — ustala, z jakiego pakietu został zainstalowany dany plik
  • -l — lista plików pakietu
  • -d — lista plików tylko z dokumentacją
  • -c — lista plików tylko z konfiguracją
  • --provides — lista bibliotek i innych elementów, które mogą być wykorzystywane przez inne programy
  • --requires — lista bibliotek i plików wymaganych podczas instalacji
  • --scripts — treść skryptów związanych z instalacją (czyli tzw. preinstall, postinstall, uninstall)

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 nazwapakietu
czyli 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.

  • S — rozmiar pliku
  • L — link symboliczny
  • T — czas modyfikacji
  • D — numer urządzenia major lub minor
  • U — właściciel
  • G — grupa
  • M — uprawnienia lub typ pliku (mode)
  • 5 — suma MD5

Biblioteki w linuksie

W systemie Linux mamy 2 rodzaje bibliotek:

  • Statyczne — są dołączane do programów,
  • Dynamiczne — są zainstalowane w systemie i nie muszą być dołączane do programów.

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 plik
czyli 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.