Jak zwolnić więcej miejsca w / boot?


563

Moja /bootpartycja jest prawie pełna i za każdym razem, gdy ponownie uruchamiam system, pojawia się ostrzeżenie. Usunąłem już stare pakiety jądra (linux-headers ...), w rzeczywistości zrobiłem to, aby zainstalować nowszą wersję jądra, która była dostarczana z automatycznymi aktualizacjami.

Po zainstalowaniu tej nowej wersji partycja jest prawie pełna. Co jeszcze mogę usunąć? Czy są jakieś inne pliki związane ze starymi obrazami jądra?

Oto lista plików na mojej /bootpartycji:

:~$ ls /boot/
abi-2.6.31-21-generic         lost+found
abi-2.6.32-25-generic         memtest86+.bin
abi-2.6.38-10-generic         memtest86+_multiboot.bin
abi-2.6.38-11-generic         System.map-2.6.31-21-generic
abi-2.6.38-12-generic         System.map-2.6.32-25-generic
abi-2.6.38-8-generic          System.map-2.6.38-10-generic
abi-3.0.0-12-generic          System.map-2.6.38-11-generic
abi-3.0.0-13-generic          System.map-2.6.38-12-generic
abi-3.0.0-14-generic          System.map-2.6.38-8-generic
boot                          System.map-3.0.0-12-generic
config-2.6.31-21-generic      System.map-3.0.0-13-generic
config-2.6.32-25-generic      System.map-3.0.0-14-generic
config-2.6.38-10-generic      vmcoreinfo-2.6.31-21-generic
config-2.6.38-11-generic      vmcoreinfo-2.6.32-25-generic
config-2.6.38-12-generic      vmcoreinfo-2.6.38-10-generic
config-2.6.38-8-generic       vmcoreinfo-2.6.38-11-generic
config-3.0.0-12-generic       vmcoreinfo-2.6.38-12-generic
config-3.0.0-13-generic       vmcoreinfo-2.6.38-8-generic
config-3.0.0-14-generic       vmcoreinfo-3.0.0-12-generic
extlinux                      vmcoreinfo-3.0.0-13-generic
grub                          vmcoreinfo-3.0.0-14-generic
initrd.img-2.6.31-21-generic  vmlinuz-2.6.31-21-generic
initrd.img-2.6.32-25-generic  vmlinuz-2.6.32-25-generic
initrd.img-2.6.38-10-generic  vmlinuz-2.6.38-10-generic
initrd.img-2.6.38-11-generic  vmlinuz-2.6.38-11-generic
initrd.img-2.6.38-12-generic  vmlinuz-2.6.38-12-generic
initrd.img-2.6.38-8-generic   vmlinuz-2.6.38-8-generic
initrd.img-3.0.0-12-generic   vmlinuz-3.0.0-12-generic
initrd.img-3.0.0-13-generic   vmlinuz-3.0.0-13-generic
initrd.img-3.0.0-14-generic   vmlinuz-3.0.0-14-generic

Obecnie używam 3.0.0-14-genericjądra.


5
Warto wspomnieć, że nie każda instalacja Ubuntu będzie miała osobną partycję / boot - często będzie to tylko jedna duża partycja. Ta odpowiedź dotyczy tych, którzy mają osobną partycję / boot. Osoby korzystające z LVM lub szyfrowania „pełnego dysku” wymagają osobnego rozruchu, w przeciwnym razie może być opcjonalny.
thomasrutter

4
Jeśli ktoś ma taki sam problem jak ja: po / boot nie ma już wolnego miejsca „apt-get upgrade” zakończy się niepowodzeniem podczas ponownego generowania plików initrd dla zainstalowanych jąder lub gdy skrypt aktualizacji-initramfs uważa, że ​​są instalowane poprzez sprawdzenie zawartość / var / lib / initramfs-tools. W tej sytuacji nie można usunąć starych jąder za pomocą apt-get, ponieważ na partycji fscking / boot nie ma już miejsca na urządzeniu. Można to zrobić za pomocą „dpkg -P”, a następnie wyczyścić odpowiedni wpis w / boot (do wolnego miejsca) i / var / lib / initramfs-tools (obraz initrd nie zostanie wygenerowany).
wojci

3
Kluczową kwestią dla poprawnych odpowiedzi jest to, że każą ci usunąć pakiety zawierające starsze wersje jądra. Wiele stron internetowych rozwiązujących ten problem zaleca bezpośrednie usunięcie plików z partycji / boot; może to działać przez jakiś czas, ale w końcu możesz zaktualizować pakiet, który ponownie tworzy pliki, których brakuje w wersjach jądra zawierających pakiety, przez co brakuje Ci miejsca.
kgrittn

Odpowiedzi:


629

Masz dużo nieużywanych jąder. Usuń wszystkie jądra oprócz ostatnich za pomocą:

sudo apt-get purge linux-image-{3.0.0-12,2.6.3{1-21,2-25,8-{1[012],8}}}

Jest to skrót od:

sudo apt-get purge linux-image-3.0.0-12 linux-image-2.6.31-21 linux-image-2.6.32-25 linux-image-2.6.38-10 linux-image-2.6.38-11 linux-image-2.6.38-12 linux-image-2.6.38-8

Usunięcie linux-image-x.x.x-xpakietu również spowoduje usunięcie linux-image-x.x.x-x-generic.

Nagłówki są instalowane /usr/srci używane podczas budowania modułów jądra Out-Tree (takich jak zastrzeżony sterownik NVIDIA i virtualbox). Większość użytkowników powinna usunąć te pakiety nagłówków, jeśli pasujący pakiet jądra ( linux-image-*) nie jest zainstalowany.

Aby wyświetlić listę wszystkich zainstalowanych jąder, uruchom:

dpkg -l linux-image-\* | grep ^ii

Jedno polecenie, aby wyświetlić wszystkie jądra i nagłówki, które można usunąć, z wyjątkiem bieżącego działającego jądra:

kernelver=$(uname -r | sed -r 's/-[a-z]+//')
dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve $kernelver

Wybiera wszystkie pakiety o nazwach rozpoczynających się od linux-headers-<some number>lub linux-image-<some number>, drukuje nazwy pakietów dla zainstalowanych pakietów, a następnie wyklucza aktualnie załadowane / działające jądro (niekoniecznie najnowsze jądro!). Jest to zgodne z zaleceniem testowania nowszego jądra przed usunięciem starszych, znanych z działania jąder.

Po aktualizacji jądra i ponownym uruchomieniu w celu przetestowania go możesz usunąć wszystkie inne jądra za pomocą:

sudo apt-get purge $(dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve "$(uname -r | sed -r 's/-[a-z]+//')")

16
Fantastyczna odpowiedź. Jedna dodatkowa informacja pomogłaby: Jak możesz (na pewno) powiedzieć, którego jądra używasz? Prawdopodobnie nie możesz po prostu założyć, że to ostatni ... Edytuj : I wygląda na to, że odpowiedź jest uname -a. Prawdopodobnie najlepiej, aby upewnić się, że nie masz oczekującego na ponowne uruchomienie jądra w celu instalacji nowego jądra (tak jak ja, ale zauważyłem niedopasowanie między uname -ajądrem a „najnowszym” jądrem).
TJ Crowder

5
@freddyb Gotowe. Zauważ, że polecenia drukują / usuwają jądra inne niż załadowane / uruchomione .
Lekensteyn,

9
Jeśli apt-get purge nie powiedzie się z powodu niezaspokojonych zależności, możesz postępować zgodnie ze wskazówkami na askubuntu.com/questions/171209/…
svandragt

11
Bardzo dokładna odpowiedź i nadal działa ... i wciąż jest potrzebna w 2014 roku. Trochę śmieszne, że nadal nie jest to automatycznie wykonywane przez narzędzia GUI.
allprog

6
@ byf-ferdy Jądro jest istotną częścią systemu operacyjnego, jeśli najnowsza wersja w jakiś sposób nie działa w pełni ze sprzętem, nadal możesz wybrać inną, z której chcesz uruchomić system. Miłą funkcją byłoby prawdopodobnie coś, co usuwa wszystkie automatycznie instalowane jądra starsze niż miesiąc (z wyjątkiem dwóch ostatnich).
Lekensteyn,

217

Twoja partycja rozruchowa jest pełna. Ponieważ jest to aktualizacja jądra, pliki te zostaną skopiowane na partycję rozruchową, więc musisz wyczyścić. Oto post na blogu , który pokaże, jak wyczyścić stare obrazy jądra za pomocą jednego polecenia. Podam podstawowe streszczenie metody. Użyj tego polecenia, aby wydrukować bieżącą wersję jądra:

uname -r

Następnie użyj tego polecenia, aby wydrukować wszystkie zainstalowane jądra, które nie są twoim najnowszym jądrem:

dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]'

Upewnij się, że twojego obecnego jądra nie ma na tej liście. Zauważ, że jest to większość ostatniego polecenia (poniżej). Aby odinstalować i usunąć te stare jądra, będziesz chciał przesłać te argumenty do:

sudo apt-get -y purge

Teraz możemy zrobić wszystko, co chcemy, łącząc te dwa ostatnie polecenia w ten bezbożny bałagan:

dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]' | xargs sudo apt-get -y purge

I to jedno polecenie zajmie się wszystkim za ciebie. Potwierdzę, że działa to idealnie, ale nigdy nie ufaj nikomu w Internecie. :) Aby uzyskać więcej informacji, post na blogu bardzo dobrze wyjaśnia, co robi każda część polecenia, więc przeczytaj ją, abyś był zadowolony, że robi to, co chcesz.


odpowiada to również linux-libc-dev: amd64
Frederick Nord

co spowoduje niezamierzone usunięcie „linux-libc-dev: amd64”?
ConfusedStack

@FrederickNord dzięki za heads-upy. Naprawiono to. Spowodowałoby to pewne trudności przy kompilacji programów c.
dward

8
Polecenie brzmi dobrze, ale kiedy go uruchamiam, pojawia się ten sam błąd, który pojawia się, gdy chcę coś zainstalować i nie można tego zrobić, ponieważ rozruch jest pełny: --------------- ----------- Następujące pakiety mają niezaspokojone zależności: linux-image-extra-4.2.0-27-generic: Zależy: linux-image-4.2.0-27-generic, ale nie będzie do zainstalowania linux-image-extra-4.2.0-30-generic: Zależy: linux-image-4.2.0-30-generic, ale nie zostanie zainstalowany
Alex

109
sudo apt-get autoremove

To polecenie wykonuje zadanie automatycznie.


7
Jak sama nazwa wskazuje, apt-get AUTOremove to zautomatyzowana operacja, w której system „zgaduje”, co próbujesz osiągnąć. Nie należy go stosować jako substytutu administracji systemu zdrowego rozsądku. Problem z tym podejściem: jeśli ty (lub aktualizacja) usuniesz pakiet, który jest częścią tej listy zależności, funkcja automatycznego usuwania chce usunąć wszystkie inne pakiety z listy zależności, pozostawiając ci system bez działającego pulpitu (a czasem nawet przy całkowicie zepsutym systemie).
Rinzwind

Odniesienie: 1 z wielu źródeł tego komentarza powyżej: linuxquestions.org/questions/debian-26/…
Rinzwind

7
jeśli Linux-image-generic jest zainstalowany, a nowe jądra nie zostały zainstalowane jawnie, spowoduje to usunięcie starych jąder. Zdrowym rozsądkiem jest nieakceptowanie żadnych zmian w systemie bez uprzedniego ich przeczytania. Jeśli przed użyciem tego polecenia zastosowano zdrowy rozsądek, nie będzie żadnych problemów.
mchid

1
@Rinzwind - To polecenie opróżniło 250 MB mojego miejsca na dysku, usuwając stare „nagłówki Linux”
Chinmaya B

3
autorove działa, jeśli zostanie użyte, zanim wystąpi warunek braku miejsca. Jednak gdy aptowi zabraknie miejsca i zostanie przerwany (a użytkownik w końcu zauważy problem), jest już za późno, aby uruchomić automatyczne usuwanie lub jakiekolwiek inne rozwiązanie oparte na apt. Jeśli tak jest w Twoim przypadku, wypróbuj jedno z rozwiązań opartych na dpkg.
user535733,

40

Za pomocą Menedżera pakietów Synaptic można łatwo wybierać i usuwać stare obrazy jądra. Zrzut ekranu z Menedżerem pakietów Synaptic

Jeśli nie masz jeszcze zainstalowanej Synaptic:

sudo apt-get install synaptic

Uruchom aplikację i wybierz pokazane opcje.

Powinieneś być w stanie podświetlić wszystkie pakiety „linux-” w wersji „2.6.x”, gdzie x wynosi od 31 do 38, zgodnie z plikami w folderze / boot.

Kliknij prawym przyciskiem myszy każdy z tych pakietów linux i wybierz opcję „Oznacz do całkowitego usunięcia”. Na koniec kliknij przycisk Zastosuj. Spowoduje to usunięcie wszystkich plików i wszelkich powiązanych plików. Twój /bootfolder powinien być teraz nieco bardziej uporządkowany.


Mam 14.04. W przeszłości radziłem sobie z tą sytuacją za pomocą wiersza poleceń, ale postanowiłem wypróbować tę metodę dzisiaj ... dla mnie moje obrazy linuksowe były zlokalizowane pod zainstalowanym (ręcznym), niezainstalowanym (lokalnym lub przestarzałym)
Ryan

8
O nie. Nie mogę zainstalować Synaptic, ponieważ nie ma na nim miejsca /boot!
John McGehee,

@JohnMcGehee fsck i parted powinni rozwiązać ten problem.
FlipMcF,

25

Dziękuję za szczegółowy opis twojego problemu, dzięki czemu zmierzam we właściwym kierunku. Chociaż warto zachować poprzednie pliki jądra, możesz je wszystkie usunąć za jednym razem, sprawdź ten post:
Jak usunąć wszystkie nieużywane nagłówki, obrazy i moduły jądra Linux

Wykonano za pomocą wiersza polecenia. Jeśli robisz to zdalnie, użyj czegoś takiego jak WINSCP, aby otworzyć sesję terminala i po prostu wkleić ją, działa bardzo dobrze.

Tutaj jest skopiowany z linku do artykułu, proponuję przeczytać cały artykuł:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge

23

To nowa odpowiedź na stare pytanie, ale łatwym sposobem na wyczyszczenie tej rzeczy (i nie tylko) jest zainstalowanie Ubuntu Tweak . Aby zainstalować :

sudo add-apt-repository ppa:tualatrix/ppa
sudo apt-get update
sudo apt-get install ubuntu-tweak

następnie możesz uruchomić Ubuntu Tweak, przechodząc do zakładki „woźny”, i odtąd to kwestia trzech kliknięć:

Ulepszony woźny Ubuntu dla starych jąder

Jednak dla bezpieczeństwa lepiej zostawić ostatnie jądro (nigdy nie wiadomo) lub dobrze działające jądro; ale można to łatwo dostosować.

Możesz użyć tego samego narzędzia do czyszczenia wielu rzeczy --- pamiętaj tylko, że jeśli wyczyścisz pamięć podręczną miniatur lub pamięć podręczną TB, system będzie musiał je odbudować, jeśli będą potrzebne.


Próbowałem zainstalować ulepszenie Ubuntu, a także udałem się na stronę repozytorium. Mówi, że jest to tylko 13.10 i wcześniej. Czy masz zaktualizowaną wersję do 15.04?
JayCouture.com,

@ JayCouture.com Wersja na stronie jest w wersji 14.04 („dla 13.10 i wcześniej” to link do starszych wersji). Ignoruję, jeśli istnieje wersja dla 14.10 lub 15.04.
Rmano

19

Udało mi się rozwiązać problem, dpkgusuwając pakiety bezpośrednio. Chociaż pakiety są nadal wymienione na liście dpkg -l, pliki są usuwane /boot, co zwalnia miejsce.

phrogz@planar:/boot$ sudo dpkg --remove linux-image-2.6.32-30-server
(Reading database ... 145199 files and directories currently installed.)
Removing linux-image-2.6.32-30-server ...
Running postrm hook script /usr/sbin/update-grub.
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.32-35-server
Found linux image: /boot/vmlinuz-2.6.32-34-server
Found initrd image: /boot/initrd.img-2.6.32-34-server
Found linux image: /boot/vmlinuz-2.6.32-33-server
Found initrd image: /boot/initrd.img-2.6.32-33-server
Found linux image: /boot/vmlinuz-2.6.32-32-server
Found initrd image: /boot/initrd.img-2.6.32-32-server
Found linux image: /boot/vmlinuz-2.6.32-31-server
Found initrd image: /boot/initrd.img-2.6.32-31-server
Found memtest86+ image: /memtest86+.bin
done

# Repeat for kernels -31 and -32 and -33, up to (but not including)
# the version listed by `uname -a`

Potem apt-get -f installnaprawiłem problemy z zależnością i wszystko było dobrze ze światem.

Nie zaakceptuję jednak mojej odpowiedzi, ponieważ wciąż muszę wiedzieć, czy powinienem zwiększyć swój /bootrozmiar, czy zrobić coś innego.


Po pierwsze, nie powinieneś mieć oddzielnej partycji / boot, lub powinieneś zwiększyć jej rozmiar, ponieważ 100mb jest za małe.
psusi

1
Dzięki, sudo dpkg --remove linux-headers-3.5.0-28*
usuwam

2
i sudo dpkg --remove linux-image-3.5.0-28*dla obrazu, sprawdzone przezdf -h
TiloBunt

Dzięki, to mi też służyło. Usunąłem kilka starych jąder ( nie tych, których aktualnie używam), a następnie zrobiłem apt-get -f install. Nie zapomnij też zrobić później apt-get autoremove, aby usunąć inne niepotrzebne.
Yajo

15

Możesz przestać używać osobnej partycji / boot, wtedy nie będziesz miał tak ograniczonej przestrzeni. Aby to zrobić, odmontuj partycję, następnie zamontuj ją w innym miejscu i skopiuj wszystkie pliki do katalogu / boot na partycji głównej, a następnie usuń wpis z / etc / fstab i ponownie zainstaluj grub. Na przykład (musisz użyć właściwej partycji):

sudo -s
umount /boot
mount /dev/sda2 /mnt
cp -a /mnt/* /boot/
umount /mnt
gedit /etc/fstab
grub-install /dev/sda

Następnie możesz użyć gparted, aby usunąć starą partycję / boot i ewentualnie rozszerzyć partycję root, aby użyć tej przestrzeni. Aby rozszerzyć partycję root, musisz uruchomić system z LIVECD, a wolne miejsce musi znajdować się natychmiast po prawej stronie. Jeśli partycja / boot znajduje się obecnie po lewej stronie partycji głównej, musisz najpierw przenieść partycję główną w lewo, a następnie ją rozszerzyć, ale może to zająć bardzo, bardzo długo, więc może nie być warte kłopot.


6
Przeniesienie / boot na moją główną partycję nie jest dla mnie rozwiązaniem, ponieważ wszystko oprócz / boot jest szyfrowane. Przepraszam, nie wiedziałeś o tym z mojego pytania.
user6722,

Jest to dobre rozwiązanie, jeśli powyższe rozwiązania nie działają z powodu braku miejsca na woluminie rozruchowym lub jeśli często występuje problem „braku miejsca”. Przeczytaj najpierw, dlaczego czasami wymagana jest partycja / boot: ( help.ubuntu.com/community/DiskSpace )
svandragt

@svandragt, w zasadzie nie ma powodu, aby potrzebować partycji / boot w tych dniach. Pozostaje tylko jedno, jeśli twoje bios jest zepsute i nie widzi całego dysku, a żadna maszyna wyprodukowana w ostatniej dekadzie nie ma takich ograniczeń. Inne starsze przypadki, takie jak użycie raid lub LVM, są teraz poprawnie obsługiwane przez grub2.
psusi

Istnieje kilka powodów posiadania oddzielnej partycji rozruchowej. Ale nie jestem pewien, czy korzyści są warte zwiększonej konfiguracji złożoności. 1. System operacyjny może czerpać korzyści z szybszego rozruchu przez ext2. 2. Bezpieczeństwo można zwiększyć, montując / uruchamiając jako RO. (rootkity itp.), a nawet pozostaną odmontowane w czasie wykonywania systemu operacyjnego. 3. grub (1) ma (miał) pewne problemy z ext4 wciąż. 4. Wymagany do uruchomienia lvm (grubv1). Chociaż nie dotyczy to domyślnej konfiguracji ubuntu.
David Cahill,

lsblkmożna użyć do ustalenia, która partycja jest czym
Mr Purple

9

Biorąc to, co najlepsze z powyższych odpowiedzi, moje wypróbowane i prawdziwe podejście jest następujące:

  • uname -a znaleźć działające jądro.
  • dpkg -l linux-{headers,image}-\* | grep ^iiaby wyświetlić listę wszystkich aktualnie zainstalowanych pakietów związanych z jądrem. Obejmuje to działające jądro.
  • sudo apt-get purge linux-{image,headers}-3.16.0-{xx,yy,zz}aby usunąć stare jądra. Zamień xx,yy,zzna listę kompilacji jądra, które chcesz usunąć - są to wszystkie kompilacje wymienione przez poprzednie polecenie, które są starsze niż aktualnie uruchomione jądro. Upewnij się, że nie usuwasz aktualnie działającego jądra - twój system przestanie się uruchamiać . Może być również konieczna zmiana wersji jądra z 3.16.0na cokolwiek zainstalowanego w twoim systemie.
  • Opcjonalnie wykonaj dodatkowe sudo apt-get autoremove- usunie to wszelkie zależności starych jąder, które nie są już potrzebne bieżącemu, zwalniając więcej miejsca.

Możesz mieć pliki nagłówkowe bez zainstalowanych pasujących wersji jądra lub odwrotnie - po prostu dołącz wszystkie te wersje do polecenia. APT będzie narzekać, że niektórych pakietów nie można usunąć, ponieważ nie są zainstalowane, ale to nie zaszkodzi.

Jeśli coś zawiedzie ...

  • Jeśli polecenie apt nie ze względu na brak miejsca na urządzeniu błędu, należy użyć polecenia dpkg odpowiada zamiast: sudo dpkg --purge linux-{image,headers}-3.16.0-{xx,yy,zz}.
  • Jeśli polecenie dpkg nadal nie działa, ponieważ linux-imagepakiety są wymagane przez linux-headerspakiety tej samej wersji (którą również chcesz odinstalować), dpkg mógł nie rozwiązać tego problemu. Ponownie sprawdź dane wyjściowe dpkg -li podaj sufiksy nazw pakietów w wierszu polecenia. Na przykład w jednym z moich systemów polecenie, które ostatecznie zadziałało, było sudo dpkg --purge linux-{image,headers}-3.16.0-{xx,yy,zz}-generic-pae.
  • Jeśli pojawi się jakikolwiek inny błąd, poszukaj pomocy - możesz mieć inny problem, niż ci się wydawało.

@ user535733 zwykłym przypadkiem (przynajmniej tym, w którym ciągle się napotykam) jest to, że wciąż jest na nim trochę miejsca /boot, po prostu za mało na inny pakiet jądra. W tych przypadkach powyższe działało dobrze. Dodaj jednak odpowiednie dpkgpolecenie. Jeśli chodzi o purgenie, nie jest to rodzaj „wymuszonego usunięcia”. W odróżnieniu od removetego usuwa również pliki konfiguracyjne. Od / jak długo pakiety jądra instalować żadnych plików konfiguracyjnych, removea purgezrobi to samo dla pakietów jądra.
user149408

Dodano czwarty punkt z odpowiednią komendą dpkg.
user535733

4

Dla mnie oboje apt-get purgei dpkg --removeoboje zawiedli. Musiałem więc usunąć kilka starszych obrazów jądra z / boot with rm -f.


4
To nie jest dobry sposób na usunięcie pakietów. Chociaż ta odpowiedź nie jest bardzo konkretna na temat tego, dlaczego usunięcie ich nie powiodło się, jestem pewien, że jeśli ta informacja została podana (w osobnym pytaniu, oczywiście), moglibyśmy spróbować ustalić przyczynę problemu.
thomasrutter

2
Uważam, że to nie powiodło się, ponieważ /bootpartycja była pełna. Komendy te próbują najpierw zaktualizować jądro do najnowszej i zawiesić się No space left on devicepodczas generowaniainitrd.img
vp_arth

1
OSTRZEŻENIE, bezpośrednie usuwanie plików może prowadzić do problemów, ponieważ aktualizacja pakietu oprogramowania układowego linux może odtworzyć plik initrd.img dla każdej wersji, która według niego jest zainstalowana na podstawie informacji o pakiecie. Zobacz: askubuntu.com/questions/865577/…
kgrittn

1
dzięki, to jest ostateczne rozwiązanie ratujące życie, gdy nic innego nie działa.
Jeff Puckett,

4

Wyświetl wszystkie jądra:

dpkg --list 'linux-image*'

Wyświetl bieżące jądro:

uname -r

Wyświetl wszystkie jądra Z WYJĄTKIEM aktualnego:

dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]'

Upewnij się, że twojego obecnego jądra nie ma na tej liście.

Usuń wszystkie jądra Z WYJĄTKIEM bieżącego:

dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]' | xargs sudo apt-get -y purge

Wyczyść inne rzeczy:

sudo apt-get autoremove

Jeśli nadal występuje błąd miejsca na dysku rozruchowym podczas instalowania / odinstalowywania plików, usuń bezpośrednio jeden z OLD obrazów z katalogu / boot,

ls -lh /boot/*-3.13.0-119*;

rm /boot/*-3.13.0-119*; 

UWAGA: Proszę ponownie przejrzeć bieżący obraz jądra przed usunięciem dowolnego obrazu.


2

Już usunąłem stare pakiety jądra (nagłówki linux ...)

linux-headers-*nie są jądra. Pakiety jądra są nazwane linux-image-*. Wymienione linux-headers-*są pakiety programistyczne do kompilacji modułów jądra: nie znajdują się one w katalogu / boot i nie są wymagane do codziennego korzystania z systemu.

Pliki, które wymienione w katalogu / boot zrobić to kilka starych obrazów jądra ( vmlinuz*) i skompilowane obrazy initrd ( initrd.img*) dla tych ziaren, co wskazuje, że nadal masz wiele starych pakietów jądra zainstalowanych.

Powinieneś być w stanie wyświetlić listę zainstalowanych jąder

aptitude search ~ilinux-image

(Zauważ, że prawdopodobnie zwróci to również pakiety, które nie są jądrami).

Zwykle nie ma potrzeby instalowania więcej niż dwóch jąder - tego aktualnie używanego i poprzedniego do tego (jako rezerwowego). Możesz więc zacząć usuwać starsze, jeden po drugim, w następujący sposób:

sudo apt-get autoremove linux-image-3.2.0-23-generic

Upewnij się, że zastąpiłeś „3.2.0-23-generic” rzeczywistą wersją jądra, którą chcesz usunąć! Nie usuwaj również pakietów takich jak linux-image-generic. Musisz bardzo uważać, aby nie usunąć aktualnie działającego jądra, w przeciwnym razie nie będzie można uruchomić systemu (Ubuntu może ostrzegać przed zrobieniem tego).

Możesz znaleźć aktualnie działające jądro z:

uname -r

1

Miałem ten problem i więcej, ponieważ initrd-img-xxxręcznie usunąłem niektóre pliki z / boot i miałem problem z tym, że te stare wersje nadal generowały się i wypełniały /bootfolder. Aby to naprawić, wykonałem następujące czynności:

  • Usunąłem ręcznie wygenerowaną starą wersję jądra, aby zwolnić miejsce.
  • Będziesz edytować tekstowy plik konfiguracyjny jako superużytkownik, więc wklej następujące elementy do terminala:

    sudo gedit /etc/initramfs-tools/update-initramfs.conf
    
  • Znajdź linię update_initramfs=yesi zmień ją na update_initramfs=no. Zapisz i zamknij plik, a następnie uruchom:

    sudo dpkg --configure -a
    

To rozwiązało mój problem. To było oparte na tym blogu

Mamy nadzieję, że wszystko powinno być w porządku po restarcie, a później można spróbować zmienić noz powrotem do yesw update-initramfs.conf.


1

Pokazuję, że jeszcze w 2017 r. To pytanie ma nowe komentarze i odpowiedzi, ale brakuje jednej odpowiedzi, która moim zdaniem jest bardzo przydatna:

Ubuntu jako zwykły system operacyjny do codziennego użytku nie ma powodu, aby instalować go z oddzielną partycją \ boot, a coś takiego NIE oferuje coś „zwykłemu użytkownikowi” ... Więc rozwiązaniem jest nowa instalacja bez partycji \ boot i to w ten sposób nigdy nie będziesz mieć takiego problemu

PS: Moja odpowiedź może zostać usunięta lub dodana do zaakceptowanej odpowiedzi ... (Myślę, że to pomoże niektórym ludziom w ten sposób)


1

Super pomocne narzędzie , które wyczyści partycję rozruchową

git clone https://github.com/erichs/bootnukem.git
cd bootnukem
sudo ./install.sh

Używaj na własne ryzyko, ale zadziałało dla mnie:

sudo bootnukem

Dlaczego głosowanie negatywne?
Jonathan

0

W aptitude lub synaptic znajduje się sekcja „stary lub ręcznie zainstalowany pakiet”. Powinny tam być stare pakiety linuksowe.


0

Jest skrypt bash, który napisałem poniżej, który sprawia, że ​​proces jest nieco bardziej przyjazny dla użytkownika.

YMMV - został stworzony dla Mennicy 14. Wciąż uczę się BASH, więc prawdopodobnie jest trochę niezręczny. Używaj na własne ryzyko, ale to działa dla mnie!

#!/bin/bash

endCol='\e[0m'
bold_red='\e[1;31m'
bold_green='\e[1;32m'
bold_yellow='\e[1;33m'

title_color='\e[0;30;47m'

function show_kernel_info {
clear
current_kernel=$(uname -r)
echo "Current ACTIVE kernel is:"
echo -e "  "$bold_yellow$current_kernel$endCol
echo "This kernel will be TOTALLY EXCLUDED from all actions in this script."
echo "Also, one fallback non-active kernel will be always left untouched."
echo ""
echo "These are the non-active kernels stored in /boot:"
count_of_old_kernels_in_boot=$(ls -o /boot/initrd* | grep -c -v "$current_kernel")
if [ $count_of_old_kernels_in_boot = 0 ]; then
  echo " * No non-active kernels found! *"
else
  ls -o /boot/initrd* | grep -v "$current_kernel"
fi
echo ""
list_of_old_kernels=$(dpkg --list | grep linux-image | awk -F' ' '{ print $2 }' | grep -v "$current_kernel" | grep -v "linux-image-generic")
current_old_kernel=$(dpkg --list | grep linux-image | awk -F' ' '{ print $2 }' | grep -v "$current_kernel" | grep -v "linux-image-generic" | head -n 1)
count_of_old_kernels_installed=$(dpkg --list | grep linux-image | awk -F' ' '{ print $2 }' | grep -v "$current_kernel" | grep -c -v "linux-image-generic")
echo "Listing of all unused kernels still installed in the system (these may not exist in /boot):"
if [ $count_of_old_kernels_installed = 0 ]; then
  echo " * No unused kernel installs found! *"
else
  dpkg --list | grep linux-image | awk -F' ' '{ print $2 }' | grep -v "$current_kernel" | grep -v "linux-image-generic"
fi
echo ""
}

function exit_script {
free_space_after=$(df -BM /boot | tail -n 1 | awk -F' ' '{ print $4 }' | tr -d M)
let freed_space=$free_space_after-$free_space_before
echo ""
echo "Results (in MB)"
echo "---------------"
echo "Free space in /boot before script was run: "$free_space_before
echo "Free space now: "$free_space_after
echo ""
echo "Amount of space freed up = "$freed_space
echo ""
echo "Press any key to exit."
read -s -n 1
echo ""
exit
}

# Main code
echo ""
echo -e $title_color" --------------------------- "$endCol
echo -e $title_color" -   Kernel Cleanup v1.0   - "$endCol
echo -e $title_color" --------------------------- "$endCol
echo ""
echo "Maximise this window for readability."
echo "Press any key to continue."
read -s -n 1
echo ""
echo "This script will remove old unused kernels, but it will prompt you before removing each one."
echo "It will never remove the current running kernel, and will also leave one fallback kernel."
echo "It can also remove source files from /usr/src for each kernel removed."
echo "This is normally safe to do and will free up lots more space."
echo ""
echo "Do you want that done as well? (y/n, enter=yes)"
valid_input=0
while [ "$valid_input" = "0" ]; do
  read -s -n 1 YesNo_input
  if [ "$YesNo_input" = "" ]; then
    YesNo_input="y"
  fi
  case $YesNo_input
  in
    y)
    RemoveSource="y"
    valid_input=1
    ;;

    Y)
    RemoveSource="y"
    valid_input=1
    ;;

    n)
    RemoveSource="n"
    valid_input=1
    ;;

    N)
    RemoveSource="N"
    valid_input=1
    ;;
  esac
done

free_space_before=$(df -h /boot | tail -n 1 | awk -F' ' '{ print $4 }' | tr -d M)
show_kernel_info
while [ $count_of_old_kernels_in_boot -gt 1 ]; do
  # failsafe check if somehow the current kernel is about to be removed!
  if [ "$current_old_kernel" = "$current_kernel" ]; then
    echo -e $bold_red"ERROR!"$endCol" Somehow the current kernel has crept into the removal process!"
    echo "I refuse to do that! Aborting script."
    exit_script
  fi
  # failsafe check if somehow a linux-image-generic entry is about to be removed
  if [ "$current_old_kernel" = "linux-image-generic" ]; then
    echo -e $bold_red"ERROR!"$endCol" Somehow one of the linux-image-generic entries has crept into the removal process!"
    echo "I refuse to do that! Aborting script."
    exit_script
  fi
  echo "Command about to be executed is:"
  echo "  $ sudo apt-get purge \"$current_old_kernel\""
  check_in_boot=$(echo $current_old_kernel | sed 's/linux-image/initrd.img/g')
  if [ -e /boot/$check_in_boot ]; then
    echo -e $bold_yellow"Note:"$endCol" This kernel exists in /boot but it NON-active, so it's OK to remove."
  else
    echo -e $bold_green"Totally safe to remove:"$endCol" This kernel does NOT exist in /boot."
  fi
  echo ""
  echo "Are you sure you want to remove this kernel?"
  echo "(*upper case* Y=yes / any other key will exit the script)"
  read -s -n 1 yes_no
  echo ""
  # Only entering a single upper case Y will work!
  if [ "$yes_no" != "Y" ]; then
    echo "Aborting script."
    exit_script
  fi
  echo "Removing kernel "$current_old_kernel"..."
  sleep 1
  sudo apt-get -y purge $current_old_kernel
  if [ "$RemoveSource" = "y" ]; then
    current_old_source=$(echo $current_old_kernel | sed 's/linux-image/linux-headers/g')
    current_old_source=$(echo $current_old_source | sed 's/-generic//g')
    current_old_source=$(echo $current_old_source | sed 's/-pae//g')
    sudo apt-get -y purge $current_old_source
  fi
  show_kernel_info
done

if [ $count_of_old_kernels_in_boot = 0 ]; then
  echo -e $bold_red"There are no NON-active kernels to remove!"$endCol
else
  echo -e $bold_red"There is only one NON-active kernel left in /boot!"$endCol
  echo "This script will not remove the last non-active kernel so that you have at least one backup kernel."
fi
echo "Aborting script."
exit_script

0

[Jako noob AskUbuntu nie mogę komentować, dopóki reputacja nie będzie wynosić 50, więc nie głosuj z tego powodu.]

Mój serwer też to robił. Dosłownie żadna z oczekiwanych odpowiedzi tutaj nie zadziałała, ponieważ wymagają one trochę przestrzeni roboczej na / boot do ich wypełnienia. Jeśli partycja rozruchowa jest pełna, nagle się zakończy bez usuwania żadnego z obrazów.

Jedyną rzeczą, która działała dla mnie, było przejrzenie bieżącego obrazu, a następnie ręczne sprawdzeniesudo rm filename najstarszych plików obrazów (każdy miał w nazwie -3,16.0-30 ). Kiedy to zostało zrobione, sudo apt-get autoremovemiał pokój do poruszania się, którego potrzebował do wykonania swojej pracy. Podkreślił niektóre błędy związane z tą wersją, na przykład: „depmod: FATAL: nie można załadować /boot/System.map-3.16.0-30-generic: Brak takiego pliku lub katalogu”, ale należy się tego spodziewać.

Po zakończeniu dfzwrócił 42% używanego dla / boot, aby wskazać, że jest znów zdrowy.


1
muru

@muru Cóż, tak ... Sugerowałbym, że oryginalny plakat również potrzebuje tej porady. Gdy / boot jest pełny, te skrypty, które próbują go naprawić, również się nie udają, ponieważ / boot jest pełny.
Justin Case

Cóż, istnieją dwa podobne problemy: a) gdy system ostrzega, że ​​dysk się zapełnia, ale apt-getma wystarczająco dużo miejsca, aby przejść dalej, oraz b), gdzie apt-getkończy się niepowodzeniem, ponieważ dysk jest zbyt pełny. To jest drugi post.
muru


0

Zapisz ten skrypt jako /usr/local/bin/remove_kernels.sh(pamiętaj, aby udzielić uprawnień do wykonywania sudo chmod 755 /usr/local/bin/remove_kernels.sh):

#!/bin/sh
if test $(id -u) != 0; then
 echo Error: You must be root to run this script!
 exit 1
fi
apt purge $( dpkg --list | grep -P -o "linux-image-\d\S+" | grep -v $(uname -r | grep -P -o ".+\d") )
update-grub

Następnie, aby usunąć wszystkie stare jądra, po prostu wpisz: sudo remove_kernels.sh


0

Partycja / boot może czasem być nieco dziwna

nie zaczynaj bezpośrednio usuwać plików jądra.

Kroki do naśladowania

  1. Sprawdź, czy aktualnie zainstalowane jądro jest używane przez system Linux

    uname -r

    powinno to dać nazwę aktualnie zainstalowanego obrazu jądra w systemie

  2. Teraz zacznij usuwać dodatkowe pliki oprócz jednego określonego zainstalowanego w twoim systemie

    apt-get remove linux-image-XXXXX

  3. Usuń również plik nagłówka

    apt-get remove linux-headers-XXXXX

  4. Może również występować stan, w którym aptprzestał działać, w takim przypadku przełącz na / boot

    cd /boot

  5. Rozpocznij usuwanie plików ręcznie, ale bardzo ostrożnie pamiętaj, aby nie usuwać installed one'splików jądra z systemu.

    rm linux-image-XXXXX

    rm linux-image-extra-XXXXXX

  6. Po usunięciu poprawnego czyszczenia plików instalacje częściowe są instalowane

    apt-get -f install

  7. Usuń dodatkowe pliki znajdujące się tam jako pliki rozruchowe czyszczone ręcznie

    apt-get autoremove

  8. Zaktualizuj grub

    update-grub

  9. Na koniec zaktualizuj pakiety systemowe

    apt-get update


-1

Jeśli nie możesz usunąć więcej nieużywanych plików i masz inną partycję z / lub wolnym miejscem na tym samym urządzeniu, możesz zmienić rozmiar partycji / boot przez parted / gparted . (Jest również zawarty na nośniku instalacyjnym.)

Ostrzeżenie : zmiana rozmiaru partycji jest niebezpieczną operacją, zapisz ważne dane na innym nośniku, zanim to zrobisz!


Większość osób cierpiących na małe oddzielne partycje / boot partycje wybrało „szyfrowanie całego dysku” podczas instalacji, co wymaga LVM. To rozwiązanie wydaje się powodować więcej problemów niż rozwiązuje dla tych użytkowników.
user535733
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.