无法创建 Moklist:卷已满 - grub 根本无法启动

无法创建 Moklist:卷已满 - grub 根本无法启动

因此,我一直在双启动 Kubuntu 和 Windows 10。我主要尝试只使用 linux,但仍然偶尔登录 Windows 10 来使用我付费的 daw 或 davinci resolve 等。但是!!!

上次我登录 Windows 10 然后重启电脑时,收到的是错误消息,而不是 grub 引导加载程序(我没有更改 bios 设置中的任何内容)。我收到的错误是“无法创建 Moklist:卷已满,出现严重错误,import_mok_state():失败”。

我不仅无法登录安装在我笔记本电脑上的 Kubuntu,而且无法使用 Kubuntu Live USB 或 RedHat Live USB 登录。我尝试在我妻子的笔记本电脑上使用 Kubuntu Live USB,它启动正常。

现在,我可以启动 Slax Linux 的 Live USB。而且,我可以更改 BIOS 以启动 Windows 10 分区,但是...不幸的是,仅此而已。

所以...希望有人能够帮助这个 Linux 新手。

PS-我甚至用几天前制作的图像恢复了所有内容,但这也不起作用。

开始更新 1................................................................

我可以使用 Slax 查看 efi 文件夹。

efi/ubuntu 文件是:

  • BOOTX64.CSV
  • grub配置文件
  • 启动grub2.efi
  • 启动管理器
  • shimx64.efi

efi/boot 文件包括:

  • 启动文件
  • FBX64 插件
  • 启动管理器

efi/microsoft 有两个文件夹:

  • 启动文件夹

    • 有一堆文件夹和文件。
    • 太多了,无法一一列举。
  • 恢复文件夹

    • 浮力调节装置
    • 故障诊断日志
    • 日志1
    • LOG2 日志

我家的笔记本电脑跟我的一模一样,所以尽管我没有更改任何 BIOS 设置,但我们还是将我的与她的进行了比较(她只使用 kubuntu,而且运行良好),发现它们是一样的。好吧,除了我的电脑有一个我前段时间升级的 nvme 驱动器。

我在 nvme 下进行了系统自检并且通过了。

结束更新 1................................................................ 开始更新 2................................................................

目前在我妻子的 kubuntu 上。在尝试了所有能在网上找到的方法后,我决定使用 Slax Linux 删除我两个硬盘上的分区,包括创建新的 GPT 分区表。我目前正在 nvme 硬盘上全新安装 Windows 10,并且正在经历漫长的 Windows 更新过程。

一旦完成,我将尝试制作一个新的 USB Live,看看效果如何。

这真的让我很困惑。一切都很好。在这一切开始之前,我上次登录 Windows 10 时,它有一个更新。它只是说更新已准备好安装 - 我安装了它 - 非常短的更新。上次的 Windows 10 更新会导致这种情况吗???

结束更新 2................................................................ 开始更新 3................................................................

好吧,即使按照 UPATE 2 中所述操作后,我仍然无法使用除 SLAX Linux 之外的任何 Linux。

希望有人知道我需要做什么来解决这个问题。

结束更新 3................................................. 开始更新 4..............................................................

以下是我的个人简介的几张图片。也许它们能帮助人们找到正确的方向:https://flic.kr/s/aHBqjzKinq

另外,我删除了所有密钥,现在我可以使用 Mint Linux live usb 来启动,但仍然无法使用 Kubuntu live usb 来启动(有同样的 MOK 问题)。

结束更新 4................................................................ 开始更新 5............................................................... !!! 我已经让它工作了 !!!

而且,我使用 Kubuntu 进行此编辑:)

修复该问题。

那么,让我们先回顾一下...

我的双启动 Windows 10 和 Kubuntu 设置运行良好。

我主要登录 Windows 10 使用我付费的音乐 DAW(数字音频工作站)和使用 Davinci Resolve(我最喜欢的视频编辑器)。

上次我启动 Windows 10 时,在发生这一切之前,有一个更新(即 Windows 10 更新) - 它只是说更新已准备好。因此,我安装了它,并且安装得非常快。当我在 Windows 10 中完成操作后,我重新启动以返回 Kubuntu,但是... 它没有启动。我一直收到一个非常接近的错误:

Could not create MokList: Volume Full
Something serious has gone wrong.
import_mok_state() failed.

我不仅无法通过硬盘启动 Kubuntu,也无法通过实时 USB 启动 Kubuntu、RedHat、EndeavorOS、POP OS、Xubuntu、Mint Linux 等。我发现 SLAX 可以启动……

删除安全启动下的所有密钥后,我能够在 Mint Linux Live USB 上启动。因此,我尝试安装它,但出现了与之前相同的错误,我觉得这很奇怪。

因此,经过几天的努力,我终于找到了适合我的解决方案,并决定在这里分享它。

解决方案是使用 efibootmgr 并删除旧的/未使用的启动项。我无法解释,也不知道我的 Kubuntu 怎么会在一次非常小的 Windows 10 更新后从正常工作变为无法工作(也许这只是一个巧合),但这就是发生的事情,或者至少据我所知,这似乎是发生的事情。无论如何......

以下是拯救了我一切的三条终端线路:

// get efibootmgr
sudo apt-get install efibootmgr

// run efibootmgr
sudo efibootmgr

// remove unused boot entries
sudo efibootmgr -b 0005 -B
Take note that 0005 could be 0004, 0006, etc

以下是提供上述信息的视频和文章的链接:

视频“使用 Efibootmgr 修复 EFI 启动问题”

文章“如何在 Linux 中删除旧的 EFI 启动项”

当我观看视频并看到未使用的条目时,我突然想到了错误的“完整”部分,这促使我找到了这篇文章。

所以,希望这对某些人有帮助。这对我来说确实是一个学习过程...

不确定我是否应该说这些,但你知道,随着时间的推移,我真的越来越讨厌微软了。如果不是因为我付费购买了 DAW 和 Davinci Resolve,我可能会完全抛弃微软(我正在努力 - 哈哈)...

更新结束 5................................................................

答案1

首先,介绍一些背景知识:您报告了一条错误消息:

Couldn't Create Moklist: Volume Full , Something serious has gone wrong, import_mok_state():failed

这是对机器所有者密钥 (MOK) 列表的引用,MOK 是与 Shim 关联的加密密钥。安全启动要求使用密钥对引导加载程序进行签名,以验证二进制文件的真实性。一些公钥存储在计算机的固件或 NVRAM 中;但唯一保证以这种方式存储的密钥属于 Microsoft,而 Microsoft 对于签名内容有规定。长话短说,大多数 Linux 发行版都使用一个名为 Shim(shimx64.efi通常为 )的程序,该程序由 Microsoft 签名,并为发布该版本 Shim 的 Linux 发行版添加新密钥。Shim 还可以读取用户可以存储在所谓的 MOK 列表中的新密钥。包括 MOK 列表在内的大部分数据都存储在 NVRAM 中。

您报告的错误消息声称“卷已满”,但这是一个令人困惑的措辞,因为有问题的卷几乎肯定不是磁盘分区,而是 NVRAM 存储,它是非常尺寸有限。

安全启动机制的一部分涉及操作系统供应商定期更新另一个基于 NVRAM 的安全启动密钥池,称为dbx,它是已失效的密钥或二进制哈希列表 - 它们有已知错误或已知恶意软件,因此不应加载。您的 Windows 更新很可能包含一个dbx更新,这可能会将您的 NVRAM 存储推到极限。您的一个屏幕截图显示了一个dbx包含 77 个条目的列表(“禁止签名”)。可能还有其他东西也在占用 NVRAM 存储空间。EFI 定期对 NVRAM 存储执行“垃圾收集”以尝试清理旧数据,但这只是偶尔进行,并不能保证完全有帮助。

与任何已满或几乎已满的资源一样,基于 EFI 的计算机上的已满 NVRAM 也会产生奇怪的结果。我无法准确解释为什么某些 Linux 发行版可以正常启动,而其他发行版却不能,但我的猜测是 NVRAM 已满或几乎已满造成的。有多种方法可以测试这个假设,但我知道的主要方法比较复杂,可能不值得付出努力。

Linux 中显示的启动条目efibootmgr也存储在 NVRAM 中,因此删除旧的/未使用的条目可能已经清除了足够的空间,使系统可以开始工作。但是,如果您只删除了几个条目,那么您可能已经非常接近极限,将来可能会遇到问题。

降低未来遇到问题风险的一种方法是禁用安全启动。就其本身而言,这不会消除dbx或以其他方式减少 NVRAM 上的负载,但如果工具无法读取或修改 MOK 列表,这至少应该使它变得不重要,因为 MOK 仅由 Shim(和相关工具)使用。但是,禁用安全启动会降低系统的整体安全性——如果安装,预启动恶意软件将能够毫无问题地执行。

您也可以删除它dbx本身,或者用你创建的密钥覆盖所有密钥,但这会进入一个相当棘手的领域——并且删除dbx也会降低系统的安全性(尽管不如完全禁用安全启动那么严重)。

答案2

因此,经过几天的努力,我终于找到了适合我的解决方案,并决定在这里分享它。

解决方案是使用 efibootmgr 并删除旧的/未使用的启动项。我无法解释,也不知道我的 Kubuntu 怎么会在一次非常小的 Windows 10 更新后从正常工作变为无法工作(也许这只是一个巧合),但这就是发生的事情,或者至少据我所知,这似乎是发生的事情。无论如何......

以下是拯救了我一切的三条终端线路:

// 获取 efibootmgr sudo apt-get install efibootmgr

// 运行 efibootmgr sudo efibootmgr

// 删除未使用的启动项 sudo efibootmgr -b 0005 -B 请注意,0005 可能是 0004、0006 等

以下是提供上述信息的视频和文章的链接:

视频“使用 Efibootmgr 修复 EFI 启动问题”

https://www.youtube.com/watch?v=MN-Q5h2Iv8A

文章“如何在 Linux 中删除旧的 EFI 启动项”

https://digitalrobin.net/2020/07/11/how-to-remove-old-efi-boot-entries-in-linux/

当我观看视频并看到未使用的条目时,我突然想到了错误的“完整”部分,这促使我找到了这篇文章。

所以,希望这对某些人有帮助。这对我来说确实是一个学习过程...

答案3

我也遇到过这个问题。“无法创建 MokListRT:卷已满”。无法在磁盘或我的两个 USB 密钥上重新启动。

受到我上述内容的启发,以下方法对我的华硕有用:

  • 进入 Bios(启动时按 F2)
  • 高级模式(F7)
  • 安全选项卡 > 安全/安全启动 > 密钥管理
  • 从那时起,我删除了所有安全密钥并将其重置为出厂设置。

然后我能够通过 USB 密钥启动并重新安装系统。在安装过程中,您需要设置“安全启动”密码。首次重启时会要求输入该密码。请注意,此时键盘为 Qwerty。Ubuntu 18.10 安装后从磁盘注册密钥、从磁盘注册哈希和注册 Mok 是什么

答案4

前段时间,我遇到了这样的故障。好消息是我仍然可以使用 Windows Bootmgr 启动(在 UEFI 启动管理器中选择它)。The problem is something created too many boot entries in my UEFI firmware,它们占用了大部分 NVRAM 空间。所以我的解决方案是使用 Windows 工具删除所有这些未使用的启动项bcdedit

首先,列出所有启动项并找到它们的标识符:

> bcdedit.exe /enum firmware

....<repeat many times>....

固件应用程序(101fffff)
-------------------------------
标识符                  {d75e8a44-0cb7-11ee-8c41-58ce2a1283af}
device                  partition=\Device\HarddiskVolume8
path                    \EFI\BOOT\BOOTX64.EFI
description             UEFI: ST500LM021-1KJ152, Partition 1

固件应用程序(101fffff)
-------------------------------
标识符                  {dae32edd-109d-11ee-8c45-58ce2a1283af}
device                  partition=\Device\HarddiskVolume8
description             UEFI: ST500LM021-1KJ152, Partition 1

然后,逐个删除每个未使用的条目:

> bcdedit.exe /delete {d75e8a44-0cb7-11ee-8c41-58ce2a1283af}
操作成功完成。

> bcdedit.exe /delete {dae32edd-109d-11ee-8c45-58ce2a1283af}
操作成功完成。
...

最后,重新启动机器。

相关内容