如何配置並排除 GRUB故障
本文將會向你介紹 GRUB 的知識,並會說明你為什麼需要一個引導載入程式,以及它是如何給系統增加功能的。
是從你按下你的電腦電源鍵開始,直到你擁有一個全功能的系統為止,整個過程遵循著這樣的主要步驟:
- 1. 一個叫做 POST( 上電自檢)的過程會對你的電腦硬體元件做全面的檢查。
- 2. 當 POST 完成後,它會把控制權轉交給引導載入程式,接下來引導載入程式會將 核心(以及 initramfs)載入到記憶體中並執行。
- 3. 核心首先檢查並訪問硬體,然後執行初始化程式(主要以它的通用名 init 而為人熟知),接下來初始化程式會啟動一些服務,最後完成系統啟動過程。
在該系列的第七講(“ ”)中,我們介紹了現代 Linux 發行版使用的一些服務管理系統和工具。在繼續學習之前,你可能想要回顧一下那一講的知識。
在現代系統中,你會發現有兩種主要的 GRUB 版本(一種是有時被稱為 GRUB Legacy 的 v1 版本,另一種則是 v2 版本),雖說多數最新版本的發行版系統都預設使用了 v2 版本。如今,只有 企業版 Linux 6 及其衍生系統仍在使用 v1 版本。
因此,在本指南中,我們將著重關注 v2 版本的功能。
不管 GRUB 的版本是什麼,一個引導載入程式都允許使用者:
- 透過指定使用不同的核心來修改系統的行為;
- 從多個作業系統中選擇一個啟動;
- 新增或編輯配置區塊來改變啟動選項等。
如今, GNU 專案負責維護 GRUB,並在它們的網站上提供了豐富的文件。當你在閱讀這篇指南時,我們強烈建議你看下 。
當系統引導時,你會在主控制檯看到如下的 GRUB 畫面。最開始,你可以根據提示在多個核心版本中選擇一個核心(預設情況下,系統將會使用最新的核心啟動),並且可以進入 GRUB 行模式(使用 c 鍵),或者編輯啟動項(按下 e 鍵)。
GRUB 啟動畫面
你會考慮使用一箇舊版核心啟動的原因之一是之前工作正常的某個硬體裝置在一次升級後出現了“怪毛病(acting up)”(例如,你可以參考 AskUbuntu 論壇中的 )。
在啟動時會從 /boot/grub/grub.cfg 或 /boot/grub2/grub.cfg 檔案中讀取 GRUB v2 的配置檔案,而 GRUB v1 使用的配置檔案則來自 /boot/grub/grub.conf 或 /boot/grub/menu.lst。這些檔案 不應該直接手動編輯,而應透過 /etc/default/grub 的內容和 /etc/grub.d 目錄中的檔案來更新。
在 7 上,當系統最初完成安裝後,會生成如下的配置檔案:
GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet" GRUB_DISABLE_RECOVERY="true"
除了線上文件外,你也可以使用下面的 查閱 GNU GRUB 手冊:
# info grub
如果你對 /etc/default/grub 檔案中的可用選項特別感興趣的話,你可以直接查閱配置一節的幫助文件:
# info -f grub -n 'Simple configuration'
使用上述命令,你會發現 GRUB_TIMEOUT 用於設定啟動畫面出現和系統自動開始啟動(除非被使用者中斷)之間的時間。當該變數值為 -1 時,除非使用者主動做出選擇,否則不會開始啟動。
當同一臺機器上安裝了多個作業系統或核心後, GRUB_DEFAULT 就需要用一個整數來指定 GRUB 啟動畫面預設選擇啟動的作業系統或核心條目。我們既可以透過上述啟動畫面檢視啟動條目列表,也可以使用下面的命令:
# awk -F/' '$1=="menuentry " {print $2}' /boot/grub2/grub.cfg
# awk -F/' '$1=="menuentry " {print $2}' /boot/grub/grub.cfg
如下圖所示的例子中,如果我們想要使用版本為 3.10.0-123.el7.x86_64 的核心(第四個條目),我們需要將 GRUB_DEFAULT 設定為 3(條目從零開始編號),如下所示:
GRUB_DEFAULT=3
使用舊版核心啟動系統
最後一個需要特別關注的 GRUB 配置變數是 GRUB_CMDLINE_LINUX,它是用來給核心傳遞選項的。我們可以在 核心變數檔案 和 中找到能夠透過 GRUB 傳遞給核心的選項的詳細文件。
我的 CentOS 7 伺服器上當前的選項是:
GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet"
為什麼你希望修改預設的核心引數或者傳遞額外的選項呢?簡單來說,在很多情況下,你需要告訴核心某些由核心自身無法判斷的硬體引數,或者是覆蓋一些核心檢測的值。
不久之前,就在我身上發生過這樣的事情,當時我在自己已用了 10 年的老筆記本上嘗試了衍生自 Slackware 的 Vector Linux。完成安裝後,核心並沒有檢測出我的顯示卡的正確配置,所以我不得不透過 GRUB 傳遞修改過的核心選項來讓它工作。
另外一個例子是當你需要將系統切換到單使用者模式以執行維護工作時。為此,你可以直接在 GRUB_CMDLINE_LINUX 變數中直接追加 single 並重啟即可:
GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet single"
編輯完 /etc/default/grub 之後,你需要執行 update-grub (在 Ubuntu 上)或者 grub2-mkconfig -o /boot/grub2/grub.cfg (在 CentOS 和 openSUSE 上)命令來更新 grub.cfg 檔案(否則,改動會在系統啟動時丟失)。
這條命令會處理早先提到的那些啟動配置檔案來更新 grub.cfg 檔案。這種方法可以確保改動持久化,而在啟動時刻透過 GRUB 傳遞的選項僅在當前會話期間有效。
如果你安裝了第二個作業系統,或者由於人為失誤而導致你的 GRUB 配置檔案損壞了,依然有一些方法可以讓你恢復並能夠再次啟動系統。
在啟動畫面中按下 c 鍵進入 GRUB 命令列模式(記住,你也可以按下 e 鍵編輯預設啟動選項),並可以在 GRUB 提示中輸入 help 命令獲得可用命令:
修復 Linux 的 Grub 配置問題
我們將會著重關注 ls 命令,它會列出已安裝的裝置和檔案系統,並且我們將會看看它查詢到的東西。在下面的圖片中,我們可以看到有 4 塊硬碟( hd0 到 hd3)。
貌似只有 hd0 已經分割槽了(msdos1 和 msdos2 可以證明,這裡的 1 和 2 是分割槽號,msdos 則是分割槽方案)。
現在我們來看看能否在第一個分割槽 hd0( msdos1)上找到 GRUB。這種方法允許我們啟動 Linux,並且使用高 級工具修復配置檔案,或者如果有必要的話,乾脆重新安裝 GRUB:
# ls (hd0,msdos1)/
從高亮區域可以發現, grub2 目錄就在這個分割槽:
查詢 Grub 配置
一旦我們確信了 GRUB 位於 ( hd0, msdos1),那就讓我們告訴 GRUB 該去哪兒查詢它的配置檔案並指示它去嘗試啟動它的選單:
set prefix=(hd0,msdos1)/grub2 set root=(hd0,msdos1) insmod normal normal
查詢並啟動 Grub 選單
然後,在 GRUB 選單中,選擇一個條目並按下Enter鍵以使用它啟動。一旦系統成功啟動後,你就可以執行 grub2-install /dev/sdX 命令修復問題了(將 sdX 改成你想要安裝 GRUB 的裝置)。然後啟動資訊將會更新,並且所有相關檔案都會得到恢復。
# grub2-install /dev/sdX
其它更加複雜的情景及其修復建議都記錄在 中。該指南中闡述的概念對於其它發行版也是有效的。
本文向你介紹了 GRUB,並指導你可以在何處找到線上和線下的文件,同時說明了如何面對由於引導載入相關的問題而導致系統無法正常啟動的情況。
幸運的是,GRUB 是文件支援非常豐富的工具之一,你可以使用我們在文中分享的資源非常輕鬆地獲取已安裝的文件或線上文件。
你有什麼問題或建議嗎?請不要猶豫,使用下面的評論框告訴我們吧。我們期待著來自你的回覆!
via:
作者: 譯者: 校對:
本文由 原創翻譯, 榮譽推出
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2987829/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- GRUB 配置
- Linux 硬體故障排除指南Linux
- windows10系統如何禁用推薦故障排除Windows
- 網路故障排除工具 | 快速定位網路故障
- 配置 GRUB2
- WebSphere 叢集建立及故障排除Web
- 故障排除 | enq:TX - index contention等待事件ENQIndex事件
- Kubernetes故障排除的直觀指南 - Daniele Polencic
- 通過redis的monitor命令排除故障Redis
- Linunx系統引導過程及MBR/GRUB故障
- 掌握 Kubernetes 故障排除技巧:kubectl命令的基本指南
- 故障排除-丟包嚴重的抓包解決
- 故障排除提示:5 個最常見的 Linux 問題Linux
- Longhorn 雲原生容器分散式儲存 - 故障排除指南分散式
- Sentry 監控 - 私有 Docker Compose 部署與故障排除詳解Docker
- 串列埠通訊常見的錯誤和故障排除方法串列埠
- 故障排除指南:MySQL執行記憶體不足怎麼辦?MySql記憶體
- 我的網站被黑了,該如何排除漏洞並修復安全問題網站
- Maven什麼時候需要排除依賴,如何排除依賴Maven
- linux 壓縮目錄並排除某個目錄Linux
- Elasticsearch 磁碟空間異常:一次成功的故障排除案例分享Elasticsearch
- NetNORAD:通過端到端探測對網路進行故障排除
- 如何使用grep命令的排除功能
- Linux: GRUBLinux
- 掌握 Kubernetes 故障排除:有效維護叢集的優秀實踐和工具
- DBA:這有一份對接NBU備份故障排除指南,請查收!
- 國外裝置故障如何快速知曉並進行維護
- 設定grub配置檔案中的螢幕解析度
- 【Linux小知識】在排除網路故障時,這些命令一定要會!Linux
- 多種網路裝置的優缺點及網路故障的排除方法
- 對抗測試-軍用裝置的有效射頻測試和故障排除
- Sentry(v20.12.1) K8S 雲原生架構探索,SENTRY FOR JAVASCRIPT 故障排除K8S架構JavaScript
- grub 命令使用
- datart非Docker映象如何部署並配置截圖Docker
- 如何下載Junit並在eclipse上配置JunitEclipse
- 如何使用 Ansible 配置 Vim並安裝外掛
- 雲資料庫的雲端故障排除策略:關鍵技術與實施方案資料庫
- 頻發:故障排除之又見 ORA-4031丨雲和恩墨技術通訊