Czyszczenie systemu Debian GNU/Linux
Kategoria: Artykuły, etykiety: system, dpkg, oprogramowanie
Dodany: 2011-03-20 18:43
(zmodyfikowany: 2011-03-30 13:14)
Przez: Minio
Wyświetleń: 54878
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).
- jeżeli pliki się nie różnią, pozostawia wersję obecną na dysku
- jeżeli plik na dysku został zmieniony, ale plik w pakiecie się nie zmienił, pozostawia wersję obecną na dysku
- jeżeli plik w pakiecie został zmieniony, ale plik na dysku nie był modyfikowany, instaluje plik z pakietu
- 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.