安装/更新时出现initramfs错误

我在过去一周左右更新或运行任何apt命令时都遇到了一个错误。 升级到LTS 18.04并没有解决这个问题,删除所有旧内核也没有用。 空间也不是问题。 尝试重新安装initramfs也不起作用。 我得到的错误是:
   Reading package lists...
Building dependency tree...
Reading state information...
0 to upgrade, 0 to newly install, 0 to remove and 0 not to upgrade.
2 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Setting up linux-image-4.15.0-47-generic (4.15.0-47.50) ...
Setting up initramfs-tools (0.130ubuntu3.7) ...
update-initramfs: deferring update (trigger activated)
Processing triggers for linux-image-4.15.0-47-generic (4.15.0-47.50) ...
/etc/kernel/postinst.d/initramfs-tools:
update-initramfs: Generating /boot/initrd.img-4.15.0-47-generic
E: /usr/share/initramfs-tools/hooks/fsck failed with return 1.
update-initramfs: failed for /boot/initrd.img-4.15.0-47-generic with 1.
run-parts: /etc/kernel/postinst.d/initramfs-tools exited with return code 1
dpkg: error processing package linux-image-4.15.0-47-generic (--configure):
 installed linux-image-4.15.0-47-generic package post-installation script subprocess returned error exit status 1
Processing triggers for initramfs-tools (0.130ubuntu3.7) ...
update-initramfs: Generating /boot/initrd.img-4.15.0-47-generic
E: /usr/share/initramfs-tools/hooks/fsck failed with return 1.
update-initramfs: failed for /boot/initrd.img-4.15.0-47-generic with 1.
dpkg: error processing package initramfs-tools (--configure):
 installed initramfs-tools package post-installation script subprocess returned error exit status 1
Errors were encountered while processing:
 linux-image-4.15.0-47-generic
 initramfs-tools

有人有任何关于我能做什么的主意吗?

谢谢。

13个回答

运行自动删除和清理对我的情况起作用。 apt-get auto-remove && apt-get clean && apt-get update && apt-get upgrade

这对我来说解决了问题。 - Retardi Grade
谢谢,你帮我省了几个小时的麻烦,试图重新安装旧版的Nvidia驱动程序来恢复我的显示设置。 - Moha
1这对我也起作用了。我怀疑,但无法确认我在/boot目录下有旧的initrd镜像,并且它已经满了。我知道我的/boot目录几乎满了,但我忽视了这个问题。现在使用率是55%,所以这是我的猜测。 - Kevin

警告:如果你的硬盘已加密,请确保你清楚自己在做什么之后再进行以下操作

对我来说,这是与initramfs-tools软件包有关的问题

我只是执行了以下操作:

sudo apt remove initramfs-tools
sudo apt clean
sudo apt install initramfs-tools
然后我再也没有收到错误提示了 @jameshibbard提出了一个重要观点:如果你使用全盘加密,或者加密你的initramfs输出(在/boot中的压缩文件系统vmlinuz包)作为一项新功能,请小心,因为切换版本的initramfs-tools可能会导致系统无法启动。 如果你不知道这意味着什么,很有可能你的系统没有加密,除非你在安装过程中记得选择它。我注意到现在一些图形化安装程序都将其作为一个选项,包括Ubuntu,如果我没记错的话。 要尽职尽责。

2如果使用全盘加密,请在运行这些命令时小心。这可能会导致cryptsetup被彻底删除,使系统无法启动(我就遇到过这种情况)。 - James Hibbard
@JamesHibbard 这是一个很好的观点,我没有考虑到提到使用未加密驱动器的危险,因为我不使用它。 - AveryFreeman

我遇到这个错误已经有一年多了。现在我找到了解决办法。
cd ~
mkdir initramfs
cd initramfs
sudo cp -a /boot .
cd boot
sudo update-initramfs -ut -b .
sudo cp -a * /boot
sudo apt-get autoremove
说明:/boot位于不同的分区上,空间不足以执行操作。解决方案:在有足够空间的驱动器上进行更新,并将结果复制回来。

2太棒了!我尝试了其他的解决方案,但是它们都没有起到任何作用。这正是我的问题所在。我将/boot放在一个带有加密的USB驱动器的不同分区上。对我来说,你的解决方案实际上并没有起作用,但是解释给了我所需要的:cd /boot并且删除所有旧版本的文件,然后运行sudo apt update(为了让这个答案更加明显地显示)。 - Matt Zabojnik
从根本上讲,这听起来就是我需要的(在有空间的地方执行操作,然后复制结果),因为我的260MB分区1会被填满并出现错误。但是这似乎不起作用...无法在USB启动时进行操作,因为它是只读文件系统,所以update-initramfs会报错。在chroot环境中进行操作时,-b .似乎没有任何效果,仍然出现相同的错误。 - Kyle Baker
这个方法几乎解决了我的问题,但我还需要加上"-k all"来运行它,最终的命令是:sudo update-initramfs -c -k all -b .。我的情况是,我将Kali更新到了6.3.0版本,但由于某种原因更新过程失败了。所以我运行了内核5.14.0,至少能够进入桌面,然后复制了/boot文件夹,运行了"-k all"成功生成了6.3.0版本,再将它复制回去,问题就解决了。非常感谢! - SeriousM

正如Harald所指出的那样,问题是/boot分区的空间不足。 他的解决方案对我没有起作用,但直接引导我找到了正确的方法: 首先使用cd /boot命令,然后使用ls命令查看已经存在的文件版本。然后逐个删除具有多个版本的文件,确保只保留最新的版本,然后运行sudo apt update命令。

这个解决方案对我的加密驱动器完美奏效。谢谢你。 - Bon Ryu

我也遇到了这个问题。我的/boot分区已满,所以当我尝试运行apt-update时,会出现initframs编译的错误。 我的解决方法是删除旧内核以释放空间,按照Lekensteyn的步骤来操作: 如何在/boot中释放更多空间? 以下命令将列出当前安装的所有内核映像和头文件:
~ % kernelver=$(uname -r | sed -r 's/-[a-z]+//')
dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve $kernelver

linux-headers-5.4.0-94
linux-headers-5.4.0-94-generic
linux-headers-5.4.0-96
linux-headers-5.4.0-96-generic
linux-headers-5.4.0-99
linux-headers-5.4.0-99-generic
linux-image-5.4.0-94-generic
linux-image-5.4.0-96-generic
linux-image-5.4.0-99-generic
你可以小心地使用apt-get purge来清除旧的linux-headerslinux-image包(记住不要删除与你正在使用的内核相关的包),例如:
sudo apt-get purge linux-image-5.4.0-94 linux-image-5.4.0-96 linux-headers-5.4.0-94 linux-headers-5.4.0-96
这也应该处理匹配的“通用”软件包。 之后,我运行了
sudo apt-get auto-remove && sudo apt-get clean && sudo apt-get update && sudo apt-get upgrade
错误已经修复。

我也做过这个,但是我运行了sudo apt autoremove,而不是手动找出要删除的内容。 - undefined

sudo apt remove initramfs-tools
sudo apt clean
sudo apt install initramfs-tools
sudo apt-get autoremove
sudo apt-get autoclean
sudo apt-get clean
sudo apt-get update 
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get -f install
sudo dpkg --configure -a
这对我来说是个解决办法。

第一行(sudo apt remove initramfs-tools)对我有帮助,其他的都没有。 - Ray Woodcock
1(-1) 这将移除 cryptsetup,如果你的磁盘被加密(就像我一样),将无法启动系统。千万不要这样做。 - pzivich
如果我使用其中一些,我经常会遇到这个错误: - SL5net

我刚刚遇到了一个非常类似的问题,当我执行sudo apt autoremove命令时,它尝试安装我没有的内核文件,然后失败了。我的uname -a命令显示我正在使用5.0.0-20版本的内核,而运行ls -al /boot命令只显示这个版本和5.0.0-17版本的内核已安装。然而,apt突然出现错误,并尝试在我的/boot目录下安装旧的内核,包括5.0.0-15、4.18.0-17和4.13.0-45。这很奇怪。 所以我猜想他们可能改变了dkms(或与initramfs相关的其他东西)的逻辑,它会检查其他位置是否安装了内核,然后对这些内核进行更新并替换丢失的文件。 我不确定具体是什么修复了这个问题,但我做了以下操作:
sudo apt purge *5.0.0-15* *4.18.0-17* *4.13.0-45* 
#check carefully that it's not removing anything you need though, this is a hammer to crack a nut

ls -al /lib/modules 
# which revealed lots of old module folders that I removed with ...
sudo rm -rf /lib/modules/4.* 
# and similarly for the 5.0.0-15 modules
然后我做了以下事情:
ls -al /usr/src/ 
# which again showed old source trees that I pruned with
sudo rm -rf sudo rm -rf /usr/src/linux-headers-4.*
然后我做了以下事情:
locate -e 4.13.0 
# which found old kernel files in
ls -al /var/lib/initramfs-tools/ 
# so I removed with
sudo rm -rf /var/lib/initramfs-tools/4*
我因为历史原因,/boot文件夹非常拥挤,所以我使用以下命令删除了旧的内核文件:
sudo rm -i /boot/**4* 
# and similar for all but my current and next oldest kernels
# -i is interactive mode so you have to answer 'y' to remove
# that's a really useful safety check, 'sudo rm' is a dangerous tool!
终于我跑了。
sudo apt -f install

这次操作如预期完成,并将系统恢复到了预期的状态,而没有尝试安装多余的内核。我在进行操作时没有进行测试,所以无法保证哪个部分修复了问题,但根据我所知,清理那些旧文件并不会造成任何损害。

另外,在检查我的/var/log/apt/history.log文件时,这似乎是这个特定错误的起始点:

Start-Date: 2019-07-01  17:59:10
Commandline: /usr/bin/unattended-upgrade
Upgrade: linux-tools-common:amd64 (4.15.0-52.56, 4.15.0-54.58)
End-Date: 2019-07-01  17:59:16

Start-Date: 2019-07-01  17:59:22
Commandline: /usr/bin/unattended-upgrade
Install: linux-image-5.0.0-20-generic:amd64 (5.0.0-20.21~18.04.1, automatic), linux-modules-extra-5.0.0-20-generic:amd64 (5.0.0-20.21~18.04.1, automatic), linux-modules-5.0.0-20-generic:amd64 (5.0.0-20.21~18.04.1, automatic)
Upgrade: linux-image-generic-hwe-18.04-edge:amd64 (5.0.0.17.73, 5.0.0.20.76), linux-image-extra-virtual-hwe-18.04-edge:amd64 (5.0.0.17.73, 5.0.0.20.76)
Error: Sub-process /usr/bin/dpkg returned an error code (1)
End-Date: 2019-07-01  18:00:10
但对我来说,这可能是一个虚假的标志,因为/boot空间有限可能是错误代码(1)的原因。

我今天在两台不同的机器上遇到了这个问题,之前执行了apt updateapt upgrade命令,只不过我的问题是针对linux-image-4.15.0-48-generic(Ubuntu 18.04.2)。 我的解决方法如下(在两台机器上都复现成功):
sudo rm /var/lib/dpkg/info/linux-image-4.15.0-48-generic.postinst
sudo dpkg --configure -a
sudo apt-get update
然后重新安装该软件包:
sudo apt install linux-image-4.15.0-48-generic
这将设置软件包为手动安装,并替换*.postinst文件。

非常感谢您,先生,感谢您提供给我唯一有效的解决方案。不过,我稍微对它进行了修改。我删除了/var/lib/dpkg/info中的所有旧的linux-images-文件,只保留了最新的一个。然后我按照您所说的做了。 - Farhad

一个类似的问题有这个解决方案:

sudo apt-get autoclean
sudo apt-get clean
sudo apt-get update 
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get -f install
sudo dpkg --configure -a
另外,请确保执行此命令:
ll /usr/share/initramfs-tools/hooks/fsck

返回此输出:

-rwxr-xr-x 1 root root 2468 Sep 18  2018 /usr/share/initramfs-tools/hooks/fsck*

谢谢您的回复,已经尝试了所有方法,但问题仍然存在。sudo dpkg --configure -a .. update-initramfs: 正在生成 /boot/initrd.img-4.15.0-47-generic E: /usr/share/initramfs-tools/hooks/fsck 失败,返回值为 1。 update-initramfs: /boot/initrd.img-4.15.0-47-generic 生成失败,返回值为 1。 run-parts: /etc/kernel/postinst.d/initramfs-tools 退出,返回码为 1 dpkg: 在处理软件包 linux-image-4.15.0-47-generic (--configure) 时出错: 错误信息..处理: linux-image-4.15.0-47-generic initramfs-tools linux-image-4.15.0-48-genericll 命令返回了预期的输出。 - adieb
我也执行了sudo apt autoremove。 - Dimitrios Zacharatos

尝试清除未使用的内核。如果问题仍然存在,请删除所有的 'initrd' 镜像。
sudo rm /boot/initrd.img*
然后为所有当前存在的内核生成新的 'initrd' 镜像。
sudo update-initramfs -c -k all

  • 相关问题