记一次关于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可以看到相应的启动项了:
一些说明
本文章说的是解决我个人电脑问题的一个大概过程,只供参考,并不一定适用于所有电脑,请理性参考。造成一切后果本人概不负责。
记一次关于NVROM中遇到的“Could not prepare Boot variable:No space left on device”问题的解决历程的更多相关文章
- Nancy总结(二)记一次Nancy 框架中遇到的坑
记一次Nancy 框架中遇到的坑 前几天,公司一个项目运行很久的Nancy框架的网站,遇到了一个很诡异的问题.Session 对象跳转到另外一个页面的时候,session对象被清空了,导致用户登录不上 ...
- 记一次SpringBoot 开发中所遇到的坑和解决方法
记一次SpringBoot 开发中所遇到的坑和解决方法 mybatis返回Integer为0,自动转型出现空指针异常 当我们使用Integer去接受数据库中表的数据,如果返回的数据中为0,那么Inte ...
- eclipse中tomcat无法加载spring boot
转自: http://blog.csdn.net/u010797575/article/details/50517777 最近搭建一套spring boot框架,作为 application 启动项目 ...
- XP系统中IIS访问无法显示网页,目前访问网站的用户过多。终极解决办法
无法显示网页 目前访问网站的用户过多. -------------------------------------------------------------------------------- ...
- Perl Tk在IC设计中的应用、Windows、Linux平台下的安装-各种错误的摸索解决
本文转自:自己的微信公众号<集成电路设计及EDA教程> <Perl Tk在IC设计中的应用.Windows.Linux平台下的安装-各种错误的摸索解决> Perl在IC设计中有 ...
- node 在centos 6.5 上 安装过程中出现/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.19' not found问题的解决
node 在centos 6.5 上 安装过程中出现/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.19' not found问题的解决 在linux ...
- 记一次WinForm程序中主进程打开子进程并传递参数的操作过程(进程间传递参数)
目标:想在WinForm程序之间传递参数.以便子进程作出相应的处理. 一种错误的方法 父进程的主程序: ProcessStartInfo psi = new ProcessStartInfo(); p ...
- 记一次在java中的日期parse错误
String dateString = "2014101517"; new SimpleDateFormat("yyyyMMddHH").parse(dateS ...
- 记OC迁移至swift中笔记20tips
写久了OC后来写swift,总感觉写着是swift的皮毛,但是实际上是OC的核心,这里整理了OC迁移至swift中的一些小细节. 1 在当前类中,实例方法调用属性以及方法都可以将self省略掉,而且是 ...
随机推荐
- django之反向解析和命名空间
背景:当我们页面中存放的请求路径与url文件中的url一致时,如果url改了是不是所有的请求路径都要跟着改?显然不现实,这里我们就要用到反向解析. 如下图所示,输入url后会跳转到登录页面,输入用户名 ...
- tp5 配置 // 视图输出字符串内容替换 'view_replace_str' 的原理
- 使用js制作 下拉选择日期列表 (即日期选择器)
上代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <tit ...
- 忘记SYS密码
进入控制台录入 sqlplus /nolog; connect / as sysdba alter user sys identified by ; alter user system ident ...
- ASP.NET Core搭建多层网站架构【1-项目结构分层建立】
2020/01/26, ASP.NET Core 3.1, VS2019 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[1-项目结构分层建立] 文章目录 此分支项目代码 ...
- 「JSOI2015」字符串树
「JSOI2015」字符串树 传送门 显然可以树上差分. 我们对于树上每一条从根出发的路径都开一 棵 \(\text{Trie}\) 树,那么我们就只需要在 \(\text{Trie}\) 树中插入一 ...
- linu后台执行py文件和关闭的后台py文件
后台执行py nohup python xxx.py 关闭后台执行py 查看进程pid ps -aux|grep main.py 根据pid关闭关闭进程 kill -9 (pid)
- char **argv 与char *argv[]
1.char **argv 分析:argv是一个指针变量,argv的指向(*argv)是char *,也就是argv指向的也是一个指针 : *argv的指向(**argv)是char. 2.char ...
- @ModelAttribute与@RequestBody的区别
一.@ModelAttribute与@RequestBody的区别 @ModelAttribute与@RequestBody都是用来注解解析前端发来数据,并自动对应到所定义的字段名称. 这里先放结论, ...
- 不是充许的静态以太网地址,它与vmware保留的mac地址冲突
不是充许的静态以太网地址,它与vmware保留的mac地址冲突 只需修改vxm文件即可. 第一部,打开vmw的镜像位置,如图. 点击后,打开硬盘,如下 把这个vmx结尾的文件下载,在本地编辑,可用tx ...