浅议磁盘分区——从MBR到GPT

    diskpart这个命令,用了很多年了。

    作为曾经SCCM的老手,至今还记得在System Center Configuration Manager的OSD(操作系统部署)中,为了实现单一镜像单一序列部署到不同的计算机硬件,去编写提供不同的磁盘分区的脚本。

    这是由于不同厂商OEM提供Windows时,往往在磁盘上划分了保留分区以存放恢复镜像。如果企业或机构中存在非在线恢复系统的需求,那么可以把OSD产生的镜像WIM保存到保留的恢复分区,以供需要时进行系统的回复。

    另外,对于一个生产环境,用户往往希望保留自己的数据分区而只恢复系统分区。在这个情况下,规范分区并且在OSD的任务序列中进行识别和处理就显得非常的重要了。

    在以前很长的一段时间里,对磁盘分区的了解满足主分区、扩展分区、活动分区和MBR(主引导记录)就能大致满足日常需求了。在PC/AT时代,BIOS会去寻找磁盘上的激活的引导分区,然后根据之上的引导扇区的信息,加载SYS或者bootmgr之类的引导控制程序,引导进入操作系统。

    还记得用16进制磁盘编辑器查看分区表,能够看到活动分区的0x80标记么?还记得查看引导扇区,最后两个双字节为0x55 0xAA么?这里有几篇文章可以帮助回忆:

    Why 55 AA is used as the boot signature on IBM PCs?

    http://stackoverflow.com/questions/11075003/why-55-aa-is-used-as-the-boot-signature-on-ibm-pcs

    The PC/AT boot process

    http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/pcat-boot-process.html#Active

 

    可是技术不会停留,为了适应新的需求,例如为了超越2TB磁盘的限制,GPT磁盘分区出现了。相应的,磁盘类型ID也从以前的一个双字节变成了GUID。

    之所以想起来了解这个问题,是因为我干掉了机器出场自带的恢复分区。所以顺便了解下GPT分区。

     如何创建、删除分区,一搜一堆,不在这篇的讨论范围内。主要想看看分区类型。在删除恢复分区的时候,通过diskpart detail partition命令,能看到我的SSD上有这些类型的分区。

    image

    除了熟悉的分区/卷的信息,主要有两个信息是我想了解的,一个是分区类型,因为使用GPT磁盘,都显示为GUID了;一个是属性。

    使用diskpart setid命令可以修改分区类型,当然也可以查看。   

DISKPART> help setid

    为带焦点的分区更改分区类型字段。

语法:  SET ID={<BYTE> | <GUID>} [OVERRIDE] [NOERR]

    ID={<BYTE> | <GUID>}

                指定新分区类型。

                对于主启动记录(MBR)磁盘,可以采用十六进制形式
                为分区指定分区类型字节。可以使用此参数指定任何
                分区类型字节,类型 0x42 (LDM 分区)除外。请注意,
                指定十六进制分区类型时,会忽略前导的 "0x"。

                对于 GUID 分区表(GPT)磁盘,可以为分区指定
                分区类型 GUID。已识别的 GUID 包括:

                    EFI 系统分区:
                        c12a7328-f81f-11d2-ba4b-00a0c93ec93b

                    基本数据分区:
                        ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

                可以使用此参数指定任何分区类型 GUID,
                以下几种类型除外:

                    Microsoft 保留分区:
                        e3c9e316-0b5c-4db8-817d-f92df00215ae

                    动态磁盘上的 LDM 元数据分区:
                        5808c8aa-7e8f-42e0-85d2-e1e90434cfb3

                    动态磁盘上的 LDM 数据分区:
                        af9b60a0-1431-4f62-bc68-3311714a69ad

                    群集元数据分区:
                        db97dba9-0840-4bae-97f0-ffb9a327c7e1


                除提及的限制之外,DiskPart 不会检查
                分区类型是否有效,只是确保该分区类型
                是十六进制形式的字节或 GUID。

    OVERRIDE    启用 DiskPart 能够强制首先卸载卷上的文件系统,
                然后再更改分区类型。更改分区类型时,DiskPart
                将尝试锁定和卸载卷上的文件系统。如果未指定
                此参数,并且锁定文件系统的调用失败(因为某些
                其他应用程序具有卷的打开句柄),则整个操作将
                失败。指定此参数时,将强制执行卸载,
                即使锁定文件系统的调用失败也是如此。卸载文件系统后,
                卷的所有打开句柄都将无效。

    NOERR       仅用于脚本。遇到错误时,DiskPart 会继续
                处理命令,如同没有出现错误一样。如果
                不使用 NOERR 参数,错误会导致 DiskPart
                退出,并返回错误代码。

    仅供原始设备制造商(OEM)使用。

    必须选择一个分区才能成功执行此操作。

    警告:

        使用此参数更改分区类型字段可能会导致计算机发生故障
        或无法启动。除非你是 OEM 或熟悉 GPT 磁盘的
        IT 专业人员,否则不要使用此参数更改 GPT 磁盘上
        的分区类型字段。不过,始终可以在 GPT 磁盘上使用
        CREATE PARTITION EFI 命令创建 EFI 系统分区,使用
        CREATE PARTITION MSR 命令创建 Microsoft 保留分区
        以及使用不带 ID 参数的 CREATE PARTITION PRIMARY
        命令在 GPT 磁盘上创建主分区。

    此命令在动态磁盘或 Microsoft 保留分区上无法使用。

    示例:

    SET ID=07 OVERRIDE
    SET ID=ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

     这里有一篇比较完整的介绍:https://technet.microsoft.com/en-us/library/cc771243.aspx

     我注意到帮助没有说明我的OEM分区,于是搜索。

     原来这是个用于实现Intel Rapid Start Technology的分区,文档参见:http://download.intel.com/support/motherboards/desktop/sb/rapid_start_technology_user_guide_for_uefi1.pdf

    那么,分区属性又是怎么回事呢?使用diskpart gpt命令可以获得分区属性。

DISKPART> help gpt

    在基本 GUID 分区表(GPT)磁盘上,将 GPT 属性分配给带焦点的分区。


语法:  GPT ATTRIBUTES=<N>

    ATTRIBUTES=<N>

                表示可应用于带焦点的分区的属性的十六进制值。GPT 属性字段
                是一个 64 位字段,该字段包含两个子字段。高位字段只有在特
                定分区类型 GUID 的环境中才进行解释,而低位字段则是所有分
                区类型公用的字段。

                可以在所有分区上设置以下属性:

                0x0000000000000001 将该分区标记为必需分区。这向所有的磁
                盘管理实用工具表明该分区不应被删除。EFI 系统分区仅包含
                启动操作系统所需的二进制数据。这样可以轻松地将原始设备制造
                商(OEM)或操作系统特定的二进制数据放置在其他分区中。

                对于基本数据分区,定义了以下属性:

                0x8000000000000000
                GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER
                防止为分区自动分配驱动器号。默认情况下,会为每个分区分配
                一个新驱动器号和卷 GUID 路径名。驱动器号和卷 GUID 路径名
                都可用于打开使用 Win32 API 的卷。设置此属性可确保在将磁盘
                移动到新计算机上时,系统不会自动生成新的驱动器号。而用户可
                以手动分配驱动器号。

                0x4000000000000000
                GPT_BASIC_DATA_ATTRIBUTE_HIDDEN
                将分区的卷定义为隐藏。
                设置此属性可指定不会为卷分配驱动器号或卷 GUID 路径名。
                驱动器号和卷 GUID 路径名都可用于打开使用 Win32 API 的卷。
                Win32 API 不会报告隐藏分区的卷,例如 FindFirstVolume 和
                FindNextVolume。

                0x2000000000000000
                GPT_BASIC_DATA_ATTRIBUTE_SHADOW_COPY
                将分区定义为卷快照服务卷影副本卷。文件系统筛选器使用此标志
                阻止筛选器附加到卷中。

                x1000000000000000
                GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY
                阻止写入卷。

                Microsoft 可能会随时添加其他属性。


    GPT 分区属性提供有关该分区使用情况的附加信息。

    必须选择一个基本 GPT 分区才能继续执行此操作。
   

    警告:

        更改 GPT 属性可能会导致无法为基本数据卷分配驱动器号,或阻止装载文件
        系统。除非你是原始设备制造商(OEM)或熟悉 GPT 磁盘的 IT 专业人士,否则
        请勿更改 GPT 属性。

示例:

    GPT ATTRIBUTES=0x8000000000000000
    GPT ATTRIBUTES=0xF000000000000001

     对照detail partition命令获得的分区属性,能够发现有这么几种:

    0x0000000000000000;0X8000000000000000;0X8000000000000001

    这样一来,磁盘管理器中分区不能操作就很好理解了。

    0x0000000000000000是标准的数据分区,系统会自动分配盘符,也能够正常的通过磁盘管理器进行操作管理;

    0X8000000000000000系统不会分配盘符,这样磁盘挂载到其他操作系统时不会出现不需要的盘符。但在需要的时候可以进行操作;

    0X8000000000000001除了以上属性之外,还叠加了防止删除分区的属性。

   

    对于GPT磁盘以及相应的GUID等介绍,不论TechNet还是MSDN都有专门的文章。

    Frequently asked questions about the GUID Partitioning Table disk architecture

    https://support.microsoft.com/en-us/kb/302873

    Windows and GPT FAQ

    https://msdn.microsoft.com/en-us/library/windows/hardware/dn640535(v=vs.85).aspx

 

    还记得安装Windows的时候,自动多出来的两个分区吗?一个叫引导分区,一个叫保留分区,都是干啥用的呢?

    查一下前面的GUID,引导分区其实就是一个EFI分区,也可以简称ESP。这个分区通常保存引导需要的文件,例如bootmgr等。单独做出来一个分区的好处是系统运行时,病毒和恶意代码一般无法影响这个分区。

    而保留分区,全称是Microsoft Reserved partition。安装Windows的GPT分区磁盘一定会有这个分区。这个分区有什么作用呢?例如,基本磁盘转化成动态磁盘,这个分区的数据就可以转为LDM动态卷的数据库。

    image

    为了验证系统EFI分区,上图显示了我使用提升的System账户查看了挂载的这个分区的内容。

    关于分区还有一篇极好的介绍文章:

    https://technet.microsoft.com/en-us/library/dd799232%28v=ws.10%29.aspx

    传统MBR分区的模式如下:

    Example of more than four partitions

   GPT分区的模式如下:

    Partitions: ESP, MSR, Windows

你可能感兴趣的:(windows,操作系统,在线,机构,计算机硬件)