![无法创建 Moklist:卷已满 - grub 根本无法启动](https://linux22.com/image/1031907/%E6%97%A0%E6%B3%95%E5%88%9B%E5%BB%BA%20Moklist%EF%BC%9A%E5%8D%B7%E5%B7%B2%E6%BB%A1%20-%20grub%20%E6%A0%B9%E6%9C%AC%E6%97%A0%E6%B3%95%E5%90%AF%E5%8A%A8.png)
因此,我一直在双启动 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}
操作成功完成。
...
最后,重新启动机器。