Arch Linux grub引导修复教程
本文最后更新于97 天前,其中的信息可能已经过时,如有错误请发送邮件到3497198266@qq.com

如果你像我一样使用 Linux + Windows 双系统(甚至多系统),在 Windows 更新或 BIOS 升级后,可能会遇到 GRUB 引导丢失、开机直接进入 Windows 的情况。第一次遇到难免手足无措,以为只能重装系统,但经过多次摸索,我发现了一个完美的解决方案:无需重装,在完整保留数据的前提下修复引导。

本教程虽以 Arch Linux 为例,但思路同样适用于其他发行版,只需替换少数命令即可。

确认数据完整性:

引导丢失后,电脑很可能跳过 GRUB 菜单直接启动 Windows。此时请先确认 Linux 分区并未被删除:可以使用 DiskGenius 等工具查看磁盘分区状态。只要 Linux 数据分区(ext4/btrfs 等)仍然存在,就说明只是引导损坏,数据完好,可以继续修复。

可以看到Linux数据分区仍完好无损,接下来你需要下载你对应系统的安装镜像以配置启动U盘

制作启动 U 盘

Arch Linux下载链接:https://archlinux.org/download

其他发行版请前往各自官网下载镜像

下载镜像完成后,需要使用Rufus这样的启动U盘制作工具

插入你的U盘,建议大小32G以上,选择你下载好的镜像文件,注意分区类型请选择GPT,目标系统类型选择UEFI,点击开始,以ISO镜像写入,开始制作启动U盘

制作完成后,不要拔出U盘,重启电脑,进入BIOS设置

进入 BIOS/UEFI 并从 U 盘启动

大部分电脑都可以在开机Logo出现时反复按F2进入BIOS,如果不行请根据你的主板厂商查询对应的BIOS进入方式,实在不行你也可以使用下述方法:

方法一:通过图形界面(Shift + 重启)

  1. 点击 开始 菜单并选择 电源 图标。
  2. 按住 Shift 键不放,同时点击 重启
  3. 在“选择一个选项”界面中点击 疑难解答
  4. 点击 高级选项 并选择 UEFI 固件设置
  5. 点击 重启,电脑将直接进入 UEFI 设置界面。

方法二:通过命令行(CMD)

  1. 以管理员身份打开 命令提示符
  2. 在 Windows 10 中输入 shutdown /r /o 并回车。
  3. 在 Windows 11 中输入 shutdown /r /fw /t 0 并回车。
  4. 等待系统自动重启并进入 UEFI 固件界面。

进入BIOS后,以我的BIOS举例,进入Boot Manager,即启动管理,其他厂商BIOS也差不多,总之就是进入启动项管理界面

用键盘上下键进行选择,选择EFI USB Device项,即从U盘启动,如果你的BIOS是调整启动优先级,则将该项移动到最高优先级即可

在 Live 环境中做好修复准备

成功启动后,我们会进入一个命令行终端(Arch 下默认是 root shell)。接下来按顺序操作

我们先来确认一下是否为 UEFI 模式:

ls /sys/firmware/efi/efivars

若输出了一堆东西(efi 变量),则说明已在 UEFI 模式。否则请确认你的启动方式是否为 UEFI

连接网络

若使用无线连接

使用 iwctl 进行连接:

iwctl # 进入交互式命令行
device list # 列出无线网卡设备名,比如无线网卡看到叫 wlan0
station wlan0 scan # 扫描网络
station wlan0 get-networks # 列出所有 wifi 网络
station wlan0 connect wifi-name # 进行连接,注意这里无法输入中文。回车后输入密码即可
exit # 连接成功后退出

若使用有线连接

通常连接网线后,即可自动连接上互联网

通过 ping 命令测试网络连通性:

ping www.bilibili.com

稍等片刻,若能看到数据返回,即说明已经联网。与 Windows 不同的是,需要按下 Ctrl + C 手动退出 ping 命令。

使用 timedatectl 确保系统时间是准确的。这一步不是可选的,正确的系统时间对于部分程序来说非常重要:

timedatectl set-ntp true # 将系统时间与网络时间进行同步
timedatectl status # 检查服务状态

通过 lsblk 命令,区分安装 archlinux 了的磁盘(通过观察磁盘的大小、已存在的分区情况等判断)并显示当前磁盘的分区情况:

lsblk # 显示当前分区情况

挂载分区并 chroot,重点来了!

请正确区分你的Arch Linux数据分区,SWAP分区和EFI分区!!

首先讲讲这些编号的含义

sda——sda1:这是当前插入的安装U盘,你看后面的分区大小也能看得出来

nvmeXnX:这是由于我电脑使用的硬盘是nvme协议,现代大部分高性能硬盘也是这个协议,如果你的硬盘是sata协议,则可能显示为sdX,这不重要,重点在于分清分区

可以通过观察分区大小,分区文件系统格式来判断:

首先我很清楚我的电脑EFI分区是2.2G,SWAP分区是24G,Linux系统分区为126G,已经可以轻松分辨出:

  • EFI分区是:nvme1n1p2
  • SWAP分区是:nvme2n1p4
  • Linux系统分区是:nvme2n1p5

如果你现在分不清是哪些,没关系,我们可以通过cfdisk命令进入分区工具来通过查看文件系统类型来分辨:

对于sata硬盘:cfdisk /dev/sdx
对于nvme硬盘:cfdisk /dev/nvmexn1

这里我们进入了nvme2n1硬盘的目录,可以在右边的Size Type栏看到文件系统类型:

Linux swap类型即对应了SWAP分区,Linux filesystem即对应了Linux系统分区

也就是nvme2n1p4nvme2n1p5

怎么样?这下是不是一目了然?

接下来我们进入nvme1n1硬盘目录:

可以看到右边文件系统类型有一个为EFI System类型,这就对应了EFI分区,也就是nvme1n1p2

现在通过如上方法,你已经知道了你的对应分区编号,请牢记这些编号,如果不记得就再敲命令看一看,或者直接拍个照,写个备忘录~

接下来开始挂载分区,稍微解释一下为什么要挂载:

在 Linux 中,系统遵循“一切皆文件”的设计理念,所有硬件设备(硬盘、U盘、光驱等)都被抽象为位于 /dev 下的设备文件,例如 /dev/sdb1。然而,这些设备文件本身并不能直接访问数据,它们只是硬件的接口描述。挂载的作用,就是将设备文件中的文件系统与 Linux 根目录树中的某个目录(挂载点)关联起来,从而实现访问。

核心原因在于:Linux 只有一个统一的目录树结构,所有文件和目录都必须挂接在这棵树上才能被访问。挂载就是将外部文件系统“接入”到这棵树的过程。

挂载的关键要素

  1. 设备文件:硬件在 /dev 下的表示,如 /dev/sda1/dev/sdb1
  2. 挂载点:一个预先存在的空目录,例如 /mnt/usb 或 /media/user/U盘
  3. 文件系统类型:如 ext4ntfsvfat 等,系统需识别才能正确读写。

我的系统使用btrfs文件系统类型,如果你使用其他类型,请参考其他文件类型的挂载命令,但大体思路一样,这里的命令仅适用于同样使用btrfs类型的分区!当然我在这里也建议各位使用btrfs类型,它的快照和透明压缩功能可以大大提高Arch Linux滚动更新失败后的数据还原率以及减少磁盘空间占用

在挂载时,挂载是有顺序的,需要从根目录开始挂载。使用如下命令挂载子卷:

mount -t btrfs -o subvol=/@,compress=zstd /dev/nvmexn1pn /mnt # 挂载 / 目录 也就是刚刚所说的Linux系统分区
mkdir /mnt/home # 创建 /home 目录,如果你已经创建了home目录,可能会报错,无需理会
mount -t btrfs -o subvol=/@home,compress=zstd /dev/nvmexn1pn /mnt/home # 挂载 /home 目录,同样是Linux系统分区
mkdir -p /mnt/boot # 创建 /boot 目录
mount /dev/nvmexn1pn /mnt/boot # 挂载 /boot 目录,这里选择的是EFI分区
swapon /dev/nvmexn1pn # 挂载交换分区,即SWAP分区

使用 df 命令复查挂载情况:

df -h

使用 free 命令复查 Swap 分区挂载情况:

free -h # -h 选项会使输出以人类可读的单位显示

生成 fstab 文件,fstab 用来定义磁盘分区。它是 Linux 系统中重要的文件之一。使用 genfstab 自动根据当前挂载情况生成并写入 fstab 文件:

genfstab -U /mnt > /mnt/etc/fstab

复查一下 /mnt/etc/fstab 确保没有错误:

cat /mnt/etc/fstab

输出应当和上图中类似

使用以下命令把系统环境切换到新系统下:

arch-chroot /mnt

此时,原来安装盘下的 /mnt 目录就变成了新系统的 / 目录。同时,可以发现命令行的提示符颜色和样式也发生了改变。

重装或修复 GRUB

如果不确定你的引导程序本身是否有损坏,可以重新安装一遍

安装引导程序,安装相应的包:

pacman -S grub efibootmgr os-prober

命令参数说明:

  • -S 选项后指定要通过 pacman 包管理器安装的包:
    • grub —— 启动引导器
    • efibootmgr —— efibootmgr 被 grub 脚本用来将启动项写入 NVRAM
    • os-prober —— 为了能够引导 win10,需要安装 os-prober 以检测到它

安装 GRUB 到 EFI 分区

grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=Arch

命令参数说明:

  • --efi-directory=/boot —— 将 grubx64.efi 安装到之前的指定位置(EFI 分区)
  • --bootloader-id=Arch —— 取名为 Arch

接下来使用 vim 编辑 /etc/default/grub 文件:

vim /etc/default/grub

进行如下修改:

  • 去掉 GRUB_CMDLINE_LINUX_DEFAULT 一行中最后的 quiet 参数
  • 把 loglevel 的数值从 3 改成 5。这样是为了后续如果出现系统错误,方便排错
  • 加入 nowatchdog 参数,这可以显著提高开关机速度,如果你的电脑是英特尔CPU,则改成modprobe.blacklist=iTCO_wdt
  • 为了引导 windows,则还需要添加新的一行 GRUB_DISABLE_OS_PROBER=false

这里的GRUB_DEFAULT即为默认启动项参数,如果你想把你的默认启动项改为Windows,则可以修改参数为对应项,这里是从上到下从0开始数的启动项顺序,例如从上到下第三个为Windows Boot Manager则修改参数为2

最后生成 GRUB 所需的配置文件:

grub-mkconfig -o /boot/grub/grub.cfg

若引导了 windows,则输出应该包含倒数第二行:

Found Windows Boot Manager on /dev/nvme1n1p2@/EFI/Microsoft/Boot/bootmgfw.efi

完成修复!

退出并重启

输入以下命令:

exit # 退回安装环境
umount -R /mnt # 卸载新分区
reboot # 重启

如果你之前在BIOS里修改了启动优先级为U盘最高,则现在需要拔下U盘,否则你重启后还是进安装程序而不是你的系统

如果一切操作正确,重启后你将看到熟悉的 GRUB 菜单,并能正常启动 Linux 和 Windows。


总结

通过上述流程,我们在不重装系统的情况下成功修复了 GRUB 引导。整个过程的要点可归纳如下:

  1. 确诊问题:引导丢失但分区完好,仅需修复引导器。
  2. 制作 Live 启动盘:根据发行版下载镜像,用 Rufus 等工具制作 UEFI 启动 U 盘。
  3. 识别并挂载分区:借助 lsblk 和 cfdisk 准确找到根分区、EFI 分区和 Swap 分区,并按正确顺序挂载到 /mnt
  4. chroot 进入原系统:执行 arch-chroot /mnt(其他发行版可用 chroot 配合挂载虚拟文件系统)。
  5. 重装/更新 GRUB:安装 grubefibootmgros-prober,运行 grub-install 将引导写入 EFI 分区,并生成配置文件。
  6. 调整配置并生成菜单:编辑 /etc/default/grub(去掉静默、提高日志级别、开启 os-prober、优化内核参数),最后用 grub-mkconfig 生成菜单。

注意事项与建议

  • 小心分区:不同机器的设备名和分区编号各不相同,操作前务必反复确认,防止误操作损坏数据。
  • 文件系统差异:根分区可能是 ext4、btrfs、xfs 等,挂载命令会有所不同,请根据实际情况调整(尤其是 btrfs 子卷)。
  • UEFI 与 Legacy:本教程仅针对 UEFI 模式;若为 Legacy BIOS,修复步骤会不同,需使用 --target=i386-pc 并设置引导分区。
  • 备份重要数据:即便操作通常是安全的,在动手前备份个人文件永远是好习惯。
  • 建立备选引导方案:可考虑安装 refind 或手动备份 EFI 文件,以便日后快速恢复。

掌握了这个通用方法,再遇到引导崩溃时,你就能从容应对,彻底告别“一丢引导就重装”的烦恼。希望这篇教程对你有所帮助!

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇