grub2系统引导

主板启动方式

Legacy启动

  • 1 BIOS 会从硬盘的 MBR 中加载引导程序(硬盘使用MBR分区表或者混合分区表(Hybrid MBR))
  • 2 BIOS 会从bios_grub标志的未格式化分区中加载引导程序(硬盘使用GPT分区格式,并不是所有主板都支持)

UEFI启动

  • 1 UEFI 主板会检查 NVRAM 中存储的启动项,如果找到了合适的启动项,UEFI 主板会根据该项来启动系统 (硬盘使用GPT分区表或者混合分区表(Hybrid MBR))
    NVRAM中每个启动项都配置了磁盘+分区UUID+文件路径,可以使用efibootmgr来查看和编辑这些启动项,也可以进BIOS配置

    • 1.1 查看启动项

      sudo efibootmgr -v
      BootCurrent: 0000
      Timeout: 1 seconds
      BootOrder: 0000,0005 #启动项顺序
      Boot0000* ubuntu	HD(1,GPT,77f07c2f-fa06-4fd3-8372-747a0302b548,0x800,0x219800)/File(\EFI\UBUNTU\SHIMX64.EFI)
      Boot0005  ubuntu	HD(1,GPT,df830439-859e-4de9-a03a-516ae5ee54cf,0x800,0x100000)/File(\EFI\UBUNTU\SHIMX64.EFI)
      
    • 1.2 添加启动项

      sudo efibootmgr -c -w -L "启动项名字" -d /dev/nvmeXn1 -p 1 -l \EFI\Boot\bootx64.efi # -d 磁盘 -p 分区编号 -l efi文件路径
      
    • 1.3 删除启动项

      sudo efibootmgr -b 000x -B  # -b 启动项编号
      
    • 1.4 重新排序启动项

      sudo efibootmgr -o 0005,0000 
      
    1. 如果在 NVRAM 中没有找到可用的启动项,UEFI 主板会扫描 EFI 系统分区(ESP)来寻找可启动的 EFI 文件(在/EFI/BOOT目录下),并根据这些文件来生成启动菜单 (硬盘使用GPT分区表或者混合分区表(Hybrid MBR))

硬盘分区表格式

  1. GPT分区表
  • 1.1 使用了 GUID(Globally Unique Identifier)来标识分区,每个分区都有一个唯一的 UUID
  • 1.2 支持最多 128 个分区条目(GPT64,64位扩展)或者 32 个分区条目(GPT32,32位限制)
  1. MBR分区表
  • 2.1 使用传统的扇区地址来标识分区
  • 2.2 最多支持 4 个主分区,或者 3 个主分区和一个扩展分区。每个主分区的大小受到 MBR 分区表的限制,最大为 2TB
  • 2.3 存在引导扇区(MBR)存放引导程序,系统启动的时候加载
  1. 混合分区表(Hybrid MBR)
  • 3.1 MBR 分区表中的一个或多个分区会被映射到 GPT 分区表中的相应分区上
  1. 共同点
  • 4.1 分区可以指定文件系统类型格式化,也可以不格式化,ext2,ext3,ext4是linux特有的,ntfs是windows特有的,fat和fat32是linux和windows都有的
  • 4.2 分区可以指定标记,举几个例子
    • 4.2.1 boot标记的ESP分区是一个特殊的分区,用于存放 UEFI 引导加载程序和相关文件,一般使用fat或fat32格式化
    • 4.2.2 bios_grub标记的分区用于存放Legacy启动方式启动GPT分区硬盘的引导文件,必须是未格式化分区
  • 4.3 分区可以设置分区名
  • 4.4 分区有起始位置和结束位置

GRUB2引导

UEFI启动+GPT分区

  1. 磁盘分区
  • 2.1 创建GPT分区表

    sudo parted /dev/nvmeXn1 mklabel gpt
    
  • 2.1 创建磁盘分区

    sudo parted /dev/nvmeXn1 mkpart boot fat32 2M 512M  #创建esp分区,并格式化为fat32文件格式,生成为/dev/nvmeXn1pY1 
    sudo parted /dev/nvmeXn1 mkpart swap linux-swap 512M 32.5G # 创建swap分区,生成为/dev/nvmeXn1pY2 
    sudo swapon /dev/nvmeXn1pY2  #激活swap分区
    sudo parted /dev/nvmeXn1 mkpart root ext4 32.5G 350G #创建根目录root分区,生成为/dev/nvmeXn1pY3
    
  • 2.2 挂载分区到指定目录

    sudo mount /dev/nvmeXn1pY1 /mnt #挂载分区到/mnt目录下
    sudo umount /dev/sda1 #这是一个移动硬盘,只是测试用的,没什么用
    sudo mkdir /mnt/disk1
    sudo mount /dev/sda1 /mnt/disk1
    
  • 2.3. 开机自动挂载

    • 2.3.1 工具生成自动挂载目录

      sudo apt install arch-install-scripts #这个工具是arch系统下的,生成的fstab文件可能不能在ubuntu下使用,还是用手动配置吧
      genfstab -U /mnt >> /mnt/etc/fstab #生成到/etc/fstab文件中,/mnt或/mnt的子目录如果有挂载分区,都会生成到fstab中
      
      # /etc/fstab文件内容:
      # /dev/nvme0nXpY1
      UUID=DA18-EBFA      	/         	vfat      	rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro	0 1
      # /dev/sda1
      UUID=89C9-1255      	/disk1    	exfat     	rw,relatime,fmask=0022,dmask=0022,iocharset=utf8,errors=remount-ro	0 2
      /swap.img           	none      	swap      	defaults  	0 0
      
    • 2.3.2 手动配置分区挂载目录,在/etc/fstab添加

      /dev/disk/by-uuid/分区uuid 挂载目录 分区文件系统类型 defaults 0 1 ##分区的uuid可以使用sudo blkid -o list或者sudo lsblk -f查看
      
  • 2.4 安装GRUB引导

    • 2.4.1 在另一块硬盘建立grub,参数为–efi-diretory --boot-directory

      sudo mkdir /mnt/boot2 \
      sudo grub-install --target=x86_64-efi --efi-directory=/mnt --boot-directory=/mnt/boot2 --bootloader-id=efi2
      
      生成的目录结构:
      /mnt
        /boot2
          /grub
            /x86_64-efi : #boot-directory/grub/target模块目录,存放系统启动所需的模块
        /EFI  
          /efi2  #efi-directory/EFI/bootloader-id目录 
            xx.efi :efi文件
            grub.cfg:GRUB启动项配置文件
      grub.cfg内容:
        search.fs_uuid DA18-EBFA root  #boot-directory所在分区
        set prefix=($root)'/boot2/grub' #boot-directory/grub目录
        configfile $prefix/grub.cfg #需要手动生成的grub.cfg,文件目录为boot-directory/grub
      sudo efibootmgr -v #查看nvram启动项,发现多了一条启动项
        Boot0006* efi2	HD(1,GPT,df830439-859e-4de9-a03a-516ae5ee54cf,0x800,0x100000)/File(\EFI\efi2\shimx64.efi) 
      
    • 2.4.2 在另一块硬盘建立grub,参数为–efi-diretory --boot-directory,使用–removable

      sudo mkdir /mnt/boot4 \
      sudo grub-install --target=x86_64-efi --efi-directory=/mnt --boot-directory=/mnt/boot4 --bootloader-id=efi4 --removable
       
      生成的目录结构:
      /mnt
        /boot4
          /grub
            /x86_64-efi : #boot-directory/grub/target模块目录,存放系统启动所需的模块
        /EFI  
          /BOOT  
            xx.efi :efi文件
            grub.cfg:GRUB启动项配置文件
      grub.cfg内容:
        search.fs_uuid DA18-EBFA root  #boot-directory所在分区
        set prefix=($root)'/boot4/grub' #boot-directory/grub目录
        configfile $prefix/grub.cfg #需要手动生成的grub.cfg,文件目录为boot-directory/grub
      sudo efibootmgr -v #查看nvram启动项,发现没有efi4的启动项
      
    • 2.4.3 总结

      boot-directory/grub目录下放引导文件:
      引导文件包括:
        1.x86_64-efi目录下的模块文件
        2.grub.cfg文件(这个文件会被efi-directory/bootloader-id目录下的grub.cfg引用)
      使用--removable: 
        1.会在efi-directory/BOOT目录下生成efi文件和grub.cfg文件,bootloader-id失效
        2.执行两次grub-install --removable前一次的grub.cfg会被后一次替换掉
        3.会在boot-directory/grub目录下生成引导文件
        4.引导过程
          4.1 执行efi-directory/BOOT目录下的efi文件
          4.2 配置模块加载目录为boot-directory/grub/x86_64-efi
          4.3 显示efi-directory/BOOT/grub.cfg配置的启动项菜单
      不使用--removable:
        1.会在efi-directory/bootloader-id目录下生成efi文件和grub.cfg文件
        2.会在boot-directory/grub目录下生成引导文件
        3.生成一条名称为bootloader-id,文件路径为efi路径的nvram启动项
        4.引导过程
          4.1 执行efi-directory/bootloader-id目录下的efi文件
          4.2 配置模块加载目录为boot-directory/grub/x86_64-efi
          4.3 显示efi-directory/boot-directory/grub.cfg配置的启动项菜单
      默认值:
        boot-directory=/boot,bootloader-id=ubuntu
      
  • 2.5 配置grub.cfg
    efi目录中的grub.cfg引用的grub.cfg还不存在,需要手动生成

    • 2.5.1. 配置os-prober

      sudo apt install os-prober #安装os-prober,用于查找系统并生成启动项
      修改配置文件/etc/default/grub
      GRUB_DISABLE_OS_PROBER=false #false表示启用os-prober true表示禁用os-prober
      
    • 2.5.2 自动生成grub.cfg

      sudo grub-mkconfig -o /boot-directory/grub/grub.cfg 
      
    • 2.5.3 手动添加启动项
      生成的grub.cfg中有一行是

      if [ -f  ${config_directory}/custom.cfg ]; then
        source ${config_directory}/custom.cfg
      elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
        source $prefix/custom.cfg
      fi
      

      所以我们只需要在grub.cfg同目录下面创建一个custom.cfg,在里面手动配置启动项就能被加载到

      • 2.5.3.1. 配置Linux启动项

        if [ "${grub_platform}" == "efi" ]; then
           menuentry "Ubuntu" {
              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
              search --no-floppy --fs-uuid --set=root 分区uuid
              linux	/boot/vmlinuz-6.5.0-28-generic root=UUID=分区uuid ro  
              initrd	/boot/initrd.img-6.5.0-28-generic
          }
        fi
        
      • 2.5.3.2 配置ubunutu的LiveCD启动项

        if [ "${grub_platform}" == "efi" ]; then
           menuentry "Ubuntu-LiveCD" {
               search --no-floppy --fs-uuid --set=root 分区uuid
               set iso_path="/ubuntu-23.10.1-desktop-amd64.iso"
               loopback loop $iso_path
               linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$iso_path
               initrd (loop)/casper/initrd
               boot
          }
        fi
        
      • 2.5.3.3. 配置windows11启动项

        if [ "${grub_platform}" == "efi" ]; then
           menuentry "Windows 11" {
              insmod part_gpt
              insmod part_msdos
              insmod fat
              insmod chain
              search --no-floppy --fs-uuid --set=root 分区uuid
              chainloader /EFI/Microsoft/Boot/bootmgfw.efi
          }
        fi
        
      • 2.5.3.4. 配置WinPE启动项

        if [ "${grub_platform}" == "efi" ]; then
           menuentry "Windows PE" {
              insmod part_gpt
              insmod part_msdos
              insmod fat
              insmod chain
              search --no-floppy --fs-uuid --set=root 分区uuid
              chainloader /EFI/boot/peboot.efi
          }
        fi
        
      • 2.5.3.5. 配置ArchLinux的LiveCD启动项

        if [ "${grub_platform}" == "efi" ]; then
           menuentry "Arch-LiveCD" {
              search --no-floppy --fs-uuid --set=root  分区uuid
              loopback loop /archlinux-2021.11.01-x86_64.iso
              linux (loop)/arch/boot/x86_64/vmlinuz-linux archisolabel=ARCH_202111  boot=arch iso-scan/filename=/archlinux-2021.11.01-x86_64.iso noprompt noeject
              initrd (loop)/arch/boot/x86_64/initramfs-linux.img
           }
        fi
        
      • 2.5.3.6. 配置其他的grub.cfg

        if [ "${grub_platform}" == "efi" ]; then
           menuentry "Windows PE UEFI" {
              insmod fat
              search --no-floppy --fs-uuid --set=root 分区uuid
              configfile /grub/grub.cfg
          }
        fi
        
  • 2.6 进入rescue急救模式
    由于启动项被破坏,导致系统无法启动,可以通过命令手动加载启动项
    按c进入急救模式

    • 2.6.1.查看磁盘和分区

       ls #查看所有磁盘和磁盘下的分区
      (hd0) (hd0,msdos9) (hd0,msdos8) (hd0,msdos7) (hd0,msdos6) (hd0,msdos5) (hd0,msdos2) (hd0,msdos1)
      
    • 2.6.2.查看目录和文件

      ls (hd0,msdos9)/xx #查看分区目录下
      cat (hd0,msdos9)/etc/fstab #查看文件内容
      
    • 2.6.3.设置root分区和模块搜索路径

      set root=(hd0,msdos9) #设置root分区,之后访问root分区的文件或目录都不需要加(hd0,msdos9)了
      ls /xx #查看root分区目录
      cat /etc/fstab # 查看文件内容
      
      set prefix=(hd0,msdos9)/boot/grub #设置模块搜索目录,之后既可以使用insmod加载指定的模块了
      lsmod fat #加载fat模块
      
    • 2.6.4.系统引导

      手动执行grub.cfg文件menuentry中配置的命令就行了
      
  • 2.7 grub2主题优化
    为了达到炫酷的效果,可以安装一些grub2的主题

    • 2.7.1 安装主题

      git clone https://github.com/vinceliuice/grub2-themes.git \
      sudo install.sh -b -t vimix \ #安装fonts,locale,themes目录到/boot/grub目录下
      sudo cp -r /boot/grub/themes /boot-directory/grub  #复制主题到另一个磁盘的boot目录
      
    • 2.7.2 重新生成grub.cfg

      sudo grub-mkconfig -o /boot-directory/grub/grub.cfg #重新生成grub.cfg,这时grub.cfg的界面就包含主题了
      #但是grub.cfg文件中引入的主题文件都是来自另一个磁盘的,我们需要手动修改grub.cfg中对这些主题文件的引用,都改成当前磁盘中的文件,这样就不依赖于另一个磁盘,即使另一个磁盘不在,也能正常展示主题了
      

LEGACY启动+MBR分区硬盘

  1. 创建MBR分区表

    sudo parted /dev/nvmeXn1 mklabel msdos
    
  2. 安装引导代码到引导扇区(MBR)

    sudo grub-install /dev/nvmeXn1 # nvmeXn1是磁盘,安装引导代码到磁盘的引导扇区(MBR)
    

LEGACY启动+GPT分区硬盘

首先主板必须支持从bios_grub分区启动,或者把分区方式改成Hybrid MBR,否则无法引导

  1. 创建GPT分区表

    sudo parted /dev/nvmeXn1 mklabel gpt
    
  2. 系统分区

    sudo fdisk /dev/nvmeXn1  #创建一个bios_grub分区
    n
    2048
    4095
    sudo parted /dev/nvmeXn1pY set 1 bios_grub on #设置分区标志为bios_grub,这个分区不能格式化
    
  3. 安装引导文件到bios_grub分区

    sudo mount /dev/nvmeXn1pY /mnt
    sudo grub-install --target=i386-pc /dev/nvmeXn1 --boot-directory=/mnt #安装引导文件到bios_grub分区
    

UEFI启动+ MBR分区硬盘

首先UEFI 固件必须支持 Legacy BIOS 兼容性模式(CSM),或者把分区改成Hybrid MBR,否则无法引导
其他和LEGACY启动+MBR分区硬盘几乎是一样的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值