• GRUB2

    GRUB全称GRand Unified Bootloader,是GNU项目中一个支持多系统启动的系统引导程序。GRUB目前分为两个版本,0.9版本以前称为GRUB legacy,1.x以后的版本称为GRUB2,本文描述的是GRUB2。

    区别

    GRUB2较于GRUB的一些变化:

    • grub2的配置文件是命令生成的

    • 增加了rescue模式,可用来修复引导

    • 支持多种文件系统

    • 添加模块机制,可动态加载模块

    • 分区编号使用1开头

    设备命名方式

    GRUB2的设备命令方式:

    我们知道,在linux系统中,IDE硬盘使用hd开头,SATA硬盘使用sd开头,例如/dev/sda1表示第一块硬盘的第一个分区、/dev/sdb3表示第二块硬盘的第三个分区。

    但是在GRUB中不同,硬盘都使用hd(Hard disk)表示,设备从0开始标号,分区从1开始标号。例如(hd0,1)表示第一块硬盘的第一个分区,在Windows中可以理解为C盘。

    安装方法

    通常情况下,大部分的Linux版本都不需要我们手动安装。

    你也可以克隆源代码编译安装

    # git clone git://git.savannah.gnu.org/grub.git
    # ./configure
    # make
    # sudo make install
    

    配置文件

    GRUB的主要配置文件是/boot/grub/grub.cfg,该配置文件根据/etc/default/grub和/etc/grub.d/目录下的文件生成,所以不可以直接编辑,如果想修改启动项或者添加自定义启动项应该编辑/etc/grub.d/下的脚本。

    下面是已经生成的双系统电脑中的grub.cfg文件中两个系统的引导信息:

    Ubuntu 16.04

    menuentry 'Ubuntu, with Linux 4.13.0-26-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-26-generic-advanced-3c909df0-784e-4b1c-890b-b1e971c84d47' {
        recordfail
        load_video
        gfxmode $linux_gfx_mode
        insmod gzio
        if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
        insmod part_gpt
        insmod ext2
        set root='hd1,gpt5'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd1,gpt5 --hint-efi=hd1,gpt5 --hint-baremetal=ahci1,gpt5  3c909df0-784e-4b1c-890b-b1e971c84d47
        else
          search --no-floppy --fs-uuid --set=root 3c909df0-784e-4b1c-890b-b1e971c84d47
        fi
        echo  'Loading Linux 4.13.0-26-generic ...'
        linux  /boot/vmlinuz-4.13.0-26-generic.efi.signed root=UUID=3c909df0-784e-4b1c-890b-b1e971c84d47 ro  quiet splash $vt_handoff
        echo  'Loading initial ramdisk ...'
        initrd  /boot/initrd.img-4.13.0-26-generic
      }
    

    Windows 10

    menuentry 'Windows Boot Manager (on /dev/sdb2)' --class windows --class os $menuentry_id_option 'osprober-efi-18E3-6B87' {
      insmod part_gpt
      insmod fat
      set root='hd1,gpt2'
      if [ x$feature_platform_search_hint = xy ]; then
        search --no-floppy --fs-uuid --set=root --hint-bios=hd1,gpt2 --hint-efi=hd1,gpt2 --hint-baremetal=ahci1,gpt2  18E3-6B87
      else
        search --no-floppy --fs-uuid --set=root 18E3-6B87
      fi
      chainloader /EFI/Microsoft/Boot/bootmgfw.efi
    }
    

    如果你想添加自定义启动项,你可以编辑/etc/grub.d/40_custom文件,仿照上面的格式添加启动项:

    添加linux启动项

    menuentry "Linux Name" {
      set root=(hd0,2) # 系统所在位置
      linux /boot/vmlinuz # 引导内核
      initrd /boot/initrd.img # 临时内核
    }
    

    添加Windows启动项

    menuentry "Windows" {
      insmod part_gpt # 载入模块,下同
      insmod fat
      set root='hd1,gpt2' # 系统所在位置
      chainloader /EFI/Microsoft/Boot/bootmgfw.efi # UEFI启动的Windows的efi引导文件
    }
    

    添加‘关机’项

    menuentry "System shutdown" {
      echo "System shutting down..."
      halt
    }
    

    添加‘重启’项

    menuentry "System restart" {
      echo "System rebooting..."
      reboot
    }
    

    每当你修改了这些配置文件,都需要输入下面的命令来重新生成grub.cfg文件

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

    UEFI启动

    现在大部分的电脑都支持UEFI启动,如果你使用UEFI启动且磁盘使用GPT分区表,你需要安装软件包efibootmgr来生成.efi文件,默认位于/boot/EFI/grubx64.efi。

    使用下面的命令来生成UEFI模块在/boot/grub/x86_64-efi目录下

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

    如果你想在Windows系统中编辑或添加UEFI启动项,你可以使用EasyUEFI软件(在非企业版系统中免费),EasyBCD只能在传统(legacy)启动中使用。