如何設定並排除 GRUB故障
本文將會向你介紹 GRUB 的知識,並會說明你為什麼需要一個引導程序,以及它是如何為系統增加功能的。
Linux 開機過程 是從你按下你的電腦電源鍵開始,直到你擁有一個全功能的系統為止,整個過程遵循著這樣的主要步驟:
- 1. 一個叫做 POST(上電自我檢測)的過程會對你的電腦硬體元件做全面的檢查。
- 2. 當POST 完成後,它會把控制權轉交給引導程序,接下來引導程式會將Linux 核心(以及initramfs)載入到記憶體中並執行。
- 3. 核心首先檢查並存取硬件,然後運行初始化進程(主要以它的通用名稱 init 而為人所知),接下來初始化進程會啟動一些服務,最後完成系統啟動過程。
在系列的第七講(「SysVinit、Upstart 和 Systemd」)中,我們介紹了現代 Linux 發行版所使用的一些服務管理系統和工具。在繼續學習之前,你可能會想回顧一下那一講的知識。
GRUB 引導程式介紹在現代系統中,你會發現有兩種主要的GRUB 版本(一種是有時被稱為GRUB Legacy 的v1 版本,另一種則是v2 版本),雖然說多數最新版本的發行版系統都預設使用了v2 版本。如今,只有 紅帽企業版 Linux 6 及其衍生系統仍在使用 v1 版本。
因此,在本指南中,我們將專注於 v2 版本的功能。
不管 GRUB 的版本是什麼,一個引導程式都允許使用者:
- 透過指定使用不同的核心來修改系統的行為;
- 從多個作業系統中選擇一個啟動;
- 新增或編輯配置區塊來改變啟動選項等。
如今,GNU 專案負責維護 GRUB,並在它們的網站上提供了豐富的文件。當你在閱讀這篇指南時,我們強烈建議你看下 GNU 官方文件。
當系統引導時,你會在主控制台看到如下的 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 目錄中的檔案來更新。
在 CentOS 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 启动画面默认选择启动的操作系统或内核条目。我们既可以通过上述启动画面查看启动条目列表,也可以使用下面的命令:
在 CentOS 和 openSUSE 系统上# 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,它是用来给内核传递选项的。我们可以在 内核变量文件 和 man 7 bootparam 中找到能够通过 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 传递的选项仅在当前会话期间有效。
修复 Linux 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 菜单中,选择一个条目并按下回车键以使用它启动。一旦系统成功启动后,你就可以运行 grub2-install /dev/sdX 命令修复问题了(将 sdX 改成你想要安装 GRUB 的设备)。然后启动信息将会更新,并且所有相关文件都会得到恢复。
# grub2-install /dev/sdX
其它更加复杂的情景及其修复建议都记录在 Ubuntu GRUB2 故障排除指南 中。该指南中阐述的概念对于其它发行版也是有效的。
总结本文向你介绍了 GRUB,并指导你可以在何处找到线上和线下的文档,同时说明了如何面对由于引导加载相关的问题而导致系统无法正常启动的情况。
幸运的是,GRUB 是文档支持非常丰富的工具之一,你可以使用我们在文中分享的资源非常轻松地获取已安装的文档或在线文档。
你有什么问题或建议吗?请不要犹豫,使用下面的评论框告诉我们吧。我们期待着来自你的回复!
以上是如何設定並排除 GRUB故障的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

VS Code 系統要求:操作系統:Windows 10 及以上、macOS 10.12 及以上、Linux 發行版處理器:最低 1.6 GHz,推薦 2.0 GHz 及以上內存:最低 512 MB,推薦 4 GB 及以上存儲空間:最低 250 MB,推薦 1 GB 及以上其他要求:穩定網絡連接,Xorg/Wayland(Linux)

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

vscode 內置終端是一個開發工具,允許在編輯器內運行命令和腳本,以簡化開發流程。如何使用 vscode 終端:通過快捷鍵 (Ctrl/Cmd ) 打開終端。輸入命令或運行腳本。使用熱鍵 (如 Ctrl L 清除終端)。更改工作目錄 (如 cd 命令)。高級功能包括調試模式、代碼片段自動補全和交互式命令歷史。

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

VS Code 終端命令無法使用的原因及解決辦法:未安裝必要的工具(Windows:WSL;macOS:Xcode 命令行工具)路徑配置錯誤(添加可執行文件到 PATH 環境變量中)權限問題(以管理員身份運行 VS Code)防火牆或代理限制(檢查設置,解除限制)終端設置不正確(啟用使用外部終端)VS Code 安裝損壞(重新安裝或更新)終端配置不兼容(嘗試不同的終端類型或命令)特定環境變量缺失(設置必要的環境變量)
