原本安裝的是Ubuntu14,但是在使用caffe時總是出錯,所以干脆將Ubuntu從14升級到16,結果整出一堆麻煩。在解決這些麻煩的過程也學習了不少系統啟動的細節。印證了那句話“如何沒有裝過十遍以上的系統就不能說學會了linux”。那么這是我的第二遍了,我也准備迎接剩下的八遍了。
下面我會從幾個方面講起
- 安裝過程
- 系統啟動
- grub常用命令
- 我的解決方案
安裝過程
ubuntu安裝的詳細過程參見我的另一篇博客——安裝win8+Ubuntu14.04雙系統的經驗總結 - 上官棟 - 博客園,這里不過多討論了。我一開始是從liveUSB升級的方法安裝ubuntu16,但是啟動電腦的時候直接黑屏了,我以為失敗了。接着又嘗試自定義分區的方式重新安裝,結果又黑屏了。然后在開機時進入BIOS調整啟動順序進入windows,把載有ubuntu的盤格式化之后,在用easyBCD重寫了MBR,重新安裝ubuntu16。為了以防萬一,我又下載了ubuntu的最新版重新制作啟動盤。這樣相當於重裝一次雙系統,我想這樣應該不會出錯了吧。結果又黑屏了。之后又嘗試了幾種不同的安裝方法,結果都會進入這個命令行的界面。
等到我實在找不到可行的辦法才開始認真琢磨這個命令行界面是怎回事。一番搜索之后才認識到我進入了grub的命令行。也終於跳出了反復裝系統的死循環。
系統啟動
想要明白grub是什么,必須要明白開機啟動的過程。這里推薦一篇博客計算機的啟動過程(詳細) - CSDN博客。講得比我要詳細的多。
系統在啟動時會先從BIOS中讀取程序,這些程序用於硬件檢測,環境初始化。同時BIOS也存儲了用戶設定的啟動順序,例如從硬盤A,硬盤B,光驅,優盤等不同硬件啟動。按照順序,計算機會檢測這些硬件是否裝載了操作系統(比較其放置MBR的位置的結尾兩位是否為0xAA55)。如果裝載了,就會讀入這個設備第一個分區的程序,也就是主引導記錄(MBR)。
到這里還不是操作系統的程序。MBR的作用是告訴計算機操作系統存儲在我這個存儲器的那個分區上。如果操作系統裝在主分區上,計算機就會根據卷引導記錄查找到分區中具體的位置,裝載入操作系統。如果在邏輯分區,那么就從擴展分區中依次查找,直到找到操作系統。不過要是有兩個操作系統呢?那么這個MBR就不能滿足要求了。因為他不提供選擇的功能,程序只能加載一個操作系統。為了適應計算機結構的發展,Intel又對BIOS+MBR做了改進,提出了EFI+GPT的結構。EFI可以支持32位,64位指令,硬件接口可擴展,采用C語言的堆棧架構,容易跨平台,也容易開發。GPT采用新的分區方式,可以有多個主分區,硬盤容量上限突破2T。
如果我們想在一個硬盤里面裝兩個操作系統應該怎么辦?無論是BIOS+MBR還是EFI+GPT似乎都不支持這種設定。有一種方法是修改MBR或者GPT中的操作系統指向,讓其指向一個小的操作系統(mini OS),也就是現在常用的grub和LILO。這個mini OS的功能主要是讓用戶選擇操作系統,但是實際上他的功能和權限遠遠超過這個要求。你完全可以在grub下訪問硬盤中的文件。
通過grub這種mini OS就可以選擇我們需要的操作系統了,到這里終於算是啟動成功了。
grub常用指令
通過系統啟動中的說明,我們明白了grub就是引導計算選擇操作系統的mini OS。作為OS就會有指令,下面介紹一些:
set:設置常量,例如“set root=(hd0,0)”就是講root設置為hd0,0。如果只輸入“set”,就可以看到環境中常量,注意root和prefix的值,這兩個量很重要,分別指ubunto系統目錄和grub所在目錄,啟動失敗主要是這兩個變量錯誤。
linux:內核加載命令,例如“linux /boot/vmlinuz-3.13.0-29-generic root=/dev/sda1”
initrd:鏡像文件加載命令,例如“initrd /boot/initrd.img-3.13.0-29-generic”
insmod:啟動模式選擇,例如“insmod/boot/grub/i386-pc/normal.mod”
boot:啟動
exit:退出
normal:進入normal.mod
cat:查看文件
ls:列出目錄下的文件
我的解決方案
其實在一開始進入grub界面只是一些參數錯誤,操作系統並沒有什么問題。但是不熟悉命令行操作的我本能的認為一定是安裝出現了錯誤。結果一開始就沒有正確的認識問題的根源,花了很多不必要的時間。以后還是應該習慣去使用命令行,這才是與機器打交道的正確方法。
出現黑屏的原因是grub環境變量中root和prefix設置錯誤,我的ubuntu安裝在/dev/sda11,在grub是(hd0,gpt11)。但是root變量卻是(hd0,gpt2),這是windows所在的分區。這樣就導致grub不能加載grub的選擇界面,也不能加載ubuntu的內核。針對此有三種解決方案
一、進入選擇界面
輸入命令
set root=(hd0,11)
set prefix=(hd0,11)/boot/grub
insmod /boot/grub/i386-pc/normal.mod
normal
經過反復的實驗,其實輸入下面的命令也是可以的
prefix=(hd0,11)/boot/grub
normal
也就是問題的關鍵在於讓grub找到grub.cfg引導文件。這樣就可以進入系統選擇界面。
二、加載linux內核
輸入命令
set root=(hd0,11)
linux (hd0,11)/boot/vmlinuz-3.13.0-29-generic root=/dev/sda11
initrd (hd0,11)/boot/initrd.img-3.13.0-29-generic
boot
這段命令是讓系統加載ubuntu的內核,直接進圖ubuntu,不經過選擇界面
三、加載windows系統
輸入exit退出grub,選擇windows boot manager,加載windows系統
在進入ubuntu之后,有人建議輸入命令
update-grub
grub-install /dev/sda
用來更新grub。但我的問題是grub在啟動時的環境變量錯誤。這種方法也試過,但問題沒有解決。所以現在每次開機要輸入一些命令。不過現在我不想折騰了,就當做密碼長一點吧。以后再裝系統時一起解決吧。
2018年3月2日更新:
在安裝
