Я использую 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
показывает /boot
100%). Однако всякий раз, когда я пытаюсь запустить 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), поэтому мне нужна помощь.
Вопросы:
Почему я не могу удалить старые ядра с помощью
dpkg
?Если этот вопрос не может быть решен напрямую, то, полагаю, в конечном итоге я хочу знать:Что мне нужно сделать, чтобы снова вернуться в состояние, в котором я смогу устанавливать новые пакеты?
Другие вещи, которые я пробовал:
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*
файл.