在内核升级过程中,如何处理update-initramfs错误?

我刚刚跑了。
sudo apt-get update && sudo apt-get dist-upgrade

这是我从第二个命令得到的输出结果:
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following NEW packages will be installed
  linux-headers-4.4.0-38 linux-headers-4.4.0-38-generic
  linux-image-4.4.0-38-generic linux-image-extra-4.4.0-38-generic
  linux-signed-image-4.4.0-38-generic
The following packages will be upgraded:
  linux-generic linux-headers-generic linux-image-generic linux-libc-dev
  linux-signed-generic linux-signed-image-generic
6 to upgrade, 5 to newly install, 0 to remove and 0 not to upgrade.
Need to get 69.3 MB of archives.
After this operation, 296 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 linux-image-4.4.0-38-generic amd64 4.4.0-38.57 [18.7 MB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 linux-image-extra-4.4.0-38-generic amd64 4.4.0-38.57 [39.0 MB]
Get:3 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 linux-generic amd64 4.4.0.38.40 [1,790 B]
Get:4 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 linux-image-generic amd64 4.4.0.38.40 [2,300 B]
Get:5 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 linux-signed-image-4.4.0-38-generic amd64 4.4.0-38.57 [3,990 B]
Get:6 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 linux-signed-generic amd64 4.4.0.38.40 [1,820 B]
Get:7 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 linux-signed-image-generic amd64 4.4.0.38.40 [2,332 B]
Get:8 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 linux-headers-4.4.0-38 all 4.4.0-38.57 [9,948 kB]
Get:9 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 linux-headers-4.4.0-38-generic amd64 4.4.0-38.57 [785 kB]
Get:10 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 linux-headers-generic amd64 4.4.0.38.40 [2,274 B]
Get:11 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 linux-libc-dev amd64 4.4.0-38.57 [838 kB]
Fetched 69.3 MB in 1min 26s (806 kB/s)                                         
Selecting previously unselected package linux-image-4.4.0-38-generic.
(Reading database ... 248254 files and directories currently installed.)
Preparing to unpack .../linux-image-4.4.0-38-generic_4.4.0-38.57_amd64.deb ...
Done.
Unpacking linux-image-4.4.0-38-generic (4.4.0-38.57) ...
Selecting previously unselected package linux-image-extra-4.4.0-38-generic.
Preparing to unpack .../linux-image-extra-4.4.0-38-generic_4.4.0-38.57_amd64.deb ...
Unpacking linux-image-extra-4.4.0-38-generic (4.4.0-38.57) ...
Preparing to unpack .../linux-generic_4.4.0.38.40_amd64.deb ...
Unpacking linux-generic (4.4.0.38.40) over (4.4.0.36.38) ...
Preparing to unpack .../linux-image-generic_4.4.0.38.40_amd64.deb ...
Unpacking linux-image-generic (4.4.0.38.40) over (4.4.0.36.38) ...
Selecting previously unselected package linux-signed-image-4.4.0-38-generic.
Preparing to unpack .../linux-signed-image-4.4.0-38-generic_4.4.0-38.57_amd64.deb ...
Unpacking linux-signed-image-4.4.0-38-generic (4.4.0-38.57) ...
Preparing to unpack .../linux-signed-generic_4.4.0.38.40_amd64.deb ...
Unpacking linux-signed-generic (4.4.0.38.40) over (4.4.0.36.38) ...
Preparing to unpack .../linux-signed-image-generic_4.4.0.38.40_amd64.deb ...
Unpacking linux-signed-image-generic (4.4.0.38.40) over (4.4.0.36.38) ...
Selecting previously unselected package linux-headers-4.4.0-38.
Preparing to unpack .../linux-headers-4.4.0-38_4.4.0-38.57_all.deb ...
Unpacking linux-headers-4.4.0-38 (4.4.0-38.57) ...
Selecting previously unselected package linux-headers-4.4.0-38-generic.
Preparing to unpack .../linux-headers-4.4.0-38-generic_4.4.0-38.57_amd64.deb ...
Unpacking linux-headers-4.4.0-38-generic (4.4.0-38.57) ...
Preparing to unpack .../linux-headers-generic_4.4.0.38.40_amd64.deb ...
Unpacking linux-headers-generic (4.4.0.38.40) over (4.4.0.36.38) ...
Preparing to unpack .../linux-libc-dev_4.4.0-38.57_amd64.deb ...
Unpacking linux-libc-dev:amd64 (4.4.0-38.57) over (4.4.0-36.55) ...
Setting up linux-image-4.4.0-38-generic (4.4.0-38.57) ...
Running depmod.
update-initramfs: deferring update (hook will be called later)
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.4.0-38-generic /boot/vmlinuz-4.4.0-38-generic
run-parts: executing /etc/kernel/postinst.d/dkms 4.4.0-38-generic /boot/vmlinuz-4.4.0-38-generic
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.4.0-38-generic /boot/vmlinuz-4.4.0-38-generic
update-initramfs: Generating /boot/initrd.img-4.4.0-38-generic

gzip: stdout: No space left on device
E: mkinitramfs failure cpio 141 gzip 1
update-initramfs: failed for /boot/initrd.img-4.4.0-38-generic with 1.
run-parts: /etc/kernel/postinst.d/initramfs-tools exited with return code 1
Failed to process /etc/kernel/postinst.d at /var/lib/dpkg/info/linux-image-4.4.0-38-generic.postinst line 1052.
dpkg: error processing package linux-image-4.4.0-38-generic (--configure):
 subprocess installed post-installation script returned error exit status 2
dpkg: dependency problems prevent configuration of linux-image-extra-4.4.0-38-generic:
 linux-image-extra-4.4.0-38-generic depends on linux-image-4.4.0-38-generic; however:
  Package linux-image-4.4.0-38-generic is not configured yet.

dpkg: error processing package linux-image-extra-4.4.0-38-generic (--configure):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of linux-image-generic:
 linux-image-generic depends on linux-image-4.4.0-38-generic; however:
  Package linux-image-4.4.0-38-generic is not configured yet.
 linux-image-generic depends on linux-image-extra-4.4.0-38-generic; however:
  Package linux-image-extra-4.4.0-38-generic is not configured yet.

dpkg: error processing package linux-image-generic (--configure):
 dependency problems - leaving unconfigured
Setting up linux-headers-4.4.0-38 (No apport report written because the error message indicates it's a follow-up error from a previous failure.
                                                               No apport report written because the error message indicates it's a follow-up error from a previous failure.
           4.4.0-38.57) ...
Setting up linux-headers-4.4.0-38-generic (4.4.0-38.57) ...
Examining /etc/kernel/header_postinst.d.
run-parts: executing /etc/kernel/header_postinst.d/dkms 4.4.0-38-generic /boot/vmlinuz-4.4.0-38-generic
Setting up linux-headers-generic (4.4.0.38.40) ...
dpkg: dependency problems prevent configuration of linux-generic:
 linux-generic depends on linux-image-generic (= 4.4.0.38.40); however:
  Package linux-image-generic is not configured yet.

dpkg: error processing package linux-generic (--configure):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of linux-signed-image-4.4.0-38-generic:
 linux-signed-image-4.4.0-38-generic depends on linux-image-4.4.0-38-generic (= 4.4.0-38.57); however:
  Package linux-image-4.4.0-38-generic is not configured yet.

No apport report written because MaxReports has already been reached
                                                                    No apport report written because MaxReports has already been reached
                                                        dpkg: error processing package linux-signed-image-4.4.0-38-generic (--configure):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of linux-signed-image-generic:
 linux-signed-image-generic depends on linux-signed-image-4.4.0-38-generic; however:
  Package linux-signed-image-4.4.0-38-generic is not configured yet.
 linux-signed-image-generic depends on linux-image-extra-4.4.0-38-generic; however:
  Package linux-image-extra-4.4.0-38-generic is not configured yet.

dpkg: error processing package linux-signed-image-generic (--configure):
 dependency problems - leaving unconfigured
No apport report written because MaxReports has already been reached
                                                                    dpkg: dependency problems prevent configuration of linux-signed-generic:
 linux-signed-generic depends on linux-signed-image-generic (= 4.4.0.38.40); however:
  Package linux-signed-image-generic is not configured yet.

dpkg: error processing package linux-signed-generic (--configure):
 dependency problems - leaving unconfigured
Setting up linux-libc-dev:amd64 (4.4.0-38.57) ...
No apport report written because MaxReports has already been reached
                                                                    Errors were encountered while processing:
 linux-image-4.4.0-38-generic
 linux-image-extra-4.4.0-38-generic
 linux-image-generic
 linux-generic
 linux-signed-image-4.4.0-38-generic
 linux-signed-image-generic
 linux-signed-generic
E: Sub-process /usr/bin/dpkg returned an error code (1)

如您所见,我在更新initramfs时遇到了许多错误。安装过程出现这么多问题,我很害怕现在重启系统。
这个问题引导我查看了这个错误报告,但是对于如何解决问题我还不太确定,因为以前从未遇到过类似情况。为什么会出现这种情况,而且我该如何修复?报告中提到某个地方没有足够的空间,这是为什么呢?
我正在运行Ubuntu GNOME 16.04.1和GNOME 3.20版本。

sudo apt update && sudo apt full-upgrade && sudo apt -f install - Kaz Wolfe
我相信无论4.4.0-38内核是否正确设置,你应该仍然能够启动,至少可以通过在GRUB的“Ubuntu高级选项”菜单中选择一个旧的内核来实现。 - Byte Commander
@jarno:尽管答案多少相同,但问题略有不同,因为他们除了我所遇到的问题外还有更多的问题。因此我认为它们可能仍应保持分开,因为其他问题对于那个问题至关重要,但在这里并不存在。 - user364819
4个回答

可能的原因是您的磁盘空间不足(可能是因为您在硬盘上创建了一个太小的/boot分区),并且安装了太多旧内核。
彻底清理旧内核的最合适方法是使用以下命令将它们删除:
sudo apt purge linux-headers-* linux-headers-*-generic linux-image-*-generic linux-image-extra-*-generic linux-signed-image-*-generic

要检查当前系统上安装了哪些内核版本...执行以下命令:
sudo dpkg --get-selections | grep linux  

将命令输出中的 * 替换为内核版本(例如:4.4.0-36)。
示例 - 这是一个完全删除内核版本 4.4.0-36 的命令。
sudo apt purge linux-headers-4.4.0-36 linux-headers-4.4.0-36-generic linux-image-4.4.0-36-generic linux-image-extra-4.4.0-36-generic linux-signed-image-4.4.0-36-generic  

或者你可以使用Dustin Kirkland(Canonical)的byobu来摆脱旧内核:
sudo apt install byobu  
sudo purge-old-kernels  

这将删除所有旧内核,但保留当前(当然)和之前安装的一个。


byobu与此有何关系?据我所知,它是一种基于文本的窗口管理器,可以让您在一个终端中运行多个应用程序和shell。 - Byte Commander
@ByteCommander:请阅读这篇文章-> http://blog.dustinkirkland.com/2016/06/purge-old-kernels.html ... ! :) 顺便说一下...你可以在Ubuntu 16.04服务器版上查看它...byobu已经默认安装了。 :) - cl-netbox
1啊哈,好的。这很不错,虽然我觉得这个工具最好单独打包。 - Byte Commander
1@ByteCommander 系统可能有很多内核,以至于purge-old-kernelsapt purge无法操作。那么我的回答可能会有所帮助。我已经制作了一个功能齐全的脚本,甚至更加强大。在达到我的赏金目标之后,我将发布它:https://www.bountysource.com/issues/38300038-feature-request-the-command-should-work-like-this - jarno

你的电脑磁盘空间已满。

请在/boot中释放一些空间。

然后重新运行命令。

更新:聊天中我们发现/boot分区已满。应该在这里释放磁盘空间。

更新2:执行ls /boot应该显示一些vmlinuz-X.XX.XX文件。对于每个文件,执行apt-get purge linux-image-X.XX.XX-generic。只保留最新的一个,以防安装的那个不起作用。(感谢edwinksl要求提供此信息)。


对于那些不知道如何释放/boot空间的人,你能详细说明一下如何做吗? - edwinksl
@edwinksl 当然。 - user595510
你可能想要告诉人们使用apt-get purge来卸载软件包,而不是手动删除,因为其他地方的配置将无法清除,如果你没有通知系统就将其删除,可能会导致系统损坏和混乱。 - user364819
我还建议人们至少保留一个旧内核,以防新的内核出现问题。 - IanC
@IanC 确实。已编辑。 - user595510

希望这能帮助其他人。
几个月前,我尝试手动安装一个更新的内核版本,结果与原帖类似。即使/boot只有30%的空间被占用,但每次运行apt-get autoremove时都会出现磁盘空间不足的错误,它会尝试为新内核构建initramfs,但最终失败。
根据这个AskUbuntu问题的链接,我将有问题的内核文件从/var/lib/initramfs-tools移动了出来,然后apt-get又能正常运行了,没有出现错误。

关于为什么在Ubuntu 16.04中会发生这种情况,我有一个理论:
在16.04中,不需要的内核应该由自动运行的unattended-upgrades自动删除,作为默认的cron工作或类似工作,以便/boot永远不会满,但我怀疑Bug #1624644已经发生。您能在Launchpad上确认这个错误吗?