系统引导

GRUB2 Legacy

安装GRUB2引导程序(假设启动分区位于 /mnt/boot)

grub2-install --boot-directory=/mnt/boot /dev/sdX

将GRUB2配置文件复制到 /mnt/boot/grub/grub.cfg

GRUB2 UEFI

创建UEFI启动文件(假设EFI系统分区被挂载到 /mnt)

grub-mkimage -o /mnt/efi/debian/bootx64.efi -p /efi/debian -O x86_64-efi \
    fat iso9660 part_gpt part_msdos \
    normal boot linux configfile loopback chain \
    efifwsetup efi_gop efi_uga \
    ls search search_label search_fs_uuid search_fs_file \
    gfxterm gfxterm_background gfxterm_menu echo test all_video loadenv \
    exfat ext2 ntfs btrfs hfsplus udf

将GRUB2配置文件复制到 /mnt/efi/debian/grub.cfg

默认启动上一次选择的操作系统

参考 GRUB2 文档,用下面的命令生成的 grub.cfg 经过测试不能达到预期的效果,可能是没有正确理解文档的意思。

sudo env GRUB_DEFAULT=saved GRUB_SAVEDEFAULT=true grub-mkconfig >grub.cfg

生成的 grub.cfg 里的部分代码经过修改提炼得到了下面的解决方案。

GRUB2 利用 Environment Block 保存持久信息,在 grub.cfg 的开头加载 Environment:

if [ -s $prefix/grubenv ]; then
    set have_grubenv=true
    load_env
fi

这里 $prefix 代表什么并不清楚,依照前面 GRUB2 UEFI 的设置,将 grubenv 文件放置在 /mnt/efi/debian/ 目录可以正常工作,猜测 GRUB2 Legacy 也需将 grubenv 文件放置在 grub.cfg 所在的目录。

接下来根据 Environment 里保存的信息设置 default 变量,这里随意选择了 next_entry 这个变量来保存菜单项:

if [ "${next_entry}" ] ; then
    set default="${next_entry}"
else
    set default="0"
fi

创建保存菜单项的命令与之对应:

function savedefault {
    next_entry="${chosen}"
    save_env next_entry
}

最后将 savedefault 命令添加到需要被保存的菜单项的命令列表中。