如何恢复/boot中已删除的文件?(vmlinuz 丢失,系统无法启动)

NVa*_*han 10 boot kernel restore

我错误地删除了vmlinuz/boot目录中的一个文件。但是,为了确定起见,我备份了/bootinside /tmp

因此,我无法启动,因为我收到了缺少 vmlinuz 文件的错误。所以我使用实时 USB 启动,但是当我进入/boot硬盘驱动器 (sda5) 中的目录时,它完全是空的。如果我将文件从/tmp/boot/boot目录复制到该目录,我仍然无法启动。

如何将这些文件还原到适当的目录?

Liv*_*eBT 13

vmlinuz 是 Linux 内核映像本身(z 表示它已压缩)。

在 UEFI 安全引导环境中重新安装linux-image-generic(或您的HWE 内核)和linux-singed-image-generic当前引用的内核包应该可以解决您的问题。

从 chroot 重新安装内核

最好启动相同版本的实时媒体并挂载您的安装分区(您可以使用 Nautilus 执行此操作,它将与/media/ubuntu/…那时类似)或您的/boot分区(这会更复杂一些)。这将${my_installation}在以下说明中。

查看/lib/modules/已安装${my_installation}/lib/modules/的特定内核版本的安装 ( ) 并选择您可以找到的最新版本号,这${kernel_ver}在以下说明中引用,在我的测试 VM 中它是 3.16.0-46。

正如我之前在评论中所说,该过程与在 chroot 中重新安装 Grub 非常相似,所以让我引用这个答案并稍作修改:

  1. 绑定挂载一些其他必要的东西:

     for i in /sys /proc /run /dev; do sudo mount --bind "$i" "${my_installation}$i"; done
    
    Run Code Online (Sandbox Code Playgroud)
  2. chroot 进入你的 Ubuntu 安装:

     sudo chroot ${my_installation}
    
    Run Code Online (Sandbox Code Playgroud)
  3. 此时,您处于安装状态,而不是实时会话中,并且以 root 身份运行。…

现在重新安装内核(该signed软件包用于 UEFI 安全启动):

apt-get install --reinstall linux-image-${kernel_ver}-generic linux-signed-image-${kernel_ver}-generic
Run Code Online (Sandbox Code Playgroud)

/boot如果initrd仍然缺少此内核的目录,请检查目录。要手动生成它,请运行:

mkinitramfs -o /boot/initrd.img-${kernel_ver}-generic ${kernel_ver}-generic
Run Code Online (Sandbox Code Playgroud)

我的例子:

mkinitramfs -o /boot/initrd.img-3.16.0-46-generic 3.16.0-46-generic
Run Code Online (Sandbox Code Playgroud)

然后update-grub像引用的答案一样运行,这样您就可以确保包含“新”内核和 initrd。

如果您也需要重新安装 Grub,您可以按照其余步骤操作。请记住,这些说明是为 MBR 编写的,如果您有 UEFI(来自不同操作系统的引导加载程序不应相互覆盖),您需要grub-efi-amd64-bin在重新安装 Grub 之前检查已安装。