Невозможно удалить старые ядра (проблемы с зависимостями), но в /boot нет места

Невозможно удалить старые ядра (проблемы с зависимостями), но в /boot нет места

Я использую Ubuntu 14.04.4 LTS и пытаюсь установить новый пакет с помощью apt-get. К сожалению, всякий раз, когда я пытаюсь, я получаю сообщения вроде:

The following packages have unmet dependencies:
 linux-image-extra-3.16.0-70-generic : Depends: linux-image-3.16.0-70-generic but it is not going to be installed
 linux-image-generic-lts-utopic : Depends: linux-image-3.16.0-70-generic but it is not going to be installed
 linux-signed-image-3.16.0-70-generic : Depends: linux-image-3.16.0-70-generic (= 3.16.0-70.90~14.04.1) but it is not going to be installed

Погуглив, я обнаружил, чтоэто может быть вызвано нехваткой места на загрузочном разделе(и, конечно же, dfпоказывает /boot100%). Однако всякий раз, когда я пытаюсь запустить apt-getкоманды в принятом ответе, я получаю те же ошибки, что и выше.

В поисках другого решения, которое не использовалось apt-get, я наткнулсяэта почта, который рекомендует использовать такие вещи, как sudo dpkg --purge linux-image-4.2.0-15-genericна старых, неиспользуемых ядрах.

dpkg -l | tail -n +6 | grep -E 'linux-image-[0-9]+' | grep -Fv $(uname -r)(из вышеупомянутого поста) показывает, что у меня есть несколько старых ядер в piсостоянии (желательно очищено, состояние установлено согласноэтот)

uname -rговорит мне, что я использую ядро ​​3.16.0-62-generic, поэтому я подумал, что мне следует безопасно удалить эти старые ядра. Однако попытка сделать это с такими вещами sudo dpkg --purge linux-image-3.16.0-49-genericприводит к:

dpkg: error processing package linux-image-3.16.0-49-generic (--purge):
 dependency problems - not removing
Errors were encountered while processing:
 linux-image-3.16.0-49-generic

Гарррг! Я в полном замешательстве и не в своей тарелке (не очень много знаю о dpkg или apt-get), поэтому мне нужна помощь.

Вопросы:

  1. Почему я не могу удалить старые ядра с помощью dpkg?

  2. Если этот вопрос не может быть решен напрямую, то, полагаю, в конечном итоге я хочу знать:Что мне нужно сделать, чтобы снова вернуться в состояние, в котором я смогу устанавливать новые пакеты?


Другие вещи, которые я пробовал:

  • sudo apt-get autoremove: приводит к исходной ошибке о неудовлетворенных зависимостях
  • sudo apt-get -f autoremove: результаты:
Распаковка linux-image-3.16.0-70-generic (3.16.0-70.90~14.04.1) ...
dpkg: ошибка обработки архива /var/cache/apt/archives/linux-image-3.16.0-70-generic_3.16.0-70.90~14.04.1_amd64.deb (--unpack):
 невозможно скопировать извлеченные данные для «./boot/vmlinuz-3.16.0-70-generic» в «/boot/vmlinuz-3.16.0-70-generic.dpkg-new»: не удалось записать (на устройстве не осталось места)
Отчет apport не записан, поскольку сообщение об ошибке указывает на ошибку переполнения диска
                                                                              dpkg-deb: ошибка: подпроцесс вставки был завершен сигналом (сломанный канал)
Проверка /etc/kernel/postrm.d.
run-parts: выполнение /etc/kernel/postrm.d/initramfs-tools 3.16.0-70-generic /boot/vmlinuz-3.16.0-70-generic
run-parts: выполнение /etc/kernel/postrm.d/zz-update-grub 3.16.0-70-generic /boot/vmlinuz-3.16.0-70-generic
При обработке обнаружены ошибки:
 /var/cache/apt/archives/linux-image-3.16.0-70-generic_3.16.0-70.90~14.04.1_amd64.deb
E: Подпроцесс /usr/bin/dpkg вернул код ошибки (1)

Примечание: Я перенес этот вопрос из«Обмен стеками Unix и Linux»

решение1

Используйте uname -rдля отображения текущего работающего ядра. НЕ УДАЛЯЙТЕ ничего с этим номером версии.

Вы можете узнать, к каким пакетам относятся ядра /boot:

for i in /boot/vmlinuz* ; do 
    dpkg -S $i| egrep -v $(uname -r)
done

Вы можете удалить эти пакеты с помощьюsudo apt-get purge имя пакета ....

Вы можете найти больше пакетов, связанных с ядрами, которые необходимо удалить, поискав другие пакеты с тем же номером версии:

Чтобы извлечь номера версий:

for i in /boot/vmlinuz* ; do 
    dpkg -S $i | egrep -v $(uname -r)
done |cut -d- -f3-4  

Чтобы найти другие пакеты с такими же номерами версий:

for j in $(
    for i in /boot/vmlinuz* ; do 
        dpkg -S $i| egrep -v $(uname -r)
    done |cut -d- -f3-4 ) ; 
do 
     dpkg -l "*$j*" | egrep '^ii|^rc'
done  

Чтобы автоматизировать удаление всех ядер, кроме текущего ядра, и всех пакетов, версии которых соответствуют удаленным ядрам (Опасность, Уил Робинсон):

Просто добавьте

| awk '{print $2}' | xargs sudo apt-get --dry-run purge

к предыдущему фрагменту кода. Когда вы уверены, что он делает то, что вам нужно, удалите --dry-run.

Если ваш /bootдиск настолько заполнен, что вы не можете удалить пакеты, вы можете освободить место, /bootудалив самый старый /boot/initrd.img*файл.

Связанный контент