WP_20140325_004話說,前兩天給Win8.1安裝了更新之後,Ubuntu就無法boot了,那症狀看起來是bios完全無視ubuntu的uefi boot option,後來才想起來微軟自從Win8開始正式導入pure uefi環境之後,會在某些情況下擅自亂改uefi boot variable;於是我去下載uefi shell,執行dmpstore boot0*,一看,Boot####全部往後shift,而且ubuntu的boot option的attributes也被改了,果然又是微軟沒事在惡搞....囧....

為了修正uefi boot variable,我重灌一次ubuntu在相同的磁碟分割上,重建ubuntu的uefi boot option,然後再透過dd指令把先前備份的"EFI Boot Partition"和root的內容寫回先前的狀態。

dd if=/MyBackup/sda11_back.img of=/dev/sda11 // 寫回root,我裝在sda11
dd if=/MyBackup/sda7_back.img of=/dev/sda7 // 寫回"EFI Boot Partition",我裝在sda7

結果,ubuntu的boot option能用了,但開不進ubuntu,只看到一串白底黑字寫著
"...Minimal Bash-like line editing is supported...",不曉得是找不到grub還是找不到root的位置。

google了一陣子後,找到這邊提供的步驟,可以從Minimal Bash-like開進ubuntu:

linux (hd0,gpt11)/boot/vmlinuz-3.11.0-18-generic.efi.signed root=/dev/sda11
initrd (hd0,gpt11)/boot/initrd.img-3.11.0-18-generic
boot

(hd0,gpt11)就是我唯一一顆硬碟的sda11,也就是我安裝root的分割,如果不確定root在哪個分割,可以用ls指令去一個個查:

ls (hdX,gptXX)/  

XXXX-3.11.0-18-XXXX則是linux kernel的檔案。

執行完這些指令後,順利開進ubuntu,圖形界面、資料和應用程式都健在完好,這表示之前的dd有作用,但就不明白為何會出現好像找不到root位置的現象;總之又是一陣google後,我安裝Boot Repair並執行"Recommended repair",順利完成修復,但是結果報告又說ubuntu的boot loader被放在sda1,可是我的"EFI Boot Partition"放在sda7,於是我就再手動把sda1/EFI/複製到sda7去(事後實驗發現沒這必要),重開機,鏘鏘~順利進入grub,順利進入ubuntu,不用重灌重裝重設定,一切復原~

追根究底這次事件是微軟透過更新惡搞uefi boot variable所引起的,但我不太可能不去更新win8.1,所以下次還是有可能又被微軟惡搞,下次再遇上,我想我會先試著從live usb ubuntu執行Boot Repair,看能不能直接重建uefi boot variable,不行的話,那還是得整個流程再跑一次了....囧

PS.1
似乎,ubuntu重裝時,即使指定bootloader要裝在自己另外切的"EFI Boot Partition",ubuntu也仍然會把bootloader裝到win8.1所在的分割去,若是如此,那表示我去dd sda7根本搞錯地方,應該直接cp sda1/EFI/ubuntu/,等安裝完再cp回去。

 

相关文章