Установленные пакеты имеют неудовлетворенные зависимости, не могут установить новое программное обеспечение [duplicate]

Мой раздел /boot почти заполнен, и я получаю предупреждение каждый раз, когда я перезагружаю свою систему. Я уже удалил старые пакеты ядра (linux-headers ...), на самом деле я сделал это, чтобы установить новую версию ядра, которая поставляется с автоматическими обновлениями.

После установки этой новой версии раздел почти полностью еще раз. Так что еще я могу удалить? Есть ли другие файлы, связанные со старыми изображениями ядра?

Вот список файлов, которые находятся на моем разделе /boot:

:~$ 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

В настоящее время я использую ядро 3.0.0-14-generic.

532
задан 13 February 2018 в 00:16

40 ответов

Synaptic Package Manager может использоваться для простого выбора и удаления старых изображений ядра.

Если вы еще не установили Synaptic:

sudo apt-get install synaptic

Запустите приложение и выберите указанные параметры.

Вы должны быть в состоянии выделить все «linux-» с версией «2.6.x», где x находится между 31 и 38 в соответствии с файлами в папке / boot.

Щелкните правой кнопкой мыши каждый из этих пакетов linux и выберите вариант «Отметьте для полного удаления». Наконец нажмите кнопку «Применить». Это приведет к удалению всех файлов и любых связанных файлов. Теперь ваша папка /boot будет немного более аккуратной.

38
ответ дан 24 July 2018 в 20:16
  • 1
    Я на 14.04. Я обработал эту ситуацию в прошлом через командную строку, но сегодня решил попробовать этот метод ... для меня мои изображения Linux были расположены под установленным (ручным), не установленным (локальным или устаревшим) – Ryan 9 July 2016 в 23:32
  • 2
    О нет. Я не могу установить Synaptic, потому что на /boot нет места! – John McGehee 16 September 2016 в 23:14
  • 3
    @JohnMcGehee fsck и parted должны решить эту проблему для вас. – FlipMcF 3 April 2017 в 23:10

Для меня оба apt-get purge и dpkg --remove оба отказались. Поэтому мне пришлось удалить пару старых изображений ядра из / boot с помощью rm -f.

4
ответ дан 24 July 2018 в 20:16
  • 1
    Это не лучший способ удалить пакеты. Хотя этот ответ не очень специфичен в отношении того, почему их удаление было неверным, я уверен, что если бы эта информация была предоставлена ​​(в отдельном вопросе, конечно), мы могли бы попытаться выяснить причину проблемы. – thomasrutter 29 August 2014 в 14:55
  • 2
    Я считаю, что это было неудачно, потому что раздел /boot был заполнен. Эти команды сначала пытаются обновить ядро ​​до последнего и сбой No space left on device при генерации initrd.img – vp_arth 3 December 2015 в 19:50
  • 3
    ПРЕДУПРЕЖДЕНИЕ. Прямое удаление файлов может привести к проблемам, так как обновление пакета linux-firmware может воссоздать файл initrd.img для каждой версии, которая, по его мнению, установлена ​​на основе информации о пакете. Смотрите: askubuntu.com/questions/865577/… – kgrittn 5 January 2017 в 17:57
  • 4
    спасибо, это окончательное решение для спасения жизни, когда ничего не работает. – Jeff Puckett 17 August 2017 в 06:28

Я смог устранить проблему, используя dpkg, чтобы удалить пакеты напрямую. Хотя пакеты все еще перечислены в dpkg -l, файлы удаляются из /boot, освобождая место.

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`

После этого apt-get -f install исправил проблемы с зависимостями, и все было хорошо с мир.

Однако я не буду принимать этот мой ответ, поскольку мне все еще нужно знать, должен ли я увеличивать размер /boot или делать что-то еще.

17
ответ дан 24 July 2018 в 20:16
  • 1
    Вы должны либо не иметь отдельный / загрузочный раздел в первую очередь, либо увеличить размер, так как 100 МБ слишком малы. – psusi 4 December 2011 в 10:07
  • 2
    Спасибо, я удаляю через: sudo dpkg --remove linux-headers-3.5.0-28* – TiloBunt 16 July 2013 в 22:34
  • 3
    и sudo dpkg --remove linux-image-3.5.0-28* для изображения, отмеченного с помощью df -h – TiloBunt 16 July 2013 в 22:57

Вы можете перестать использовать отдельный / загрузочный раздел, тогда у вас не будет такого ограниченного места. Для этого отключите раздел, затем смонтируйте его в другом месте и скопируйте все файлы в каталог / boot в корневом разделе, затем удалите запись из / etc / fstab и повторно установите grub. Например (вам нужно будет использовать правильный раздел):

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

Затем вы можете использовать gparted для удаления старого / загрузочного раздела и, возможно, расширить корневой раздел, чтобы использовать это пространство. Чтобы расширить корневой раздел, вам нужно будет загрузиться из livecd, и свободное пространство должно быть немедленно направо. Если раздел / boot находится в данный момент слева от корневого раздела, вам нужно сначала переместить корневой раздел влево, а затем расширить его, но это может занять очень много времени, поэтому, возможно, не стоит беда.

11
ответ дан 24 July 2018 в 20:16
  • 1
    Перемещение / загрузка моего основного раздела для меня не является решением, так как все, кроме / boot, зашифровано. Вы не могли это знать, из моего вопроса, извините. – user6722 24 December 2011 в 20:15
  • 2
    Это хорошее решение, если вышеприведенные решения не работают из-за отсутствия свободного места на загрузочном томе или если вы повторно используете «вне пространства», вопрос. Сначала прочитайте, почему иногда требуется иметь раздел / boot: ( help.ubuntu.com/community/DiskSpace ) – svandragt 10 July 2014 в 13:26
  • 3
    @svandragt, в принципе, в наши дни нет необходимости в необходимости раздела / boot. О единственном, что осталось, это если ваша биография сломана и не может увидеть весь диск, и любая машина, созданная в последнее десятилетие, не имеет такого ограничения. Другие устаревшие случаи, такие как использование рейда или LVM, теперь корректно обрабатываются grub2. – psusi 11 July 2014 в 06:59
  • 4
    Существует несколько причин наличия отдельного загрузочного раздела. Но я не уверен, что преимущества стоят сложной настройки. 1. ОС может выиграть от более быстрой загрузки через ext2. 2. Безопасность может быть увеличена путем установки / загрузки как RO. (руткиты и т. д.) или даже не размонтированы во время выполнения os. 3. grub (1) имеет (имел) некоторые проблемы с ext4. 4. Требуется для запуска lvm (grubv1). Хотя это не относится к настройке ubuntu по умолчанию. – David Cahill 13 April 2015 в 20:37
  • 5
    lsblk можно использовать для определения того, какой раздел – Mr Purple 9 May 2016 в 12:51

Это новый ответ на старый вопрос, но простой способ очистить эту вещь (и многое другое) - установить Ubuntu Tweak. Чтобы установить его:

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

, вы можете запустить Ubuntu Tweak, перейдя на вкладку «janitor», и отсюда это будет три клика:

Лучше оставить последнее ядро ​​(вы никогда не знаете) или хорошо известное рабочее ядро ​​для безопасности; но это легко настраивается.

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

22
ответ дан 24 July 2018 в 20:16
  • 1
    Я попытался установить Ubuntu, а также перейти на сайт репозитория. Он говорит, что это только для 13.10 и раньше. У вас есть обновленная версия для 15.04? – JayCouture.com 10 May 2015 в 16:57
  • 2
    @ JayCouture.com Версия на сайте - 14.04 («для 13.10 и раньше» - это ссылка на более старые версии). Я игнорирую, если есть версия для 14.10 или 15.04. – Rmano 12 May 2015 в 01:15

Если вы не можете удалить больше неиспользуемых файлов, и если у вас есть другой раздел с / или свободным пространством на одном устройстве, вы можете изменить размер раздела / boot разделенным / gparted. (Это также включено в установочный носитель.)

Предупреждение. Изменение размера раздела опасно, сохраните важные данные на других носителях перед его выполнением!

-1
ответ дан 24 July 2018 в 20:16
  • 1
    Большинство стратегов небольших отдельных / загрузочных разделов выбрали «полное шифрование диска» при установке, что требует LVM. Это решение, похоже, вызовет больше проблем, чем оно решает для этих пользователей. – user535733 2 February 2017 в 18:40

Вот сценарий bash, который я написал ниже, делает процесс более удобным для пользователя.

YMMV - это было сделано для Монетного двора 14. Все еще изучая БАШ, так что это, вероятно, немного неуклюже. Используйте на свой страх и риск, но он работает для меня!

#!/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
ответ дан 24 July 2018 в 20:16
Я уже удалил старые пакеты ядра (linux-headers ...)

linux-headers-* не являются ядрами. Пакеты ядра называются linux-image-*. Те, которые называются linux-headers-*, являются пакетами разработки для компиляции модулей ядра: они не живут в каталоге / boot и не требуются для повседневного использования вашей системы.

Файлы, которые вы указали в / boot включают несколько старых изображений ядра (vmlinuz*) и скомпилированные изображения initrd (initrd.img*) для этих ядер, что свидетельствует о том, что у вас все еще есть много старых пакетов ядра.

You должен иметь возможность перечислять ваши установленные ядра с помощью

aptitude search ~ilinux-image

(обратите внимание, что это, вероятно, также вернет пакеты, которые также не являются ядрами).

Обычно нет необходимости в дополнительных чем два ядра для установки - тот, который в настоящее время используется, и предыдущий к нему (в качестве резервной копии). Таким образом, вы можете начать удаление старых, один за другим, следующим образом:

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

Убедитесь, что вы заменили «3.2.0-23-generic» на версию ядра, которую вы хотите удалить! Кроме того, не удаляйте пакеты, такие как linux-image-generic. Вы должны быть очень осторожны, чтобы не удалять текущее ядро ​​или вы не сможете загрузиться (Ubuntu может или не может вас предупредить об этом).

Вы можете найти свое текущее ядро ​​с :

uname -r
2
ответ дан 24 July 2018 в 20:16

Взяв все лучшее из ответов выше, мой проверенный подход:

uname -a, чтобы найти запущенное ядро. dpkg -l linux-{headers,image}-\* | grep ^ii, чтобы отобразить все установленные в данный момент пакеты, связанные с ядром. Это будет включать запущенное ядро. sudo apt-get purge linux-{image,headers}-3.16.0-{xx,yy,zz}, чтобы удалить старые ядра. Замените xx,yy,zz на список сборок ядра, которые вы хотите удалить, - это все сборки, перечисленные предыдущей командой, которые старше, чем текущее ядро. Убедитесь, что вы не удаляете текущее ядро ​​- ваша система станет не загружаемой. Вам также может потребоваться изменить версию ядра с 3.16.0 на все, что установлено в вашей системе. Необязательно, сделайте дополнительный sudo apt-get autoremove - это устранит любые оставшиеся зависимости старых ядер, которые больше не нужны текущему, освобождая еще некоторое пространство.

У вас могут быть файлы заголовков, не соответствующие установленным версиям ядра, или наоборот - просто включите все эти версии в команду. APT будет жаловаться на то, что некоторые пакеты не могут быть удалены, поскольку они не установлены, но это не повредит.

Если что-то не работает ...

uname -a чтобы найти запущенное ядро. Если команда dpkg все еще не работает, потому что пакеты linux-image требуются пакетами linux-headers той же версии (которую вы также хотите удалить), возможно, dpkg для решения этого. Пересмотрите вывод dpkg -l и укажите суффиксы имени пакета в командной строке. Например, в одной из моих систем команда, которая в конечном итоге работала, была sudo dpkg --purge linux-{image,headers}-3.16.0-{xx,yy,zz}-generic-pae. dpkg -l linux-{headers,image}-\* | grep ^ii, чтобы перечислить все установленные в данный момент пакеты, связанные с ядром. Это будет включать запущенное ядро.
4
ответ дан 24 July 2018 в 20:16
  • 1
    @ user535733 обычный случай (по крайней мере, тот, который я продолжаю работать) состоит в том, что на /boot все еще некоторое место просто недостаточно для другого пакета ядра. В этих случаях это хорошо работает. Не стесняйтесь, однако, добавить соответствующую команду dpkg. Что касается purge, нет, это не своего рода «force-remove». Что он делает, иначе, чем remove, заключается в том, что он удаляет файлы конфигурации. Поскольку /, пока пакеты ядра не устанавливают конфигурационные файлы, remove и purge будут делать то же самое для пакетов ядра. – user149408 4 February 2017 в 03:55
  • 2
    Добавлена ​​четвертая пуля с соответствующей командой dpkg. – user535733 4 February 2017 в 04:02

Я написал этот скрипт bash для выборочной очистки старых ядер одновременно:

bash script

Весь код и инструкции bash включены в ссылка.

0
ответ дан 24 July 2018 в 20:16

Другие вопросы по тегам:

Похожие вопросы: