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ń: 3470
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_p
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
[
Wersja do druku
]
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 ~dtransiti
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 avail
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 paki
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' |wh
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
p og a y, tó yc po p ostu e a
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(?install
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\
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}' n
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
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
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
pot eb e st eje te
a sposobó
a
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
.