PC型号: Lenovo XiaoXin Air 13 Pro-13IKB (双系统)
Windows版本: Windows10 教育版
Ubuntu版本: Ubuntu Desktop 16.04

对于Windows和Linux双系统的用户,你可能会陷入这样一种窘境:在你的Grub2引导中,没有Windows的选项,这时,一般的选择是先启动Linux系统,修改Grub2的设置后再重启。
实际上,考虑到用户的奇思妙想与鬼畜操作,Grub还提供了一个命令行终端,不需要启动Linux就可以直接引导电脑上的其他系统(Grub理论上也并非是和Linux绑定,所以其自成一体也在情理之中)。


在开机后的Grub引导页面,按下ESC,即进入Grub的命令行模式。下面,我们依次介绍几条我们会用到的命令,同时也是这个终端的几条核心命令。

  1. ls
    ls 命令 ,和Linux的ls命令功能基本相同。列出目录下的文件与子目录。在默认的根目录下,键入ls命令,可以看到打印出一串形如“(hd0,1)”的目录,这里的每一个目录就代表着一个硬盘的分区(不管是linux的还是windows的)。
    ls命令还可以用于查看任意子目录里的情况,如 ls (hd0, 1)/ 可查看(hd0, 1)分区中的文件。
  2. set root=
    和Linux里的终端一样,Grub的命令行也有当前目录的概念。set root= 可以改换当前目录。比如set root=(hd0, 1)
  3. chainloader
    chainloader命令是指定一个文件作为链式装载程序载入。怎么样,这个解释是不是说得云里雾里?但实际上,如果我们只是用终端启动windows的话,也不需要了解太多,你只需要用ls命令找到windows的bootmgfw.efi即可(一般来说,这个efi是在某个分区下的/efi/Microsoft/Boot/中)
  4. boot
    按照当前设置,引导系统启动。

有了上述的四条命令,我们就可以实现用grub命令引导启动windows了。基本的操作步骤:

  1. 在引导列表页按ESC进入Grub2终端 。
  2. insmod part_gpt 导入模块,让grub可以看到gpt格式的硬盘(这个有没有必要我也不清楚,但执行一下也不妨事。)。
  3. 借助 ls 命令找到windows系统的 bootmgfw.efi 所在的分区(hd*, *)。
  4. 修改当前目录 set root=(hd*, *) 。
  5. chainloader /efi/Microsoft/Boot/bootmgfw.efi (可以用 ls 再确认一下这个路径)。
  6. boot
    (Tips: ls命令打印出来的分区名称,可能是”(hd*, gpt*)”,在我们键入分区时,这个gpt可以省略。)

按照上述步骤操作,如果你的windows系统本身没什么问题的话,应该是可以正常启动的。


P.S. 笔者接触Grub2的命令行模式其实源于一个非常低能的错误——在更新了BIOS后,忘记把装双系统用的系统盘从USB口上拔下来,导致系统自动U盘启动,连个Windows10的引导项都没得,只有ubuntu 的安装选项(没错,在Linux还没有正式安装时,Grub2就已经可以用了),以至于鼓捣了半个多钟头,后来才想到,如果当时把U盘拔下来,就没有这些破事儿了。