記一次關於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(機械硬盤里);

然后按下面步驟干活:

  1. 用U盤EFI里的引導程序進入硬盤上的MAC OS系統;
  2. 在MAC OS里,先把固態下EFI里的Windows引導程序和ubuntu引導程序備份好;
  3. 再把U盤上EFI分區的EFI文件復制到電腦上的EFI分區里,最后再把開始你備份的固態下EFI里的Windows引導程序和ubuntu引導程序復制進clover文件夾里。

理論上你進入其他系統也能將U盤EFI分區里的文件復制到固態里的EFI分區里,但由於mac os下掛在efi分區比較方便,我一直是在mac os里對efi進行復制移動文件操作

做到這里,如果你沒有U盤,你是進不去電腦上的系統,你得再借助U盤進入Windows系統,然后借助easyuefi把clover引導條目添加到BIOS啟動項目里,這時候,不需要U盤,你也能進入電腦中任何一個系統了。
啟動界面大概這樣:

然而成功點亮系統只是第一步,黑蘋果里面的很多驅動,得自己修改源碼(當然有教程),才能繼而點亮驅動。所以,之后的幾乎一年里,我基本上都在搞三系統。也就是在這段時間里:

  1. 我意識到英語十分重要,花了很大功夫在學習英語里;
  2. 解決事情之前,你需要良好的知識背景才能讓你想出清晰正確的思路;

開始遇到問題!

同時也是裝三系統那段時間里,我的電腦固態壞了,聯想售后給我免費換了一條。也就是這個時候,我的電腦無法再次寫入新條目(也就是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聯想到一起。只是我無法確定:

  1. 是因為我使用easyuefi對boot引導操作不當/太頻繁;
  2. 還是我重刷了BIOS版本留下了暗病;
  3. 還是我裝太多次電腦對主板NVROM造成了損害;

才最后造成我的NVRAM沒有空間寫入新條目呢?


怎么解決?

我聯系了聯想的工程師,把我的情況和linux下的輸出信息發送給他們看,得到下面回復(注:本人對聯想工程師態度中立,並無黑他們之意,計算機知識很多,不可能都懂,他們沒遇到過我的問題是正常的):

還是沒解決問題。打算明天去聯想售后看一下。

(⊙o⊙)…

今天去了聯想3C服務站點,可能是我描述得不清楚,又或者是我遇到的這個問題太過冷門,最后還是沒能把我的問題解決。在回來的時候我心緒萬千,想着回到宿舍一定要認認真真去學一下UEFI。回到宿舍之后,我內心是有點疲憊的,我想在學習UEFI之前好好google一把,看能不能把我的問題給解決了。果然,望天不負有心人,我找到了Grub installation failed,里面說到了釋放NVROM空間的辦法!!!由於別人答案已經很好,沒必要為了加東西而加東西,我就拿來主義,直接翻譯過來給需要的同學看看:

  1. 為了修補**efibootmgr **錯誤,我們首先掛載Boot variables:
    # mount -t efivarfs efivarfs /sys/firmware/efi/efivars
  2. 然后efibootmgr返回空間不足的信息:
    Could not prepare Boot variable: No space left on device
  3. 刪除dump文件(也就是清除NVROM中的無效/垃圾項):
    # rm /sys/firmware/efi/efivars/dump-*
  4. 然后在root模式下(或者普通用戶用sudo來更新grub):
    update-grub
    grub-install -v --target=x86_64-efi --recheck /dev/sda

至此,大功告成!!進入BIOS可以看到相應的啟動項了:


一些說明

本文章說的是解決我個人電腦問題的一個大概過程,只供參考,並不一定適用於所有電腦,請理性參考。造成一切后果本人概不負責。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM