最近因为更换一台DELL XPS的SSD遇到启动修复的麻烦,上网查找了不少资料,特此做个小结。咱们这里不做太具体的技术探究,只把术语和概念说清楚。
PC系统(主要是IBM-PC x86 或者 x86_64)从加电到加载操作系统要经过三个主要的部件——BIOS,硬盘分区,引导程序。
BIOS
BIOS 是Basic Input/Output System的缩写,简而言之是一组固化在主板上的程序,主要负责硬件的输入输出,带有系统的基本信息,并且做开机自检 POST(Power-On Self-Test) 。主要有三个厂商,AWARD,AMI和Pheonix。BIOS分为两大类——Legacy BIOS和UEFI( Unified Extensible Firmware Interface) BIOS。以前的模式就是Legacy BIOS,现在比较多使用UEFI BIOS,至于为何要变,当然就是因为后面两个东西变了,导致引导产生新的问题,所以要跟着改变了。
启动的时候BIOS先做自检,然后找到所有可以引导的设备,跟着就去硬盘(或者软盘)分区读取引导信息。BIOS在启动这块儿无论哪个版本都大差不差,尽管细节有很多不同,但不是本文的主要内容,有兴趣可以自己搜索或者Wiki。
硬盘分区
首先说一下“硬盘”这个词,以前是指磁盘,现在泛指HDD、SDD、USB等等。硬盘生产出来以后虽然BIOS是能认识,但操作系统还是不认识。操作系统需要分为多个逻辑空间并且格式化以后才能真正用起来。我们在这里说的“分区”泛指分区和格式化两个操作。
分区也很简单,就是在一个叫分区表的地方标记硬盘某个区域是一个分区,然后指明这个分区是什么类型的,比如:FAT,NTFS,EXT3等等。
分区完成后操作系统就可以看到了,但真正要读写数据还是差了点儿东西——格式化。格式化就是检查一下分区的状态丫,配置一下分区的最小单元等等信息。有了这些信息操作系统就才可以随心所欲地使用这个分区了。
分区也有两大类,MBR和GPT。
MBR(Master Boot Record)
MBR就是旧的分区方式,以前只能分4个区,开始的时候4个都是主分区,每个主分区都可以引导不同的操作系统。有一点不太人性化的地方就是那个主分区要引导,就要用工具把那个分区设置成为活动分区。
4个分区当然很快就发现不够用了。以后更新了一下,变成可以分3个主分区和一个扩展分区,扩展分区不能引导操作系统,但可以划分很多个逻辑分区。微软比较省,以前只支持一个主分区和一个扩展分区,而且同时只能够挂载26个盘(26个英文字母),当然微软新版本的分区管理没有这些限制。
要留意一个问题,MBR不能管理超过2TB的分区,由于MBR主要涉及引导,所以其实最大的影响就是超过2TB的分区不能引导。操作系统加载以后操作系统本身可以管理超过2TB的分区,但旧版操作系统不能管理大分区是另外一个问题,与MBR无关。
GPT(GUID Partition Table)
简单来说,GPT用GUID描述分区,没有数量、容量和引导的限制,不需要设置活动分区,用配置表选择就可以了。但唯一的限制是必须使用UEFI BIOS引导啦。
下面再说说GPT里面常见的两个分区——ESP和MSR。ESP是独立分区,主要用于存储引导管理程序、驱动程序等内容,就像MBR里面所说的活动分区。全新安装Windows的硬盘通常会创建这个分区,需要支持多个操作系统引导的也建议使用。MSR是微软Windows的保留分区,是GPT磁盘上用于保留空间以供备用的分区。例如在将磁盘转换为动态磁盘时会使用这些空间。MSR分区也用于防止将GPT磁盘接到低版本系统后,硬盘被当作未格式化的空硬盘而继续操作(例如重新格式化)导致数据丢失。
分区工具
这里不得不提一下硬盘分区的工具。每一个操作系统都会自带硬盘分区工具,如:fdisk (win/Lin),diskpart,windows磁盘管理等。对于自己版本的操作系统支持肯定是最好的,但对于多操作系统的引导或者不想破坏数据的情况下改变分区就不友好了,这种情况下就要求助于第三方分区工具,如:diskgenius,PatitionMagic,Acronis Disk Director Suite,DM等。
MBR和GPT的比较
参考知乎上面的材料,我抽象了一下两种分区的设计思想。MBR基本都是写死,BIOS控制前半部的引导过程,直接把棒子交到操作系统引导程序NTLDR、BOOTMGR、GRUB等的手上。而GPT都是软件定义的,因为可以直接访问分区(ESP),所以设备类型、大小、位置、驱动,操作系统位置、版本啥都是在BCD里面定义的。UEFI BIOS启动以后,先把棒子交给EFI,EFI通过读取BCD的配置找到要引导程序(NTLDR、BOOTMGR、GRUB等)。
PBR(Partition Boot Record,分区引导记录)
硬盘活动分区的第一个扇区。这个扇区叫做“分区引导记录”(PBR)。分区引导记录标识了用于引导操作系统的程序位置。
引导过程小结
一般来说有三种引导的组合,以windows为例
- Legacy BIOS+MBR
Legacy BIOS->MBR->活动分区->\bootmgr->\Boot\BCD->\Windows\System32\winload.exe - UEFI BIOS + MBR
Windows没有这种组合,Linux鲜有这种组合,我就当没有这种组合,嘿嘿 - UEFI BIOS + GPT
UEFI BIOS->ESP(FAT格式)->\EFI\Microsoft\boot\bootmgfw.efi->\EFI\Microsoft\BCD->\Windows\system32\winload.efi
各种操作系统的典型启动过程
操作系统版本 | BIOS部分 | 分区部分 | 操作系统部分 | ||
自检 | 加载引导扇区 | 加载引导记录 | 启动管理器 | ||
DOS 6.22 | POST | 找到硬盘上的主引导记录MBR 读取硬盘分区表 | 把控制权交给活动分区中的PBR IO.sys | MSDOS.sys | Command |
Win98 | POST | 找到硬盘上的主引导记录MBR 读取硬盘分区表 | 把控制权交给活动分区中的PBR IO.sys | MSDOS.sys | 与DOS类似,最后加上win进入win98的GUI |
WinXP | POST | 找到硬盘上的主引导记录MBR 读取硬盘分区表 | 把控制权交给活动分区中的PBR | NTLDR boot.ini | ntoskrnl |
Win7 | POST | 找到硬盘上的主引导记录MBR 读取硬盘分区表 | 把控制权交给活动分区中的PBR | BOOTMGR BCD | winload |
Win10 | 读取GPT 加载引导记录 | EFI\BOOT\bootx64.efi(bootia32.efi) 或EFI\MICROSOFT\BOOT\bootmgfw.efi | BCD | winload.efi | |
RHEL5 | POST | 找到硬盘上的主引导记录MBR 读取硬盘分区表 | 把控制权交给活动分区中的PBR | LILO | |
RHEL7 | 读取GPT 加载引导记录 | GRUB |
典型启动问题处理
先说引导修复的大原则。就是看3个地方——BIOS、分区、引导。BIOS比较简单,BIOS要注意挑选合适的硬盘,Legacy BIOS对MBR,UEFI BIOS对GPT。新的BIOS可以同时支持Legacy和UEFI,要看清楚。分区最好用分区工具看,MBR留意三个地方,主分区、活动分区,分区是否小于2TB。只有同时满足这三个情况MBR启动才能生效。GPT没有MBR这么多事,但也有新的问题——BCD。BCD要配置正确的分区信息才能找到winload.efi。其中往往容易忽视的是GUID,因为GUID是全球唯一的,通过Ghost复制基本上都会产生错误。所以Ghost安装Win10(UEFI模式)一定要用BCD工具修复。
NTLDR is missing
解决方案:基本上可以断定是文件缺失,该分区有引导的信息,缺没有这些引导的文件。
BOOTMGR is missing
解决方案:基本上可以断定是文件缺失,该分区有引导的信息,缺没有这些引导的文件。
Can't find winload (winload.efi)
解决方案:如果是Ghost安装,要注意BCD的配置是否正确指向分区。通过BCDboot,BOOTICE等工具修复。
参考文献
【科普】UEFI+GPT、Legacy+MBR引导模式介绍 & 引导修复
UEFI+GPT,Legacy+MBR引导模式介绍和引导修复
https://jingyan.baidu/article/eb9f7b6dac24c3869364e801.html
Windows 7开机启动流程(原理)
最近因为更换一台DELL XPS的SSD遇到启动修复的麻烦,上网查找了不少资料,特此做个小结。咱们这里不做太具体的技术探究,只把术语和概念说清楚。
PC系统(主要是IBM-PC x86 或者 x86_64)从加电到加载操作系统要经过三个主要的部件——BIOS,硬盘分区,引导程序。
BIOS
BIOS 是Basic Input/Output System的缩写,简而言之是一组固化在主板上的程序,主要负责硬件的输入输出,带有系统的基本信息,并且做开机自检 POST(Power-On Self-Test) 。主要有三个厂商,AWARD,AMI和Pheonix。BIOS分为两大类——Legacy BIOS和UEFI( Unified Extensible Firmware Interface) BIOS。以前的模式就是Legacy BIOS,现在比较多使用UEFI BIOS,至于为何要变,当然就是因为后面两个东西变了,导致引导产生新的问题,所以要跟着改变了。
启动的时候BIOS先做自检,然后找到所有可以引导的设备,跟着就去硬盘(或者软盘)分区读取引导信息。BIOS在启动这块儿无论哪个版本都大差不差,尽管细节有很多不同,但不是本文的主要内容,有兴趣可以自己搜索或者Wiki。
硬盘分区
首先说一下“硬盘”这个词,以前是指磁盘,现在泛指HDD、SDD、USB等等。硬盘生产出来以后虽然BIOS是能认识,但操作系统还是不认识。操作系统需要分为多个逻辑空间并且格式化以后才能真正用起来。我们在这里说的“分区”泛指分区和格式化两个操作。
分区也很简单,就是在一个叫分区表的地方标记硬盘某个区域是一个分区,然后指明这个分区是什么类型的,比如:FAT,NTFS,EXT3等等。
分区完成后操作系统就可以看到了,但真正要读写数据还是差了点儿东西——格式化。格式化就是检查一下分区的状态丫,配置一下分区的最小单元等等信息。有了这些信息操作系统就才可以随心所欲地使用这个分区了。
分区也有两大类,MBR和GPT。
MBR(Master Boot Record)
MBR就是旧的分区方式,以前只能分4个区,开始的时候4个都是主分区,每个主分区都可以引导不同的操作系统。有一点不太人性化的地方就是那个主分区要引导,就要用工具把那个分区设置成为活动分区。
4个分区当然很快就发现不够用了。以后更新了一下,变成可以分3个主分区和一个扩展分区,扩展分区不能引导操作系统,但可以划分很多个逻辑分区。微软比较省,以前只支持一个主分区和一个扩展分区,而且同时只能够挂载26个盘(26个英文字母),当然微软新版本的分区管理没有这些限制。
要留意一个问题,MBR不能管理超过2TB的分区,由于MBR主要涉及引导,所以其实最大的影响就是超过2TB的分区不能引导。操作系统加载以后操作系统本身可以管理超过2TB的分区,但旧版操作系统不能管理大分区是另外一个问题,与MBR无关。
GPT(GUID Partition Table)
简单来说,GPT用GUID描述分区,没有数量、容量和引导的限制,不需要设置活动分区,用配置表选择就可以了。但唯一的限制是必须使用UEFI BIOS引导啦。
下面再说说GPT里面常见的两个分区——ESP和MSR。ESP是独立分区,主要用于存储引导管理程序、驱动程序等内容,就像MBR里面所说的活动分区。全新安装Windows的硬盘通常会创建这个分区,需要支持多个操作系统引导的也建议使用。MSR是微软Windows的保留分区,是GPT磁盘上用于保留空间以供备用的分区。例如在将磁盘转换为动态磁盘时会使用这些空间。MSR分区也用于防止将GPT磁盘接到低版本系统后,硬盘被当作未格式化的空硬盘而继续操作(例如重新格式化)导致数据丢失。
分区工具
这里不得不提一下硬盘分区的工具。每一个操作系统都会自带硬盘分区工具,如:fdisk (win/Lin),diskpart,windows磁盘管理等。对于自己版本的操作系统支持肯定是最好的,但对于多操作系统的引导或者不想破坏数据的情况下改变分区就不友好了,这种情况下就要求助于第三方分区工具,如:diskgenius,PatitionMagic,Acronis Disk Director Suite,DM等。
MBR和GPT的比较
参考知乎上面的材料,我抽象了一下两种分区的设计思想。MBR基本都是写死,BIOS控制前半部的引导过程,直接把棒子交到操作系统引导程序NTLDR、BOOTMGR、GRUB等的手上。而GPT都是软件定义的,因为可以直接访问分区(ESP),所以设备类型、大小、位置、驱动,操作系统位置、版本啥都是在BCD里面定义的。UEFI BIOS启动以后,先把棒子交给EFI,EFI通过读取BCD的配置找到要引导程序(NTLDR、BOOTMGR、GRUB等)。
PBR(Partition Boot Record,分区引导记录)
硬盘活动分区的第一个扇区。这个扇区叫做“分区引导记录”(PBR)。分区引导记录标识了用于引导操作系统的程序位置。
引导过程小结
一般来说有三种引导的组合,以windows为例
- Legacy BIOS+MBR
Legacy BIOS->MBR->活动分区->\bootmgr->\Boot\BCD->\Windows\System32\winload.exe - UEFI BIOS + MBR
Windows没有这种组合,Linux鲜有这种组合,我就当没有这种组合,嘿嘿 - UEFI BIOS + GPT
UEFI BIOS->ESP(FAT格式)->\EFI\Microsoft\boot\bootmgfw.efi->\EFI\Microsoft\BCD->\Windows\system32\winload.efi
各种操作系统的典型启动过程
操作系统版本 | BIOS部分 | 分区部分 | 操作系统部分 | ||
自检 | 加载引导扇区 | 加载引导记录 | 启动管理器 | ||
DOS 6.22 | POST | 找到硬盘上的主引导记录MBR 读取硬盘分区表 | 把控制权交给活动分区中的PBR IO.sys | MSDOS.sys | Command |
Win98 | POST | 找到硬盘上的主引导记录MBR 读取硬盘分区表 | 把控制权交给活动分区中的PBR IO.sys | MSDOS.sys | 与DOS类似,最后加上win进入win98的GUI |
WinXP | POST | 找到硬盘上的主引导记录MBR 读取硬盘分区表 | 把控制权交给活动分区中的PBR | NTLDR boot.ini | ntoskrnl |
Win7 | POST | 找到硬盘上的主引导记录MBR 读取硬盘分区表 | 把控制权交给活动分区中的PBR | BOOTMGR BCD | winload |
Win10 | 读取GPT 加载引导记录 | EFI\BOOT\bootx64.efi(bootia32.efi) 或EFI\MICROSOFT\BOOT\bootmgfw.efi | BCD | winload.efi | |
RHEL5 | POST | 找到硬盘上的主引导记录MBR 读取硬盘分区表 | 把控制权交给活动分区中的PBR | LILO | |
RHEL7 | 读取GPT 加载引导记录 | GRUB |
典型启动问题处理
先说引导修复的大原则。就是看3个地方——BIOS、分区、引导。BIOS比较简单,BIOS要注意挑选合适的硬盘,Legacy BIOS对MBR,UEFI BIOS对GPT。新的BIOS可以同时支持Legacy和UEFI,要看清楚。分区最好用分区工具看,MBR留意三个地方,主分区、活动分区,分区是否小于2TB。只有同时满足这三个情况MBR启动才能生效。GPT没有MBR这么多事,但也有新的问题——BCD。BCD要配置正确的分区信息才能找到winload.efi。其中往往容易忽视的是GUID,因为GUID是全球唯一的,通过Ghost复制基本上都会产生错误。所以Ghost安装Win10(UEFI模式)一定要用BCD工具修复。
NTLDR is missing
解决方案:基本上可以断定是文件缺失,该分区有引导的信息,缺没有这些引导的文件。
BOOTMGR is missing
解决方案:基本上可以断定是文件缺失,该分区有引导的信息,缺没有这些引导的文件。
Can't find winload (winload.efi)
解决方案:如果是Ghost安装,要注意BCD的配置是否正确指向分区。通过BCDboot,BOOTICE等工具修复。
参考文献
【科普】UEFI+GPT、Legacy+MBR引导模式介绍 & 引导修复
UEFI+GPT,Legacy+MBR引导模式介绍和引导修复
https://jingyan.baidu/article/eb9f7b6dac24c3869364e801.html
Windows 7开机启动流程(原理)