Мой / загрузочный раздел достиг 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).

Как я могу освободить или расширить загрузку, не испортив мою установку?

Strifey16
источник
Я думаю, что ответ @ mreiter может быть лучшим: он использует менеджер пакетов, и он работал, когда другие команды менеджера пакетов не сработали, по крайней мере для меня: askubuntu.com/a/205776/247661
Аарон Холл
1
@dskrvk Да! Почему Remove-Unused-Dependenciesне по умолчанию?
Стивен Р. Лумис

Ответы:

130

Освобождение места в корневой файловой системе

Чтобы освободить место в корневой файловой системе, вы можете попробовать выполнить 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, выполните очистку с помощью apt-get, чтобы удалить пакеты, соответствующие удаленным файлам, чтобы все совпадало.


Файл конфигурации в /bootявляется конфигурацией ядра, которая использовалась командой ядра для сборки ядра с тем же именем. Удалять его безвредно, если только вы не хотите использовать его для справки или для создания собственных ядер.

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

Джон С. Грубер
источник
Я попытался удалить почти все конфиги. Кажется, там все еще не хватает места. Какие еще файлы там можно безопасно удалить? Моя корневая файловая система почти не заполнена, поэтому я не беспокоюсь об этом.
Strifey16
Я обновил свой ответ дополнительными файлами, которые нужно удалить вручную. Мне кажется, что достаточно удалить наборы 3.0.0.13 и 3.0.0.14 (пять файлов в набор, включая файл abi).
Джон С. Грубер
2
Это исправило это. Я понял, что, вероятно, все сводится к удалению файлов вручную, но я всегда не решаюсь делать это с чем-либо, установленным apt, поэтому я решил сначала спросить здесь.
Strifey16
9
Не используйте sudo rmдля удаления из / boot. Вместо этого используйте sudo dpkg --purgeдля удаления некоторый старый пакет linux-image. После этого используйте, sudo apt-get -f installчтобы исправить нарушенную зависимость.
Ярно
4
Хотя иногда система может быть настолько полной, что даже dpkg не может работать. Но rmможет быть использовано тогда.
Ярно
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.

AG Рассел
источник
Это было самым полезным для меня из всех предложений. Большое спасибо!
Джошуа Ф. Рантри
удаление файлов из / boot просто ужасно ломает apt и dpkg, поскольку их сценарии установки и удаления терпят неудачу, когда файлы отсутствуют. Я не понимаю, как ты заставил это работать.
FizxMike
20

Вы можете использовать dpkgвместо apt-getудаления старых ядер:

sudo dpkg -r linux-image-3.2.0-29-generic
psusi
источник
Может быть, есть плюсы для использования этого, но предложение @ mreiter сработало для меня, когда это не сработало (это было предложено на канале поддержки IRC ubuntu.)
Аарон Холл
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 purge:

$ 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
mreiter
источник
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
Tertius
источник
Что /var/tmpобщего со старыми ядрами? И это не всегда безопасно удалить все в /var/tmp...
fosslinux
3

Это то, что я использовал:

sudo apt-get autoremove linux-image-xxxx

Сделайте это для всех старых ядер и оставьте только самые последние два.

Если вы хотите автоматически удалить старые ядра и обновить GRUB, посмотрите это: Документация по Ubuntu

Samer
источник
2
Это должен быть принятый ответ. Если вы не против очистить все, вам даже не нужно указывать образ Linux.
CyberEd
2

Я обнаружил, что единственное, что работает для меня, это использование Aptitude.

sudo aptitude

Затем, когда он открывается, он обычно говорит что-то о неудовлетворенных зависимостях внизу. Вы можете нажать на письмо, gчтобы продолжить предложенное удаление. Вы попадете на страницу, где перечислены, что должно произойти.

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

Мэтью Свонсон
источник
1
Это ЕДИНСТВЕННЫЙ правильный ответ. все остальные ответы не сработали, так как менеджер пакетов хотел установить пакет до того, как он сможет что-либо удалить.
Machineaddict
2

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

ζ--
источник
5
Домашняя папка не находится в / boot
Thorbjørn Ravn Andersen
1

Используйте Synaptic Package Manager. Просто выберите пакет, который вы хотите удалить, и он предложит вам также удалить пакеты, которые зависят от него. По моему опыту, пакеты ядра всегда входят в группы из двух (или более, в зависимости от того, как вы считаете) взаимозависимых. Обычно вы можете быстро найти старые, используя фильтр «локальный / устаревший».

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

Я боролся с этой проблемой время от времени, и все еще не видел никакого решения, которое фактически делает всю работу. В некоторых случаях удаление старых ядер заканчивается зависимостями, которые мешают мне удалить что-либо, и мне пришлось вручную удалять ядра из / boot. Тем не менее, я все же хотел, чтобы apt выполнил всю работу, так как я представляю, что удаленные вручную ядра где-то записываются в журнал и могут вызвать будущие проблемы, когда что-то сообщит об отсутствии файлов из-за того, что я выполняю команду rm -rf для файлов.

Поэтому я написал этот сценарий, основанный на многих предложениях по поиску в Google, которые не требуют дальнейшей установки чего-либо. Сценарий несколько раз модифицировался для поддержки некоторых моих «неожиданных» ситуаций. Например, если запустить его на Raspberry Pi, 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-purge ? Однако в настоящее время у него нет такого Force IPv4.
Ярно
Ваш скрипт удалит linux-image-generic в моей системе, что плохо.
Ярно
По какой-то причине они возвращаются после очистки старых ядер. По крайней мере, так было с тех пор, как я создал этот скрипт. Тем не менее, этот сценарий я использую, когда нет других вариантов для продолжения. Обычно обновления сами об этом заботятся, но когда дело доходит до этого момента, когда больше ничего не работает, это может быть хорошим вариантом, так как обычно приходит больше ядер, которые будут настроены после очистки. Если это хорошо или плохо, вероятно, обсуждается.
Томас Торневалл
0

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

forzagreen
источник
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-переконфигурировать -a? На Ubuntu 16 он говорит, что неизвестный вариант -a
Шивам Котвалия
По этому вопросу aptне удастся удалить пакеты ядра, поскольку сам процесс удаления генерирует файлы /boot, которые уже заполнены. Вот почему apt-get autoremoveне удается. Вопрос, который вы ищете, это askubuntu.com/q/142926/158442 , который уже есть autoremove, в списке.
Муру
@muru Я только что опубликовал это, потому что это
помогло
Я уверен, что это так, я говорю о том, что вашей проблемой был бы другой вопрос, а не этот.
Муру
@ Муру, о, хорошо, понял: D
Арди Нусаван
0

Я видел пару статей о том, что / boot переполнен, но это не решается удалением dpkg старых ядер Linux, потому что apt-get -f install или apt-get -f autoremov e переустанавливает ядра.

В моем случае, по крайней мере, подписанные и дополнительные пакеты также необходимо было удалить - ядра были зависимостями для этих пакетов, поэтому их можно было переустановить. Как правило, соответствующие пакеты ядра должны быть очищены перед вызовом 'install'. Если вы попытались выполнить apt-get upgrade сразу после очистки, в сообщении об ошибке должно было быть указано, какие пакеты имеют неудовлетворенную зависимость от ядра, которое вы только что очистили.

В моем случае сработала следующая тактика:

#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-purge для автоматического удаления ядра вместо использования автоматических обновлений для этого, вы должны отключить удаление неиспользуемых вещей, отредактировав /etc/apt/apt.conf.d/50unattended-upgrades, и настроить службу systemd. проведение

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

когда угодно.

Ярно
источник