Grub 2

引导示意

  • NVRAM启动菜单
    • EFI文件 - 系统启动项:/EFI/Microsoft/boot/bootmgfw.efi
      • windows系统
    • EFI文件 - 默认启动项:/EFI/boot/bootx64.efi
      • 生成此文件对应的系统
    • EFI文件 - 多系统工具启动项:ventoy
      • iso文件、vhd文件、vhi文件、wim文件
      • ventoy_grub.cfg
    • EFI文件 - 多系统工具启动项:/EFI/xorboot/xorboot.efi
      • xorboot.xor启动项菜单
        • iso文件、vhd文件、vhi文件
        • efi引导
    • EFI文件 - 多系统工具启动项:/EFI/refind/refind_x64.efi……
      • efi引导

命令

  • UEFI
    • cd, ls, map, pci, mm, dmem, ifconfig, edit, vers 用-?查看命令说明
  • Grub
    • 启动菜单页:e编辑选项,c进命令行
    • 编辑窗口:Ctrl-X直接启动,Ctrl-c进命令行,ESC回退
    • 命令行:ls可以看硬盘和分区内容,configfile解析cfg文件回grub启动菜单页

grub.cfg

https://www.jinbuguo.com/linux/grub.cfg.html 

  • GRUB2模块
    对于GRUB-2.0.2版本来说,官方提供的模块一共有200多个,这些模块大致可以分为以下几类(模块间的依赖关系位于"moddep.lst"文件中):
    命令模块[command.lst]
    提供了各种不同的功能,类似标准Unix命令,一共将近100个。例如:cat cpuid echo halt lspci chainloader initrd linux password ...
    加密模块[crypto.lst]
    提供了各种数据完整性校验与密码算法支持,一共20多个。例如:gcry_rijndael crc64 gcry_md5 ...
    文件系统模块[fs.lst]
    提供了访问各种文件系统的功能,一共30多个。例如:btrfs cpio exfat ext2 fat iso9660 ntfs tar xfs zfs ...
    分区模块[partmap.lst]
    提供了识别各种分区格式的功能,一共10多个。例如:part_bsd part_gpt part_msdos ...
    分区工具[parttool.lst]
    提供了操作各种分区格式的功能,目前只有 msdospart 这一个。
    终端模块[terminal.lst]
    提供了各种不同终端的支持,一共不到10个。例如:serial gfxterm vga_text at_keyboard ...
    视频模块[video.lst]
    提供了各种不同的视频模式支持,一共6个。例如:vga vbe efi_gop efi_uga ...
    其他模块
    所有未在上述分类文件中列出的模块都归为这一类,一共将近100个。值得关注的有以下几个:
    "all_video"可用于一次性加载当前所有可用的视频模块;
    "gfxmenu"可用于提供主题支持;
    "jpeg png tga"可用于提供特定格式的背景图片支持;
    "xzio gzio lzopio"可用于提供特定压缩格式支持(常配合"initrd"命令使用);
  • GRUB2救援模式
    GRUB2在BIOS平台上的常规启动步骤是这样的:BIOS --> boot.img[MBR] --> core.img[MBR gap/embedding area/BIOS Boot Partition] --> 设置"prefix root cmdpath"环境变量 --> 加载"normal.mod"模块[同时还包括它所依赖的 terminal crypto extcmd boot gettext 模块] --> 执行"normal $prefix/grub.cfg"命令
    GRUB2在UEFI平台上的常规启动步骤是这样的:UEFI --> core.img[BOOTX64.EFI/BOOTX86.EFI] --> 设置"prefix root cmdpath"环境变量 --> 加载"normal.mod"模块[同时还包括它所依赖的 terminal crypto extcmd boot gettext 模块] --> 执行"normal $prefix/grub.cfg"命令
    如果上述步骤全部成功,那么你将进入'普通模式',一般是显示一个菜单(找到了'$prefix/grub.cfg'),或者直接进入GRUB SHELL(没找到'$prefix/grub.cfg')。在普通模式中,命令模块[command.lst]与加密模块[crypto.lst]会被自动按需载入(无需使用"insmod"命令),并且可使用完整的GRUB脚本功能。但是其他模块则可能需要明确使用"insmod"命令来载入。
    如果在加载"normal.mod"模块这一步出现故障,那么你将进入GRUB2的'救援模式',而不是常规的'普通模式'。在救援模式中,GRUB只自动设置了"cmdpath prefix root"三个环境变量,并且只能使用"insmod ls set unset"四个命令。只有当额外的模块被加载之后,才可以使用一些其它的命令,变量,解析器,驱动程序。通常来说,进入救援模式可能意味着你的GRUB2没有正确安装。请认真阅读'grub-install --help'的输出选项,并使用正确的选项重新安装。更多细节请参考GRUB2手册中的"GRUB only offers a rescue shell"部分。
  • GRUB2命名规则
    设备与分区
    GRUB2对设备与分区的命名规则举例如下,看看就能明白。需要说明的是磁盘从"0"开始计数,分区从"1"开始计数。
    (fd0)          第一软盘
    (hd0)          第一硬盘[大多数U盘与USB接口的移动硬盘以及SD卡也都被当作硬盘看待]
    (hd1,1)        第二硬盘的第一分区(通用于MBR与GPT分区)
    (hd0,msdos2)   第一硬盘的第二MBR分区,也就是传统的DOS分区表
    (hd1,msdos5)   第二硬盘的第五MBR分区,也就是第一个逻辑分区
    (hd0,gpt1)     第一硬盘的第一GPT分区
    (cd)           启动光盘[仅在从光盘启动GRUB时可用]
    (cd0)          第一光盘
    上面所举的例子仅是最常用的情形,更多高级的设备命名规则请参考GRUB2手册中的"Naming convention"与"How to specify devices"部分。此外,如果你想看看当前系统上有哪些设备可用,可以在GRUB SHELL中使用"ls"命令(可能需要先加载必要的驱动模块)。
    文件
    文件的命名方法有两种:(1)绝对路径表示法,(2)相对路径表示法。举例如下:
    (fd0)/grldr                 第一软盘根目录下的"grldr"文件[绝对路径]
    (hd0,gpt1)/boot/vmlinuz     第一硬盘的第一GPT分区"boot"目录下的"vmlinuz"文件[绝对路径]
    /boot/vmlinuz               根设备"boot"目录下的"vmlinuz"文件[相对路径],
                               当"root"环境变量等于"(hd0,gpt1)"时,等价于"(hd0,gpt1)/boot/vmlinuz"
    上面所举的例子仅是最常用的情形,更多高级的文件命名规则请参考GRUB2手册中的"How to specify files"部分。
    磁盘块
    磁盘块的命名方法同样也有两种:(1)绝对路径表示法,(2)相对路径表示法。举例如下:
    (hd1,1)0+1  在第二硬盘的第一分区上,从第"0"个磁盘块(首扇区)起,长度为"1"的连续块。[绝对路径]
    (hd1,1)+1   含义与上一个相同,因为当从第"0"个磁盘块(首扇区)起时,"0"可以省略不写。[绝对路径]
    +1          在根设备上,从第"0"个磁盘块(首扇区)起,长度为"1"的连续块。[相对路径]
               当"root"环境变量等于"(hd1,1)"时,等价于"(hd1,1)0+1"
    磁盘块几乎只用于链式引导(chainloader)的场合。更多高级的磁盘块命名规则请参考GRUB2手册中的"How to specify block lists"部分。
  • GRUB2命令
    • 对于GRUB-2.0.2版本来说,所有可用的命令有大约200个之多,他们中的绝大多数由各种各样的模块提供。我们没有必要去了解所有这些200个命令,只需要了解一些常用的命令即可(实际上就连官方文档也没有给出全部的命令说明)。更多的命令说明可以参考GRUB2手册中的"The list of available commands"页面中列出的几个二级页面。
    • menuentry "title" [--class=class …] [--users=users] [--unrestricted] [--hotkey=key] [--id=id] [arg …] { command; … }
      定义一个名为"title"的菜单项。当此菜单项被选中时,GRUB将会把环境变量"chosen"的值设为"id"(使用了[--id=id]选项)或"title"(未使用[--id=id]选项),然后执行花括号中的命令列表,如果列表中最后一个命令执行成功,并且已经载入了一个内核,那么将执行"boot"命令。
    • 可以使用 --class 选项指定菜单项所属的"样式类"。从而可以使用指定的主题样式显示菜单项。
    • 可以使用 --users 选项指定只允许特定的用户访问此菜单项。如果没有使用此选项,则表示允许所有用户访问。
    • 可以使用 --unrestricted 选项指明允许所有用户访问此菜单项。
    • 可以使用 --hotkey 选项设置访问此菜单项的热键(快捷键)。"key"可以是一个单独的字母,或者'backspace','tab','delete'之一。
    • 可以使用 --id 选项为此菜单项设置一个全局唯一的标识符。"id"必须由ASCII字母/数字/下划线组成,且不得以数字开头。
    • [arg …]是可选的参数列表。你可以把它们理解为命令行参数。实际上"title"也是命令行参数,只不过这个参数是个必须参数而已。这些参数都可以在花括号内的命令列表中使用,"title"对应着"$1",其余的以此类推。
    • terminal_input [--append|--remove] [terminal1] [terminal2] …
      如果不带任何选项与参数,则表示列出当前激活的输入终端,以及所有其他可用的输入终端。
    • 可以使用 --append 选项将指定的终端加入到激活的输入终端列表中,所有列表中的终端都可以用于向GRUB提供输入。
    • 可以使用 --remove 选项将指定的终端从激活的输入终端列表中删除。
    • 如果不使用任何选项,但是指定了一个或多个终端参数,则表示将当前激活的输入终端设置为参数指定的终端。
    • terminal_output [--append|--remove] [terminal1] [terminal2] …
      如果不带任何选项与参数,则表示列出当前激活的输出终端,以及所有其他可用的输出终端。
    • 可以使用 --append 选项将指定的终端加入到激活的输出终端列表中,所有列表中的终端都将接受到GRUB的输出。
    • 可以使用 --remove 选项将指定的终端从激活的输出终端列表中删除。
    • 如果不使用任何选项,但是指定了一个或多个终端参数,则表示将当前激活的输出终端设置为参数指定的终端。
    • authenticate [userlist]
      检查当前用户是否位于"userlist"或环境变量"superusers"中。[注意]如果环境变量"superusers"的值为空,此命令将返回'真'。
    • background_color color
      设置当前激活的输出终端的背景颜色。"color"可以使用HTML风格的颜色表示法("#RRGGBB"或"#RGB")。
    • [注意]仅在使用'gfxterm'作为输出终端的时候,才能改变背景色。
    • background_image [[--mode 'stretch'|'normal'] file]
      将当前激活的输出终端的背景图片设置为"file"文件。除非使用了"--mode 'normal'"选项,否则图片将被自动缩放以填满整个屏幕。
    • 如果不带任何选项与参数,则表示删除背景图片。
    • [注意]仅在使用'gfxterm'作为输出终端的时候,才能改变背景图片。
    • boot
      启动已经被载入的OS或链式加载器。仅在运行于交互式命令行的时候才是需要的。在一个菜单项结束时是隐含的。
    • cat [--dos] file
      显示文件"file"的内容。如果使用了"--dos"选项,那么"回车/换行符"将被显示为一个简单的换行符。否则,回车符将被显示为一个控制符(<d>)。
    • chainloader [--force] file
      链式加载"file"文件。通常使用磁盘块表示法,例如用'+1'表示当前根分区的第一个扇区。
    • 可以使用 --force 选项强制载入文件,而不管它是否有正确的签名。通常用于加载有缺陷的启动载入器(例如 SCO UnixWare 7.1)。
    • configfile file
      将"file"作为配置文件加载。如果"file"中定义了菜单项,那么立即显示一个包含它们的菜单。
    • [注意]"file"文件对环境变量所做的任何变更都将在从此文件返回后失效。
    • cpuid [-l]
      检查CPU特性。仅在x86系统上可用。
    • 如果使用了 -l 选项,那么如果CPU是64位则返回真,否则返回假。
    • drivemap -l|-r|[-s] from_drive to_drive
      如果不使用任何选项,表示将"from_drive"映射到"to_drive"。这主要用于链式加载Windows之类的操作系统,因为它们只能从第一个硬盘启动。出于方便的原因,分区后缀将被忽略,因此你可用安全地将"${root}"作为磁盘使用。
    • 可以使用 -s 选项,执行反向映射,也就是交换这两个磁盘。例如: drivemap -s (hd0) (hd1)
    • 可以使用 -l 选项,列出当前已有的映射。
    • 可以使用 -r 选项,把映射重置为默认值,也就是撤销所有当前已有的映射。
    • echo [-n] [-e] string …
      显示所要求的文本并换行(除非使用了 -n 选项)。如果有多个字符串,依次输出它们,并用空格分隔每一个。
    • 和bash的习惯一样,可以在双引号内使用"${var}"来引用变量的值,也可以使用 -e 选项激活对反斜杠转义符的解释( \\ \a \r \n \t ...)。
    • export envvar
      导出环境变量"envvar",以使其对于使用"configfile"命令载入的配置文件可见。
    • false
      不做任何事,只返回一个失败的结果。主要用在if/while之类的控制构造中。
    • gettext string
      把"string"翻译为环境变量"lang"指定的语言。MO格式的翻译文件从环境变量"locale_dir"指定的目录加载。
    • halt [--no-apm]
      关闭计算机。如果指定了 --no-apm 选项,表示不执行APM BIOS调用。否则,计算机使用APM关闭。
    • help [pattern …]
      显示内建命令的帮助信息。如果没有指定"pattern",那么将显示所有可用命令的简短描述。
    • 如果指定了"pattern",那么将只显示名字以这些"pattern"开头的命令的详细帮助信息。
    • initrd file
      为以32位协议启动的Linux内核载入一个"initial ramdisk",并在内存里的Linux设置区域设置合适的参数。
    • [注意]这个命令必须放在"linux"命令之后使用。
    • initrd16 file
      为以16位协议启动的Linux内核载入一个"initial ramdisk",并在内存里的Linux设置区域设置合适的参数。
    • [注意]这个命令必须放在"linux16"命令之后使用。
    • insmod module
      载入名为"module"的GRUB2模块。
    • linux file …
      使用32位启动协议从"file"载入一个Linux内核映像,并将其余的字符作为内核的命令行参数逐字传入。
    • [注意]使用32位启动协议意味着'vga='启动选项将会失效。如果你希望明确设置一个特定的视频模式,那么应该使用"gfxpayload"环境变量。虽然GRUB可以自动地检测某些'vga='参数,并把它们翻译为合适的"gfxpayload"设置,但是并不建议这样做。
    • linux16 file …
      以传统的16位启动协议从"file"载入一个Linux内核映像,并将其余的字符作为内核的命令行参数逐字传入。这通常用于启动一些遵守Linux启动协议的特殊工具(例如MEMDISK)。
    • [注意]使用传统的16位启动协议意味着:(1)'vga='启动选项依然有效,(2)不能启动纯64位内核(也就是内核必须要'CONFIG_IA32_EMULATION=y'才行)。
    • loadfont file …
      从指定的"file"加载字体,除非使用了绝对路径,否则"file"将被视为"$prefix/fonts/file.pf2"文件。
    • loopback [-d] device file
      将"file"文件映射为"device"回环设备。例如:
    • loopback loop0 /path/to/image
      ls (loop0)/
    • 可以使用 -d 选项,删除先前使用这个命令创建的设备。
    • ls [arg …]
      如果不使用参数,那么列出所有对GRUB已知的设备。
    • 如果参数是包含在括号内的一个设备名,那么列出该设备根目录下的所有文件。
    • 如果参数是以绝对路径给出的目录,那么列出这个目录的内容。
    • lsfonts
      列出已经加载的所有字体
    • lsmod
      列出已经加载的所有模块
    • normal [file]
      进入普通模式,并显示GRUB菜单。[说明]只要当前没有处于救援模式,其实就已经是在普通模式中了,所以通常并不需要明确使用此命令。
    • 在普通模式中,命令模块[command.lst]与加密模块[crypto.lst]会被自动按需载入(无需使用"insmod"命令),并且可使用完整的GRUB脚本功能。但是其他模块则可能需要明确使用"insmod"命令来载入。
    • 如果给出了"file"参数,那么将从这个文件中读入命令(也就是作为"grub.cfg"的替代),否则将从"$prefix/grub.cfg"中读入命令(如果存在的话)。你也可以理解为"file"的默认值是'$prefix/grub.cfg'。
    • 可以在普通模式中嵌套调用此命令,以构建一个嵌套的环境。不过一般不这么做,而是使用"configfile"命令来达到这目的。
    • normal_exit
      退出当前的普通模式。如果这个普通模式实例不是嵌套在另一个普通模式里的话,就会返回到救援模式。
    • parttool partition commands
      对分区表进行各种修改。目前只能作用于MBR分区表(DOS分区表),而不能用于GPT分区表。目前仅支持以下三种用法:
    • (1)设置或去掉分区的激活标记(仅对Windows系统有意义)。
      例如:"parttool (hd0,msdos2) +boot"表示为(hd0,msdos2)分区加上激活标记,而"parttool (hd0,msdos2) -boot"则表示去掉(hd0,msdos2)分区的激活标记。
    • (2)设置或去掉分区的隐藏标记(仅对Windows系统有意义)。
      例如:"parttool (hd0,msdos2) +hidden"表示为(hd0,msdos2)分区加上隐藏标记,而"parttool (hd0,msdos2) -hidden"则表示去掉(hd0,msdos2)分区的隐藏标记。
    • (3)更改分区的类型。其值必须是0x00-0xFF范围内的值。且应该使用'0xNN'格式的十六进制数。
      例如:"parttool (hd0,msdos2) type=0x83"表示将(hd0,msdos2)分区类型修改为'0x83'(Linux分区)。
    • password user clear-password
      定义一个名为user的用户,并使用明文口令'clear-password'。不建议使用此命令。
    • password_pbkdf2 user hashed-password
      定义一个名为user的用户,并使用哈希口令'hashed-password'(通过"grub-mkpasswd-pbkdf2"工具生成)。这是建议使用的命令,因为它安全性更高。
    • probe [--set var] --driver|--partmap|--fs|--fs-uuid|--label device
      提取"device"设备的特定信息。如果使用了 --set 选项,则表示将提取的结果保存在"var"变量中,否则将提取的结果直接显示出来。
    • read [var]
      从用户读取一行输入。如果给定环境变量"var",则把它设为所读取的行(不包括结尾的换行符)。
    • reboot
      重新启动
    • rmmod module
      卸载"module"模块
    • search [--file|--label|--fs-uuid] [--set [var]] [--no-floppy] name
      通过文件[--file]、卷标[--label]、文件系统UUID[--fs-uuid]来查找设备。
    • 如果使用了 --set 选项,那么会将第一个找到的设备设置为环境变量"var"的值。默认的"var"是'root'。
    • 可以使用 --no-floppy 选项来禁止查找软盘设备,因为这些设备非常慢。
    • set [envvar=value]
      将环境变量"envvar"的值设为'value'。如果没有使用参数,则打印出所有环境变量及其值。
    • source file
      直接将"file"文件的内容插入到当前位置。与"configfile"不同,此命令既不切换执行环境,也不会显示一个新的菜单。
    • test expression
      [ expression ]
      计算"expression"的值,并在结果为真时返回零值,或者在结果为假时返回非零值,主要用在if/while之类的控制构造中。
    • 可用的"expression"模式如下(与bash类似):