记一次关于NVROM中遇到的“Could not prepare Boot variable:No space left on device”问题的解决历程
注:关于我电脑遇到的问题,不是一两句话能够说清楚的。为了能够比较完整的呈现问题的某些细节,在这篇博客中我会添加许多问题发生的背景,如果当中有观点与您的三观不合,请立即停止阅读,及时止损。
注:此篇文章可能出现错误或者不严谨的知识,比如系统引导那一部分是个人回忆+理解写出来的,只供参考。希望看出有问题的同学不吝赐教,谢谢!
第一次进入计算机专业
大学选的是计算机专业,但与这个专业的真正接触,却是在一次重装系统当中。(个人觉得)和身边大多数同学一样,在学习学校开设的计算机课程中,我也没有爱上“计算机”。而那时候,正是Windows 10的推广时期。当时我们那一批人买的电脑估计都是Windows 7/8,而我的电脑,正是windows 8。当时Windows 10的推广软文和windows 8的“黑帖子”使得我没怎么思考便懵懵懂懂地加入了“升级Windows 10大军”中去了。
虽然已经学了一点C语言和数据结构,但是对于计算机的使用来讲,我几乎停留在“聊QQ看视频听音乐”(那时不玩游戏)的层次上,十足十一个“没见过世面的小白”。
此前我从来没有装过系统。所以关于怎么装系统,我问了百度(很久之后才知道可以在Windows设置里直接升级)。
阴差阳错,我误装了了另外一个系统--Ubuntu。莫名其妙之下,看了几篇文章,才知道这个世界原来不只是有Windows系统,还有(类)Unix系统等等......。这些文章一下子让我迷上了Linux系统,很快地我便买了一本多人推荐的书:《鸟哥的私房菜--基础版》。那时候呀,就像一个情窦初开的少年,一下子找到了心爱的姑娘,我怀着无比激动的心情,花了一周多把这本书看完了,也照着里面的代码敲了一遍。从此,我才算真正的进入了计算机专业,成为了无数求学学子中普通的一员。
说了这么久,这里我要交代一下我脑的配置了,以为往后的故事,都与之有关。
我电脑配置是这样:联想拯救者14-ISK(i7经典版)
BIOS版本是这样:
开始进入装双系统的“坑”
装双系统向来比较流行,大概20天后我便来了装双系统的兴趣。因为几乎什么都不懂,所以只能跟着一些博客文章一步步做,愣着不懂mbr分区和GPT分区的异同,搞了很久也没有搞定。很多次都是装好了linux系统,但启动的时候只能进入Windows 系统。后来不知道是哪儿看的重刷BIOS能解决问题,所谓初生牛犊不怕虎,我便不假思索便刷了BIOS。刷完BIOS就,把固态格式化,将分区换成了MBR,也在BIOS做了相应设置,最后终于成功地搞定了双系统启动。强烈的满足感让我很长一段时间都很激动。
之后我便几乎都在linux下用vim来敲C语言。
三系统!
大概花了半年时间,我学习了C语言和一部分shell命令,同时也对linux的使用熟悉了很多。后来网上冲浪时,我发现原来可以在普通的笔记本上装上苹果系统mac OS,也就是俗称的黑苹果。毫无悬念,我被这个“旁门左道”(我叔叔这么说的)牢牢地套住了,接下来的几乎一个月,我几乎每天六点起床,装了一百多次系统。看了许多篇文章,每次失败,都得按(先装Windows,再装ubuntu,再装黑苹果)这个顺序重来一遍。直到我发现了这个网站tonymacx86,很吃力地看了里面许多教程,多次利用easyuefi,才成功地装好了三系统。由于电脑固态只有可怜的128G,我经过多次思考,终于想到了一个办法,就是把Clover 引导程序装在u盘efi分区里(装黑苹果需要在U盘划分EFI分区),Windows10和ubuntu装在固态里,Mac OS装在机械硬盘里。
大概是这样:
-
Windows 10 大概80G(固态里)(EFI分区和MSR分区也在这里,但下图中MSR分区没显示出来);
-
ubuntu: 大概39G(固态里);
-
Mac OS: 100G(机械硬盘里);
然后按下面步骤干活:
- 用U盘EFI里的引导程序进入硬盘上的MAC OS系统;
- 在MAC OS里,先把固态下EFI里的Windows引导程序和ubuntu引导程序备份好;
- 再把U盘上EFI分区的EFI文件复制到电脑上的EFI分区里,最后再把开始你备份的固态下EFI里的Windows引导程序和ubuntu引导程序复制进clover文件夹里。
(理论上你进入其他系统也能将U盘EFI分区里的文件复制到固态里的EFI分区里,但由于mac os下挂在efi分区比较方便,我一直是在mac os里对efi进行复制移动文件操作)
做到这里,如果你没有U盘,你是进不去电脑上的系统,你得再借助U盘进入Windows系统,然后借助easyuefi把clover引导条目添加到BIOS启动项目里,这时候,不需要U盘,你也能进入电脑中任何一个系统了。
启动界面大概这样:
然而成功点亮系统只是第一步,黑苹果里面的很多驱动,得自己修改源码(当然有教程),才能继而点亮驱动。所以,之后的几乎一年里,我基本上都在搞三系统。也就是在这段时间里:
- 我意识到英语十分重要,花了很大功夫在学习英语里;
- 解决事情之前,你需要良好的知识背景才能让你想出清晰正确的思路;
开始遇到问题!
同时也是装三系统那段时间里,我的电脑固态坏了,联想售后给我免费换了一条。也就是这个时候,我的电脑无法再次写入新条目(也就是BIOS里无法添加新的Boot引导)。我到现在都无法判断,为什么无论我重装了多少次电脑,还是不能在BIOS里写入新的条目,哪怕我只装Windows系统,也不行。
为了测试,我把电脑机械硬盘拆下来,把固态硬盘重新格式化,重新分区,然后再重装Windows 10系统,还是不行,无法在BIOS启动项里添加新条目,大概就是下面这样:
但如上图所示,虽然说不能在BIOS的Boot Priority Order里添加新引导项,但还是能够进入系统的,但启动速度肯定会有影响,而且BIOS系统在硬盘寻找EFI分区中的启动项是可能会出错,导致无法启动,这时候你可以尝试重复按F8,F8代表以上次正确的环境进入系统,很多时候你无法进入系统就是因为某些特殊的硬件环境发生了改变。所以过去的一年里,我一直使用Windows,偶尔需要linux环境通过虚拟机\云主机\git软件解决(git bash挺好的),而我的时间更多是花在编程上了。但问题还是一直没有被解决:无法往BIOS添加新条目,也就是无法添加开机引导!!!
亟需解决问题
由于跟了导师做项目,需要真正的linux环境,所以维持一年左右的纯Windows环境被打破了。这一次也经历了十几次重装系统,每次都遇到ubuntu下“无法将grub-efi-amd64-signed软件包安装到/target”问题,虽然应用某些技巧可以正常双启动,但在使用ubuntu时时不时会遇到和“grub-efi-amd64-signed”相关的错误或者直接死机了。这使得我十分苦恼。
之后凭借经验和阅读相关文章,我知道是采取GPT分区格式时,需要设置一些参数,才能装好系统。但我不想再装ubuntu了。换了manjaro,一次点亮,成功双启动!除了无法往BIOS添加新条目,其他一切都好了。
但这一切美好,在今天下午又被打破了,我升级了Windows 10系统,估计是个大升级,Windows 10系统自己又多分了一个恢复分区,而EFI里的东西也被更新了,所以我现在只能这样启动系统:
按照正常来说,进入manjaro后,更新grub就可以了,但是“无法往BIOS添加新条目”问题让我无法更新grub!如下:
我尝试把grub装在EFI分区/dev/sdb1
和整个硬盘开头位置/dev/sdb
都不成功。后来我想到了还没挂载,于是我就先挂载,再装grub,但还是失败,原因还是没空间,如下:
猜想问题根源
根据电脑本身一直存在的问题无法往BIOS添加新条目和linux下的报错信息,还有阅读了一些文章帖子帖子1, 帖子2,我终于把我电脑的问题根源和NVROM联想到一起。只是我无法确定:
- 是因为我使用easyuefi对boot引导操作不当/太频繁;
- 还是我重刷了BIOS版本留下了暗病;
- 还是我装太多次电脑对主板NVROM造成了损害;
才最后造成我的NVRAM没有空间写入新条目呢?
怎么解决?
我联系了联想的工程师,把我的情况和linux下的输出信息发送给他们看,得到下面回复(注:本人对联想工程师态度中立,并无黑他们之意,计算机知识很多,不可能都懂,他们没遇到过我的问题是正常的):
还是没解决问题。打算明天去联想售后看一下。
(⊙o⊙)…
今天去了联想3C服务站点,可能是我描述得不清楚,又或者是我遇到的这个问题太过冷门,最后还是没能把我的问题解决。在回来的时候我心绪万千,想着回到宿舍一定要认认真真去学一下UEFI。回到宿舍之后,我内心是有点疲惫的,我想在学习UEFI之前好好google一把,看能不能把我的问题给解决了。果然,望天不负有心人,我找到了Grub installation failed,里面说到了释放NVROM空间的办法!!!由于别人答案已经很好,没必要为了加东西而加东西,我就拿来主义,直接翻译过来给需要的同学看看:
- 为了修补**efibootmgr **错误,我们首先挂载
Boot variables
:
# mount -t efivarfs efivarfs /sys/firmware/efi/efivars
- 然后efibootmgr返回空间不足的信息:
Could not prepare Boot variable: No space left on device
- 删除dump文件(也就是清除NVROM中的无效/垃圾项):
# rm /sys/firmware/efi/efivars/dump-*
- 然后在root模式下(或者普通用户用sudo来更新grub):
update-grub
grub-install -v --target=x86_64-efi --recheck /dev/sda
至此,大功告成!!进入BIOS可以看到相应的启动项了:
一些说明
本文章说的是解决我个人电脑问题的一个大概过程,只供参考,并不一定适用于所有电脑,请理性参考。造成一切后果本人概不负责。