Мій / завантажувальний розділ досяг 100%, і тепер я не можу оновити. Неможливо видалити старі ядра, щоб звільнити місце


154

Перше моє питання було, коли я намагався apt-get updateабо apt-get upgrade. Під час оновлення я отримую таку помилку:

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.

Я спробував запустити apt-get install -f, і це було результатом (після того, як сказали "так" у запиті)

(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)

Я спробував запустити, apt-get autoremoveі це дає мені таку ж помилку, як і apt-get upgrade.

Коли я бігаю df, я отримую це для /boot:

/dev/sda1                    233191     230297         0 100% /boot

Отже, я читав в інших місцях, що мені слід спробувати очистити старі ядра. Я перевірив, які ядра у мене були:

$ 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

Коли я намагаюся видалити найстаріший за допомогою цього:

$ 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).

Як я можу звільнити або продовжити завантаження, не псуючи свою установку?


Я думаю, що відповідь @ mreiter може бути найкращою: він використовує диспетчер пакунків, і він працював, коли інші команди менеджера пакунків вийшли з
Aaron Hall


1
@dskrvk Так! Чому це Remove-Unused-Dependenciesне за замовчуванням?
Стівен Р. Луміс

Відповіді:


129

Звільнення місця в кореневій файловій системі

Щоб звільнити місце в кореневій файловій системі, ви можете спробувати виконати apt-get clean.

Якщо це не спрацює, ви можете перейти /var/cache/apt/archivesвручну і видалити кілька файлів з кешу, щоб отримати трохи місця, наприклад:

sudo rm linux-headers-*

Видалити всі .debфайли тут, якщо вам потрібно, не завадить - ось що і apt-get cleanробиться. Вони будуть автоматично завантажені, aptякщо вони знову знадобляться.

Звільнення місця у файловій системі / boot

Оригінальний плакат має окремий /bootрозділ, і це те, що повно і перешкоджає роботі aptсистеми. Йому потрібно буде звільнити місце там.

Якщо майже достатньо місця, перейдіть до /bootта видаліть файл конфігурації чи два:

sudo rm config-3.2.0-19-generic-pae

наприклад, але використовуючи ім'я однієї з версій ядра, яку ви хочете все-таки видалити. Це звільнить трохи місця (близько 144K за штуку).

Якщо вам потрібно більше місця по окремо видалити старі vmlinuz, initrd, abiі System.mapфайли , поки ви не маєте достатньо місця (близько 22М для одного з моїх i386 версій ядра).

Що б ви не робили, не знімайте їх усіх . Ви повинні принаймні зберігати дві останні версії кожного типу файлів для кожного типу ядра, яке ви використовуєте.

Потім перейдіть до своїх команд apt-get install. Як згадувалося вище, можливо, доведеться повторно завантажити деякі видалені вами дебати, але в такому випадку це станеться автоматично. Коли у вас знову вдається працювати, очистіть програму apt-get, щоб видалити пакунки, відповідні файлам, які ви видалили - так, що все відповідає.


Конфігураційний файл у /boot- це конфігурація ядра, яка використовувалася командою ядра для побудови однойменного ядра. Видаляти його слід нешкідливо, якщо ви не хочете його для довідки чи допомогти вам у створенні власних ядер.

Нарешті ви вручну видаляєте старий пакет ядра або два з /bootрозділу, щоб зробити ще більше місця для нового.


Я спробував видалити майже всі конфігурації. Здається, все ще не вистачає місця. Які ще файли там можна було б безпечно видалити? Моя коренева файлова система майже ніде не є повною, тому я про це не переживаю.
Strifey16

Я оновив свою відповідь подальшими файлами, які потрібно видалити вручну. Мені здається, що для видалення наборів 3.0.0.13 і 3.0.0.14 (п'ять файлів до набору, включаючи файл abi) було б достатньо.
John S Gruber

2
Це і виправило. Я зрозумів, що це, ймовірно, зведеться до видалення файлів вручну, але я завжди вагаюся зробити це з будь-яким інстальованим apt, тому я подумав, що спочатку запитаю тут.
Strifey16

9
Не використовуйте sudo rmдля видалення з / завантаження. Замість цього використовуйте sudo dpkg --purgeдля видалення старого пакету зображень Linux. Після цього використовуйте sudo apt-get -f installдля виправлення порушеної залежності.
jarno

4
Хоча колись система може бути настільки повною, що навіть dpkg не може працювати. Але rmможна використовувати тоді.
jarno

66

У моєму випадку aptкоманди та dpkgкоманди не змогли закінчити та не змогли видалити. Не вдалося встановити оновлення 2.6.32-56-server.

Першим моїм кроком було визначення місця, яке буде використано,

cd /boot
du -sk *|sort -n

У мене було близько 30 ядер і підтримуючих файлів.

Я зробив uname -aдля отримання ядра, що працює, я виявив, що перебуваю на Linux альтернативно, 2.6.32-43-serverі зробив tar6 версій, які не працювали і були старими.

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

Потім rm -rfя зробив резервне копіювання:

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

Я показую ці команди як приклади, вам доведеться вирішити, з чим будете працювати у своїй ситуації.

Тепер, коли у мене було трохи місця /boot, я зміг бігти

apt-get -f install 

Для очищення не вдалося встановити 2.6.32-56-server.

Я тоді зробив а

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

Це дало мені можливість повернути те, що я створив резервну копію.

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

Щоб очистити, я тоді міг запустити:

apt-get autoremove

Я перезавантажився і зараз перейшов на використання 4% /boot.


Це було для мене найбільш корисним із усіх пропозицій. Дуже дякую!
Джошуа Ф. Ріндрі

видалення файлів з / завантаження просто жахливо порушує apt та dpkg, оскільки їхні сценарії встановлення та видалення не спрацьовують HARD, коли файли відсутні. Я не бачу, як у вас це вийшло.
FizxMike

20

Ви можете використовувати dpkgзамість того, apt-getщоб видалити старіші ядра:

sudo dpkg -r linux-image-3.2.0-29-generic

Можливо, є плюси для використання цього, але пропозиція @ mreiter працювала для мене, коли цього не було (це було запропоновано на IRC-каналі підтримки ubuntu.)
Aaron Hall

3
@AaronHall Ця відповідь просто містить ключову частину відповіді mreiter (останній рядок) і набагато коротша, оскільки не охоплює очищення заголовків (що не допомагає у випадку окремого /bootрозділу).
Мелебій

9

Я помітив, що в завантажувальному каталозі ще є деякі файли старих версій:

$ ls /boot
vmcoreinfo-2.6.31-17-server

І менеджер пакунків перелічив би старі версії:

dpkg -l | grep linux-image

Тому я використав цю команду ( autoremoveтакож видалить новіші зображення, які я не хочу видаляти)

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

У мене залишилося кілька заголовків:

dpkg -l | grep linux-headers

Тому я зробив це:

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

Нарешті залишився один пакет, який я не зміг видалити за допомогою очищення apt-get:

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

Джерело: Видаліть пакет, позначений як rc dpkg

sudo dpkg --purge linux-image-2.6.28-11-server

3

Перевірте використання /var/tmpс du -sh /var/tmp/. Усі файли в цій папці можна видалити, щоб звільнити місце.

Потім можна виконати наступне, щоб видалити старі ядра:

sudo apt-get clean
sudo apt install byobu
sudo purge-old-kernels
sudo apt autoremove
sudo update-grub

Що стосується /var/tmpстарих ядер? І це не завжди безпечно видалити все в /var/tmp...
fosslinux

3

Це те, що я використав:

sudo apt-get autoremove linux-image-xxxx

Зробіть це для всіх старих ядер і збережіть лише останні два.

Якщо ви хочете автоматично видалити старі ядра та оновити GRUB, перегляньте це: Документація на Ubuntu


2
Це має бути прийнятою відповіддю. Якщо ви не проти все прибирати, вам навіть не потрібно вказувати образ Linux.
CyberEd

2

Я виявив, що єдине, що працювало на мене, - це використання Aptitude.

sudo aptitude

Тоді, коли він відкриється, він зазвичай скаже про невиконані залежності на дні. Ви можете натиснути на лист, gщоб продовжити запропоноване видалення. Він перенесе вас на сторінку, де перелічено, що буде.

Поруч -із зламаними ядрами має бути мінус . Натисніть gще раз, і це видалить зламані ядра. Натисніть, qщоб вийти. Тоді ви повинні мати можливість sudo apt-get autoremoveпозбутися від старих ядер та звільнити місце.


1
це ТІЛЬКИ правильна відповідь. всі інші відповіді не спрацювали, оскільки менеджер пакунків хотів встановити пакет, перш ніж він міг щось видалити.
машинобудівний вирок

2

Ви не можете діяти над пакетами, але ви можете діяти на інші файли. Спочатку перегляньте домашню папку і подивіться, чи можна щось видалити. Якщо ні, спробуйте перенести хорошу кількість файлів на інший розділ (або флешку), а потім спробуйте sudo apt-get install -fочистити проблеми залежності пакунків (швидше за все, ви встановили файл .deb через dpkg), а потім очистіть будь-які старі ядра. Як тільки у вас надійно є щонайменше 10 Мб, спробуйте очистити непотрібне програмне забезпечення або файли.


5
Домашня папка не входить / завантажується
Thorbjørn Ravn Andersen

1

Використовуйте Synaptic Package Manager. Просто виберіть пакет, який ви хочете видалити, і він запропонує вам також видалити пакунки, які залежать від нього. На мій досвід, пакунки ядра завжди складаються з двох груп (або більше, залежно від того, як ви рахуєте), які взаємозалежні. Зазвичай ви можете швидко знайти старі за допомогою фільтра "локальний / застарілий".


2
Наприклад, на (лише текстовому) сервері немає Synaptic. Тож насправді не є життєздатним рішенням для серверів.
nerdoc

1

Я час від часу боровся з цим питанням, і досі не бачив жодного рішення, яке б справді працювало повною мірою. У деяких випадках видалення старих ядер закінчується залежностями, що не дозволяє мені нічого видаляти, і я повинен був видалити ядра вручну з / завантаження. Однак я все-таки хотів, щоб уміла виконати повну роботу, як уявляю, що видалені вручну ядра десь заносяться і можуть спричинити майбутні проблеми, коли щось повідомляє про файли, через те, що я сиджу, роблячи rm -rf у файлах.

Тому я написав цей сценарій, заснований на багатьох пропозиціях Google, які не потребують додаткової установки чогось. Сценарій кілька разів був модифікований, щоб підтримати деякі мої власні "несподівані" ситуації. Наприклад, запустивши це на малиновому пі, update-grub, ймовірно, не існує. І в деяких випадках під час запуску останніх оновлень сервери застрягли з IPv6, де деякі сайти були недоступні.

Сценарій визначає, чи потрібно примусово видаляти ядра, які повністю застрягли через збірки залежностей, від того, чи може це зробити "правильним" способом.

#!/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

Ви спробували linux-чистку ? Наразі ця річ Force IPv4 не має.
jarno

Ваш сценарій очистив би linux-image-generic у моїй системі, що погано.
jarno

Вони чомусь ставляться назад, коли старі ядра очищені. Принаймні це стосується мене з тих пір, як я створив цей сценарій. Однак цей сценарій - це те, що я використовую, коли немає інших варіантів для подальшого руху. Зазвичай оновлення опікуються цим самим, але коли справа доходить до цього моменту, коли нічого іншого не працює, це може бути хорошим варіантом, оскільки зазвичай приходить більше ядер, які будуть встановлені після очищення. Якщо це добре чи погано, мабуть, обговорюється.
Томаш Торневаль

0

Просто біг sudo apt-get -f autoremoveвирішив мою проблему.


2
Чи було у вас 100% використання дискового простору / завантаження?
fosslinux

Дивлячись на мою історію моніторингу, це не здавалося. PS: Я перебуваю на Vagrant xenial, і моя файлова система завантаження /dev/sda1встановлена ​​на/
forzagreen

0

Виконати це:

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

Джерело: Я отримую цю помилку після посягань. будь ласка, допоможіть


що робить sudo dpkg-перенастроювання -це це робить? У Ubuntu 16 написано невідомий варіант -a
Шивам Котвалія

У цьому питанні aptне вдасться видалити пакети ядра, оскільки сам процес видалення генерує файли /boot, які вже заповнені. Ось чому apt-get autoremoveне вдається. Питання, яке ви шукаєте, - це перелік askubuntu.com/q/142926/158442 , який вже є autoremove.
муру

@muru Я щойно опублікував це, оскільки це зробило трюк для мене: D
Арді Нусаван

Я впевнений, що так і було, я говорю, що ваша проблема була б іншим питанням, а не цим.
муру

@muru oh ok зрозумів: D
Арді Нусаван

0

Я бачив, як кілька статей про / boot заповнені, які не вирішуються dpkg очищенням старих Linux-ядер, тому що apt-get -f install або apt-get -f autoremov e перевстановлює ядра.

У моєму випадку, принаймні, підписані та додаткові пакети також потрібно було видалити - ядра були залежними для цих пакетів, тому вдало перевстановив їх. Як правило, пов'язані пакети ядра слід очистити перед викликом "встановити". Якщо ви спробували apt-отримати оновлення одразу після очищення, повідомлення про помилку повинно було б сказати, які пакунки мали незадовільну залежність ядра, яке ви тільки що очистили.

У моєму випадку працювала наступна тактика:

#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

0

Установка Linux-продувочний інструмент , як це .

Потім запустіть у терміналі:

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

Потім перейдіть до видалення ядер, наприклад,

sudo linux-purge --keep 1 --choose

Додатково:

Якщо ви хочете використовувати Linux-чистку для видалення без нагляду ядра замість того, щоб використовувати для цього без нагляду оновлення, слід вимкнути видалення невикористаних речей шляхом редагування /etc/apt/apt.conf.d/50unattended-upgrades та налаштувати службу systemd виконання

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

коли ти захочеш.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.