Moja partycja / boot osiągnęła 100%, a teraz nie mogę zaktualizować. Nie można usunąć starych jąder, aby zrobić miejsce

154

Mój pierwszy problem był, kiedy próbowałem apt-get updatelub apt-get upgrade. Po uaktualnieniu pojawia się następujący błąd:

You might want to run 'apt-get -f install' to correct these.
The following packages have unmet dependencies:
linux-image-server : Depends: linux-image-3.2.0-27-generic but it is not installed
E: Unmet dependencies. Try using -f.

Próbowałem uruchomić apt-get install -f i to był wynik (po powiedzeniu tak po znaku zachęty)

(Reading database ... 186183 files and directories currently installed.)
Unpacking linux-image-3.2.0-27-generic (from .../linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb) ...
Done.
dpkg: error processing /var/cache/apt/archives/linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb (--unpack):
 failed in write on buffer copy for backend dpkg-deb during `./boot/System.map-3.2.0-27-generic': No space left on device
 No apport report written because the error message indicates a disk full error
                                                                          dpkg-deb:    error: subprocess paste was killed by signal (Broken pipe)
Examining /etc/kernel/postrm.d .
run-parts: executing /etc/kernel/postrm.d/initramfs-tools 3.2.0-27-generic   /boot/vmlinuz-3.2.0-27-generic
run-parts: executing /etc/kernel/postrm.d/zz-update-grub 3.2.0-27-generic /boot/vmlinuz-3.2.0-27-generic
Errors were encountered while processing:
/var/cache/apt/archives/linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

Próbowałem uruchomić apt-get autoremovei daje mi ten sam błąd co apt-get upgrade.

Po uruchomieniu dfotrzymuję to za /boot:

/dev/sda1                    233191     230297         0 100% /boot

Czytam więc gdzie indziej, że powinienem spróbować oczyścić stare jądra. Sprawdziłem, jakie jądra mam z:

$ dpkg -l linux-image-\* | grep ^ii
ii  linux-image-2.6.38-13-server  2.6.38-13.52  Linux kernel image for version 2.6.38 on x86_64
ii  linux-image-3.0.0-13-server   3.0.0-13.22   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-14-server   3.0.0-14.23   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-15-server   3.0.0-15.26   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-16-server   3.0.0-16.29   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-17-server   3.0.0-17.30   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.2.0-24-generic  3.2.0-24.39   Linux kernel image for version 3.2.0  on 64 bit x86 SMP
ii  linux-image-3.2.0-25-generic  3.2.0-25.40   Linux kernel image for version 3.2.0  on 64 bit x86 SMP
ii  linux-image-3.2.0-26-generic  3.2.0-26.41   Linux kernel image for version 3.2.0  on 64 bit x86 SMP

Kiedy próbuję usunąć najstarszy z tym:

$ sudo apt-get purge linux-image-2.6.38-13-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
linux-image-server : Depends: linux-image-3.2.0-27-generic but it is not going to be     installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

Jak mogę zwolnić lub przedłużyć rozruch bez zakłócania instalacji?

Strifey16
źródło
Myślę, że odpowiedź @ mreiter może być najlepsza: używa menedżera pakietów i działała, gdy inne polecenia menedżera pakietów zawiodły, przynajmniej dla mnie: askubuntu.com/a/205776/247661
Aaron Hall
1
@dskrvk Tak! Dlaczego Remove-Unused-Dependenciesnie jest domyślna?
Steven R. Loomis,

Odpowiedzi:

129

Zwalnianie miejsca w systemie plików root

Aby zwolnić miejsce w głównym systemie plików, możesz spróbować wykonać apt-get clean.

Jeśli to nie zadziała, możesz przejść /var/cache/apt/archivesi ręcznie usunąć kilka plików z pamięci podręcznej, aby odzyskać trochę miejsca, np .:

sudo rm linux-headers-*

Usunięcie wszystkich .debplików tutaj nie zaszkodzi, jeśli zajdzie taka potrzeba - właśnie to apt-get cleanrobi. Zostaną automatycznie pobrane ponownie, aptjeśli będą potrzebne.

Zwalnianie miejsca w systemie plików / boot

Oryginalny plakat ma oddzielną /bootpartycję, która jest pełna i uniemożliwia działanie aptsystemu. Konieczne będzie, aby zwolnił tam miejsce.

Jeśli jest prawie wystarczająca ilość miejsca, przejdź do /booti usuń plik konfiguracyjny lub dwa:

sudo rm config-3.2.0-19-generic-pae

na przykład, ale używając nazwy jednej z wersji jądra, którą i tak zamierzasz usunąć. To zwolni trochę miejsca (około 144 KB na sztukę).

Jeśli potrzebujesz więcej miejsca indywidualnie usunąć stare vmlinuz, initrd, abioraz System.mappliki aż masz wystarczająco dużo miejsca (około 22m dla jednego z moich i386 wersji jądra).

Cokolwiek zrobisz, nie usuwaj ich wszystkich . Powinieneś zachować przynajmniej dwie ostatnie pasujące wersje każdego rodzaju pliku, dla każdego rodzaju używanego jądra.

Następnie postępuj zgodnie z poleceniami instalacji apt-get. Jak wspomniano powyżej, może być konieczne ponowne pobranie niektórych usuniętych debetów, ale jeśli tak, nastąpi to automatycznie. Po ponownym uruchomieniu apt, posprzątaj za pomocą apt-get, aby usunąć pakiety odpowiadające usuniętym plikom - więc wszystko pasuje.


Plik konfiguracyjny w /bootto konfiguracja jądra, która została użyta przez zespół jądra do zbudowania jądra o tej samej nazwie. Usunięcie powinno być nieszkodliwe, chyba że chcesz go w celach informacyjnych lub pomóc w budowaniu własnych jąder.

Na koniec ręcznie usuwasz stary pakiet jądra lub dwa z /bootpartycji, aby zrobić jeszcze więcej miejsca na nową.

John S Gruber
źródło
Próbowałem usunąć prawie wszystkie konfiguracje. Nadal wydaje się, że nie ma wystarczająco dużo miejsca. Jakie inne pliki można bezpiecznie usunąć? Mój główny system plików nie jest prawie pełny, więc nie martwię się o to.
Strifey16
Zaktualizowałem odpowiedź o kolejne pliki do ręcznego usunięcia. Wydaje mi się, że usunięcie zestawów 3.0.0.13 i 3.0.0.14 (pięć plików do zestawu łącznie z plikiem abi) wystarczyłoby.
John S Gruber,
2
To naprawiło to. Uświadomiłem sobie, że prawdopodobnie sprowadziłoby się to do ręcznego usuwania plików, ale zawsze waham się, aby to zrobić z czymkolwiek zainstalowanym przez apt, więc pomyślałem, że zapytam tutaj pierwszy.
Strifey16,
9
Nie używaj sudo rmdo usuwania z / boot. Zamiast tego użyj, sudo dpkg --purgeaby usunąć stary pakiet obrazu linux. Następnie użyj, sudo apt-get -f installaby naprawić zepsutą zależność.
jarno
4
Chociaż czasami system może być tak pełny, że nawet dpkg nie może działać. Ale wtedy rmmożna go użyć.
jarno
66

W moim przypadku aptpolecenia i dpkgpolecenia nie mogły się zakończyć i nie mogły zostać usunięte. Automatyczna aktualizacja nie powiodła się podczas instalacji 2.6.32-56-server.

Moim pierwszym krokiem było określenie przestrzeni do wykorzystania,

cd /boot
du -sk *|sort -n

Miałem około 30 jąder i plików pomocniczych.

Zrobiłem a, uname -aaby uzyskać działające jądro, zauważyłem, że pracowałem na Linuksie na przemian 2.6.32-43-serveri zrobiłem tar6 z wersji, które nie były uruchomione i były stare.

tar -cvf ~username/boot.tar *2.6.32-44-server *2.6.32-45-server *2.6.32-46-server *2.6.32-47-server *2.6.32-48-server *2.6.32-49-server

Następnie zrobiłem jedną rm -rfz kopii zapasowej:

rm -rf *2.6.32-44-server *2.6.32-45-server *2.6.32-46-server *2.6.32-47-server *2.6.32-48-server *2.6.32-49-server

Pokazuję te polecenia jako przykłady, musisz zdecydować, z czym będziesz pracować w swojej sytuacji.

Teraz, gdy miałem trochę miejsca /boot, mogłem biegać

apt-get -f install 

Aby usunąć nieudaną instalację 2.6.32-56-server.

Potem zrobiłem

apt-get remove linux-headers-2.6.32-38 linux-headers-2.6.32-38-server linux-image-2.6.32-38-server
apt-get remove linux-headers-2.6.32-39 linux-headers-2.6.32-39-server linux-image-2.6.32-39-server

To dało mi miejsce na odłożenie tego, co utworzyłem kopię zapasową.

tar -xf ~username/boot.tar
rm  ~username/boot.tar    

Aby posprzątać, mógłbym uruchomić:

apt-get autoremove

Zrestartowałem się i teraz używam 4% /boot.

AG Russell
źródło
To było dla mnie najbardziej pomocne spośród wszystkich sugestii. Dziękuję Ci bardzo!
Joshua F. Rountree
usuwanie plików z / boot po prostu strasznie psuje apt i dpkg, ponieważ ich skrypty instalacyjne i usuwające zawiodą HARD, gdy brakuje plików. Nie rozumiem, jak to działa.
FizxMike,
20

Możesz użyć dpkgzamiast apt-getusunąć starsze jądra:

sudo dpkg -r linux-image-3.2.0-29-generic
psusi
źródło
Być może są plusy za korzystanie z tego, ale sugestia @ mreiter zadziałała dla mnie, gdy ta nie zadziałała (ta została zasugerowana na kanale wsparcia IRC ubuntu.)
Aaron Hall
3
@AaronHall Ta odpowiedź zawiera po prostu kluczową część odpowiedzi mreitera (ostatni wiersz) i jest znacznie krótsza, ponieważ nie obejmuje czyszczenia nagłówków (co nie pomaga w przypadku oddzielnej /bootpartycji).
Melebius
9

Zauważyłem, że w katalogu rozruchowym nadal są pliki starych wersji:

$ ls /boot
vmcoreinfo-2.6.31-17-server

Menedżer pakietów wyświetli stare wersje:

dpkg -l | grep linux-image

Dlatego użyłem tego polecenia ( autoremoveusunęłbym również nowsze obrazy, których nie chcę usuwać)

sudo apt-get purge linux-image-2.6.31-17-server

Pozostało mi jeszcze kilka nagłówków:

dpkg -l | grep linux-headers

Więc zrobiłem to:

sudo apt-get purge linux-headers-2.6.32-34

W końcu została jedna paczka, której nie mogłem usunąć przy pomocy apt-get purge:

$ dpkg -l | grep linux-image
rc  linux-image-2.6.28-11-server

Źródło: Usuń pakiet oznaczony jako rc przez dpkg

sudo dpkg --purge linux-image-2.6.28-11-server
mreiter
źródło
3

Sprawdź użycie /var/tmpz du -sh /var/tmp/. Wszystkie pliki w tym folderze można usunąć, aby zwolnić miejsce.

Następnie możesz uruchomić następujące polecenie, aby usunąć stare jądra:

sudo apt-get clean
sudo apt install byobu
sudo purge-old-kernels
sudo apt autoremove
sudo update-grub
Tertius
źródło
Co /var/tmpma wspólnego ze starymi jądrami? I nie zawsze jest bezpiecznie usunąć wszystko w /var/tmp...
fosslinux
3

Właśnie tego użyłem:

sudo apt-get autoremove linux-image-xxxx

Zrób to dla wszystkich starych jąder i zachowaj tylko dwa ostatnie.

Jeśli chcesz automatycznie usunąć stare jądra i zaktualizować GRUB, zobacz to: Dokumentacja Ubuntu

Samer
źródło
2
To powinna być zaakceptowana odpowiedź. Jeśli nie masz nic przeciwko czyszczeniu wszystkiego, nie musisz nawet określać obrazu systemu Linux.
CyberEd,
2

Odkryłem, że jedyną rzeczą, która działała dla mnie, było używanie Aptitude.

sudo aptitude

Potem, kiedy się otworzy, zwykle mówi coś o niezaspokojonych zależnościach na dole. Możesz nacisnąć literę, gaby kontynuować sugerowane usunięcie. Zabierze Cię na stronę, na której znajduje się lista wydarzeń.

Obok -zepsutych jąder powinien znajdować się minus . Naciśnij gponownie, aby usunąć uszkodzone jądra. Naciśnij, qaby wyjść. Następnie powinieneś być w stanie użyć, sudo apt-get autoremoveaby pozbyć się starych jąder i zwolnić miejsce.

Matthew Swanson
źródło
1
to jest jedyna poprawna odpowiedź. wszystkie inne odpowiedzi nie zadziałały, ponieważ menedżer pakietów chciał zainstalować pakiet, zanim będzie mógł cokolwiek usunąć.
machineaddict
2

Państwo nie może działać na pakietach, ale może działać na innych plików. Najpierw przejrzyj folder domowy i sprawdź, czy możesz coś usunąć. Jeśli nie, spróbuj przenieść dużą liczbę plików na inną partycję (lub dysk flash), a następnie spróbuj sudo apt-get install -frozwiązać problemy z zależnościami pakietu (najprawdopodobniej zainstalowałeś plik .deb dpkg), a następnie wyczyść wszystkie stare jądra. Gdy już będziesz mieć co najmniej 10 MB, spróbuj usunąć niepotrzebne oprogramowanie lub pliki.

ζ--
źródło
5
Folder domowy nie znajduje się w katalogu / boot
Thorbjørn Ravn Andersen
1

Użyj Menedżera pakietów Synaptic. Po prostu wybierz pakiet, który chcesz usunąć, a wyświetli się monit o usunięcie pakietów, które od niego zależą. Z mojego doświadczenia wynika, że ​​pakiety jądra zawsze występują w grupach po dwie (lub więcej, w zależności od tego, jak się liczy), które są od siebie zależne. Zwykle można szybko znaleźć stare, używając filtra „lokalne / przestarzałe”.

Wegko
źródło
2
Na przykład na serwerze (tylko tekstowym) nie ma Synaptic. Tak naprawdę nie jest realnym rozwiązaniem dla serwerów.
nerdoc
1

Od czasu do czasu walczę z tym problemem i wciąż nie widziałem żadnego rozwiązania, które faktycznie wykonałoby całą robotę. W niektórych przypadkach usuwanie starych jąder kończy się na zależnościach, które powstrzymują mnie przed usunięciem czegokolwiek i musiałem ręcznie usunąć jądra z / boot. Jednak nadal chciałem wykonać całą robotę, ponieważ wyobrażam sobie, że ręcznie usunięte jądra są gdzieś logowane i mogą powodować przyszłe problemy, gdy coś zgłasza brakujące pliki, ponieważ siedzę i robię rm -rf na plikach.

Napisałem więc ten skrypt, oparty na wielu wyszukiwarkach Google, które nie wymagają dalszej instalacji czegoś. Skrypt został kilkakrotnie zmodyfikowany, aby obsługiwał moje własne „nieoczekiwane” sytuacje. Na przykład, uruchamiając to na Raspberry Pi, aktualizacja-grub prawdopodobnie nie istnieje. W niektórych przypadkach, gdy uruchomiono ostatnie aktualizacje, serwery utknęły z IPv6, gdzie niektóre witryny były nieosiągalne.

Skrypt dowiaduje się, czy musi siłą usuwać jądra całkowicie zablokowane z powodu kompilacji zależności, a także czy może to zrobić „we właściwy” sposób.

#!/bin/bash

ipv4="-o Acquire::ForceIPv4=true"

if [ "$1" = "4" ] ; then
    withip=$ipv4
    echo "Going IPv4 ($withip)"
fi

echo "Autoremove+Purge."
apt-get $withip -y -f autoremove --purge >/dev/null 2>&1

if [ "$?" != "0" ] ; then
    echo "Auto Removal Failed!"
fi

echo "Old dependency fix."
apt-get $withip -f -y install >/dev/null 2>&1

if [ "$?" != "0" ] ; then
    echo "That failed. So we'll try to make up to it during this process."
fi

echo "Now, going old kernel cleanup!"
kern=$(dpkg --list 'linux-image*'|awk '{ if ($1=="ii") print $2}'|grep -v `uname -r`)
hadErrors=0

for k in $kern
do
    echo apt-get -y purge $k
    apt-get $withip -y purge $k >/dev/null 2>&1

    if [ "$?" != "0" ] ; then
        echo "Failed apt-purge... Using plan B (--force-all -P)..."
        dpkg --force-all -P $k >/dev/null 2>&1
        echo "Rerunning stuff (apt-get -f -y install) for dependencies..."
        apt-get $withip -f -y install >/dev/null 2>&1
        if [ "$?" != "0" ] ; then
            echo "Still failing..."
            hadErrors=1
        fi
    fi
done

if [ "$hadErrors" = "1" ] ; then
    echo "I had errors. I should rerun this process, to see if there are more kernels that were left out after cleanup..."
    /usr/local/tornevall/cleankernel
fi

apt-get $withip autoremove
apt-get $withip update
apt-get $withip upgrade
apt-get $withip dist-upgrade

grb=$(which update-grub)
if [ "" != "$grb" ] ; then
    update-grub
else
    echo "Can't upgrade grub since update-grub is missing..."
fi
Tomas Tornevall
źródło
Czy próbowałeś Linux-purge ? Jednak obecnie nie ma tej funkcji Force IPv4.
jarno
Twój skrypt wyczyściłby linux-image-generic w moim systemie, co jest złe.
jarno
Z jakiegoś powodu są one przywracane po wyczyszczeniu starych jąder. Przynajmniej tak się stało, odkąd zbudowałem ten skrypt. Jednak ten skrypt jest czymś, czego używam, gdy nie ma innych opcji, aby przejść dalej. Zwykle aktualizacje same sobie z tym radzą, ale jeśli chodzi o ten moment, kiedy nic innego nie działa, może to być dobra opcja, ponieważ zwykle pojawia się więcej jąder, które zostaną skonfigurowane po czyszczeniu. Jeśli to dobre lub złe jest prawdopodobnie dyskusyjne.
Tomas Tornevall
0

Po prostu uruchomienie sudo apt-get -f autoremoverozwiązało mój problem.

forzagreen
źródło
2
Czy masz 100% wykorzystania miejsca na dysku / rozruchu?
fosslinux
Patrząc na moją historię monitorowania, nie wyglądało na to. PS: Jestem na Vagrant Xenial, a mój system plików rozruchowych /dev/sda1jest zamontowany/
forzagreen
0

Uruchomić to:

sudo apt-get autoremove
sudo apt-get --purge remove && sudo apt-get autoclean
sudo apt-get -f install
sudo dpkg-reconfigure -a

Źródło: Otrzymuję ten błąd po aktualizacji. proszę pomóż

Ardi Nusawan
źródło
co robi sudo dpkg-rekonfiguruj -a to? Na Ubuntu 16 mówi nieznana opcja -a
Shivam Kotwalia,
W przypadku tego pytania aptnie uda się usunąć pakietów jądra, ponieważ sam proces usuwania generuje pliki /boot, które są już pełne. Właśnie dlatego apt-get autoremovezawodzi. Pytanie, którego szukasz, to askubuntu.com/q/142926/158442 , które już ma na autoremoveliście.
muru
@muru Właśnie opublikowałem, bo to załatwiło sprawę, dla mnie: D
Ardi Nusawan
Jestem pewien, że tak, mówię o tym, że twoim problemem byłoby inne pytanie, a nie to.
muru
@muru oh ok rozumiem: D
Ardi Nusawan
0

Widziałem kilka artykułów na temat / bootowania, które nie zostały rozwiązane przez dpkg usuwające stare jądra Linuksa, ponieważ apt-get -f install lub apt-get -f autorov e ponownie instaluje jądra.

W moim przypadku przynajmniej podpisane i dodatkowe pakiety również musiały zostać usunięte - jądra były zależnościami dla tych pakietów, więc je ponownie zainstalowałem. Ogólnie rzecz biorąc, powiązane pakiety jądra powinny zostać usunięte przed wywołaniem „install”. Jeśli próbujesz apt-get upgrade zaraz po wyczyszczeniu, komunikat o błędzie powinien powiedzieć, które pakiety mają niezaspokojoną zależność od jądra, które właśnie wyczyściłeś.

W moim przypadku zadziałała następująca taktyka:

#as sudo, repeat 1-3 for any old kernels; can be scripted
dpkg --force-all -P linux-image-4.4.0-112-generic 
dpkg --purge linux-image-extra-4.4.0-112-generic
dpkg --purge linux-signed-image-4.4.0-112-generic
apt-get -f install #dependency resolution didn't have work to do for kernel packages
apt-get autoremove --purge -f 
apt-get autoclean
apt-get upgrade
Rhandi Martin
źródło
0

Zainstalować linux-oczyszczający narzędzia takie jak ten .

Następnie uruchom w terminalu:

sudo linux-purge --clear-boot --fix

Następnie usuwaj jądra, np

sudo linux-purge --keep 1 --choose

Dodatkowy:

Jeśli chcesz użyć linux-purge do nienadzorowanego usuwania jądra zamiast do tego celu używać nienadzorowanych aktualizacji, powinieneś wyłączyć usuwanie nieużywanych rzeczy przez edycję /etc/apt/apt.conf.d/50unattended-upgrades i skonfiguruj usługę systemd wykonywanie

/usr/local/bin/linux-purge --auto-only --keep 1 --yes

kiedykolwiek chcesz.

jarno
źródło