GRUB是Linux系统中最重要的引导加载程序,它负责在计算机启动时加载操作系统内核。作为一个每天都在和Linux打交道的运维人员,我深知GRUB问题有多让人头疼。系统突然无法启动、开机直接进入命令行、双系统找不到Windows,这些问题我都经历过无数次。本文将从实战角度,分享GRUB Linux的常见问题解决方法。
如何修复grub引导
当系统启动时直接进入grub rescue模式,说明GRUB引导文件丢失或损坏。这种情况通常发生在安装Windows后覆盖了MBR,或者误删了/boot分区。首先输入ls命令查看所有分区,找到Linux安装分区,比如(hd0,msdos1)。然后依次执行set root=(hd0,msdos1)、set prefix=(hd0,msdos1)/boot/grub、insmod normal、normal命令grub linux,就能临时启动系统。

进入系统后立即修复GRUB。Ubuntu或Debian系统使用update-grub命令重新生成配置文件,再执行grub-install /dev/sda将GRUB安装到硬盘主引导记录。如果是CentOS或RHEL系统,则使用grub2-mkconfig -o /boot/grub2/grub.cfg和grub2-install /dev/sda。修复完成后重启测试,确保引导恢复正常。
grub配置文件在哪
GRUB的主配置文件是grub.cfg,位于/boot/grub或/boot/grub2目录下。这个文件由系统自动生成,包含启动菜单、内核参数、默认启动项等所有设置。但千万不要直接编辑这个文件,因为每次更新内核或执行update-grub时都会被覆盖。

真正需要修改的是/etc/default/grub文件,这里面定义了GRUB的基本配置参数。比如设置默认启动项GRUB_DEFAULT=0,调整启动菜单等待时间GRUB_TIMEOUT=5,添加内核启动参数等。修改完成后运行update-grub,系统会根据这个文件和/etc/grub.d/目录下的脚本重新生成grub.cfg。
grub命令行怎么用
开机时按Shift键或Esc键进入GRUB菜单,再按C键就能进入GRUB命令行环境。这个环境虽然简陋,但功能强大,是修复系统的最后防线。首先要熟悉ls命令查看所有设备和分区linux定时关机命令,cat命令读取文件内容,insmod加载必要模块。比如想启动系统,先找到内核和initrd文件位置,用linux和initrd命令指定它们grub linux,最后用boot命令启动。

GRUB命令行还支持设置环境变量,通过set命令查看和修改变量值。root变量指定根分区,prefix变量指定GRUB安装目录。在rescue模式下,往往需要手动设置这些变量才能加载normal模块进入完整命令行。掌握这些基础命令,即使GRUB完全损坏也能手动引导系统。
双系统grub无法启动
安装Windows和Linux双系统后,经常出现只能进Windows或只能进Linux的情况。这通常是Windows引导程序覆盖了GRUB,或者GRUB没有正确识别Windows分区。先进入Linux系统,安装os-prober探测工具,它会自动检测硬盘上的其他操作系统。然后编辑/etc/default/grub,确保GRUB_DISABLE_OS_PROBER=false这一行没有被注释。
执行update-grub命令时,系统会重新扫描所有分区,如果找到Windows启动文件就会自动添加到GRUB菜单。如果还是无法识别,检查Windows分区是否被挂载,或者手动在/etc/grub.d/40_custom文件中添加Windows启动项。注意Windows的EFI分区通常是FAT32格式,在Linux下挂载后找到EFI/Microsoft/Boot/bootmgfw.efi文件,这就是Windows的EFI启动文件。
grub菜单如何修改

想修改开机启动菜单的显示效果,可以调整/etc/default/grub中的参数。比如设置GRUB_TIMEOUT_STYLE=hidden可以隐藏菜单直接启动默认项,设置GRUB_BACKGROUND指定背景图片linux论坛,设置GRUB_GFXMODE调整菜单分辨率。这些视觉相关的修改需要安装grub2-splashimages或其他主题包才能生效。
要调整菜单项的显示名称或顺序,就要修改/etc/grub.d/目录下的脚本文件。30_os-prober负责生成其他操作系统的菜单项,10_linux生成当前Linux系统的菜单项。可以给这些脚本添加执行权限或调整它们的执行顺序,甚至创建自定义脚本40_custom来添加个性化的启动选项。修改完成后记得重新生成grub.cfg。
grub rescue模式修复

grub rescue是最让人头疼的故障模式,此时系统无法加载完整GRUB模块,只有最基本的救援功能。首先用ls命令列出所有分区,找到Linux的/boot分区所在位置。如果不知道是哪个分区,可以逐个尝试用ls (hd0,1)/等方式查看分区内容,找到包含grub目录的分区。假设找到的是(hd0,msdos5),执行set root=(hd0,msdos5)、set prefix=(hd0,msdos5)/grub。
接下来最关键的一步是加载normal模块,输入insmod normal,然后执行normal命令。如果一切顺利就会进入完整GRUB菜单,可以正常启动系统。如果提示文件未找到,说明grub目录下缺少normal.mod文件,需要从其他途径恢复。进入系统后立刻重新安装GRUB,或者用Live CD启动后chroot到原系统进行修复。
你在使用GRUB时遇到过最棘手的引导问题是什么?欢迎在评论区分享你的经历和解决方法,点个赞让更多Linux用户看到这些实用技巧。
