天天看點

記一次關于NVROM中遇到的“Could not prepare Boot variable:No space left on device”問題的解決曆程

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版本是這樣:

記一次關于NVROM中遇到的“Could not prepare Boot variable:No space left on device”問題的解決曆程

開始進入裝雙系統的“坑”

裝雙系統向來比較流行,大概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(固态裡);
    記一次關于NVROM中遇到的“Could not prepare Boot variable:No space left on device”問題的解決曆程
  • 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盤,你也能進入電腦中任何一個系統了。

啟動界面大概這樣:

記一次關于NVROM中遇到的“Could not prepare Boot variable:No space left on device”問題的解決曆程

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

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

開始遇到問題!

同時也是裝三系統那段時間裡,我的電腦固态壞了,聯想售後給我免費換了一條。也就是這個時候,我的電腦無法再次寫入新條目(也就是BIOS裡無法添加新的Boot引導)。我到現在都無法判斷,為什麼無論我重裝了多少次電腦,還是不能在BIOS裡寫入新的條目,哪怕我隻裝Windows系統,也不行。

為了測試,我把電腦機械硬碟拆下來,把固态硬碟重新格式化,重新分區,然後再重裝Windows 10系統,還是不行,無法在BIOS啟動項裡添加新條目,大概就是下面這樣:

記一次關于NVROM中遇到的“Could not prepare Boot variable:No space left on device”問題的解決曆程

但如上圖所示,雖然說不能在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裡的東西也被更新了,是以我現在隻能這樣啟動系統:

記一次關于NVROM中遇到的“Could not prepare Boot variable:No space left on device”問題的解決曆程

按照正常來說,進入manjaro後,更新grub就可以了,但是“無法往BIOS添加新條目”問題讓我無法更新grub!如下:

記一次關于NVROM中遇到的“Could not prepare Boot variable:No space left on device”問題的解決曆程
記一次關于NVROM中遇到的“Could not prepare Boot variable:No space left on device”問題的解決曆程

我嘗試把grub裝在EFI分區

/dev/sdb1

和整個硬碟開頭位置

/dev/sdb

都不成功。後來我想到了還沒挂載,于是我就先挂載,再裝grub,但還是失敗,原因還是沒空間,如下:

記一次關于NVROM中遇到的“Could not prepare Boot variable:No space left on device”問題的解決曆程

猜想問題根源

根據電腦本身一直存在的問題無法往BIOS添加新條目和linux下的報錯資訊,還有閱讀了一些文章文章文章1, 文章2,我終于把我電腦的問題根源和NVROM聯想到一起。隻是我無法确定:

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

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

怎麼解決?

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

記一次關于NVROM中遇到的“Could not prepare Boot variable:No space left on device”問題的解決曆程

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

(⊙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可以看到相應的啟動項了:

一些說明

本文章說的是解決我個人電腦問題的一個大概過程,隻供參考,并不一定适用于所有電腦,請理性參考。造成一切後果本人概不負責。