双系统修复引导

之前装双系统都是先安装win10,然后安装linux发行版,这样引导是grub2引导最后留下了,基本上问题不是很大。但是最近作死,现状的manjaro然后再安装的win10,由于win10的引导覆盖了grub2,然后win10引导又不认linux启动项,造成了无法启动manjaro,查阅了一些资料记录一下。

核心思想就是引导仍然使用grub2,用grub2引导manjaro和win10系统,所以下面主要是安装grub2,这里我使用livecd完成的安装和配置,我自己的是用UEFI+GPT引导的64位系统,不是用于老的。

  • 查看基本分区情况

    # fdisk -l
      
    /dev/sda1 efi
    /dev/sda2 /
    /dev/sda3 swap
    /dev/sda4 win10
    
  • 挂载chroot所需的分区

    # mount /dev/sda2 /mnt
    # mkdir /mnt/efi
    # mount /dev/sda1 /mnt/efi
    # mount --bind proc /mnt/proc
    # mount --bind dev /mnt/dev
    # mount --bind sys /mnt/sys
    
  • chroot到新系统中安装gurb2并生成grub.cfg

    # chroot /mnt
      
    ## 安装grub2 
    # grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB
      
    ## 配置grub2
    # grub-mkconfig -o /boot/grub/grub.cfg
    

在安装grub2的时候可能会出现一个错误 EFI variables are not supported on this system

  ## 查阅了一些资料,发现原因是efivars 模块没有加载,可以退出chroot环境加载该模块。
  
  ## 退出chroot环境
  # exit
  
  ## 加载efivars
  # modprobe efivars
  
  ## 进入chroot环境继续操作
  # chroot /mnt

如果加载的时候出现错误提示modprobe: FATAL: Module efivars not found in directory /lib/modules/

  ## 在chroot环境中挂载efivars,然后再安装grub2
  # mount -t efivars efivars /sys/firmware/efi/efivars
  • 添加win10启动项

因为我的livecd没有网络,所以这部分最好是重启进入Manjaro中添加启动项,主要是利用os-prober来探测win10的启动项可能需要ntfs-3g的支持。

  ## 重启进入正常的Manjaro 系统中打开终端
  # pacman -Sy ntfs-3g
  
  ## 挂载win10硬盘,我这里是/dev/sda4
  # mount /dev/sda4 /mnt
  # os-prober partition /dev/sda4 /mnt
  # os-prober
  
  ## 上面的命令基本上就可以探测到并做好配置了,下面只需要更新一下grub配置文件
  # update-grub
  ## 输出的信息中可以看到windows启动项的配置文件。
  
  ## 可以修改/etc/default/grub配置文件来改动默认启动和引导界面的时间
  # vi /etc/dafault/grub 
  ## 记得更新配置文件
  # update-grub