浅谈系统安装流程
by lblneva
2018.09.12
-
前言
最近开始带Windows Server系列课程,第一课惯例为历史、安装及安装后的简单操作,对此突发感慨。
新接触计算机系统的人,这样的安排顺序并不是很好。作为没有太多基础的人接触安装,对里面涉及到的一些概念完全不明白,按照课程指点虚拟机安装完成后很多东西都半懂不懂,糊弄下就过去了。实际什么都没有掌握。在实际工作中,经常见到一些招聘过来的同事连简单的系统安装都不会,更别说对启动故障进行排除。所以像是redhat的课程将安装放到最后其实是很有道理的。
借着这次机会,梳理下系统的安装流程及简单的细节分析。这次梳理对基础还是有一些要求。
-
系统安装的本质
就笔者个人理解,所有的主流操作系统安装流程不外乎分为2个步骤:
-
释放(复制)系统文件;
-
建立引导。
计算机实际是非常愚蠢的,需要你指定任务指定细节后按照设定的程序完成预定工作。想要和人一样创造性的完成工作一般是很困难的。所以在做任何工作前要多想想,愚蠢到一定境界的机器,如果不指定明白那些东西会出现逻辑错误。而这些就是你需要的操作。
-
系统安装的流程
-
释放(复制)系统文件
-
-
-
-
-
以第一步骤”释放(复制)系统文件”为例,这里涉及到以下几个方面:
-
系统文件在那里;
-
要释放到什么位置。
-
-
-
-
系统文件在那里:一般就为我们安装系统使用的安装介质。如安装光盘、U盘、网络文件服务器等,只要里面存放着系统文件即可。具体看你的安装类型为什么,笔者这里不做探讨。
要释放到什么位置:在Windows中一般指的就是C盘,Linux及类Unix中一般指的是/盘(根盘)。
-
一些概念性的东西:
这里涉及到了一些的基础知识:计算机的C盘是什么,什么是磁盘(硬盘),什么是分区等。举个例子:
为了有条理的存放一些文件,我们买到一个文件柜。我们将文件柜分为多个格子。每个格子位置按照规划存放不同的东西。
在计算机中,磁盘就相当于文件柜,按照规划需求将其分为多个区域存放不同的数据,就相当于刚刚提到的将文件柜分为多个格子用来存放不同的东西。如下图所示:

计算机中的分区在划分好后,需要格式化才能使用。格式化可简单理解为规定如何在分区内管理与存放文件。类似文件柜中规划第一个格子只用来存放以文件袋装好的文件,文件数量最大是多少,文件的名字有多长什么的。第二个格子用来存放以档案盒收纳起的文件。目前Windows操作系统常用的文件系统格式为NTFS。Linux近期主流发行版本常用的文件系统格式为XFS。
在Windows中,习惯性的使用英文字母(从A到Z)依次对分区进行编号。如分区1分配的编号是A,我们就叫其A盘,其中A被成为盘符。如某个分区编号为C,我们就叫其C盘(也叫做分区C,C卷等,都为同一个东西)。
在早期Windows中(如windows 95),其运行是建立在另外一套操作系统(DOS)上的。在那个时期,磁盘不像现在这么普及,磁盘特点是容量低价格贵,人们主要使用的存储介质是软盘。如图所示:

大的是5.25寸软盘,小的是3.5寸软盘
很多人发现Windows的盘符默认是C,这是因为早期A盘和B盘是特指3.5寸与5.25寸软盘,磁盘/光盘在当时的系统中分区为C盘。早期Windows安装到磁盘分区中后,按照顺字母排列序,默认盘符就是C了。这个习惯一直保留到现在,其本身是历史产物,约定成俗。
对上文提到的第一个步骤”要释放到什么位置”流程做个简单梳理,可得到下面3个步骤:

-
释放(复制)系统文件的实验验证
这里以Windows Server 2016为例,做一次简单的相关验证:
-
-
-
-
-
-
准备工作
-
-
虚拟机环境如下:

光盘使用Windows Server 2016镜像
-
释放(复制)系统文件
-
对磁盘按照需求进行分区
-
这里对磁盘做2个分区。第一个分区安装操作系统,大小为40G左右。第二个分区假设用于存放软件信息,使用所有剩余空间。
为了更好提现本文说明内容,笔者将不使用Windows安装程序所使用的分区工具,而是调出cmd,运行diskpart命令进行分区。关于diskpart的使用这里不做探讨。

安装程序中选择修复系统里的CMD

可以看到当前磁盘没有任何设置,就是一个60G的新磁盘

对磁盘进行分区,划分为40G的分区1与19G的分区2。按照规划,分区1用于存放Windows

对分区1进行格式化,格式化类型为NTFS,卷标为Windows2016,并给这个分区分配一个盘符Z,即Z盘
-
选定分区准备安装操作系统
通过3.2.2.1的截图,可知笔者设置的Windows安装分区被指定为Z盘(安装Windows后会自动变更为C盘)。在默认情况下,新磁盘使用Windows的安装光盘启动后的光盘盘符为D盘。

可以看到Z盘是空盘。光盘(D盘)安装源中操作系统文件镜像文件install.wim
-
从安装源处释放(复制)系统文件到选定分区
这里笔者使用dism工具对Windows Server 2016进行版本选择与系统文件释放(复制)

查看镜像中包含的操作系统版本,并将其释放到安装分区。这里我选择了索引为4、带桌面的数据中心版本,并将其释放到Z盘

可以看到Z盘已经有了释放完毕Windows系统文件
至此第一部分结束
-
移除光盘,我们发现计算机还是不可以启动,感觉像是坏了

移除安装源(光盘)后发现系统不可以启动,这是因为没有引导的原因。并不是很多人认为的计算机坏掉了
-
建立引导
释放完系统文件到磁盘选定的分区后,就要建立引导用来引导操作系统实现系统启动了。换句话说是告诉计算机,你开机要运行那些东西来完成系统启动。
每个人买计算机的时间与硬件种类都是不同的。需要安装的操作系统有可能早于计算机出,也可能晚于计算机出。如在2007年买的笔记本电脑,准备安装Windows 10。想想,如果你是计算机,怎么会知道如何启动Windows 10?Windows 10出的时间比2007年买的笔记本电脑要晚的多!由于计算机磁盘等原因,系统启动实际是通过引导加载程序进行中转启动的(见3.3.2)。
为解决上述问题,我们需要定制一个标准,这个标准需要处理的问题概括下来为下列3个:
- 从那个设备启动?
- 启动的文件是什么?(引导加载程序)
- 启动的文件需要的启动信息有那些?(包含要启动系统或程序文件名字和存放的位置)
随着时代进步,磁盘越来越大。早期标准不适合现今大容量磁盘情况。启动技术也在近代按照设备类型及需求演化出2个种类:
- BIOS(用在早期及现在的计算机中);
- UEFI(用在新计算机中)。
这里笔者以提到的2种技术对解决以上启动问题做个简单陈述。
-
-
BIOS引导
-
在BIOS引导中,这3个解决问题的方式大致如下:
-
从那个设备启动的问题
这个问题的解决方法是需要手动在计算机BIOS里指定的,如下图:

BIOS启动设置
这里,我们以从上到下依次匹配方式来解决计算机开启从那个设备启动(如果找到引导加载程序,则忽略下方设备,并执行引导加载程序)。
按照上图BIOS启动设置,查找设备启动过程为:
- 开机先查找移动设备中的引导加载程序;
- (如1没有找到)查找硬盘设备中的引导加载程序,首先查找SCSI总线硬盘中的引导加载程序;
- (如2没有找到)查找可引导插卡中的引导加载程序;
- (如3没有找到)查找光盘中的引导加载程序;
- (如4没有找到)查找网络中PEX启动固件中的DHCP获取信息中有引导加载程序;
-
以上都没有找到。屏幕返回没有找到操作系统信息。也就是很多人当做电脑”翻船”的黑屏画面,如下图:
系统没有找到启动程序,计算机不知道要干什么。所以计算机直接停止工作,不是坏掉了
如果系统与引导加载程序装到光盘,按照上文BIOS界面顺序,启动过程将在第四步中找到光盘内的引导加载程序,并按照引导加载程序加载的引导程序与引导信息启动对应的系统或程序。
-
引导加载程序是什么
-
引导加载程序执行后会在活动分区查找特定程序(引导程序、启动程序,看引导加载程序的设置),找的引导程序后启动引导程序,由引导程序读取系统存放位置信息文件(启动项配置文件)来启动系统。
目前的主流启动技术,主要有Windows NT(目前NT6为主流)引导加载程序与GRUB/GRUB2引导加载程序,这2类的启动引导主要是起启动中转作用。即启动引导真正系统的启动文件,通过启动文件来启动操作系统,并不是直接启动操作系统本身。以Windows NT6引导加载为例,如下图:

早期磁盘容量有限,主流的磁盘类型为MBR。这个技术标准中磁盘前512字节为MBR信息。里面包含了3部分:64字节的分区表;446字节的引导加载程序;2字节的magic number(通常为55AA,结束标志)。
对现今BIOS+MBR磁盘引导来说,其安装时会在MBR中安装446字节的引导加载程序。这446字节的引导程序只负责搜索活动分区内的特定启动程序并启动启动程序。这样系统本身的启动会和磁盘的MBR解耦,通过2次启动加载(可以理解为中转)为以后操作系统的引导留下余地。话说回来大小这么可怜的引导加载程序,如果负责直接引导程序,那想做个定制都会非常困难!这也是引导采用中转的原因之一。
以MBR类型磁盘为例,引导工作流程大体为:
-
BIOS查找并执行启动设备中MBR的引导加载程序;
-
引导加载程序执行,并依次搜索磁盘活动分区内的特定启动程序(不活动分区会被忽略);
-
执行活动分区内的特定启动程序(如果有多个活动分区,会按照分区号从小到大依次查找,找到启动程序后终止查询),MBR引导加载程序工作完成;
-
由活动分区内的启动程序启动相关的操作系统或相关其他程序(考虑到多种操作系统同时存在,需要有个文件记录已安装的操作系统位置及启动的文件,用来启动不同的操作系统)。
-
启动的文件需要的启动信息有那些?(启动信息配置文件)
-
这里涉及到一个东西叫做启动配置。
简单来说,启动配置信息文件包含了引导程序启动操作系统必要的信息。举个例子,如果你是计算机,磁盘有3个分区,编号分别是1、2、3,其中活动分区是1。如果你是计算机的引导程序,你知道要启动那个分区下的操作系统么? 所以这些缺失的东西必须需要告诉计算机的引导程序,所以有了启动信息配置文件。
主流常用启动技术有Windows NT(NT5和NT6)和GRUB:
-
NT5主要用来引导Windows XP和Windows Server 2003系列。默认情况下安装到MBR的引导加载程序会查找并启动活动分区中名字为NTLDR的引导程序。NTLDR会读取活动分区下boot.ini配置文件,按照配置文件里的操作系统位置配置等信息启动操作系统。
-
NT6主要用来引导Windows Vista及以上的Windows操作系统(Windows 内核版本在6及以上的Windows),也可以启动NT5和GRUB(限制在MBR)的引导程序。默认情况下安装到MBR的引导加载程序会查找并启动活动分区中名字为bootmgr的引导文件,bootmgr读取启动分区中boot文件夹内的BCD信息来启动操作系统(BCD记录操作系统启动信息)。
-
GRUB主要用来引导Unix,类Unix(Linux)及NT5和NT6的引导程序。默认情况下安装到MBR的引导加载程序会查找并启动活动分区中名字为grub的引导文件,grub读取启动分区中boot文件夹内的grub.conf配置文件信息来启动操作系统(grub.conf记录操作系统启动信息)。
以笔者Win7下的NT6引导项为例:

NT6的BCD信息,里面包含了Windows 启动管理器和Windows 7的启动信息
以Win7为例,可以看到当前设备是分区C,启动路径是C盘下的\Windows\system32\winload.efi,语言是简体中文。如有多个系统,那对外显示是Windows7,系统的目录是C盘下的windows目录等。其他细节这里就不继续探讨。
-
BIOS引导的小结
对上文提到的”BIOS引导”的流程做个简单的梳理:

归为简易流程图:

至此,笔者对”MBR磁盘、BIOS引导下的系统安装流程”做个简单的梳理,可以得到以下步骤:

-
BIOS引导实验验证
这里接3.2.2 Windows Server 2016释放系统文件实验验证,做一次简单的引导验证验证:
-
引导的建立
-
设置BIOS启动设备顺序,保证安装操作系统的设备在首位

调整硬盘启动为第一顺位,因为只释放了操作系统到磁盘分区,里面并无引导程序,所以在启动过程中BIOS会依次检测硬盘外的设备引导,直到检测到光盘的Windows Server 2016镜像并启动镜像中的Windows安装程序
-
激活有启动文件的分区为活动分区
使用diskpart工具,激活40G的分区为活动分区,并给其分配盘符为Z
如发现D盘不是光盘,可在diskpart里确认光盘的盘符。可以看到光盘的盘符现在变为E
-
安装对应操作系统的引导程序到MBR
因安装的操作系统是Windows Server 2016,所以安装NT6引导到MBR。这里偷懒直接用参数all,即所有分区和磁盘。因为D盘是光盘,不可写入,所以D盘有报错,并不影响真整个验证
-
创建对应的引导信息文件,供启动程序启动系统
手段有多种,可使用bcdedit一条一条添加信息,也可以使用bcdboot按照默认模板添加。这里偷懒

将Z盘的windows添加到BCD启动项中,语言指定为简体中文,其他默认
至此。整个安装流程结束。现在移除光盘重启计算机

可以看到重启的计算机进入到Windows的徽标界面

经过几分钟的等待,Windows Server 2016安装完成
至此,基于MBR磁盘、BIOS引导的系统安装验证全部结束。以上任一步骤出错都会导致操作系统启动故障。GPT磁盘也可使用BIOS引导进行引导安装,过程大同小异,这里不做探讨。
-
UEFI引导
对现今计算机来说,大容量磁盘已经普及。大容量磁盘刚出现时是带来很多问题的,其中最主要的就是大容量分区的识别问题,也就是分区表的问题。
分区概念笔者在上文中以文件柜的例子作了比喻。磁盘有分区,每个人的分区大小未必一样。那么这个大小是如何设置的?靠的就是分区表。比如第一个分区容量起始是多少(分区有多大,感兴趣的读者可以自行查找相关磁盘资料,这里不过多叙述)。
对于MBR类型磁盘来说,MBR中有64字节用于存放分区表,每个分区占用16字节。所以在MBR分区方案中,实际可用分区只有4个(想要超过4个分区,多出的分区是靠扩展分区和逻辑卷的多重映射解决)。每个分区大小最多为2TB(每分区以4个字节存储分区的总扇区数,最大能表示2的32次方的扇区数。按每扇区512字节计算,每分区最大不能超过2TB。磁盘容量超过2TB以后,分区的起始位置也就无法表示了)。
为了解决以上问题,我们引进了GPT分区方法,与之配套还有UEFI的引导方式。
对于UEFI来说,其引导必须配合GPT分区磁盘,但也需要操作系统的支持。引导方式可以简单理解为多次引导启动。如下图:

如对MBR引导流程比较熟悉,那么EFI启动流程理解会很简单。可以将ESP分区当做MBR里的引导加载程序。在MBR类型中由于空间限制,引导加载程序只是机械式的在活动分区中搜索预先设置在引导加载程序中启动程序,然后启动它。而在UEFI+GPT的引导中,引导加载程序所在的EFI分区(ESP)是由用户设置,格式化类型为FAT32(避免一些版权问题),默认隐藏不可访问。引导程序做成模块放到EFI分区,防止用户不小心删除或者修改导致启动故障。BIOS中的启动设备也由在BIOS设置调整变为UEFI自行添加。并且这个添加与修改可在操作系统下(Windows中可以使用工具,Linux中可以使用efibootmgr命令)进行。
UEFI还有其他很多特性,如安全启动等,本文这里不做探讨。
对”UEFI引导”的必要条件做个简单的总结:

归结为流程图:

至此,笔者对”系统安装流程”做个简单的梳理,可以得到以下步骤:

-
UEFI引导实验验证
-
虚拟机的准备
-
简要硬件情况:

光驱载入Windows Server 2016镜像
开启UEFI

UEFI设置位置
-
分区的规划
UEFI引导需要磁盘使用GPT方案,且磁盘需有EFI分区。验证中简单做个规划。
磁盘类型为GPT类型,有2个分区:
-
分区1为EFI分区,格式化类型为FAT32,卷标为esp,大小为500M左右,用于存放EFI引导模块。
-
分区2为主分区,格式化类型为NTFS,卷标为WinSrv2016,大小为40G左右,用于安装操作系统。
-
分区的建立
通过光盘启动。这里继续使用diskpart命令进行分区,以体现步骤效果:

Windows安装程序中的修复电脑工具,里面有CMD
磁盘信息:

可以看到这是一个新磁盘,60G,没有分区
将磁盘转换为GPT:

转换磁盘为GPT类型,可以看到磁盘已经成功转换为GPT类型
进行分区:

按照规划分区。可以看到分区1大小500M,类型为EFI。分区2大小40G,类型为主分区
对分区进行格式化操作以备用:

EFI分区格式化为FAT32,卷标为esp,自动分配的盘符为C盘
分区2用来释放Windows系统文件,格式化为NTFS,卷标为WinSrv2016,自动分配的盘符为E盘。这里可以看到光盘盘符为D
至此,分区结束
-
系统文件的释放
操作系统释放(参考上文释放操作系统步骤):

将DC带GUI的2016释放到E盘。可以看到释放后系统文件存在于E盘
-
EFI分区引导模块及引导配置文件的生成
查看EFI分区,并创建引导模块及相关配置:

可以看到,在创建引导前EFI是个空的分区。使用命令以E盘下的Windows创建引导后,在EFI分区下多出EFI文件夹
生成的EFI模块及相关Windows的启动配置文件:

默认Windows 引导会在EFI分区里EFI文件夹中创建Microsoft文件夹,并在里面创建boot文件夹。所有的引导与配置文件存放于这里面。
Windows使用bootmgfw.efi引导系统,启动管理器为bootmgr.efi。默认读取efi模块所在目录里的BCD引导信息进行Windows操作系统的引导工作
默认磁盘启动查找的EFI引导模块:

如是磁盘设备引导,UEFI会查找磁盘设备中EFI分区里EFI\Boot内的模块,64位下查找的启动模块是bootx64.efi
Windows的引导在创建启动时会默认将自身引导模块复制到这个位置,并改名为bootx64.efi
默认Windows会添加启动项:

可以看到Windows默认添加的UEFI启动项

因为默认添加启动项的原因,以上步骤完成后不做其他定制或有其他需求,系统通常可以正常启动
-
UEFI启动项
默认Windows已经添加启动项,这里我们将其删除。看看会怎么样:

默认UEFI的启动顺序菜单
删除默认菜单:

删除Windows启动管理器中的引导项。右边的信息可以看出,这个引导项启动的是EFI分区里EFI\Microsoft\Boot中的启动管理器
已经删除所有引导菜单,默认的硬件设备在VMware虚拟机中不可以关闭:

可看到默认的启动菜单,前3个为启动的硬件,最后一个是EFI的shell。部分真机可将以上菜单全部清除
这次是从磁盘引导:

没有了Windows的启动项,还有设备启动项
默认UEFI会查找磁盘设备中EFI分区里EFI\Boot内的bootx64.efi。这个是Windows刚刚建立的引导模块,所以Windows还可以正常启动
删除磁盘默认引导的EFI模块:

为删除EFI分区内容,需给其分配盘符以便访问。这里分配的盘符是E
删除默认启动模块:

可以看到,已将EFI分区中EFI目录内的boot目录删除
移除光盘,默认进入到修复模式时,Windows会自动修复UEFI的引导项。所以这里需要再次进入UEFI中删除修复的Windows引导项,过程参考上文。
重启计算机:

可以看到系统已不可启动。跳过了磁盘与光盘,进入到PXE启动环节
最终进入到启动管理:

最后进入到EFI启动管理界面,要求用户添加启动项
开始添加EFI启动项:

添加启动项
选择模块所在的分区:

找到启动模块所在的分区。这里当然是卷标为ESP的分区了
找到windows的启动模块:

选择要用到的引导模块
起个名字,调整启动顺序:

引导项被命名为NT6BOOT
最终启动顺序:

新添加NT6BOOT为第一位
重启系统:

系统正常启动。
-
结束语
本文作为笔者突发奇想,梳理了下目前常见的系统安装技术,很多步骤可使用脚本或程序来自动化处理,如Windows下使用非常广泛的BOOTICE与dism++等工具。万变不离其宗,包括现今常用的PXE技术、虚拟磁盘技术等,其核心也是依赖于本文所述内容。像PXE,在此之上添加了DHCP、TFTP协议的支持等,固件下载完成并加载远端配置文件运行外,后续与上述流程并无太大差别。
准备以计算机相关行业作为以后目标的朋友,如不了解系统引导流程那就非常糟糕了。假设工作中碰到部分引导故障的服务器,总不能以重装大法处理吧?
希望看到文章的朋友如有好的想法或发现文章那里有些不足,请留言评论,互相交流。



