Widziałem wiele wątków na temat zwolnienia miejsca na partycji / boot i to też jest mój cel. Interesuje mnie jednak tylko usuwanie starych jąder, a nie każdego z nich, ale bieżącego.
Potrzebuję rozwiązania, które będzie jednowierszowe, ponieważ będę uruchamiał skrypt z Puppet i nie chcę mieć żadnych dodatkowych plików. Do tej pory mam następujące:
dpkg -l linux-* | awk '/^ii/{print $2}' | egrep [0-9] | sort -t- -k3,4 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"` | xargs sudo apt-get -y purge
Aby być bardziej precyzyjnym, w tej chwili robi to:
- Wyświetl listę wszystkich pakietów linux- * i wydrukuj ich nazwy.
- Wymień tylko te, które mają liczby i posortuj je, zwracając odwrotny wynik. W ten sposób starsze jądra są wymienione na końcu.
- Wydrukuj tylko wyniki, które pojawią się po bieżącym jądrze
- Ponieważ istnieje kilka wyników linux- {image, headers}, upewnij się, że nie wyczyszczę niczego związanego z moim bieżącym jądrem
- Zadzwoń do apt, aby oczyścić
To działa, ale jestem pewien, że rozwiązanie może być bardziej eleganckie i bezpieczne dla środowiska produkcyjnego, ponieważ co najmniej 20 naszych serwerów obsługuje Ubuntu.
Dziękuję za poświęcony czas, Alejandro.
kernel
bash
boot-partition
Alejandro
źródło
źródło
Odpowiedzi:
Wygląda wystarczająco ładnie, tylko kilka komentarzy. Dwa pierwsze komentarze sprawiają, że polecenie jest bezpieczniejsze, a trzeci i czwarty nieco go skracają. Śledź lub zignoruj którekolwiek z nich. Chociaż zdecydowanie zalecam podążanie za pierwszymi dwoma. Chcesz się upewnić, że jest tak bezpieczny, jak to możliwe. Mam na myśli poważnie. Rzucasz
sudo apt-get -y purge
na automatycznie generowaną listę pakietów. To takie złe ! :)Lista wszystkich
linux-*
da ci wiele fałszywych trafień, takich jak (przykład z mojego wyjścia)linux-sound-base
. Chociaż mogą one zostać odfiltrowane później przez resztę twojego polecenia, osobiście czułbym się bezpieczniej, nie wymieniając ich w pierwszej kolejności. Lepiej kontroluj, które pakiety chcesz usunąć. Nie rób rzeczy, które mogą mieć nieoczekiwane rezultaty. Więc zacznę odTwoje wyrażenie regularne do „listy tylko tych, które mają liczby” jest moim zdaniem nieco zbyt proste. Na przykład pakiet
linux-libc-dev:amd64
jest dostępny w systemie 64-bitowym. Twoje wyrażenie regularne będzie pasować. Nie chcesz, żeby to pasowało. Trzeba przyznać, że jeśli zastosujesz się do mojej pierwszej rady, ilinux-libc-dev:amd64
tak nie zostaniesz wymieniony, ale nadal. Wiemy więcej o strukturze numeru wersji niż prosty fakt „istnieje liczba”. Ponadto ogólnie dobrze jest cytować wyrażenia regularne, aby zapobiec potencjalnym błędnym interpretacjom powłoki. Zrobiłbym więc to polecenie egrepPotem jest ta sprawa sortowania. Dlaczego sortujesz Skoro i tak zamierzasz usunąć wszystkie jądra (poza bieżącym), czy ważne jest, aby usunąć starsze przed nowszymi? Nie sądzę, żeby to miało jakąkolwiek różnicę. A może robisz to tylko po to, aby następnie użyć opcji
sed
„Drukuj tylko te wyniki, które pojawiają się po bieżącym jądrze”? Ale IMO wydaje się to zbyt skomplikowane. Dlaczego nie po prostu odfiltrować wyników odpowiadających bieżącemu jądru, jak już to robiszgrep -v
, i gotowe? Szczerze mówiąc, jeśli wezmę pierwszą część twojego polecenia (ze zintegrowanymi moimi dwoma poprzednimi sugestiami), otrzymam na moim komputerzeUsuwam to sortowanie / sed rzeczy, rozumiem
Tak więc twoje bardziej skomplikowane polecenie faktycznie pominęłoby dwa pakiety na moim komputerze, które chciałbym usunąć (teraz możliwe jest, że te
linux-image-extra-*
rzeczy zależą od nichlinux-image-*
i dlatego zostałyby usunięte, ale nie zaszkodzi jawnie to wyrazić). W każdym razie nie widzę sensu twojego sortowania; proste,grep -v
bez fantazyjnego przetwarzania wstępnego powinno być w porządku, przypuszczalnie jeszcze lepsze. Jestem zwolenniczką zasady KISS. Ułatwi ci to późniejsze zrozumienie lub debugowanie. Poza tym bez sortowania jest nieco bardziej wydajny;)Jest to czysto estetyczne, ale uzyskasz taką samą moc wyjściową w tym nieco krótszym wariancie. :-)
W rezultacie otrzymuję prostsze i bezpieczniejsze polecenie
Ponieważ naprawdę chcesz wyczyścić
/boot
partycję, zupełnie innym podejściem byłoby wylistowanie zawartości/boot
, użyciedpkg -S
do ustalenia pakietów, do których należą poszczególne pliki, odfiltrowanie tych, które należą do bieżącego jądra i usunięcie powstałych pakietów. Ale bardziej podoba mi się twoje podejście, ponieważ znajdzie ono również nieaktualne pakiety, takie jaklinux-headers-*
, które nie są instalowane/boot
, ale do/usr/src
.źródło
uname -r
. Dla mnie to działa dobrze. Byłoby ciekawie zobaczyć, dlaczego to nie działa w twoim przypadku.uname -r
produkuje4.8.0-36-generic
, co nie wykluczalinux-headers-4.8.0-36
z listy.Napisałem ten skrypt, który usuwa pakiety „linux- *”, które mają wersję mniejszą niż aktualnie uruchomiona. Myślę, że nie jest konieczne testowanie statusu pakietu. Polecenie prosi o potwierdzenie przed czyszczeniem pakietów. Jeśli nie chcesz tego, dodaj opcję -y do komendy apt-get.
Jednak, aby móc pozostawić konfigurowalną ilość zapasowych jąder, zalecam użycie mojego
linux-purge
skryptu z--keep
opcją. Zobacz tutaj, aby uzyskać więcej informacji na temat skryptu.źródło
TL; DR: przeskocz na dół.
Jest jednak trochę dłużej. Podzielę to dla ciebie:
dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}'
Tak jak sugerowała Malte. Wyświetla listę odpowiednich plików jądra.egrep '[0-9]+\.[0-9]+\.[0-9]+'
Sugerowany również przez Malte jako bezpieczniejszy sposób na wybranie tylko plików jądra poprzez wyszukanie numeru wersji.Ponieważ teraz prawdopodobnie wymieniamy zarówno pakiet obrazu, jak i nagłówka, nazwy pakietów mogą się różnić, dlatego mamy obejście awk, które jest niezbędne do sortowania.
awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}'
W rezultacie powstaje nowa kolumna z numerem wersji przed oryginalną nazwą pakietu, jak poniżej:Teraz musimy posortować listę, aby zapobiec odinstalowaniu jakichkolwiek nowszych obrazów niż aktualnie uruchomiony.
sort -k1,1 --version-sort -r
dając nam to:Teraz usuń bieżące i nowsze pliki jądra,
sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"`
dając nam to:Teraz zdejmij pierwszą kolumnę, którą dodaliśmy,
awk '{print $2}'
aby uzyskać dokładnie to, czego chcemy:Teraz możemy przekazać to do menedżera pakietów, aby automatycznie usunąć wszystko i ponownie skonfigurować grub:
Najpierw zalecamy wykonanie suchego uruchomienia (chociaż dla celów skryptowych może to nie być praktyczne, jeśli masz duże środowisko)
Teraz, jeśli wszystko wygląda dobrze, śmiało i usuń to za pomocą:
Po raz kolejny celem tego „jednowierszowego” jest usunięcie tylko jądra OLDER niż aktualnie uruchomione jądro (co pozostawia dostępne nowo zainstalowane jądra)
Dzięki, daj mi znać, jak to działa dla Ciebie i czy możesz to poprawić!
źródło
Możesz po prostu wyświetlić katalog / boot, aby zobaczyć wersje jądra, które używasz polecenia „ls”. Następnie użyj „sudo apt-get -y purge” xxx ”, gdzie„ xxx ”jest zastąpione numerem wersji, którą chcesz usunąć. Uważaj, żebyś nie uruchomił wersji !!
źródło
Install
bikeshed
(apt install bikeshed
) i wywołajpurge-old-kernels
jako root.źródło
Szybka odpowiedź, wyjaśnienie na żądanie:
źródło
sed '$d'
polecenia. Skrypt nie usuwa żadnych pakietów nagłówka linux ani innych pakietów związanych z pakietami jądra, które mają zostać usunięte, poza tym nie usuwa plików konfiguracyjnych pakietów. Zamiast tego poleciłbym użyć mojej odpowiedzi.echo
)apt-get
polecenie, które można uruchomić.Naprawdę zmęczyłem się całą tą niepotrzebną złożonością i stworzyłem pakiet Python, który sprawia, że jedno-liniowy jest trywialny:
Zainstaluj za pomocą
Zobacz więcej na https://github.com/mrts/ubuntu-old-kernel-cleanup .
Mam nadzieję, że to pomaga również innym.
źródło
sudo pip install ...
zgodnie z powyższym opisem?sudo
jest właściwie ważne, w przeciwnym raziepip
zainstaluje go w katalogu użytkownika, a powłoka może nie przeszukiwać tego katalogu w poszukiwaniu plików wykonywalnych.Działa cały czas, a nawet Ubuntu 17.10
źródło
linux-libc-dev:amd64
, co jest niepożądane.