GNU GRUB(簡稱“GRUB”)是一個來自GNU項目的啟動引導程序. GRUB是多啟動規范的實現,它允許用戶可以在計算機內同時擁有多個操作系統,並在計算機啟動時選擇希望運行的操作系統。GRUB可用於選擇操作系統分區上的不同內核,也可用於向這些內核傳遞啟動參數.
GNU GRUB的前身為Grand Unified Bootloader。它主要用於類Unix系統;同大多Linux發行版一樣,GNU系統也采用GNU GRUB作為它的啟動器。Solaris從10 1/06版開始在x86系統上也采用GNU GRUB作為啟動器。
注意:目前 GRUB 分成 GRUB legacy 和 GRUB 2。版本號是 0.9x 以及之前的版本都稱為 GRUB Legacy ,從 1.x 開始的就稱為 GRUB 2
目前 GRUB Legacy 已經停止開發了,只是出於一個修復漏洞的狀態,不再增加新的功能了,所有的開發都轉移到 GURB 2 之上了
GRUB 2 是源自於一個名為 PUPA 的項目,目的是建立下一代的 boot loader
GRUB 2 幾乎是從零開始開始開發的,它和 GRUB Legacy 不同的地方有很多,例如支持 scripts、國際化語言、動態加載模塊、帶有 resuce 模式等等,這些都是 GRUB Legacy 所沒有的
雖然grub2是重寫的grub,但是他借鑒了grub的一些特征,grub2改進如下:
引導配置文件采用新名字grub.cfg,新的語法,加入許多新的命令
grub.cfg 是用grub-mkconfig自動產生的,由update-grub維護,在執行update-grub之前修改的配置都不會 生效,這樣可以很容易的應對內核升級這樣情況。
grub2中的分區號不再是以0開始,而是以1開始。
配置文件是不可寫的,而是修改文件後用命令自動更新
grub2有更可靠的方法在磁盤上有多系統時發現文件和目標內核,可以用命令發現系統設備號或者UUID。
更多的文件系統支持,如ext4 hfs ntfs
grub2可以直接從lvm和raid讀取文件
在grub中的stage1 stage1.5 stage2已經被取消
grub2引入很多設備模塊,允許core鏡像更小
支持腳本,包括簡單的語法
在啟動時沒有選擇菜單的話,按住shift即可強制顯示菜單
可以使用grub-install -v
來查看系統的grub版本
GRUB2引導菜單啟動項是從/boot自動生成的,不是有menu.lst配置的
執行grub-update之後會自動更新啟動項列表,自動添加有效的操作系統項目
分區編號發生變化:第一個分區現在是1而不是0,但第一個設備仍然以0開始計數,如hd0
配置文件的不同更為明顯:
如果您安裝了Ubuntu/linux操作系統和Windows 7/8/10系統組成雙系統.那麼您的Grub啟動選項應該為如下
Ubuntu GNU/Linux Ubuntu操作系統的啟動項
Advabced options for Ubuntu GNU/Linux 高級選項,進入此處可以選擇啟動的內核版本.
memtest86 #內存測試,可以進入此模式運行行一些很耗系統資源的程序,測試系統在高負載的情況下主機是否運行穩定
Windows 7 (loader) (on /dev/sd**) ## /dev/sd**對應你Windows系統所在的分區
grub官方文檔
中文版 info grub
GRUB2配置文件”grub.cfg”詳解(GRUB2實戰手冊)–金步國作品
grub2的組件為grub-pc, 同時grub-common也會默認被安裝,grub2是過渡期的虛擬組件,會被安全移除。
其中grub-install完成如下工作
安裝grub到設備中,如果需要會創建/boot/grub目錄
他會把.mod、.lst、*.img從 /usr/lib/grub/i386-pc/ 目錄復制到/boot/grub目錄下,他會覆蓋已有文件
然後會調用grub_probe掃描計算機並收集磁盤和分區信息
接著調用grub_mkimage構建一個新的new.img
最後調用grub_setup把grub的boot.img寫入MBR中,把core.img寫進設備的第一個扇區。
注意
grub_install並不運行grub_mkconfig
示例
grub-install -v
顯示版本號
grub-install /dev/sda
這表示你希望把grub安裝進/dev/sda(把boot.img寫進第一塊硬盤的MBR),如果由於某些原因你想把grub安裝到單獨的boot分區,可以使用/dev/sdaX,grub2不建議這樣,因為他會減小grub的可靠性,或者其他用戶用grub-install把grub裝進了錯誤的分區導致操作系統的危險性。
grub-install –root-directory=/media/grub2 /dev/sda
創建一個大約60M的分區,用文件系統格式化分區,把他掛載到/media/grub2,/dev/sda是指把stage1寫入MBR
mke2fs /dev/fd0
mount -t ext2 /dev/fd0 /mnt
mkdir /mnt/boot
grub-install --boot-directory=/mnt/boot /dev/fd0
umount /dev/fd0
創建一個軟驅啟動盤
注意
grub-install只是一個腳本,內部真正執行工作的是grub-mkimage和grub-setup,因此你也可以直接用著兩個命令安裝grub,建議還是用grub-install,除非你非常熟悉grub內部
grub2有兩中不同的引導方法,一個是直接加載操作系統,一個是連鎖(chain-load)到另一個boot load,然後再從另一個boot load加載系統,一般來說第一個更常用,但是假如grub不支持所有的操作系統就需要這種方法
grub2的鏡像文件包括
grub legacy的鏡像文件
在早期的Ubuntu版本中,使用grub1作為默認的啟動引導程序,如果想要修改系統啟動菜單,直接編輯/boot/grub/menu.lst即可。
從9.10開始, Ubuntu使用grub2作為默認啟動引導程序, 相對於grub的第一個版本,grub2改動很大。 grub2的新特性主要有:支持圖形化界面,支持主題,模塊化加載,跨平台兼容等,總而言之,功能的加強也使得grub2的配置變得更加復雜了
grub2包含一個完全修改過的配置文件及目錄,menu.list不再使用
grub2采用模塊化的設計,主要配置文件是/boot/grub/grub.cfg,但是這個文件的權限是444,連root也不讓修改,這是刻意為之的,不要修改文件權限,grub.cfg的內容更新由update-grub命令來更新,其實就是執行grub-mkconfig -o /boot/grub/grub.cfg
來更新,此文件會在更新內核自動更新, 在/boot/grub目錄下有很多模塊文件,以在按需時自動加載模塊每段模塊配置的加載以### BEGIN xxx ###開始,以### END xxx ###結尾。
grub2主要有三部分組成:
此文件包含menu.list的前半部分內容,以及每行內核配置後面追加的配置, 在更新時會合並到grub.cfg中
/etc/default/grub控制grub-mkconfig的操作,grub裡面是以鍵值對存在的選項,如果值有空格或者其他字符需要用引號引起來,參數如下
定制自己的/etc/default/grub配置文件, 如下所示
# If you change this file, run 'update-grub' afterwards to update
GRUB_DEFAULT=0
#設置默認啟動項,按menuentry順序如果要默認從第四個菜單項啟動,數字改為3,若改為 saved,則默認為上次啟動項
GRUB_TIMEOUT="10"
#設置進入默認啟動項的等候時間,默認值10秒,按自己需要修改,單位為秒改改為零和負值為無限等待操作
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` #獲得發行版名稱(比如Ubuntu, Debian
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
#選擇啟動的環境,“quiet splash”為圖像界面,“text”為文本界面
#GRUB_CMDLINE_LINUX="noresume"
#手動添加內核啟動參數,比如 acpi=off noapic 等可在這裡添加
# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
#設置是否使用圖形介面。前面有#注釋(使用圖形界面),前面沒有#注釋(僅使用控制台終端,不使用圖形介面) )
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
#設定圖形介面分辨率,如不使用默認。把前面#去掉,把分辨率改為800x600或1024x768
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
#取消注釋以阻止GRUB將傳遞參數 "root=UUID=xxx" 傳遞給 Linux內核
# Uncomment to disable generation of recovery mode menu entrys
#GRUB_DISABLE_LINUX_RECOVERY="true"
#定是否創建修復模式菜單項,前面有#注釋(建立修復模式).前面沒有#注釋(不建立修復模式
# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1" #當GRUB菜單出現時發出鳴音提醒,戶無法看到屏幕特別有用,默認關閉
update-grub命令執行時會讀取此目錄下的文件,並將配置合並至grub.cfg中,grub.cfg中的菜單順序是由此目錄中的文件順序決定的,文件開頭數字較小的會先執行,全英文名字的文件將會在最後執行,自定義選項在40_custom中定義,或者建立一個新文件,此目錄下的文件必須有執行權限才會被update-grub讀取,並把配置合並到grub.cfg中。
主要配置文件是/boot/grub/grub.cfg
但是這個文件的權限是444,連root也不讓修改,這是刻意為之的,不要修改文件權限
grub.cfg的內容更新由update-grub命令來更新, 我們從下圖中看到系統中/boot中安裝了4.2.0-42版本的內核, 而我們update-grub就會發現他們
grub.cfg的內容更新由update-grub命令來更新, 其實就是執行如下操作
備份/boot/grub/menu.lst文件到/boot/grub/menu.lst~, 以防止出錯後無法恢復
讀取系統中安裝的所有內核(一般在/boot目錄下), 然後生成.lst文件
生成grub.cfg, 其實就是執行grub-mkconfig -o /boot/grub/grub.cfg來更新
/etc/default/grub
設置基本的設置信息/boot/grub.d
目錄下有很多模塊文件,以在按需時自動加載模塊. 依照/etc/grub.d
中的各段生成grub.cfg的基本信息, 每段模塊配置的加載以### BEGIN xxx ###開始,以### END xxx ###結尾menu.lst
設置加載的內核的信息在更新內核時會調用update-grub自動更新grub.cfg
文件
sudo gedit /etc/default/grub
修改文件中的:GRUB_TIMEOUT=10 (默認是為10秒的)
修改為:GRUB_TIMEOUT=X (X表示你要設置的秒數,設置為負數為一直等待操作) 修改後保存。終端輸入:
一般來說, update-grub會更新grub並生成grub.cfg
sudo update-grub
當然也可以
sudo grub-mkconfig -o /boot/grub/grub.cfg
sudo gedit /etc/default/grub
修改文件中的GRUB_DEFAULT=0
GRUB_DEFAULT=0 (0默認啟動第1項,如果你的win是第5項,把這個0改為4) 保存文件後終端輸入:
sudo gedit /etc/default/grub
修改文件中的 #GRUB_GFXMODE=640x480
把前面#去掉,把分辨率改為800x600或1024x768(或者修改為你屏幕的分辨率,但前提是分辨率為常見分辨率
補充:深度操作系統2014下還需要同時修改 /var/cache/deepin/grub2.json 文件中的分辨率值,如 “Resolution”:”1024x768”
方法一
建議事先備份sda 的grub:
dd if=/dev/sda of=./mbr.bak bs=512 count=1
這樣子是把你現有的分區跟引導信息保存下來了。找個linux的live進入linux,然後把剛才的mbr.bak還原回去。
dd if=./mbr.bak of=/dev/sda bs=446 count=1
方法二
重裝Grub
備份主要的 Grub2 目錄及文件。
sudo cp /etc/default/grub /etc/default/grub.old
sudo cp -R /etc/grub.d /etc/grub.d.old
sudo cp -R /boot/grub /boot/grub.old
移除 Grub2
sudo apt-get purge grub2 grub-pc
此時,系統在另一啟動裝載程序前將無法啟動。 當這些軟件包被移除後,許多文件還會殘留在“/boot/grub”目錄下。
安裝 Grub Legacy
sudo apt-get install grub
Grub 安裝後,用戶仍需通過運行以下命令來創建 menu.lst 和 stage1/stage2 文件:
sudo update-grub
這一步可以生成 menu.lst 文件。
sudo grub-install /dev/sdX
選擇正確的設備(sda、sdb、sdc),通常為你的深度操作系統所在的磁盤。在 /boot/grub 目錄下創建 stage1 和 stage2 文件並寫入 MBR。運行這一命令來阻止其自動升級:
echo "grub hold" | sudo dpkg --set-selections
更多Ubuntu相關信息見Ubuntu 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=2