Przejdź to tekstu

Czyszczenie systemu Debian GNU/Linux

Kategoria: Artykuły, etykiety: system, dpkg, oprogramowanie

Dodany przez: Minio, 2011-03-20 18:43 (zmodyfikowany: 2011-03-30 13:14)

Wyświetleń: 36186

Wprowadzenie

Debian GNU/Linux jest systemem, który może pracować bez awarii przez wiele lat. Przez ten czas może być wielokrotnie aktualizowany albo modyfikowany. Im dłużej system jest używany, tym większe prawdopodobieństwo, że znajdują się w nim najróżniejsze śmieci. Mogą to być niepotrzebne pakiety, pakiety które zostały już porzucone przez swoich twórców, pliki instalacyjne, pliki konfiguracyjne itp. Zazwyczaj obecność tych plików w niczym nie przeszkadza, dlatego też rzadko się je zauważa. Nie oznacza to jednak, że systemu nie powinno się od czasu do czasu sprzątać. Przede wszystkim można w ten sposób oszczędzić miejsce na dysku twardym (naturalnie im więcej śmieci się usunie, tym więcej miejsca się oszczędzi). Po drugie, takie śmieci potrafią dać o sobie znać wiele lat później, powodując problemy (przykładem może być BTS #546836, który był spowodowany pakietem zainstalowanym ręcznie około 2000 roku). Wreszcie jest to kwestia poczucia higieny — zazwyczaj przynajmniej raz na jakiś czas sprzątamy mieszkania, więc można też posprzątać swój komputer.

Uwagi natury ogólnej

Usuwanie zainstalowanych pakietów może potencjalnie zepsuć Twój system (a przynajmniej niektóre jego funkcje, gdyż APT posiada dodatkowe zabezpieczenie przed przypadkowym usunięciem najważniejszych składników systemu). Nigdy, ale przenigdy nie usuwaj pakietów na ślepo, bez rozeznania się, co konkretnie zostanie usunięte. Jeżeli korzystasz z apt-get lub aptitude, najpierw uruchamiaj je z flagą -s — włącza to tryb symulacyjny, w którym apt-get/aptitude pokaże co by zrobił, ale tego nie zrobi. Dobrą praktyką jest tworzenie list pakietów do usunięcia, zapisywanie ich do pliku i podawanie apt-get/aptitude właśnie tej listy. Np. tak:

aptitude purge $(cat /tmp/lista_pakietów_do_usunięcia)

Przed usunięciem danego pakietu sprawdź:

  • co to za pakiet: aptitude show pakiet
    zwróć szczególną uwagę na opis pakietu i na to, czy został zainstalowany automatycznie
  • dlaczego został zainstalowany: aptitude why pakiet
  • skąd pochodzi dany pakiet: apt-cache policy pakiet
    jeżeli jedyną dostępną wersją jest /var/lib/dpkg/status, to pakiet albo został zainstalowany ręcznie, albo porzucony

Jeżeli masz wątpliwości czy dany pakiet usunąć czy zostawić, lepiej go zostaw.

Ponieważ niektóre zadania można wykonać na przynajmniej dwa różne sposoby lub podane polecenia mogą mieć pewne nieoczekiwane konsekwencje, przed wykonaniem któregokolwiek z nich, przeczytaj cały artykuł (lub przynajmniej całą sekcję).

Usuwanie starych plików instalacyjnych

Zacznijmy od czegoś prostego. Jak pewnie wiesz, programy w Debianie znajdują się w specjalnie przygotowanych plikach DEB. Czego być może nie wiesz, podstawowy program do instalowania pakietów w Debianie — dpkg — potrafi zainstalować tylko te programy, których archiwa instalacyjne znajdują się na dysku twardym komputera. Dlatego bardziej przyjazne menedżery oprogramowania — apt-get, aptitude, synaptic, software-center etc. - po prostu pobierają pakiety DEB z serwera na dysk twardy komputera i potem instalują je przy pomocy dpkg. Pobrane pakiety DEB trzymają w katalogu /var/cache/apt/archives/.

Katalog ten będzie rósł w nieskończoność, zajmując coraz więcej miejsca. Po zaledwie kilku miesiącach może zajmować nawet kilka gigabajtów na dysku twardym. Jego zawartość można wyczyścić następującymi poleceniami:

aptitude clean
aptitude autoclean

Pierwsze z nich usunie wszystkie pakiety w cache, drugie zaś tylko te, które nie są już dostępne w repozytoriach APT (z dokładnością co do wersji). Zamiast aptitude można użyć apt-get (polecenia clean i autoclean pozostają bez zmian).

Usuwanie pakietów przejściowych

Pakiety przejściowe (ang. transitional packages) są specjalnymi pakietami, które same z siebie nie instalują żadnych plików, jednak zależą od innych pakietów, które te pliki instalują. Ma to miejsce zwłaszcza jeśli jakiś program zmieni nazwę (np. Firefox na Iceweasel) lub jeżeli pewien program zostaje włączony do innego pakietu (np. host i dnsutils do pakietu bind9-host). Pakiety przejściowe znajdują się w repozytoriach dla zachowania kompatybilności ze starszymi wersjami Debiana i mogą być usunięte po aktualizacji.

Aby znaleźć wszystkie pakiety przejściowe, należy wydać polecenie:

LANG=C aptitude search ~dtransitional.*removed~i

search można zastąpić purge aby je od razu usunąć, ale ze względu na możliwość znalezienia pakietu który w rzeczywistości nie jest pakietem przejściowym, lepiej jest je wyszukać i potem ręcznie usunąć.

Usuwanie pakietów, które nie są dostępne w żadnym repozytorium

Jeżeli mamy dużo pakietów zainstalowanych ręcznie albo Debiana zainstalowanego kilka wersji stabilnych temu i regularnie aktualizowanego, istnieje duże prawdopodobieństwo, że w systemie mamy zainstalowane pakiety, które nie są już dostępne w żadnym repozytorium. Jeżeli pakiet został usunięty z repozytorium, to najprawdopodobniej dlatego, że był już przestarzały i/lub jego opiekun go porzucił. Pakiety takie nie są aktualizowane, dlatego ich trzymanie może przynieść więcej szkód niż korzyści (w najlepszym wypadku tylko niepotrzebnie zajmują miejsce).

Do wykrywania takich pakietów służy program apt-show-versions, który trzeba najpierw zainstalować. Następnie należy wykonać jako root:

apt-show-versions -i
apt-show-versions |grep 'No available'

Pierwsze polecenie zaktualizuje bazę pakietów apt-show-versions, drugie zaś znajdzie wszystkie te, które nie są już dostępne w żadnym repozytorium. Listę tę należy przejrzeć, a pakiety które nie są potrzebne — usunąć.

Zamiast apt-show-versions można użyć aptitude. Poniższe polecenie powinno znaleźć te same pakiety, co drugie z poleceń podanych wyżej:

aptitude search ?obsolete

Jeżeli masz pakiety, które z jakiegoś powodu chcesz mieć zainstalowane a które nie są już dostępne w repozytoriach, pomyśl o stworzeniu lokalnego repozytorium. Jest to lepsze rozwiązanie niż instalacja pakietów przez dpkg/gdebi.

Usuwanie pakietów, od których nie zależą żadne inne pakiety

Linux jest tak skonstruowany, by programy mogły współdzielić potrzebne im biblioteki. Dlatego mając zainstalowane całe GNOME, instalacja kolejnych pakietów opartych o GTK trwa krócej i wymaga pobrania mniej danych — większość potrzebnych bibliotek (tzw. zależności) jest już zainstalowana i nie ma potrzeby instalować ich ponownie.

Do odnajdywania pakietów, które są „niepotrzebnie” zainstalowane (żaden inny zainstalowany program ich nie potrzebuje) służy program deborphan. Należy go zainstalować.

deborphan domyślnie szuka takich pakietów tylko wśród bibliotek, co wyklucza większość błędów. Wystarczy wydać polecenie:

deborphan

aby uzyskać listę wszystkich pakietów, których usunięcie nie powinno mieć żadnych szkód dla systemu. deborphan nie potrafi samodzielnie usuwać pakietów, dlatego jego używanie jest bezpieczne. Jeżeli rzeczywiście chce się usunąć wskazywane przez niego pakiety, należy wynik jego działania przekierować do apt-get/aptitude.

Może się jednak zdarzyć, że deborphan wskaże pakiet, który samodzielnie przeznaczyliśmy do instalacji. Na systemie 64-bitowym takim pakietem będzie ia32-libs, które mogliśmy z jakiegoś powodu chcieć mieć w systemie. W takim wypadku należy deborphan poinformować, że dany pakiet jest zainstalowany celowo i że nie powinien o nim informować:

deborphan -A pakiet1 pakiet2 pakietN

Listę w ten sposób wstrzymanych pakietów można wyświetlić poleceniem:

deborphan -L

Jak wspomniano, deborphan domyślnie szuka tylko bibliotek (które zawsze powinny być instalowane jako zależności). Można jednak go poprosić by przeszukał wszystkie zainstalowane pakiety, dodając opcję -a. Niestety, w takim trybie deborphan niemal na pewno wskaże wiele pakietów, które kazaliśmy zainstalować. Aby to obejść, można wszystkie ręcznie zainstalowane pakiety dodać do jego bazy:

aptitude -F %p search '~i!~M' |while read pkg; do deborphan -A "$pkg"; done

Jednak prawdopodobnie najlepszym wyjściem będzie pozostanie przy tym, by deborphan przeszukiwał tylko zainstalowane biblioteki.

Usuwanie pakietów z nieoficjalnych repozytoriów

W posiadaniu pakietów pochodzących z nieoficjalnego repozytorium nie ma niczego złego. Często takie repozytoria dostarczają programy, których po prostu nie ma w oficjalnych repozytoriach. Jednak baza oprogramowania Debiana stale rośnie, a zewnętrzne repozytoria czasem przestają być uaktualniane albo zawierają programy, które przeszkadzają w zwyczajnej aktualizacji Debiana. W takich wypadkach warto bliżej przyjrzeć się pakietom pochodzącym z nieoficjalnych źródeł i rozważyć usunięcie przynajmniej części z nich.

Aby uzyskać listę takich pakietów, wystarczy wydać polecenie:

aptitude search '?narrow(?installed, !?origin(Debian))!?obsolete'

Usuwanie plików konfiguracyjnych zainstalowanych w trakcie działania dpkg

Aby zrozumieć tę część artykułu, potrzebna jest pewna wiedza na temat dpkg. Postaram się poniżej streścić najważniejsze elementy. Osoby zainteresowane bardziej szczegółowymi informacjami, powinny przeczytać (napisane w j. angielskim) Załącznik E dokumentu Debian Policy oraz wpis na blogu Raphaëla Hertzoga, jednego z opiekunów dpkg.

dpkg ma ściśle określoną politykę na temat plików konfiguracyjnych. Podstawowe zasady są takie:

  • w trakcie instalacji pakietu, dpkg sprawdza, czy pliki konfiguracyjne znajdują się na dysku komputera. Jeżeli ich nie ma, instaluje pliki dostarczone w pakiecie.

  • jeżeli taki plik jest, sprawdza, czy różni on się od pliku dostarczonego w pakiecie, z którego plik pochodzi (zazwyczaj jest to poprzednia wersja aktualnie instalowanego pakietu).

    1. jeżeli pliki się nie różnią, pozostawia wersję obecną na dysku
    2. jeżeli plik na dysku został zmieniony, ale plik w pakiecie się nie zmienił, pozostawia wersję obecną na dysku
    3. jeżeli plik w pakiecie został zmieniony, ale plik na dysku nie był modyfikowany, instaluje plik z pakietu
    4. jeżeli zarówno plik na dysku, jak i plik w pakiecie, zostały zmienione, prosi użytkownika o samodzielne rozwiązanie problemu (użytkownik może wybrać wersję z pakietu, wybrać wersję na dysku, pokazać różnice między wersjami oraz uruchomić powłokę w celu zbadania sytuacji)

Właśnie w tej ostatniej sytuacji dpkg tworzy kopie zapasowe plików konfiguracyjnych. Trzeba wiedzieć, że dpkg nigdy nie usuwa ich automatycznie, przez co będą one leżeć na dysku twardym komputera zazwyczaj niczego nie świadomego użytkownika. Nie zajmują wiele miejsca, ale z drugiej strony nie ma potrzeby ich trzymać.

Pliki konfiguracyjne stworzone przez dpkg mogą mieć następujące sufiksy (są to ciągi znaków dodane na końcu pliku):

  • .dpkg-old — kopia pliku z dysku twardego, tworzona gdy użytkownik zdecyduje się nadpisać swój plik konfiguracyjny plikiem z pakietu
  • .dpkg-dist — kopia pliku z pakietu, tworzona gdy użytkownik zdecyduje się pozostawić swój plik konfiguracyjny
  • .dpkg-new — kopia pliku z pakietu, tworzona gdy użytkownik zdecyduje się uruchomić powłokę w celu zbadania sytuacji

Aby znaleźć wszystkie takie pliki, wystarczy wydać polecenie

find /etc/ -regex '.*dpkg-\(dist\|old\|new\).*'

Polecenie to przeszukuje tylko katalog /etc, w którym powinny być przechowywane pliki konfiguracyjne. Może się zdarzyć, że niektóre pakiety będą pliki konfiguracyjne trzymać w innym miejscu. W takiej sytuacji można przeszukać wszystkie katalogi obecne w systemie, ale prawdopodobnie zajmie to wielokrotnie więcej czasu.

Znalezione pliki można bez przeszkód usunąć, chociaż wcześniej warto zobaczyć różnice między kopią a lokalnie zainstalowanym plikiem i ewentualnie nanieść poprawki.

Usuwanie starych plików konfiguracyjnych

Zarówno apt-get, jak i aptitude, mają dwa polecenia do usuwania zainstalowanych pakietów: remove oraz purge. Różnica między nimi jest taka, że remove usuwa pakiet, ale pozostawia jego pliki konfiguracyjne. W ten sposób jeżeli w przyszłości ponownie dany pakiet zostanie zainstalowany, nie będzie potrzeby jego ponownej konfiguracji.

Jednak sytuacje, gdy chcemy zostawić pliki konfiguracyjne, należą raczej do rzadkości. Zazwyczaj gdy usuwamy pakiet, nie chcemy w systemie żadnych po nim pozostałości. Mimo to często one pozostają.

Aby znaleźć wszystkie pakiety które nie są zainstalowane, ale pozostawiły po sobie jakieś pliki konfiguracyjne, wystarczy wydać polecenie:

aptitude -F "%p" search '~c'

Zamiast search można użyć purge, aby od razu je usunąć.

Być może ktoś chciałby usunąć stare pliki konfiguracyjne pod warunkiem, że nie zostały one zmienione. Nie istnieje żadne narzędzie które je automatycznie znajdzie, jednak można napisać sobie nieskomplikowany skrypt, który to zrobi.

Jego podstawą będzie powyższe polecenie, wyszukujące wszystkie pakiety, które pozostawiły po sobie pliki konfiguracyjne. Następnie należy zdobyć sumy MD5 tych plików konfiguracyjnych. Można to zrobić poleceniem:

dpkg-query -W -f '${Conffiles}' nazwa_pakietu

Ostatnim krokiem jest policzenie sumy MD5 pliku konfiguracyjnego znajdującego się na dysku. Jeżeli sumy się różnią, to znaczy że plik został zmieniony i nie powinno się go usuwać.

Napisanie takiego skryptu pozostawiam tym, którzy uważają że potrzebują takich funkcji.

Usuwanie plików, które nie należą do żadnego zainstalowanego pakietu

Każdy posiada wiele plików, które nie należą do żadnego zainstalowanego pakietu. Większość plików w /home pochodzi z jakiegoś zewnętrznego źródła, tak samo jak pliki w /tmp. Wiele programów może sobie tworzyć własne pliki w katalogu /var (logi, pliki .pid itp.). Oprogramowanie o zamkniętym kodzie źródłowym powinno instalować się w katalogu /opt. Te cztery katalogi są miejscami, gdzie pliki spoza repozytoriów mają pełne prawo przebywać. Jednak nie powinny się znaleźć nigdzie indziej w systemie plików.

Aby znaleźć wszystkie pliki, które nie pochodzą z żadnego zainstalowanego pakietu, można wykorzystać program cruft. Należy go uruchomić w ten sposób (jako root):

cruft -d / --ignore /tmp --ignore /home --ignore /var --ignore /opt -r cruft-report

Po opcji -r należy podać nazwę pliku, do którego cruft wypisze wyniki swojej pracy. Można ją pominąć, aby wyniki wysłać na standardowe wyjście, jednak nie jest to zalecane. Opcja --ignore wskazuje na katalogi, które mają zostać pominięte w trakcie pracy programu (w których niemal na pewno znajdują się pliki spoza zainstalowanych pakietów, które tylko zaciemnią otrzymany wynik). Opcja -d wskazuje na katalogi, które mają zostać przeszukane. Zazwyczaj będzie to główny katalog systemu plików. Warto zauważyć, że cruft domyślnie nie sprawdza katalogów, które znajdują się na innych partycjach. Jeżeli chcemy je sprawdzić, należy uruchomić go w ten sposób:

cruft -d "/ /usr"

cruft będzie musiał sprawdzić ogromne ilości plików, dlatego jego wykonywanie może zająć nawet kilkadziesiąt minut. Należy cierpliwie czekać, aż skończy pracę, a potem spojrzeć do uzyskanego pliku raportu. Analiza raportu jest zajęciem dla przynajmniej średnio zaawansowanych użytkowników systemu, ponieważ baza cruft wciąż nie jest doskonała i zgłasza wiele nieprawidłowych wskazań. Z tego powodu trzeba samodzielnie określić, które pliki rzeczywiście można spokojnie usunąć, a które lepiej zostawić.

Usuwanie starych plików z katalogu domowego użytkownika

Niestety nie istnieje (i raczej nigdy nie będzie istniał) żaden sposób na stuprocentowe określenie, czy dany plik w katalogu domowym użytkownika jest jeszcze potrzebny, czy można go spokojnie usunąć. Można jednak napisać narzędzia, które wskażą kandydatów do usunięcia, czyli pliki które — z mniejszym lub większym prawdopodobieństwem — nie są już potrzebne.

ls --full-time -lah ~ |sort -k 6 -r

Powyższe polecenie pokaże wszystkie pliki i katalogi znajdujące się bezpośrednio w katalogu domowym użytkownika i posortuje je wg czasu ostatniej zmiany, gdzie najdawniej zmienione będą na samym dole. Jeżeli system plików, na którym znajduje się katalog domowy użytkownika, jest montowany z zapisem czasu dostępu (opcja atime polecenia mount), do polecenia ls można dodać --time=atime, dzięki czemu uzyska się listę posortowaną wg czasu dostępu do katalogu/pliku (dostępem jest także np. kopiowanie) — taka lista znacznie rzetelniej oddaje, które pliki/katalogi rzeczywiście nie są już potrzebne.

find potrafi także znaleźć wszystkie pliki nowsze niż wskazana data (lub określony plik). Stosując operator negacji, można go wykorzystać do znalezienia plików starszych niż pewna określona data. Należy wydać polecenie:

find ~ -not -newerXt YYYYMMDD

gdzie w miejsce X należy wstawić a (czas dostępu), m (czas modyfikacji) lub c (czas utworzenia), zaś w miejsce YYYYMMDD — datę w formacie rok (4 cyfry) miesiąc (2 cyfry) dzień (2 cyfry).

Dając odpowiednio odległą datę (np. 2007 rok) można znaleźć pliki, które prawdopodobnie nie są już potrzebne.

Podsumowanie

Jak widać, istnieje wiele sposobów na znalezienie plików/pakietów które nie są już potrzebne. Istnieje też kilka sposobów na odchudzenie Debiana (spowodowanie, żeby zajmował mniej miejsca na dysku twardym), jednak zagadnienie to nie wchodzi w zakres niniejszego artykułu.

Na samy końcu chciałbym tylko przypomnieć, że nigdy nie powinno się bezmyślnie usuwać plików wskazywanych przez powyższe polecenia.

Niektóre części artykułu powstały z wykorzystaniem serii wpisów na blogu Raphaëla Hertzoga. Dostępne są w Internecie (po angielsku): #1, #2, #3, #4, #5, #6.

OSnews Wykop Blip Flaker Kciuk Śledzik Facebook Identi.ca Twitter del.icio.us Google Bookmarks