多操作系统安装与引导原理(Windows、Deepin)

作者 Marlous 日期 2018-10-14
多操作系统安装与引导原理(Windows、Deepin)

注意:
搞清楚每个操作系统的安装位置。操作系统使用的 bootloader 是什么,安装在哪。

参考:
参考资料 1
参考资料 2
参考资料 3

一 系统引导原理

1 概述

  1. BIOS:
  • BIOS(上电自检)–>
  • MBR 的主引导程序(bootloader 自身的一小部分)–>
  • 启动引导程序 bootloader(Grub/Bootmgr。bootloader 的其他部分,安装到磁盘上的可用空间中。这段可用空间位于常规 MBR 末尾和第一个分区的起始位置之间。)–>
  • OS
  1. UEFI:
  • UEFI(上电自检)–>
  • ESP 分区即启动项存放位置分区(EFI/BOOT/一大堆 efi 后缀名的文件)–>
  • 启动引导程序 bootloader(Grub/Bootmgr)->
  • OS

2 详解

  • Windows(BIOS + MBR):
    上电 –> Legacy BIOS –> MBR –> DPT –> PBR –> Bootmgr/NTLDR –> BCD/boot.ini –> Winload.exe –> 内核加载 –> Windows

  • Windows(UEFI + GPT):
    上电 –> UEFI –> GPT 分区表 –> EFI 分区(ESP)–> \efi\Microsoft\boot\bootmgfw.efi –> efi\Microsoft\BCD→\Windows\system32\winload.efi

3 补充

  • 两种引导方法:UEFI、BIOS(BIOS + MBR 或 UEFI + GPT)。

  • UEFI、BIOS 两种完全不一样。

  • 作为 bootloader 的 Grub 可以直接引导 Windows,但是作为 bootloader 的 Bootmgr 无法直接引导 Linux,需要用 EasyBCD 来设置添加 Linux 的启动项。

  • 一块硬盘进行高级格式化(逻辑分区),方便管理。(低级格式化为分磁道扇区)。主流分区机制为 MBR、GPT 两种。分区个数取决于分区表所能存储的描述磁盘分区的情况。

  • UEFI 引导中:ESP 分区,Windows 下想访问 ESP 分区需用分区工具给它分配盘符并取消隐藏;而 Linux 则直接将这个分区挂载到 /boot/efi。

  • GPT:一个较新的分区机制,解决了 MBR 很多缺点。向后兼容 MBR,必须在 UEFI 硬件上使用,必须为 64 位系统,Mac、Linux 都支持 GPT 分区格式。

  • MBR:最多 4 个主分区,或者 3 个主分区加 1 个扩展分区,扩展分区中的逻辑分区可分多个。由磁盘操作系统对硬盘进行初始化时产生的。
    MBR 结构
    硬盘

  • 传统 BIOS 引导 Windows 操作系统时,是通过一个活动的主分区下的 bootmgr(启动管理器)文件导入根目录下 boot 文件夹里的 BCD(启动设置数据)文件,然后 BCD 文件根据自身的配置内容加载系统启动文件 winload.exe(位置:根目录 \Windows\system32\winload.exe)来启动系统。一个 BCD 文件可以加载多个系统启动文件从而实现引导多个系统的启动。

二 Windows 与 Deepin 双系统安装

Deepin 官方文档:文档
安装教程 1 不需要设置引导:文档
安装教程 2 需设置引导:文档

  1. 注意:
  • 安装 Linux 时会选择 Grub 安装位置。往 MBR 上装,往 Linux 系统所在的分区的第一个扇区里装。本文是前者,一般前者不会出问题。
  • 一般先安装 Windows,后装 Linux,安装 Linux 会自动配置好引导,反过来 Windows 比较霸道会覆盖掉 Linux 的引导。
  • Grub 开机启动管理软件更加方便进行多操作系统引导。
  • 可用 EasyBCD 备份好引导文件。
  • 可以用 Grub 引导;或用 BOOTMGR 引导。
  1. 安装过程:Wubi 安装最简单稳妥;U 盘安装;不用 U 盘安装。
  • U 盘安装(用 Grub 引导):Windows 下准备好划分出一定的磁盘空间;用 UltraISO 解压出其中的 deepin-boot-maker.exe,用它来制作 U 盘映像;设置 BIOS 启动顺序等其他配置;安装 Linux 后重启;进入 Windows 用 EasyBCD 配置好引导问题(如果无法进入 Linux 的话需此步)。
  • 不用 U 盘(用 BOOTMGR 引导):(参见安装教程 2)Windows 下准备好划分出一定的磁盘空间;用 EasyBCD 配置好引导问题;重启电脑,就可以找到新添加的 NeoGrub 启动项,选中它启动 live 版本 deepin 安装。
  • Wubi 安装:不需要考虑引导,如支持 Wubi 安装。如同 Windows 操作系统里的其他软件一样安装卸载 Linux。
  1. 补充:用 U 盘安装后,改为用 BOOTMGR 引导。启动引导设置、用 BOOTMGR 引导参考文章
  • 进入 windows,可以设置当前引导为 Bootmgr(已经是的不用),也就是主引导记录 MBR 设置为:Windows NT 6.x MBR,分区引导记录为:BOOTMGR 引导程序,通过用 EasyBCD 和 BOOTICE 都可以。
  • 使用 EasyBCD,添加 Linux 启动项。
  1. 补充:卸载 Linux。
    用 U 盘安装,下次不想使用 Linux 前,用 PE 恢复 MBR 引导(如第三点)或用 EasyUEFI 删除其启动项(前 BIOS + MBR,后 UEFI + GPT 情况),然后进 Windows 删除其分区。参考:Windows 下卸载

三 引导修复及卸载问题

参考博文
启动引导设置、用 BOOTMGR 引导参考文章

1 概述

Linux 引导出问题:用 Linux 的 U 盘挂载上 Linux 所在分区,安装 Grub(会自动配置好 Windows 的启动项);
Windows 引导出问题或两个都出问题:(用 Grub 引导的方式)用 PE 先修复 MBR,后安装 Grub,和配置 Grub 中的 Windows 引导。

2 具体实践

  1. U 盘 PE 恢复 MBR 引导:
    使用 U 启动盘(老毛桃 PE)进入 PE,用 NTBOOTautofix 修复 MBR;然后用 DiskGenius,选择 C 盘,分区 > 激活当前分区 > 保存更改。
    删除 Linux 导致 windows 进入不了,也可以使用此方法。

  2. U 盘 Linux 系统挂载安装 Grub:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 创建挂载目录
    sudo mkdir -p /mnt/temp

    # 挂载分区
    mount /dev/sda5 /mnt/temp

    # 重装 Grub
    grub2-install --root-directory=/mnt/temp /dev/sda

    # 使生效
    sudo apt-get update
  3. 使用 grub rescue 模式来重装 Grub 恢复引导:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # 查看各分区文件系统类型,确定哪个是 Deepin 系统安装位置,文件系统为 ext。
    ls
    ls (hdx,msdosy) # x,y 为数字,参见 ls 命令后显示的分区情况。

    # 如果之前安装 Linux 时没有分 /boot 分区:
    ls (hdx,msdosy)/boot/grub
    set root=(hdx,msdosy)
    set prefix=(hdx,msdosy)/boot/grub
    insmod normal
    normal

    # 如果之前安装 Linux 时分出了 /boot 分区:
    ls (hdx,msdosy)/grub
    set root=(hdx,msdosy)
    set prefix=(hdx,msdosy)/grub
    insmod normal
    normal

    # 回车进入 Linux,命令行输入命令:
    sudo update-grub
    sudo grub-install /dev/sda
  4. Grub 中添加操作系统启动项:
    自定义菜单项 menuentry 构建参考
    多操作系统添加启动项前,可先备份 grub.cfg,要想办法搞清楚每个系统安装位置,可在 Linux 下查看;UUID 查看命令 sudo blkid
    可编辑的 Grub 2 配置文件主要包括 /etc/default/grub、和 /etc/grub.d/ 下的各文件。
    自定义菜单项一般存放在 /etc/grub.d/40_custom 文件中。编辑完运行 update-grub 命令。

  • 构建 menuentry 中的主要项:

    1
    2
    3
    4
    5
    6
    7
    menuentry "显示的操作系统名" {
    insmod part_msdos
    insmod ntfs # 文件系统类型。
    set root='hd0,msdos1' # hd0 为第几块硬盘,1 为第几个分区。
    search --no-floppy --fs-uuid --set=root 7E58BCF758BCAF71 # 磁盘用 UUID 来标记,更精确。
    chainloader +1
    }
  • grub.cfg 中的模板:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    menuentry 'Deepin 15.7 GNU/Linux' --class deepin --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-f179bdda-0718-4b4c-8408-4b06f5483456' {
    load_video
    insmod gzio
    if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos3'
    if [ x$feature_platform_search_hint = xy ]; then
    search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos3 --hint-efi=hd0,msdos3 --hint-baremetal=ahci0,msdos3 f179bdda-0718-4b4c-8408-4b06f5483456
    else
    search --no-floppy --fs-uuid --set=root f179bdda-0718-4b4c-8408-4b06f5483456
    fi
    linux /boot/vmlinuz-4.15.0-29deepin-generic root=UUID=f179bdda-0718-4b4c-8408-4b06f5483456 ro splash quiet
    initrd /boot/initrd.img-4.15.0-29deepin-generic
    }


    menuentry 'Windows 10 (on /dev/sda1)' --class windows --class os $menuentry_id_option 'osprober-chain-7E58BCF758BCAF71' {
    insmod part_msdos
    insmod ntfs
    set root='hd0,msdos1'
    if [ x$feature_platform_search_hint = xy ]; then
    search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 7E58BCF758BCAF71
    else
    search --no-floppy --fs-uuid --set=root 7E58BCF758BCAF71
    fi
    parttool ${root} hidden-
    drivemap -s (hd0) ${root}
    chainloader +1
    }

四 小结

BIOS + MBR 模式。

  • 搞清楚 MBR 的开机管理程序(boot loader)是 Grub 还是 BOOTMGR;谁调用谁进入第二个操作系统。
    开机管理程序是谁,就在谁添加另一个被调用的启动项(是 Grub,会自动设置好;是 BOOTMGR,需要手动进 Win 添加 Linux 启动项)。

  • 搞清楚哪个操作系统没法启动,然后修复,详情见第三部分。

五 补充:安装多个 Linux 操作系统

参考文档

  • Windows 下安装第二个操作系统 Linux 时,会选择 Grub 安装位置。往 MBR 上装,往 Linux 系统所在的分区的第一个扇区里装。一般安装在 MBR。

  • MBR 是各个系统的必争之地,尤其是 Windows 一旦重装, MBR 记录就被覆盖, GRUB 也会不见。先后安装两个 Linux,其 Grub 都往 MBR 上修改指向自己,留下的只会是后来者。Grub 会自动识别配置引导。